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;