Author: jboynes
Date: Fri Jul 19 03:11:40 2013
New Revision: 1504753
URL: http://svn.apache.org/r1504753
Log:
Extract FragmentJarScannerCallback to descriptor package so it can be reused by
Jasper
Added:
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
(with props)
Modified:
tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
Modified: tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?rev=1504753&r1=1504752&r2=1504753&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java Fri Jul 19
03:11:40 2013
@@ -24,7 +24,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
-import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
@@ -75,7 +74,6 @@ import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.JarScanType;
import org.apache.tomcat.JarScanner;
-import org.apache.tomcat.JarScannerCallback;
import org.apache.tomcat.util.ExceptionUtils;
import org.apache.tomcat.util.bcel.classfile.AnnotationElementValue;
import org.apache.tomcat.util.bcel.classfile.AnnotationEntry;
@@ -96,6 +94,7 @@ import org.apache.tomcat.util.descriptor
import org.apache.tomcat.util.descriptor.web.ErrorPage;
import org.apache.tomcat.util.descriptor.web.FilterDef;
import org.apache.tomcat.util.descriptor.web.FilterMap;
+import org.apache.tomcat.util.descriptor.web.FragmentJarScannerCallback;
import org.apache.tomcat.util.descriptor.web.JspPropertyGroup;
import org.apache.tomcat.util.descriptor.web.JspPropertyGroupDescriptorImpl;
import org.apache.tomcat.util.descriptor.web.LoginConfig;
@@ -1949,7 +1948,15 @@ public class ContextConfig implements Li
protected Map<String,WebXml> processJarsForWebFragments() {
JarScanner jarScanner = context.getJarScanner();
- FragmentJarScannerCallback callback = new FragmentJarScannerCallback();
+ boolean delegate = false;
+ if (context instanceof StandardContext) {
+ delegate = ((StandardContext) context).getDelegate();
+ }
+ FragmentJarScannerCallback callback =
+ new FragmentJarScannerCallback(webXmlParser, delegate);
+ if (!callback.isOk()) {
+ ok = false;
+ }
jarScanner.scan(JarScanType.PLUGGABILITY,
context.getServletContext(), callback);
@@ -2649,115 +2656,6 @@ public class ContextConfig implements Li
return result;
}
- private class FragmentJarScannerCallback implements JarScannerCallback {
-
- private static final String FRAGMENT_LOCATION =
- "META-INF/web-fragment.xml";
- private final Map<String,WebXml> fragments = new HashMap<>();
-
- @Override
- public void scan(JarURLConnection jarConn, boolean isWebapp)
- throws IOException {
-
- URL url = jarConn.getURL();
- URL resourceURL = jarConn.getJarFileURL();
- Jar jar = null;
- InputStream is = null;
- WebXml fragment = new WebXml();
-
- fragment.setWebappJar(isWebapp);
- if (context instanceof StandardContext) {
- fragment.setDelegate(((StandardContext)
context).getDelegate());
- }
-
- try {
- // Only web application JARs are checked for web-fragment.xml
- // files
- if (isWebapp) {
- jar = JarFactory.newInstance(url);
- is = jar.getInputStream(FRAGMENT_LOCATION);
- }
-
- if (is == null) {
- // If there is no web.xml, normal JAR no impact on
- // distributable
- fragment.setDistributable(true);
- } else {
- InputSource source = new InputSource(
- resourceURL.toString() + "!/" + FRAGMENT_LOCATION);
- source.setByteStream(is);
- if (!webXmlParser.parseWebXml(source, fragment, true)) {
- ok = false;
- }
- }
- } finally {
- if (jar != null) {
- jar.close();
- }
- fragment.setURL(url);
- if (fragment.getName() == null) {
- fragment.setName(fragment.getURL().toString());
- }
- fragment.setJarName(extractJarFileName(url));
- fragments.put(fragment.getName(), fragment);
- }
- }
-
- private String extractJarFileName(URL input) {
- String url = input.toString();
- if (url.endsWith("!/")) {
- // Remove it
- url = url.substring(0, url.length() - 2);
- }
-
- // File name will now be whatever is after the final /
- return url.substring(url.lastIndexOf('/') + 1);
- }
-
- @Override
- public void scan(File file, boolean isWebapp) throws IOException {
-
- InputStream stream = null;
- WebXml fragment = new WebXml();
-
- try {
- File fragmentFile = new File(file, FRAGMENT_LOCATION);
- if (fragmentFile.isFile()) {
- stream = new FileInputStream(fragmentFile);
- InputSource source =
- new
InputSource(fragmentFile.toURI().toURL().toString());
- source.setByteStream(stream);
- if (!webXmlParser.parseWebXml(source, fragment, true)) {
- ok = false;
- }
- } else {
- // If there is no web.xml, normal folder no impact on
- // distributable
- fragment.setDistributable(true);
- }
- } finally {
- fragment.setURL(file.toURI().toURL());
- if (fragment.getName() == null) {
- fragment.setName(fragment.getURL().toString());
- }
- fragment.setJarName(file.getName());
- fragments.put(fragment.getName(), fragment);
- }
- }
-
-
- @Override
- public void scanWebInfClasses() {
- // NO-OP. Fragments unpacked in WEB-INF classes are not handled,
- // mainly because if there are multiple fragments there is no way
to
- // handle multiple web-fragment.xml files.
- }
-
- public Map<String,WebXml> getFragments() {
- return fragments;
- }
- }
-
private static class DefaultWebXmlCacheEntry {
private final WebXml webXml;
private final long globalTimeStamp;
Added:
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java?rev=1504753&view=auto
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
(added)
+++
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
Fri Jul 19 03:11:40 2013
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.util.descriptor.web;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.JarURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tomcat.JarScannerCallback;
+import org.apache.tomcat.util.scan.Jar;
+import org.apache.tomcat.util.scan.JarFactory;
+import org.xml.sax.InputSource;
+
+/**
+* Callback handling a web-fragment.xml descriptor.
+*/
+public class FragmentJarScannerCallback implements JarScannerCallback {
+
+ private static final String FRAGMENT_LOCATION =
+ "META-INF/web-fragment.xml";
+ private final WebXmlParser webXmlParser;
+ private final boolean delegate;
+ private final Map<String,WebXml> fragments = new HashMap<>();
+ private boolean ok = true;
+
+ public FragmentJarScannerCallback(WebXmlParser webXmlParser, boolean
delegate) {
+ this.webXmlParser = webXmlParser;
+ this.delegate = delegate;
+ }
+
+ @Override
+ public void scan(JarURLConnection jarConn, boolean isWebapp)
+ throws IOException {
+
+ URL url = jarConn.getURL();
+ URL resourceURL = jarConn.getJarFileURL();
+ Jar jar = null;
+ InputStream is = null;
+ WebXml fragment = new WebXml();
+ fragment.setWebappJar(isWebapp);
+ fragment.setDelegate(delegate);
+
+ try {
+ // Only web application JARs are checked for web-fragment.xml
+ // files
+ if (isWebapp) {
+ jar = JarFactory.newInstance(url);
+ is = jar.getInputStream(FRAGMENT_LOCATION);
+ }
+
+ if (is == null) {
+ // If there is no web.xml, normal JAR no impact on
+ // distributable
+ fragment.setDistributable(true);
+ } else {
+ InputSource source = new InputSource(
+ resourceURL.toString() + "!/" + FRAGMENT_LOCATION);
+ source.setByteStream(is);
+ if (!webXmlParser.parseWebXml(source, fragment, true)) {
+ ok = false;
+ }
+ }
+ } finally {
+ if (jar != null) {
+ jar.close();
+ }
+ fragment.setURL(url);
+ if (fragment.getName() == null) {
+ fragment.setName(fragment.getURL().toString());
+ }
+ fragment.setJarName(extractJarFileName(url));
+ fragments.put(fragment.getName(), fragment);
+ }
+ }
+
+ private String extractJarFileName(URL input) {
+ String url = input.toString();
+ if (url.endsWith("!/")) {
+ // Remove it
+ url = url.substring(0, url.length() - 2);
+ }
+
+ // File name will now be whatever is after the final /
+ return url.substring(url.lastIndexOf('/') + 1);
+ }
+
+ @Override
+ public void scan(File file, boolean isWebapp) throws IOException {
+
+ InputStream stream = null;
+ WebXml fragment = new WebXml();
+
+ try {
+ File fragmentFile = new File(file, FRAGMENT_LOCATION);
+ if (fragmentFile.isFile()) {
+ stream = new FileInputStream(fragmentFile);
+ InputSource source =
+ new InputSource(fragmentFile.toURI().toURL().toString());
+ source.setByteStream(stream);
+ if (!webXmlParser.parseWebXml(source, fragment, true)) {
+ ok = false;
+ }
+ } else {
+ // If there is no web.xml, normal folder no impact on
+ // distributable
+ fragment.setDistributable(true);
+ }
+ } finally {
+ fragment.setURL(file.toURI().toURL());
+ if (fragment.getName() == null) {
+ fragment.setName(fragment.getURL().toString());
+ }
+ fragment.setJarName(file.getName());
+ fragments.put(fragment.getName(), fragment);
+ }
+ }
+
+
+ @Override
+ public void scanWebInfClasses() {
+ // NO-OP. Fragments unpacked in WEB-INF classes are not handled,
+ // mainly because if there are multiple fragments there is no way to
+ // handle multiple web-fragment.xml files.
+ }
+
+ public boolean isOk() {
+ return ok;
+ }
+
+ public Map<String,WebXml> getFragments() {
+ return fragments;
+ }
+}
Propchange:
tomcat/trunk/java/org/apache/tomcat/util/descriptor/web/FragmentJarScannerCallback.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]