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/09/13 09:49:05 UTC
[04/36] incubator-freemarker git commit: FREEMARKER-55: splitting
abstract class to keep common things
FREEMARKER-55: splitting abstract class to keep common things
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/aeaf0307
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/aeaf0307
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/aeaf0307
Branch: refs/heads/3
Commit: aeaf0307736008b2921c7efa42cf7d31b2df6dbc
Parents: b656f1e
Author: Woonsan Ko <wo...@apache.org>
Authored: Tue Aug 29 23:02:21 2017 -0400
Committer: Woonsan Ko <wo...@apache.org>
Committed: Tue Aug 29 23:02:21 2017 -0400
----------------------------------------------------------------------
.../AbstractSpringTemplateDirectiveModel.java | 97 ++++++++++++++++++++
.../freemarker/spring/model/BindDirective.java | 62 +++----------
2 files changed, 110 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/aeaf0307/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java
new file mode 100644
index 0000000..9baf3f0
--- /dev/null
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/AbstractSpringTemplateDirectiveModel.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.spring.model;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.freemarker.core.CallPlace;
+import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.TemplateDirectiveModel;
+import org.apache.freemarker.core.model.TemplateModel;
+import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
+import org.springframework.web.servlet.support.RequestContext;
+import org.springframework.web.servlet.view.AbstractTemplateView;
+
+public abstract class AbstractSpringTemplateDirectiveModel implements TemplateDirectiveModel {
+
+ /**
+ * @see <code>org.springframework.web.servlet.tags.NestedPathTag#NESTED_PATH_VARIABLE_NAME</code>
+ */
+ private static final String NESTED_PATH_VARIABLE_NAME = "nestedPath";
+
+ private final HttpServletRequest request;
+ private final HttpServletResponse response;
+
+ public AbstractSpringTemplateDirectiveModel(HttpServletRequest request, HttpServletResponse response) {
+ this.request = request;
+ this.response = response;
+ }
+
+ @Override
+ public final void execute(TemplateModel[] args, CallPlace callPlace, Writer out, Environment env)
+ throws TemplateException, IOException {
+ final ObjectWrapper objectWrapper = env.getObjectWrapper();
+
+ if (!(objectWrapper instanceof DefaultObjectWrapper)) {
+ throw new TemplateException(
+ "The ObjectWrapper of environment wasn't instance of " + DefaultObjectWrapper.class.getName());
+ }
+
+ TemplateModel rcModel = env.getVariable(AbstractTemplateView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE);
+
+ if (rcModel == null) {
+ throw new TemplateException(AbstractTemplateView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE + " not found.");
+ }
+
+ RequestContext requestContext = (RequestContext) ((DefaultObjectWrapper) objectWrapper).unwrap(rcModel);
+
+ executeInternal(args, callPlace, out, env, (DefaultObjectWrapper) objectWrapper, requestContext);
+ }
+
+ protected abstract void executeInternal(TemplateModel[] args, CallPlace callPlace, Writer out, Environment env,
+ DefaultObjectWrapper objectWrapper, RequestContext requestContext) throws TemplateException, IOException;
+
+ protected final HttpServletRequest getRequest() {
+ return request;
+ }
+
+ protected final HttpServletResponse getResponse() {
+ return response;
+ }
+
+ protected final String resolveNestedPath(final Environment env, final String path) {
+ // TODO: should read it from request or env??
+ // or read spring.nestedPath first and read request attribute next??
+ String nestedPath = (String) request.getAttribute(NESTED_PATH_VARIABLE_NAME);
+
+ if (nestedPath != null && !path.startsWith(nestedPath)
+ && !path.equals(nestedPath.substring(0, nestedPath.length() - 1))) {
+ return nestedPath + path;
+ }
+
+ return path;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/aeaf0307/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
index fb68384..18ba1dd 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/BindDirective.java
@@ -29,8 +29,6 @@ import org.apache.freemarker.core.CallPlace;
import org.apache.freemarker.core.Environment;
import org.apache.freemarker.core.TemplateException;
import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.core.model.TemplateDirectiveModel;
import org.apache.freemarker.core.model.TemplateModel;
import org.apache.freemarker.core.model.impl.BeanModel;
import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
@@ -38,58 +36,35 @@ import org.apache.freemarker.core.util.CallableUtils;
import org.apache.freemarker.core.util.StringToIndexMap;
import org.springframework.web.servlet.support.BindStatus;
import org.springframework.web.servlet.support.RequestContext;
-import org.springframework.web.servlet.view.AbstractTemplateView;
-public class BindDirective implements TemplateDirectiveModel {
-
- public static final String STATUS_VARIABLE_NAME = "status";
-
- /**
- * @see <code>org.springframework.web.servlet.tags.NestedPathTag#NESTED_PATH_VARIABLE_NAME</code>
- */
- private static final String NESTED_PATH_VARIABLE_NAME = "nestedPath";
+public class BindDirective extends AbstractSpringTemplateDirectiveModel {
private static final int PATH_PARAM_IDX = 0;
private static final int IGNORE_NESTED_PATH_PARAM_IDX = 1;
private static final String IGNORE_NESTED_PATH_PARAM_NAME = "ignoreNestedPath";
- private static final ArgumentArrayLayout ARGS_LAYOUT = ArgumentArrayLayout.create(
- 1,
- true,
- StringToIndexMap.of(
- IGNORE_NESTED_PATH_PARAM_NAME, IGNORE_NESTED_PATH_PARAM_IDX
- ),
- false
- );
-
- private final HttpServletRequest request;
- private final HttpServletResponse response;
+ private static final ArgumentArrayLayout ARGS_LAYOUT =
+ ArgumentArrayLayout.create(
+ 1,
+ true,
+ StringToIndexMap.of(IGNORE_NESTED_PATH_PARAM_NAME, IGNORE_NESTED_PATH_PARAM_IDX),
+ false
+ );
public BindDirective(HttpServletRequest request, HttpServletResponse response) {
- this.request = request;
- this.response = response;
+ super(request, response);
}
@Override
- public void execute(TemplateModel[] args, CallPlace callPlace, Writer out, Environment env)
- throws TemplateException, IOException {
- final ObjectWrapper objectWrapper = env.getObjectWrapper();
-
- if (!(objectWrapper instanceof DefaultObjectWrapper)) {
- throw new TemplateException("The ObjectWrapper of environment wasn't instance of " + DefaultObjectWrapper.class.getName());
- }
-
- TemplateModel model = env.getDataModel().get(AbstractTemplateView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE);
- RequestContext requestContext = (RequestContext) ((DefaultObjectWrapper) objectWrapper).unwrap(model);
+ protected void executeInternal(TemplateModel[] args, CallPlace callPlace, Writer out, Environment env,
+ DefaultObjectWrapper objectWrapper, RequestContext requestContext) throws TemplateException, IOException {
- String resolvedPath = CallableUtils.getStringArgument(args, PATH_PARAM_IDX, this);
+ final String path = CallableUtils.getStringArgument(args, PATH_PARAM_IDX, this);
boolean ignoreNestedPath = CallableUtils.getOptionalBooleanArgument(args, IGNORE_NESTED_PATH_PARAM_IDX, this,
false);
- if (!ignoreNestedPath) {
- resolvedPath = resolveNestedPath(resolvedPath);
- }
+ final String resolvedPath = (ignoreNestedPath) ? path : resolveNestedPath(env, path);
//TODO: how to deal with htmlEscape when invoking #getBindStatus()?
BindStatus status = requestContext.getBindStatus(resolvedPath);
@@ -107,15 +82,4 @@ public class BindDirective implements TemplateDirectiveModel {
public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
return ARGS_LAYOUT;
}
-
- private String resolveNestedPath(final String path) {
- String nestedPath = (String) request.getAttribute(NESTED_PATH_VARIABLE_NAME);
-
- if (nestedPath != null && !path.startsWith(nestedPath)
- && !path.equals(nestedPath.substring(0, nestedPath.length() - 1))) {
- return nestedPath + path;
- }
-
- return path;
- }
}