Author: remy.maucherat(a)jboss.com
Date: 2009-04-25 23:30:07 -0400 (Sat, 25 Apr 2009)
New Revision: 1032
Modified:
trunk/ROADMAP.txt
trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java
trunk/java/org/apache/catalina/startup/ContextConfig.java
trunk/java/org/apache/catalina/startup/WebOrderingRuleSet.java
trunk/java/org/apache/catalina/startup/WebRuleSet.java
Log:
- Basic fragment parsing.
Modified: trunk/ROADMAP.txt
===================================================================
--- trunk/ROADMAP.txt 2009-04-25 16:43:39 UTC (rev 1031)
+++ trunk/ROADMAP.txt 2009-04-26 03:30:07 UTC (rev 1032)
@@ -2,7 +2,7 @@
Main development:
- Update digester XML parsing rules for web.xml updates
-- web.xml fragments scanning and merging rules
+- web.xml fragments merging rules
- web.xml fragments ordering
- Resources overlay
- Session tracking configuration
Modified: trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java
===================================================================
--- trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java 2009-04-25
16:43:39 UTC (rev 1031)
+++ trunk/java/org/apache/catalina/startup/ClassLoadingContextScanner.java 2009-04-26
03:30:07 UTC (rev 1032)
@@ -21,7 +21,6 @@
import java.io.File;
import java.util.jar.JarEntry;
-import javax.servlet.annotation.HandlesTypes;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
@@ -40,8 +39,7 @@
// Load the class using the classloader, and see if it implements one of the web
annotations
try {
Class<?> clazz =
context.getLoader().getClassLoader().loadClass(className);
- if (clazz.isAnnotationPresent(HandlesTypes.class)
- || clazz.isAnnotationPresent(MultipartConfig.class)
+ if (clazz.isAnnotationPresent(MultipartConfig.class)
|| clazz.isAnnotationPresent(WebFilter.class)
|| clazz.isAnnotationPresent(WebInitParam.class)
|| clazz.isAnnotationPresent(WebListener.class)
Modified: trunk/java/org/apache/catalina/startup/ContextConfig.java
===================================================================
--- trunk/java/org/apache/catalina/startup/ContextConfig.java 2009-04-25 16:43:39 UTC (rev
1031)
+++ trunk/java/org/apache/catalina/startup/ContextConfig.java 2009-04-26 03:30:07 UTC (rev
1032)
@@ -54,7 +54,9 @@
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -375,10 +377,6 @@
// Add init param
context.addParameter(annotation.name(), annotation.value());
}
- if (clazz.isAnnotationPresent(HandlesTypes.class)) {
- HandlesTypes annotation = clazz.getAnnotation(HandlesTypes.class);
- // FIXME: Ok, this is complex ....
- }
if (clazz.isAnnotationPresent(MultipartConfig.class)) {
MultipartConfig annotation = clazz.getAnnotation(MultipartConfig.class);
// FIXME: Do something ....
@@ -979,10 +977,12 @@
WebAbsoluteOrdering absoluteOrdering = context.getWebAbsoluteOrdering();
List<WebOrdering> orderings = new ArrayList<WebOrdering>();
Iterator<String> jarsWithWebFragments = scanner.getWebFragments();
+ HashSet<String> jarsSet = new HashSet<String>();
// Parse the ordering defined in web fragments
- while ((absoluteOrdering == null) && jarsWithWebFragments.hasNext()) {
+ while (jarsWithWebFragments.hasNext()) {
String jar = jarsWithWebFragments.next();
+ jarsSet.add(jar);
JarFile jarFile = null;
InputStream is = null;
try {
@@ -1020,18 +1020,86 @@
}
}
- // FIXME: Generate web fragments parsing order
+ // Generate web fragments parsing order
+ LinkedList<String> order = new LinkedList<String>();
if (absoluteOrdering != null) {
-
+ // Absolute ordering has been declared in web.xml,
+ // any ordering from the fragments is ignored
+ List<String> fragmentNames = absoluteOrdering.getOrder();
+ int otherPos = -1;
+ for (int i = 0; i < fragmentNames.size(); i++) {
+ String fragmentName = fragmentNames.get(i);
+ if (fragmentName.equals("*")) {
+ if (otherPos >= 0) {
+ // FIXME: error message
+
log.error(sm.getString("contextConfig.applicationParse"));
+ ok = false;
+ }
+ otherPos = i;
+ } else {
+ Iterator<WebOrdering> orderingsIterator =
orderings.iterator();
+ while (orderingsIterator.hasNext()) {
+ WebOrdering ordering = orderingsIterator.next();
+ if (fragmentName.equals(ordering.getName())) {
+ order.add(ordering.getJar());
+ jarsSet.remove(ordering.getJar());
+ break;
+ }
+ }
+ }
+ }
+ if (otherPos >= 0) {
+ order.addAll(otherPos, jarsSet);
+ }
} else if (orderings.size() > 0) {
+ // FIXME: Will use the ordering specified by the fragments, if any
}
- // FIXME: Parse fragments according to order
+ // Parse fragments according to order
+ // FIXME: Merging rules
+ Iterator<String> orderIterator = order.iterator();
+ while (orderIterator.hasNext()) {
+ String jar = orderIterator.next();
+ JarFile jarFile = null;
+ InputStream is = null;
+ try {
+ jarFile = jarRepository.findJar(jar);
+ ZipEntry entry = jarFile.getEntry(Globals.WEB_FRAGMENT_PATH);
+ if (entry != null) {
+ is = jarFile.getInputStream(entry);
+ InputSource input = new InputSource((new
File(jar)).toURI().toURL().toExternalForm());
+ input.setByteStream(is);
+ synchronized (webFragmentDigester) {
+ try {
+ webFragmentDigester.push(context);
+ webFragmentDigester.setErrorHandler(new
ContextErrorHandler());
+ webFragmentDigester.parse(input);
+ if (parseException != null) {
+ ok = false;
+ }
+ } finally {
+ webFragmentDigester.reset();
+ webFragmentRuleSet.recycle();
+ parseException = null;
+ }
+ }
+ }
+ } catch (Exception e) {
+ // FIXME: error message
+ log.error(sm.getString("contextConfig.applicationParse", jar),
e);
+ ok = false;
+ } finally {
+ try {
+ if (is != null) {
+ is.close();
+ }
+ } catch (IOException e) {
+ // Ignore
+ }
+ }
+ }
-
- // FIXME: Add overlays
- scanner.getOverlays();
}
@@ -1381,8 +1449,10 @@
scanner.scan(context);
// FIXME: look where to place it according to the merging rules
applicationWebConfig();
- applicationExtraDescriptorsConfig();
+ // FIXME: Add overlays
+ scanner.getOverlays();
if (!context.getIgnoreAnnotations()) {
+ applicationExtraDescriptorsConfig();
applicationAnnotationsConfig();
}
if (ok) {
Modified: trunk/java/org/apache/catalina/startup/WebOrderingRuleSet.java
===================================================================
--- trunk/java/org/apache/catalina/startup/WebOrderingRuleSet.java 2009-04-25 16:43:39 UTC
(rev 1031)
+++ trunk/java/org/apache/catalina/startup/WebOrderingRuleSet.java 2009-04-26 03:30:07 UTC
(rev 1032)
@@ -100,7 +100,7 @@
"addBefore", 0);
digester.addRule(prefix + "web-app/ordering/after/others",
new AddOthersAfterRule());
- digester.addRule(prefix + "web-app/ordering/before/name",
+ digester.addRule(prefix + "web-app/ordering/before/others",
new AddOthersBeforeRule());
}
@@ -109,14 +109,14 @@
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
WebOrdering ordering = (WebOrdering) digester.peek();
- ordering.addAfter("");
+ ordering.addAfter("*");
}
}
final class AddOthersBeforeRule extends Rule {
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
WebOrdering ordering = (WebOrdering) digester.peek();
- ordering.addBefore("");
+ ordering.addBefore("*");
}
}
}
Modified: trunk/java/org/apache/catalina/startup/WebRuleSet.java
===================================================================
--- trunk/java/org/apache/catalina/startup/WebRuleSet.java 2009-04-25 16:43:39 UTC (rev
1031)
+++ trunk/java/org/apache/catalina/startup/WebRuleSet.java 2009-04-26 03:30:07 UTC (rev
1032)
@@ -940,7 +940,7 @@
public void begin(String namespace, String name, Attributes attributes)
throws Exception {
WebAbsoluteOrdering ordering = (WebAbsoluteOrdering) digester.peek();
- ordering.addName("");
+ ordering.addName("*");
}
}
Show replies by date