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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org