You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by xu...@apache.org on 2011/04/21 08:37:23 UTC
svn commit: r1095604 - in /geronimo/server/trunk/plugins/myfaces:
geronimo-myfaces-builder/src/main/java/org/apache/geronimo/myfaces/deployment/
geronimo-myfaces/src/main/java/org/apache/geronimo/myfaces/config/resource/
Author: xuhaihong
Date: Thu Apr 21 06:37:23 2011
New Revision: 1095604
URL: http://svn.apache.org/viewvc?rev=1095604&view=rev
Log:
GERONIMO-5921 Turn to use bundle style discovery for JSF deployment
Modified:
geronimo/server/trunk/plugins/myfaces/geronimo-myfaces-builder/src/main/java/org/apache/geronimo/myfaces/deployment/MyFacesModuleBuilderExtension.java
geronimo/server/trunk/plugins/myfaces/geronimo-myfaces/src/main/java/org/apache/geronimo/myfaces/config/resource/ConfigurationResource.java
Modified: geronimo/server/trunk/plugins/myfaces/geronimo-myfaces-builder/src/main/java/org/apache/geronimo/myfaces/deployment/MyFacesModuleBuilderExtension.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/myfaces/geronimo-myfaces-builder/src/main/java/org/apache/geronimo/myfaces/deployment/MyFacesModuleBuilderExtension.java?rev=1095604&r1=1095603&r2=1095604&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/myfaces/geronimo-myfaces-builder/src/main/java/org/apache/geronimo/myfaces/deployment/MyFacesModuleBuilderExtension.java (original)
+++ geronimo/server/trunk/plugins/myfaces/geronimo-myfaces-builder/src/main/java/org/apache/geronimo/myfaces/deployment/MyFacesModuleBuilderExtension.java Thu Apr 21 06:37:23 2011
@@ -27,6 +27,7 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -89,6 +90,8 @@ import org.apache.openejb.jee.WebApp;
import org.apache.xbean.finder.BundleAnnotationFinder;
import org.apache.xbean.finder.ClassFinder;
import org.apache.xbean.osgi.bundle.util.BundleClassLoader;
+import org.apache.xbean.osgi.bundle.util.BundleResourceFinder;
+import org.apache.xbean.osgi.bundle.util.BundleResourceFinder.ResourceFinderCallback;
import org.apache.xbean.osgi.bundle.util.DiscoveryRange;
import org.apache.xbean.osgi.bundle.util.ResourceDiscoveryFilter;
import org.apache.xmlbeans.XmlObject;
@@ -174,11 +177,11 @@ public class MyFacesModuleBuilderExtensi
if (!(module instanceof WebModule)) {
return;
}
- module.getEarContext().getGeneralData().put(JSF_META_INF_CONFIGURATION_RESOURCES, findMetaInfConfigurationResources(earContext, module));
- module.getEarContext().getGeneralData().put(JSF_FACELET_CONFIG_RESOURCES, findFaceletConfigResources(earContext, module));
}
public void initContext(EARContext earContext, Module module, Bundle bundle) throws DeploymentException {
+ module.getEarContext().getGeneralData().put(JSF_META_INF_CONFIGURATION_RESOURCES, findMetaInfConfigurationResources(earContext, module, bundle));
+ module.getEarContext().getGeneralData().put(JSF_FACELET_CONFIG_RESOURCES, findFaceletConfigResources(earContext, module, bundle));
}
public void addGBeans(EARContext earContext, Module module, Bundle bundle, Collection repository) throws DeploymentException {
@@ -224,18 +227,22 @@ public class MyFacesModuleBuilderExtensi
Set<ConfigurationResource> metaInfConfigurationResources = JSF_META_INF_CONFIGURATION_RESOURCES.get(earContext.getGeneralData());
List<FacesConfig> metaInfFacesConfigs = new ArrayList<FacesConfig>(metaInfConfigurationResources.size());
for (ConfigurationResource configurationResource : metaInfConfigurationResources) {
- URL url;
- try {
- url = configurationResource.getConfigurationResourceURL(bundle);
- } catch (MalformedURLException e) {
- throw new DeploymentException("Fail to read the faces Configuration file " + configurationResource.getConfigurationResourcePath()
- + (configurationResource.getJarFilePath() == null ? "" : " from jar file " + configurationResource.getJarFilePath()), e);
- }
- if (url == null) {
- throw new DeploymentException("Fail to read the faces Configuration file " + configurationResource.getConfigurationResourcePath()
- + (configurationResource.getJarFilePath() == null ? "" : " from jar file " + configurationResource.getJarFilePath()));
+ FacesConfig facesConfig = configurationResource.getFacesConfig();
+ if (facesConfig == null) {
+ URL url;
+ try {
+ url = configurationResource.getConfigurationResourceURL(bundle);
+ } catch (MalformedURLException e) {
+ throw new DeploymentException("Fail to read the faces Configuration file " + configurationResource.getConfigurationResourcePath()
+ + (configurationResource.getJarFilePath() == null ? "" : " from jar file " + configurationResource.getJarFilePath()), e);
+ }
+ if (url == null) {
+ throw new DeploymentException("Fail to read the faces Configuration file " + configurationResource.getConfigurationResourcePath()
+ + (configurationResource.getJarFilePath() == null ? "" : " from jar file " + configurationResource.getJarFilePath()));
+ }
+ facesConfig = parseConfigFile(url, url.toExternalForm());
}
- metaInfFacesConfigs.add(parseConfigFile(url, url.toExternalForm()));
+ metaInfFacesConfigs.add(facesConfig);
}
//Parse all faces-config.xml files found in classloader hierarchy
@@ -431,71 +438,75 @@ public class MyFacesModuleBuilderExtensi
return new ClassFinder(managedBeanClasses);
}
- protected Set<ConfigurationResource> findMetaInfConfigurationResources(EARContext earContext, Module module) throws DeploymentException {
- Set<ConfigurationResource> metaInfConfigurationResources = new HashSet<ConfigurationResource>();
+ protected Set<ConfigurationResource> findMetaInfConfigurationResources(EARContext earContext, Module module, Bundle bundle) throws DeploymentException {
+ final Set<ConfigurationResource> metaInfConfigurationResources = new HashSet<ConfigurationResource>();
+ String moduleNamePrefix = module.isStandAlone() ? "" : module.getTargetPath() + "/";
//1. jar files in the WEB-INF/lib folder
- File libDirectory = new File(earContext.getBaseDir() + File.separator + "WEB-INF" + File.separator + "lib");
- if (libDirectory.exists()) {
- for (File file : libDirectory.listFiles()) {
- if (!file.getName().endsWith(".jar")) {
- continue;
+ ServiceReference reference = null;
+ try {
+ reference = bundle.getBundleContext().getServiceReference(PackageAdmin.class.getName());
+ PackageAdmin packageAdmin = (PackageAdmin) bundle.getBundleContext().getService(reference);
+ final String libDirectory = moduleNamePrefix + "WEB-INF/lib";
+ BundleResourceFinder resourceFinder = new BundleResourceFinder(packageAdmin, bundle, "META-INF/", "faces-config.xml", new ResourceDiscoveryFilter() {
+
+ @Override
+ public boolean directoryDiscoveryRequired(String directoryName) {
+ return false;
}
- try {
- if (!JarUtils.isJarFile(file)) {
- continue;
- }
- } catch (IOException e) {
- continue;
+
+ @Override
+ public boolean rangeDiscoveryRequired(DiscoveryRange discoveryRange) {
+ return discoveryRange == DiscoveryRange.BUNDLE_CLASSPATH;
}
- ZipInputStream in = null;
- JarFile jarFile = null;
- try {
- jarFile = new JarFile(file);
- in = new ZipInputStream(new FileInputStream(file));
- ZipEntry zipEntry;
-
- while ((zipEntry = in.getNextEntry()) != null) {
- String name = zipEntry.getName();
- // Scan config files named as faces-config.xml or *.faces-config.xml under META-INF
- if (name.equals("META-INF/faces-config.xml") || (name.startsWith("META-INF/") && name.endsWith(".faces-config.xml"))) {
- //TODO Double check the relative jar file path once EAR is really supported
- metaInfConfigurationResources.add(new ConfigurationResource("WEB-INF/lib/" + file.getName(), name));
- }
+
+ @Override
+ public boolean zipFileDiscoveryRequired(String zipFileName) {
+ return zipFileName.startsWith(libDirectory) && zipFileName.endsWith(".jar");
+ }
+
+ });
+ resourceFinder.find(new ResourceFinderCallback() {
+
+ @Override
+ public boolean foundInDirectory(Bundle arg0, String arg1, URL arg2) throws Exception {
+ return false;
+ }
+
+ @Override
+ public boolean foundInJar(Bundle bundle, String zipFileName, ZipEntry zipEntry, InputStream in) throws Exception {
+ String zipEntryName = zipEntry.getName();
+ if ((zipEntryName.endsWith(".faces-config.xml") && zipEntryName.indexOf('/', "META-INF/".length()) == -1) || zipEntryName.equals("META-INF/faces-config.xml")) {
+ ConfigurationResource configurationResource = new ConfigurationResource(zipFileName, zipEntryName);
+ FacesConfig facesConfig = defaultFacesConfigUnmarshaller.getFacesConfig(in, configurationResource.getConfigurationResourceURL(bundle).toExternalForm());
+ configurationResource.setFacesConfig(facesConfig);
+ metaInfConfigurationResources.add(configurationResource);
}
- } catch (Exception e) {
- throw new DeploymentException("Can not preprocess myfaces application configuration resources", e);
- } finally {
- IOUtils.close(in);
- JarUtils.close(jarFile);
+ return true;
}
+ });
+ } catch (Exception e) {
+ throw new DeploymentException("Fail to scan faces-config.xml configuration files", e);
+ } finally {
+ if (reference != null) {
+ bundle.getBundleContext().ungetService(reference);
}
}
- //2. WEB-INF/classes/META-INF folder
- File webInfClassesDirectory = new File(earContext.getBaseDir() + File.separator + "WEB-INF" + File.separator + "classes" + File.separator + "META-INF");
- if (webInfClassesDirectory.exists() && webInfClassesDirectory.isDirectory()) {
- for (File file : webInfClassesDirectory.listFiles()) {
- if (file.isDirectory()) {
- continue;
- }
- String fileName = file.getName();
- if (fileName.equals("faces-config.xml") || fileName.endsWith(".faces-config.xml")) {
- //TODO Double check the relative jar file path once EAR is really supported
- String filePath = "WEB-INF/classes/META-INF/" + fileName;
+ //2 WEB-INF/classes/META-INF folder
+ Enumeration<URL> classesEn = bundle.findEntries(moduleNamePrefix + "WEB-INF/classes/META-INF/", "*faces-config.xml", false);
+ if (classesEn != null) {
+ while (classesEn.hasMoreElements()) {
+ String filePath = classesEn.nextElement().getPath();
+ if (filePath.endsWith("/faces-config.xml") || filePath.endsWith(".faces-config.xml")) {
metaInfConfigurationResources.add(new ConfigurationResource(null, filePath));
}
}
}
- //3. META-INF folder
- File baseDirectory = new File(earContext.getBaseDir() + File.separator + "META-INF");
- if (baseDirectory.exists() && baseDirectory.isDirectory()) {
- for (File file : baseDirectory.listFiles()) {
- if (file.isDirectory()) {
- continue;
- }
- String fileName = file.getName();
- if (fileName.equals("faces-config.xml") || fileName.endsWith(".faces-config.xml")) {
- //TODO Double check the relative jar file path once EAR is really supported
- String filePath = "META-INF/" + fileName;
+ //3 META-INF folder
+ Enumeration<URL> metaInfEn = bundle.findEntries(moduleNamePrefix + "META-INF/", "*faces-config.xml", false);
+ if (metaInfEn != null) {
+ while (metaInfEn.hasMoreElements()) {
+ String filePath = metaInfEn.nextElement().getPath();
+ if (filePath.endsWith("/faces-config.xml") || filePath.endsWith(".faces-config.xml")) {
metaInfConfigurationResources.add(new ConfigurationResource(null, filePath));
}
}
@@ -503,77 +514,75 @@ public class MyFacesModuleBuilderExtensi
return metaInfConfigurationResources;
}
- protected Set<ConfigurationResource> findFaceletConfigResources(EARContext earContext, Module module) throws DeploymentException {
- Set<ConfigurationResource> faceletConfigResources = new HashSet<ConfigurationResource>();
+ protected Set<ConfigurationResource> findFaceletConfigResources(EARContext earContext, Module module, Bundle bundle) throws DeploymentException {
+ final Set<ConfigurationResource> metaInfConfigurationResources = new HashSet<ConfigurationResource>();
+ String moduleNamePrefix = module.isStandAlone() ? "" : module.getTargetPath() + "/";
//1. jar files in the WEB-INF/lib folder
- File libDirectory = new File(earContext.getBaseDir() + File.separator + "WEB-INF" + File.separator + "lib");
- if (libDirectory.exists()) {
- for (File file : libDirectory.listFiles()) {
- if (!file.getName().endsWith(".jar")) {
- continue;
+ ServiceReference reference = null;
+ try {
+ reference = bundle.getBundleContext().getServiceReference(PackageAdmin.class.getName());
+ PackageAdmin packageAdmin = (PackageAdmin) bundle.getBundleContext().getService(reference);
+ final String libDirectory = moduleNamePrefix + "WEB-INF/lib";
+ BundleResourceFinder resourceFinder = new BundleResourceFinder(packageAdmin, bundle, "META-INF/", ".taglib.xml", new ResourceDiscoveryFilter() {
+
+ @Override
+ public boolean directoryDiscoveryRequired(String directoryName) {
+ return false;
}
- try {
- if (!JarUtils.isJarFile(file)) {
- continue;
- }
- } catch (IOException e) {
- continue;
+
+ @Override
+ public boolean rangeDiscoveryRequired(DiscoveryRange discoveryRange) {
+ return discoveryRange == DiscoveryRange.BUNDLE_CLASSPATH;
}
- ZipInputStream in = null;
- JarFile jarFile = null;
- try {
- jarFile = new JarFile(file);
- in = new ZipInputStream(new FileInputStream(file));
- ZipEntry zipEntry;
-
- while ((zipEntry = in.getNextEntry()) != null) {
- String name = zipEntry.getName();
- // Scan config files named as faces-config.xml or *.faces-config.xml under META-INF
- if (name.startsWith("META-INF/") && name.endsWith(".taglib.xml")) {
- //TODO Double check the relative jar file path once EAR is really supported
- faceletConfigResources.add(new ConfigurationResource("WEB-INF/lib/" + file.getName(), name));
- }
- }
- } catch (Exception e) {
- throw new DeploymentException("Can not preprocess myfaces application configuration resources", e);
- } finally {
- IOUtils.close(in);
- JarUtils.close(jarFile);
+
+ @Override
+ public boolean zipFileDiscoveryRequired(String zipFileName) {
+ return zipFileName.startsWith(libDirectory) && zipFileName.endsWith(".jar");
}
- }
- }
- //2. WEB-INF/classes/META-INF folder
- File webInfClassesDirectory = new File(earContext.getBaseDir() + File.separator + "WEB-INF" + File.separator + "classes" + File.separator + "META-INF");
- if (webInfClassesDirectory.exists() && webInfClassesDirectory.isDirectory()) {
- for (File file : webInfClassesDirectory.listFiles()) {
- if (file.isDirectory()) {
- continue;
+
+ });
+ resourceFinder.find(new ResourceFinderCallback() {
+
+ @Override
+ public boolean foundInDirectory(Bundle arg0, String arg1, URL arg2) throws Exception {
+ return false;
}
- String fileName = file.getName();
- if (fileName.equals("faces-config.xml") || fileName.endsWith(".taglib.xml")) {
- //TODO Double check the relative jar file path once EAR is really supported
- String filePath = "WEB-INF/classes/META-INF/" + fileName;
- faceletConfigResources.add(new ConfigurationResource(null, filePath));
+
+ @Override
+ public boolean foundInJar(Bundle bundle, String zipFileName, ZipEntry zipEntry, InputStream in) throws Exception {
+ String zipEntryName = zipEntry.getName();
+ if (zipEntryName.endsWith(".tag-lib.xml") && zipEntryName.indexOf('/', "META-INF/".length()) == -1) {
+ ConfigurationResource configurationResource = new ConfigurationResource(zipFileName, zipEntry.getName());
+ metaInfConfigurationResources.add(configurationResource);
+ }
+ return true;
}
+ });
+ } catch (Exception e) {
+ throw new DeploymentException("Fail to scan tag-lib.xml configuration files", e);
+ } finally {
+ if (reference != null) {
+ bundle.getBundleContext().ungetService(reference);
}
}
- //3. META-INF folder
- File baseDirectory = new File(earContext.getBaseDir() + File.separator + "META-INF");
- if (baseDirectory.exists() && baseDirectory.isDirectory()) {
- for (File file : baseDirectory.listFiles()) {
- if (file.isDirectory()) {
- continue;
- }
- String fileName = file.getName();
- if (fileName.endsWith(".taglib.xml")) {
- //TODO Double check the relative jar file path once EAR is really supported
- String filePath = "META-INF/" + fileName;
- faceletConfigResources.add(new ConfigurationResource(null, filePath));
- }
+ //2 WEB-INF/classes/META-INF folder
+ Enumeration<URL> classesEn = bundle.findEntries(moduleNamePrefix + "WEB-INF/classes/META-INF/", "*.tag-lib.xml", false);
+ if (classesEn != null) {
+ while (classesEn.hasMoreElements()) {
+ String filePath = classesEn.nextElement().getPath();
+ metaInfConfigurationResources.add(new ConfigurationResource(null, filePath));
+ }
+ }
+ //3 META-INF folder
+ Enumeration<URL> metaInfEn = bundle.findEntries(moduleNamePrefix + "META-INF/", "*.tag-lib.xml", false);
+ if (metaInfEn != null) {
+ while (metaInfEn.hasMoreElements()) {
+ String filePath = metaInfEn.nextElement().getPath();
+ metaInfConfigurationResources.add(new ConfigurationResource(null, filePath));
}
}
- return faceletConfigResources;
- }
+ return metaInfConfigurationResources;
+ }
private boolean hasFacesServlet(WebApp webApp) {
for (Servlet servlet : webApp.getServlet()) {
Modified: geronimo/server/trunk/plugins/myfaces/geronimo-myfaces/src/main/java/org/apache/geronimo/myfaces/config/resource/ConfigurationResource.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/myfaces/geronimo-myfaces/src/main/java/org/apache/geronimo/myfaces/config/resource/ConfigurationResource.java?rev=1095604&r1=1095603&r2=1095604&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/myfaces/geronimo-myfaces/src/main/java/org/apache/geronimo/myfaces/config/resource/ConfigurationResource.java (original)
+++ geronimo/server/trunk/plugins/myfaces/geronimo-myfaces/src/main/java/org/apache/geronimo/myfaces/config/resource/ConfigurationResource.java Thu Apr 21 06:37:23 2011
@@ -21,6 +21,7 @@ import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
+import org.apache.myfaces.config.element.FacesConfig;
import org.osgi.framework.Bundle;
/**
@@ -32,6 +33,8 @@ public class ConfigurationResource imple
private String jarFilePath;
+ private transient FacesConfig facesConfig;
+
public ConfigurationResource(String jarFilePath, String configurationResourcePath) {
this.jarFilePath = jarFilePath;
this.configurationResourcePath = configurationResourcePath.startsWith("/") ? configurationResourcePath : "/" + configurationResourcePath;
@@ -60,6 +63,14 @@ public class ConfigurationResource imple
return new URL("jar:" + bundle.getEntry(jarFilePath) + "!" + configurationResourcePath);
}
+ public void setFacesConfig(FacesConfig facesConfig) {
+ this.facesConfig = facesConfig;
+ }
+
+ public FacesConfig getFacesConfig() {
+ return facesConfig;
+ }
+
@Override
public String toString() {
return "ConfigurationResource [configurationResourcePath=" + configurationResourcePath + ", jarFilePath=" + jarFilePath + "]";