Continued subpackage content rearrangement...
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/b0e08ccb Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/b0e08ccb Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/b0e08ccb Branch: refs/heads/3 Commit: b0e08ccb8c4776041cbed79a0d2764274f3a941e Parents: 94d3931 Author: ddekany <[email protected]> Authored: Thu Feb 16 23:56:05 2017 +0100 Committer: ddekany <[email protected]> Committed: Fri Feb 17 02:51:51 2017 +0100 ---------------------------------------------------------------------- .../apache/freemarker/core/Configuration.java | 36 +- .../org/apache/freemarker/core/Template.java | 2 +- .../core/ast/BuiltInsForSequences.java | 2 +- .../freemarker/core/ast/Configurable.java | 8 +- .../apache/freemarker/core/ast/Environment.java | 25 +- .../freemarker/core/ast/RegexpHelper.java | 2 +- .../core/ast/TemplateConfiguration.java | 2 +- .../apache/freemarker/core/ast/TextBlock.java | 4 +- .../org/apache/freemarker/core/ast/package.html | 6 +- .../debug/impl/RmiDebuggedEnvironmentImpl.java | 2 +- .../core/model/MapKeyValuePairIterator.java | 69 -- .../core/model/TemplateModelListSequence.java | 52 - .../core/model/impl/DefaultMapAdapter.java | 1 - .../model/impl/MapKeyValuePairIterator.java | 73 ++ .../freemarker/core/model/impl/SimpleHash.java | 1 - .../model/impl/TemplateModelListSequence.java | 56 + .../core/model/impl/beans/SimpleMapModel.java | 2 +- .../core/model/impl/beans/package.html | 5 +- .../apache/freemarker/core/model/package.html | 25 + .../ByteArrayTemplateLoader.java | 194 ---- .../core/templateresolver/CacheStorage.java | 2 + .../templateresolver/ClassTemplateLoader.java | 182 --- .../DefaultTemplateResolver.java | 1028 ----------------- .../templateresolver/FileTemplateLoader.java | 380 ------- .../MalformedTemplateNameException.java | 7 +- .../core/templateresolver/MruCacheStorage.java | 322 ------ .../templateresolver/MultiTemplateLoader.java | 167 --- .../core/templateresolver/NullCacheStorage.java | 66 -- .../core/templateresolver/SoftCacheStorage.java | 141 --- .../templateresolver/StringTemplateLoader.java | 194 ---- .../templateresolver/StrongCacheStorage.java | 67 -- .../core/templateresolver/TemplateLoader.java | 3 +- .../templateresolver/TemplateLoaderSession.java | 2 + .../templateresolver/TemplateLoadingResult.java | 1 + .../templateresolver/TemplateLoadingSource.java | 3 + .../templateresolver/TemplateLookupContext.java | 28 +- .../templateresolver/TemplateLookupResult.java | 95 +- .../TemplateLookupStrategy.java | 39 +- .../templateresolver/TemplateNameFormat.java | 378 +------ .../core/templateresolver/TemplateResolver.java | 9 +- .../templateresolver/URLTemplateLoader.java | 224 ---- .../URLTemplateLoadingSource.java | 57 - .../templateresolver/_TemplateLoaderUtils.java | 42 - .../impl/ByteArrayTemplateLoader.java | 199 ++++ .../impl/ClassTemplateLoader.java | 184 ++++ .../impl/DefaultTemplateLookupStrategy.java | 61 + .../impl/DefaultTemplateNameFormat.java | 310 ++++++ .../impl/DefaultTemplateNameFormatFM2.java | 106 ++ .../impl/DefaultTemplateResolver.java | 1042 ++++++++++++++++++ .../impl/FileTemplateLoader.java | 384 +++++++ .../templateresolver/impl/MruCacheStorage.java | 325 ++++++ .../impl/MultiTemplateLoader.java | 172 +++ .../templateresolver/impl/NullCacheStorage.java | 70 ++ .../templateresolver/impl/SoftCacheStorage.java | 144 +++ .../impl/StringTemplateLoader.java | 199 ++++ .../impl/StrongCacheStorage.java | 71 ++ ...emplateLoaderBasedTemplateLookupContext.java | 66 ++ ...TemplateLoaderBasedTemplateLookupResult.java | 124 +++ .../impl/URLTemplateLoader.java | 229 ++++ .../impl/URLTemplateLoadingSource.java | 58 + .../impl/_TemplateLoaderUtils.java | 43 + .../core/templateresolver/package.html | 9 +- .../freemarker/servlet/FreemarkerServlet.java | 6 +- .../freemarker/servlet/InitParamParser.java | 6 +- .../servlet/WebAppTemplateLoader.java | 4 +- src/manual/en_US/book.xml | 4 +- src/manual/zh_CN/book.xml | 4 +- .../freemarker/core/ConfigurationTest.java | 52 +- .../apache/freemarker/core/ExceptionTest.java | 2 +- .../freemarker/core/IncudeFromNamelessTest.java | 2 +- .../core/MistakenlyPublicImportAPIsTest.java | 2 +- .../core/TemplateLanguageVersionTest.java | 2 +- .../core/TemplateLookupStrategyTest.java | 9 +- .../core/TemplateNotFoundMessageTest.java | 8 +- .../freemarker/core/ast/CanonicalFormTest.java | 2 +- .../ast/EnvironmentGetTemplateVariantsTest.java | 2 +- .../ast/InterpretAndEvalTemplateNameTest.java | 2 +- .../core/ast/MiscErrorMessagesTest.java | 4 +- .../core/ast/ObjectBuilderSettingsTest.java | 2 +- .../core/ast/TemplatGetEncodingTest.java | 4 +- .../core/ast/TemplateConfigurationTest.java | 2 +- ...teConfigurationWithTemplateResolverTest.java | 4 +- .../core/ast/TemplateLevelSettings.java | 4 +- .../ast/TemplateNameSpecialVariablesTest.java | 2 +- .../DefaultTemplateResolverTest.java | 6 +- .../FileTemplateLoaderTest.java | 2 +- .../MultiTemplateLoaderTest.java | 6 +- .../TemplateNameFormatTest.java | 33 +- .../freemarker/manualtest/ExamplesTest.java | 6 +- .../servlet/FreemarkerServletTest.java | 2 +- .../freemarker/servlet/InitParamParserTest.java | 4 +- .../servlet/jsp/RealServletContainertTest.java | 2 +- .../apache/freemarker/test/TemplateTest.java | 4 +- .../test/templatesuite/TemplateTestCase.java | 2 +- .../test/templatesuite/models/Listables.java | 2 +- 95 files changed, 4137 insertions(+), 3861 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/Configuration.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/Configuration.java b/src/main/java/org/apache/freemarker/core/Configuration.java index 7612820..ece7b3f 100644 --- a/src/main/java/org/apache/freemarker/core/Configuration.java +++ b/src/main/java/org/apache/freemarker/core/Configuration.java @@ -87,20 +87,23 @@ import org.apache.freemarker.core.model.impl._StaticObjectWrappers; import org.apache.freemarker.core.model.impl.beans.BeansWrapper; import org.apache.freemarker.core.model.impl.beans.BeansWrapperBuilder; import org.apache.freemarker.core.templateresolver.CacheStorage; -import org.apache.freemarker.core.templateresolver.ClassTemplateLoader; -import org.apache.freemarker.core.templateresolver.DefaultTemplateResolver; -import org.apache.freemarker.core.templateresolver.FileTemplateLoader; import org.apache.freemarker.core.templateresolver.GetTemplateResult; import org.apache.freemarker.core.templateresolver.MalformedTemplateNameException; -import org.apache.freemarker.core.templateresolver.MruCacheStorage; -import org.apache.freemarker.core.templateresolver.MultiTemplateLoader; -import org.apache.freemarker.core.templateresolver.SoftCacheStorage; import org.apache.freemarker.core.templateresolver.TemplateConfigurationFactory; import org.apache.freemarker.core.templateresolver.TemplateLoader; import org.apache.freemarker.core.templateresolver.TemplateLookupContext; import org.apache.freemarker.core.templateresolver.TemplateLookupStrategy; import org.apache.freemarker.core.templateresolver.TemplateNameFormat; -import org.apache.freemarker.core.templateresolver.URLTemplateLoader; +import org.apache.freemarker.core.templateresolver.impl.ClassTemplateLoader; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateLookupStrategy; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormat; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormatFM2; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateResolver; +import org.apache.freemarker.core.templateresolver.impl.FileTemplateLoader; +import org.apache.freemarker.core.templateresolver.impl.MruCacheStorage; +import org.apache.freemarker.core.templateresolver.impl.MultiTemplateLoader; +import org.apache.freemarker.core.templateresolver.impl.SoftCacheStorage; +import org.apache.freemarker.core.templateresolver.impl.URLTemplateLoader; import org.apache.freemarker.core.util.CaptureOutput; import org.apache.freemarker.core.util.ClassUtil; import org.apache.freemarker.core.util.Constants; @@ -889,7 +892,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf } static TemplateLookupStrategy getDefaultTemplateLookupStrategy(Version incompatibleImprovements) { - return TemplateLookupStrategy.DEFAULT_2_3_0; + return DefaultTemplateLookupStrategy.INSTANCE; } private TemplateNameFormat getDefaultTemplateNameFormat() { @@ -897,7 +900,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf } static TemplateNameFormat getDefaultTemplateNameFormat(Version incompatibleImprovements) { - return TemplateNameFormat.DEFAULT_2_3_0; + return DefaultTemplateNameFormatFM2.INSTANCE; } private CacheStorage getDefaultCacheStorage() { @@ -1181,7 +1184,8 @@ public class Configuration extends Configurable implements Cloneable, ParserConf /** * Sets a {@link TemplateLookupStrategy} that is used to look up templates based on the requested name; as a side - * effect the template templateResolver will be emptied. The default value is {@link TemplateLookupStrategy#DEFAULT_2_3_0}. + * effect the template templateResolver will be emptied. The default value is + * {@link DefaultTemplateLookupStrategy#INSTANCE}. * * @since 2.3.22 */ @@ -1229,8 +1233,8 @@ public class Configuration extends Configurable implements Cloneable, ParserConf } /** - * Sets the template name format used. The default is {@link TemplateNameFormat#DEFAULT_2_3_0}, while the - * recommended value for new projects is {@link TemplateNameFormat#DEFAULT_2_4_0}. + * Sets the template name format used. The default is {@link DefaultTemplateNameFormatFM2#INSTANCE}, while the + * recommended value for new projects is {@link DefaultTemplateNameFormat#INSTANCE}. * * @since 2.3.22 */ @@ -1318,7 +1322,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf * The default is a {@link SoftCacheStorage}. If the total size of the {@link Template} * objects is significant but most templates are used rarely, using a * {@link MruCacheStorage} instead might be advisable. If you don't want caching at - * all, use {@link org.apache.freemarker.core.templateresolver.NullCacheStorage} (you can't use {@code null}). + * all, use {@link org.apache.freemarker.core.templateresolver.impl.NullCacheStorage} (you can't use {@code null}). * * <p>Note that setting the templateResolver storage will re-create the template templateResolver, so * all its content will be lost. @@ -2447,7 +2451,7 @@ public class Configuration extends Configurable implements Cloneable, ParserConf } private boolean isKnownNonConfusingLookupStrategy(TemplateLookupStrategy templateLookupStrategy) { - return templateLookupStrategy == TemplateLookupStrategy.DEFAULT_2_3_0; + return templateLookupStrategy == DefaultTemplateLookupStrategy.INSTANCE; } private String removeInitialSlash(String name) { @@ -2935,9 +2939,9 @@ public class Configuration extends Configurable implements Cloneable, ParserConf if (value.equalsIgnoreCase(DEFAULT)) { unsetTemplateNameFormat(); } else if (value.equalsIgnoreCase("default_2_3_0")) { - setTemplateNameFormat(TemplateNameFormat.DEFAULT_2_3_0); + setTemplateNameFormat(DefaultTemplateNameFormatFM2.INSTANCE); } else if (value.equalsIgnoreCase("default_2_4_0")) { - setTemplateNameFormat(TemplateNameFormat.DEFAULT_2_4_0); + setTemplateNameFormat(DefaultTemplateNameFormat.INSTANCE); } else { throw invalidSettingValueException(name, value); } http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/Template.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/Template.java b/src/main/java/org/apache/freemarker/core/Template.java index c78e66c..3ec414c 100644 --- a/src/main/java/org/apache/freemarker/core/Template.java +++ b/src/main/java/org/apache/freemarker/core/Template.java @@ -57,9 +57,9 @@ import org.apache.freemarker.core.model.TemplateHashModel; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateNodeModel; import org.apache.freemarker.core.model.impl.SimpleHash; -import org.apache.freemarker.core.templateresolver.DefaultTemplateResolver; import org.apache.freemarker.core.templateresolver.TemplateLoader; import org.apache.freemarker.core.templateresolver.TemplateLookupStrategy; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateResolver; import org.apache.freemarker.core.util.NullArgumentException; /** http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/ast/BuiltInsForSequences.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForSequences.java b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForSequences.java index 52fb1dc..2d9a34e 100644 --- a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForSequences.java +++ b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForSequences.java @@ -36,12 +36,12 @@ import org.apache.freemarker.core.model.TemplateMethodModelEx; import org.apache.freemarker.core.model.TemplateModel; import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateModelIterator; -import org.apache.freemarker.core.model.TemplateModelListSequence; import org.apache.freemarker.core.model.TemplateNumberModel; import org.apache.freemarker.core.model.TemplateScalarModel; import org.apache.freemarker.core.model.TemplateSequenceModel; import org.apache.freemarker.core.model.impl.SimpleNumber; import org.apache.freemarker.core.model.impl.SimpleScalar; +import org.apache.freemarker.core.model.impl.TemplateModelListSequence; import org.apache.freemarker.core.model.impl.beans.CollectionModel; import org.apache.freemarker.core.util.Constants; import org.apache.freemarker.core.util.StringUtil; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/ast/Configurable.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ast/Configurable.java b/src/main/java/org/apache/freemarker/core/ast/Configurable.java index fda0601..1f74f5b 100644 --- a/src/main/java/org/apache/freemarker/core/ast/Configurable.java +++ b/src/main/java/org/apache/freemarker/core/ast/Configurable.java @@ -63,6 +63,8 @@ import org.apache.freemarker.core.templateresolver.OrMatcher; import org.apache.freemarker.core.templateresolver.PathGlobMatcher; import org.apache.freemarker.core.templateresolver.PathRegexMatcher; import org.apache.freemarker.core.templateresolver.TemplateLoader; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormat; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormatFM2; import org.apache.freemarker.core.util.NullArgumentException; import org.apache.freemarker.core.util.StringUtil; @@ -2089,7 +2091,7 @@ public class Configurable { * <br>String value: If the value contains dot, then it's interpreted as an <a href="#fm_obe">object builder * expression</a>. * If the value does not contain dot, - * then a {@link org.apache.freemarker.core.templateresolver.MruCacheStorage} will be used with the + * then a {@link org.apache.freemarker.core.templateresolver.impl.MruCacheStorage} will be used with the * maximum strong and soft sizes specified with the setting value. Examples * of valid setting values: * @@ -2155,8 +2157,8 @@ public class Configurable { * <li><p>{@code "template_name_format"}: * See: {@link Configuration#setTemplateNameFormat(org.apache.freemarker.core.templateresolver.TemplateNameFormat)}. * <br>String value: {@code "default"} (case insensitive) for the default, {@code "default_2_3_0"} - * for {@link org.apache.freemarker.core.templateresolver.TemplateNameFormat#DEFAULT_2_3_0}, {@code "default_2_4_0"} for - * {@link org.apache.freemarker.core.templateresolver.TemplateNameFormat#DEFAULT_2_4_0}. + * for {@link DefaultTemplateNameFormatFM2#INSTANCE}, {@code "default_2_4_0"} for + * {@link DefaultTemplateNameFormat#INSTANCE}. * </ul> * * <p><a name="fm_obe"></a>Regarding <em>object builder expressions</em> (used by the setting values where it was http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/ast/Environment.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ast/Environment.java b/src/main/java/org/apache/freemarker/core/ast/Environment.java index cb7dcfc..8c1dbef 100644 --- a/src/main/java/org/apache/freemarker/core/ast/Environment.java +++ b/src/main/java/org/apache/freemarker/core/ast/Environment.java @@ -69,6 +69,8 @@ import org.apache.freemarker.core.templateresolver.MalformedTemplateNameExceptio import org.apache.freemarker.core.templateresolver.TemplateNameFormat; import org.apache.freemarker.core.templateresolver.TemplateResolver; import org.apache.freemarker.core.templateresolver._CacheAPI; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormat; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormatFM2; import org.apache.freemarker.core.util.DateUtil; import org.apache.freemarker.core.util.DateUtil.DateToISO8601CalendarFactory; import org.apache.freemarker.core.util.NullWriter; @@ -2676,26 +2678,25 @@ public final class Environment extends Configurable { /** * Resolves a reference to a template (like the one used in {@code #include} or {@code #import}), assuming a base * name. This gives a full (that is, absolute), even if non-normalized template name, that could be used for - * {@link Configuration#getTemplate(String)}. This is mostly used when a - * template refers to another template. + * {@link Configuration#getTemplate(String)}. This is mostly used when a template refers to another template. * * @param baseName * The name to which relative {@code targetName}-s are relative to. Maybe {@code null} (happens when * resolving names in nameless templates), which means that the base is the root "directory", and so the - * {@code targetName} is returned without change. Assuming {@link TemplateNameFormat#DEFAULT_2_3_0} or - * {@link TemplateNameFormat#DEFAULT_2_4_0}, the rules are as follows. If you want to specify a base + * {@code targetName} is returned without change. Assuming {@link DefaultTemplateNameFormatFM2#INSTANCE} + * or {@link DefaultTemplateNameFormat#INSTANCE}, the rules are as follows. If you want to specify a base * directory here, it must end with {@code "/"}. If it doesn't end with {@code "/"}, it's parent * directory will be used as the base path. Might starts with a scheme part (like {@code "foo://"}, or - * with {@link TemplateNameFormat#DEFAULT_2_4_0} even just with {@code "foo:"}). + * with {@link DefaultTemplateNameFormat#INSTANCE} even just with {@code "foo:"}). * @param targetName * The name of the template, which is either a relative or absolute name. Assuming - * {@link TemplateNameFormat#DEFAULT_2_3_0} or {@link TemplateNameFormat#DEFAULT_2_4_0}, the rules are as - * follows. If it starts with {@code "/"} or contains a scheme part separator ({@code "://"}, also, with - * {@link TemplateNameFormat#DEFAULT_2_4_0} a {@code ":"} with no {@code "/"} anywhere before it) then - * it's an absolute name, otherwise it's a relative path. Relative paths are interpreted relatively to - * the {@code baseName}. Absolute names are simply returned as is, ignoring the {@code baseName}, except, - * when the {@code baseName} has scheme part while the {@code targetName} doesn't have, then the schema - * of the {@code baseName} is prepended to the {@code targetName}. + * {@link DefaultTemplateNameFormatFM2#INSTANCE} or {@link DefaultTemplateNameFormat#INSTANCE}, the rules + * are as follows. If it starts with {@code "/"} or contains a scheme part separator ({@code "://"}, + * also, with {@link DefaultTemplateNameFormat#INSTANCE} a {@code ":"} with no {@code "/"} anywhere + * before it) then it's an absolute name, otherwise it's a relative path. Relative paths are interpreted + * relatively to the {@code baseName}. Absolute names are simply returned as is, ignoring the + * {@code baseName}, except, when the {@code baseName} has scheme part while the {@code targetName} + * doesn't have, then the schema of the {@code baseName} is prepended to the {@code targetName}. * * @since 2.3.22 */ http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/ast/RegexpHelper.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ast/RegexpHelper.java b/src/main/java/org/apache/freemarker/core/ast/RegexpHelper.java index 4cd6fb6..ba63583 100644 --- a/src/main/java/org/apache/freemarker/core/ast/RegexpHelper.java +++ b/src/main/java/org/apache/freemarker/core/ast/RegexpHelper.java @@ -24,7 +24,7 @@ import java.util.regex.PatternSyntaxException; import org.apache.freemarker.core._CoreLogs; import org.apache.freemarker.core.model.TemplateModelException; -import org.apache.freemarker.core.templateresolver.MruCacheStorage; +import org.apache.freemarker.core.templateresolver.impl.MruCacheStorage; import org.apache.freemarker.core.util.StringUtil; import org.slf4j.Logger; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/ast/TemplateConfiguration.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ast/TemplateConfiguration.java b/src/main/java/org/apache/freemarker/core/ast/TemplateConfiguration.java index f4bb357..99a18f8 100644 --- a/src/main/java/org/apache/freemarker/core/ast/TemplateConfiguration.java +++ b/src/main/java/org/apache/freemarker/core/ast/TemplateConfiguration.java @@ -28,7 +28,7 @@ import org.apache.freemarker.core.Configuration; import org.apache.freemarker.core.Template; import org.apache.freemarker.core.Version; import org.apache.freemarker.core._TemplateAPI; -import org.apache.freemarker.core.templateresolver.DefaultTemplateResolver; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateResolver; import org.apache.freemarker.core.util.NullArgumentException; /** http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/ast/TextBlock.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ast/TextBlock.java b/src/main/java/org/apache/freemarker/core/ast/TextBlock.java index 6cfd688..e3bb8a7 100644 --- a/src/main/java/org/apache/freemarker/core/ast/TextBlock.java +++ b/src/main/java/org/apache/freemarker/core/ast/TextBlock.java @@ -27,7 +27,7 @@ import org.apache.freemarker.core.util.StringUtil; /** * A TemplateElement representing a block of plain text. * - * @deprected This is an internal API; don't use it. + * @deprecated This is an internal API; don't use it. */ public final class TextBlock extends TemplateElement { @@ -59,7 +59,7 @@ public final class TextBlock extends TemplateElement { /** * Simply outputs the text. * - * @deprected This is an internal API; don't call or override it. + * @deprecated This is an internal API; don't call or override it. */ @Override public TemplateElement[] accept(Environment env) http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/ast/package.html ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ast/package.html b/src/main/java/org/apache/freemarker/core/ast/package.html index 15c389f..6e29779 100644 --- a/src/main/java/org/apache/freemarker/core/ast/package.html +++ b/src/main/java/org/apache/freemarker/core/ast/package.html @@ -19,8 +19,8 @@ <html> <head> </head> -<body bgcolor="white"> -<p>The seldom used or advanced parts of the fundamental FreeMarker API, compared to {@link freemarker.template}. -This package also encloses FreeMarker's core parsing/rendering functionality.</p> +<body> +<p>[TODO] This was the {@code freemarker.core} on FM2; move most it over to o.a.f.core, leave the parser and AST +here.</p> </body> </html> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggedEnvironmentImpl.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggedEnvironmentImpl.java b/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggedEnvironmentImpl.java index 953789d..87a8a7c 100644 --- a/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggedEnvironmentImpl.java +++ b/src/main/java/org/apache/freemarker/core/debug/impl/RmiDebuggedEnvironmentImpl.java @@ -45,7 +45,7 @@ import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.impl.SimpleCollection; import org.apache.freemarker.core.model.impl.SimpleScalar; import org.apache.freemarker.core.templateresolver.CacheStorage; -import org.apache.freemarker.core.templateresolver.SoftCacheStorage; +import org.apache.freemarker.core.templateresolver.impl.SoftCacheStorage; import org.apache.freemarker.core.util.UndeclaredThrowableException; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/MapKeyValuePairIterator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/MapKeyValuePairIterator.java b/src/main/java/org/apache/freemarker/core/model/MapKeyValuePairIterator.java deleted file mode 100644 index 531eae4..0000000 --- a/src/main/java/org/apache/freemarker/core/model/MapKeyValuePairIterator.java +++ /dev/null @@ -1,69 +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.core.model; - -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.freemarker.core.model.TemplateHashModelEx2.KeyValuePair; -import org.apache.freemarker.core.model.TemplateHashModelEx2.KeyValuePairIterator; - -/** - * Implementation of {@link KeyValuePairIterator} for a {@link TemplateHashModelEx2} that wraps or otherwise uses a - * {@link Map} internally. - * - * @since 2.3.25 - */ -public class MapKeyValuePairIterator implements KeyValuePairIterator { - - private final Iterator<Entry<?, ?>> entrySetIterator; - - private final ObjectWrapper objectWrapper; - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public <K, V> MapKeyValuePairIterator(Map<?, ?> map, ObjectWrapper objectWrapper) { - entrySetIterator = ((Map) map).entrySet().iterator(); - this.objectWrapper = objectWrapper; - } - - public boolean hasNext() { - return entrySetIterator.hasNext(); - } - - public KeyValuePair next() { - final Entry<?, ?> entry = entrySetIterator.next(); - return new KeyValuePair() { - - public TemplateModel getKey() throws TemplateModelException { - return wrap(entry.getKey()); - } - - public TemplateModel getValue() throws TemplateModelException { - return wrap(entry.getValue()); - } - - }; - } - - private TemplateModel wrap(Object obj) throws TemplateModelException { - return (obj instanceof TemplateModel) ? (TemplateModel) obj : objectWrapper.wrap(obj); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/TemplateModelListSequence.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/TemplateModelListSequence.java b/src/main/java/org/apache/freemarker/core/model/TemplateModelListSequence.java deleted file mode 100644 index 7ca482f..0000000 --- a/src/main/java/org/apache/freemarker/core/model/TemplateModelListSequence.java +++ /dev/null @@ -1,52 +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.core.model; - -import java.util.List; - -/** - * A sequence that wraps a {@link List} of {@link TemplateModel}-s. It does not copy the original - * list. It's mostly useful when implementing {@link TemplateMethodModelEx}-es that collect items from other - * {@link TemplateModel}-s. - */ -public class TemplateModelListSequence implements TemplateSequenceModel { - - private List/*<TemplateModel>*/ list; - - public TemplateModelListSequence(List list) { - this.list = list; - } - - public TemplateModel get(int index) { - return (TemplateModel) list.get(index); - } - - public int size() { - return list.size(); - } - - /** - * Returns the original {@link List} of {@link TemplateModel}-s, so it's not a fully unwrapped value. - */ - public Object getWrappedObject() { - return list; - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java b/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java index 1fe5abe..61076e9 100644 --- a/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java +++ b/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java @@ -26,7 +26,6 @@ import java.util.SortedMap; import org.apache.freemarker.core.ast._DelayedJQuote; import org.apache.freemarker.core.ast._TemplateModelException; import org.apache.freemarker.core.model.AdapterTemplateModel; -import org.apache.freemarker.core.model.MapKeyValuePairIterator; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java b/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java new file mode 100644 index 0000000..77495be --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java @@ -0,0 +1,73 @@ +/* + * 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.core.model.impl; + +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.freemarker.core.model.ObjectWrapper; +import org.apache.freemarker.core.model.TemplateHashModelEx2; +import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateModelException; +import org.apache.freemarker.core.model.TemplateHashModelEx2.KeyValuePair; +import org.apache.freemarker.core.model.TemplateHashModelEx2.KeyValuePairIterator; + +/** + * Implementation of {@link KeyValuePairIterator} for a {@link TemplateHashModelEx2} that wraps or otherwise uses a + * {@link Map} internally. + * + * @since 2.3.25 + */ +public class MapKeyValuePairIterator implements KeyValuePairIterator { + + private final Iterator<Entry<?, ?>> entrySetIterator; + + private final ObjectWrapper objectWrapper; + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public <K, V> MapKeyValuePairIterator(Map<?, ?> map, ObjectWrapper objectWrapper) { + entrySetIterator = ((Map) map).entrySet().iterator(); + this.objectWrapper = objectWrapper; + } + + public boolean hasNext() { + return entrySetIterator.hasNext(); + } + + public KeyValuePair next() { + final Entry<?, ?> entry = entrySetIterator.next(); + return new KeyValuePair() { + + public TemplateModel getKey() throws TemplateModelException { + return wrap(entry.getKey()); + } + + public TemplateModel getValue() throws TemplateModelException { + return wrap(entry.getValue()); + } + + }; + } + + private TemplateModel wrap(Object obj) throws TemplateModelException { + return (obj instanceof TemplateModel) ? (TemplateModel) obj : objectWrapper.wrap(obj); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java b/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java index 75f3f54..52f3bb7 100644 --- a/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java +++ b/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java @@ -29,7 +29,6 @@ import java.util.TreeMap; import org.apache.freemarker.core.ast._DelayedJQuote; import org.apache.freemarker.core.ast._TemplateModelException; -import org.apache.freemarker.core.model.MapKeyValuePairIterator; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.TemplateBooleanModel; import org.apache.freemarker.core.model.TemplateCollectionModel; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java b/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java new file mode 100644 index 0000000..bdb64ac --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java @@ -0,0 +1,56 @@ +/* + * 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.core.model.impl; + +import java.util.List; + +import org.apache.freemarker.core.model.TemplateMethodModelEx; +import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateSequenceModel; + +/** + * A sequence that wraps a {@link List} of {@link TemplateModel}-s. It does not copy the original + * list. It's mostly useful when implementing {@link TemplateMethodModelEx}-es that collect items from other + * {@link TemplateModel}-s. + */ +public class TemplateModelListSequence implements TemplateSequenceModel { + + private List/*<TemplateModel>*/ list; + + public TemplateModelListSequence(List list) { + this.list = list; + } + + public TemplateModel get(int index) { + return (TemplateModel) list.get(index); + } + + public int size() { + return list.size(); + } + + /** + * Returns the original {@link List} of {@link TemplateModel}-s, so it's not a fully unwrapped value. + */ + public Object getWrappedObject() { + return list; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/impl/beans/SimpleMapModel.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/beans/SimpleMapModel.java b/src/main/java/org/apache/freemarker/core/model/impl/beans/SimpleMapModel.java index 4d35ee9..d5c65f5 100644 --- a/src/main/java/org/apache/freemarker/core/model/impl/beans/SimpleMapModel.java +++ b/src/main/java/org/apache/freemarker/core/model/impl/beans/SimpleMapModel.java @@ -24,7 +24,6 @@ import java.util.Map; import org.apache.freemarker.core.ast.CollectionAndSequence; import org.apache.freemarker.core.model.AdapterTemplateModel; -import org.apache.freemarker.core.model.MapKeyValuePairIterator; import org.apache.freemarker.core.model.ObjectWrapper; import org.apache.freemarker.core.model.TemplateCollectionModel; import org.apache.freemarker.core.model.TemplateHashModelEx2; @@ -34,6 +33,7 @@ import org.apache.freemarker.core.model.TemplateModelException; import org.apache.freemarker.core.model.TemplateModelWithAPISupport; import org.apache.freemarker.core.model.WrapperTemplateModel; import org.apache.freemarker.core.model.WrappingTemplateModel; +import org.apache.freemarker.core.model.impl.MapKeyValuePairIterator; import org.apache.freemarker.core.model.impl.SimpleSequence; import org.apache.freemarker.core.util.RichObjectWrapper; http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/impl/beans/package.html ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/impl/beans/package.html b/src/main/java/org/apache/freemarker/core/model/impl/beans/package.html index 2032969..bd6b36c 100644 --- a/src/main/java/org/apache/freemarker/core/model/impl/beans/package.html +++ b/src/main/java/org/apache/freemarker/core/model/impl/beans/package.html @@ -22,9 +22,8 @@ </head> <body> -<p>The {@link freemarker.template.DefaultObjectWrapper default object wrapper} of FreeMarker uses -this to expose Java Beans and POJO-s to templates, but it can also be used in itself as a -better alternative {@link freemarker.template.ObjectWrapper}.</p> +<p>The {@linkplain org.apache.freemarker.core.model.impl.DefaultObjectWrapper default object wrapper} of FreeMarker uses +this to expose Java Beans and POJO-s to templates.</p> <p>Most of the issues dealing with beans are handled by the {@link freemarker.ext.beans.BeansWrapper#wrap(Object)}and {@link http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/model/package.html ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/model/package.html b/src/main/java/org/apache/freemarker/core/model/package.html new file mode 100644 index 0000000..58c3127 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/model/package.html @@ -0,0 +1,25 @@ +<!-- + 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. +--> +<html> +<head> +</head> +<body> +<p>Things related to <tt>TemplateModel</tt>-s (basically the type system of FTL).</p> +</body> +</html> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/templateresolver/ByteArrayTemplateLoader.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/templateresolver/ByteArrayTemplateLoader.java b/src/main/java/org/apache/freemarker/core/templateresolver/ByteArrayTemplateLoader.java deleted file mode 100644 index dbb246d..0000000 --- a/src/main/java/org/apache/freemarker/core/templateresolver/ByteArrayTemplateLoader.java +++ /dev/null @@ -1,194 +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.core.templateresolver; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.freemarker.core.util.StringUtil; - -/** - * A {@link TemplateLoader} that uses a {@link Map} with {@code byte[]} as its source of templates. This is similar to - * {@link StringTemplateLoader}, but uses {@code byte[]} instead of {@link String}; see more details there. - * - * <p>Note that {@link ByteArrayTemplateLoader} can't be used with a distributed (cluster-wide) {@link CacheStorage}, - * as it produces {@link TemplateLoadingSource}-s that deliberately throw exception on serialization (because the - * content is only accessible within a single JVM, and is also volatile). - */ -// TODO JUnit tests -public class ByteArrayTemplateLoader implements TemplateLoader { - - private static final AtomicLong INSTANCE_COUNTER = new AtomicLong(); - - private final long instanceId = INSTANCE_COUNTER.get(); - private final AtomicLong templatesRevision = new AtomicLong(); - private final ConcurrentMap<String, ContentHolder> templates = new ConcurrentHashMap<>(); - - /** - * Puts a template into the template loader. The name can contain slashes to denote logical directory structure, but - * must not start with a slash. Each template will get an unique revision number, thus replacing a template will - * cause the template cache to reload it (when the update delay expires). - * - * <p>This method is thread-safe. - * - * @param name - * the name of the template. - * @param content - * the source code of the template. - */ - public void putTemplate(String name, byte[] content) { - templates.put( - name, - new ContentHolder(content, new Source(instanceId, name), templatesRevision.incrementAndGet())); - } - - /** - * Removes the template with the specified name if it was added earlier. - * - * <p> - * This method is thread-safe. - * - * @param name - * Exactly the key with which the template was added. - * - * @return Whether a template was found with the given key (and hence was removed now) - */ - public boolean removeTemplate(String name) { - return templates.remove(name) != null; - } - - @Override - public TemplateLoaderSession createSession() { - return null; - } - - @Override - public TemplateLoadingResult load(String name, TemplateLoadingSource ifSourceDiffersFrom, - Serializable ifVersionDiffersFrom, TemplateLoaderSession session) throws IOException { - ContentHolder contentHolder = templates.get(name); - if (contentHolder == null) { - return TemplateLoadingResult.NOT_FOUND; - } else if (ifSourceDiffersFrom != null && ifSourceDiffersFrom.equals(contentHolder.source) - && Objects.equals(ifVersionDiffersFrom, contentHolder.version)) { - return TemplateLoadingResult.NOT_MODIFIED; - } else { - return new TemplateLoadingResult( - contentHolder.source, contentHolder.version, - new ByteArrayInputStream(contentHolder.content), - null); - } - } - - @Override - public void resetState() { - // Do nothing - } - - /** - * Show class name and some details that are useful in template-not-found errors. - */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(_TemplateLoaderUtils.getClassNameForToString(this)); - sb.append("(Map { "); - int cnt = 0; - for (String name : templates.keySet()) { - cnt++; - if (cnt != 1) { - sb.append(", "); - } - if (cnt > 10) { - sb.append("..."); - break; - } - sb.append(StringUtil.jQuote(name)); - sb.append("=..."); - } - if (cnt != 0) { - sb.append(' '); - } - sb.append("})"); - return sb.toString(); - } - - private static class ContentHolder { - private final byte[] content; - private final Source source; - private final long version; - - public ContentHolder(byte[] content, Source source, long version) { - this.content = content; - this.source = source; - this.version = version; - } - - } - - @SuppressWarnings("serial") - private static class Source implements TemplateLoadingSource { - - private final long instanceId; - private final String name; - - public Source(long instanceId, String name) { - this.instanceId = instanceId; - this.name = name; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (int) (instanceId ^ (instanceId >>> 32)); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (getClass() != obj.getClass()) return false; - Source other = (Source) obj; - if (instanceId != other.instanceId) return false; - if (name == null) { - if (other.name != null) return false; - } else if (!name.equals(other.name)) { - return false; - } - return true; - } - - private void writeObject(ObjectOutputStream out) throws IOException { - throw new IOException(ByteArrayTemplateLoader.class.getName() - + " sources can't be serialized, as they don't support clustering."); - } - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/templateresolver/CacheStorage.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/templateresolver/CacheStorage.java b/src/main/java/org/apache/freemarker/core/templateresolver/CacheStorage.java index 1dfe01a..3f86c1b 100644 --- a/src/main/java/org/apache/freemarker/core/templateresolver/CacheStorage.java +++ b/src/main/java/org/apache/freemarker/core/templateresolver/CacheStorage.java @@ -19,6 +19,8 @@ package org.apache.freemarker.core.templateresolver; +import org.apache.freemarker.core.templateresolver.impl.DefaultTemplateResolver; + /** * Cache storage abstracts away the storage aspects of a cache - associating * an object with a key, retrieval and removal via the key. It is actually a http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/b0e08ccb/src/main/java/org/apache/freemarker/core/templateresolver/ClassTemplateLoader.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/templateresolver/ClassTemplateLoader.java b/src/main/java/org/apache/freemarker/core/templateresolver/ClassTemplateLoader.java deleted file mode 100644 index d80d3cf..0000000 --- a/src/main/java/org/apache/freemarker/core/templateresolver/ClassTemplateLoader.java +++ /dev/null @@ -1,182 +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.core.templateresolver; - -import java.io.IOException; -import java.net.URL; -import java.net.URLConnection; - -import org.apache.freemarker.core.util.NullArgumentException; -import org.apache.freemarker.core.util.StringUtil; - -/** - * A {@link TemplateLoader} that can load templates from the "classpath". Naturally, it can load from jar files, or from - * anywhere where Java can load classes from. Internally, it uses {@link Class#getResource(String)} or - * {@link ClassLoader#getResource(String)} to load templates. - */ -// TODO -public class ClassTemplateLoader extends URLTemplateLoader { - - private final Class<?> resourceLoaderClass; - private final ClassLoader classLoader; - private final String basePackagePath; - - /** - * Creates a template loader that will use the {@link Class#getResource(String)} method of the specified class to - * load the resources, and the specified base package path (absolute or relative). - * - * <p> - * Examples: - * <ul> - * <li>Relative base path (will load from the {@code com.example.myapplication.templates} package):<br> - * {@code new ClassTemplateLoader(com.example.myapplication.SomeClass.class, "templates")} - * <li>Absolute base path:<br> - * {@code new ClassTemplateLoader(somepackage.SomeClass.class, "/com/example/myapplication/templates")} - * </ul> - * - * @param resourceLoaderClass - * The class whose {@link Class#getResource(String)} method will be used to load the templates. Be sure - * that you chose a class whose defining class-loader sees the templates. This parameter can't be - * {@code null}. - * @param basePackagePath - * The package that contains the templates, in path ({@code /}-separated) format. If it doesn't start - * with a {@code /} then it's relative to the path (package) of the {@code resourceLoaderClass} class. If - * it starts with {@code /} then it's relative to the root of the package hierarchy. Note that path - * components should be separated by forward slashes independently of the separator character used by the - * underlying operating system. This parameter can't be {@code null}. - * - * @see #ClassTemplateLoader(ClassLoader, String) - */ - public ClassTemplateLoader(Class<?> resourceLoaderClass, String basePackagePath) { - this(resourceLoaderClass, false, null, basePackagePath); - } - - /** - * Similar to {@link #ClassTemplateLoader(Class, String)}, but instead of {@link Class#getResource(String)} it uses - * {@link ClassLoader#getResource(String)}. Because a {@link ClassLoader} isn't bound to any Java package, it - * doesn't mater if the {@code basePackagePath} starts with {@code /} or not, it will be always relative to the root - * of the package hierarchy - */ - public ClassTemplateLoader(ClassLoader classLoader, String basePackagePath) { - this(null, true, classLoader, basePackagePath); - } - - private ClassTemplateLoader(Class<?> resourceLoaderClass, boolean allowNullResourceLoaderClass, - ClassLoader classLoader, String basePackagePath) { - if (!allowNullResourceLoaderClass) { - NullArgumentException.check("resourceLoaderClass", resourceLoaderClass); - } - NullArgumentException.check("basePackagePath", basePackagePath); - - // Either set a non-null resourceLoaderClass or a non-null classLoader, not both: - this.resourceLoaderClass = classLoader == null ? (resourceLoaderClass == null ? this.getClass() - : resourceLoaderClass) : null; - if (this.resourceLoaderClass == null && classLoader == null) { - throw new NullArgumentException("classLoader"); - } - this.classLoader = classLoader; - - String canonBasePackagePath = canonicalizePrefix(basePackagePath); - if (this.classLoader != null && canonBasePackagePath.startsWith("/")) { - canonBasePackagePath = canonBasePackagePath.substring(1); - } - this.basePackagePath = canonBasePackagePath; - } - - private static boolean isSchemeless(String fullPath) { - int i = 0; - int ln = fullPath.length(); - - // Skip a single initial /, as things like "/file:/..." might work: - if (i < ln && fullPath.charAt(i) == '/') i++; - - // Check if there's no ":" earlier than a '/', as the URLClassLoader - // could interpret that as an URL scheme: - while (i < ln) { - char c = fullPath.charAt(i); - if (c == '/') return true; - if (c == ':') return false; - i++; - } - return true; - } - - /** - * Show class name and some details that are useful in template-not-found errors. - */ - @Override - public String toString() { - return _TemplateLoaderUtils.getClassNameForToString(this) + "(" - + (resourceLoaderClass != null - ? "resourceLoaderClass=" + resourceLoaderClass.getName() - : "classLoader=" + StringUtil.jQuote(classLoader)) - + ", basePackagePath" - + "=" - + StringUtil.jQuote(basePackagePath) - + (resourceLoaderClass != null - ? (basePackagePath.startsWith("/") ? "" : " /* relatively to resourceLoaderClass pkg */") - : "" - ) - + ")"; - } - - /** - * See the similar parameter of {@link #ClassTemplateLoader(Class, String)}; {@code null} when other mechanism is - * used to load the resources. - */ - public Class<?> getResourceLoaderClass() { - return resourceLoaderClass; - } - - /** - * See the similar parameter of {@link #ClassTemplateLoader(ClassLoader, String)}; {@code null} when other mechanism - * is used to load the resources. - */ - public ClassLoader getClassLoader() { - return classLoader; - } - - /** - * See the similar parameter of {@link #ClassTemplateLoader(ClassLoader, String)}; note that this is a normalized - * version of what was actually passed to the constructor. - */ - public String getBasePackagePath() { - return basePackagePath; - } - - @Override - protected URL getURL(String name) { - String fullPath = basePackagePath + name; - - // Block java.net.URLClassLoader exploits: - if (basePackagePath.equals("/") && !isSchemeless(fullPath)) { - return null; - } - - return resourceLoaderClass != null ? resourceLoaderClass.getResource(fullPath) : classLoader - .getResource(fullPath); - } - - @Override - protected TemplateLoadingResult extractNegativeResult(URLConnection conn) throws IOException { - return null; - } - -} \ No newline at end of file
