You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2004/12/03 10:37:59 UTC
cvs commit: jakarta-jetspeed-2/portal/src/webapp/WEB-INF/assembly jetspeed-spring.xml
taylor 2004/12/03 01:37:59
Modified: portal/src/java/org/apache/jetspeed/deployment/impl
DeployDecoratorEventListener.java
DeployPortletAppEventListener.java
portal/src/java/org/apache/jetspeed/velocity
JetspeedPowerTool.java
portal/src/test/org/apache/jetspeed/deployment
TestSimpleDeployment.java
portal/src/webapp/WEB-INF/assembly jetspeed-spring.xml
Log:
decorator and layout autodeploy feature completed.
Submitted by: Randy Watler
Reviewed by: David Taylor
CVS: ----------------------------------------------------------------------
CVS: PR:
CVS: If this change addresses a PR in the problem report tracking
CVS: database, then enter the PR number(s) here.
CVS: Obtained from:
CVS: If this change has been taken from another system, such as NCSA,
CVS: then name the system in this line, otherwise delete it.
CVS: Submitted by:
CVS: If this code has been contributed to Apache by someone else; i.e.,
CVS: they sent us a patch or a new module, then include their name/email
CVS: address here. If this is your work then delete this line.
CVS: Reviewed by:
CVS: If we are doing pre-commit code reviews and someone else has
CVS: reviewed your changes, include their name(s) here.
CVS: If you have not had it reviewed then delete this line.
Revision Changes Path
1.7 +317 -81 jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/deployment/impl/DeployDecoratorEventListener.java
Index: DeployDecoratorEventListener.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/deployment/impl/DeployDecoratorEventListener.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- DeployDecoratorEventListener.java 1 Dec 2004 17:06:28 -0000 1.6
+++ DeployDecoratorEventListener.java 3 Dec 2004 09:37:59 -0000 1.7
@@ -7,9 +7,13 @@
package org.apache.jetspeed.deployment.impl;
import java.io.File;
+import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.logging.Log;
@@ -34,11 +38,15 @@
*/
public class DeployDecoratorEventListener implements DeploymentEventListener
{
- protected SimpleRegistry registry;
protected static final Log log = LogFactory.getLog("deployment");
+
+ protected static final String DEPLOYMENT_OBJECT_PATH_ATTR = "DEPLOYMENT_OBJECT_PATH";
+ protected static final String DEPLOYMENT_CONFIGURATION_ATTR = "DEPLOYMENT_CONFIGURATION";
+
+ protected SimpleRegistry registry;
protected String deployToDir;
- public DeployDecoratorEventListener( SimpleRegistry registry, String deployToDir ) throws IOException
+ public DeployDecoratorEventListener(SimpleRegistry registry, String deployToDir) throws IOException
{
this.registry = registry;
@@ -55,138 +63,366 @@
}
/**
- * @see org.apache.jetspeed.deployment.DeploymentEventListener#invoke(org.apache.jetspeed.deployment.DeploymentEvent)
+ * <p>
+ * invokeDeploy
+ * </p>
+ *
+ * @see org.apache.jetspeed.deployment.DeploymentEventListener#invokeDeploy(org.apache.jetspeed.deployment.DeploymentEvent)
+ * @param event
+ * @throws DeploymentException
*/
- public void invokeDeploy( DeploymentEvent event ) throws DeploymentException
+ public void invokeDeploy(DeploymentEvent event) throws DeploymentException
{
- InputStream configStream = null;
+ // get decorator configuration if available
+ PropertiesConfiguration conf = getDecoratorConfiguration(event);
+ // silently return if configuration not available, (assumes
+ // probably not a decorator)
+ if (conf == null)
+ {
+ return;
+ }
- PropertiesConfiguration conf;
- try
+ // process decorator by id
+ String id = conf.getString("id");
+ if (id != null)
{
+ log.info("Found decorator deployment archive " + id);
+ Entry entry = new Entry();
+ entry.setId(id);
+ entry.setAttribute(DEPLOYMENT_OBJECT_PATH_ATTR, event.getDeploymentObject().getPath());
+ entry.setAttribute(DEPLOYMENT_CONFIGURATION_ATTR, conf);
- configStream = event.getDeploymentObject().getConfiguration("decorator.properties");
- if (configStream == null)
+ FileSystemHelper sourceObject = null;
+ FileSystemHelper deployObject = null;
+ try
{
- return;
+ // construct decorator deploy path
+ String baseDeployPath = getBaseDeployPath(conf);
+ String deployPath = baseDeployPath + File.separator + id;
+ File deployPathFile = new File(deployPath);
+
+ // undeploy decorator if it already exists and is a redeploy or
+ // skip deployment if initial deployment
+ if (deployPathFile.exists())
+ {
+ if (event.getEventType().equals(DeploymentEvent.EVENT_TYPE_REDEPLOY))
+ {
+ invokeUndeploy(event);
+ }
+ else if (event.getEventType().equals(DeploymentEvent.EVENT_TYPE_DEPLOY))
+ {
+ log.info("Skipping initial deployment of decorator " + id + " to " + deployPath);
+
+ // register deployed decorator
+ registry.register(entry);
+ log.info("Registering decorator " + id);
+ return;
+ }
+ }
+
+ // redeploy/deploy decorator w/o META_INF jar metadata
+ log.info("Deploying decorator " + id + " to " + deployPath);
+ deployPathFile.mkdirs();
+ deployObject = new DirectoryHelper(deployPathFile);
+ sourceObject = event.getDeploymentObject().getFileObject();
+ deployObject.copyFrom(sourceObject.getRootDirectory());
+ File metaInf = new File(deployPathFile, "META-INF");
+ if (metaInf.exists())
+ {
+ DirectoryHelper cleanup = new DirectoryHelper(metaInf);
+ cleanup.remove();
+ cleanup.close();
+ }
+
+ // detect language/country localized decorator components
+ final List localeSpecificDeployPathsList = getLocaleSpecificDeployPaths(deployPathFile);
+
+ // deploy individual locale specific decorator components
+ Iterator deployPathsIter = localeSpecificDeployPathsList.iterator();
+ while (deployPathsIter.hasNext())
+ {
+ File localeDeployPathFile = (File) deployPathsIter.next();
+
+ // deploy to locale specific location
+ File deployToPathFile = new File(baseDeployPath + localeDeployPathFile.getPath().substring(deployPath.length()) + File.separator + id);
+ log.info("Deploying decorator " + id + " to " + deployToPathFile.getPath());
+ deployToPathFile.mkdirs();
+
+ // deploy decorator components by moving from deployed decorator
+ File [] filesToDeploy = localeDeployPathFile.listFiles(new FileFilter()
+ {
+ public boolean accept(File pathname)
+ {
+ return !localeSpecificDeployPathsList.contains(pathname);
+ }
+ });
+ for (int i = 0; (i < filesToDeploy.length); i++)
+ {
+ filesToDeploy[i].renameTo(new File(deployToPathFile, filesToDeploy[i].getName()));
+ }
+ }
+
+ // cleanup locale specific deployment directories
+ Iterator cleanupDeployPathsIter = localeSpecificDeployPathsList.iterator();
+ while (cleanupDeployPathsIter.hasNext())
+ {
+ File cleanupLocaleDeployPathFile = (File) cleanupDeployPathsIter.next();
+ if (cleanupLocaleDeployPathFile.exists())
+ {
+ DirectoryHelper cleanup = new DirectoryHelper(cleanupLocaleDeployPathFile);
+ cleanup.remove();
+ cleanup.close();
+ }
+ }
+
+ // register
+ registry.register(entry);
+ log.info("Registering decorator " + id);
+
+ log.info("Decorator " + id + " deployed and registered successfuly.");
}
- else
+ catch (Exception e)
{
- conf = new PropertiesConfiguration();
- conf.load(configStream);
+ log.error("Error deploying or registering decorator " + id + ": " + e.toString(), e);
}
- }
- catch (Exception e1)
- {
- // TODO Auto-generated catch block
-
- throw new DeploymentException("Error reading configuration from jar: " + e1.toString(), e1);
- }
- finally
- {
- if (configStream != null)
+ finally
{
try
{
- configStream.close();
+ if (sourceObject != null)
+ {
+ sourceObject.close();
+ }
+ if (deployObject != null)
+ {
+ deployObject.close();
+ }
}
- catch (IOException e)
+ catch (IOException e2)
{
-
}
}
}
+ else
+ {
+ log.error("Unable to register directory, \"id\" attribute not defined in configuration");
+ }
+ }
- String id = conf.getString("id");
- if (id != null)
+ /**
+ * <p>
+ * invokeUndeploy
+ * </p>
+ *
+ * @see org.apache.jetspeed.deployment.DeploymentEventListener#invokeUndeploy(org.apache.jetspeed.deployment.DeploymentEvent)
+ * @param event
+ * @throws DeploymentException
+ */
+ public void invokeUndeploy(DeploymentEvent event) throws DeploymentException
+ {
+ // get deployment configuration from decorator configuration
+ // if available or lookup based on registered attributes
+ PropertiesConfiguration conf = getDecoratorConfiguration(event);
+ if ((conf == null) && (event.getPath() != null))
{
- log.info("Found decorator deployment archive " + id);
- Entry entry = new Entry();
- entry.setId(id);
- if (!registry.isRegistered(entry))
+ Iterator registrationsIter = registry.getRegistry().iterator();
+ while ((conf == null) && registrationsIter.hasNext())
{
- log.info("Deploying decorator " + id);
- FileSystemHelper sourceObject = null;
- FileSystemHelper deployObject = null;
- try
+ Entry entry = (Entry)registrationsIter.next();
+ String deploymentObjectPath = (String) entry.getAttribute(DEPLOYMENT_OBJECT_PATH_ATTR);
+ if (event.getPath().equals(deploymentObjectPath))
{
+ conf = (PropertiesConfiguration) entry.getAttribute(DEPLOYMENT_CONFIGURATION_ATTR);
+ }
+ }
+ }
+ // silently return if configuration not available, (assumes
+ // probably not a decorator)
+ if (conf == null)
+ {
+ return;
+ }
- String mediaType = conf.getString("media.type", "html");
- log.info("Decorator " + id + " supports media type \"" + mediaType + "\"");
- String deployPath = deployToDir + File.separator + mediaType + File.separator + id;
- log.info("Deploying decorator " + id + " to " + deployPath);
- sourceObject = event.getDeploymentObject().getFileObject();
-
- File deployPathFile = new File(deployPath);
- deployPathFile.mkdirs();
- deployObject = new DirectoryHelper(deployPathFile);
- deployObject.copyFrom(sourceObject.getRootDirectory());
+ // process decorator by id
+ String id = conf.getString("id");
+ if (id != null)
+ {
+ log.info("Found decorator deployment configuration " + id);
- registry.register(entry);
- log.info("Registering decorator " + deployToDir + "/" + id);
- }
- catch (Exception e)
+ try
+ {
+ // find and construct decorator deploy path
+ String baseDeployPath = getBaseDeployPath(conf);
+ String deployPath = baseDeployPath + File.separator + id;
+
+ // undeploy decorator
+ File deployPathFile = new File(deployPath);
+ if (deployPathFile.exists())
{
- log.error("Error deploying decorator " + id + ": " + e.toString(), e);
-
+ log.info("Undeploying decorator " + id + " at " + deployPath);
+ DirectoryHelper cleanup = new DirectoryHelper(deployPathFile);
+ cleanup.remove();
+ cleanup.close();
}
- finally
+
+ // detect language/country localized decorator components
+ final List localeSpecificDeployPathsList = getLocaleSpecificDeployPaths(new File(baseDeployPath));
+
+ // undeploy individual locale specific decorator components
+ Iterator deployPathsIter = localeSpecificDeployPathsList.iterator();
+ while (deployPathsIter.hasNext())
{
- try
- {
- if (sourceObject != null)
- {
- sourceObject.close();
- }
-
- if (deployObject != null)
- {
- deployObject.close();
- }
- }
- catch (IOException e2)
+ File localeDeployPathFile = new File((File) deployPathsIter.next(), id);
+ if (localeDeployPathFile.exists())
{
-
+ log.info("Undeploying decorator " + id + " at " + localeDeployPathFile.getPath());
+ DirectoryHelper cleanup = new DirectoryHelper(localeDeployPathFile);
+ cleanup.remove();
+ cleanup.close();
+ localeDeployPathFile.getParentFile().delete();
}
}
- }
- log.info("Decorator " + id + " deployed and registered successfuly.");
+
+ // deregister
+ Entry entry = new Entry();
+ entry.setId(id);
+ registry.deRegister(entry);
+ log.info("Deregistering decorator " + id);
+ log.info("Decorator " + id + " undeployed and deregistered successfuly.");
+ }
+ catch (Exception e)
+ {
+ log.error("Error undeploying or deregistering decorator " + id + ": " + e.toString(), e);
+ }
}
else
{
- log.error("Unable to register directory, \"id\" attribute not defined in configuration");
+ log.error("Unable to deregister directory, \"id\" attribute not defined in configuration or configuration not available");
}
-
}
/**
* <p>
- * invokeUndeploy
+ * invokeRedeploy
* </p>
*
- * @see org.apache.jetspeed.deployment.DeploymentEventListener#invokeUndeploy(org.apache.jetspeed.deployment.DeploymentEvent)
+ * @see org.apache.jetspeed.deployment.DeploymentEventListener#invokeRedeploy(org.apache.jetspeed.deployment.DeploymentEvent)
* @param event
* @throws DeploymentException
*/
- public void invokeUndeploy( DeploymentEvent event ) throws DeploymentException
+ public void invokeRedeploy(DeploymentEvent event) throws DeploymentException
{
- // TODO Auto-generated method stub
-
+ invokeDeploy(event);
}
/**
* <p>
- * invokeRedeploy
+ * getDecorationConfiguration
* </p>
*
- * @see org.apache.jetspeed.deployment.DeploymentEventListener#invokeRedeploy(org.apache.jetspeed.deployment.DeploymentEvent)
* @param event
+ @ @return configuration
* @throws DeploymentException
*/
- public void invokeRedeploy( DeploymentEvent event ) throws DeploymentException
+ private PropertiesConfiguration getDecoratorConfiguration(DeploymentEvent event) throws DeploymentException
{
- // TODO Auto-generated method stub
+ InputStream stream = null;
+ try
+ {
+ if (event.getDeploymentObject() == null)
+ {
+ return null;
+ }
+ stream = event.getDeploymentObject().getConfiguration("decorator.properties");
+ if (stream == null)
+ {
+ return null;
+ }
+ else
+ {
+ PropertiesConfiguration configuration = new PropertiesConfiguration();
+ configuration.load(stream);
+ return configuration;
+ }
+ }
+ catch (Exception e1)
+ {
+ throw new DeploymentException("Error reading configuration from jar: " + e1.toString(), e1);
+ }
+ finally
+ {
+ if (stream != null)
+ {
+ try
+ {
+ stream.close();
+ }
+ catch (IOException e)
+ {
+
+ }
+ }
+ }
+ }
+
+ /**
+ * <p>
+ * getBaseDeployPath
+ * </p>
+ *
+ * @param configuration
+ * @return base deploy path
+ */
+ private String getBaseDeployPath(PropertiesConfiguration configuration)
+ {
+ // construct decorator deploy base path
+ String decorates = configuration.getString("decorates", "generic");
+ String layoutType = decorates;
+ if (layoutType.equalsIgnoreCase("any"))
+ {
+ layoutType = "generic";
+ }
+ String mediaType = configuration.getString("media.type", "html");
+ return deployToDir + File.separator + layoutType + File.separator + mediaType;
+ }
+ /**
+ * <p>
+ * getLocaleSpecificDeployPaths
+ * </p>
+ *
+ * @param rootPath
+ * @return locale paths list
+ */
+ private List getLocaleSpecificDeployPaths(File rootPath)
+ {
+ // detect language/country localized deploy paths
+ List localeSpecificDeployPathsList = new ArrayList();
+ File [] localeLanguageSpecificRoots = rootPath.listFiles(new FileFilter()
+ {
+ public boolean accept(File pathname)
+ {
+ // filter language code dirs, (assume length test is accurate enough)
+ return (pathname.isDirectory() && (pathname.getName().length() == 2));
+ }
+ });
+ for (int i = 0; (i < localeLanguageSpecificRoots.length); i++)
+ {
+ localeSpecificDeployPathsList.add(localeLanguageSpecificRoots[i]);
+ File [] localeCountrySpecificPaths = localeLanguageSpecificRoots[i].listFiles(new FileFilter()
+ {
+ public boolean accept(File pathname)
+ {
+ // filter country code dirs, (assume length test is accurate enough)
+ return (pathname.isDirectory() && (pathname.getName().length() == 2));
+ }
+ });
+ for (int j = 0; (j < localeCountrySpecificPaths.length); j++)
+ {
+ localeSpecificDeployPathsList.add(localeCountrySpecificPaths[j]);
+ }
+ }
+ return localeSpecificDeployPathsList;
}
-}
\ No newline at end of file
+}
1.20 +4 -7 jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/deployment/impl/DeployPortletAppEventListener.java
Index: DeployPortletAppEventListener.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/deployment/impl/DeployPortletAppEventListener.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- DeployPortletAppEventListener.java 29 Oct 2004 14:18:04 -0000 1.19
+++ DeployPortletAppEventListener.java 3 Dec 2004 09:37:59 -0000 1.20
@@ -93,18 +93,15 @@
String paName = null;
try
{
-
- boolean isLocal = event.getName().startsWith("jetspeed-");
-
String filePath = event.getPath();
paName = (String) appNameToFile.get(filePath);
if (paName == null)
{
- String msg = "Unable to locate application name for archive \"" + filePath + "\"";
- log.warn(msg);
- throw new DeploymentException(msg);
+ return;
}
+ boolean isLocal = event.getName().startsWith("jetspeed-");
+
PortletApplicationWar deployedWar = null;
PortletApplicationDefinition pa = registry.getPortletApplicationByIdentifier(paName);
@@ -348,4 +345,4 @@
PortletApplicationWar targetWar = new PortletApplicationWar(target, id, "/" + id);
return targetWar.createClassloader(parent);
}
-}
\ No newline at end of file
+}
1.37 +3 -2 jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerTool.java
Index: JetspeedPowerTool.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerTool.java,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- JetspeedPowerTool.java 19 Nov 2004 03:07:43 -0000 1.36
+++ JetspeedPowerTool.java 3 Dec 2004 09:37:59 -0000 1.37
@@ -743,7 +743,8 @@
TemplateDescriptor propsTemp = getTemplate(decorator + "/" + DECORATOR_TYPE + ".properties", fragmentType, decorationLocator, decorationLocatorDescriptor);
if(propsTemp == null)
{
- propsTemp = getTemplate(decorator + "/" + DECORATOR_TYPE + ".properties", GENERIC_TEMPLATE_TYPE, decorationLocator, decorationLocatorDescriptor);
+ fragmentType = GENERIC_TEMPLATE_TYPE;
+ propsTemp = getTemplate(decorator + "/" + DECORATOR_TYPE + ".properties", fragmentType, decorationLocator, decorationLocatorDescriptor);
}
// get decorator template
1.21 +3 -3 jakarta-jetspeed-2/portal/src/test/org/apache/jetspeed/deployment/TestSimpleDeployment.java
Index: TestSimpleDeployment.java
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/portal/src/test/org/apache/jetspeed/deployment/TestSimpleDeployment.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- TestSimpleDeployment.java 29 Oct 2004 14:33:27 -0000 1.20
+++ TestSimpleDeployment.java 3 Dec 2004 09:37:59 -0000 1.21
@@ -151,7 +151,7 @@
autoDeployment.start();
autoDeployment.fireDeploymentEvent();
- File decoratorVm = new File(deployRootFile.getAbsolutePath() + File.separator + "html" + File.separator
+ File decoratorVm = new File(deployRootFile.getAbsolutePath() + File.separator + "generic" + File.separator + "html" + File.separator
+ "portletstd" + File.separator + "decorator.vm");
File demoAppDeployed = new File(webAppsDirFile, TEST_PORTLET_APP_NAME);
@@ -490,4 +490,4 @@
}
-}
\ No newline at end of file
+}
1.35 +13 -6 jakarta-jetspeed-2/portal/src/webapp/WEB-INF/assembly/jetspeed-spring.xml
Index: jetspeed-spring.xml
===================================================================
RCS file: /home/cvs/jakarta-jetspeed-2/portal/src/webapp/WEB-INF/assembly/jetspeed-spring.xml,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- jetspeed-spring.xml 26 Nov 2004 18:50:26 -0000 1.34
+++ jetspeed-spring.xml 3 Dec 2004 09:37:59 -0000 1.35
@@ -722,11 +722,7 @@
<property name="searchEngine"><ref bean="org.apache.jetspeed.search.SearchEngine"/></property>
</bean>
-
-
-
-
- <!-- Portlet Application deployment event listener -->
+ <!-- Portlet Application and Decorator deployment event listeners -->
<bean id="portletAppDeploymentListener"
class="org.apache.jetspeed.deployment.impl.DeployPortletAppEventListener"
>
@@ -735,7 +731,17 @@
<constructor-arg ><ref bean="org.apache.jetspeed.components.portletregistry.PortletRegistry" /></constructor-arg>
<constructor-arg><ref bean="portletFactory"/></constructor-arg>
</bean>
-
+ <bean id="decoratorDeploymentRegistry"
+ class="org.apache.jetspeed.deployment.simpleregistry.impl.InMemoryRegistryImpl"
+ >
+ </bean>
+ <bean id="decoratorDeploymentListener"
+ class="org.apache.jetspeed.deployment.impl.DeployDecoratorEventListener"
+ >
+ <constructor-arg ><ref bean="decoratorDeploymentRegistry"/></constructor-arg>
+ <constructor-arg ><value>${applicationRoot}/WEB-INF/decorations</value></constructor-arg>
+ </bean>
+
<!-- The deployment manager watches a specific staging directory for
deploying components. What components get deployed depend of
DeploymentEventListeners registered to it.
@@ -749,6 +755,7 @@
<constructor-arg >
<list>
<ref bean="portletAppDeploymentListener"/>
+ <ref bean="decoratorDeploymentListener"/>
</list>
</constructor-arg>
</bean>
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jetspeed-dev-help@jakarta.apache.org