Unifying the o.a.f.core and o.a.f.core.ast
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/7d784b2b Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/7d784b2b Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/7d784b2b Branch: refs/heads/3 Commit: 7d784b2be471a1131ce8d96915367184d30b5f28 Parents: 612c42d Author: ddekany <[email protected]> Authored: Tue Feb 21 21:38:52 2017 +0100 Committer: ddekany <[email protected]> Committed: Thu Feb 23 12:44:51 2017 +0100 ---------------------------------------------------------------------- build.xml | 2 +- .../core/APINotSupportedTemplateException.java | 70 + .../org/apache/freemarker/core/ASTComment.java | 87 + .../freemarker/core/ASTDirAssignment.java | 280 ++ .../core/ASTDirAssignmentsContainer.java | 115 + .../core/ASTDirAttemptRecoverContainer.java | 88 + .../apache/freemarker/core/ASTDirAutoEsc.java | 77 + .../org/apache/freemarker/core/ASTDirBreak.java | 70 + .../core/ASTDirCapturingAssignment.java | 183 ++ .../org/apache/freemarker/core/ASTDirCase.java | 91 + .../apache/freemarker/core/ASTDirCompress.java | 87 + .../freemarker/core/ASTDirElseOfList.java | 75 + .../apache/freemarker/core/ASTDirEscape.java | 111 + .../apache/freemarker/core/ASTDirFallback.java | 70 + .../org/apache/freemarker/core/ASTDirFlush.java | 65 + .../core/ASTDirIfElseIfElseContainer.java | 107 + .../freemarker/core/ASTDirIfOrElseOrElseIf.java | 114 + .../apache/freemarker/core/ASTDirImport.java | 125 + .../apache/freemarker/core/ASTDirInclude.java | 257 ++ .../org/apache/freemarker/core/ASTDirItems.java | 120 + .../org/apache/freemarker/core/ASTDirList.java | 476 +++ .../core/ASTDirListElseContainer.java | 88 + .../org/apache/freemarker/core/ASTDirMacro.java | 325 ++ .../apache/freemarker/core/ASTDirNested.java | 159 + .../apache/freemarker/core/ASTDirNoAutoEsc.java | 77 + .../apache/freemarker/core/ASTDirNoEscape.java | 78 + .../freemarker/core/ASTDirOutputFormat.java | 85 + .../apache/freemarker/core/ASTDirRecover.java | 75 + .../apache/freemarker/core/ASTDirRecurse.java | 131 + .../apache/freemarker/core/ASTDirReturn.java | 91 + .../org/apache/freemarker/core/ASTDirSep.java | 89 + .../apache/freemarker/core/ASTDirSetting.java | 172 + .../org/apache/freemarker/core/ASTDirStop.java | 81 + .../apache/freemarker/core/ASTDirSwitch.java | 127 + .../apache/freemarker/core/ASTDirTOrTrOrTl.java | 109 + .../apache/freemarker/core/ASTDirTransform.java | 162 + .../freemarker/core/ASTDirUserDefined.java | 344 ++ .../org/apache/freemarker/core/ASTDirVisit.java | 127 + .../freemarker/core/ASTDollarInterpolation.java | 148 + .../freemarker/core/ASTExpAddOrConcat.java | 312 ++ .../org/apache/freemarker/core/ASTExpAnd.java | 82 + .../apache/freemarker/core/ASTExpBoolean.java | 34 + .../freemarker/core/ASTExpBooleanLiteral.java | 91 + .../apache/freemarker/core/ASTExpBuiltIn.java | 485 +++ .../freemarker/core/ASTExpBuiltInVariable.java | 297 ++ .../freemarker/core/ASTExpComparison.java | 104 + .../apache/freemarker/core/ASTExpDefault.java | 144 + .../org/apache/freemarker/core/ASTExpDot.java | 92 + .../freemarker/core/ASTExpDynamicKeyName.java | 287 ++ .../apache/freemarker/core/ASTExpExists.java | 91 + .../freemarker/core/ASTExpHashLiteral.java | 221 ++ .../freemarker/core/ASTExpListLiteral.java | 197 ++ .../freemarker/core/ASTExpMethodCall.java | 147 + .../freemarker/core/ASTExpNegateOrPlus.java | 108 + .../org/apache/freemarker/core/ASTExpNot.java | 76 + .../freemarker/core/ASTExpNumberLiteral.java | 92 + .../org/apache/freemarker/core/ASTExpOr.java | 82 + .../freemarker/core/ASTExpParenthesis.java | 88 + .../org/apache/freemarker/core/ASTExpRange.java | 119 + .../freemarker/core/ASTExpStringLiteral.java | 208 ++ .../apache/freemarker/core/ASTExpVariable.java | 105 + .../apache/freemarker/core/ASTExpression.java | 207 ++ .../freemarker/core/ASTHashInterpolation.java | 172 + .../freemarker/core/ASTImplicitParent.java | 101 + .../freemarker/core/ASTInterpolation.java | 49 + .../org/apache/freemarker/core/ASTNode.java | 233 ++ .../apache/freemarker/core/ASTStaticText.java | 408 +++ ...AliasTargetTemplateValueFormatException.java | 36 + .../core/AliasTemplateDateFormatFactory.java | 92 + .../core/AliasTemplateNumberFormatFactory.java | 91 + .../freemarker/core/ArithmeticEngine.java | 549 ++++ .../freemarker/core/ArithmeticExpression.java | 128 + .../BackwardCompatibleTemplateNumberFormat.java | 31 + .../freemarker/core/BoundedRangeModel.java | 70 + .../core/BuiltInBannedWhenAutoEscaping.java | 27 + .../apache/freemarker/core/BuiltInForDate.java | 56 + .../freemarker/core/BuiltInForHashEx.java | 55 + .../core/BuiltInForLegacyEscaping.java | 47 + .../freemarker/core/BuiltInForLoopVariable.java | 48 + .../freemarker/core/BuiltInForMarkupOutput.java | 39 + .../apache/freemarker/core/BuiltInForNode.java | 39 + .../freemarker/core/BuiltInForNodeEx.java | 37 + .../freemarker/core/BuiltInForNumber.java | 35 + .../freemarker/core/BuiltInForSequence.java | 38 + .../freemarker/core/BuiltInForString.java | 36 + .../core/BuiltInWithParseTimeParameters.java | 111 + .../freemarker/core/BuiltInsForDates.java | 212 ++ .../core/BuiltInsForExistenceHandling.java | 133 + .../freemarker/core/BuiltInsForHashes.java | 59 + .../core/BuiltInsForLoopVariables.java | 156 + .../core/BuiltInsForMarkupOutputs.java | 40 + .../core/BuiltInsForMultipleTypes.java | 726 +++++ .../freemarker/core/BuiltInsForNodes.java | 156 + .../freemarker/core/BuiltInsForNumbers.java | 319 ++ .../core/BuiltInsForOutputFormatRelated.java | 82 + .../freemarker/core/BuiltInsForSequences.java | 878 ++++++ .../core/BuiltInsForStringsBasic.java | 698 ++++ .../core/BuiltInsForStringsEncoding.java | 185 ++ .../freemarker/core/BuiltInsForStringsMisc.java | 301 ++ .../core/BuiltInsForStringsRegexp.java | 317 ++ .../core/BuiltInsWithParseTimeParameters.java | 158 + .../apache/freemarker/core/CSSOutputFormat.java | 52 + ...lPlaceCustomDataInitializationException.java | 33 + .../core/CombinedMarkupOutputFormat.java | 106 + .../core/CommonMarkupOutputFormat.java | 124 + .../core/CommonTemplateMarkupOutputModel.java | 67 + .../apache/freemarker/core/Configurable.java | 2751 ++++++++++++++++ .../apache/freemarker/core/Configuration.java | 26 +- .../apache/freemarker/core/CustomAttribute.java | 264 ++ .../freemarker/core/DirectiveCallPlace.java | 137 + .../org/apache/freemarker/core/Environment.java | 2977 +++++++++++++++++ .../org/apache/freemarker/core/EvalUtil.java | 540 ++++ .../core/ExtendedDecimalFormatParser.java | 525 +++ .../freemarker/core/HTMLOutputFormat.java | 75 + .../core/ISOLikeTemplateDateFormat.java | 264 ++ .../core/ISOLikeTemplateDateFormatFactory.java | 52 + .../freemarker/core/ISOTemplateDateFormat.java | 87 + .../core/ISOTemplateDateFormatFactory.java | 43 + .../core/InvalidFormatParametersException.java | 37 + .../core/InvalidFormatStringException.java | 37 + .../core/InvalidReferenceException.java | 167 + .../freemarker/core/JSONOutputFormat.java | 52 + .../freemarker/core/JavaScriptOutputFormat.java | 53 + .../freemarker/core/JavaTemplateDateFormat.java | 72 + .../core/JavaTemplateDateFormatFactory.java | 173 + .../core/JavaTemplateNumberFormat.java | 66 + .../core/JavaTemplateNumberFormatFactory.java | 120 + .../core/ListableRightUnboundedRangeModel.java | 97 + .../apache/freemarker/core/LocalContext.java | 36 + .../freemarker/core/LocalContextStack.java | 57 + ...eleaserTemplateSpecifiedEncodingHandler.java | 56 + .../freemarker/core/MarkupOutputFormat.java | 131 + .../core/MarkupOutputFormatBoundBuiltIn.java | 45 + .../org/apache/freemarker/core/MessageUtil.java | 350 ++ .../org/apache/freemarker/core/MiscUtil.java | 69 + .../NestedContentNotSupportedException.java | 67 + .../freemarker/core/NonBooleanException.java | 62 + .../freemarker/core/NonDateException.java | 58 + .../core/NonExtendedHashException.java | 62 + .../core/NonExtendedNodeException.java | 64 + .../freemarker/core/NonHashException.java | 64 + .../core/NonMarkupOutputException.java | 63 + .../freemarker/core/NonMethodException.java | 64 + .../freemarker/core/NonNamespaceException.java | 63 + .../freemarker/core/NonNodeException.java | 64 + .../freemarker/core/NonNumericalException.java | 74 + .../freemarker/core/NonSequenceException.java | 64 + .../core/NonSequenceOrCollectionException.java | 92 + .../freemarker/core/NonStringException.java | 74 + .../NonStringOrTemplateOutputException.java | 77 + .../NonUserDefinedDirectiveLikeException.java | 67 + .../core/OptInTemplateClassResolver.java | 156 + .../apache/freemarker/core/OutputFormat.java | 83 + .../core/OutputFormatBoundBuiltIn.java | 47 + .../apache/freemarker/core/ParameterRole.java | 93 + .../apache/freemarker/core/ParseException.java | 513 +++ .../freemarker/core/ParserConfiguration.java | 77 + .../core/ParsingNotSupportedException.java | 37 + .../freemarker/core/PlainTextOutputFormat.java | 56 + .../apache/freemarker/core/RTFOutputFormat.java | 75 + .../org/apache/freemarker/core/RangeModel.java | 59 + .../apache/freemarker/core/RegexpHelper.java | 207 ++ .../core/RightUnboundedRangeModel.java | 48 + .../apache/freemarker/core/SpecialBuiltIn.java | 27 + .../apache/freemarker/core/StopException.java | 64 + .../org/apache/freemarker/core/Template.java | 37 +- .../freemarker/core/TemplateClassResolver.java | 82 + .../core/TemplateCombinedMarkupOutputModel.java | 50 + .../freemarker/core/TemplateConfiguration.java | 921 ++++++ .../freemarker/core/TemplateDateFormat.java | 108 + .../core/TemplateDateFormatFactory.java | 91 + .../core/TemplateElementArrayBuilder.java | 102 + .../core/TemplateElementsToVisit.java | 48 + .../freemarker/core/TemplateException.java | 22 +- .../core/TemplateExceptionHandler.java | 3 - .../freemarker/core/TemplateFormatUtil.java | 76 + .../core/TemplateHTMLOutputModel.java | 40 + .../core/TemplateMarkupOutputModel.java | 52 + .../freemarker/core/TemplateNumberFormat.java | 90 + .../core/TemplateNumberFormatFactory.java | 62 + .../freemarker/core/TemplatePostProcessor.java | 31 + .../core/TemplatePostProcessorException.java | 35 + .../freemarker/core/TemplateRTFOutputModel.java | 40 + .../core/TemplateSpecifiedEncodingHandler.java | 60 + .../freemarker/core/TemplateValueFormat.java | 33 + .../core/TemplateValueFormatException.java | 37 + .../core/TemplateValueFormatFactory.java | 28 + .../core/TemplateXHTMLOutputModel.java | 40 + .../freemarker/core/TemplateXMLOutputModel.java | 40 + ...nterruptionSupportTemplatePostProcessor.java | 140 + .../apache/freemarker/core/TokenMgrError.java | 249 ++ .../core/UndefinedCustomFormatException.java | 34 + .../freemarker/core/UndefinedOutputFormat.java | 55 + .../core/UnexpectedTypeException.java | 109 + .../core/UnformattableValueException.java | 41 + ...nDateTypeFormattingUnsupportedException.java | 35 + ...nownDateTypeParsingUnsupportedException.java | 36 + .../core/UnparsableValueException.java | 38 + .../core/UnregisteredOutputFormatException.java | 34 + .../freemarker/core/XHTMLOutputFormat.java | 75 + .../apache/freemarker/core/XMLOutputFormat.java | 75 + .../freemarker/core/XSTemplateDateFormat.java | 91 + .../core/XSTemplateDateFormatFactory.java | 43 + .../apache/freemarker/core/_ASTDebugBreak.java | 90 + .../org/apache/freemarker/core/_ASTElement.java | 473 +++ .../org/apache/freemarker/core/_CoreAPI.java | 227 ++ .../apache/freemarker/core/_DelayedAOrAn.java | 35 + .../core/_DelayedConversionToString.java | 52 + .../core/_DelayedFTLTypeDescription.java | 37 + .../core/_DelayedGetCanonicalForm.java | 39 + .../freemarker/core/_DelayedGetMessage.java | 35 + .../core/_DelayedGetMessageWithoutStackTop.java | 34 + .../apache/freemarker/core/_DelayedJQuote.java | 36 + .../freemarker/core/_DelayedJoinWithComma.java | 48 + .../apache/freemarker/core/_DelayedOrdinal.java | 47 + .../freemarker/core/_DelayedShortClassName.java | 35 + .../freemarker/core/_DelayedToString.java | 37 + .../core/_ErrorDescriptionBuilder.java | 357 +++ .../freemarker/core/_MiscTemplateException.java | 124 + ...ObjectBuilderSettingEvaluationException.java | 46 + .../core/_ObjectBuilderSettingEvaluator.java | 1057 +++++++ ..._ParserConfigurationWithInheritedFormat.java | 82 + .../core/_SettingEvaluationEnvironment.java | 61 + .../apache/freemarker/core/_TemplateAPI.java | 7 +- .../core/_TemplateModelException.java | 133 + .../freemarker/core/_TimeZoneBuilder.java | 43 + ...expectedTypeErrorExplainerTemplateModel.java | 36 + .../ast/APINotSupportedTemplateException.java | 71 - .../core/ast/AddConcatExpression.java | 313 -- ...AliasTargetTemplateValueFormatException.java | 36 - .../ast/AliasTemplateDateFormatFactory.java | 92 - .../ast/AliasTemplateNumberFormatFactory.java | 91 - .../freemarker/core/ast/AndExpression.java | 81 - .../freemarker/core/ast/ArithmeticEngine.java | 549 ---- .../core/ast/ArithmeticExpression.java | 129 - .../apache/freemarker/core/ast/Assignment.java | 280 -- .../core/ast/AssignmentInstruction.java | 117 - .../freemarker/core/ast/AttemptBlock.java | 89 - .../freemarker/core/ast/AutoEscBlock.java | 79 - .../BackwardCompatibleTemplateNumberFormat.java | 30 - .../freemarker/core/ast/BlockAssignment.java | 184 -- .../freemarker/core/ast/BodyInstruction.java | 160 - .../freemarker/core/ast/BooleanExpression.java | 32 - .../freemarker/core/ast/BooleanLiteral.java | 88 - .../freemarker/core/ast/BoundedRangeModel.java | 70 - .../freemarker/core/ast/BreakInstruction.java | 70 - .../freemarker/core/ast/BugException.java | 52 - .../org/apache/freemarker/core/ast/BuiltIn.java | 486 --- .../core/ast/BuiltInBannedWhenAutoEscaping.java | 27 - .../freemarker/core/ast/BuiltInForDate.java | 57 - .../freemarker/core/ast/BuiltInForHashEx.java | 56 - .../core/ast/BuiltInForLegacyEscaping.java | 48 - .../core/ast/BuiltInForLoopVariable.java | 49 - .../core/ast/BuiltInForMarkupOutput.java | 40 - .../freemarker/core/ast/BuiltInForNode.java | 40 - .../freemarker/core/ast/BuiltInForNodeEx.java | 38 - .../freemarker/core/ast/BuiltInForNumber.java | 36 - .../freemarker/core/ast/BuiltInForSequence.java | 39 - .../freemarker/core/ast/BuiltInForString.java | 37 - .../ast/BuiltInWithParseTimeParameters.java | 111 - .../freemarker/core/ast/BuiltInsForDates.java | 213 -- .../freemarker/core/ast/BuiltInsForHashes.java | 58 - .../core/ast/BuiltInsForLoopVariables.java | 157 - .../core/ast/BuiltInsForMarkupOutputs.java | 40 - .../core/ast/BuiltInsForMultipleTypes.java | 726 ----- .../freemarker/core/ast/BuiltInsForNodes.java | 156 - .../freemarker/core/ast/BuiltInsForNumbers.java | 320 -- .../ast/BuiltInsForOutputFormatRelated.java | 83 - .../core/ast/BuiltInsForSequences.java | 877 ----- .../core/ast/BuiltInsForStringsBasic.java | 699 ---- .../core/ast/BuiltInsForStringsEncoding.java | 185 -- .../core/ast/BuiltInsForStringsMisc.java | 129 - .../core/ast/BuiltInsForStringsRegexp.java | 318 -- .../ast/BuiltInsWithParseTimeParameters.java | 159 - .../freemarker/core/ast/BuiltinVariable.java | 299 -- .../freemarker/core/ast/CSSOutputFormat.java | 52 - ...lPlaceCustomDataInitializationException.java | 33 - .../org/apache/freemarker/core/ast/Case.java | 91 - .../core/ast/CollectionAndSequence.java | 109 - .../core/ast/CombinedMarkupOutputFormat.java | 106 - .../org/apache/freemarker/core/ast/Comment.java | 87 - .../core/ast/CommonMarkupOutputFormat.java | 124 - .../ast/CommonTemplateMarkupOutputModel.java | 67 - .../core/ast/ComparisonExpression.java | 104 - .../freemarker/core/ast/CompressedBlock.java | 86 - .../freemarker/core/ast/ConditionalBlock.java | 114 - .../freemarker/core/ast/Configurable.java | 2758 ---------------- .../freemarker/core/ast/CustomAttribute.java | 265 -- .../core/ast/DefaultToExpression.java | 145 - .../freemarker/core/ast/DirectiveCallPlace.java | 139 - .../freemarker/core/ast/DollarVariable.java | 149 - .../org/apache/freemarker/core/ast/Dot.java | 94 - .../freemarker/core/ast/DynamicKeyName.java | 288 -- .../apache/freemarker/core/ast/ElseOfList.java | 77 - .../apache/freemarker/core/ast/Environment.java | 2982 ------------------ .../apache/freemarker/core/ast/EscapeBlock.java | 112 - .../apache/freemarker/core/ast/EvalUtil.java | 540 ---- .../freemarker/core/ast/ExistenceBuiltins.java | 134 - .../freemarker/core/ast/ExistsExpression.java | 90 - .../apache/freemarker/core/ast/Expression.java | 214 -- .../core/ast/ExtendedDecimalFormatParser.java | 525 --- .../core/ast/FallbackInstruction.java | 69 - .../freemarker/core/ast/FlushInstruction.java | 65 - .../freemarker/core/ast/HTMLOutputFormat.java | 75 - .../apache/freemarker/core/ast/HashLiteral.java | 218 -- .../core/ast/ISOLikeTemplateDateFormat.java | 263 -- .../ast/ISOLikeTemplateDateFormatFactory.java | 52 - .../core/ast/ISOTemplateDateFormat.java | 87 - .../core/ast/ISOTemplateDateFormatFactory.java | 43 - .../apache/freemarker/core/ast/Identifier.java | 106 - .../org/apache/freemarker/core/ast/IfBlock.java | 109 - .../org/apache/freemarker/core/ast/Include.java | 259 -- .../freemarker/core/ast/Interpolation.java | 48 - .../apache/freemarker/core/ast/Interpret.java | 157 - .../ast/InvalidFormatParametersException.java | 37 - .../core/ast/InvalidFormatStringException.java | 37 - .../core/ast/InvalidReferenceException.java | 169 - .../org/apache/freemarker/core/ast/Items.java | 121 - .../freemarker/core/ast/IteratorBlock.java | 476 --- .../freemarker/core/ast/JSONOutputFormat.java | 52 - .../core/ast/JavaScriptOutputFormat.java | 53 - .../core/ast/JavaTemplateDateFormat.java | 72 - .../core/ast/JavaTemplateDateFormatFactory.java | 174 - .../core/ast/JavaTemplateNumberFormat.java | 66 - .../ast/JavaTemplateNumberFormatFactory.java | 121 - .../apache/freemarker/core/ast/LibraryLoad.java | 131 - .../freemarker/core/ast/ListElseContainer.java | 87 - .../apache/freemarker/core/ast/ListLiteral.java | 196 -- .../ast/ListableRightUnboundedRangeModel.java | 97 - .../freemarker/core/ast/LocalContext.java | 38 - .../freemarker/core/ast/LocalContextStack.java | 57 - .../org/apache/freemarker/core/ast/Macro.java | 330 -- ...eleaserTemplateSpecifiedEncodingHandler.java | 56 - .../freemarker/core/ast/MarkupOutputFormat.java | 132 - .../ast/MarkupOutputFormatBoundBuiltIn.java | 46 - .../apache/freemarker/core/ast/MessageUtil.java | 352 --- .../apache/freemarker/core/ast/MethodCall.java | 149 - .../apache/freemarker/core/ast/MiscUtil.java | 69 - .../freemarker/core/ast/MixedContent.java | 102 - .../ast/NestedContentNotSupportedException.java | 68 - .../org/apache/freemarker/core/ast/NewBI.java | 74 - .../freemarker/core/ast/NoAutoEscBlock.java | 79 - .../freemarker/core/ast/NoEscapeBlock.java | 79 - .../core/ast/NonBooleanException.java | 62 - .../freemarker/core/ast/NonDateException.java | 58 - .../core/ast/NonExtendedHashException.java | 62 - .../core/ast/NonExtendedNodeException.java | 64 - .../freemarker/core/ast/NonHashException.java | 64 - .../core/ast/NonMarkupOutputException.java | 63 - .../freemarker/core/ast/NonMethodException.java | 64 - .../core/ast/NonNamespaceException.java | 63 - .../freemarker/core/ast/NonNodeException.java | 64 - .../core/ast/NonNumericalException.java | 74 - .../core/ast/NonSequenceException.java | 64 - .../ast/NonSequenceOrCollectionException.java | 92 - .../freemarker/core/ast/NonStringException.java | 74 - .../ast/NonStringOrTemplateOutputException.java | 77 - .../NonUserDefinedDirectiveLikeException.java | 67 - .../freemarker/core/ast/NotExpression.java | 75 - .../freemarker/core/ast/NumberLiteral.java | 94 - .../freemarker/core/ast/NumericalOutput.java | 173 - .../core/ast/OptInTemplateClassResolver.java | 158 - .../freemarker/core/ast/OrExpression.java | 81 - .../freemarker/core/ast/OutputFormat.java | 84 - .../freemarker/core/ast/OutputFormatBlock.java | 87 - .../core/ast/OutputFormatBoundBuiltIn.java | 48 - .../freemarker/core/ast/ParameterRole.java | 93 - .../core/ast/ParentheticalExpression.java | 86 - .../freemarker/core/ast/ParseException.java | 513 --- .../core/ast/ParserConfiguration.java | 80 - .../core/ast/ParsingNotSupportedException.java | 37 - .../core/ast/PlainTextOutputFormat.java | 56 - .../freemarker/core/ast/PropertySetting.java | 177 -- .../freemarker/core/ast/RTFOutputFormat.java | 75 - .../org/apache/freemarker/core/ast/Range.java | 119 - .../apache/freemarker/core/ast/RangeModel.java | 59 - .../freemarker/core/ast/RecoveryBlock.java | 74 - .../apache/freemarker/core/ast/RecurseNode.java | 132 - .../freemarker/core/ast/RegexpHelper.java | 208 -- .../freemarker/core/ast/ReturnInstruction.java | 93 - .../core/ast/RightUnboundedRangeModel.java | 48 - .../org/apache/freemarker/core/ast/Sep.java | 90 - .../freemarker/core/ast/SpecialBuiltIn.java | 27 - .../freemarker/core/ast/StopException.java | 66 - .../freemarker/core/ast/StopInstruction.java | 83 - .../core/ast/StringArraySequence.java | 60 - .../freemarker/core/ast/StringLiteral.java | 207 -- .../apache/freemarker/core/ast/SwitchBlock.java | 132 - .../core/ast/TemplateClassResolver.java | 84 - .../ast/TemplateCombinedMarkupOutputModel.java | 50 - .../core/ast/TemplateConfiguration.java | 926 ------ .../freemarker/core/ast/TemplateDateFormat.java | 108 - .../core/ast/TemplateDateFormatFactory.java | 92 - .../freemarker/core/ast/TemplateElement.java | 476 --- .../core/ast/TemplateElementArrayBuilder.java | 102 - .../core/ast/TemplateElementsToVisit.java | 48 - .../freemarker/core/ast/TemplateFormatUtil.java | 76 - .../core/ast/TemplateHTMLOutputModel.java | 40 - .../core/ast/TemplateMarkupOutputModel.java | 52 - .../core/ast/TemplateNumberFormat.java | 90 - .../core/ast/TemplateNumberFormatFactory.java | 64 - .../freemarker/core/ast/TemplateObject.java | 243 -- .../core/ast/TemplatePostProcessor.java | 34 - .../ast/TemplatePostProcessorException.java | 35 - .../core/ast/TemplateRTFOutputModel.java | 40 - .../ast/TemplateSpecifiedEncodingHandler.java | 61 - .../core/ast/TemplateValueFormat.java | 33 - .../core/ast/TemplateValueFormatException.java | 37 - .../core/ast/TemplateValueFormatFactory.java | 28 - .../core/ast/TemplateXHTMLOutputModel.java | 40 - .../core/ast/TemplateXMLOutputModel.java | 40 - .../apache/freemarker/core/ast/TextBlock.java | 409 --- ...nterruptionSupportTemplatePostProcessor.java | 142 - .../freemarker/core/ast/TokenMgrError.java | 251 -- .../freemarker/core/ast/TransformBlock.java | 168 - .../freemarker/core/ast/TrimInstruction.java | 110 - .../core/ast/UnaryPlusMinusExpression.java | 106 - .../ast/UndefinedCustomFormatException.java | 34 - .../core/ast/UndefinedOutputFormat.java | 57 - .../core/ast/UnexpectedTypeException.java | 110 - .../core/ast/UnformattableValueException.java | 41 - .../apache/freemarker/core/ast/UnifiedCall.java | 344 -- ...nDateTypeFormattingUnsupportedException.java | 35 - ...nownDateTypeParsingUnsupportedException.java | 36 - .../core/ast/UnparsableValueException.java | 38 - .../ast/UnregisteredOutputFormatException.java | 34 - .../apache/freemarker/core/ast/VisitNode.java | 128 - .../freemarker/core/ast/XHTMLOutputFormat.java | 75 - .../freemarker/core/ast/XMLOutputFormat.java | 75 - .../core/ast/XSTemplateDateFormat.java | 91 - .../core/ast/XSTemplateDateFormatFactory.java | 43 - .../apache/freemarker/core/ast/_CoreAPI.java | 223 -- .../apache/freemarker/core/ast/_DebugBreak.java | 91 - .../freemarker/core/ast/_DelayedAOrAn.java | 35 - .../core/ast/_DelayedConversionToString.java | 52 - .../core/ast/_DelayedFTLTypeDescription.java | 37 - .../core/ast/_DelayedGetCanonicalForm.java | 39 - .../freemarker/core/ast/_DelayedGetMessage.java | 35 - .../ast/_DelayedGetMessageWithoutStackTop.java | 36 - .../freemarker/core/ast/_DelayedJQuote.java | 36 - .../core/ast/_DelayedJoinWithComma.java | 48 - .../freemarker/core/ast/_DelayedOrdinal.java | 47 - .../core/ast/_DelayedShortClassName.java | 35 - .../freemarker/core/ast/_DelayedToString.java | 37 - .../core/ast/_ErrorDescriptionBuilder.java | 360 --- .../core/ast/_MiscTemplateException.java | 126 - ...ObjectBuilderSettingEvaluationException.java | 46 - .../ast/_ObjectBuilderSettingEvaluator.java | 1058 ------- ..._ParserConfigurationWithInheritedFormat.java | 84 - .../core/ast/_SettingEvaluationEnvironment.java | 62 - .../core/ast/_TemplateModelException.java | 133 - .../freemarker/core/ast/_TimeZoneBuilder.java | 43 - ...expectedTypeErrorExplainerTemplateModel.java | 36 - .../org/apache/freemarker/core/ast/package.html | 26 - .../core/debug/DebuggedEnvironment.java | 6 +- .../core/debug/impl/DebuggerService.java | 2 +- .../debug/impl/RmiDebuggedEnvironmentImpl.java | 4 +- .../core/debug/impl/RmiDebuggerService.java | 44 +- .../core/model/TemplateDirectiveBody.java | 2 +- .../core/model/TemplateDirectiveModel.java | 2 +- .../core/model/TemplateMethodModel.java | 2 +- .../core/model/TemplateMethodModelEx.java | 2 +- .../core/model/TemplateModelException.java | 4 +- .../core/model/TemplateNumberModel.java | 2 +- .../core/model/impl/CollectionAndSequence.java | 108 + .../core/model/impl/DefaultMapAdapter.java | 4 +- .../impl/DefaultNonListCollectionAdapter.java | 4 +- .../freemarker/core/model/impl/SimpleHash.java | 4 +- .../core/model/impl/beans/ArgumentTypes.java | 2 +- .../core/model/impl/beans/BeanModel.java | 8 +- .../core/model/impl/beans/BeansWrapper.java | 8 +- .../model/impl/beans/ClassIntrospector.java | 2 +- .../impl/beans/EmptyMemberAndArguments.java | 2 +- .../model/impl/beans/OverloadedMethods.java | 8 +- .../impl/beans/OverloadedVarArgsMethods.java | 2 +- .../model/impl/beans/ResourceBundleModel.java | 4 +- .../core/model/impl/beans/SimpleMapModel.java | 2 +- .../core/model/impl/beans/SimpleMethod.java | 10 +- .../model/impl/beans/SimpleMethodModel.java | 2 +- .../core/model/impl/beans/_BeansAPI.java | 2 +- .../core/model/impl/beans/_MethodUtil.java | 8 +- .../core/model/impl/dom/AttributeNodeModel.java | 2 +- .../core/model/impl/dom/DocumentModel.java | 2 +- .../core/model/impl/dom/DomStringUtil.java | 2 +- .../core/model/impl/dom/ElementModel.java | 2 +- .../core/model/impl/dom/JaxenXPathSupport.java | 4 +- .../core/model/impl/dom/NodeListModel.java | 4 +- .../core/model/impl/dom/NodeModel.java | 2 +- .../core/model/impl/dom/NodeOutputter.java | 4 +- .../impl/dom/SunInternalXalanXPathSupport.java | 2 +- .../core/model/impl/dom/XalanXPathSupport.java | 2 +- .../core/model/impl/dom/_ExtDomApi.java | 2 +- ...ConditionalTemplateConfigurationFactory.java | 2 +- .../FirstMatchTemplateConfigurationFactory.java | 2 +- .../MergingTemplateConfigurationFactory.java | 2 +- .../TemplateConfigurationFactory.java | 2 +- .../templateresolver/TemplateLoadingResult.java | 2 +- .../core/templateresolver/TemplateResolver.java | 2 +- .../impl/DefaultTemplateResolver.java | 8 +- .../freemarker/core/util/BugException.java | 52 + .../freemarker/core/util/CaptureOutput.java | 2 +- .../apache/freemarker/core/util/DeepUnwrap.java | 2 +- .../apache/freemarker/core/util/FTLUtil.java | 10 +- .../core/util/GenericParseException.java | 2 +- .../apache/freemarker/core/util/_ClassUtil.java | 35 - .../freemarker/core/util/_StringUtil.java | 3 +- .../freemarker/servlet/FreemarkerServlet.java | 10 +- .../apache/freemarker/servlet/IncludePage.java | 6 +- .../freemarker/servlet/InitParamParser.java | 4 +- .../jsp/CustomTagAndELFunctionCombiner.java | 6 +- .../servlet/jsp/FreeMarkerPageContext.java | 2 +- .../freemarker/servlet/jsp/JspTagModelBase.java | 8 +- .../servlet/jsp/PageContextFactory.java | 2 +- .../servlet/jsp/SimpleTagDirectiveModel.java | 2 +- .../freemarker/servlet/jsp/TaglibFactory.java | 4 +- src/main/javacc/FTL.jj | 688 ++-- .../core/ASTBasedErrorMessagesTest.java | 74 + .../org/apache/freemarker/core/ASTPrinter.java | 445 +++ .../org/apache/freemarker/core/ASTTest.java | 98 + .../core/AppMetaTemplateDateFormatFactory.java | 129 + .../core/BaseNTemplateNumberFormatFactory.java | 128 + .../freemarker/core/BreakPlacementTest.java | 65 + .../apache/freemarker/core/CamelCaseTest.java | 493 +++ .../freemarker/core/CanonicalFormTest.java | 71 + .../freemarker/core/CoercionToTextualTest.java | 137 + .../core/CombinedMarkupOutputFormatTest.java | 198 ++ .../freemarker/core/ConfigurableTest.java | 183 ++ .../freemarker/core/ConfigurationTest.java | 26 +- .../freemarker/core/CoreLocaleUtilsTest.java | 73 + .../freemarker/core/CustomAttributeTest.java | 2 - .../freemarker/core/CustomHTMLOutputFormat.java | 72 + .../core/CustomTemplateHTMLModel.java | 34 + .../apache/freemarker/core/DateFormatTest.java | 438 +++ .../freemarker/core/DirectiveCallPlaceTest.java | 260 ++ .../freemarker/core/DummyOutputFormat.java | 65 + .../freemarker/core/EncodingOverrideTest.java | 69 + .../core/EnvironmentCustomStateTest.java | 51 + .../EnvironmentGetTemplateVariantsTest.java | 218 ++ ...EpochMillisDivTemplateDateFormatFactory.java | 102 + .../EpochMillisTemplateDateFormatFactory.java | 92 + .../apache/freemarker/core/ExceptionTest.java | 1 - .../core/ExtendedDecimalFormatTest.java | 341 ++ .../core/HTMLISOTemplateDateFormatFactory.java | 114 + .../freemarker/core/HTMLOutputFormatTest.java | 187 ++ .../freemarker/core/HeaderParsingTest.java | 64 + .../core/HexTemplateNumberFormatFactory.java | 77 + .../IncludeAndImportConfigurableLayersTest.java | 336 ++ .../freemarker/core/IncludeAndImportTest.java | 255 ++ .../core/InterpretAndEvalTemplateNameTest.java | 70 + .../core/InterpretSettingInheritanceTest.java | 95 + .../freemarker/core/IteratorIssuesTest.java | 89 + .../apache/freemarker/core/ListErrorsTest.java | 138 + ...AndTZSensitiveTemplateDateFormatFactory.java | 97 + ...aleSensitiveTemplateNumberFormatFactory.java | 78 + .../freemarker/core/MiscErrorMessagesTest.java | 47 + .../core/MistakenlyPublicImportAPIsTest.java | 9 +- .../core/MistakenlyPublicMacroAPIsTest.java | 10 +- .../freemarker/core/NumberFormatTest.java | 326 ++ .../core/ObjectBuilderSettingsTest.java | 1519 +++++++++ .../core/OptInTemplateClassResolverTest.java | 211 ++ .../freemarker/core/OutputFormatTest.java | 1031 ++++++ .../ParseTimeParameterBIErrorMessagesTest.java | 46 + .../core/ParsingErrorMessagesTest.java | 119 + .../PrintfGTemplateNumberFormatFactory.java | 138 + .../freemarker/core/RTFOutputFormatTest.java | 129 + .../apache/freemarker/core/SQLTimeZoneTest.java | 362 +++ .../core/SeldomEscapedOutputFormat.java | 71 + .../freemarker/core/SettingDirectiveTest.java | 41 + .../freemarker/core/SpecialVariableTest.java | 105 + .../core/StringLiteralInterpolationTest.java | 133 + .../org/apache/freemarker/core/TabSizeTest.java | 97 + .../core/TagSyntaxVariationsTest.java | 181 ++ .../freemarker/core/TemplatGetEncodingTest.java | 89 + .../core/TemplateConfigurationTest.java | 940 ++++++ ...teConfigurationWithTemplateResolverTest.java | 327 ++ .../core/TemplateDummyOutputModel.java | 34 + .../freemarker/core/TemplateLevelSettings.java | 107 + .../core/TemplateLookupStrategyTest.java | 1 - .../core/TemplateNameSpecialVariablesTest.java | 169 + .../core/TemplateSeldomEscapedOutputModel.java | 34 + .../core/TheadInterruptingSupportTest.java | 166 + .../freemarker/core/TypeErrorMessagesTest.java | 105 + .../freemarker/core/UnclosedCommentTest.java | 44 + .../core/WhitespaceStrippingTest.java | 71 + .../freemarker/core/XHTMLOutputFormatTest.java | 59 + .../freemarker/core/XMLOutputFormatTest.java | 59 + .../core/ast/ASTBasedErrorMessagesTest.java | 74 - .../apache/freemarker/core/ast/ASTPrinter.java | 439 --- .../org/apache/freemarker/core/ast/ASTTest.java | 98 - .../ast/AppMetaTemplateDateFormatFactory.java | 129 - .../ast/BaseNTemplateNumberFormatFactory.java | 128 - .../freemarker/core/ast/BreakPlacementTest.java | 65 - .../freemarker/core/ast/CamelCaseTest.java | 489 --- .../freemarker/core/ast/CanonicalFormTest.java | 70 - .../core/ast/CoercionToTextualTest.java | 137 - .../ast/CombinedMarkupOutputFormatTest.java | 198 -- .../freemarker/core/ast/ConfigurableTest.java | 182 -- .../core/ast/CoreLocaleUtilsTest.java | 73 - .../core/ast/CustomHTMLOutputFormat.java | 72 - .../core/ast/CustomTemplateHTMLModel.java | 34 - .../freemarker/core/ast/DateFormatTest.java | 441 --- .../core/ast/DirectiveCallPlaceTest.java | 256 -- .../freemarker/core/ast/DummyOutputFormat.java | 65 - .../core/ast/EncodingOverrideTest.java | 69 - .../core/ast/EnvironmentCustomStateTest.java | 50 - .../ast/EnvironmentGetTemplateVariantsTest.java | 217 -- ...EpochMillisDivTemplateDateFormatFactory.java | 102 - .../EpochMillisTemplateDateFormatFactory.java | 92 - .../core/ast/ExtendedDecimalFormatTest.java | 341 -- .../ast/HTMLISOTemplateDateFormatFactory.java | 104 - .../core/ast/HTMLOutputFormatTest.java | 187 -- .../freemarker/core/ast/HeaderParsingTest.java | 64 - .../ast/HexTemplateNumberFormatFactory.java | 77 - .../IncludeAndImportConfigurableLayersTest.java | 333 -- .../core/ast/IncludeAndImportTest.java | 254 -- .../ast/InterpretAndEvalTemplateNameTest.java | 70 - .../ast/InterpretSettingInheritanceTest.java | 95 - .../freemarker/core/ast/IteratorIssuesTest.java | 89 - .../freemarker/core/ast/ListErrorsTest.java | 138 - ...AndTZSensitiveTemplateDateFormatFactory.java | 97 - ...aleSensitiveTemplateNumberFormatFactory.java | 78 - .../core/ast/MiscErrorMessagesTest.java | 47 - .../freemarker/core/ast/NumberFormatTest.java | 320 -- .../core/ast/ObjectBuilderSettingsTest.java | 1524 --------- .../ast/OptInTemplateClassResolverTest.java | 209 -- .../freemarker/core/ast/OutputFormatTest.java | 1022 ------ .../ParseTimeParameterBIErrorMessagesTest.java | 46 - .../core/ast/ParsingErrorMessagesTest.java | 118 - .../ast/PrintfGTemplateNumberFormatFactory.java | 138 - .../core/ast/RTFOutputFormatTest.java | 129 - .../freemarker/core/ast/SQLTimeZoneTest.java | 362 --- .../core/ast/SeldomEscapedOutputFormat.java | 71 - .../core/ast/SettingDirectiveTest.java | 41 - .../core/ast/SpecialVariableTest.java | 101 - .../ast/StringLiteralInterpolationTest.java | 131 - .../apache/freemarker/core/ast/TabSizeTest.java | 96 - .../core/ast/TagSyntaxVariationsTest.java | 180 -- .../core/ast/TemplatGetEncodingTest.java | 88 - .../core/ast/TemplateConfigurationTest.java | 928 ------ ...teConfigurationWithTemplateResolverTest.java | 325 -- .../core/ast/TemplateDummyOutputModel.java | 34 - .../core/ast/TemplateLevelSettings.java | 107 - .../ast/TemplateNameSpecialVariablesTest.java | 169 - .../ast/TemplateSeldomEscapedOutputModel.java | 34 - .../core/ast/TheadInterruptingSupportTest.java | 164 - .../core/ast/TypeErrorMessagesTest.java | 105 - .../core/ast/UnclosedCommentTest.java | 44 - .../core/ast/WhitespaceStrippingTest.java | 71 - .../core/ast/XHTMLOutputFormatTest.java | 59 - .../core/ast/XMLOutputFormatTest.java | 59 - .../model/impl/beans/ErrorMessagesTest.java | 4 +- .../DefaultTemplateResolverTest.java | 2 +- .../TemplateConfigurationFactoryTest.java | 2 +- .../TemplateNameFormatTest.java | 2 +- .../ConfigureOutputFormatExamples.java | 8 +- .../manualtest/CustomFormatsExample.java | 10 +- .../TemplateConfigurationExamples.java | 10 +- .../UnitAwareTemplateNumberFormatFactory.java | 8 +- .../servlet/FreemarkerServletTest.java | 4 +- .../apache/freemarker/test/TemplateTest.java | 2 +- .../test/templatesuite/TemplateTestCase.java | 2 +- .../models/OverloadedMethods2.java | 2 +- .../freemarker/test/util/AssertDirective.java | 4 +- .../test/util/AssertEqualsDirective.java | 4 +- .../test/util/AssertFailsDirective.java | 2 +- .../AssertationFailedInTemplateException.java | 2 +- .../test/util/BadParameterTypeException.java | 2 +- .../util/MissingRequiredParameterException.java | 2 +- .../freemarker/test/util/NoOutputDirective.java | 2 +- .../test/util/ParameterException.java | 2 +- .../util/UnsupportedParameterException.java | 2 +- .../org/apache/freemarker/core/ast-1.ast | 187 ++ .../org/apache/freemarker/core/ast-1.ftl | 29 + .../apache/freemarker/core/ast-assignments.ast | 172 + .../apache/freemarker/core/ast-assignments.ftl | 29 + .../org/apache/freemarker/core/ast-builtins.ast | 59 + .../org/apache/freemarker/core/ast-builtins.ftl | 23 + .../apache/freemarker/core/ast-locations.ast | 155 + .../apache/freemarker/core/ast-locations.ftl | 36 + .../core/ast-mixedcontentsimplifications.ast | 38 + .../core/ast-mixedcontentsimplifications.ftl | 26 + .../core/ast-multipleignoredchildren.ast | 30 + .../core/ast-multipleignoredchildren.ftl | 33 + .../core/ast-nestedignoredchildren.ast | 20 + .../core/ast-nestedignoredchildren.ftl | 19 + .../org/apache/freemarker/core/ast-range.ast | 281 ++ .../org/apache/freemarker/core/ast-range.ftl | 47 + .../freemarker/core/ast-strlitinterpolation.ast | 82 + .../freemarker/core/ast-strlitinterpolation.ftl | 25 + .../freemarker/core/ast-whitespacestripping.ast | 70 + .../freemarker/core/ast-whitespacestripping.ftl | 40 + .../org/apache/freemarker/core/ast/ast-1.ast | 187 -- .../org/apache/freemarker/core/ast/ast-1.ftl | 29 - .../freemarker/core/ast/ast-assignments.ast | 172 - .../freemarker/core/ast/ast-assignments.ftl | 29 - .../apache/freemarker/core/ast/ast-builtins.ast | 59 - .../apache/freemarker/core/ast/ast-builtins.ftl | 23 - .../freemarker/core/ast/ast-locations.ast | 155 - .../freemarker/core/ast/ast-locations.ftl | 36 - .../ast/ast-mixedcontentsimplifications.ast | 38 - .../ast/ast-mixedcontentsimplifications.ftl | 26 - .../core/ast/ast-multipleignoredchildren.ast | 30 - .../core/ast/ast-multipleignoredchildren.ftl | 33 - .../core/ast/ast-nestedignoredchildren.ast | 20 - .../core/ast/ast-nestedignoredchildren.ftl | 19 - .../apache/freemarker/core/ast/ast-range.ast | 281 -- .../apache/freemarker/core/ast/ast-range.ftl | 47 - .../core/ast/ast-strlitinterpolation.ast | 82 - .../core/ast/ast-strlitinterpolation.ftl | 25 - .../core/ast/ast-whitespacestripping.ast | 70 - .../core/ast/ast-whitespacestripping.ftl | 40 - .../freemarker/core/ast/cano-assignments.ftl | 35 - .../core/ast/cano-assignments.ftl.out | 34 - .../freemarker/core/ast/cano-builtins.ftl | 23 - .../freemarker/core/ast/cano-builtins.ftl.out | 23 - .../core/ast/cano-identifier-escaping.ftl | 76 - .../core/ast/cano-identifier-escaping.ftl.out | 44 - .../apache/freemarker/core/ast/cano-macros.ftl | 29 - .../freemarker/core/ast/cano-macros.ftl.out | 28 - .../core/ast/cano-strlitinterpolation.ftl | 19 - .../core/ast/cano-strlitinterpolation.ftl.out | 19 - .../core/ast/encodingOverride-ISO-8859-1.ftl | 20 - .../core/ast/encodingOverride-UTF-8.ftl | 20 - .../apache/freemarker/core/cano-assignments.ftl | 35 + .../freemarker/core/cano-assignments.ftl.out | 34 + .../apache/freemarker/core/cano-builtins.ftl | 23 + .../freemarker/core/cano-builtins.ftl.out | 23 + .../core/cano-identifier-escaping.ftl | 76 + .../core/cano-identifier-escaping.ftl.out | 44 + .../org/apache/freemarker/core/cano-macros.ftl | 29 + .../apache/freemarker/core/cano-macros.ftl.out | 28 + .../core/cano-strlitinterpolation.ftl | 19 + .../core/cano-strlitinterpolation.ftl.out | 19 + .../core/encodingOverride-ISO-8859-1.ftl | 20 + .../freemarker/core/encodingOverride-UTF-8.ftl | 20 + .../basic/WEB-INF/expected/customTags1.txt | 2 +- 736 files changed, 49045 insertions(+), 49388 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/build.xml ---------------------------------------------------------------------- diff --git a/build.xml b/build.xml index 1ca68b4..2e34ce6 100644 --- a/build.xml +++ b/build.xml @@ -131,7 +131,7 @@ /> <property name="_javaccOutputDir" - value="build/generated-sources/java/org/apache/freemarker/core/ast" + value="build/generated-sources/java/org/apache/freemarker/core" /> <mkdir dir="${_javaccOutputDir}" /> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java b/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java new file mode 100644 index 0000000..b7fc12b --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java @@ -0,0 +1,70 @@ +/* + * 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; + +import org.apache.freemarker.core.model.ObjectWrapper; +import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.impl.DefaultObjectWrapper; +import org.apache.freemarker.core.model.impl.SimpleHash; +import org.apache.freemarker.core.model.impl.SimpleSequence; + +/** + * Thrown when {@code ?api} is not supported by a value. + */ +class APINotSupportedTemplateException extends TemplateException { + + APINotSupportedTemplateException(Environment env, ASTExpression blamedExpr, TemplateModel model) { + super(null, env, blamedExpr, buildDescription(env, blamedExpr, model)); + } + + protected static _ErrorDescriptionBuilder buildDescription(Environment env, ASTExpression blamedExpr, + TemplateModel tm) { + final _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder( + "The value doesn't support ?api. See requirements in the FreeMarker Manual. (" + + "FTL type: ", new _DelayedFTLTypeDescription(tm), + ", TemplateModel class: ", new _DelayedShortClassName(tm.getClass()), + ", ObjectWapper: ", new _DelayedToString(env.getObjectWrapper()), ")" + ).blame(blamedExpr); + + if (blamedExpr.isLiteral()) { + desc.tip("Only adapted Java objects can possibly have API, not values created inside templates."); + } else { + ObjectWrapper ow = env.getObjectWrapper(); + if (ow instanceof DefaultObjectWrapper + && (tm instanceof SimpleHash || tm instanceof SimpleSequence)) { + DefaultObjectWrapper dow = (DefaultObjectWrapper) ow; + if (!dow.getUseAdaptersForContainers()) { + desc.tip("In the FreeMarker configuration, \"", Configurable.OBJECT_WRAPPER_KEY, + "\" is a DefaultObjectWrapper with its \"useAdaptersForContainers\" property set to " + + "false. Setting it to true might solves this problem."); + } else if (tm instanceof SimpleSequence && dow.getForceLegacyNonListCollections()) { + desc.tip("In the FreeMarker configuration, \"", + Configurable.OBJECT_WRAPPER_KEY, + "\" is a DefaultObjectWrapper with its \"forceLegacyNonListCollections\" property set " + + "to true. If you are trying to access the API of a non-List Collection, setting the " + + "\"forceLegacyNonListCollections\" property to false might solves this problem."); + } + } + } + + return desc; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTComment.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTComment.java b/src/main/java/org/apache/freemarker/core/ASTComment.java new file mode 100644 index 0000000..439bc81 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTComment.java @@ -0,0 +1,87 @@ +/* + * 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; + +import org.apache.freemarker.core.util._StringUtil; + +/** + * AST comment node + */ +final class ASTComment extends _ASTElement { + + private final String text; + + ASTComment(String text) { + this.text = text; + } + + @Override + _ASTElement[] accept(Environment env) { + // do nothing, skip the body + return null; + } + + @Override + protected String dump(boolean canonical) { + if (canonical) { + return "<#--" + text + "-->"; + } else { + return "comment " + _StringUtil.jQuote(text.trim()); + } + } + + @Override + String getNodeTypeSymbol() { + return "#--...--"; + } + + + @Override + int getParameterCount() { + return 1; + } + + @Override + Object getParameterValue(int idx) { + if (idx != 0) throw new IndexOutOfBoundsException(); + return text; + } + + @Override + ParameterRole getParameterRole(int idx) { + if (idx != 0) throw new IndexOutOfBoundsException(); + return ParameterRole.CONTENT; + } + + public String getText() { + return text; + } + + @Override + boolean isOutputCacheable() { + return true; + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java b/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java new file mode 100644 index 0000000..8b85fc6 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java @@ -0,0 +1,280 @@ +/* + * 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; + +import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateNumberModel; +import org.apache.freemarker.core.util.BugException; +import org.apache.freemarker.core.util._StringUtil; + +/** + * AST directive node: An instruction that makes a single assignment, like {@code <#local x=1>}, {@code <#global x=1>}, + * {@code <#assign x=1>}. + * This is also used as the child of {@link ASTDirAssignmentsContainer}, if there are multiple assignments in the same + * tag, like in {@code <#local x=1 y=2>}. + */ +final class ASTDirAssignment extends _ASTElement { + + // These must not clash with ArithmeticExpression.TYPE_... constants: + private static final int OPERATOR_TYPE_EQUALS = 0x10000; + private static final int OPERATOR_TYPE_PLUS_EQUALS = 0x10001; + private static final int OPERATOR_TYPE_PLUS_PLUS = 0x10002; + private static final int OPERATOR_TYPE_MINUS_MINUS = 0x10003; + + private final int/*enum*/ scope; + private final String variableName; + private final int operatorType; + private final ASTExpression valueExp; + private ASTExpression namespaceExp; + + static final int NAMESPACE = 1; + static final int LOCAL = 2; + static final int GLOBAL = 3; + + private static final Number ONE = Integer.valueOf(1); + + /** + * @param variableName the variable name to assign to. + * @param valueExp the expression to assign. + * @param scope the scope of the assignment, one of NAMESPACE, LOCAL, or GLOBAL + */ + ASTDirAssignment(String variableName, + int operator, + ASTExpression valueExp, + int scope) { + this.scope = scope; + + this.variableName = variableName; + + if (operator == FMParserConstants.EQUALS) { + operatorType = OPERATOR_TYPE_EQUALS; + } else { + switch (operator) { + case FMParserConstants.PLUS_PLUS: + operatorType = OPERATOR_TYPE_PLUS_PLUS; + break; + case FMParserConstants.MINUS_MINUS: + operatorType = OPERATOR_TYPE_MINUS_MINUS; + break; + case FMParserConstants.PLUS_EQUALS: + operatorType = OPERATOR_TYPE_PLUS_EQUALS; + break; + case FMParserConstants.MINUS_EQUALS: + operatorType = ArithmeticExpression.TYPE_SUBSTRACTION; + break; + case FMParserConstants.TIMES_EQUALS: + operatorType = ArithmeticExpression.TYPE_MULTIPLICATION; + break; + case FMParserConstants.DIV_EQUALS: + operatorType = ArithmeticExpression.TYPE_DIVISION; + break; + case FMParserConstants.MOD_EQUALS: + operatorType = ArithmeticExpression.TYPE_MODULO; + break; + default: + throw new BugException(); + } + } + + this.valueExp = valueExp; + } + + void setNamespaceExp(ASTExpression namespaceExp) { + if (scope != NAMESPACE && namespaceExp != null) throw new BugException(); + this.namespaceExp = namespaceExp; + } + + @Override + _ASTElement[] accept(Environment env) throws TemplateException { + final Environment.Namespace namespace; + if (namespaceExp == null) { + switch (scope) { + case LOCAL: + namespace = null; + break; + case GLOBAL: + namespace = env.getGlobalNamespace(); + break; + case NAMESPACE: + namespace = env.getCurrentNamespace(); + break; + default: + throw new BugException("Unexpected scope type: " + scope); + } + } else { + TemplateModel namespaceTM = namespaceExp.eval(env); + try { + namespace = (Environment.Namespace) namespaceTM; + } catch (ClassCastException e) { + throw new NonNamespaceException(namespaceExp, namespaceTM, env); + } + if (namespace == null) { + throw InvalidReferenceException.getInstance(namespaceExp, env); + } + } + + TemplateModel value; + if (operatorType == OPERATOR_TYPE_EQUALS) { + value = valueExp.eval(env); + valueExp.assertNonNull(value, env); + } else { + TemplateModel lhoValue; + if (namespace == null) { + lhoValue = env.getLocalVariable(variableName); + } else { + lhoValue = namespace.get(variableName); + } + + if (operatorType == OPERATOR_TYPE_PLUS_EQUALS) { // Add or concat operation + if (lhoValue == null) { + throw InvalidReferenceException.getInstance( + variableName, getOperatorTypeAsString(), env); + } + + value = valueExp.eval(env); + valueExp.assertNonNull(value, env); + value = ASTExpAddOrConcat._eval(env, namespaceExp, null, lhoValue, valueExp, value); + } else { // Numerical operation + Number lhoNumber; + if (lhoValue instanceof TemplateNumberModel) { + lhoNumber = EvalUtil.modelToNumber((TemplateNumberModel) lhoValue, null); + } else if (lhoValue == null) { + throw InvalidReferenceException.getInstance(variableName, getOperatorTypeAsString(), env); + } else { + throw new NonNumericalException(variableName, lhoValue, null, env); + } + + if (operatorType == OPERATOR_TYPE_PLUS_PLUS) { + value = ASTExpAddOrConcat._evalOnNumbers(env, getParentElement(), lhoNumber, ONE); + } else if (operatorType == OPERATOR_TYPE_MINUS_MINUS) { + value = ArithmeticExpression._eval( + env, getParentElement(), lhoNumber, ArithmeticExpression.TYPE_SUBSTRACTION, ONE); + } else { // operatorType == ArithmeticExpression.TYPE_... + Number rhoNumber = valueExp.evalToNumber(env); + value = ArithmeticExpression._eval(env, this, lhoNumber, operatorType, rhoNumber); + } + } + } + + if (namespace == null) { + env.setLocalVariable(variableName, value); + } else { + namespace.put(variableName, value); + } + return null; + } + + @Override + protected String dump(boolean canonical) { + StringBuilder buf = new StringBuilder(); + String dn = getParentElement() instanceof ASTDirAssignmentsContainer ? null : getNodeTypeSymbol(); + if (dn != null) { + if (canonical) buf.append("<"); + buf.append(dn); + buf.append(' '); + } + + buf.append(_StringUtil.toFTLTopLevelTragetIdentifier(variableName)); + + if (valueExp != null) { + buf.append(' '); + } + buf.append(getOperatorTypeAsString()); + if (valueExp != null) { + buf.append(' '); + buf.append(valueExp.getCanonicalForm()); + } + if (dn != null) { + if (namespaceExp != null) { + buf.append(" in "); + buf.append(namespaceExp.getCanonicalForm()); + } + if (canonical) buf.append(">"); + } + String result = buf.toString(); + return result; + } + + @Override + String getNodeTypeSymbol() { + return getDirectiveName(scope); + } + + static String getDirectiveName(int scope) { + if (scope == ASTDirAssignment.LOCAL) { + return "#local"; + } else if (scope == ASTDirAssignment.GLOBAL) { + return "#global"; + } else if (scope == ASTDirAssignment.NAMESPACE) { + return "#assign"; + } else { + return "#{unknown_assignment_type}"; + } + } + + @Override + int getParameterCount() { + return 5; + } + + @Override + Object getParameterValue(int idx) { + switch (idx) { + case 0: return variableName; + case 1: return getOperatorTypeAsString(); + case 2: return valueExp; + case 3: return Integer.valueOf(scope); + case 4: return namespaceExp; + default: throw new IndexOutOfBoundsException(); + } + } + + @Override + ParameterRole getParameterRole(int idx) { + switch (idx) { + case 0: return ParameterRole.ASSIGNMENT_TARGET; + case 1: return ParameterRole.ASSIGNMENT_OPERATOR; + case 2: return ParameterRole.ASSIGNMENT_SOURCE; + case 3: return ParameterRole.VARIABLE_SCOPE; + case 4: return ParameterRole.NAMESPACE; + default: throw new IndexOutOfBoundsException(); + } + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + + private String getOperatorTypeAsString() { + if (operatorType == OPERATOR_TYPE_EQUALS) { + return "="; + } else if (operatorType == OPERATOR_TYPE_PLUS_EQUALS) { + return "+="; + } else if (operatorType == OPERATOR_TYPE_PLUS_PLUS) { + return "++"; + } else if (operatorType == OPERATOR_TYPE_MINUS_MINUS) { + return "--"; + } else { + return ArithmeticExpression.getOperatorSymbol(operatorType) + "="; + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java b/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java new file mode 100644 index 0000000..d0a1a2a --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java @@ -0,0 +1,115 @@ +/* + * 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; + +import java.io.IOException; + +/** + * AST directive node: An instruction that does multiple assignments, like [#local x=1 x=2]. + * Each assignment is represented by a {@link ASTDirAssignment} child element. + * If there's only one assignment, its usually just a {@link ASTDirAssignment} without parent {@link ASTDirAssignmentsContainer}. + */ +final class ASTDirAssignmentsContainer extends _ASTElement { + + private int scope; + private ASTExpression namespaceExp; + + ASTDirAssignmentsContainer(int scope) { + this.scope = scope; + setChildBufferCapacity(1); + } + + void addAssignment(ASTDirAssignment assignment) { + addChild(assignment); + } + + void setNamespaceExp(ASTExpression namespaceExp) { + this.namespaceExp = namespaceExp; + int ln = getChildCount(); + for (int i = 0; i < ln; i++) { + ((ASTDirAssignment) getChild(i)).setNamespaceExp(namespaceExp); + } + } + + @Override + _ASTElement[] accept(Environment env) throws TemplateException, IOException { + return getChildBuffer(); + } + + @Override + protected String dump(boolean canonical) { + StringBuilder buf = new StringBuilder(); + if (canonical) buf.append('<'); + buf.append(ASTDirAssignment.getDirectiveName(scope)); + if (canonical) { + buf.append(' '); + int ln = getChildCount(); + for (int i = 0; i < ln; i++) { + if (i != 0) { + buf.append(", "); + } + ASTDirAssignment assignment = (ASTDirAssignment) getChild(i); + buf.append(assignment.getCanonicalForm()); + } + } else { + buf.append("-container"); + } + if (namespaceExp != null) { + buf.append(" in "); + buf.append(namespaceExp.getCanonicalForm()); + } + if (canonical) buf.append(">"); + return buf.toString(); + } + + @Override + int getParameterCount() { + return 2; + } + + @Override + Object getParameterValue(int idx) { + switch (idx) { + case 0: return Integer.valueOf(scope); + case 1: return namespaceExp; + default: return null; + } + } + + @Override + ParameterRole getParameterRole(int idx) { + switch (idx) { + case 0: return ParameterRole.VARIABLE_SCOPE; + case 1: return ParameterRole.NAMESPACE; + default: return null; + } + } + + @Override + String getNodeTypeSymbol() { + return ASTDirAssignment.getDirectiveName(scope); + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java b/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java new file mode 100644 index 0000000..e1eeb61 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java @@ -0,0 +1,88 @@ +/* + * 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; + +import java.io.IOException; + +/** + * AST directive node: Holder for the attempted section of the {@code #attempt} element and of the nested + * {@code #recover} element ({@link ASTDirRecover}). + */ +final class ASTDirAttemptRecoverContainer extends _ASTElement { + + private _ASTElement attemptedSection; + private ASTDirRecover recoverySection; + + ASTDirAttemptRecoverContainer(TemplateElements attemptedSectionChildren, ASTDirRecover recoverySection) { + _ASTElement attemptedSection = attemptedSectionChildren.asSingleElement(); + this.attemptedSection = attemptedSection; + this.recoverySection = recoverySection; + setChildBufferCapacity(2); + addChild(attemptedSection); // for backward compatibility + addChild(recoverySection); + } + + @Override + _ASTElement[] accept(Environment env) throws TemplateException, IOException { + env.visitAttemptRecover(this, attemptedSection, recoverySection); + return null; + } + + @Override + protected String dump(boolean canonical) { + if (!canonical) { + return getNodeTypeSymbol(); + } else { + StringBuilder buf = new StringBuilder(); + buf.append("<").append(getNodeTypeSymbol()).append(">"); + buf.append(getChildrenCanonicalForm()); + buf.append("</").append(getNodeTypeSymbol()).append(">"); + return buf.toString(); + } + } + + @Override + int getParameterCount() { + return 1; + } + + @Override + Object getParameterValue(int idx) { + if (idx != 0) throw new IndexOutOfBoundsException(); + return recoverySection; + } + + @Override + ParameterRole getParameterRole(int idx) { + if (idx != 0) throw new IndexOutOfBoundsException(); + return ParameterRole.ERROR_HANDLER; + } + + @Override + String getNodeTypeSymbol() { + return "#attempt"; + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java b/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java new file mode 100644 index 0000000..ed79109 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java @@ -0,0 +1,77 @@ +/* + * 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; + +import java.io.IOException; + +/** + * AST directive node: {@code #autoEsc} + */ +final class ASTDirAutoEsc extends _ASTElement { + + ASTDirAutoEsc(TemplateElements children) { + setChildren(children); + } + + @Override + _ASTElement[] accept(Environment env) throws TemplateException, IOException { + return getChildBuffer(); + } + + @Override + protected String dump(boolean canonical) { + if (canonical) { + return "<" + getNodeTypeSymbol() + "\">" + getChildrenCanonicalForm() + "</" + getNodeTypeSymbol() + ">"; + } else { + return getNodeTypeSymbol(); + } + } + + @Override + String getNodeTypeSymbol() { + return "#autoesc"; + } + + @Override + int getParameterCount() { + return 0; + } + + @Override + Object getParameterValue(int idx) { + throw new IndexOutOfBoundsException(); + } + + @Override + ParameterRole getParameterRole(int idx) { + throw new IndexOutOfBoundsException(); + } + + @Override + boolean isIgnorable(boolean stripWhitespace) { + return getChildCount() == 0; + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirBreak.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirBreak.java b/src/main/java/org/apache/freemarker/core/ASTDirBreak.java new file mode 100644 index 0000000..df10697 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirBreak.java @@ -0,0 +1,70 @@ +/* + * 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; + +/** + * AST directive node: {@code #break} + */ +final class ASTDirBreak extends _ASTElement { + + @Override + _ASTElement[] accept(Environment env) { + throw Break.INSTANCE; + } + + @Override + protected String dump(boolean canonical) { + return canonical ? "<" + getNodeTypeSymbol() + "/>" : getNodeTypeSymbol(); + } + + @Override + String getNodeTypeSymbol() { + return "#break"; + } + + @Override + int getParameterCount() { + return 0; + } + + @Override + Object getParameterValue(int idx) { + throw new IndexOutOfBoundsException(); + } + + @Override + ParameterRole getParameterRole(int idx) { + throw new IndexOutOfBoundsException(); + } + + static class Break extends RuntimeException { + static final Break INSTANCE = new Break(); + private Break() { + } + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + +} + + http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java b/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java new file mode 100644 index 0000000..d6ff929 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java @@ -0,0 +1,183 @@ +/* + * 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; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.Map; + +import org.apache.freemarker.core.model.TemplateModel; +import org.apache.freemarker.core.model.TemplateModelException; +import org.apache.freemarker.core.model.TemplateTransformModel; +import org.apache.freemarker.core.model.impl.SimpleScalar; + +/** + * AST directive node: Like {@code <#local x>...</#local>}. + */ +final class ASTDirCapturingAssignment extends _ASTElement { + + private final String varName; + private final ASTExpression namespaceExp; + private final int scope; + private final MarkupOutputFormat<?> markupOutputFormat; + + ASTDirCapturingAssignment(TemplateElements children, String varName, int scope, ASTExpression namespaceExp, MarkupOutputFormat<?> markupOutputFormat) { + setChildren(children); + this.varName = varName; + this.namespaceExp = namespaceExp; + this.scope = scope; + this.markupOutputFormat = markupOutputFormat; + } + + @Override + _ASTElement[] accept(Environment env) throws TemplateException, IOException { + _ASTElement[] children = getChildBuffer(); + if (children != null) { + env.visitAndTransform(children, new CaptureOutput(env), null); + } else { + TemplateModel value = capturedStringToModel(""); + if (namespaceExp != null) { + Environment.Namespace ns = (Environment.Namespace) namespaceExp.eval(env); + ns.put(varName, value); + } else if (scope == ASTDirAssignment.NAMESPACE) { + env.setVariable(varName, value); + } else if (scope == ASTDirAssignment.GLOBAL) { + env.setGlobalVariable(varName, value); + } else if (scope == ASTDirAssignment.LOCAL) { + env.setLocalVariable(varName, value); + } + } + return null; + } + + private TemplateModel capturedStringToModel(String s) throws TemplateModelException { + return markupOutputFormat == null ? new SimpleScalar(s) : markupOutputFormat.fromMarkup(s); + } + + private class CaptureOutput implements TemplateTransformModel { + private final Environment env; + private final Environment.Namespace fnsModel; + + CaptureOutput(Environment env) throws TemplateException { + this.env = env; + TemplateModel nsModel = null; + if (namespaceExp != null) { + nsModel = namespaceExp.eval(env); + if (!(nsModel instanceof Environment.Namespace)) { + throw new NonNamespaceException(namespaceExp, nsModel, env); + } + } + fnsModel = (Environment.Namespace ) nsModel; + } + + @Override + public Writer getWriter(Writer out, Map args) { + return new StringWriter() { + @Override + public void close() throws IOException { + TemplateModel result; + try { + result = capturedStringToModel(toString()); + } catch (TemplateModelException e) { + // [Java 1.6] e to cause + throw new IOException("Failed to create FTL value from captured string: " + e); + } + switch(scope) { + case ASTDirAssignment.NAMESPACE: { + if (fnsModel != null) { + fnsModel.put(varName, result); + } else { + env.setVariable(varName, result); + } + break; + } + case ASTDirAssignment.LOCAL: { + env.setLocalVariable(varName, result); + break; + } + case ASTDirAssignment.GLOBAL: { + env.setGlobalVariable(varName, result); + break; + } + } + } + }; + } + } + + @Override + protected String dump(boolean canonical) { + StringBuilder sb = new StringBuilder(); + if (canonical) sb.append("<"); + sb.append(getNodeTypeSymbol()); + sb.append(' '); + sb.append(varName); + if (namespaceExp != null) { + sb.append(" in "); + sb.append(namespaceExp.getCanonicalForm()); + } + if (canonical) { + sb.append('>'); + sb.append(getChildrenCanonicalForm()); + sb.append("</"); + sb.append(getNodeTypeSymbol()); + sb.append('>'); + } else { + sb.append(" = .nested_output"); + } + return sb.toString(); + } + + @Override + String getNodeTypeSymbol() { + return ASTDirAssignment.getDirectiveName(scope); + } + + @Override + int getParameterCount() { + return 3; + } + + @Override + Object getParameterValue(int idx) { + switch (idx) { + case 0: return varName; + case 1: return Integer.valueOf(scope); + case 2: return namespaceExp; + default: throw new IndexOutOfBoundsException(); + } + } + + @Override + ParameterRole getParameterRole(int idx) { + switch (idx) { + case 0: return ParameterRole.ASSIGNMENT_TARGET; + case 1: return ParameterRole.VARIABLE_SCOPE; + case 2: return ParameterRole.NAMESPACE; + default: throw new IndexOutOfBoundsException(); + } + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirCase.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirCase.java b/src/main/java/org/apache/freemarker/core/ASTDirCase.java new file mode 100644 index 0000000..7e8eff5 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirCase.java @@ -0,0 +1,91 @@ +/* + * 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; + +/** + * AST directive node: {@code #case} (inside a {@code #switch}) + */ +final class ASTDirCase extends _ASTElement { + + final int TYPE_CASE = 0; + final int TYPE_DEFAULT = 1; + + ASTExpression condition; + + ASTDirCase(ASTExpression matchingValue, TemplateElements children) { + condition = matchingValue; + setChildren(children); + } + + @Override + _ASTElement[] accept(Environment env) { + return getChildBuffer(); + } + + @Override + protected String dump(boolean canonical) { + StringBuilder sb = new StringBuilder(); + if (canonical) sb.append('<'); + sb.append(getNodeTypeSymbol()); + if (condition != null) { + sb.append(' '); + sb.append(condition.getCanonicalForm()); + } + if (canonical) { + sb.append('>'); + sb.append(getChildrenCanonicalForm()); + } + return sb.toString(); + } + + @Override + String getNodeTypeSymbol() { + return condition != null ? "#case" : "#default"; + } + + @Override + int getParameterCount() { + return 2; + } + + @Override + Object getParameterValue(int idx) { + switch (idx) { + case 0: return condition; + case 1: return Integer.valueOf(condition != null ? TYPE_CASE : TYPE_DEFAULT); + default: throw new IndexOutOfBoundsException(); + } + } + + @Override + ParameterRole getParameterRole(int idx) { + switch (idx) { + case 0: return ParameterRole.CONDITION; + case 1: return ParameterRole.AST_NODE_SUBTYPE; + default: throw new IndexOutOfBoundsException(); + } + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirCompress.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/freemarker/core/ASTDirCompress.java b/src/main/java/org/apache/freemarker/core/ASTDirCompress.java new file mode 100644 index 0000000..fb4c226 --- /dev/null +++ b/src/main/java/org/apache/freemarker/core/ASTDirCompress.java @@ -0,0 +1,87 @@ +/* + * 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; + +import java.io.IOException; + +import org.apache.freemarker.core.util.StandardCompress; + +/** + * AST directive node: {@code #compress}. + * An instruction that reduces all sequences of whitespace to a single + * space or newline. In addition, leading and trailing whitespace is removed. + * + * @see org.apache.freemarker.core.util.StandardCompress + */ +final class ASTDirCompress extends _ASTElement { + + ASTDirCompress(TemplateElements children) { + setChildren(children); + } + + @Override + _ASTElement[] accept(Environment env) throws TemplateException, IOException { + _ASTElement[] childBuffer = getChildBuffer(); + if (childBuffer != null) { + env.visitAndTransform(childBuffer, StandardCompress.INSTANCE, null); + } + return null; + } + + @Override + protected String dump(boolean canonical) { + if (canonical) { + return "<" + getNodeTypeSymbol() + ">" + getChildrenCanonicalForm() + "</" + getNodeTypeSymbol() + ">"; + } else { + return getNodeTypeSymbol(); + } + } + + @Override + String getNodeTypeSymbol() { + return "#compress"; + } + + @Override + int getParameterCount() { + return 0; + } + + @Override + Object getParameterValue(int idx) { + throw new IndexOutOfBoundsException(); + } + + @Override + ParameterRole getParameterRole(int idx) { + throw new IndexOutOfBoundsException(); + } + + @Override + boolean isIgnorable(boolean stripWhitespace) { + return getChildCount() == 0 && getParameterCount() == 0; + } + + @Override + boolean isNestedBlockRepeater() { + return false; + } + +}
