You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/07/06 08:18:52 UTC
[01/17] incubator-freemarker git commit: FREEMARKER-55: remove
unnecessary exposures and package name change.
Repository: incubator-freemarker
Updated Branches:
refs/heads/3 9b31510bb -> 52d114257
FREEMARKER-55: remove unnecessary exposures and package name change.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/519680ac
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/519680ac
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/519680ac
Branch: refs/heads/3
Commit: 519680accbb42aaf48eda1e656008249559d0ae8
Parents: 18e9399
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 13:54:01 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 13:54:01 2017 -0400
----------------------------------------------------------------------
.../spring/SpringResourceTemplateLoader.java | 168 +++++++++++++++++++
.../SpringResourceTemplateLoader.java | 168 -------------------
.../spring/web/view/FreemarkerViewResolver.java | 32 ----
.../SpringResourceTemplateLoaderTest.java | 1 +
.../spring/web/view/FreemarkerViewTest.java | 24 ++-
5 files changed, 188 insertions(+), 205 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/519680ac/freemarker-spring/src/main/java/org/apache/freemarker/spring/SpringResourceTemplateLoader.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/SpringResourceTemplateLoader.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/SpringResourceTemplateLoader.java
new file mode 100644
index 0000000..2607e57
--- /dev/null
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/SpringResourceTemplateLoader.java
@@ -0,0 +1,168 @@
+/*
+ * 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.freemarker.spring;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Objects;
+
+import org.apache.freemarker.core.templateresolver.TemplateLoader;
+import org.apache.freemarker.core.templateresolver.TemplateLoaderSession;
+import org.apache.freemarker.core.templateresolver.TemplateLoadingResult;
+import org.apache.freemarker.core.templateresolver.TemplateLoadingSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ResourceLoaderAware;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+
+/**
+ * A {@link TemplateLoader} that uses Spring Framework <code>Resource</code>s which are resolved by locations.
+ */
+public class SpringResourceTemplateLoader implements TemplateLoader, ResourceLoaderAware {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SpringResourceTemplateLoader.class);
+
+ /**
+ * Base template resource location.
+ * <P>
+ * If this property is a non-null string, this is prepended to the template name internally when resolving
+ * a resource.
+ * </P>
+ */
+ private String baseLocation;
+
+ /**
+ * Spring Framework resource loader.
+ */
+ private ResourceLoader resourceLoader;
+
+ /**
+ * Base resource location which can be prepended to the template name internally when resolving a resource.
+ * @return
+ */
+ public String getBaseLocation() {
+ return baseLocation;
+ }
+
+ /**
+ * Set base resource location which can be prepended to the template name internally when resolving a resource.
+ * @param baseLocation
+ */
+ public void setBaseLocation(String baseLocation) {
+ this.baseLocation = baseLocation;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setResourceLoader(ResourceLoader resourceLoader) {
+ this.resourceLoader = resourceLoader;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public TemplateLoaderSession createSession() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public TemplateLoadingResult load(String name, TemplateLoadingSource ifSourceDiffersFrom,
+ Serializable ifVersionDiffersFrom, TemplateLoaderSession session) throws IOException {
+ if (resourceLoader == null) {
+ throw new IllegalStateException("Spring Framework ResourceLoader was not set.");
+ }
+
+ String resourceLocation;
+
+ if (baseLocation == null) {
+ resourceLocation = name;
+ } else {
+ resourceLocation = baseLocation + "/" + name;
+ }
+
+ Resource resource = resourceLoader.getResource(resourceLocation);
+
+ if (!resource.exists()) {
+ return TemplateLoadingResult.NOT_FOUND;
+ }
+
+ ResourceTemplateLoadingSource source = new ResourceTemplateLoadingSource(resource);
+
+ Long version = null;
+
+ try {
+ long lmd = resource.lastModified();
+ if (lmd != -1) {
+ version = lmd;
+ }
+ } catch (IOException e) {
+ LOG.debug("The last modified timestamp of the resource at '{}' may not be resolved.", resourceLocation, e);
+ }
+
+ if (ifSourceDiffersFrom != null && ifSourceDiffersFrom.equals(source)
+ && Objects.equals(ifVersionDiffersFrom, version)) {
+ return TemplateLoadingResult.NOT_MODIFIED;
+ }
+
+ return new TemplateLoadingResult(source, version, resource.getInputStream(), null);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void resetState() {
+ // Does nothing
+ }
+
+ @SuppressWarnings("serial")
+ private static class ResourceTemplateLoadingSource implements TemplateLoadingSource {
+
+ private final Resource resource;
+
+ ResourceTemplateLoadingSource(Resource resource) {
+ this.resource = resource;
+ }
+
+ @Override
+ public int hashCode() {
+ return resource.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ return resource.equals(((ResourceTemplateLoadingSource) obj).resource);
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/519680ac/freemarker-spring/src/main/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoader.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoader.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoader.java
deleted file mode 100644
index e91fd68..0000000
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoader.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * 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.freemarker.spring.templateresolver;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Objects;
-
-import org.apache.freemarker.core.templateresolver.TemplateLoader;
-import org.apache.freemarker.core.templateresolver.TemplateLoaderSession;
-import org.apache.freemarker.core.templateresolver.TemplateLoadingResult;
-import org.apache.freemarker.core.templateresolver.TemplateLoadingSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.ResourceLoaderAware;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.ResourceLoader;
-
-/**
- * A {@link TemplateLoader} that uses Spring Framework <code>Resource</code>s which are resolved by locations.
- */
-public class SpringResourceTemplateLoader implements TemplateLoader, ResourceLoaderAware {
-
- private static final Logger LOG = LoggerFactory.getLogger(SpringResourceTemplateLoader.class);
-
- /**
- * Base template resource location.
- * <P>
- * If this property is a non-null string, this is prepended to the template name internally when resolving
- * a resource.
- * </P>
- */
- private String baseLocation;
-
- /**
- * Spring Framework resource loader.
- */
- private ResourceLoader resourceLoader;
-
- /**
- * Base resource location which can be prepended to the template name internally when resolving a resource.
- * @return
- */
- public String getBaseLocation() {
- return baseLocation;
- }
-
- /**
- * Set base resource location which can be prepended to the template name internally when resolving a resource.
- * @param baseLocation
- */
- public void setBaseLocation(String baseLocation) {
- this.baseLocation = baseLocation;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setResourceLoader(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public TemplateLoaderSession createSession() {
- return null;
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public TemplateLoadingResult load(String name, TemplateLoadingSource ifSourceDiffersFrom,
- Serializable ifVersionDiffersFrom, TemplateLoaderSession session) throws IOException {
- if (resourceLoader == null) {
- throw new IllegalStateException("Spring Framework ResourceLoader was not set.");
- }
-
- String resourceLocation;
-
- if (baseLocation == null) {
- resourceLocation = name;
- } else {
- resourceLocation = baseLocation + "/" + name;
- }
-
- Resource resource = resourceLoader.getResource(resourceLocation);
-
- if (!resource.exists()) {
- return TemplateLoadingResult.NOT_FOUND;
- }
-
- ResourceTemplateLoadingSource source = new ResourceTemplateLoadingSource(resource);
-
- Long version = null;
-
- try {
- long lmd = resource.lastModified();
- if (lmd != -1) {
- version = lmd;
- }
- } catch (IOException e) {
- LOG.debug("The last modified timestamp of the resource at '{}' may not be resolved.", resourceLocation, e);
- }
-
- if (ifSourceDiffersFrom != null && ifSourceDiffersFrom.equals(source)
- && Objects.equals(ifVersionDiffersFrom, version)) {
- return TemplateLoadingResult.NOT_MODIFIED;
- }
-
- return new TemplateLoadingResult(source, version, resource.getInputStream(), null);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void resetState() {
- // Does nothing
- }
-
- @SuppressWarnings("serial")
- private static class ResourceTemplateLoadingSource implements TemplateLoadingSource {
-
- private final Resource resource;
-
- ResourceTemplateLoadingSource(Resource resource) {
- this.resource = resource;
- }
-
- @Override
- public int hashCode() {
- return resource.hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- return resource.equals(((ResourceTemplateLoadingSource) obj).resource);
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/519680ac/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
index 57e6c4c..c3f87a9 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
@@ -147,36 +147,4 @@ public class FreemarkerViewResolver extends AbstractTemplateViewResolver impleme
return view;
}
- /**
- * Get {@link ObjectWrapperAndUnwrapper} that is used in model building.
- * @return {@link ObjectWrapperAndUnwrapper} that is used in model building
- */
- protected ObjectWrapperAndUnwrapper getObjectWrapper() {
- return objectWrapper;
- }
-
- /**
- * Get {@link GenericServlet} instance which is a page object in JSP tag library usages.
- * @return {@link GenericServlet} instance which is a page object in JSP tag library usages
- */
- protected GenericServlet getPageContextServlet() {
- return pageContextServlet;
- }
-
- /**
- * Get {@link ServletContextHashModel} instance by which templates can access servlet context attributes.
- * @return {@link ServletContextHashModel} instance by which templates can access servlet context attributes
- */
- protected ServletContextHashModel getServletContextModel() {
- return servletContextModel;
- }
-
- /**
- * Get {@link TaglibFactory} instance by which templates can use JSP tag libraries.
- * @return {@link TaglibFactory} instance by which templates can use JSP tag libraries.
- */
- protected TaglibFactory getTaglibFactory() {
- return taglibFactory;
- }
-
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/519680ac/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java
index bcf014a..30c7ed7 100644
--- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/templateresolver/SpringResourceTemplateLoaderTest.java
@@ -28,6 +28,7 @@ import java.io.IOException;
import org.apache.freemarker.core.Configuration;
import org.apache.freemarker.core.TemplateNotFoundException;
+import org.apache.freemarker.spring.SpringResourceTemplateLoader;
import org.apache.freemarker.test.TestConfigurationBuilder;
import org.junit.After;
import org.junit.Before;
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/519680ac/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
index 32862c5..093472c 100644
--- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
@@ -24,10 +24,15 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
+import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import org.apache.freemarker.core.Configuration;
+import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
+import org.apache.freemarker.servlet.ServletContextHashModel;
+import org.apache.freemarker.servlet.jsp.TaglibFactory;
+import org.apache.freemarker.servlet.jsp.TaglibFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
@@ -44,6 +49,10 @@ public class FreemarkerViewTest {
private StringTemplateLoader templateLoader;
private Configuration configuration;
+ private ObjectWrapperAndUnwrapper objectWrapper;
+
+ private GenericServlet pageContextServlet;
+ private TaglibFactory taglibFactory;
private FreemarkerViewResolver viewResolver;
@@ -60,6 +69,11 @@ public class FreemarkerViewTest {
templateLoader = new StringTemplateLoader();
configuration = new Configuration.Builder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS)
.templateLoader(templateLoader).build();
+ objectWrapper = (ObjectWrapperAndUnwrapper) configuration.getObjectWrapper();
+
+ pageContextServlet = new PageContextServlet();
+ pageContextServlet.init(new PageContextServletConfig(servletContext, PageContextServlet.class.getSimpleName()));
+ taglibFactory = new TaglibFactoryBuilder(servletContext, objectWrapper).build();
viewResolver = new FreemarkerViewResolver();
viewResolver.setServletContext(servletContext);
@@ -144,17 +158,17 @@ public class FreemarkerViewTest {
assertEquals("Hello!", response.getContentAsString());
}
- private FreemarkerView createFreemarkerView(final String name) {
+ private FreemarkerView createFreemarkerView(final String name) throws Exception {
FreemarkerView view = new FreemarkerView();
view.setServletContext(servletContext);
view.setApplicationContext(applicationContext);
view.setConfiguration(configuration);
- view.setObjectWrapper(viewResolver.getObjectWrapper());
+ view.setObjectWrapper(objectWrapper);
- view.setPageContextServlet(viewResolver.getPageContextServlet());
- view.setServletContextModel(viewResolver.getServletContextModel());
- view.setTaglibFactory(viewResolver.getTaglibFactory());
+ view.setPageContextServlet(pageContextServlet);
+ view.setServletContextModel(new ServletContextHashModel(pageContextServlet, objectWrapper));
+ view.setTaglibFactory(taglibFactory);
view.setUrl(name);
[07/17] incubator-freemarker git commit: FREEMARKER-55: code cleanup
in TaglibFactory, using generics and some formatting
Posted by dd...@apache.org.
FREEMARKER-55: code cleanup in TaglibFactory, using generics and some formatting
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/196158b0
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/196158b0
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/196158b0
Branch: refs/heads/3
Commit: 196158b03c18534466d8a0275052515317475474
Parents: 8621226
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 17:52:05 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 17:52:05 2017 -0400
----------------------------------------------------------------------
.../freemarker/servlet/jsp/TaglibFactory.java | 323 +++++++++++--------
1 file changed, 185 insertions(+), 138 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/196158b0/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 0ad9a49..e1df54f 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -43,7 +43,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -100,14 +99,14 @@ public class TaglibFactory implements TemplateHashModel {
/**
* The default of {@link #getClasspathTlds()}; an empty list.
*/
- public static final List DEFAULT_CLASSPATH_TLDS = Collections.EMPTY_LIST;
-
+ public static final List<String> DEFAULT_CLASSPATH_TLDS = Collections.emptyList();
+
/**
* The default of {@link #getMetaInfTldSources()}; a list that contains
* {@link WebInfPerLibJarMetaInfTldSource#INSTANCE}, which gives the behavior described in the JSP 2.2
* specification.
*/
- public static final List/*<? extends MetaInfTldSource>*/ DEFAULT_META_INF_TLD_SOURCES
+ public static final List<? extends MetaInfTldSource> DEFAULT_META_INF_TLD_SOURCES
= Collections.singletonList(WebInfPerLibJarMetaInfTldSource.INSTANCE);
private static final Logger LOG = LoggerFactory.getLogger(TaglibFactory.class);
@@ -124,17 +123,17 @@ public class TaglibFactory implements TemplateHashModel {
private final ServletContext servletContext;
private ObjectWrapper objectWrapper;
- private List/*<MetaInfTldSource>*/ metaInfTldSources = DEFAULT_META_INF_TLD_SOURCES;
- private List/*<String>*/ classpathTlds = DEFAULT_CLASSPATH_TLDS;
-
+ private List<? extends MetaInfTldSource> metaInfTldSources = DEFAULT_META_INF_TLD_SOURCES;
+ private List<String> classpathTlds = DEFAULT_CLASSPATH_TLDS;
+
boolean test_emulateNoUrlToFileConversions = false;
boolean test_emulateNoJarURLConnections = false;
boolean test_emulateJarEntryUrlOpenStreamFails = false;
private final Object lock = new Object();
- private final Map taglibs = new HashMap();
- private final Map tldLocations = new HashMap();
- private List/*<String>*/ failedTldLocations = new ArrayList();
+ private final Map<String, Taglib> taglibs = new HashMap<>();
+ private final Map<String, TldLocation> tldLocations = new HashMap<>();
+ private List<String> failedTldLocations = new ArrayList<>();
private int nextTldLocationLookupPhase = 0;
public static MetaInfTldSource parseMetaInfTldLocation(String value) throws ParseException {
@@ -176,7 +175,7 @@ public class TaglibFactory implements TemplateHashModel {
final MetaInfTldSource metaInfTldSource = parseMetaInfTldLocation(value);
if (metaInfTldSources == null) {
- metaInfTldSources = new ArrayList();
+ metaInfTldSources = new ArrayList<>();
}
metaInfTldSources.add(metaInfTldSource);
@@ -240,24 +239,28 @@ public class TaglibFactory implements TemplateHashModel {
boolean failedTldListAlreadyIncluded = false;
final TldLocation tldLocation;
final String normalizedTaglibUri;
+
try {
if (LOG.isDebugEnabled()) {
LOG.debug("Locating TLD for taglib URI " + _StringUtil.jQuoteNoXSS(taglibUri) + ".");
}
-
+
TldLocation explicitlyMappedTldLocation = getExplicitlyMappedTldLocation(taglibUri);
+
if (explicitlyMappedTldLocation != null) {
tldLocation = explicitlyMappedTldLocation;
normalizedTaglibUri = taglibUri;
} else {
// Taglib URI must be directly the path (no mapping).
-
+
final int urlType;
+
try {
urlType = getUriType(taglibUri);
} catch (MalformedURLException e) {
throw new TaglibGettingException("Malformed taglib URI: " + _StringUtil.jQuote(taglibUri), e);
}
+
if (urlType == URL_TYPE_RELATIVE) {
normalizedTaglibUri = resolveRelativeUri(taglibUri);
} else if (urlType == URL_TYPE_ABSOLUTE) {
@@ -326,13 +329,16 @@ public class TaglibFactory implements TemplateHashModel {
if (failedTldLocations.isEmpty()) {
return null;
}
+
StringBuilder sb = new StringBuilder();
+
for (int i = 0; i < failedTldLocations.size(); i++) {
if (i != 0) {
sb.append(", ");
}
sb.append(_StringUtil.jQuote(failedTldLocations.get(i)));
}
+
return sb.toString();
}
}
@@ -345,18 +351,11 @@ public class TaglibFactory implements TemplateHashModel {
return false;
}
- private void checkNotStarted() {
- synchronized (lock) {
- if (nextTldLocationLookupPhase != 0) {
- throw new IllegalStateException(TaglibFactory.class.getName() + " object was already in use.");
- }
- }
- }
-
private TldLocation getExplicitlyMappedTldLocation(final String uri) throws SAXException, IOException,
TaglibGettingException {
while (true) {
final TldLocation tldLocation = (TldLocation) tldLocations.get(uri);
+
if (tldLocation != null) {
return tldLocation;
}
@@ -383,6 +382,7 @@ public class TaglibFactory implements TemplateHashModel {
default:
throw new BugException();
}
+
nextTldLocationLookupPhase++;
}
}
@@ -392,10 +392,12 @@ public class TaglibFactory implements TemplateHashModel {
WebXmlParser webXmlParser = new WebXmlParser();
InputStream in = servletContext.getResourceAsStream("/WEB-INF/web.xml");
+
if (in == null) {
LOG.debug("No web.xml was found in servlet context");
return;
}
+
try {
parseXml(in, servletContext.getResource("/WEB-INF/web.xml").toExternalForm(), webXmlParser);
} finally {
@@ -411,34 +413,32 @@ public class TaglibFactory implements TemplateHashModel {
private void addTldLocationsFromServletContextResourceTlds(String basePath)
throws IOException, SAXException {
- Set unsortedResourcePaths = servletContext.getResourcePaths(basePath);
+ Set<String> unsortedResourcePaths = servletContext.getResourcePaths(basePath);
+
if (unsortedResourcePaths != null) {
- List/*<String>*/ resourcePaths = new ArrayList/*<String>*/(unsortedResourcePaths);
+ List<String> resourcePaths = new ArrayList<>(unsortedResourcePaths);
Collections.sort(resourcePaths);
- // First process the files...
- for (Iterator it = resourcePaths.iterator(); it.hasNext(); ) {
- String resourcePath = (String) it.next();
+
+ for (String resourcePath : resourcePaths) {
+ // First process the files...
if (resourcePath.endsWith(".tld")) {
addTldLocationFromTld(new ServletContextTldLocation(resourcePath));
}
- }
- // ... only later the directories
- for (Iterator it = resourcePaths.iterator(); it.hasNext(); ) {
- String resourcePath = (String) it.next();
- if (resourcePath.endsWith("/")) {
+ // ... only later the directories
+ else if (resourcePath.endsWith("/")) {
addTldLocationsFromServletContextResourceTlds(resourcePath);
}
}
}
}
-
+
private void addTldLocationsFromMetaInfTlds() throws IOException, SAXException {
if (metaInfTldSources == null || metaInfTldSources.isEmpty()) {
return;
}
- Set/*<URLWithExternalForm>*/ cpMetaInfDirUrlsWithEF = null;
-
+ Set<URLWithExternalForm> cpMetaInfDirUrlsWithEF = null;
+
// Skip past the last "clear":
int srcIdxStart = 0;
for (int i = metaInfTldSources.size() - 1; i >= 0; i--) {
@@ -447,30 +447,30 @@ public class TaglibFactory implements TemplateHashModel {
break;
}
}
-
+
for (int srcIdx = srcIdxStart; srcIdx < metaInfTldSources.size(); srcIdx++) {
MetaInfTldSource miTldSource = (MetaInfTldSource) metaInfTldSources.get(srcIdx);
-
+
if (miTldSource == WebInfPerLibJarMetaInfTldSource.INSTANCE) {
addTldLocationsFromWebInfPerLibJarMetaInfTlds();
} else if (miTldSource instanceof ClasspathMetaInfTldSource) {
ClasspathMetaInfTldSource cpMiTldLocation = (ClasspathMetaInfTldSource) miTldSource;
+
if (LOG.isDebugEnabled()) {
LOG.debug("Looking for TLD-s in "
+ "classpathRoots[" + cpMiTldLocation.getRootContainerPattern() + "]"
+ META_INF_ABS_PATH + "**/*.tld");
}
-
+
if (cpMetaInfDirUrlsWithEF == null) {
cpMetaInfDirUrlsWithEF = collectMetaInfUrlsFromClassLoaders();
}
- for (Iterator iterator = cpMetaInfDirUrlsWithEF.iterator(); iterator.hasNext(); ) {
- URLWithExternalForm urlWithEF = (URLWithExternalForm) iterator.next();
+ for (URLWithExternalForm urlWithEF : cpMetaInfDirUrlsWithEF) {
final URL url = urlWithEF.getUrl();
final boolean isJarUrl = isJarUrl(url);
final String urlEF = urlWithEF.externalForm;
-
+
final String rootContainerUrl;
if (isJarUrl) {
int sep = urlEF.indexOf(JAR_URL_ENTRY_PATH_START);
@@ -480,7 +480,7 @@ public class TaglibFactory implements TemplateHashModel {
? urlEF.substring(0, urlEF.length() - META_INF_REL_PATH.length())
: urlEF;
}
-
+
if (cpMiTldLocation.getRootContainerPattern().matcher(rootContainerUrl).matches()) {
final File urlAsFile = urlToFileOrNull(url);
if (urlAsFile != null) {
@@ -502,10 +502,10 @@ public class TaglibFactory implements TemplateHashModel {
private void addTldLocationsFromWebInfPerLibJarMetaInfTlds() throws IOException, SAXException {
LOG.debug("Looking for TLD locations in servletContext:/WEB-INF/lib/*.{jar,zip}{}*.tld", META_INF_ABS_PATH);
- Set libEntPaths = servletContext.getResourcePaths("/WEB-INF/lib");
+ Set<String> libEntPaths = servletContext.getResourcePaths("/WEB-INF/lib");
+
if (libEntPaths != null) {
- for (Iterator iter = libEntPaths.iterator(); iter.hasNext(); ) {
- final String libEntryPath = (String) iter.next();
+ for (String libEntryPath : libEntPaths) {
if (isJarPath(libEntryPath)) {
addTldLocationsFromServletContextJar(libEntryPath);
}
@@ -517,24 +517,25 @@ public class TaglibFactory implements TemplateHashModel {
if (classpathTlds == null || classpathTlds.size() == 0) {
return;
}
-
+
LOG.debug("Looking for TLD locations in TLD-s specified in cfg.classpathTlds");
-
- for (Iterator it = classpathTlds.iterator(); it.hasNext(); ) {
- String tldResourcePath = (String) it.next();
+
+ for (String tldResourcePath : classpathTlds) {
if (tldResourcePath.trim().length() == 0) {
throw new TaglibGettingException("classpathTlds can't contain empty item");
}
-
+
if (!tldResourcePath.startsWith("/")) {
tldResourcePath = "/" + tldResourcePath;
}
+
if (tldResourcePath.endsWith("/")) {
throw new TaglibGettingException("classpathTlds can't specify a directory: " + tldResourcePath);
}
-
+
ClasspathTldLocation tldLocation = new ClasspathTldLocation(tldResourcePath);
InputStream in;
+
try {
in = tldLocation.getInputStream();
} catch (IOException e) {
@@ -544,6 +545,7 @@ public class TaglibFactory implements TemplateHashModel {
}
in = null;
}
+
if (in != null) {
try {
addTldLocationFromTld(in, tldLocation);
@@ -561,15 +563,17 @@ public class TaglibFactory implements TemplateHashModel {
final String jarResourcePath)
throws IOException, MalformedURLException, SAXException {
final String metaInfEntryPath = normalizeJarEntryPath(META_INF_ABS_PATH, true);
-
+
// Null for non-random-access backing resource:
final JarFile jarFile = servletContextResourceToFileOrNull(jarResourcePath);
+
if (jarFile != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Scanning for " + META_INF_ABS_PATH + "*.tld-s in JarFile: servletContext:"
+ jarResourcePath);
}
- for (Enumeration/*<JarEntry>*/ entries = jarFile.entries(); entries.hasMoreElements(); ) {
+
+ for (Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); ) {
final JarEntry curEntry = (JarEntry) entries.nextElement();
final String curEntryPath = normalizeJarEntryPath(curEntry.getName(), false);
if (curEntryPath.startsWith(metaInfEntryPath) && curEntryPath.endsWith(".tld")) {
@@ -586,13 +590,15 @@ public class TaglibFactory implements TemplateHashModel {
if (in == null) {
throw new IOException("ServletContext resource not found: " + jarResourcePath);
}
+
try {
ZipInputStream zipIn = new ZipInputStream(in);
+
try {
while (true) {
ZipEntry curEntry = zipIn.getNextEntry();
if (curEntry == null) break;
-
+
String curEntryPath = normalizeJarEntryPath(curEntry.getName(), false);
if (curEntryPath.startsWith(metaInfEntryPath) && curEntryPath.endsWith(".tld")) {
addTldLocationFromTld(zipIn,
@@ -625,38 +631,46 @@ public class TaglibFactory implements TemplateHashModel {
// Null when URLConnection is used
// (like "file:/C:/foo%20bar/baaz.jar" in "jar:file:/C:/foo%20bar/baaz.jar!/META-INF/"):
final String rawJarContentUrlEF;
+
{
final URLConnection urlCon = jarBaseEntryUrl.openConnection();
+
if (!test_emulateNoJarURLConnections && urlCon instanceof JarURLConnection) {
final JarURLConnection jarCon = (JarURLConnection) urlCon;
jarFile = jarCon.getJarFile();
rawJarContentUrlEF = null; // Not used as we have a JarURLConnection
baseEntryPath = normalizeJarEntryPath(jarCon.getEntryName(), true);
+
if (baseEntryPath == null) {
throw newFailedToExtractEntryPathException(jarBaseEntryUrl);
}
} else {
final String jarBaseEntryUrlEF = jarBaseEntryUrl.toExternalForm();
final int jarEntrySepIdx = jarBaseEntryUrlEF.indexOf(JAR_URL_ENTRY_PATH_START);
+
if (jarEntrySepIdx == -1) {
throw newFailedToExtractEntryPathException(jarBaseEntryUrl);
}
+
rawJarContentUrlEF = jarBaseEntryUrlEF.substring(jarBaseEntryUrlEF.indexOf(':') + 1, jarEntrySepIdx);
baseEntryPath = normalizeJarEntryPath(
jarBaseEntryUrlEF.substring(jarEntrySepIdx + JAR_URL_ENTRY_PATH_START.length()), true);
-
+
File rawJarContentAsFile = urlToFileOrNull(new URL(rawJarContentUrlEF));
jarFile = rawJarContentAsFile != null ? new JarFile(rawJarContentAsFile) : null;
}
}
+
if (jarFile != null) { // jarFile == null => fall back to streamed access
if (LOG.isDebugEnabled()) {
LOG.debug("Scanning for " + META_INF_ABS_PATH + "**/*.tld-s in random access mode: "
+ jarBaseEntryUrl);
}
- for (Enumeration/*<JarEntry>*/ entries = jarFile.entries(); entries.hasMoreElements(); ) {
+
+ for (Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements(); ) {
final JarEntry curEntry = (JarEntry) entries.nextElement();
final String curEntryPath = normalizeJarEntryPath(curEntry.getName(), false);
+
if (curEntryPath.startsWith(baseEntryPath) && curEntryPath.endsWith(".tld")) {
final String curEntryBaseRelativePath = curEntryPath.substring(baseEntryPath.length());
final URL tldUrl = createJarEntryUrl(jarBaseEntryUrl, curEntryBaseRelativePath);
@@ -669,10 +683,12 @@ public class TaglibFactory implements TemplateHashModel {
LOG.debug("Scanning for " + META_INF_ABS_PATH + "**/*.tld-s in stream mode (slow): "
+ rawJarContentUrlEF);
}
-
+
final InputStream in = new URL(rawJarContentUrlEF).openStream();
+
try {
ZipInputStream zipIn = new ZipInputStream(in);
+
try {
while (true) {
ZipEntry curEntry = zipIn.getNextEntry();
@@ -709,17 +725,18 @@ public class TaglibFactory implements TemplateHashModel {
if (LOG.isDebugEnabled()) {
LOG.debug("Scanning for *.tld-s in File directory: " + _StringUtil.jQuoteNoXSS(dir));
}
+
File[] tldFiles = dir.listFiles(new FilenameFilter() {
-
@Override
public boolean accept(File urlAsFile, String name) {
return isTldFileNameIgnoreCase(name);
}
-
});
+
if (tldFiles == null) {
throw new IOException("Can't list this directory for some reason: " + dir);
}
+
for (final File file : tldFiles) {
addTldLocationFromTld(new FileTldLocation(file));
}
@@ -727,12 +744,13 @@ public class TaglibFactory implements TemplateHashModel {
LOG.warn("Skipped scanning for *.tld for non-existent directory: " + _StringUtil.jQuoteNoXSS(dir));
}
}
-
+
/**
* Adds the TLD location mapping from the TLD itself.
*/
private void addTldLocationFromTld(TldLocation tldLocation) throws IOException, SAXException {
InputStream in = tldLocation.getInputStream();
+
try {
addTldLocationFromTld(in, tldLocation);
} finally {
@@ -750,6 +768,7 @@ public class TaglibFactory implements TemplateHashModel {
private void addTldLocationFromTld(InputStream reusedIn, TldLocation tldLocation) throws SAXException,
IOException {
String taglibUri;
+
try {
taglibUri = getTaglibUriFromTld(reusedIn, tldLocation.getXmlSystemId());
} catch (SAXException e) {
@@ -759,8 +778,9 @@ public class TaglibFactory implements TemplateHashModel {
}
taglibUri = null;
}
+
if (taglibUri != null) {
- addTldLocation(tldLocation, taglibUri);
+ addTldLocation(tldLocation, taglibUri);
}
}
@@ -772,6 +792,7 @@ public class TaglibFactory implements TemplateHashModel {
}
} else {
tldLocations.put(taglibUri, tldLocation);
+
if (LOG.isDebugEnabled()) {
LOG.debug("Mapped taglib URI " + _StringUtil.jQuoteNoXSS(taglibUri)
+ " to TLD location " + _StringUtil.jQuoteNoXSS(tldLocation));
@@ -779,24 +800,27 @@ public class TaglibFactory implements TemplateHashModel {
}
}
- private static Set/*<URLWithExternalForm>*/ collectMetaInfUrlsFromClassLoaders() throws IOException {
- final Set/*<URLWithExternalForm>*/ metainfDirUrls = new TreeSet();
-
+ private static Set<URLWithExternalForm> collectMetaInfUrlsFromClassLoaders() throws IOException {
+ final Set<URLWithExternalForm> metainfDirUrls = new TreeSet<>();
final ClassLoader tccl = tryGetThreadContextClassLoader();
+
if (tccl != null) {
collectMetaInfUrlsFromClassLoader(tccl, metainfDirUrls);
}
-
+
final ClassLoader cccl = TaglibFactory.class.getClassLoader();
+
if (!isDescendantOfOrSameAs(tccl, cccl)) {
collectMetaInfUrlsFromClassLoader(cccl, metainfDirUrls);
}
+
return metainfDirUrls;
}
- private static void collectMetaInfUrlsFromClassLoader(ClassLoader cl, Set/* <URLWithExternalForm> */metainfDirUrls)
+ private static void collectMetaInfUrlsFromClassLoader(ClassLoader cl, Set<URLWithExternalForm> metainfDirUrls)
throws IOException {
- Enumeration/*<URL>*/ urls = cl.getResources(META_INF_REL_PATH);
+ Enumeration<URL> urls = cl.getResources(META_INF_REL_PATH);
+
if (urls != null) {
while (urls.hasMoreElements()) {
metainfDirUrls.add(new URLWithExternalForm((URL) urls.nextElement()));
@@ -821,6 +845,7 @@ public class TaglibFactory implements TemplateHashModel {
LOG.debug("Loading taglib for URI " + _StringUtil.jQuoteNoXSS(taglibUri)
+ " from TLD location " + _StringUtil.jQuoteNoXSS(tldLocation));
}
+
final Taglib taglib = new Taglib(servletContext, tldLocation, objectWrapper);
taglibs.put(taglibUri, taglib);
tldLocations.remove(taglibUri);
@@ -832,32 +857,36 @@ public class TaglibFactory implements TemplateHashModel {
InputSource inSrc = new InputSource();
inSrc.setSystemId(systemId);
inSrc.setByteStream(toCloseIgnoring(in));
-
+
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false); // Especially as we use dummy empty DTD-s
XMLReader reader;
+
try {
reader = factory.newSAXParser().getXMLReader();
} catch (ParserConfigurationException e) {
// Not expected
throw new RuntimeException("XML parser setup failed", e);
}
+
reader.setEntityResolver(new EmptyContentEntityResolver()); // To deal with referred DTD-s
reader.setContentHandler(handler);
reader.setErrorHandler(handler);
-
+
reader.parse(inSrc);
}
private static String resolveRelativeUri(String uri) throws TaglibGettingException {
TemplateModel reqHash;
+
try {
reqHash = Environment.getCurrentEnvironment().getVariable(
FreemarkerServlet.KEY_REQUEST_PRIVATE);
} catch (TemplateModelException e) {
throw new TaglibGettingException("Failed to get FreemarkerServlet request information", e);
}
+
if (reqHash instanceof HttpRequestHashModel) {
HttpServletRequest req =
((HttpRequestHashModel) reqHash).getRequest();
@@ -876,6 +905,7 @@ public class TaglibFactory implements TemplateHashModel {
return '/' + uri;
}
}
+
throw new TaglibGettingException(
"Can't resolve relative URI " + uri + " as request URL information is unavailable.");
}
@@ -896,21 +926,26 @@ public class TaglibFactory implements TemplateHashModel {
if (uri == null) {
throw new IllegalArgumentException("null is not a valid URI");
}
+
if (uri.length() == 0) {
throw new MalformedURLException("empty string is not a valid URI");
}
+
final char c0 = uri.charAt(0);
if (c0 == '/') {
return URL_TYPE_ABSOLUTE;
}
+
// Check if it conforms to RFC 3986 3.1 in order to qualify as ABS_URI
if (c0 < 'a' || c0 > 'z') { // First char of scheme must be alpha
return URL_TYPE_RELATIVE;
}
+
final int colon = uri.indexOf(':');
if (colon == -1) { // Must have a colon
return URL_TYPE_RELATIVE;
}
+
// Subsequent chars must be [a-z,0-9,+,-,.]
for (int i = 1; i < colon; ++i) {
final char c = uri.charAt(i);
@@ -918,13 +953,14 @@ public class TaglibFactory implements TemplateHashModel {
return URL_TYPE_RELATIVE;
}
}
+
return URL_TYPE_FULL;
}
private static boolean isJarPath(final String uriPath) {
return uriPath.endsWith(".jar") || uriPath.endsWith(".zip");
}
-
+
private static boolean isJarUrl(URL url) {
final String scheme = url.getProtocol();
return "jar".equals(scheme) || "zip".equals(scheme)
@@ -937,6 +973,7 @@ public class TaglibFactory implements TemplateHashModel {
if (relativeEntryPath.startsWith("/")) {
relativeEntryPath = relativeEntryPath.substring(1);
}
+
try {
return new URL(jarBaseEntryUrl, _StringUtil.URLPathEnc(relativeEntryPath, Charset.defaultCharset()));
} catch (UnsupportedEncodingException e) {
@@ -952,12 +989,12 @@ public class TaglibFactory implements TemplateHashModel {
if (!jarEntryDirPath.startsWith("/")) {
jarEntryDirPath = "/" + jarEntryDirPath;
}
-
+
// Known to be a problem:
if (directory && !jarEntryDirPath.endsWith("/")) {
jarEntryDirPath = jarEntryDirPath + "/";
}
-
+
return jarEntryDirPath;
}
@@ -972,11 +1009,11 @@ public class TaglibFactory implements TemplateHashModel {
if (test_emulateNoUrlToFileConversions) {
return null;
}
-
+
if (!"file".equals(url.getProtocol())) {
return null;
}
-
+
String filePath;
try {
// Using URI instead of URL, so we get an URL-decoded path.
@@ -990,6 +1027,7 @@ public class TaglibFactory implements TemplateHashModel {
throw new BugException(e2);
}
}
+
return new File(filePath);
}
@@ -1001,6 +1039,7 @@ public class TaglibFactory implements TemplateHashModel {
private JarFile servletContextResourceToFileOrNull(final String jarResourcePath) throws MalformedURLException,
IOException {
URL jarResourceUrl = servletContext.getResource(jarResourcePath);
+
if (jarResourceUrl == null) {
LOG.error("ServletContext resource URL was null (missing resource?): {}", jarResourcePath);
return null;
@@ -1061,7 +1100,7 @@ public class TaglibFactory implements TemplateHashModel {
}
return tccl;
}
-
+
private static boolean isDescendantOfOrSameAs(ClassLoader descendant, ClassLoader parent) {
while (true) {
if (descendant == null) {
@@ -1073,7 +1112,7 @@ public class TaglibFactory implements TemplateHashModel {
descendant = descendant.getParent();
}
}
-
+
/**
* A location within which we will look for {@code META-INF/**}{@code /*.tld}-s. Used in the parameter to
* {@link #setMetaInfTldSources}. See concrete subclasses for more.
@@ -1103,9 +1142,9 @@ public class TaglibFactory implements TemplateHashModel {
* Note that this TLD discovery mechanism is not part of the JSP specification.
*/
public static final class ClasspathMetaInfTldSource extends MetaInfTldSource {
-
+
private final Pattern rootContainerPattern;
-
+
/**
* @param rootContainerPattern
* The pattern against which the classpath root container URL-s will be matched. For example, to only
@@ -1138,35 +1177,36 @@ public class TaglibFactory implements TemplateHashModel {
public final static ClearMetaInfTldSource INSTANCE = new ClearMetaInfTldSource();
private ClearMetaInfTldSource() { }
}
-
+
private interface TldLocation {
-
+
/**
* Reads the TLD file.
* @return Not {@code null}
*/
InputStream getInputStream() throws IOException;
-
+
/**
* The absolute URL of the TLD file.
* @return Not {@code null}
*/
String getXmlSystemId() throws IOException;
+
}
private interface InputStreamFactory {
InputStream getInputStream();
-
+
}
private class ServletContextTldLocation implements TldLocation {
-
+
private final String fileResourcePath;
-
+
public ServletContextTldLocation(String fileResourcePath) {
this.fileResourcePath = fileResourcePath;
}
-
+
@Override
public InputStream getInputStream() throws IOException {
final InputStream in = servletContext.getResourceAsStream(fileResourcePath);
@@ -1175,44 +1215,43 @@ public class TaglibFactory implements TemplateHashModel {
}
return in;
}
-
+
@Override
public String getXmlSystemId() throws IOException {
final URL url = servletContext.getResource(fileResourcePath);
return url != null ? url.toExternalForm() : null;
}
-
+
private IOException newResourceNotFoundException() {
return new IOException("Resource not found: servletContext:" + fileResourcePath);
}
-
+
@Override
public final String toString() {
return "servletContext:" + fileResourcePath;
}
-
+
}
-
/**
* Points to plain class loader resource (regardless of if in what classpath root container it's in).
*/
private static class ClasspathTldLocation implements TldLocation {
-
+
private final String resourcePath;
-
+
public ClasspathTldLocation(String resourcePath) {
if (!resourcePath.startsWith("/")) {
throw new IllegalArgumentException("\"resourcePath\" must start with /");
}
this.resourcePath = resourcePath;
}
-
+
@Override
public String toString() {
return "classpath:" + resourcePath;
}
-
+
@Override
public InputStream getInputStream() throws IOException {
ClassLoader tccl = tryGetThreadContextClassLoader();
@@ -1222,11 +1261,12 @@ public class TaglibFactory implements TemplateHashModel {
return in;
}
}
-
+
final InputStream in = getClass().getResourceAsStream(resourcePath);
if (in == null) {
throw newResourceNotFoundException();
}
+
return in;
}
@@ -1239,15 +1279,15 @@ public class TaglibFactory implements TemplateHashModel {
return url.toExternalForm();
}
}
-
+
final URL url = getClass().getResource(resourcePath);
return url == null ? null : url.toExternalForm();
}
-
+
private IOException newResourceNotFoundException() {
return new IOException("Resource not found: classpath:" + resourcePath);
}
-
+
}
private abstract class JarEntryTldLocation implements TldLocation {
@@ -1259,14 +1299,14 @@ public class TaglibFactory implements TemplateHashModel {
private final URL entryUrl;
private final InputStreamFactory fallbackRawJarContentInputStreamFactory;
private final String entryPath;
-
+
public JarEntryTldLocation(URL entryUrl, InputStreamFactory fallbackRawJarContentInputStreamFactory,
String entryPath) {
if (entryUrl == null) {
_NullArgumentException.check(fallbackRawJarContentInputStreamFactory);
_NullArgumentException.check(entryPath);
}
-
+
this.entryUrl = entryUrl;
this.fallbackRawJarContentInputStreamFactory = fallbackRawJarContentInputStreamFactory;
this.entryPath = entryPath != null ? normalizeJarEntryPath(entryPath, false) : null;
@@ -1295,7 +1335,7 @@ public class TaglibFactory implements TemplateHashModel {
}
// Retry with the fallbackRawJarContentInputStreamFactory comes.
}
-
+
final String entryPath;
if (this.entryPath != null) {
entryPath = this.entryPath;
@@ -1314,10 +1354,11 @@ public class TaglibFactory implements TemplateHashModel {
Charset.defaultCharset().name()),
false);
}
-
+
InputStream rawIn = null;
ZipInputStream zipIn = null;
boolean returnedZipIn = false;
+
try {
rawIn = fallbackRawJarContentInputStreamFactory.getInputStream();
if (rawIn == null) {
@@ -1325,6 +1366,7 @@ public class TaglibFactory implements TemplateHashModel {
+ ") says the resource doesn't exist.");
}
zipIn = new ZipInputStream(rawIn);
+
while (true) {
final ZipEntry macthedJarEntry = zipIn.getNextEntry();
if (macthedJarEntry == null) {
@@ -1346,34 +1388,34 @@ public class TaglibFactory implements TemplateHashModel {
}
}
}
-
+
@Override
public String getXmlSystemId() {
return entryUrl != null ? entryUrl.toExternalForm() : null;
}
-
+
@Override
public String toString() {
return entryUrl != null
? entryUrl.toExternalForm()
: "jar:{" + fallbackRawJarContentInputStreamFactory + "}!" + entryPath;
}
-
+
}
-
+
private class JarEntryUrlTldLocation extends JarEntryTldLocation {
-
+
private JarEntryUrlTldLocation(URL entryUrl, InputStreamFactory fallbackRawJarContentInputStreamFactory) {
super(entryUrl, fallbackRawJarContentInputStreamFactory, null);
}
-
+
}
/**
* Points to a file entry inside a jar, with optional {@link ZipInputStream} fallback.
*/
private class ServletContextJarEntryTldLocation extends JarEntryTldLocation {
-
+
/**
* For creating instance based on the servlet context resource path of a jar.
* While it tries to construct and use an URL that points directly to the target entry inside the jar, it will
@@ -1395,7 +1437,7 @@ public class TaglibFactory implements TemplateHashModel {
},
entryPath);
}
-
+
}
private static class FileTldLocation implements TldLocation {
@@ -1422,9 +1464,10 @@ public class TaglibFactory implements TemplateHashModel {
}
}
-
+
private static final class Taglib implements TemplateHashModel {
- private final Map tagsAndFunctions;
+
+ private final Map<String, TemplateModel> tagsAndFunctions;
Taglib(ServletContext ctx, TldLocation tldPath, ObjectWrapper wrapper) throws IOException, SAXException {
tagsAndFunctions = parseToTagsAndFunctions(ctx, tldPath, wrapper);
@@ -1440,17 +1483,17 @@ public class TaglibFactory implements TemplateHashModel {
return tagsAndFunctions.isEmpty();
}
- private static Map parseToTagsAndFunctions(
+ private static Map<String, TemplateModel> parseToTagsAndFunctions(
ServletContext ctx, TldLocation tldLocation, ObjectWrapper objectWrapper) throws IOException, SAXException {
final TldParserForTaglibBuilding tldParser = new TldParserForTaglibBuilding(objectWrapper);
-
+
InputStream in = tldLocation.getInputStream();
try {
parseXml(in, tldLocation.getXmlSystemId(), tldParser);
} finally {
in.close();
}
-
+
EventForwarding eventForwarding = EventForwarding.getInstance(ctx);
if (eventForwarding != null) {
eventForwarding.addListeners(tldParser.getListeners());
@@ -1464,6 +1507,7 @@ public class TaglibFactory implements TemplateHashModel {
"| <listener-class>" + EventForwarding.class.getName() + "</listener-class>\n" +
"| </listener>", null);
}
+
return tldParser.getTagsAndFunctions();
}
}
@@ -1587,12 +1631,12 @@ public class TaglibFactory implements TemplateHashModel {
private final DefaultObjectWrapper defaultObjectWrapper;
private final Map<String, TemplateModel> tagsAndFunctions = new HashMap<>();
- private final List listeners = new ArrayList();
+ private final List<Object> listeners = new ArrayList<>();
private Locator locator;
private StringBuilder cDataCollector;
- private Stack stack = new Stack();
+ private Stack<String> stack = new Stack<>();
private String tagNameCData;
private String tagClassCData;
@@ -1621,7 +1665,7 @@ public class TaglibFactory implements TemplateHashModel {
return tagsAndFunctions;
}
- List getListeners() {
+ List<Object> getListeners() {
return listeners;
}
@@ -1676,7 +1720,7 @@ public class TaglibFactory implements TemplateHashModel {
checkChildElementNotNull(qName, E_NAME, tagNameCData);
checkChildElementNotNull(qName, E_TAG_CLASS, tagClassCData);
- final Class tagClass = resoveClassFromTLD(tagClassCData, "custom tag", tagNameCData);
+ final Class<?> tagClass = resoveClassFromTLD(tagClassCData, "custom tag", tagNameCData);
final TemplateModel customTagModel;
try {
@@ -1712,7 +1756,7 @@ public class TaglibFactory implements TemplateHashModel {
checkChildElementNotNull(qName, E_FUNCTION_SIGNATURE, functionSignatureCData);
checkChildElementNotNull(qName, E_NAME, functionNameCData);
- final Class functionClass = resoveClassFromTLD(
+ final Class<?> functionClass = resoveClassFromTLD(
functionClassCData, "custom EL function", functionNameCData);
final Method functionMethod;
@@ -1763,7 +1807,7 @@ public class TaglibFactory implements TemplateHashModel {
} else if (E_LISTENER.equals(qName)) {
checkChildElementNotNull(qName, E_LISTENER_CLASS, listenerClassCData);
- final Class listenerClass = resoveClassFromTLD(listenerClassCData, E_LISTENER, null);
+ final Class<?> listenerClass = resoveClassFromTLD(listenerClassCData, E_LISTENER, null);
final Object listener;
try {
@@ -1783,7 +1827,7 @@ public class TaglibFactory implements TemplateHashModel {
stack.pop();
}
-
+
private String pullCData() {
String r = cDataCollector.toString().trim();
cDataCollector = null;
@@ -1799,7 +1843,7 @@ public class TaglibFactory implements TemplateHashModel {
}
}
- private Class resoveClassFromTLD(String className, String entryType, String entryName)
+ private Class<?> resoveClassFromTLD(String className, String entryType, String entryName)
throws TldParsingSAXException {
try {
return _ClassUtil.forName(className);
@@ -1837,7 +1881,7 @@ public class TaglibFactory implements TemplateHashModel {
* Dummy resolver that returns 0 length content for all requests.
*/
private static final class EmptyContentEntityResolver implements EntityResolver {
-
+
@Override
public InputSource resolveEntity(String publicId, String systemId) {
InputSource is = new InputSource(new ByteArrayInputStream(new byte[0]));
@@ -1851,28 +1895,30 @@ public class TaglibFactory implements TemplateHashModel {
* Redefines {@code SAXParseException#toString()} and {@code SAXParseException#getCause()} because it's broken on
* Java 1.6 and earlier.
*/
+ @SuppressWarnings("serial")
private static class TldParsingSAXException extends SAXParseException {
-
+
private final Throwable cause;
-
+
TldParsingSAXException(String message, Locator locator) {
this(message, locator, null);
}
-
+
TldParsingSAXException(String message, Locator locator, Throwable e) {
super(message, locator, e instanceof Exception ? (Exception) e : new Exception(
"Unchecked exception; see cause", e));
cause = e;
}
-
+
@Override
public String toString() {
StringBuilder sb = new StringBuilder(getClass().getName());
sb.append(": ");
int startLn = sb.length();
-
+
String systemId = getSystemId();
String publicId = getPublicId();
+
if (systemId != null || publicId != null) {
sb.append("In ");
if (systemId != null) {
@@ -1888,7 +1934,7 @@ public class TaglibFactory implements TemplateHashModel {
}
}
}
-
+
int line = getLineNumber();
if (line != -1) {
sb.append(sb.length() != startLn ? ", at " : "At ");
@@ -1900,7 +1946,7 @@ public class TaglibFactory implements TemplateHashModel {
sb.append(col);
}
}
-
+
String message = getLocalizedMessage();
if (message != null) {
if (sb.length() != startLn) {
@@ -1908,19 +1954,19 @@ public class TaglibFactory implements TemplateHashModel {
}
sb.append(message);
}
-
+
return sb.toString();
}
-
+
@Override
public Throwable getCause() {
Throwable superCause = super.getCause();
return superCause == null ? cause : superCause;
}
-
+
}
-
- private static class URLWithExternalForm implements Comparable {
+
+ private static class URLWithExternalForm implements Comparable<URLWithExternalForm> {
private final URL url;
private final String externalForm;
@@ -1957,12 +2003,13 @@ public class TaglibFactory implements TemplateHashModel {
}
@Override
- public int compareTo(Object that) {
- return getExternalForm().compareTo(((URLWithExternalForm) that).getExternalForm());
+ public int compareTo(URLWithExternalForm that) {
+ return getExternalForm().compareTo(that.getExternalForm());
}
}
-
+
+ @SuppressWarnings("serial")
private static class TaglibGettingException extends Exception {
public TaglibGettingException(String message, Throwable cause) {
[11/17] incubator-freemarker git commit: FREEMARKER-55: code cleanups
using generics
Posted by dd...@apache.org.
FREEMARKER-55: code cleanups using generics
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/28102af6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/28102af6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/28102af6
Branch: refs/heads/3
Commit: 28102af69bca00e3cf29c2dc8a3a6a9d25c56ade
Parents: 14396c8
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 20:49:32 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 20:49:32 2017 -0400
----------------------------------------------------------------------
.../freemarker/servlet/FreemarkerServlet.java | 125 ++++++++++---------
.../freemarker/servlet/InitParamParser.java | 4 +-
.../freemarker/servlet/jsp/TaglibFactory.java | 18 +--
3 files changed, 73 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28102af6/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index bcd4d04..a3f4e75 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -325,7 +325,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
*/
// [FM3] Lot of things are marked here with "BC" and deprecated
public class FreemarkerServlet extends HttpServlet {
-
+
private static final Logger LOG = LoggerFactory.getLogger(FreemarkerServlet.class);
public static final long serialVersionUID = -2440216393145762479L;
@@ -335,7 +335,7 @@ public class FreemarkerServlet extends HttpServlet {
* has existed long before 2.3.22, but this constant was only added then.)
*/
public static final String INIT_PARAM_TEMPLATE_PATH = "TemplatePath";
-
+
/**
* Init-param name - see the {@link FreemarkerServlet} class documentation about the init-params. (This init-param
* has existed long before 2.3.22, but this constant was only added then.)
@@ -367,7 +367,7 @@ public class FreemarkerServlet extends HttpServlet {
* Init-param name - see the {@link FreemarkerServlet} class documentation about the init-params.
*/
public static final String INIT_PARAM_BUFFER_SIZE = "BufferSize";
-
+
/**
* Init-param name - see the {@link FreemarkerServlet} class documentation about the init-params.
*/
@@ -377,12 +377,12 @@ public class FreemarkerServlet extends HttpServlet {
* Init-param name - see the {@link FreemarkerServlet} class documentation about the init-params.
*/
public static final String INIT_PARAM_EXCEPTION_ON_MISSING_TEMPLATE = "ExceptionOnMissingTemplate";
-
+
/**
* Init-param name - see the {@link FreemarkerServlet} class documentation about the init-params.
*/
public static final String INIT_PARAM_CLASSPATH_TLDS = "ClasspathTlds";
-
+
private static final String INIT_PARAM_DEBUG = "Debug";
private static final String DEPR_INITPARAM_TEMPLATE_DELAY = "TemplateDelay";
@@ -394,9 +394,9 @@ public class FreemarkerServlet extends HttpServlet {
private static final String DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_HTML_DEBUG = "htmlDebug";
private static final String DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_IGNORE = "ignore";
private static final String DEPR_INITPARAM_DEBUG = "debug";
-
+
private static final ContentType DEFAULT_CONTENT_TYPE = new ContentType("text/html");
-
+
public static final String INIT_PARAM_VALUE_NEVER = "never";
public static final String INIT_PARAM_VALUE_ALWAYS = "always";
public static final String INIT_PARAM_VALUE_WHEN_TEMPLATE_HAS_MIME_TYPE = "whenTemplateHasMimeType";
@@ -417,17 +417,17 @@ public class FreemarkerServlet extends HttpServlet {
* {@value #INIT_PARAM_CLASSPATH_TLDS} init-param. The value syntax is the same as of the init-param.
*/
public static final String SYSTEM_PROPERTY_CLASSPATH_TLDS = "org.freemarker.jsp.classpathTlds";
-
+
/**
* Used as part of the value of the {@value #INIT_PARAM_META_INF_TLD_LOCATIONS} init-param.
*/
public static final String META_INF_TLD_LOCATION_WEB_INF_PER_LIB_JARS = "webInfPerLibJars";
-
+
/**
* Used as part of the value of the {@value #INIT_PARAM_META_INF_TLD_LOCATIONS} init-param.
*/
public static final String META_INF_TLD_LOCATION_CLASSPATH = "classpath";
-
+
/**
* Used as part of the value of the {@value #INIT_PARAM_META_INF_TLD_LOCATIONS} init-param.
*/
@@ -447,18 +447,18 @@ public class FreemarkerServlet extends HttpServlet {
public static final String ATTR_REQUEST_MODEL = ".freemarker.Request";
public static final String ATTR_REQUEST_PARAMETERS_MODEL = ".freemarker.RequestParameters";
public static final String ATTR_SESSION_MODEL = ".freemarker.Session";
-
+
/** @deprecated We only keeps this attribute for backward compatibility, but actually aren't using it. */
@Deprecated
private static final String ATTR_APPLICATION_MODEL = ".freemarker.Application";
-
+
/** @deprecated We only keeps this attribute for backward compatibility, but actually aren't using it. */
@Deprecated
private static final String ATTR_JSP_TAGLIBS_MODEL = ".freemarker.JspTaglibs";
private static final String ATTR_JETTY_CP_TAGLIB_JAR_PATTERNS
= "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern";
-
+
private static final String EXPIRATION_DATE;
static {
@@ -476,14 +476,14 @@ public class FreemarkerServlet extends HttpServlet {
private boolean noCache;
private Integer bufferSize;
private boolean exceptionOnMissingTemplate;
-
+
/**
* @deprecated Not used anymore; to enable/disable debug logging, just set the logging level of the logging library
* used by {@link Logger}.
*/
@Deprecated
protected boolean debug;
-
+
@SuppressFBWarnings(value="SE_BAD_FIELD", justification="Not investing into making this Servlet serializable")
private Configuration config;
private ContentType contentType;
@@ -500,8 +500,6 @@ public class FreemarkerServlet extends HttpServlet {
private ServletContextHashModel servletContextModel;
@SuppressFBWarnings(value="SE_BAD_FIELD", justification="Not investing into making this Servlet serializable")
private TaglibFactory taglibFactory;
-
- private boolean objectWrapperMismatchWarnLogged;
/**
* Don't override this method to adjust FreeMarker settings! Override the protected methods for that, such as
@@ -520,11 +518,11 @@ public class FreemarkerServlet extends HttpServlet {
+ " servlet; see cause exception.", e);
}
}
-
+
private void initialize() throws InitParamValueException, MalformedWebXmlException, ConflictingInitParamsException,
ConfigurationException {
Configuration.ExtendableBuilder<?> cfgB = createConfigurationBuilder();
-
+
// Only override what's coming from the config if it was explicitly specified:
final String iciInitParamValue = getInitParameter(Configuration.ExtendableBuilder.INCOMPATIBLE_IMPROVEMENTS_KEY);
if (iciInitParamValue != null) {
@@ -536,7 +534,7 @@ public class FreemarkerServlet extends HttpServlet {
}
contentType = DEFAULT_CONTENT_TYPE;
-
+
// Process object_wrapper init-param out of order:
String objectWrapperInitParamValue = getInitParameter(
Configuration.Builder.OBJECT_WRAPPER_KEY, DEPR_INITPARAM_OBJECT_WRAPPER);
@@ -553,12 +551,12 @@ public class FreemarkerServlet extends HttpServlet {
throw new InitParamValueException(INIT_PARAM_TEMPLATE_PATH, templatePath, e);
}
}
-
+
metaInfTldSources = createDefaultMetaInfTldSources();
classpathTlds = createDefaultClassPathTlds();
// Process all other init-params:
- for (Enumeration initPNames = getServletConfig().getInitParameterNames(); initPNames.hasMoreElements();) {
+ for (Enumeration<String> initPNames = getServletConfig().getInitParameterNames(); initPNames.hasMoreElements();) {
final String name = (String) initPNames.nextElement();
final String value = getInitParameter(name);
if (name == null) {
@@ -571,7 +569,7 @@ public class FreemarkerServlet extends HttpServlet {
"init-param " + _StringUtil.jQuote(name) + " without param-value. "
+ "Maybe the web.xml is not well-formed?");
}
-
+
try {
if (name.equals(DEPR_INITPARAM_OBJECT_WRAPPER)
|| name.equals(Configuration.Builder.OBJECT_WRAPPER_KEY)
@@ -599,7 +597,7 @@ public class FreemarkerServlet extends HttpServlet {
throw new ConflictingInitParamsException(
MutableProcessingConfiguration.TEMPLATE_EXCEPTION_HANDLER_KEY, DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER);
}
-
+
if (DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_RETHROW.equals(value)) {
cfgB.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW);
} else if (DEPR_INITPARAM_TEMPLATE_EXCEPTION_HANDLER_DEBUG.equals(value)) {
@@ -640,7 +638,7 @@ public class FreemarkerServlet extends HttpServlet {
} else if (name.equals(INIT_PARAM_META_INF_TLD_LOCATIONS)) {
metaInfTldSources = TaglibFactory.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(value));
} else if (name.equals(INIT_PARAM_CLASSPATH_TLDS)) {
- List newClasspathTlds = new ArrayList();
+ List<String> newClasspathTlds = new ArrayList<>();
if (classpathTlds != null) {
newClasspathTlds.addAll(classpathTlds);
}
@@ -655,7 +653,7 @@ public class FreemarkerServlet extends HttpServlet {
throw new InitParamValueException(name, value, e);
}
} // for initPNames
-
+
if (contentType.containsCharset && responseCharacterEncoding != ResponseCharacterEncoding.LEGACY) {
throw new InitParamValueException(INIT_PARAM_CONTENT_TYPE, contentType.httpHeaderValue,
new IllegalStateException("You can't specify the charset in the content type, because the \"" +
@@ -689,7 +687,7 @@ public class FreemarkerServlet extends HttpServlet {
protected TemplateLoader createTemplateLoader(String templatePath) throws IOException {
return InitParamParser.createTemplateLoader(templatePath, getClass(), getServletContext());
}
-
+
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
@@ -712,7 +710,7 @@ public class FreemarkerServlet extends HttpServlet {
if (preprocessRequest(request, response)) {
return;
}
-
+
if (bufferSize != null && !response.isCommitted()) {
try {
response.setBufferSize(bufferSize.intValue());
@@ -776,7 +774,7 @@ public class FreemarkerServlet extends HttpServlet {
}
}
}
-
+
if (responseCharacterEncoding != ResponseCharacterEncoding.LEGACY
&& responseCharacterEncoding != ResponseCharacterEncoding.DO_NOT_SET) {
// Using the Servlet 2.4 way of setting character encoding.
@@ -865,7 +863,7 @@ public class FreemarkerServlet extends HttpServlet {
// Converted with toString() for backward compatibility.
return new ContentType(contentTypeAttr.toString());
}
-
+
String outputFormatMimeType = template.getOutputFormat().getMimeType();
if (outputFormatMimeType != null) {
if (responseCharacterEncoding == ResponseCharacterEncoding.LEGACY) {
@@ -877,7 +875,7 @@ public class FreemarkerServlet extends HttpServlet {
return new ContentType(outputFormatMimeType, false);
}
}
-
+
return null;
}
@@ -921,7 +919,7 @@ public class FreemarkerServlet extends HttpServlet {
final HttpServletResponse response) throws TemplateModelException {
try {
AllHttpScopesHashModel params = new AllHttpScopesHashModel(objectWrapper, servletContext, request);
-
+
// Create hash model wrapper for servlet context (the application)
final ServletContextHashModel servletContextModel;
final TaglibFactory taglibFactory;
@@ -943,13 +941,14 @@ public class FreemarkerServlet extends HttpServlet {
taglibFactory = this.taglibFactory;
}
}
-
+
params.putUnlistedModel(KEY_APPLICATION, servletContextModel);
params.putUnlistedModel(KEY_APPLICATION_PRIVATE, servletContextModel);
params.putUnlistedModel(KEY_JSP_TAGLIBS, taglibFactory);
// Create hash model wrapper for session
HttpSessionHashModel sessionModel;
HttpSession session = request.getSession(false);
+
if (session != null) {
sessionModel = (HttpSessionHashModel) session.getAttribute(ATTR_SESSION_MODEL);
if (sessionModel == null || sessionModel.isOrphaned(session)) {
@@ -960,6 +959,7 @@ public class FreemarkerServlet extends HttpServlet {
} else {
sessionModel = new HttpSessionHashModel(this, request, response, objectWrapper);
}
+
params.putUnlistedModel(KEY_SESSION, sessionModel);
// Create hash model wrapper for request
@@ -972,6 +972,7 @@ public class FreemarkerServlet extends HttpServlet {
ATTR_REQUEST_PARAMETERS_MODEL,
createRequestParametersHashModel(request));
}
+
params.putUnlistedModel(KEY_REQUEST, requestModel);
params.putUnlistedModel(KEY_INCLUDE, new IncludePage(request, response));
params.putUnlistedModel(KEY_REQUEST_PRIVATE, requestModel);
@@ -1027,7 +1028,7 @@ public class FreemarkerServlet extends HttpServlet {
try {
final String prop = _SecurityUtil.getSystemProperty(SYSTEM_PROPERTY_CLASSPATH_TLDS, null);
classpathTldsFromSysProp = (prop != null) ? InitParamParser.parseCommaSeparatedList(prop)
- : Collections.emptyList();
+ : Collections.<String>emptyList();
} catch (ParseException e) {
throw new TemplateModelException(
"Failed to parse system property \"" + SYSTEM_PROPERTY_CLASSPATH_TLDS + "\"", e);
@@ -1050,7 +1051,7 @@ public class FreemarkerServlet extends HttpServlet {
*
* @return A {@link List} of {@link String}-s; not {@code null}.
*/
- protected List/*<MetaInfTldSource>*/ createDefaultClassPathTlds() {
+ protected List<String> createDefaultClassPathTlds() {
return TaglibFactory.DEFAULT_CLASSPATH_TLDS;
}
@@ -1063,8 +1064,9 @@ public class FreemarkerServlet extends HttpServlet {
*
* @return A {@link List} of {@link MetaInfTldSource}-s; not {@code null}.
*/
- protected List/*<MetaInfTldSource>*/ createDefaultMetaInfTldSources() {
- return TaglibFactory.DEFAULT_META_INF_TLD_SOURCES;
+ @SuppressWarnings("unchecked")
+ protected List<MetaInfTldSource> createDefaultMetaInfTldSources() {
+ return (List<MetaInfTldSource>) TaglibFactory.DEFAULT_META_INF_TLD_SOURCES;
}
/**
@@ -1155,7 +1157,7 @@ public class FreemarkerServlet extends HttpServlet {
protected void afterConfigurationBuilt(Configuration cfg) {
// do nothing
}
-
+
/**
* Called from {@link #init()} to set the {@link ObjectWrapper} in the {@link ExtendableBuilder}
* from the init-param value.
@@ -1254,7 +1256,7 @@ public class FreemarkerServlet extends HttpServlet {
TemplateModel data)
throws ServletException, IOException {
}
-
+
/**
* Returns the {@link org.apache.freemarker.core.Configuration} object used by this servlet.
* Please don't forget that {@link org.apache.freemarker.core.Configuration} is not thread-safe
@@ -1288,7 +1290,7 @@ public class FreemarkerServlet extends HttpServlet {
res.setHeader("Expires", EXPIRATION_DATE);
}
}
-
+
private int parseSize(String value) throws ParseException {
int lastDigitIdx;
for (lastDigitIdx = value.length() - 1; lastDigitIdx >= 0; lastDigitIdx--) {
@@ -1297,11 +1299,12 @@ public class FreemarkerServlet extends HttpServlet {
break;
}
}
-
+
final int n = Integer.parseInt(value.substring(0, lastDigitIdx + 1).trim());
-
+
final String unitStr = value.substring(lastDigitIdx + 1).trim().toUpperCase();
final int unit;
+
if (unitStr.length() == 0 || unitStr.equals("B")) {
unit = 1;
} else if (unitStr.equals("K") || unitStr.equals("KB") || unitStr.equals("KIB")) {
@@ -1311,7 +1314,7 @@ public class FreemarkerServlet extends HttpServlet {
} else {
throw new ParseException("Unknown unit: " + unitStr, lastDigitIdx + 1);
}
-
+
long size = (long) n * unit;
if (size < 0) {
throw new IllegalArgumentException("Buffer size can't be negative");
@@ -1322,8 +1325,9 @@ public class FreemarkerServlet extends HttpServlet {
return (int) size;
}
+ @SuppressWarnings("serial")
private static class InitParamValueException extends Exception {
-
+
InitParamValueException(String initParamName, String initParamValue, Throwable casue) {
super("Failed to set the " + _StringUtil.jQuote(initParamName) + " servlet init-param to "
+ _StringUtil.jQuote(initParamValue) + "; see cause exception.",
@@ -1334,11 +1338,12 @@ public class FreemarkerServlet extends HttpServlet {
super("Failed to set the " + _StringUtil.jQuote(initParamName) + " servlet init-param to "
+ _StringUtil.jQuote(initParamValue) + ": " + cause);
}
-
+
}
-
+
+ @SuppressWarnings("serial")
private static class ConflictingInitParamsException extends Exception {
-
+
ConflictingInitParamsException(String recommendedName, String otherName) {
super("Conflicting servlet init-params: "
+ _StringUtil.jQuote(recommendedName) + " and " + _StringUtil.jQuote(otherName)
@@ -1346,18 +1351,19 @@ public class FreemarkerServlet extends HttpServlet {
}
}
+ @SuppressWarnings("serial")
private static class MalformedWebXmlException extends Exception {
MalformedWebXmlException(String message) {
super(message);
}
-
+
}
-
+
private static class ContentType {
private final String httpHeaderValue;
private final boolean containsCharset;
-
+
public ContentType(String httpHeaderValue) {
this(httpHeaderValue, contentTypeContainsCharset(httpHeaderValue));
}
@@ -1366,7 +1372,7 @@ public class FreemarkerServlet extends HttpServlet {
this.httpHeaderValue = httpHeaderValue;
this.containsCharset = containsCharset;
}
-
+
private static boolean contentTypeContainsCharset(String contentType) {
int charsetIdx = contentType.toLowerCase().indexOf("charset=");
if (charsetIdx != -1) {
@@ -1383,7 +1389,7 @@ public class FreemarkerServlet extends HttpServlet {
}
return false;
}
-
+
/**
* Extracts the MIME type without the charset specifier or other such extras.
*/
@@ -1391,9 +1397,9 @@ public class FreemarkerServlet extends HttpServlet {
int scIdx = httpHeaderValue.indexOf(';');
return (scIdx == -1 ? httpHeaderValue : httpHeaderValue.substring(0, scIdx)).trim();
}
-
+
}
-
+
private <T extends InitParamValueEnum> T initParamValueToEnum(String initParamValue, T[] enumValues) {
for (T enumValue : enumValues) {
String enumInitParamValue = enumValue.getInitParamValue();
@@ -1403,7 +1409,7 @@ public class FreemarkerServlet extends HttpServlet {
return enumValue;
}
}
-
+
StringBuilder sb = new StringBuilder();
sb.append(_StringUtil.jQuote(initParamValue));
sb.append(" is not a one of the enumeration values: ");
@@ -1436,14 +1442,14 @@ public class FreemarkerServlet extends HttpServlet {
private interface InitParamValueEnum {
String getInitParamValue();
}
-
+
private enum OverrideResponseContentType implements InitParamValueEnum {
ALWAYS(INIT_PARAM_VALUE_ALWAYS),
NEVER(INIT_PARAM_VALUE_NEVER),
WHEN_TEMPLATE_HAS_MIME_TYPE(INIT_PARAM_VALUE_WHEN_TEMPLATE_HAS_MIME_TYPE);
private final String initParamValue;
-
+
OverrideResponseContentType(String initParamValue) {
this.initParamValue = initParamValue;
}
@@ -1453,7 +1459,7 @@ public class FreemarkerServlet extends HttpServlet {
return initParamValue;
}
}
-
+
private enum ResponseCharacterEncoding implements InitParamValueEnum {
// [FM3] Get rid of LEGACY
LEGACY(INIT_PARAM_VALUE_LEGACY),
@@ -1462,7 +1468,7 @@ public class FreemarkerServlet extends HttpServlet {
FORCE_CHARSET(INIT_PARAM_VALUE_FORCE_PREFIX + "${charsetName}");
private final String initParamValue;
-
+
ResponseCharacterEncoding(String initParamValue) {
this.initParamValue = initParamValue;
}
@@ -1489,5 +1495,4 @@ public class FreemarkerServlet extends HttpServlet {
}
}
-
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28102af6/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
index 747dc50..323e15f 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/InitParamParser.java
@@ -125,8 +125,8 @@ final class InitParamParser {
return "/" + path;
}
- static List/*<String>*/ parseCommaSeparatedList(String value) throws ParseException {
- List/*<String>*/ valuesList = new ArrayList();
+ static List<String> parseCommaSeparatedList(String value) throws ParseException {
+ List<String> valuesList = new ArrayList<>();
String[] values = _StringUtil.split(value, ',');
for (int i = 0; i < values.length; i++) {
final String s = values[i].trim();
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/28102af6/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index cb45aa4..7a45001 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -2053,7 +2053,7 @@ public class TaglibFactory implements TemplateHashModel {
/**
* TLD locations to look for when finding available JSP tag libraries.
*/
- private List<MetaInfTldSource> metaInfTldSources;
+ private List<? extends MetaInfTldSource> metaInfTldSources;
/**
* TLD classpath locations to look for when finding available JSP tag libraries.
@@ -2097,11 +2097,8 @@ public class TaglibFactory implements TemplateHashModel {
* Get the list of places where to look for {@code META-INF/**}{@code /*.tld} files.
* @return the list of places where to look for {@code META-INF/**}{@code /*.tld} files
*/
- public List<MetaInfTldSource> getMetaInfTldSources() {
- if (metaInfTldSources == null) {
- return Collections.emptyList();
- }
- return metaInfTldSources;
+ public List<? extends MetaInfTldSource> getMetaInfTldSources() {
+ return (metaInfTldSources != null) ? metaInfTldSources : Collections.<MetaInfTldSource> emptyList();
}
/**
@@ -2120,7 +2117,7 @@ public class TaglibFactory implements TemplateHashModel {
*
* @see #setClasspathTlds(List)
*/
- public void setMetaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
+ public void setMetaInfTldSources(List<? extends MetaInfTldSource> metaInfTldSources) {
_NullArgumentException.check("metaInfTldSources", metaInfTldSources);
this.metaInfTldSources = Collections.unmodifiableList(new ArrayList<>(metaInfTldSources));
}
@@ -2133,7 +2130,7 @@ public class TaglibFactory implements TemplateHashModel {
* {@link MetaInfTldSource} wins.
* @return this builder
*/
- public Builder metaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
+ public Builder metaInfTldSources(List<? extends MetaInfTldSource> metaInfTldSources) {
setMetaInfTldSources(metaInfTldSources);
return this;
}
@@ -2145,10 +2142,7 @@ public class TaglibFactory implements TemplateHashModel {
* {@link #setMetaInfTldSources(List)}, yet you want them to be discovered
*/
public List<String> getClasspathTlds() {
- if (classpathTlds == null) {
- return Collections.emptyList();
- }
- return classpathTlds;
+ return (classpathTlds != null) ? classpathTlds : Collections.<String> emptyList();
}
/**
[13/17] incubator-freemarker git commit: FREEMARKER-55: Merged:
polishing and cleanups in TaglibFactory builder
Posted by dd...@apache.org.
FREEMARKER-55: Merged: polishing and cleanups in TaglibFactory builder
Merge commit 'refs/pull/26/head' of https://github.com/apache/incubator-freemarker into 3
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/bd09327f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/bd09327f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/bd09327f
Branch: refs/heads/3
Commit: bd09327f9bf1dc326a723553872724048a194d63
Parents: 9b31510 42cfb32
Author: ddekany <dd...@apache.org>
Authored: Thu Jul 6 09:27:03 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Thu Jul 6 09:42:51 2017 +0200
----------------------------------------------------------------------
.../apache/freemarker/core/Configuration.java | 2 +-
.../freemarker/core/TemplateConfiguration.java | 2 +-
.../freemarker/core/util/_CollectionUtil.java | 30 +-
freemarker-servlet/build.gradle | 9 +-
.../freemarker/servlet/FreemarkerServlet.java | 158 +++--
.../freemarker/servlet/InitParamParser.java | 4 +-
.../freemarker/servlet/jsp/TaglibFactory.java | 683 ++++++++++++-------
.../servlet/jsp/TaglibFactoryBuilder.java | 167 -----
freemarker-spring/build.gradle | 9 +-
.../spring/SpringResourceTemplateLoader.java | 168 +++++
.../SpringResourceTemplateLoader.java | 168 -----
.../spring/web/view/FreemarkerViewResolver.java | 36 +-
.../SpringResourceTemplateLoaderTest.java | 1 +
.../spring/web/view/FreemarkerViewTest.java | 23 +-
14 files changed, 756 insertions(+), 704 deletions(-)
----------------------------------------------------------------------
[12/17] incubator-freemarker git commit: Merge branch '3' into
feature/FREEMARKER-55
Posted by dd...@apache.org.
Merge branch '3' into feature/FREEMARKER-55
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/42cfb326
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/42cfb326
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/42cfb326
Branch: refs/heads/3
Commit: 42cfb3261b4f591d822ca91d443f82e12f3e98a5
Parents: 28102af 9b31510
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 20:51:00 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 20:51:00 2017 -0400
----------------------------------------------------------------------
.../core/FM2ASTToFM3SourceConverter.java | 289 +++++++++++++------
.../converter/ConversionWarnReceiver.java | 44 +++
.../apache/freemarker/converter/Converter.java | 30 +-
.../freemarker/converter/FM2ToFM3Converter.java | 5 +-
.../converter/LoggingWarnReceiver.java | 44 +++
.../converter/FM2ToFM3ConverterTest.java | 18 ++
6 files changed, 332 insertions(+), 98 deletions(-)
----------------------------------------------------------------------
[10/17] incubator-freemarker git commit: FREEMARKER-55: cleaning up
TaglibFactory.Builder
Posted by dd...@apache.org.
FREEMARKER-55: cleaning up TaglibFactory.Builder
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/14396c83
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/14396c83
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/14396c83
Branch: refs/heads/3
Commit: 14396c83635d2b34612a429312c223afa8836fd4
Parents: e12792e
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 20:19:21 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 20:19:21 2017 -0400
----------------------------------------------------------------------
.../apache/freemarker/core/Configuration.java | 2 +-
.../freemarker/core/TemplateConfiguration.java | 2 +-
.../freemarker/core/util/_CollectionUtil.java | 30 +++-
.../freemarker/servlet/FreemarkerServlet.java | 30 ++--
.../freemarker/servlet/jsp/TaglibFactory.java | 169 +++++++++++--------
.../spring/web/view/FreemarkerViewResolver.java | 6 +-
.../spring/web/view/FreemarkerViewTest.java | 5 +-
7 files changed, 143 insertions(+), 101 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/14396c83/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
index 9f31556..01ba1b2 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
@@ -434,7 +434,7 @@ public final class Configuration implements TopLevelConfiguration, CustomStateSc
builder.getImpliedCustomNumberFormats(), builder.getCustomNumberFormats(), false);
autoImports = _CollectionUtil.mergeImmutableMaps(
builder.getImpliedAutoImports(), builder.getAutoImports(), true);
- autoIncludes = _CollectionUtil.mergeImmutableLists(
+ autoIncludes = _CollectionUtil.mergeTwoListsToImmutableList(
builder.getImpliedAutoIncludes(), builder.getAutoIncludes(), true);
lazyImports = builder.getLazyImports();
lazyAutoImports = builder.getLazyAutoImports();
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/14396c83/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
index 17583e5..019c3f6 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateConfiguration.java
@@ -876,7 +876,7 @@ public final class TemplateConfiguration implements ParsingAndProcessingConfigur
true);
}
if (tc.isAutoIncludesSet()) {
- setAutoIncludes(_CollectionUtil.mergeImmutableLists(
+ setAutoIncludes(_CollectionUtil.mergeTwoListsToImmutableList(
isAutoIncludesSet() ? getAutoIncludes() : null,
tc.isAutoIncludesSet() ? tc.getAutoIncludes() : null,
true),
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/14396c83/freemarker-core/src/main/java/org/apache/freemarker/core/util/_CollectionUtil.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_CollectionUtil.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_CollectionUtil.java
index d5a6574..7cafed3 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/_CollectionUtil.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/_CollectionUtil.java
@@ -171,20 +171,41 @@ public class _CollectionUtil {
}
/**
+ * Adds multiple {@link List}-s; assuming the inputs are already unmodifiable and unchanging, it returns an
+ * unmodifiable and unchanging {@link List} itself.
+ */
+ public static <T> List<T> mergeListsToImmutableList(boolean skipDuplicatesInList1, List<T> ... lists) {
+ if (lists == null || lists.length == 0) {
+ return null;
+ }
+
+ if (lists.length == 1) {
+ return mergeTwoListsToImmutableList(lists[0], null, skipDuplicatesInList1);
+ } else if (lists.length == 2) {
+ return mergeTwoListsToImmutableList(lists[0], lists[1], skipDuplicatesInList1);
+ } else {
+ List<T> [] reducedLists = new List[lists.length - 1];
+ reducedLists[0] = mergeTwoListsToImmutableList(lists[0], lists[1], skipDuplicatesInList1);
+ System.arraycopy(lists, 2, reducedLists, 1, lists.length - 2);
+ return mergeListsToImmutableList(skipDuplicatesInList1, reducedLists);
+ }
+ }
+
+ /**
* Adds two {@link List}-s; assuming the inputs are already unmodifiable and unchanging, it returns an
* unmodifiable and unchanging {@link List} itself.
*/
- public static List<String> mergeImmutableLists(List<String> list1, List<String> list2,
+ public static <T> List<T> mergeTwoListsToImmutableList(List<T> list1, List<T> list2,
boolean skipDuplicatesInList1) {
if (list1 == null) return list2;
if (list2 == null) return list1;
if (list1.isEmpty()) return list2;
if (list2.isEmpty()) return list1;
- ArrayList<String> mergedList = new ArrayList<>(list1.size() + list2.size());
+ ArrayList<T> mergedList = new ArrayList<>(list1.size() + list2.size());
if (skipDuplicatesInList1) {
- Set<String> list2Set = new HashSet<>(list2);
- for (String it : list1) {
+ Set<T> list2Set = new HashSet<>(list2);
+ for (T it : list1) {
if (!list2Set.contains(it)) {
mergedList.add(it);
}
@@ -195,4 +216,5 @@ public class _CollectionUtil {
mergedList.addAll(list2);
return Collections.unmodifiableList(mergedList);
}
+
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/14396c83/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index da0435d..bcd4d04 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -61,9 +61,11 @@ import org.apache.freemarker.core.templateresolver.TemplateLoader;
import org.apache.freemarker.core.templateresolver.impl.ClassTemplateLoader;
import org.apache.freemarker.core.templateresolver.impl.FileTemplateLoader;
import org.apache.freemarker.core.templateresolver.impl.MultiTemplateLoader;
+import org.apache.freemarker.core.util._CollectionUtil;
import org.apache.freemarker.core.util._SecurityUtil;
import org.apache.freemarker.core.util._StringUtil;
import org.apache.freemarker.servlet.jsp.TaglibFactory;
+import org.apache.freemarker.servlet.jsp.TaglibFactory.ClasspathMetaInfTldSource;
import org.apache.freemarker.servlet.jsp.TaglibFactory.MetaInfTldSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -490,8 +492,8 @@ public class FreemarkerServlet extends HttpServlet {
private ResponseCharacterEncoding responseCharacterEncoding = ResponseCharacterEncoding.LEGACY;
private Charset forcedResponseCharacterEncoding;
private OverrideResponseLocale overrideResponseLocale = OverrideResponseLocale.ALWAYS;
- private List/*<MetaInfTldSource>*/ metaInfTldSources;
- private List/*<String>*/ classpathTlds;
+ private List<MetaInfTldSource> metaInfTldSources;
+ private List<String> classpathTlds;
private Object lazyInitFieldsLock = new Object();
@SuppressFBWarnings(value="SE_BAD_FIELD", justification="Not investing into making this Servlet serializable")
@@ -1007,11 +1009,15 @@ public class FreemarkerServlet extends HttpServlet {
"Failed to parse system property \"" + SYSTEM_PROPERTY_META_INF_TLD_SOURCES + "\"", e);
}
- List<Pattern> jettyTaglibJarPatterns = null;
+ List<MetaInfTldSource> jettyMetaInfTldSources = null;
try {
final String attrVal = (String) servletContext.getAttribute(ATTR_JETTY_CP_TAGLIB_JAR_PATTERNS);
- jettyTaglibJarPatterns = (attrVal != null) ? InitParamParser.parseCommaSeparatedPatterns(attrVal)
- : Collections.emptyList();
+ List<Pattern> jettyTaglibJarPatterns = (attrVal != null)
+ ? InitParamParser.parseCommaSeparatedPatterns(attrVal) : Collections.emptyList();
+ jettyMetaInfTldSources = new ArrayList<>(jettyTaglibJarPatterns.size());
+ for (Pattern pattern : jettyTaglibJarPatterns) {
+ jettyMetaInfTldSources.add(new ClasspathMetaInfTldSource(pattern));
+ }
} catch (Exception e) {
LOG.error("Failed to parse application context attribute \"" + ATTR_JETTY_CP_TAGLIB_JAR_PATTERNS
+ "\" - it will be ignored", e);
@@ -1027,14 +1033,12 @@ public class FreemarkerServlet extends HttpServlet {
"Failed to parse system property \"" + SYSTEM_PROPERTY_CLASSPATH_TLDS + "\"", e);
}
- return new TaglibFactory.Builder()
- .servletContext(servletContext)
- .objectWrapper(objectWrapper)
- .addAllMetaInfTldSources(metaInfTldSources)
- .addAllMetaInfTldSources(metaInfTldSourcesFromSysProp)
- .addAllJettyMetaInfTldJarPatterns(jettyTaglibJarPatterns)
- .addAllClasspathTlds(classpathTlds)
- .addAllClasspathTlds(classpathTldsFromSysProp).build();
+ return new TaglibFactory.Builder(servletContext, objectWrapper)
+ .metaInfTldSources(_CollectionUtil.mergeListsToImmutableList(true, metaInfTldSources,
+ metaInfTldSourcesFromSysProp, jettyMetaInfTldSources))
+ .classpathTlds(
+ _CollectionUtil.mergeTwoListsToImmutableList(classpathTlds, classpathTldsFromSysProp, true))
+ .build();
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/14396c83/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index f4fea3b..cb45aa4 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -136,6 +136,12 @@ public class TaglibFactory implements TemplateHashModel {
private List<String> failedTldLocations = new ArrayList<>();
private int nextTldLocationLookupPhase = 0;
+ /**
+ * Parse TLD location string {@code value}. e.g, "webInfPerLibJars", "classpath:*", etc.
+ * @param value TLD location string
+ * @return {@link MetaInfTldSource} instance for the value
+ * @throws ParseException if invalid value syntax found
+ */
public static MetaInfTldSource parseMetaInfTldLocation(String value) throws ParseException {
MetaInfTldSource metaInfTldSource;
@@ -167,6 +173,13 @@ public class TaglibFactory implements TemplateHashModel {
return metaInfTldSource;
}
+ /**
+ * Parse each TLD location string in the {@code list} and return a list of type {@link MetaInfTldSource}.
+ * @param values TLD location string value list
+ * @return a list of type {@link MetaInfTldSource} by parsing each TLD location string item value
+ * @throws ParseException if invalid value syntax found
+ * @see {@link #parseMetaInfTldLocation(String)}
+ */
public static List<MetaInfTldSource> parseMetaInfTldLocations(List<String> values) throws ParseException {
List<MetaInfTldSource> metaInfTldSources = null;
@@ -205,7 +218,7 @@ public class TaglibFactory implements TemplateHashModel {
servletContext = builder.getServletContext();
objectWrapper = builder.getObjectWrapper();
metaInfTldSources = builder.getMetaInfTldSources();
- classpathTlds = builder.getClassPathTlds();
+ classpathTlds = builder.getClasspathTlds();
}
/**
@@ -496,7 +509,7 @@ public class TaglibFactory implements TemplateHashModel {
}
}
}
-
+
private void addTldLocationsFromWebInfPerLibJarMetaInfTlds() throws IOException, SAXException {
LOG.debug("Looking for TLD locations in servletContext:/WEB-INF/lib/*.{jar,zip}{}*.tld", META_INF_ABS_PATH);
@@ -583,7 +596,7 @@ public class TaglibFactory implements TemplateHashModel {
LOG.debug("Scanning for " + META_INF_ABS_PATH
+ "*.tld-s in ZipInputStream (slow): servletContext:" + jarResourcePath);
}
-
+
final InputStream in = servletContext.getResourceAsStream(jarResourcePath);
if (in == null) {
throw new IOException("ServletContext resource not found: " + jarResourcePath);
@@ -1060,6 +1073,7 @@ public class TaglibFactory implements TemplateHashModel {
if (jarFileUrl == null) {
throw new IOException("Servlet context resource not found: " + servletContextJarFilePath);
}
+
return new URL(
"jar:"
+ jarFileUrl.toURI()
@@ -1329,17 +1343,20 @@ public class TaglibFactory implements TemplateHashModel {
}
final String entryPath;
+
if (this.entryPath != null) {
entryPath = this.entryPath;
} else {
if (entryUrl == null) {
throw new IOException("Nothing to deduce jar entry path from.");
}
+
String urlEF = entryUrl.toExternalForm();
int sepIdx = urlEF.indexOf(JAR_URL_ENTRY_PATH_START);
if (sepIdx == -1) {
throw new IOException("Couldn't extract jar entry path from: " + urlEF);
}
+
entryPath = normalizeJarEntryPath(
URLDecoder.decode(
urlEF.substring(sepIdx + JAR_URL_ENTRY_PATH_START.length()),
@@ -1357,6 +1374,7 @@ public class TaglibFactory implements TemplateHashModel {
throw new IOException("Jar's InputStreamFactory (" + fallbackRawJarContentInputStreamFactory
+ ") says the resource doesn't exist.");
}
+
zipIn = new ZipInputStream(rawIn);
while (true) {
@@ -2014,69 +2032,75 @@ public class TaglibFactory implements TemplateHashModel {
public TaglibGettingException(String message) {
super(message);
}
-
+
}
+ /**
+ * Creates a new {@link TaglibFactory}.
+ */
public static class Builder implements CommonBuilder<TaglibFactory> {
/**
* Servlet context.
*/
- private ServletContext servletContext;
+ private final ServletContext servletContext;
/**
- * Object wrapper to be used in model building.
+ * ObjectWrapper to be used in model building.
*/
- private ObjectWrapper objectWrapper;
+ private final ObjectWrapper objectWrapper;
/**
* TLD locations to look for when finding available JSP tag libraries.
*/
- private List<MetaInfTldSource> metaInfTldSources = new ArrayList<>();
+ private List<MetaInfTldSource> metaInfTldSources;
/**
* TLD classpath locations to look for when finding available JSP tag libraries.
*/
- private List<String> classPathTlds = new ArrayList<>();
+ private List<String> classpathTlds;
private boolean alreadyBuilt;
- public Builder() {
+ /**
+ * Constructs a Builder with ServletContext and ObjectWrapper.
+ * @param servletContext ServletContext instance
+ * @param objectWrapper the {@link ObjectWrapper} used when building the JSP tag library {@link TemplateHashModel}-s from the TLD-s.
+ * Usually, it should be the same {@link ObjectWrapper} that will be used inside the templates. {@code null} value
+ * is only supported for backward compatibility. For custom EL functions to be exposed, it must be non-{@code null}
+ * and an {@code intanceof} {@link DefaultObjectWrapper} (like typically, a {@link DefaultObjectWrapper}).
+ */
+ public Builder(ServletContext servletContext, ObjectWrapper objectWrapper) {
+ _NullArgumentException.check("servletContext", servletContext);
+ _NullArgumentException.check("objectWrapper", objectWrapper);
+ this.servletContext = servletContext;
+ this.objectWrapper = objectWrapper;
}
+ /**
+ * Get ServletContext instance.
+ * @return ServletContext instance
+ */
public ServletContext getServletContext() {
return servletContext;
}
- public void setServletContext(ServletContext servletContext) {
- this.servletContext = servletContext;
- }
-
- public Builder servletContext(ServletContext servletContext) {
- setServletContext(servletContext);
- return this;
- }
-
+ /**
+ * Get ObjectWrapper to be used in model building.
+ * @return ObjectWrapper to be used in model building
+ */
public ObjectWrapper getObjectWrapper() {
return objectWrapper;
}
/**
- * Sets the {@link ObjectWrapper} used when building the JSP tag library {@link TemplateHashModel}-s from the TLD-s.
- * Usually, it should be the same {@link ObjectWrapper} that will be used inside the templates. {@code null} value
- * is only supported for backward compatibility. For custom EL functions to be exposed, it must be non-{@code null}
- * and an {@code intanceof} {@link DefaultObjectWrapper} (like typically, a {@link DefaultObjectWrapper}).
+ * Get the list of places where to look for {@code META-INF/**}{@code /*.tld} files.
+ * @return the list of places where to look for {@code META-INF/**}{@code /*.tld} files
*/
- public void setObjectWrapper(ObjectWrapper objectWrapper) {
- this.objectWrapper = objectWrapper;
- }
-
- public Builder objectWrapper(ObjectWrapper objectWrapper) {
- setObjectWrapper(objectWrapper);
- return this;
- }
-
public List<MetaInfTldSource> getMetaInfTldSources() {
+ if (metaInfTldSources == null) {
+ return Collections.emptyList();
+ }
return metaInfTldSources;
}
@@ -2097,11 +2121,34 @@ public class TaglibFactory implements TemplateHashModel {
* @see #setClasspathTlds(List)
*/
public void setMetaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
- this.metaInfTldSources = metaInfTldSources;
+ _NullArgumentException.check("metaInfTldSources", metaInfTldSources);
+ this.metaInfTldSources = Collections.unmodifiableList(new ArrayList<>(metaInfTldSources));
+ }
+
+ /**
+ * Fluent API equivalent of {@link #setMetaInfTldSources(List)}.
+ * @param metaInfTldSources
+ * The list of {@link MetaInfTldSource} subclass instances. Their order matters if multiple TLD-s define
+ * a taglib with the same {@code taglib-uri}. In that case, the one found by the earlier
+ * {@link MetaInfTldSource} wins.
+ * @return this builder
+ */
+ public Builder metaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
+ setMetaInfTldSources(metaInfTldSources);
+ return this;
}
- public List<String> getClassPathTlds() {
- return classPathTlds;
+ /**
+ * Get the class-loader resource paths of the TLD-s that aren't inside the locations covered by
+ * {@link #setMetaInfTldSources(List)}, yet you want them to be discovered.
+ * @return the class-loader resource paths of the TLD-s that aren't inside the locations covered by
+ * {@link #setMetaInfTldSources(List)}, yet you want them to be discovered
+ */
+ public List<String> getClasspathTlds() {
+ if (classpathTlds == null) {
+ return Collections.emptyList();
+ }
+ return classpathTlds;
}
/**
@@ -2118,50 +2165,24 @@ public class TaglibFactory implements TemplateHashModel {
*
* @see #setMetaInfTldSources(List)
*/
- public void setClassPathTlds(List<String> classPathTlds) {
- this.classPathTlds = classPathTlds;
- }
-
- public Builder addMetaInfTldSource(MetaInfTldSource metaInfTldSource) {
- metaInfTldSources.add(metaInfTldSource);
- return this;
- }
-
- public Builder addAllMetaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
- this.metaInfTldSources.addAll(metaInfTldSources);
- return this;
+ public void setClasspathTlds(List<String> classpathTlds) {
+ _NullArgumentException.check("objectWrapper", objectWrapper);
+ this.classpathTlds = Collections.unmodifiableList(new ArrayList<>(classpathTlds));
}
- public Builder addMetaInfTldLocation(String metaInfTldLocation) throws ParseException {
- return addMetaInfTldSource(parseMetaInfTldLocation(metaInfTldLocation));
- }
-
- public Builder addMetaInfTldLocations(List<String> metaInfTldLocations) throws ParseException {
- return addAllMetaInfTldSources(parseMetaInfTldLocations(metaInfTldLocations));
- }
-
- public Builder addJettyMetaInfTldJarPattern(Pattern pattern) {
- return addMetaInfTldSource(new ClasspathMetaInfTldSource(pattern));
- }
-
- public Builder addAllJettyMetaInfTldJarPatterns(List<Pattern> patterns) {
- for (Pattern pattern : patterns) {
- addJettyMetaInfTldJarPattern(pattern);
- }
-
- return this;
- }
-
- public Builder addClasspathTld(String classpathTld) {
- classPathTlds.add(classpathTld);
- return this;
- }
-
- public Builder addAllClasspathTlds(List<String> classpathTlds) {
- classPathTlds.addAll(classpathTlds);
+ /**
+ * Fluent API equivalent of {@link #setClasspathTlds(List)}.
+ * @param classpathTlds
+ * List of {@code String}-s, maybe {@code null}. Each item is a resource path, like
+ * {@code "/META-INF/my.tld"}. (Relative resource paths will be interpreted as root-relative.)
+ * @return this builder
+ */
+ public Builder classpathTlds(List<String> classpathTlds) {
+ setClasspathTlds(classpathTlds);
return this;
}
+ @Override
public TaglibFactory build() throws ConfigurationException {
if (alreadyBuilt) {
throw new IllegalStateException("build() can only be executed once.");
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/14396c83/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
index fa4b226..c58e7db 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
@@ -127,10 +127,8 @@ public class FreemarkerViewResolver extends AbstractTemplateViewResolver impleme
servletContextModel = new ServletContextHashModel(pageContextServlet, objectWrapper);
- taglibFactory = new TaglibFactory.Builder()
- .servletContext(getServletContext())
- .objectWrapper(objectWrapper)
- .build();
+ // TODO: additional meta-inf / classpath tld resources?
+ taglibFactory = new TaglibFactory.Builder(getServletContext(), objectWrapper).build();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/14396c83/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
index 8036f30..1ed2831 100644
--- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
@@ -72,10 +72,7 @@ public class FreemarkerViewTest {
pageContextServlet = new PageContextServlet();
pageContextServlet.init(new PageContextServletConfig(servletContext, PageContextServlet.class.getSimpleName()));
- taglibFactory = new TaglibFactory.Builder()
- .servletContext(servletContext)
- .objectWrapper(objectWrapper)
- .build();
+ taglibFactory = new TaglibFactory.Builder(servletContext, objectWrapper).build();
viewResolver = new FreemarkerViewResolver();
viewResolver.setServletContext(servletContext);
[04/17] incubator-freemarker git commit: FREEMARKER-55: simplify
builder constructor
Posted by dd...@apache.org.
FREEMARKER-55: simplify builder constructor
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/c0bb4903
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/c0bb4903
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/c0bb4903
Branch: refs/heads/3
Commit: c0bb4903c6494c873c97d9a0190de68288e4a1bb
Parents: dcbebe9
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 16:37:32 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 16:37:32 2017 -0400
----------------------------------------------------------------------
.../freemarker/servlet/FreemarkerServlet.java | 4 +-
.../freemarker/servlet/jsp/TaglibFactory.java | 46 ++++++++++++++++++--
.../spring/web/view/FreemarkerViewResolver.java | 5 ++-
.../spring/web/view/FreemarkerViewTest.java | 5 ++-
4 files changed, 54 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c0bb4903/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index c56f6d7..aad3d55 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -1027,7 +1027,9 @@ public class FreemarkerServlet extends HttpServlet {
"Failed to parse system property \"" + SYSTEM_PROPERTY_CLASSPATH_TLDS + "\"", e);
}
- return new TaglibFactory.Builder(servletContext, objectWrapper)
+ return new TaglibFactory.Builder()
+ .servletContext(servletContext)
+ .objectWrapper(objectWrapper)
.addAllMetaInfTldSources(metaInfTldSources)
.addAllMetaInfTldSources(metaInfTldSourcesFromSysProp)
.addAllJettyMetaInfTldJarPatterns(jettyTaglibJarPatterns)
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c0bb4903/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 9da15e4..4679e27 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -1998,12 +1998,12 @@ public class TaglibFactory implements TemplateHashModel {
/**
* Servlet context.
*/
- private final ServletContext servletContext;
+ private ServletContext servletContext;
/**
* Object wrapper to be used in model building.
*/
- private final ObjectWrapper objectWrapper;
+ private ObjectWrapper objectWrapper;
/**
* TLD locations to look for when finding available JSP tag libraries.
@@ -2015,11 +2015,51 @@ public class TaglibFactory implements TemplateHashModel {
*/
private List<String> classPathTlds = new ArrayList<>();
- public Builder(ServletContext servletContext, ObjectWrapper objectWrapper) {
+ public Builder() {
+ }
+
+ public ServletContext getServletContext() {
+ return servletContext;
+ }
+
+ public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
+ }
+
+ public Builder servletContext(ServletContext servletContext) {
+ setServletContext(servletContext);
+ return this;
+ }
+
+ public ObjectWrapper getObjectWrapper() {
+ return objectWrapper;
+ }
+
+ public void setObjectWrapper(ObjectWrapper objectWrapper) {
this.objectWrapper = objectWrapper;
}
+ public Builder objectWrapper(ObjectWrapper objectWrapper) {
+ setObjectWrapper(objectWrapper);
+ return this;
+ }
+
+ public List<MetaInfTldSource> getMetaInfTldSources() {
+ return metaInfTldSources;
+ }
+
+ public void setMetaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
+ this.metaInfTldSources = metaInfTldSources;
+ }
+
+ public List<String> getClassPathTlds() {
+ return classPathTlds;
+ }
+
+ public void setClassPathTlds(List<String> classPathTlds) {
+ this.classPathTlds = classPathTlds;
+ }
+
public Builder addMetaInfTldSource(MetaInfTldSource metaInfTldSource) {
metaInfTldSources.add(metaInfTldSource);
return this;
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c0bb4903/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
index 7969b56..fa4b226 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
@@ -127,7 +127,10 @@ public class FreemarkerViewResolver extends AbstractTemplateViewResolver impleme
servletContextModel = new ServletContextHashModel(pageContextServlet, objectWrapper);
- taglibFactory = new TaglibFactory.Builder(getServletContext(), objectWrapper).build();
+ taglibFactory = new TaglibFactory.Builder()
+ .servletContext(getServletContext())
+ .objectWrapper(objectWrapper)
+ .build();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/c0bb4903/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
index 1ed2831..8036f30 100644
--- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
@@ -72,7 +72,10 @@ public class FreemarkerViewTest {
pageContextServlet = new PageContextServlet();
pageContextServlet.init(new PageContextServletConfig(servletContext, PageContextServlet.class.getSimpleName()));
- taglibFactory = new TaglibFactory.Builder(servletContext, objectWrapper).build();
+ taglibFactory = new TaglibFactory.Builder()
+ .servletContext(servletContext)
+ .objectWrapper(objectWrapper)
+ .build();
viewResolver = new FreemarkerViewResolver();
viewResolver.setServletContext(servletContext);
[06/17] incubator-freemarker git commit: FREEMARKER-55: removing
mutable setters in TaglibFactory
Posted by dd...@apache.org.
FREEMARKER-55: removing mutable setters in TaglibFactory
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/86212264
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/86212264
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/86212264
Branch: refs/heads/3
Commit: 8621226442bc5bdcdc9b594a688e6f9ce0e80097
Parents: 7807170
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 17:10:32 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 17:10:32 2017 -0400
----------------------------------------------------------------------
.../freemarker/servlet/jsp/TaglibFactory.java | 110 ++++++-------------
1 file changed, 36 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/86212264/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 2026f8b..0ad9a49 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -344,80 +344,6 @@ public class TaglibFactory implements TemplateHashModel {
public boolean isEmpty() {
return false;
}
-
- /**
- * See {@link #setObjectWrapper(ObjectWrapper)}.
- */
- public ObjectWrapper getObjectWrapper() {
- return objectWrapper;
- }
-
- /**
- * Sets the {@link ObjectWrapper} used when building the JSP tag library {@link TemplateHashModel}-s from the TLD-s.
- * Usually, it should be the same {@link ObjectWrapper} that will be used inside the templates. {@code null} value
- * is only supported for backward compatibility. For custom EL functions to be exposed, it must be non-{@code null}
- * and an {@code intanceof} {@link DefaultObjectWrapper} (like typically, a {@link DefaultObjectWrapper}).
- */
- public void setObjectWrapper(ObjectWrapper objectWrapper) {
- checkNotStarted();
- this.objectWrapper = objectWrapper;
- }
-
- /**
- * See {@link #setMetaInfTldSources(List)}.
- */
- public List/*<Pattern>*/ getMetaInfTldSources() {
- return metaInfTldSources;
- }
-
- /**
- * Sets the list of places where we will look for {@code META-INF/**}{@code /*.tld} files. By default this is a list
- * that only contains {@link WebInfPerLibJarMetaInfTldSource#INSTANCE}. This corresponds to the behavior that the
- * JSP specification describes. See the {@link MetaInfTldSource} subclasses for the possible values and their
- * meanings.
- *
- * <p>
- * This is usually set via the init-params of {@link FreemarkerServlet}.
- *
- * @param metaInfTldSources
- * The list of {@link MetaInfTldSource} subclass instances. Their order matters if multiple TLD-s define
- * a taglib with the same {@code taglib-uri}. In that case, the one found by the earlier
- * {@link MetaInfTldSource} wins.
- *
- * @see #setClasspathTlds(List)
- */
- public void setMetaInfTldSources(List/*<? extends MetaInfTldSource>*/ metaInfTldSources) {
- checkNotStarted();
- _NullArgumentException.check("metaInfTldSources", metaInfTldSources);
- this.metaInfTldSources = metaInfTldSources;
- }
-
- /**
- * See {@link #setClasspathTlds(List)}.
- */
- public List/*<String>*/ getClasspathTlds() {
- return classpathTlds;
- }
-
- /**
- * Sets the class-loader resource paths of the TLD-s that aren't inside the locations covered by
- * {@link #setMetaInfTldSources(List)}, yet you want them to be discovered. They will be loaded with the class
- * loader provided by the servlet container.
- *
- * <p>
- * This is usually set via the init-params of {@link FreemarkerServlet}.
- *
- * @param classpathTlds
- * List of {@code String}-s, maybe {@code null}. Each item is a resource path, like
- * {@code "/META-INF/my.tld"}. (Relative resource paths will be interpreted as root-relative.)
- *
- * @see #setMetaInfTldSources(List)
- */
- public void setClasspathTlds(List/*<String>*/ classpathTlds) {
- checkNotStarted();
- _NullArgumentException.check("classpathTlds", classpathTlds);
- this.classpathTlds = classpathTlds;
- }
private void checkNotStarted() {
synchronized (lock) {
@@ -2091,6 +2017,12 @@ public class TaglibFactory implements TemplateHashModel {
return objectWrapper;
}
+ /**
+ * Sets the {@link ObjectWrapper} used when building the JSP tag library {@link TemplateHashModel}-s from the TLD-s.
+ * Usually, it should be the same {@link ObjectWrapper} that will be used inside the templates. {@code null} value
+ * is only supported for backward compatibility. For custom EL functions to be exposed, it must be non-{@code null}
+ * and an {@code intanceof} {@link DefaultObjectWrapper} (like typically, a {@link DefaultObjectWrapper}).
+ */
public void setObjectWrapper(ObjectWrapper objectWrapper) {
this.objectWrapper = objectWrapper;
}
@@ -2104,6 +2036,22 @@ public class TaglibFactory implements TemplateHashModel {
return metaInfTldSources;
}
+ /**
+ * Sets the list of places where we will look for {@code META-INF/**}{@code /*.tld} files. By default this is a list
+ * that only contains {@link WebInfPerLibJarMetaInfTldSource#INSTANCE}. This corresponds to the behavior that the
+ * JSP specification describes. See the {@link MetaInfTldSource} subclasses for the possible values and their
+ * meanings.
+ *
+ * <p>
+ * This is usually set via the init-params of {@link FreemarkerServlet}.
+ *
+ * @param metaInfTldSources
+ * The list of {@link MetaInfTldSource} subclass instances. Their order matters if multiple TLD-s define
+ * a taglib with the same {@code taglib-uri}. In that case, the one found by the earlier
+ * {@link MetaInfTldSource} wins.
+ *
+ * @see #setClasspathTlds(List)
+ */
public void setMetaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
this.metaInfTldSources = metaInfTldSources;
}
@@ -2112,6 +2060,20 @@ public class TaglibFactory implements TemplateHashModel {
return classPathTlds;
}
+ /**
+ * Sets the class-loader resource paths of the TLD-s that aren't inside the locations covered by
+ * {@link #setMetaInfTldSources(List)}, yet you want them to be discovered. They will be loaded with the class
+ * loader provided by the servlet container.
+ *
+ * <p>
+ * This is usually set via the init-params of {@link FreemarkerServlet}.
+ *
+ * @param classpathTlds
+ * List of {@code String}-s, maybe {@code null}. Each item is a resource path, like
+ * {@code "/META-INF/my.tld"}. (Relative resource paths will be interpreted as root-relative.)
+ *
+ * @see #setMetaInfTldSources(List)
+ */
public void setClassPathTlds(List<String> classPathTlds) {
this.classPathTlds = classPathTlds;
}
[17/17] incubator-freemarker git commit: FREEMARKER-55: Repeating
things less in JavaDocs (for easier maintenance)
Posted by dd...@apache.org.
FREEMARKER-55: Repeating things less in JavaDocs (for easier maintenance)
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/52d11425
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/52d11425
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/52d11425
Branch: refs/heads/3
Commit: 52d1142570aa2448e1dabb5c898b503f188dcb1e
Parents: 32a2961
Author: ddekany <dd...@apache.org>
Authored: Thu Jul 6 10:18:26 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Thu Jul 6 10:18:26 2017 +0200
----------------------------------------------------------------------
.../freemarker/servlet/jsp/TaglibFactory.java | 21 ++++----------------
1 file changed, 4 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/52d11425/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 94b151c..ef5d9df 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -2102,24 +2102,21 @@ public class TaglibFactory implements TemplateHashModel {
}
/**
- * Get ServletContext instance.
- * @return ServletContext instance
+ * Get {@link ServletContext} that the {@link TaglibFactory} will belong to.
*/
public ServletContext getServletContext() {
return servletContext;
}
/**
- * Get ObjectWrapper to be used in model building.
- * @return ObjectWrapper to be used in model building
+ * Gets the {@link ObjectWrapper} to be used in model building.
*/
public ObjectWrapper getObjectWrapper() {
return objectWrapper;
}
/**
- * Get the list of places where to look for {@code META-INF/**}{@code /*.tld} files.
- * @return the list of places where to look for {@code META-INF/**}{@code /*.tld} files
+ * Getter pair of {@link #setClasspathTlds(List)}
*/
public List<MetaInfTldSource> getMetaInfTldSources() {
return (metaInfTldSources != null) ? metaInfTldSources : Collections.<MetaInfTldSource> emptyList();
@@ -2148,10 +2145,6 @@ public class TaglibFactory implements TemplateHashModel {
/**
* Fluent API equivalent of {@link #setMetaInfTldSources(List)}.
- * @param metaInfTldSources
- * The list of {@link MetaInfTldSource} subclass instances. Their order matters if multiple TLD-s define
- * a taglib with the same {@code taglib-uri}. In that case, the one found by the earlier
- * {@link MetaInfTldSource} wins.
* @return this builder
*/
public Builder metaInfTldSources(List<? extends MetaInfTldSource> metaInfTldSources) {
@@ -2160,10 +2153,7 @@ public class TaglibFactory implements TemplateHashModel {
}
/**
- * Get the class-loader resource paths of the TLD-s that aren't inside the locations covered by
- * {@link #setMetaInfTldSources(List)}, yet you want them to be discovered.
- * @return the class-loader resource paths of the TLD-s that aren't inside the locations covered by
- * {@link #setMetaInfTldSources(List)}, yet you want them to be discovered
+ * Getter pair of {@link #setClasspathTlds(List)}.
*/
public List<String> getClasspathTlds() {
return (classpathTlds != null) ? classpathTlds : Collections.<String> emptyList();
@@ -2190,9 +2180,6 @@ public class TaglibFactory implements TemplateHashModel {
/**
* Fluent API equivalent of {@link #setClasspathTlds(List)}.
- * @param classpathTlds
- * List of {@code String}-s, maybe {@code null}. Each item is a resource path, like
- * {@code "/META-INF/my.tld"}. (Relative resource paths will be interpreted as root-relative.)
* @return this builder
*/
public Builder classpathTlds(List<String> classpathTlds) {
[05/17] incubator-freemarker git commit: FREEMARKER-55: TaglibFactory
must be created only by builder.
Posted by dd...@apache.org.
FREEMARKER-55: TaglibFactory must be created only by builder.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/78071707
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/78071707
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/78071707
Branch: refs/heads/3
Commit: 78071707b4ed13e1bcec4dc16fb55ffdf62e12e0
Parents: c0bb490
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 16:45:44 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 16:45:44 2017 -0400
----------------------------------------------------------------------
.../freemarker/servlet/FreemarkerServlet.java | 4 +-
.../freemarker/servlet/jsp/TaglibFactory.java | 118 +++++++++----------
2 files changed, 61 insertions(+), 61 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/78071707/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index aad3d55..da0435d 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -636,7 +636,7 @@ public class FreemarkerServlet extends HttpServlet {
} else if (name.equals(INIT_PARAM_EXCEPTION_ON_MISSING_TEMPLATE)) {
exceptionOnMissingTemplate = _StringUtil.getYesNo(value);
} else if (name.equals(INIT_PARAM_META_INF_TLD_LOCATIONS)) {
- metaInfTldSources = TaglibFactory.Builder.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(value));
+ metaInfTldSources = TaglibFactory.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(value));
} else if (name.equals(INIT_PARAM_CLASSPATH_TLDS)) {
List newClasspathTlds = new ArrayList();
if (classpathTlds != null) {
@@ -1000,7 +1000,7 @@ public class FreemarkerServlet extends HttpServlet {
try {
final String prop = _SecurityUtil.getSystemProperty(SYSTEM_PROPERTY_META_INF_TLD_SOURCES, null);
metaInfTldSourcesFromSysProp = (List<MetaInfTldSource>) ((prop != null)
- ? TaglibFactory.Builder.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(prop))
+ ? TaglibFactory.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(prop))
: Collections.emptyList());
} catch (ParseException e) {
throw new TemplateModelException(
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/78071707/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 4679e27..2026f8b 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -137,6 +137,59 @@ public class TaglibFactory implements TemplateHashModel {
private List/*<String>*/ failedTldLocations = new ArrayList();
private int nextTldLocationLookupPhase = 0;
+ public static MetaInfTldSource parseMetaInfTldLocation(String value) throws ParseException {
+ MetaInfTldSource metaInfTldSource;
+
+ if (value.equals(FreemarkerServlet.META_INF_TLD_LOCATION_WEB_INF_PER_LIB_JARS)) {
+ metaInfTldSource = WebInfPerLibJarMetaInfTldSource.INSTANCE;
+ } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH)) {
+ String itemRightSide = value.substring(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH.length())
+ .trim();
+
+ if (itemRightSide.length() == 0) {
+ metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(".*", Pattern.DOTALL));
+ } else if (itemRightSide.startsWith(":")) {
+ final String regexpStr = itemRightSide.substring(1).trim();
+ if (regexpStr.length() == 0) {
+ throw new ParseException("Empty regular expression after \""
+ + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH + ":\"", -1);
+ }
+ metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(regexpStr));
+ } else {
+ throw new ParseException("Invalid \"" + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH
+ + "\" value syntax: " + value, -1);
+ }
+ } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLEAR)) {
+ metaInfTldSource = ClearMetaInfTldSource.INSTANCE;
+ } else {
+ throw new ParseException("Item has no recognized source type prefix: " + value, -1);
+ }
+
+ return metaInfTldSource;
+ }
+
+ public static List<MetaInfTldSource> parseMetaInfTldLocations(List<String> values) throws ParseException {
+ List<MetaInfTldSource> metaInfTldSources = null;
+
+ if (values != null) {
+ for (String value : values) {
+ final MetaInfTldSource metaInfTldSource = parseMetaInfTldLocation(value);
+
+ if (metaInfTldSources == null) {
+ metaInfTldSources = new ArrayList();
+ }
+
+ metaInfTldSources.add(metaInfTldSource);
+ }
+ }
+
+ if (metaInfTldSources == null) {
+ metaInfTldSources = Collections.emptyList();
+ }
+
+ return metaInfTldSources;
+ }
+
/**
/**
* Creates a new JSP taglib factory that will be used to load JSP tag libraries and functions for the web
@@ -149,8 +202,11 @@ public class TaglibFactory implements TemplateHashModel {
* @param servletContext
* The servlet context whose JSP tag libraries this factory will load.
*/
- public TaglibFactory(ServletContext servletContext) {
- this.servletContext = servletContext;
+ private TaglibFactory(Builder builder) {
+ servletContext = builder.getServletContext();
+ objectWrapper = builder.getObjectWrapper();
+ metaInfTldSources = builder.getMetaInfTldSources();
+ classpathTlds = builder.getClassPathTlds();
}
/**
@@ -2101,65 +2157,9 @@ public class TaglibFactory implements TemplateHashModel {
}
public TaglibFactory build() throws ConfigurationException {
- TaglibFactory taglibFactory = new TaglibFactory(servletContext);
- taglibFactory.setObjectWrapper(objectWrapper);
- taglibFactory.setMetaInfTldSources(metaInfTldSources);
- taglibFactory.setClasspathTlds(classPathTlds);
+ TaglibFactory taglibFactory = new TaglibFactory(this);
return taglibFactory;
}
-
- public static MetaInfTldSource parseMetaInfTldLocation(String value) throws ParseException {
- MetaInfTldSource metaInfTldSource;
-
- if (value.equals(FreemarkerServlet.META_INF_TLD_LOCATION_WEB_INF_PER_LIB_JARS)) {
- metaInfTldSource = WebInfPerLibJarMetaInfTldSource.INSTANCE;
- } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH)) {
- String itemRightSide = value.substring(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH.length())
- .trim();
-
- if (itemRightSide.length() == 0) {
- metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(".*", Pattern.DOTALL));
- } else if (itemRightSide.startsWith(":")) {
- final String regexpStr = itemRightSide.substring(1).trim();
- if (regexpStr.length() == 0) {
- throw new ParseException("Empty regular expression after \""
- + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH + ":\"", -1);
- }
- metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(regexpStr));
- } else {
- throw new ParseException("Invalid \"" + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH
- + "\" value syntax: " + value, -1);
- }
- } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLEAR)) {
- metaInfTldSource = ClearMetaInfTldSource.INSTANCE;
- } else {
- throw new ParseException("Item has no recognized source type prefix: " + value, -1);
- }
-
- return metaInfTldSource;
- }
-
- public static List<MetaInfTldSource> parseMetaInfTldLocations(List<String> values) throws ParseException {
- List<MetaInfTldSource> metaInfTldSources = null;
-
- if (values != null) {
- for (String value : values) {
- final MetaInfTldSource metaInfTldSource = parseMetaInfTldLocation(value);
-
- if (metaInfTldSources == null) {
- metaInfTldSources = new ArrayList();
- }
-
- metaInfTldSources.add(metaInfTldSource);
- }
- }
-
- if (metaInfTldSources == null) {
- metaInfTldSources = Collections.emptyList();
- }
-
- return metaInfTldSources;
- }
}
}
[03/17] incubator-freemarker git commit: FREEMARKER-55: moving
builder into TaglibFactory
Posted by dd...@apache.org.
FREEMARKER-55: moving builder into TaglibFactory
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/dcbebe9b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/dcbebe9b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/dcbebe9b
Branch: refs/heads/3
Commit: dcbebe9b19e85dff067a46c4394e107916fb7845
Parents: 3c91ecb
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 16:30:09 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 16:30:09 2017 -0400
----------------------------------------------------------------------
.../freemarker/servlet/FreemarkerServlet.java | 7 +-
.../freemarker/servlet/jsp/TaglibFactory.java | 132 +++++++++++++++
.../servlet/jsp/TaglibFactoryBuilder.java | 167 -------------------
.../spring/web/view/FreemarkerViewResolver.java | 3 +-
.../spring/web/view/FreemarkerViewTest.java | 3 +-
5 files changed, 137 insertions(+), 175 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/dcbebe9b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index 9b5008f..c56f6d7 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -65,7 +65,6 @@ import org.apache.freemarker.core.util._SecurityUtil;
import org.apache.freemarker.core.util._StringUtil;
import org.apache.freemarker.servlet.jsp.TaglibFactory;
import org.apache.freemarker.servlet.jsp.TaglibFactory.MetaInfTldSource;
-import org.apache.freemarker.servlet.jsp.TaglibFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -637,7 +636,7 @@ public class FreemarkerServlet extends HttpServlet {
} else if (name.equals(INIT_PARAM_EXCEPTION_ON_MISSING_TEMPLATE)) {
exceptionOnMissingTemplate = _StringUtil.getYesNo(value);
} else if (name.equals(INIT_PARAM_META_INF_TLD_LOCATIONS)) {
- metaInfTldSources = TaglibFactoryBuilder.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(value));
+ metaInfTldSources = TaglibFactory.Builder.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(value));
} else if (name.equals(INIT_PARAM_CLASSPATH_TLDS)) {
List newClasspathTlds = new ArrayList();
if (classpathTlds != null) {
@@ -1001,7 +1000,7 @@ public class FreemarkerServlet extends HttpServlet {
try {
final String prop = _SecurityUtil.getSystemProperty(SYSTEM_PROPERTY_META_INF_TLD_SOURCES, null);
metaInfTldSourcesFromSysProp = (List<MetaInfTldSource>) ((prop != null)
- ? TaglibFactoryBuilder.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(prop))
+ ? TaglibFactory.Builder.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(prop))
: Collections.emptyList());
} catch (ParseException e) {
throw new TemplateModelException(
@@ -1028,7 +1027,7 @@ public class FreemarkerServlet extends HttpServlet {
"Failed to parse system property \"" + SYSTEM_PROPERTY_CLASSPATH_TLDS + "\"", e);
}
- return new TaglibFactoryBuilder(servletContext, objectWrapper)
+ return new TaglibFactory.Builder(servletContext, objectWrapper)
.addAllMetaInfTldSources(metaInfTldSources)
.addAllMetaInfTldSources(metaInfTldSourcesFromSysProp)
.addAllJettyMetaInfTldJarPatterns(jettyTaglibJarPatterns)
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/dcbebe9b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 0fbba1b..9da15e4 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -38,6 +38,7 @@ import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.Charset;
+import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
@@ -61,6 +62,7 @@ import javax.servlet.jsp.tagext.Tag;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
+import org.apache.freemarker.core.ConfigurationException;
import org.apache.freemarker.core.Environment;
import org.apache.freemarker.core.model.ObjectWrapper;
import org.apache.freemarker.core.model.TemplateHashModel;
@@ -70,6 +72,7 @@ import org.apache.freemarker.core.model.TemplateModelException;
import org.apache.freemarker.core.model.TemplateTransformModel;
import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
import org.apache.freemarker.core.util.BugException;
+import org.apache.freemarker.core.util.CommonBuilder;
import org.apache.freemarker.core.util._ClassUtil;
import org.apache.freemarker.core.util._NullArgumentException;
import org.apache.freemarker.core.util._StringUtil;
@@ -1990,4 +1993,133 @@ public class TaglibFactory implements TemplateHashModel {
}
+ public static class Builder implements CommonBuilder<TaglibFactory> {
+
+ /**
+ * Servlet context.
+ */
+ private final ServletContext servletContext;
+
+ /**
+ * Object wrapper to be used in model building.
+ */
+ private final ObjectWrapper objectWrapper;
+
+ /**
+ * TLD locations to look for when finding available JSP tag libraries.
+ */
+ private List<MetaInfTldSource> metaInfTldSources = new ArrayList<>();
+
+ /**
+ * TLD classpath locations to look for when finding available JSP tag libraries.
+ */
+ private List<String> classPathTlds = new ArrayList<>();
+
+ public Builder(ServletContext servletContext, ObjectWrapper objectWrapper) {
+ this.servletContext = servletContext;
+ this.objectWrapper = objectWrapper;
+ }
+
+ public Builder addMetaInfTldSource(MetaInfTldSource metaInfTldSource) {
+ metaInfTldSources.add(metaInfTldSource);
+ return this;
+ }
+
+ public Builder addAllMetaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
+ this.metaInfTldSources.addAll(metaInfTldSources);
+ return this;
+ }
+
+ public Builder addMetaInfTldLocation(String metaInfTldLocation) throws ParseException {
+ return addMetaInfTldSource(parseMetaInfTldLocation(metaInfTldLocation));
+ }
+
+ public Builder addMetaInfTldLocations(List<String> metaInfTldLocations) throws ParseException {
+ return addAllMetaInfTldSources(parseMetaInfTldLocations(metaInfTldLocations));
+ }
+
+ public Builder addJettyMetaInfTldJarPattern(Pattern pattern) {
+ return addMetaInfTldSource(new ClasspathMetaInfTldSource(pattern));
+ }
+
+ public Builder addAllJettyMetaInfTldJarPatterns(List<Pattern> patterns) {
+ for (Pattern pattern : patterns) {
+ addJettyMetaInfTldJarPattern(pattern);
+ }
+
+ return this;
+ }
+
+ public Builder addClasspathTld(String classpathTld) {
+ classPathTlds.add(classpathTld);
+ return this;
+ }
+
+ public Builder addAllClasspathTlds(List<String> classpathTlds) {
+ classPathTlds.addAll(classpathTlds);
+ return this;
+ }
+
+ public TaglibFactory build() throws ConfigurationException {
+ TaglibFactory taglibFactory = new TaglibFactory(servletContext);
+ taglibFactory.setObjectWrapper(objectWrapper);
+ taglibFactory.setMetaInfTldSources(metaInfTldSources);
+ taglibFactory.setClasspathTlds(classPathTlds);
+ return taglibFactory;
+ }
+
+ public static MetaInfTldSource parseMetaInfTldLocation(String value) throws ParseException {
+ MetaInfTldSource metaInfTldSource;
+
+ if (value.equals(FreemarkerServlet.META_INF_TLD_LOCATION_WEB_INF_PER_LIB_JARS)) {
+ metaInfTldSource = WebInfPerLibJarMetaInfTldSource.INSTANCE;
+ } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH)) {
+ String itemRightSide = value.substring(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH.length())
+ .trim();
+
+ if (itemRightSide.length() == 0) {
+ metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(".*", Pattern.DOTALL));
+ } else if (itemRightSide.startsWith(":")) {
+ final String regexpStr = itemRightSide.substring(1).trim();
+ if (regexpStr.length() == 0) {
+ throw new ParseException("Empty regular expression after \""
+ + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH + ":\"", -1);
+ }
+ metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(regexpStr));
+ } else {
+ throw new ParseException("Invalid \"" + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH
+ + "\" value syntax: " + value, -1);
+ }
+ } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLEAR)) {
+ metaInfTldSource = ClearMetaInfTldSource.INSTANCE;
+ } else {
+ throw new ParseException("Item has no recognized source type prefix: " + value, -1);
+ }
+
+ return metaInfTldSource;
+ }
+
+ public static List<MetaInfTldSource> parseMetaInfTldLocations(List<String> values) throws ParseException {
+ List<MetaInfTldSource> metaInfTldSources = null;
+
+ if (values != null) {
+ for (String value : values) {
+ final MetaInfTldSource metaInfTldSource = parseMetaInfTldLocation(value);
+
+ if (metaInfTldSources == null) {
+ metaInfTldSources = new ArrayList();
+ }
+
+ metaInfTldSources.add(metaInfTldSource);
+ }
+ }
+
+ if (metaInfTldSources == null) {
+ metaInfTldSources = Collections.emptyList();
+ }
+
+ return metaInfTldSources;
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/dcbebe9b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactoryBuilder.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactoryBuilder.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactoryBuilder.java
deleted file mode 100644
index 34daec3..0000000
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactoryBuilder.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * 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.freemarker.servlet.jsp;
-
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import javax.servlet.ServletContext;
-
-import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.servlet.FreemarkerServlet;
-import org.apache.freemarker.servlet.jsp.TaglibFactory.ClasspathMetaInfTldSource;
-import org.apache.freemarker.servlet.jsp.TaglibFactory.ClearMetaInfTldSource;
-import org.apache.freemarker.servlet.jsp.TaglibFactory.MetaInfTldSource;
-import org.apache.freemarker.servlet.jsp.TaglibFactory.WebInfPerLibJarMetaInfTldSource;
-
-/**
- * Builder for {@link TaglibFactory}.
- */
-public class TaglibFactoryBuilder {
-
- /**
- * Servlet context.
- */
- private final ServletContext servletContext;
-
- /**
- * Object wrapper to be used in model building.
- */
- private final ObjectWrapper objectWrapper;
-
- /**
- * TLD locations to look for when finding available JSP tag libraries.
- */
- private List<MetaInfTldSource> metaInfTldSources = new ArrayList<>();
-
- /**
- * TLD classpath locations to look for when finding available JSP tag libraries.
- */
- private List<String> classPathTlds = new ArrayList<>();
-
- public TaglibFactoryBuilder(ServletContext servletContext, ObjectWrapper objectWrapper) {
- this.servletContext = servletContext;
- this.objectWrapper = objectWrapper;
- }
-
- public TaglibFactoryBuilder addMetaInfTldSource(MetaInfTldSource metaInfTldSource) {
- metaInfTldSources.add(metaInfTldSource);
- return this;
- }
-
- public TaglibFactoryBuilder addAllMetaInfTldSources(List<MetaInfTldSource> metaInfTldSources) {
- this.metaInfTldSources.addAll(metaInfTldSources);
- return this;
- }
-
- public TaglibFactoryBuilder addMetaInfTldLocation(String metaInfTldLocation) throws ParseException {
- return addMetaInfTldSource(parseMetaInfTldLocation(metaInfTldLocation));
- }
-
- public TaglibFactoryBuilder addMetaInfTldLocations(List<String> metaInfTldLocations) throws ParseException {
- return addAllMetaInfTldSources(parseMetaInfTldLocations(metaInfTldLocations));
- }
-
- public TaglibFactoryBuilder addJettyMetaInfTldJarPattern(Pattern pattern) {
- return addMetaInfTldSource(new ClasspathMetaInfTldSource(pattern));
- }
-
- public TaglibFactoryBuilder addAllJettyMetaInfTldJarPatterns(List<Pattern> patterns) {
- for (Pattern pattern : patterns) {
- addJettyMetaInfTldJarPattern(pattern);
- }
-
- return this;
- }
-
- public TaglibFactoryBuilder addClasspathTld(String classpathTld) {
- classPathTlds.add(classpathTld);
- return this;
- }
-
- public TaglibFactoryBuilder addAllClasspathTlds(List<String> classpathTlds) {
- classPathTlds.addAll(classpathTlds);
- return this;
- }
-
- public TaglibFactory build() {
- TaglibFactory taglibFactory = new TaglibFactory(servletContext);
- taglibFactory.setObjectWrapper(objectWrapper);
- taglibFactory.setMetaInfTldSources(metaInfTldSources);
- taglibFactory.setClasspathTlds(classPathTlds);
- return taglibFactory;
- }
-
- public static MetaInfTldSource parseMetaInfTldLocation(String value) throws ParseException {
- MetaInfTldSource metaInfTldSource;
-
- if (value.equals(FreemarkerServlet.META_INF_TLD_LOCATION_WEB_INF_PER_LIB_JARS)) {
- metaInfTldSource = WebInfPerLibJarMetaInfTldSource.INSTANCE;
- } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH)) {
- String itemRightSide = value.substring(FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH.length())
- .trim();
-
- if (itemRightSide.length() == 0) {
- metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(".*", Pattern.DOTALL));
- } else if (itemRightSide.startsWith(":")) {
- final String regexpStr = itemRightSide.substring(1).trim();
- if (regexpStr.length() == 0) {
- throw new ParseException("Empty regular expression after \""
- + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH + ":\"", -1);
- }
- metaInfTldSource = new ClasspathMetaInfTldSource(Pattern.compile(regexpStr));
- } else {
- throw new ParseException("Invalid \"" + FreemarkerServlet.META_INF_TLD_LOCATION_CLASSPATH
- + "\" value syntax: " + value, -1);
- }
- } else if (value.startsWith(FreemarkerServlet.META_INF_TLD_LOCATION_CLEAR)) {
- metaInfTldSource = ClearMetaInfTldSource.INSTANCE;
- } else {
- throw new ParseException("Item has no recognized source type prefix: " + value, -1);
- }
-
- return metaInfTldSource;
- }
-
- public static List<MetaInfTldSource> parseMetaInfTldLocations(List<String> values) throws ParseException {
- List<MetaInfTldSource> metaInfTldSources = null;
-
- if (values != null) {
- for (String value : values) {
- final MetaInfTldSource metaInfTldSource = parseMetaInfTldLocation(value);
-
- if (metaInfTldSources == null) {
- metaInfTldSources = new ArrayList();
- }
-
- metaInfTldSources.add(metaInfTldSource);
- }
- }
-
- if (metaInfTldSources == null) {
- metaInfTldSources = Collections.emptyList();
- }
-
- return metaInfTldSources;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/dcbebe9b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
index c3f87a9..7969b56 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/web/view/FreemarkerViewResolver.java
@@ -26,7 +26,6 @@ import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
import org.apache.freemarker.servlet.ServletContextHashModel;
import org.apache.freemarker.servlet.jsp.TaglibFactory;
-import org.apache.freemarker.servlet.jsp.TaglibFactoryBuilder;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.servlet.view.AbstractTemplateViewResolver;
import org.springframework.web.servlet.view.AbstractUrlBasedView;
@@ -128,7 +127,7 @@ public class FreemarkerViewResolver extends AbstractTemplateViewResolver impleme
servletContextModel = new ServletContextHashModel(pageContextServlet, objectWrapper);
- taglibFactory = new TaglibFactoryBuilder(getServletContext(), objectWrapper).build();
+ taglibFactory = new TaglibFactory.Builder(getServletContext(), objectWrapper).build();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/dcbebe9b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
index 093472c..1ed2831 100644
--- a/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/web/view/FreemarkerViewTest.java
@@ -32,7 +32,6 @@ import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
import org.apache.freemarker.servlet.ServletContextHashModel;
import org.apache.freemarker.servlet.jsp.TaglibFactory;
-import org.apache.freemarker.servlet.jsp.TaglibFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
@@ -73,7 +72,7 @@ public class FreemarkerViewTest {
pageContextServlet = new PageContextServlet();
pageContextServlet.init(new PageContextServletConfig(servletContext, PageContextServlet.class.getSimpleName()));
- taglibFactory = new TaglibFactoryBuilder(servletContext, objectWrapper).build();
+ taglibFactory = new TaglibFactory.Builder(servletContext, objectWrapper).build();
viewResolver = new FreemarkerViewResolver();
viewResolver.setServletContext(servletContext);
[09/17] incubator-freemarker git commit: FREEMARKER-55: allow
building only once.
Posted by dd...@apache.org.
FREEMARKER-55: allow building only once.
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/e12792ea
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/e12792ea
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/e12792ea
Branch: refs/heads/3
Commit: e12792ea4e845baf739191ec07b34d60e2653aa9
Parents: 2a8d761
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 18:49:32 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 18:49:32 2017 -0400
----------------------------------------------------------------------
.../java/org/apache/freemarker/servlet/jsp/TaglibFactory.java | 6 ++++++
1 file changed, 6 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/e12792ea/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 556c632..f4fea3b 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -2039,6 +2039,8 @@ public class TaglibFactory implements TemplateHashModel {
*/
private List<String> classPathTlds = new ArrayList<>();
+ private boolean alreadyBuilt;
+
public Builder() {
}
@@ -2161,7 +2163,11 @@ public class TaglibFactory implements TemplateHashModel {
}
public TaglibFactory build() throws ConfigurationException {
+ if (alreadyBuilt) {
+ throw new IllegalStateException("build() can only be executed once.");
+ }
TaglibFactory taglibFactory = new TaglibFactory(this);
+ alreadyBuilt = true;
return taglibFactory;
}
}
[08/17] incubator-freemarker git commit: FREEMARKER-55: cleanups
(while loop and input streams)
Posted by dd...@apache.org.
FREEMARKER-55: cleanups (while loop and input streams)
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/2a8d7617
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/2a8d7617
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/2a8d7617
Branch: refs/heads/3
Commit: 2a8d76179ba783de5d81e24fa2ec1ec7ad001e39
Parents: 196158b
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 18:45:50 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 18:45:50 2017 -0400
----------------------------------------------------------------------
.../freemarker/servlet/jsp/TaglibFactory.java | 57 +++++++++-----------
1 file changed, 26 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2a8d7617/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index e1df54f..556c632 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -353,13 +353,9 @@ public class TaglibFactory implements TemplateHashModel {
private TldLocation getExplicitlyMappedTldLocation(final String uri) throws SAXException, IOException,
TaglibGettingException {
- while (true) {
- final TldLocation tldLocation = (TldLocation) tldLocations.get(uri);
-
- if (tldLocation != null) {
- return tldLocation;
- }
+ TldLocation tldLocation;
+ for (tldLocation = tldLocations.get(uri); tldLocation == null; tldLocation = tldLocations.get(uri)) {
switch (nextTldLocationLookupPhase) {
case 0:
// Not in JSP spec.
@@ -385,6 +381,8 @@ public class TaglibFactory implements TemplateHashModel {
nextTldLocationLookupPhase++;
}
+
+ return tldLocation;
}
private void addTldLocationsFromWebXml() throws SAXException, IOException {
@@ -595,11 +593,8 @@ public class TaglibFactory implements TemplateHashModel {
ZipInputStream zipIn = new ZipInputStream(in);
try {
- while (true) {
- ZipEntry curEntry = zipIn.getNextEntry();
- if (curEntry == null) break;
-
- String curEntryPath = normalizeJarEntryPath(curEntry.getName(), false);
+ for (ZipEntry entry = zipIn.getNextEntry(); entry != null; entry = zipIn.getNextEntry()) {
+ String curEntryPath = normalizeJarEntryPath(entry.getName(), false);
if (curEntryPath.startsWith(metaInfEntryPath) && curEntryPath.endsWith(".tld")) {
addTldLocationFromTld(zipIn,
new ServletContextJarEntryTldLocation(jarResourcePath, curEntryPath));
@@ -685,16 +680,16 @@ public class TaglibFactory implements TemplateHashModel {
}
final InputStream in = new URL(rawJarContentUrlEF).openStream();
+ if (in == null) {
+ throw new IOException("TLD resource in a jar resource not found: " + rawJarContentUrlEF);
+ }
try {
ZipInputStream zipIn = new ZipInputStream(in);
try {
- while (true) {
- ZipEntry curEntry = zipIn.getNextEntry();
- if (curEntry == null) break;
-
- String curEntryPath = normalizeJarEntryPath(curEntry.getName(), false);
+ for (ZipEntry entry = zipIn.getNextEntry(); entry != null; entry = zipIn.getNextEntry()) {
+ String curEntryPath = normalizeJarEntryPath(entry.getName(), false);
if (curEntryPath.startsWith(baseEntryPath) && curEntryPath.endsWith(".tld")) {
final String curEntryBaseRelativePath = curEntryPath.substring(baseEntryPath.length());
final URL tldUrl = createJarEntryUrl(jarBaseEntryUrl, curEntryBaseRelativePath);
@@ -749,12 +744,15 @@ public class TaglibFactory implements TemplateHashModel {
* Adds the TLD location mapping from the TLD itself.
*/
private void addTldLocationFromTld(TldLocation tldLocation) throws IOException, SAXException {
- InputStream in = tldLocation.getInputStream();
+ InputStream in = null;
try {
+ in = tldLocation.getInputStream();
addTldLocationFromTld(in, tldLocation);
} finally {
- in.close();
+ if (in != null) {
+ in.close();
+ }
}
}
@@ -819,12 +817,8 @@ public class TaglibFactory implements TemplateHashModel {
private static void collectMetaInfUrlsFromClassLoader(ClassLoader cl, Set<URLWithExternalForm> metainfDirUrls)
throws IOException {
- Enumeration<URL> urls = cl.getResources(META_INF_REL_PATH);
-
- if (urls != null) {
- while (urls.hasMoreElements()) {
- metainfDirUrls.add(new URLWithExternalForm((URL) urls.nextElement()));
- }
+ for (Enumeration<URL> urls = cl.getResources(META_INF_REL_PATH); urls.hasMoreElements(); ) {
+ metainfDirUrls.add(new URLWithExternalForm(urls.nextElement()));
}
}
@@ -1102,15 +1096,12 @@ public class TaglibFactory implements TemplateHashModel {
}
private static boolean isDescendantOfOrSameAs(ClassLoader descendant, ClassLoader parent) {
- while (true) {
- if (descendant == null) {
- return false;
- }
+ for (; descendant != null; descendant = descendant.getParent()) {
if (descendant == parent) {
return true;
}
- descendant = descendant.getParent();
}
+ return false;
}
/**
@@ -1195,6 +1186,7 @@ public class TaglibFactory implements TemplateHashModel {
}
private interface InputStreamFactory {
+
InputStream getInputStream();
}
@@ -1487,11 +1479,14 @@ public class TaglibFactory implements TemplateHashModel {
ServletContext ctx, TldLocation tldLocation, ObjectWrapper objectWrapper) throws IOException, SAXException {
final TldParserForTaglibBuilding tldParser = new TldParserForTaglibBuilding(objectWrapper);
- InputStream in = tldLocation.getInputStream();
+ InputStream in = null;
try {
+ in = tldLocation.getInputStream();
parseXml(in, tldLocation.getXmlSystemId(), tldParser);
} finally {
- in.close();
+ if (in != null) {
+ in.close();
+ }
}
EventForwarding eventForwarding = EventForwarding.getInstance(ctx);
[16/17] incubator-freemarker git commit: FREEMARKER-55: Added getters
to TaglibFactory
Posted by dd...@apache.org.
FREEMARKER-55: Added getters to TaglibFactory
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/32a29618
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/32a29618
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/32a29618
Branch: refs/heads/3
Commit: 32a29618a3adfc2d4b865a2d07e717dc00c5bf09
Parents: a958149
Author: ddekany <dd...@apache.org>
Authored: Thu Jul 6 10:16:42 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Thu Jul 6 10:16:42 2017 +0200
----------------------------------------------------------------------
.../freemarker/servlet/jsp/TaglibFactory.java | 28 ++++++++++++++++++++
1 file changed, 28 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/32a29618/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 297fef2..94b151c 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -360,6 +360,34 @@ public class TaglibFactory implements TemplateHashModel {
return false;
}
+ /**
+ * See {@link Builder#getMetaInfTldSources()}
+ */
+ public ServletContext getServletContext() {
+ return servletContext;
+ }
+
+ /**
+ * See {@link Builder#getObjectWrapper()}
+ */
+ public ObjectWrapper getObjectWrapper() {
+ return objectWrapper;
+ }
+
+ /**
+ * See {@link Builder#getMetaInfTldSources()}
+ */
+ public List<? extends MetaInfTldSource> getMetaInfTldSources() {
+ return metaInfTldSources;
+ }
+
+ /**
+ * See {@link Builder#getClasspathTlds()}
+ */
+ public List<String> getClasspathTlds() {
+ return classpathTlds;
+ }
+
private TldLocation getExplicitlyMappedTldLocation(final String uri) throws SAXException, IOException,
TaglibGettingException {
TldLocation tldLocation;
[15/17] incubator-freemarker git commit: FREEMARKER-55: (Return a
specific List type as possible)
Posted by dd...@apache.org.
FREEMARKER-55: (Return a specific List type as possible)
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/a9581498
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/a9581498
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/a9581498
Branch: refs/heads/3
Commit: a9581498bdce8d933093669f7b0fc3b46bcf3c6f
Parents: cc6c469
Author: ddekany <dd...@apache.org>
Authored: Thu Jul 6 10:12:00 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Thu Jul 6 10:12:00 2017 +0200
----------------------------------------------------------------------
.../java/org/apache/freemarker/servlet/jsp/TaglibFactory.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/a9581498/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 386b34e..297fef2 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -2049,7 +2049,7 @@ public class TaglibFactory implements TemplateHashModel {
/**
* TLD locations to look for when finding available JSP tag libraries.
*/
- private List<? extends MetaInfTldSource> metaInfTldSources;
+ private List<MetaInfTldSource> metaInfTldSources;
/**
* TLD classpath locations to look for when finding available JSP tag libraries.
@@ -2093,7 +2093,7 @@ public class TaglibFactory implements TemplateHashModel {
* Get the list of places where to look for {@code META-INF/**}{@code /*.tld} files.
* @return the list of places where to look for {@code META-INF/**}{@code /*.tld} files
*/
- public List<? extends MetaInfTldSource> getMetaInfTldSources() {
+ public List<MetaInfTldSource> getMetaInfTldSources() {
return (metaInfTldSources != null) ? metaInfTldSources : Collections.<MetaInfTldSource> emptyList();
}
[02/17] incubator-freemarker git commit: FREEMARKER-55: use servlet
api 3.0, jsp-api 2.2, jsp-el 2.2 and spring 4.0.x
Posted by dd...@apache.org.
FREEMARKER-55: use servlet api 3.0, jsp-api 2.2, jsp-el 2.2 and spring 4.0.x
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/3c91ecb6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/3c91ecb6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/3c91ecb6
Branch: refs/heads/3
Commit: 3c91ecb65ac12973c05421ec6a265020cfccdc5b
Parents: 519680a
Author: Woonsan Ko <wo...@apache.org>
Authored: Wed Jul 5 14:11:18 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Wed Jul 5 14:11:18 2017 -0400
----------------------------------------------------------------------
freemarker-servlet/build.gradle | 9 +++++++--
freemarker-spring/build.gradle | 9 ++++++---
2 files changed, 13 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/3c91ecb6/freemarker-servlet/build.gradle
----------------------------------------------------------------------
diff --git a/freemarker-servlet/build.gradle b/freemarker-servlet/build.gradle
index 4e3bd2f..2f28100 100644
--- a/freemarker-servlet/build.gradle
+++ b/freemarker-servlet/build.gradle
@@ -28,8 +28,13 @@ inAggregateJavadoc = true
dependencies {
compile project(":freemarker-core")
- compileOnly "javax.servlet.jsp:jsp-api:2.1"
- compileOnly "javax.servlet:servlet-api:2.5"
+ def geronimoServletSpec3Version = "1.0"
+ def geronimoJspSpec22Version = "1.2"
+ def geronimoELSpec22Version = "1.0.4"
+
+ compileOnly "org.apache.geronimo.specs:geronimo-servlet_3.0_spec:${geronimoServletSpec3Version}"
+ compileOnly "org.apache.geronimo.specs:geronimo-jsp_2.2_spec:${geronimoJspSpec22Version}"
+ compileOnly "org.apache.geronimo.specs:geronimo-el_2.2_spec:${geronimoELSpec22Version}"
// ------------------------------------------------------------------------
// For tests
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/3c91ecb6/freemarker-spring/build.gradle
----------------------------------------------------------------------
diff --git a/freemarker-spring/build.gradle b/freemarker-spring/build.gradle
index dce28d9..328e883 100644
--- a/freemarker-spring/build.gradle
+++ b/freemarker-spring/build.gradle
@@ -30,7 +30,10 @@ dependencies {
compile project(":freemarker-servlet")
def geronimoServletSpec3Version = "1.0"
- def springVersion = "4.3.9.RELEASE"
+ def geronimoJspSpec22Version = "1.2"
+ def geronimoELSpec22Version = "1.0.4"
+
+ def springVersion = "4.0.9.RELEASE"
compileOnly "org.apache.geronimo.specs:geronimo-servlet_3.0_spec:${geronimoServletSpec3Version}"
@@ -76,9 +79,9 @@ dependencies {
exclude group: "commons-logging", module: "commons-logging"
}
- testCompile "javax.servlet.jsp:jsp-api:2.1"
+ testCompile "org.apache.geronimo.specs:geronimo-jsp_2.2_spec:${geronimoJspSpec22Version}"
+ testCompile "org.apache.geronimo.specs:geronimo-el_2.2_spec:${geronimoELSpec22Version}"
testCompile "org.apache.taglibs:taglibs-standard-spec:${taglibsStandardVersion}"
- testCompile "org.apache.taglibs:taglibs-standard-impl:${taglibsStandardVersion}"
}
[14/17] incubator-freemarker git commit: FREEMARKER-55: Fixed JavaDoc
build errors
Posted by dd...@apache.org.
FREEMARKER-55: Fixed JavaDoc build errors
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/cc6c469d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/cc6c469d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/cc6c469d
Branch: refs/heads/3
Commit: cc6c469db4b929921fb4603058a32dd8a29c2e37
Parents: bd09327
Author: ddekany <dd...@apache.org>
Authored: Thu Jul 6 10:07:26 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Thu Jul 6 10:09:15 2017 +0200
----------------------------------------------------------------------
.../freemarker/servlet/FreemarkerServlet.java | 6 +++---
.../freemarker/servlet/jsp/TaglibFactory.java | 22 ++++++++------------
2 files changed, 12 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cc6c469d/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index a3f4e75..bd3ffc9 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -242,7 +242,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
* optionally followed by colon and a regular expression, or {@value #META_INF_TLD_LOCATION_CLEAR}. For example {@code
* <param-value>classpath:.*myoverride.*\.jar$, webInfPerLibJars, classpath:.*taglib.*\.jar$</param-value>}, or {@code
* <param-value>classpath</param-value>}. (Whitespace around the commas and list items will be ignored.) See
- * {@link TaglibFactory#setMetaInfTldSources(List)} for more information. Defaults to a list that contains
+ * {@link TaglibFactory.Builder#setMetaInfTldSources(List)} for more information. Defaults to a list that contains
* {@value #META_INF_TLD_LOCATION_WEB_INF_PER_LIB_JARS} only (can be overridden with
* {@link #createDefaultMetaInfTldSources()}). Note that this can be also specified with the
* {@value #SYSTEM_PROPERTY_META_INF_TLD_SOURCES} system property. If both the init-param and the system property
@@ -254,8 +254,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
* Jetty's {@code "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern"} servlet context attribute.</li>
*
* <li><strong>{@value #INIT_PARAM_CLASSPATH_TLDS}</strong> (since 2.3.22): Comma separated list of paths; see
- * {@link TaglibFactory#setClasspathTlds(List)}. Whitespace around the list items will be ignored. Defaults to no paths
- * (can be overidden with {@link #createDefaultClassPathTlds()}). Note that this can also be specified with the
+ * {@link TaglibFactory.Builder#setClasspathTlds(List)}. Whitespace around the list items will be ignored. Defaults to
+ * no paths (can be overidden with {@link #createDefaultClassPathTlds()}). Note that this can also be specified with the
* {@value #SYSTEM_PROPERTY_CLASSPATH_TLDS} system property. If both the init-param and the system property exists, the
* items listed in system property will be added after those specified by the init-param.</li>
*
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/cc6c469d/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 7a45001..386b34e 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -178,7 +178,7 @@ public class TaglibFactory implements TemplateHashModel {
* @param values TLD location string value list
* @return a list of type {@link MetaInfTldSource} by parsing each TLD location string item value
* @throws ParseException if invalid value syntax found
- * @see {@link #parseMetaInfTldLocation(String)}
+ * @see #parseMetaInfTldLocation(String)
*/
public static List<MetaInfTldSource> parseMetaInfTldLocations(List<String> values) throws ParseException {
List<MetaInfTldSource> metaInfTldSources = null;
@@ -206,13 +206,9 @@ public class TaglibFactory implements TemplateHashModel {
/**
* Creates a new JSP taglib factory that will be used to load JSP tag libraries and functions for the web
* application represented by the passed in {@link ServletContext}.
- * You should at least call {@link #setObjectWrapper(ObjectWrapper)} before start using this object.
- *
+ *
* <p>This object is only thread-safe after you have stopped calling its setter methods (and it was properly
* published to the other threads; see JSR 133 (Java Memory Model)).
- *
- * @param servletContext
- * The servlet context whose JSP tag libraries this factory will load.
*/
private TaglibFactory(Builder builder) {
servletContext = builder.getServletContext();
@@ -1120,7 +1116,7 @@ public class TaglibFactory implements TemplateHashModel {
/**
* A location within which we will look for {@code META-INF/**}{@code /*.tld}-s. Used in the parameter to
- * {@link #setMetaInfTldSources}. See concrete subclasses for more.
+ * {@link Builder#setMetaInfTldSources}. See concrete subclasses for more.
*/
public static abstract class MetaInfTldSource {
private MetaInfTldSource() { }
@@ -1171,12 +1167,12 @@ public class TaglibFactory implements TemplateHashModel {
}
/**
- * When it occurs in the {@link MetaInfTldSource} list, all {@link MetaInfTldSource}-s before it will be disabled.
- * This is useful when the list is assembled from multiple sources, and some want to re-start it, rather than append
- * to the end of it.
- *
+ * When it occurs in the {@link MetaInfTldSource} list ({@link #getMetaInfTldSources()}), all {@link
+ * MetaInfTldSource}-s before it will be disabled. This is useful when the list is assembled from multiple sources,
+ * and some wants to re-start it, rather than append to the end of it.
+ *
* @see FreemarkerServlet#SYSTEM_PROPERTY_META_INF_TLD_SOURCES
- * @see TaglibFactory#setMetaInfTldSources(List)
+ * @see Builder#setMetaInfTldSources(List)
*/
public static final class ClearMetaInfTldSource extends MetaInfTldSource {
public final static ClearMetaInfTldSource INSTANCE = new ClearMetaInfTldSource();
@@ -2046,7 +2042,7 @@ public class TaglibFactory implements TemplateHashModel {
private final ServletContext servletContext;
/**
- * ObjectWrapper to be used in model building.
+ * {@link ObjectWrapper} to be used in model building.
*/
private final ObjectWrapper objectWrapper;