You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by wo...@apache.org on 2018/01/04 19:49:25 UTC
[02/13] incubator-freemarker git commit: FREEMARKER-55: skeletal unit
test for input tag
FREEMARKER-55: skeletal unit test for input tag
Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/fb2ae5cc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/fb2ae5cc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/fb2ae5cc
Branch: refs/heads/3
Commit: fb2ae5cc81c4160c7bc694e0d85b8d979a61db49
Parents: 150ad7f
Author: Woonsan Ko <wo...@apache.org>
Authored: Sat Dec 23 17:43:33 2017 -0500
Committer: Woonsan Ko <wo...@apache.org>
Committed: Sat Dec 23 17:43:33 2017 -0500
----------------------------------------------------------------------
.../model/SpringTemplateCallableHashModel.java | 3 +
...stractHtmlElementTemplateDirectiveModel.java | 21 ++++++
.../model/form/InputTemplateDirectiveModel.java | 19 +-----
.../SpringFormTemplateCallableHashModel.java | 57 ++++++++++++++++
.../form/InputTemplateDirectiveModelTest.java | 71 ++++++++++++++++++++
.../test/model/form/input-directive-usages.ftlh | 27 ++++++++
6 files changed, 180 insertions(+), 18 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
index eb17233..762222c 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/SpringTemplateCallableHashModel.java
@@ -30,6 +30,7 @@ import org.apache.freemarker.core.TemplateException;
import org.apache.freemarker.core.model.TemplateHashModel;
import org.apache.freemarker.core.model.TemplateModel;
import org.apache.freemarker.core.model.TemplateStringModel;
+import org.apache.freemarker.spring.model.form.SpringFormTemplateCallableHashModel;
/**
* TemplateHashModel wrapper for templates using Spring directives, functions and internal models.
@@ -67,6 +68,8 @@ public final class SpringTemplateCallableHashModel implements TemplateHashModel,
modelsMap.put(TransformFunction.NAME, new TransformFunction(request, response));
modelsMap.put(UrlFunction.NAME, new UrlFunction(request, response));
modelsMap.put(EvalFunction.NAME, new EvalFunction(request, response));
+
+ modelsMap.put(SpringFormTemplateCallableHashModel.NAME, new SpringFormTemplateCallableHashModel(request, response));
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
index a0766f8..23b3d43 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/AbstractHtmlElementTemplateDirectiveModel.java
@@ -11,6 +11,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.ArgumentArrayLayout;
import org.apache.freemarker.core.model.TemplateBooleanModel;
import org.apache.freemarker.core.model.TemplateHashModelEx;
import org.apache.freemarker.core.model.TemplateModel;
@@ -53,6 +54,16 @@ public abstract class AbstractHtmlElementTemplateDirectiveModel
"onkeydown")
);
+ private static final int PATH_PARAM_IDX = 0;
+
+ private static final ArgumentArrayLayout ARGS_LAYOUT =
+ ArgumentArrayLayout.create(
+ 1,
+ false,
+ null,
+ true
+ );
+
private Map<String, Object> attributes;
private Map<String, Object> unmodifiableAttributes = Collections.emptyMap();
@@ -60,6 +71,11 @@ public abstract class AbstractHtmlElementTemplateDirectiveModel
super(request, response);
}
+ @Override
+ public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
+ return ARGS_LAYOUT;
+ }
+
public Map<String, Object> getAttributes() {
return unmodifiableAttributes;
}
@@ -81,6 +97,11 @@ public abstract class AbstractHtmlElementTemplateDirectiveModel
attributes.put(localName, value);
}
+ protected String getPathArgument(TemplateModel[] args) throws TemplateException {
+ final String path = CallableUtils.getStringArgument(args, PATH_PARAM_IDX, this);
+ return path;
+ }
+
protected boolean isAllowedAttribute(String localName, Object value) {
return ALLOWED_ATTRIBUTES.containsKey(localName.toUpperCase());
}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
index 293da38..60dbe6a 100644
--- a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModel.java
@@ -11,10 +11,8 @@ 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.ArgumentArrayLayout;
import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.util.CallableUtils;
import org.springframework.web.servlet.support.RequestContext;
public class InputTemplateDirectiveModel extends AbstractHtmlElementTemplateDirectiveModel {
@@ -32,16 +30,6 @@ public class InputTemplateDirectiveModel extends AbstractHtmlElementTemplateDire
)
);
- private static final int PATH_PARAM_IDX = 0;
-
- private static final ArgumentArrayLayout ARGS_LAYOUT =
- ArgumentArrayLayout.create(
- 1,
- false,
- null,
- true
- );
-
protected InputTemplateDirectiveModel(HttpServletRequest request, HttpServletResponse response) {
super(request, response);
}
@@ -52,16 +40,11 @@ public class InputTemplateDirectiveModel extends AbstractHtmlElementTemplateDire
}
@Override
- public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
- return ARGS_LAYOUT;
- }
-
- @Override
protected void executeInternal(TemplateModel[] args, CallPlace callPlace, Writer out, Environment env,
ObjectWrapperAndUnwrapper objectWrapperAndUnwrapper, RequestContext requestContext)
throws TemplateException, IOException {
- final String path = CallableUtils.getStringArgument(args, PATH_PARAM_IDX, this);
+ final String path = getPathArgument(args);
setAttributes(args);
// TODO: convert value properly and write tag and attributes properly.
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
new file mode 100644
index 0000000..aeec2bb
--- /dev/null
+++ b/freemarker-spring/src/main/java/org/apache/freemarker/spring/model/form/SpringFormTemplateCallableHashModel.java
@@ -0,0 +1,57 @@
+/*
+ * 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.form;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.TemplateHashModel;
+import org.apache.freemarker.core.model.TemplateModel;
+
+/**
+ * TemplateHashModel wrapper for templates using Spring directives, functions and internal models.
+ */
+//TODO [FM3] Shouldn't this be a TemplateHashModelEx?
+public final class SpringFormTemplateCallableHashModel implements TemplateHashModel, Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Spring form namespace model name.
+ */
+ public static final String NAME = "form";
+
+ private final Map<String, TemplateModel> modelsMap = new HashMap<>();
+
+ public SpringFormTemplateCallableHashModel(final HttpServletRequest request, final HttpServletResponse response) {
+ modelsMap.put(InputTemplateDirectiveModel.NAME, new InputTemplateDirectiveModel(request, response));
+ }
+
+ @Override
+ public TemplateModel get(String key) throws TemplateException {
+ return modelsMap.get(key);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java b/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java
new file mode 100644
index 0000000..048d935
--- /dev/null
+++ b/freemarker-spring/src/test/java/org/apache/freemarker/spring/model/form/InputTemplateDirectiveModelTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.form;
+
+import org.apache.freemarker.spring.example.mvc.users.User;
+import org.apache.freemarker.spring.example.mvc.users.UserRepository;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration("classpath:META-INF/web-resources")
+@ContextConfiguration(locations = { "classpath:org/apache/freemarker/spring/example/mvc/users/users-mvc-context.xml" })
+public class InputTemplateDirectiveModelTest {
+
+ @Autowired
+ private WebApplicationContext wac;
+
+ @Autowired
+ private UserRepository userRepository;
+
+ private MockMvc mockMvc;
+
+ @Before
+ public void setUp() {
+ mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
+ }
+
+ @Test
+ public void testBasicUsages() throws Exception {
+ final Long userId = userRepository.getUserIds().iterator().next();
+ final User user = userRepository.getUser(userId);
+ mockMvc.perform(get("/users/{userId}/", userId).param("viewName", "test/model/form/input-directive-usages")
+ .accept(MediaType.parseMediaType("text/html"))).andExpect(status().isOk())
+ .andExpect(content().contentTypeCompatibleWith("text/html")).andDo(print())
+ .andExpect(xpath("//div[@id='userEmail']/input/@type").string("text"))
+ .andExpect(xpath("//div[@id='userEmail']/input/@value").string(user.getEmail()));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/fb2ae5cc/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh
----------------------------------------------------------------------
diff --git a/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh b/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh
new file mode 100644
index 0000000..801b234
--- /dev/null
+++ b/freemarker-spring/src/test/resources/META-INF/web-resources/views/test/model/form/input-directive-usages.ftlh
@@ -0,0 +1,27 @@
+<#--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<html>
+<body>
+
+ <div id="userEmail">
+ <@spring.form.input 'user.email' type='text' value='${user.email!}' />
+ </div>
+
+</body>
+</html>