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/02/16 23:09:02 UTC
[37/54] [partial] incubator-freemarker git commit: Top level package
name change to org.apache.freemarker,
and some of of the internal package structure changes. Other smaller cleanup.
To be continued...
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/IteratorBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/IteratorBlock.java b/src/main/java/freemarker/core/IteratorBlock.java
deleted file mode 100644
index 0ae8d1d..0000000
--- a/src/main/java/freemarker/core/IteratorBlock.java
+++ /dev/null
@@ -1,475 +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 freemarker.core;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-
-import freemarker.template.SimpleNumber;
-import freemarker.template.TemplateBooleanModel;
-import freemarker.template.TemplateCollectionModel;
-import freemarker.template.TemplateException;
-import freemarker.template.TemplateHashModelEx;
-import freemarker.template.TemplateHashModelEx2;
-import freemarker.template.TemplateHashModelEx2.KeyValuePair;
-import freemarker.template.TemplateHashModelEx2.KeyValuePairIterator;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.TemplateModelIterator;
-import freemarker.template.TemplateScalarModel;
-import freemarker.template.TemplateSequenceModel;
-
-/**
- * A #list (or #foreach) element, or pre-#else section of it inside a {@link ListElseContainer}.
- */
-final class IteratorBlock extends TemplateElement {
-
- private final Expression listedExp;
- private final String loopVarName;
- private final String loopVar2Name;
- private final boolean hashListing;
- private final boolean forEach;
-
- /**
- * @param listedExp
- * a variable referring to a sequence or collection or extended hash to list
- * @param loopVarName
- * The name of the variable that will hold the value of the current item when looping through listed value,
- * or {@code null} if we have a nested {@code #items}. If this is a hash listing then this variable will holds the value
- * of the hash key.
- * @param loopVar2Name
- * The name of the variable that will hold the value of the current item when looping through the list,
- * or {@code null} if we have a nested {@code #items}. If this is a hash listing then it variable will hold the value
- * from the key-value pair.
- * @param childrenBeforeElse
- * The nested content to execute if the listed value wasn't empty; can't be {@code null}. If the loop variable
- * was specified in the start tag, this is also what we will iterate over.
- * @param hashListing
- * Whether this is a key-value pair listing, or a usual listing. This is properly set even if we have
- * a nested {@code #items}.
- * @param forEach
- * Whether this is {@code #foreach} or a {@code #list}.
- */
- IteratorBlock(Expression listedExp,
- String loopVarName,
- String loopVar2Name,
- TemplateElements childrenBeforeElse,
- boolean hashListing,
- boolean forEach) {
- this.listedExp = listedExp;
- this.loopVarName = loopVarName;
- this.loopVar2Name = loopVar2Name;
- setChildren(childrenBeforeElse);
- this.hashListing = hashListing;
- this.forEach = forEach;
- }
-
- boolean isHashListing() {
- return hashListing;
- }
-
- @Override
- TemplateElement[] accept(Environment env) throws TemplateException, IOException {
- acceptWithResult(env);
- return null;
- }
-
- boolean acceptWithResult(Environment env) throws TemplateException, IOException {
- TemplateModel listedValue = listedExp.eval(env);
- if (listedValue == null) {
- listedExp.assertNonNull(null, env);
- }
-
- return env.visitIteratorBlock(new IterationContext(listedValue, loopVarName, loopVar2Name));
- }
-
- /**
- * @param loopVariableName
- * Then name of the loop variable whose context we are looking for, or {@code null} if we simply look for
- * the innermost context.
- * @return The matching context or {@code null} if no such context exists.
- */
- static IterationContext findEnclosingIterationContext(Environment env, String loopVariableName)
- throws _MiscTemplateException {
- LocalContextStack ctxStack = env.getLocalContextStack();
- if (ctxStack != null) {
- for (int i = ctxStack.size() - 1; i >= 0; i--) {
- Object ctx = ctxStack.get(i);
- if (ctx instanceof IterationContext
- && (loopVariableName == null
- || loopVariableName.equals(((IterationContext) ctx).getLoopVariableName())
- || loopVariableName.equals(((IterationContext) ctx).getLoopVariable2Name())
- )) {
- return (IterationContext) ctx;
- }
- }
- }
- return null;
- }
-
- @Override
- protected String dump(boolean canonical) {
- StringBuilder buf = new StringBuilder();
- if (canonical) buf.append('<');
- buf.append(getNodeTypeSymbol());
- buf.append(' ');
- if (forEach) {
- buf.append(_CoreStringUtils.toFTLTopLevelIdentifierReference(loopVarName));
- buf.append(" in ");
- buf.append(listedExp.getCanonicalForm());
- } else {
- buf.append(listedExp.getCanonicalForm());
- if (loopVarName != null) {
- buf.append(" as ");
- buf.append(_CoreStringUtils.toFTLTopLevelIdentifierReference(loopVarName));
- if (loopVar2Name != null) {
- buf.append(", ");
- buf.append(_CoreStringUtils.toFTLTopLevelIdentifierReference(loopVar2Name));
- }
- }
- }
- if (canonical) {
- buf.append(">");
- buf.append(getChildrenCanonicalForm());
- if (!(getParentElement() instanceof ListElseContainer)) {
- buf.append("</");
- buf.append(getNodeTypeSymbol());
- buf.append('>');
- }
- }
- return buf.toString();
- }
-
- @Override
- int getParameterCount() {
- return 1 + (loopVarName != null ? 1 : 0) + (loopVar2Name != null ? 1 : 0);
- }
-
- @Override
- Object getParameterValue(int idx) {
- switch (idx) {
- case 0:
- return listedExp;
- case 1:
- if (loopVarName == null) throw new IndexOutOfBoundsException();
- return loopVarName;
- case 2:
- if (loopVar2Name == null) throw new IndexOutOfBoundsException();
- return loopVar2Name;
- default: throw new IndexOutOfBoundsException();
- }
- }
-
- @Override
- ParameterRole getParameterRole(int idx) {
- switch (idx) {
- case 0:
- return ParameterRole.LIST_SOURCE;
- case 1:
- if (loopVarName == null) throw new IndexOutOfBoundsException();
- return ParameterRole.TARGET_LOOP_VARIABLE;
- case 2:
- if (loopVar2Name == null) throw new IndexOutOfBoundsException();
- return ParameterRole.TARGET_LOOP_VARIABLE;
- default: throw new IndexOutOfBoundsException();
- }
- }
-
- @Override
- String getNodeTypeSymbol() {
- return forEach ? "#foreach" : "#list";
- }
-
- @Override
- boolean isNestedBlockRepeater() {
- return loopVarName != null;
- }
-
- /**
- * Holds the context of a #list (or #forEach) directive.
- */
- class IterationContext implements LocalContext {
-
- private static final String LOOP_STATE_HAS_NEXT = "_has_next"; // lenght: 9
- private static final String LOOP_STATE_INDEX = "_index"; // length 6
-
- private Object openedIterator;
- private boolean hasNext;
- private TemplateModel loopVar;
- private TemplateModel loopVar2;
- private int index;
- private boolean alreadyEntered;
- private Collection localVarNames = null;
-
- /** If the {@code #list} has nested {@code #items}, it's {@code null} outside the {@code #items}. */
- private String loopVarName;
- /** Used if we list key-value pairs */
- private String loopVar2Name;
-
- private final TemplateModel listedValue;
-
- public IterationContext(TemplateModel listedValue, String loopVarName, String loopVar2Name) {
- this.listedValue = listedValue;
- this.loopVarName = loopVarName;
- this.loopVar2Name = loopVar2Name;
- }
-
- boolean accept(Environment env) throws TemplateException, IOException {
- return executeNestedContent(env, getChildBuffer());
- }
-
- void loopForItemsElement(Environment env, TemplateElement[] childBuffer, String loopVarName, String loopVar2Name)
- throws NonSequenceOrCollectionException, TemplateModelException, InvalidReferenceException,
- TemplateException, IOException {
- try {
- if (alreadyEntered) {
- throw new _MiscTemplateException(env,
- "The #items directive was already entered earlier for this listing.");
- }
- alreadyEntered = true;
- this.loopVarName = loopVarName;
- this.loopVar2Name = loopVar2Name;
- executeNestedContent(env, childBuffer);
- } finally {
- this.loopVarName = null;
- this.loopVar2Name = null;
- }
- }
-
- /**
- * Executes the given block for the {@link #listedValue}: if {@link #loopVarName} is non-{@code null}, then for
- * each list item once, otherwise once if {@link #listedValue} isn't empty.
- */
- private boolean executeNestedContent(Environment env, TemplateElement[] childBuffer)
- throws TemplateModelException, TemplateException, IOException, NonSequenceOrCollectionException,
- InvalidReferenceException {
- return !hashListing
- ? executedNestedContentForCollOrSeqListing(env, childBuffer)
- : executedNestedContentForHashListing(env, childBuffer);
- }
-
- private boolean executedNestedContentForCollOrSeqListing(Environment env, TemplateElement[] childBuffer)
- throws TemplateModelException, IOException, TemplateException,
- NonSequenceOrCollectionException, InvalidReferenceException {
- final boolean listNotEmpty;
- if (listedValue instanceof TemplateCollectionModel) {
- final TemplateCollectionModel collModel = (TemplateCollectionModel) listedValue;
- final TemplateModelIterator iterModel
- = openedIterator == null ? collModel.iterator()
- : ((TemplateModelIterator) openedIterator);
- listNotEmpty = iterModel.hasNext();
- if (listNotEmpty) {
- if (loopVarName != null) {
- try {
- do {
- loopVar = iterModel.next();
- hasNext = iterModel.hasNext();
- env.visit(childBuffer);
- index++;
- } while (hasNext);
- } catch (BreakInstruction.Break br) {
- // Silently exit loop
- }
- openedIterator = null;
- } else {
- // We must reuse this later, because TemplateCollectionModel-s that wrap an Iterator only
- // allow one iterator() call.
- openedIterator = iterModel;
- env.visit(childBuffer);
- }
- }
- } else if (listedValue instanceof TemplateSequenceModel) {
- final TemplateSequenceModel seqModel = (TemplateSequenceModel) listedValue;
- final int size = seqModel.size();
- listNotEmpty = size != 0;
- if (listNotEmpty) {
- if (loopVarName != null) {
- try {
- for (index = 0; index < size; index++) {
- loopVar = seqModel.get(index);
- hasNext = (size > index + 1);
- env.visit(childBuffer);
- }
- } catch (BreakInstruction.Break br) {
- // Silently exit loop
- }
- } else {
- env.visit(childBuffer);
- }
- }
- } else if (listedValue instanceof TemplateHashModelEx
- && !NonSequenceOrCollectionException.isWrappedIterable(listedValue)) {
- throw new NonSequenceOrCollectionException(env,
- new _ErrorDescriptionBuilder("The value you try to list is ",
- new _DelayedAOrAn(new _DelayedFTLTypeDescription(listedValue)),
- ", thus you must specify two loop variables after the \"as\"; one for the key, and "
- + "another for the value, like ", "<#... as k, v>", ")."
- ));
- } else {
- throw new NonSequenceOrCollectionException(
- listedExp, listedValue, env);
- }
- return listNotEmpty;
- }
-
- private boolean executedNestedContentForHashListing(Environment env, TemplateElement[] childBuffer)
- throws TemplateModelException, IOException, TemplateException {
- final boolean hashNotEmpty;
- if (listedValue instanceof TemplateHashModelEx) {
- TemplateHashModelEx listedHash = (TemplateHashModelEx) listedValue;
- if (listedHash instanceof TemplateHashModelEx2) {
- KeyValuePairIterator kvpIter
- = openedIterator == null ? ((TemplateHashModelEx2) listedHash).keyValuePairIterator()
- : (KeyValuePairIterator) openedIterator;
- hashNotEmpty = kvpIter.hasNext();
- if (hashNotEmpty) {
- if (loopVarName != null) {
- try {
- do {
- KeyValuePair kvp = kvpIter.next();
- loopVar = kvp.getKey();
- loopVar2 = kvp.getValue();
- hasNext = kvpIter.hasNext();
- env.visit(childBuffer);
- index++;
- } while (hasNext);
- } catch (BreakInstruction.Break br) {
- // Silently exit loop
- }
- openedIterator = null;
- } else {
- // We will reuse this at the #iterms
- openedIterator = kvpIter;
- env.visit(childBuffer);
- }
- }
- } else { // not a TemplateHashModelEx2, but still a TemplateHashModelEx
- TemplateModelIterator keysIter = listedHash.keys().iterator();
- hashNotEmpty = keysIter.hasNext();
- if (hashNotEmpty) {
- if (loopVarName != null) {
- try {
- do {
- loopVar = keysIter.next();
- if (!(loopVar instanceof TemplateScalarModel)) {
- throw new NonStringException(env,
- new _ErrorDescriptionBuilder(
- "When listing key-value pairs of traditional hash "
- + "implementations, all keys must be strings, but one of them "
- + "was ",
- new _DelayedAOrAn(new _DelayedFTLTypeDescription(loopVar)), "."
- ).tip("The listed value's TemplateModel class was ",
- new _DelayedShortClassName(listedValue.getClass()),
- ", which doesn't implement ",
- new _DelayedShortClassName(TemplateHashModelEx2.class),
- ", which leads to this restriction."));
- }
- loopVar2 = listedHash.get(((TemplateScalarModel) loopVar).getAsString());
- hasNext = keysIter.hasNext();
- env.visit(childBuffer);
- index++;
- } while (hasNext);
- } catch (BreakInstruction.Break br) {
- // Silently exit loop
- }
- } else {
- env.visit(childBuffer);
- }
- }
- }
- } else if (listedValue instanceof TemplateCollectionModel
- || listedValue instanceof TemplateSequenceModel) {
- throw new NonSequenceOrCollectionException(env,
- new _ErrorDescriptionBuilder("The value you try to list is ",
- new _DelayedAOrAn(new _DelayedFTLTypeDescription(listedValue)),
- ", thus you must specify only one loop variable after the \"as\" (there's no separate "
- + "key and value)."
- ));
- } else {
- throw new NonExtendedHashException(
- listedExp, listedValue, env);
- }
- return hashNotEmpty;
- }
-
- String getLoopVariableName() {
- return this.loopVarName;
- }
-
- String getLoopVariable2Name() {
- return this.loopVar2Name;
- }
-
- @Override
- public TemplateModel getLocalVariable(String name) {
- String loopVariableName = this.loopVarName;
- if (loopVariableName != null && name.startsWith(loopVariableName)) {
- switch(name.length() - loopVariableName.length()) {
- case 0:
- return loopVar;
- case 6:
- if (name.endsWith(LOOP_STATE_INDEX)) {
- return new SimpleNumber(index);
- }
- break;
- case 9:
- if (name.endsWith(LOOP_STATE_HAS_NEXT)) {
- return hasNext ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
- }
- break;
- }
- }
-
- if (name.equals(loopVar2Name)) {
- return loopVar2;
- }
-
- return null;
- }
-
- @Override
- public Collection getLocalVariableNames() {
- String loopVariableName = this.loopVarName;
- if (loopVariableName != null) {
- if (localVarNames == null) {
- localVarNames = new ArrayList(3);
- localVarNames.add(loopVariableName);
- localVarNames.add(loopVariableName + LOOP_STATE_INDEX);
- localVarNames.add(loopVariableName + LOOP_STATE_HAS_NEXT);
- }
- return localVarNames;
- } else {
- return Collections.EMPTY_LIST;
- }
- }
-
- boolean hasNext() {
- return hasNext;
- }
-
- int getIndex() {
- return index;
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/JSONOutputFormat.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JSONOutputFormat.java b/src/main/java/freemarker/core/JSONOutputFormat.java
deleted file mode 100644
index 8577198..0000000
--- a/src/main/java/freemarker/core/JSONOutputFormat.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 freemarker.core;
-
-/**
- * Represents the JSON output format (MIME type "application/json", name "JSON"). This format doesn't support escaping.
- *
- * @since 2.3.24
- */
-public class JSONOutputFormat extends OutputFormat {
-
- /**
- * The only instance (singleton) of this {@link OutputFormat}.
- */
- public static final JSONOutputFormat INSTANCE = new JSONOutputFormat();
-
- private JSONOutputFormat() {
- // Only to decrease visibility
- }
-
- @Override
- public String getName() {
- return "JSON";
- }
-
- @Override
- public String getMimeType() {
- return "application/json";
- }
-
- @Override
- public boolean isOutputFormatMixingAllowed() {
- return false;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/JavaScriptOutputFormat.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JavaScriptOutputFormat.java b/src/main/java/freemarker/core/JavaScriptOutputFormat.java
deleted file mode 100644
index c766af9..0000000
--- a/src/main/java/freemarker/core/JavaScriptOutputFormat.java
+++ /dev/null
@@ -1,53 +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 freemarker.core;
-
-/**
- * Represents the JavaScript output format (MIME type "application/javascript", name "JavaScript"). This format doesn't
- * support escaping.
- *
- * @since 2.3.24
- */
-public class JavaScriptOutputFormat extends OutputFormat {
-
- /**
- * The only instance (singleton) of this {@link OutputFormat}.
- */
- public static final JavaScriptOutputFormat INSTANCE = new JavaScriptOutputFormat();
-
- private JavaScriptOutputFormat() {
- // Only to decrease visibility
- }
-
- @Override
- public String getName() {
- return "JavaScript";
- }
-
- @Override
- public String getMimeType() {
- return "application/javascript";
- }
-
- @Override
- public boolean isOutputFormatMixingAllowed() {
- return false;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/JavaTemplateDateFormat.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormat.java b/src/main/java/freemarker/core/JavaTemplateDateFormat.java
deleted file mode 100644
index 1b630ae..0000000
--- a/src/main/java/freemarker/core/JavaTemplateDateFormat.java
+++ /dev/null
@@ -1,72 +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 freemarker.core;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import freemarker.template.TemplateDateModel;
-import freemarker.template.TemplateModelException;
-
-/**
- * Java {@link DateFormat}-based format.
- */
-class JavaTemplateDateFormat extends TemplateDateFormat {
-
- private final DateFormat javaDateFormat;
-
- public JavaTemplateDateFormat(DateFormat javaDateFormat) {
- this.javaDateFormat = javaDateFormat;
- }
-
- @Override
- public String formatToPlainText(TemplateDateModel dateModel) throws TemplateModelException {
- return javaDateFormat.format(TemplateFormatUtil.getNonNullDate(dateModel));
- }
-
- @Override
- public Date parse(String s, int dateType) throws UnparsableValueException {
- try {
- return javaDateFormat.parse(s);
- } catch (ParseException e) {
- throw new UnparsableValueException(e.getMessage(), e);
- }
- }
-
- @Override
- public String getDescription() {
- return javaDateFormat instanceof SimpleDateFormat
- ? ((SimpleDateFormat) javaDateFormat).toPattern()
- : javaDateFormat.toString();
- }
-
- @Override
- public boolean isLocaleBound() {
- return true;
- }
-
- @Override
- public boolean isTimeZoneBound() {
- return true;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java b/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
deleted file mode 100644
index c8d851f..0000000
--- a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
+++ /dev/null
@@ -1,175 +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 freemarker.core;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
-import java.util.StringTokenizer;
-import java.util.TimeZone;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import freemarker.template.TemplateDateModel;
-
-class JavaTemplateDateFormatFactory extends TemplateDateFormatFactory {
-
- static final JavaTemplateDateFormatFactory INSTANCE = new JavaTemplateDateFormatFactory();
-
- private static final Logger LOG = LoggerFactory.getLogger("freemarker.runtime");
-
- private static final ConcurrentHashMap<CacheKey, DateFormat> GLOBAL_FORMAT_CACHE
- = new ConcurrentHashMap<CacheKey, DateFormat>();
- private static final int LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE = 1024;
-
- private JavaTemplateDateFormatFactory() {
- // Can't be instantiated
- }
-
- /**
- * @param zonelessInput
- * Has no effect in this implementation.
- */
- @Override
- public TemplateDateFormat get(String params, int dateType, Locale locale, TimeZone timeZone, boolean zonelessInput,
- Environment env) throws UnknownDateTypeFormattingUnsupportedException, InvalidFormatParametersException {
- return new JavaTemplateDateFormat(getJavaDateFormat(dateType, params, locale, timeZone));
- }
-
- /**
- * Returns a "private" copy (not in the global cache) for the given format.
- */
- private DateFormat getJavaDateFormat(int dateType, String nameOrPattern, Locale locale, TimeZone timeZone)
- throws UnknownDateTypeFormattingUnsupportedException, InvalidFormatParametersException {
-
- // Get DateFormat from global cache:
- CacheKey cacheKey = new CacheKey(dateType, nameOrPattern, locale, timeZone);
- DateFormat jFormat;
-
- jFormat = GLOBAL_FORMAT_CACHE.get(cacheKey);
- if (jFormat == null) {
- // Add format to global format cache.
- StringTokenizer tok = new StringTokenizer(nameOrPattern, "_");
- int tok1Style = tok.hasMoreTokens() ? parseDateStyleToken(tok.nextToken()) : DateFormat.DEFAULT;
- if (tok1Style != -1) {
- switch (dateType) {
- case TemplateDateModel.UNKNOWN: {
- throw new UnknownDateTypeFormattingUnsupportedException();
- }
- case TemplateDateModel.TIME: {
- jFormat = DateFormat.getTimeInstance(tok1Style, cacheKey.locale);
- break;
- }
- case TemplateDateModel.DATE: {
- jFormat = DateFormat.getDateInstance(tok1Style, cacheKey.locale);
- break;
- }
- case TemplateDateModel.DATETIME: {
- int tok2Style = tok.hasMoreTokens() ? parseDateStyleToken(tok.nextToken()) : tok1Style;
- if (tok2Style != -1) {
- jFormat = DateFormat.getDateTimeInstance(tok1Style, tok2Style, cacheKey.locale);
- }
- break;
- }
- }
- }
- if (jFormat == null) {
- try {
- jFormat = new SimpleDateFormat(nameOrPattern, cacheKey.locale);
- } catch (IllegalArgumentException e) {
- final String msg = e.getMessage();
- throw new InvalidFormatParametersException(
- msg != null ? msg : "Invalid SimpleDateFormat pattern", e);
- }
- }
- jFormat.setTimeZone(cacheKey.timeZone);
-
- if (GLOBAL_FORMAT_CACHE.size() >= LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE) {
- boolean triggered = false;
- synchronized (JavaTemplateNumberFormatFactory.class) {
- if (GLOBAL_FORMAT_CACHE.size() >= LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE) {
- triggered = true;
- GLOBAL_FORMAT_CACHE.clear();
- }
- }
- if (triggered) {
- LOG.warn("Global Java DateFormat cache has exceeded {} entries => cache flushed. "
- + "Typical cause: Some template generates high variety of format pattern strings.",
- LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE);
- }
- }
-
- DateFormat prevJFormat = GLOBAL_FORMAT_CACHE.putIfAbsent(cacheKey, jFormat);
- if (prevJFormat != null) {
- jFormat = prevJFormat;
- }
- } // if cache miss
-
- return (DateFormat) jFormat.clone(); // For thread safety
- }
-
- private static final class CacheKey {
- private final int dateType;
- private final String pattern;
- private final Locale locale;
- private final TimeZone timeZone;
-
- CacheKey(int dateType, String pattern, Locale locale, TimeZone timeZone) {
- this.dateType = dateType;
- this.pattern = pattern;
- this.locale = locale;
- this.timeZone = timeZone;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof CacheKey) {
- CacheKey fk = (CacheKey) o;
- return dateType == fk.dateType && fk.pattern.equals(pattern) && fk.locale.equals(locale)
- && fk.timeZone.equals(timeZone);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return dateType ^ pattern.hashCode() ^ locale.hashCode() ^ timeZone.hashCode();
- }
- }
-
- private int parseDateStyleToken(String token) {
- if ("short".equals(token)) {
- return DateFormat.SHORT;
- }
- if ("medium".equals(token)) {
- return DateFormat.MEDIUM;
- }
- if ("long".equals(token)) {
- return DateFormat.LONG;
- }
- if ("full".equals(token)) {
- return DateFormat.FULL;
- }
- return -1;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/JavaTemplateNumberFormat.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormat.java b/src/main/java/freemarker/core/JavaTemplateNumberFormat.java
deleted file mode 100644
index 27b85e2..0000000
--- a/src/main/java/freemarker/core/JavaTemplateNumberFormat.java
+++ /dev/null
@@ -1,66 +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 freemarker.core;
-
-import java.text.NumberFormat;
-
-import freemarker.template.TemplateModelException;
-import freemarker.template.TemplateNumberModel;
-
-final class JavaTemplateNumberFormat extends BackwardCompatibleTemplateNumberFormat {
-
- private final String formatString;
- private final NumberFormat javaNumberFormat;
-
- public JavaTemplateNumberFormat(NumberFormat javaNumberFormat, String formatString) {
- this.formatString = formatString;
- this.javaNumberFormat = javaNumberFormat;
- }
-
- @Override
- public String formatToPlainText(TemplateNumberModel numberModel) throws UnformattableValueException, TemplateModelException {
- Number number = TemplateFormatUtil.getNonNullNumber(numberModel);
- return format(number);
- }
-
- @Override
- public boolean isLocaleBound() {
- return true;
- }
-
- @Override
- String format(Number number) throws UnformattableValueException {
- try {
- return javaNumberFormat.format(number);
- } catch (ArithmeticException e) {
- throw new UnformattableValueException(
- "This format can't format the " + number + " number. Reason: " + e.getMessage(), e);
- }
- }
-
- public NumberFormat getJavaNumberFormat() {
- return javaNumberFormat;
- }
-
- @Override
- public String getDescription() {
- return formatString;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java b/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
deleted file mode 100644
index ec8db4b..0000000
--- a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
+++ /dev/null
@@ -1,121 +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 freemarker.core;
-
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.util.Locale;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Deals with {@link TemplateNumberFormat}-s that just wrap a Java {@link NumberFormat}.
- */
-class JavaTemplateNumberFormatFactory extends TemplateNumberFormatFactory {
-
- static final JavaTemplateNumberFormatFactory INSTANCE = new JavaTemplateNumberFormatFactory();
-
- private static final Logger LOG = LoggerFactory.getLogger("freemarker.runtime");
-
- private static final ConcurrentHashMap<CacheKey, NumberFormat> GLOBAL_FORMAT_CACHE
- = new ConcurrentHashMap<CacheKey, NumberFormat>();
- private static final int LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE = 1024;
-
- private JavaTemplateNumberFormatFactory() {
- // Not meant to be instantiated
- }
-
- @Override
- public TemplateNumberFormat get(String params, Locale locale, Environment env)
- throws InvalidFormatParametersException {
- CacheKey cacheKey = new CacheKey(params, locale);
- NumberFormat jFormat = GLOBAL_FORMAT_CACHE.get(cacheKey);
- if (jFormat == null) {
- if ("number".equals(params)) {
- jFormat = NumberFormat.getNumberInstance(locale);
- } else if ("currency".equals(params)) {
- jFormat = NumberFormat.getCurrencyInstance(locale);
- } else if ("percent".equals(params)) {
- jFormat = NumberFormat.getPercentInstance(locale);
- } else if ("computer".equals(params)) {
- jFormat = env.getCNumberFormat();
- } else {
- try {
- jFormat = ExtendedDecimalFormatParser.parse(params, locale);
- } catch (ParseException e) {
- String msg = e.getMessage();
- throw new InvalidFormatParametersException(
- msg != null ? msg : "Invalid DecimalFormat pattern", e);
- }
- }
-
- if (GLOBAL_FORMAT_CACHE.size() >= LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE) {
- boolean triggered = false;
- synchronized (JavaTemplateNumberFormatFactory.class) {
- if (GLOBAL_FORMAT_CACHE.size() >= LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE) {
- triggered = true;
- GLOBAL_FORMAT_CACHE.clear();
- }
- }
- if (triggered) {
- LOG.warn("Global Java NumberFormat cache has exceeded {} entries => cache flushed. "
- + "Typical cause: Some template generates high variety of format pattern strings.",
- LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE);
- }
- }
-
- NumberFormat prevJFormat = GLOBAL_FORMAT_CACHE.putIfAbsent(cacheKey, jFormat);
- if (prevJFormat != null) {
- jFormat = prevJFormat;
- }
- } // if cache miss
-
- // JFormat-s aren't thread-safe; must clone it
- jFormat = (NumberFormat) jFormat.clone();
-
- return new JavaTemplateNumberFormat(jFormat, params);
- }
-
- private static final class CacheKey {
- private final String pattern;
- private final Locale locale;
-
- CacheKey(String pattern, Locale locale) {
- this.pattern = pattern;
- this.locale = locale;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o instanceof CacheKey) {
- CacheKey fk = (CacheKey) o;
- return fk.pattern.equals(pattern) && fk.locale.equals(locale);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return pattern.hashCode() ^ locale.hashCode();
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/LibraryLoad.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/LibraryLoad.java b/src/main/java/freemarker/core/LibraryLoad.java
deleted file mode 100644
index 8d71b6a..0000000
--- a/src/main/java/freemarker/core/LibraryLoad.java
+++ /dev/null
@@ -1,130 +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 freemarker.core;
-
-import java.io.IOException;
-
-import freemarker.template.MalformedTemplateNameException;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-
-/**
- * <b>Internal API - subject to change:</b> Represents an import via {@code #import}.
- *
- * @deprecated This is an internal FreeMarker API with no backward compatibility guarantees, so you shouldn't depend on
- * it.
- */
-@Deprecated
-public final class LibraryLoad extends TemplateElement {
-
- private Expression importedTemplateNameExp;
- private String targetNsVarName;
-
- /**
- * @param template the template that this <tt>Include</tt> is a part of.
- * @param templateName the name of the template to be included.
- * @param targetNsVarName the name of the variable to assign this library's namespace to
- */
- LibraryLoad(Template template,
- Expression templateName,
- String targetNsVarName) {
- this.targetNsVarName = targetNsVarName;
- this.importedTemplateNameExp = templateName;
- }
-
- @Override
- TemplateElement[] accept(Environment env) throws TemplateException, IOException {
- final String importedTemplateName = importedTemplateNameExp.evalAndCoerceToPlainText(env);
- final String fullImportedTemplateName;
- try {
- fullImportedTemplateName = env.toFullTemplateName(getTemplate().getName(), importedTemplateName);
- } catch (MalformedTemplateNameException e) {
- throw new _MiscTemplateException(e, env,
- "Malformed template name ", new _DelayedJQuote(e.getTemplateName()), ":\n",
- e.getMalformednessDescription());
- }
-
- try {
- env.importLib(fullImportedTemplateName, targetNsVarName);
- } catch (IOException e) {
- throw new _MiscTemplateException(e, env,
- "Template importing failed (for parameter value ",
- new _DelayedJQuote(importedTemplateName),
- "):\n", new _DelayedGetMessage(e));
- }
- return null;
- }
-
- @Override
- protected String dump(boolean canonical) {
- StringBuilder buf = new StringBuilder();
- if (canonical) buf.append('<');
- buf.append(getNodeTypeSymbol());
- buf.append(' ');
- buf.append(importedTemplateNameExp.getCanonicalForm());
- buf.append(" as ");
- buf.append(_CoreStringUtils.toFTLTopLevelTragetIdentifier(targetNsVarName));
- if (canonical) buf.append("/>");
- return buf.toString();
- }
-
- @Override
- String getNodeTypeSymbol() {
- return "#import";
- }
-
- @Override
- int getParameterCount() {
- return 2;
- }
-
- @Override
- Object getParameterValue(int idx) {
- switch (idx) {
- case 0: return importedTemplateNameExp;
- case 1: return targetNsVarName;
- default: throw new IndexOutOfBoundsException();
- }
- }
-
- @Override
- ParameterRole getParameterRole(int idx) {
- switch (idx) {
- case 0: return ParameterRole.TEMPLATE_NAME;
- case 1: return ParameterRole.NAMESPACE;
- default: throw new IndexOutOfBoundsException();
- }
- }
-
- public String getTemplateName() {
- return importedTemplateNameExp.toString();
- }
-
- @Override
- boolean isNestedBlockRepeater() {
- return false;
- }
-
- @Override
- boolean isShownInStackTrace() {
- return true;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/ListElseContainer.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/ListElseContainer.java b/src/main/java/freemarker/core/ListElseContainer.java
deleted file mode 100644
index 1065e9e..0000000
--- a/src/main/java/freemarker/core/ListElseContainer.java
+++ /dev/null
@@ -1,87 +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 freemarker.core;
-
-import java.io.IOException;
-
-import freemarker.template.TemplateException;
-
-class ListElseContainer extends TemplateElement {
-
- private final IteratorBlock listPart;
- private final ElseOfList elsePart;
-
- public ListElseContainer(IteratorBlock listPart, ElseOfList elsePart) {
- setChildBufferCapacity(2);
- addChild(listPart);
- addChild(elsePart);
- this.listPart = listPart;
- this.elsePart = elsePart;
- }
-
- @Override
- TemplateElement[] accept(Environment env) throws TemplateException, IOException {
- if (!listPart.acceptWithResult(env)) {
- return elsePart.accept(env);
- }
- return null;
- }
-
- @Override
- boolean isNestedBlockRepeater() {
- return false;
- }
-
- @Override
- protected String dump(boolean canonical) {
- if (canonical) {
- StringBuilder buf = new StringBuilder();
- int ln = getChildCount();
- for (int i = 0; i < ln; i++) {
- TemplateElement element = getChild(i);
- buf.append(element.dump(canonical));
- }
- buf.append("</#list>");
- return buf.toString();
- } else {
- return getNodeTypeSymbol();
- }
- }
-
- @Override
- String getNodeTypeSymbol() {
- return "#list-#else-container";
- }
-
- @Override
- int getParameterCount() {
- return 0;
- }
-
- @Override
- Object getParameterValue(int idx) {
- throw new IndexOutOfBoundsException();
- }
-
- @Override
- ParameterRole getParameterRole(int idx) {
- throw new IndexOutOfBoundsException();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/ListLiteral.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/ListLiteral.java b/src/main/java/freemarker/core/ListLiteral.java
deleted file mode 100644
index 92eba2e..0000000
--- a/src/main/java/freemarker/core/ListLiteral.java
+++ /dev/null
@@ -1,196 +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 freemarker.core;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-
-import freemarker.template.SimpleSequence;
-import freemarker.template.TemplateException;
-import freemarker.template.TemplateMethodModel;
-import freemarker.template.TemplateMethodModelEx;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateSequenceModel;
-
-final class ListLiteral extends Expression {
-
- final ArrayList/*<Expression>*/ items;
-
- ListLiteral(ArrayList items) {
- this.items = items;
- items.trimToSize();
- }
-
- @Override
- TemplateModel _eval(Environment env) throws TemplateException {
- SimpleSequence list = new SimpleSequence(items.size());
- for (Iterator it = items.iterator(); it.hasNext(); ) {
- Expression exp = (Expression) it.next();
- TemplateModel tm = exp.eval(env);
- exp.assertNonNull(tm, env);
- list.add(tm);
- }
- return list;
- }
-
- /**
- * For {@link TemplateMethodModel} calls, but not for {@link TemplateMethodModelEx}-es, returns the list of
- * arguments as {@link String}-s.
- */
- List/*<String>*/ getValueList(Environment env) throws TemplateException {
- int size = items.size();
- switch(size) {
- case 0: {
- return Collections.EMPTY_LIST;
- }
- case 1: {
- return Collections.singletonList(((Expression) items.get(0)).evalAndCoerceToPlainText(env));
- }
- default: {
- List result = new ArrayList(items.size());
- for (ListIterator iterator = items.listIterator(); iterator.hasNext(); ) {
- Expression exp = (Expression) iterator.next();
- result.add(exp.evalAndCoerceToPlainText(env));
- }
- return result;
- }
- }
- }
-
- /**
- * For {@link TemplateMethodModelEx} calls, returns the list of arguments as {@link TemplateModel}-s.
- */
- List/*<TemplateModel>*/ getModelList(Environment env) throws TemplateException {
- int size = items.size();
- switch(size) {
- case 0: {
- return Collections.EMPTY_LIST;
- }
- case 1: {
- return Collections.singletonList(((Expression) items.get(0)).eval(env));
- }
- default: {
- List result = new ArrayList(items.size());
- for (ListIterator iterator = items.listIterator(); iterator.hasNext(); ) {
- Expression exp = (Expression) iterator.next();
- result.add(exp.eval(env));
- }
- return result;
- }
- }
- }
-
- @Override
- public String getCanonicalForm() {
- StringBuilder buf = new StringBuilder("[");
- int size = items.size();
- for (int i = 0; i < size; i++) {
- Expression value = (Expression) items.get(i);
- buf.append(value.getCanonicalForm());
- if (i != size - 1) {
- buf.append(", ");
- }
- }
- buf.append("]");
- return buf.toString();
- }
-
- @Override
- String getNodeTypeSymbol() {
- return "[...]";
- }
-
- @Override
- boolean isLiteral() {
- if (constantValue != null) {
- return true;
- }
- for (int i = 0; i < items.size(); i++) {
- Expression exp = (Expression) items.get(i);
- if (!exp.isLiteral()) {
- return false;
- }
- }
- return true;
- }
-
- // A hacky routine used by VisitNode and RecurseNode
-
- TemplateSequenceModel evaluateStringsToNamespaces(Environment env) throws TemplateException {
- TemplateSequenceModel val = (TemplateSequenceModel) eval(env);
- SimpleSequence result = new SimpleSequence(val.size());
- for (int i = 0; i < items.size(); i++) {
- Object itemExpr = items.get(i);
- if (itemExpr instanceof StringLiteral) {
- String s = ((StringLiteral) itemExpr).getAsString();
- try {
- Environment.Namespace ns = env.importLib(s, null);
- result.add(ns);
- } catch (IOException ioe) {
- throw new _MiscTemplateException(((StringLiteral) itemExpr),
- "Couldn't import library ", new _DelayedJQuote(s), ": ",
- new _DelayedGetMessage(ioe));
- }
- } else {
- result.add(val.get(i));
- }
- }
- return result;
- }
-
- @Override
- protected Expression deepCloneWithIdentifierReplaced_inner(
- String replacedIdentifier, Expression replacement, ReplacemenetState replacementState) {
- ArrayList clonedValues = (ArrayList) items.clone();
- for (ListIterator iter = clonedValues.listIterator(); iter.hasNext(); ) {
- iter.set(((Expression) iter.next()).deepCloneWithIdentifierReplaced(
- replacedIdentifier, replacement, replacementState));
- }
- return new ListLiteral(clonedValues);
- }
-
- @Override
- int getParameterCount() {
- return items != null ? items.size() : 0;
- }
-
- @Override
- Object getParameterValue(int idx) {
- checkIndex(idx);
- return items.get(idx);
- }
-
- @Override
- ParameterRole getParameterRole(int idx) {
- checkIndex(idx);
- return ParameterRole.ITEM_VALUE;
- }
-
- private void checkIndex(int idx) {
- if (items == null || idx >= items.size()) {
- throw new IndexOutOfBoundsException();
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java b/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
deleted file mode 100644
index 2cf979c..0000000
--- a/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
+++ /dev/null
@@ -1,93 +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 freemarker.core;
-
-import java.math.BigInteger;
-
-import freemarker.template.SimpleNumber;
-import freemarker.template.TemplateCollectionModel;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.TemplateModelIterator;
-
-/**
- * This is the model used for right-unbounded ranges since Incompatible Improvements 2.3.21.
- *
- * @since 2.3.21
- */
-final class ListableRightUnboundedRangeModel extends RightUnboundedRangeModel implements TemplateCollectionModel {
-
- ListableRightUnboundedRangeModel(int begin) {
- super(begin);
- }
-
- public int size() throws TemplateModelException {
- return Integer.MAX_VALUE;
- }
-
- public TemplateModelIterator iterator() throws TemplateModelException {
- return new TemplateModelIterator() {
- boolean needInc;
- int nextType = 1;
- int nextInt = getBegining();
- long nextLong;
- BigInteger nextBigInteger;
-
- public TemplateModel next() throws TemplateModelException {
- if (needInc) {
- switch (nextType) {
- case 1:
- if (nextInt < Integer.MAX_VALUE) {
- nextInt++;
- } else {
- nextType = 2;
- nextLong = nextInt + 1L;
- }
- break;
-
- case 2:
- if (nextLong < Long.MAX_VALUE) {
- nextLong++;
- } else {
- nextType = 3;
- nextBigInteger = BigInteger.valueOf(nextLong);
- nextBigInteger = nextBigInteger.add(BigInteger.ONE);
- }
- break;
-
- default: // 3
- nextBigInteger = nextBigInteger.add(BigInteger.ONE);
- }
- }
- needInc = true;
- return nextType == 1 ? new SimpleNumber(nextInt)
- : (nextType == 2 ? new SimpleNumber(nextLong)
- : new SimpleNumber(nextBigInteger));
- }
-
- public boolean hasNext() throws TemplateModelException {
- return true;
- }
-
- };
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/LocalContext.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/LocalContext.java b/src/main/java/freemarker/core/LocalContext.java
deleted file mode 100644
index 95f7ce0..0000000
--- a/src/main/java/freemarker/core/LocalContext.java
+++ /dev/null
@@ -1,38 +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 freemarker.core;
-
-import java.util.Collection;
-
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-
-/**
- * An interface that represents a local context. This is used as the abstraction for
- * the context of a Macro invocation, a loop, or the nested block call from within
- * a macro.
- * <a href="mailto:jon@revusky.com">Jonathan Revusky</a>
- */
-
-public interface LocalContext {
- TemplateModel getLocalVariable(String name) throws TemplateModelException;
- Collection getLocalVariableNames() throws TemplateModelException;
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/LocalContextStack.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/LocalContextStack.java b/src/main/java/freemarker/core/LocalContextStack.java
deleted file mode 100644
index c22a09f..0000000
--- a/src/main/java/freemarker/core/LocalContextStack.java
+++ /dev/null
@@ -1,57 +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 freemarker.core;
-
-/**
- * Class that's a little bit more efficient than using an {@code ArrayList<LocalContext>}.
- *
- * @since 2.3.24
- */
-final class LocalContextStack {
-
- private LocalContext[] buffer = new LocalContext[8];
- private int size;
-
- void push(LocalContext localContext) {
- final int newSize = ++size;
- LocalContext[] buffer = this.buffer;
- if (buffer.length < newSize) {
- final LocalContext[] newBuffer = new LocalContext[newSize * 2];
- for (int i = 0; i < buffer.length; i++) {
- newBuffer[i] = buffer[i];
- }
- buffer = newBuffer;
- this.buffer = newBuffer;
- }
- buffer[newSize - 1] = localContext;
- }
-
- void pop() {
- buffer[--size] = null;
- }
-
- public LocalContext get(int index) {
- return buffer[index];
- }
-
- public int size() {
- return size;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/Macro.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/Macro.java b/src/main/java/freemarker/core/Macro.java
deleted file mode 100644
index 16f2c53..0000000
--- a/src/main/java/freemarker/core/Macro.java
+++ /dev/null
@@ -1,329 +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 freemarker.core;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-import freemarker.template.TemplateException;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.TemplateModelIterator;
-
-/**
- * An element representing a macro declaration.
- *
- * @deprecated Subject to be changed or renamed any time; no "stable" replacement exists yet.
- */
-@Deprecated
-public final class Macro extends TemplateElement implements TemplateModel {
-
- static final Macro DO_NOTHING_MACRO = new Macro(".pass",
- Collections.EMPTY_LIST,
- Collections.EMPTY_MAP,
- null, false,
- TemplateElements.EMPTY);
-
- final static int TYPE_MACRO = 0;
- final static int TYPE_FUNCTION = 1;
-
- private final String name;
- private final String[] paramNames;
- private final Map paramDefaults;
- private final String catchAllParamName;
- private final boolean function;
-
- Macro(String name, List argumentNames, Map args,
- String catchAllParamName, boolean function,
- TemplateElements children) {
- this.name = name;
- this.paramNames = (String[]) argumentNames.toArray(
- new String[argumentNames.size()]);
- this.paramDefaults = args;
-
- this.function = function;
- this.catchAllParamName = catchAllParamName;
-
- this.setChildren(children);
- }
-
- public String getCatchAll() {
- return catchAllParamName;
- }
-
- public String[] getArgumentNames() {
- return paramNames.clone();
- }
-
- String[] getArgumentNamesInternal() {
- return paramNames;
- }
-
- boolean hasArgNamed(String name) {
- return paramDefaults.containsKey(name);
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- TemplateElement[] accept(Environment env) {
- env.visitMacroDef(this);
- return null;
- }
-
- @Override
- protected String dump(boolean canonical) {
- StringBuilder sb = new StringBuilder();
- if (canonical) sb.append('<');
- sb.append(getNodeTypeSymbol());
- sb.append(' ');
- sb.append(_CoreStringUtils.toFTLTopLevelTragetIdentifier(name));
- if (function) sb.append('(');
- int argCnt = paramNames.length;
- for (int i = 0; i < argCnt; i++) {
- if (function) {
- if (i != 0) {
- sb.append(", ");
- }
- } else {
- sb.append(' ');
- }
- String argName = paramNames[i];
- sb.append(_CoreStringUtils.toFTLTopLevelIdentifierReference(argName));
- if (paramDefaults != null && paramDefaults.get(argName) != null) {
- sb.append('=');
- Expression defaultExpr = (Expression) paramDefaults.get(argName);
- if (function) {
- sb.append(defaultExpr.getCanonicalForm());
- } else {
- MessageUtil.appendExpressionAsUntearable(sb, defaultExpr);
- }
- }
- }
- if (catchAllParamName != null) {
- if (function) {
- if (argCnt != 0) {
- sb.append(", ");
- }
- } else {
- sb.append(' ');
- }
- sb.append(catchAllParamName);
- sb.append("...");
- }
- if (function) sb.append(')');
- if (canonical) {
- sb.append('>');
- sb.append(getChildrenCanonicalForm());
- sb.append("</").append(getNodeTypeSymbol()).append('>');
- }
- return sb.toString();
- }
-
- @Override
- String getNodeTypeSymbol() {
- return function ? "#function" : "#macro";
- }
-
- public boolean isFunction() {
- return function;
- }
-
- class Context implements LocalContext {
- final Environment.Namespace localVars;
- final TemplateElement[] nestedContentBuffer;
- final Environment.Namespace nestedContentNamespace;
- final List nestedContentParameterNames;
- final LocalContextStack prevLocalContextStack;
- final Context prevMacroContext;
-
- Context(Environment env,
- TemplateElement[] nestedContentBuffer,
- List nestedContentParameterNames) {
- this.localVars = env.new Namespace();
- this.nestedContentBuffer = nestedContentBuffer;
- this.nestedContentNamespace = env.getCurrentNamespace();
- this.nestedContentParameterNames = nestedContentParameterNames;
- this.prevLocalContextStack = env.getLocalContextStack();
- this.prevMacroContext = env.getCurrentMacroContext();
- }
-
-
- Macro getMacro() {
- return Macro.this;
- }
-
- // Set default parameters, check if all the required parameters are defined.
- void sanityCheck(Environment env) throws TemplateException {
- boolean resolvedAnArg, hasUnresolvedArg;
- Expression firstUnresolvedExpression;
- InvalidReferenceException firstReferenceException;
- do {
- firstUnresolvedExpression = null;
- firstReferenceException = null;
- resolvedAnArg = hasUnresolvedArg = false;
- for (int i = 0; i < paramNames.length; ++i) {
- String argName = paramNames[i];
- if (localVars.get(argName) == null) {
- Expression valueExp = (Expression) paramDefaults.get(argName);
- if (valueExp != null) {
- try {
- TemplateModel tm = valueExp.eval(env);
- if (tm == null) {
- if (!hasUnresolvedArg) {
- firstUnresolvedExpression = valueExp;
- hasUnresolvedArg = true;
- }
- } else {
- localVars.put(argName, tm);
- resolvedAnArg = true;
- }
- } catch (InvalidReferenceException e) {
- if (!hasUnresolvedArg) {
- hasUnresolvedArg = true;
- firstReferenceException = e;
- }
- }
- } else {
- boolean argWasSpecified = localVars.containsKey(argName);
- throw new _MiscTemplateException(env,
- new _ErrorDescriptionBuilder(
- "When calling macro ", new _DelayedJQuote(name),
- ", required parameter ", new _DelayedJQuote(argName),
- " (parameter #", Integer.valueOf(i + 1), ") was ",
- (argWasSpecified
- ? "specified, but had null/missing value."
- : "not specified.")
- ).tip(argWasSpecified
- ? new Object[] {
- "If the parameter value expression on the caller side is known to "
- + "be legally null/missing, you may want to specify a default "
- + "value for it with the \"!\" operator, like "
- + "paramValue!defaultValue." }
- : new Object[] {
- "If the omission was deliberate, you may consider making the "
- + "parameter optional in the macro by specifying a default value "
- + "for it, like ", "<#macro macroName paramName=defaultExpr>", ")" }
- ));
- }
- }
- }
- } while (resolvedAnArg && hasUnresolvedArg);
- if (hasUnresolvedArg) {
- if (firstReferenceException != null) {
- throw firstReferenceException;
- } else {
- throw InvalidReferenceException.getInstance(firstUnresolvedExpression, env);
- }
- }
- }
-
- /**
- * @return the local variable of the given name
- * or null if it doesn't exist.
- */
- @Override
- public TemplateModel getLocalVariable(String name) throws TemplateModelException {
- return localVars.get(name);
- }
-
- Environment.Namespace getLocals() {
- return localVars;
- }
-
- /**
- * Set a local variable in this macro
- */
- void setLocalVar(String name, TemplateModel var) {
- localVars.put(name, var);
- }
-
- @Override
- public Collection getLocalVariableNames() throws TemplateModelException {
- HashSet result = new HashSet();
- for (TemplateModelIterator it = localVars.keys().iterator(); it.hasNext(); ) {
- result.add(it.next().toString());
- }
- return result;
- }
- }
-
- @Override
- int getParameterCount() {
- return 1/*name*/ + paramNames.length * 2/*name=default*/ + 1/*catchAll*/ + 1/*type*/;
- }
-
- @Override
- Object getParameterValue(int idx) {
- if (idx == 0) {
- return name;
- } else {
- final int argDescsEnd = paramNames.length * 2 + 1;
- if (idx < argDescsEnd) {
- String paramName = paramNames[(idx - 1) / 2];
- if (idx % 2 != 0) {
- return paramName;
- } else {
- return paramDefaults.get(paramName);
- }
- } else if (idx == argDescsEnd) {
- return catchAllParamName;
- } else if (idx == argDescsEnd + 1) {
- return Integer.valueOf(function ? TYPE_FUNCTION : TYPE_MACRO);
- } else {
- throw new IndexOutOfBoundsException();
- }
- }
- }
-
- @Override
- ParameterRole getParameterRole(int idx) {
- if (idx == 0) {
- return ParameterRole.ASSIGNMENT_TARGET;
- } else {
- final int argDescsEnd = paramNames.length * 2 + 1;
- if (idx < argDescsEnd) {
- if (idx % 2 != 0) {
- return ParameterRole.PARAMETER_NAME;
- } else {
- return ParameterRole.PARAMETER_DEFAULT;
- }
- } else if (idx == argDescsEnd) {
- return ParameterRole.CATCH_ALL_PARAMETER_NAME;
- } else if (idx == argDescsEnd + 1) {
- return ParameterRole.AST_NODE_SUBTYPE;
- } else {
- throw new IndexOutOfBoundsException();
- }
- }
- }
-
- @Override
- boolean isNestedBlockRepeater() {
- // Because of recursive calls
- return true;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/ecb4e230/src/main/java/freemarker/core/MarkReleaserTemplateSpecifiedEncodingHandler.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/MarkReleaserTemplateSpecifiedEncodingHandler.java b/src/main/java/freemarker/core/MarkReleaserTemplateSpecifiedEncodingHandler.java
deleted file mode 100644
index 9fb8050..0000000
--- a/src/main/java/freemarker/core/MarkReleaserTemplateSpecifiedEncodingHandler.java
+++ /dev/null
@@ -1,55 +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 freemarker.core;
-
-import java.io.InputStream;
-
-import freemarker.template.Template.WrongEncodingException;
-
-/**
- * A {@link TemplateSpecifiedEncodingHandler} that discards the mark of the specified {@link InputStream} when
- * the template parsing gets to a point where it's known that we can't receive a template specified encoding anymore.
- * This allows freeing up the mark buffer early during parsing.
- *
- * @since 2.3.16
- */
-public class MarkReleaserTemplateSpecifiedEncodingHandler implements TemplateSpecifiedEncodingHandler {
-
- private final InputStream markedInputStream;
-
- /**
- * @param markedInputStream Input stream with marked template content start position
- */
- public MarkReleaserTemplateSpecifiedEncodingHandler(InputStream markedInputStream) {
- this.markedInputStream = markedInputStream;
- }
-
- public void handle(String templateSpecificEncoding, String constructorSpecifiedEncoding)
- throws WrongEncodingException {
- TemplateSpecifiedEncodingHandler.DEFAULT.handle(templateSpecificEncoding, constructorSpecifiedEncoding);
-
- // There was no WrongEncodingException exception, release mark buffer:
- markedInputStream.mark(0); //
- }
-
- public InputStream getMarkedInputStream() {
- return markedInputStream;
- }
-
-}