/*
* $Id$
*
* 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.struts2.views.freemarker.tags;
import java.io.StringWriter;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.struts2.StrutsInternalTestCase;
import org.apache.struts2.components.Component;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ognl.OgnlValueStack;
import freemarker.ext.util.WrapperTemplateModel;
import freemarker.template.AdapterTemplateModel;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateCollectionModel;
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateModelIterator;
import freemarker.template.TemplateNumberModel;
import freemarker.template.TemplateScalarModel;
import freemarker.template.TemplateSequenceModel;
public class TagModelTest extends StrutsInternalTestCase {
final Object ADAPTER_TEMPLATE_MODEL_CONTAINED_OBJECT = new Object();
final Object WRAPPING_TEMPLATE_MODEL_CONTAINED_OBJECT = new Object();
public void testUnwrapMap() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
OgnlValueStack stack = (OgnlValueStack)ActionContext.getContext().getValueStack();
Map params = new LinkedHashMap();
// Try to test out the commons Freemarker's Template Model
// TemplateBooleanModel
params.put("property1", new TemplateBooleanModel() {
public boolean getAsBoolean() throws TemplateModelException {
return true;
}
});
params.put("property2", new TemplateBooleanModel() {
public boolean getAsBoolean() throws TemplateModelException {
return false;
}
});
// TemplateScalarModel
params.put("property3", new TemplateScalarModel() {
public String getAsString() throws TemplateModelException {
return "toby";
}
});
params.put("property4", new TemplateScalarModel() {
public String getAsString() throws TemplateModelException {
return "phil";
}
});
// TemplateNumberModel
params.put("property5", new TemplateNumberModel() {
public Number getAsNumber() throws TemplateModelException {
return new Integer("10");
}
});
params.put("property6", new TemplateNumberModel() {
public Number getAsNumber() throws TemplateModelException {
return new Float("1.1");
}
});
// TemplateHashModel
params.put("property7", new TemplateHashModel() {
public TemplateModel get(String arg0) throws TemplateModelException {
return null;
}
public boolean isEmpty() throws TemplateModelException {
return true;
}
});
// TemplateSequenceModel
params.put("property8", new TemplateSequenceModel() {
public TemplateModel get(int arg0) throws TemplateModelException {
return null;
}
public int size() throws TemplateModelException {
return 0;
}
});
// TemplateCollectionModel
params.put("property9", new TemplateCollectionModel() {
public TemplateModelIterator iterator() throws TemplateModelException {
return new TemplateModelIterator() {
private Iterator i;
{
i = Collections.EMPTY_LIST.iterator();
}
public boolean hasNext() throws TemplateModelException {
return i.hasNext();
}
public TemplateModel next() throws TemplateModelException {
return (TemplateModel) i.next();
}
};
}
});
// AdapterTemplateModel
params.put("property10", new AdapterTemplateModel() {
public Object getAdaptedObject(Class arg0) {
return ADAPTER_TEMPLATE_MODEL_CONTAINED_OBJECT;
}
});
// WrapperTemplateModel
params.put("property11", new WrapperTemplateModel() {
public Object getWrappedObject() {
return WRAPPING_TEMPLATE_MODEL_CONTAINED_OBJECT;
}
});
TagModel tagModel = new TagModel(stack, request, response) {
protected Component getBean() {
return null;
}
};
Map result = tagModel.unwrapParameters(params);
assertNotNull(result);
assertEquals(result.size(), 11);
assertEquals(result.get("property1"), Boolean.TRUE);
assertEquals(result.get("property2"), Boolean.FALSE);
assertEquals(result.get("property3"), "toby");
assertEquals(result.get("property4"), "phil");
assertEquals(result.get("property5"), new Integer(10));
assertEquals(result.get("property6"), new Float(1.1));
assertNotNull(result.get("property7"));
assertTrue(result.get("property7") instanceof Map);
assertNotNull(result.get("property8"));
assertTrue(result.get("property8") instanceof Collection);
assertNotNull(result.get("property9"));
assertTrue(result.get("property9") instanceof Collection);
assertEquals(result.get("property10"),
ADAPTER_TEMPLATE_MODEL_CONTAINED_OBJECT);
assertEquals(result.get("property11"),
WRAPPING_TEMPLATE_MODEL_CONTAINED_OBJECT);
}
public void testGetWriter() throws Exception {
OgnlValueStack stack = (OgnlValueStack)ActionContext.getContext().getValueStack();
final InternalBean bean = new InternalBean(stack);
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
Map params = new LinkedHashMap();
// Try to test out the commons Freemarker's Template Model
// TemplateBooleanModel
params.put("property1", new TemplateBooleanModel() {
public boolean getAsBoolean() throws TemplateModelException {
return true;
}
});
params.put("property2", new TemplateBooleanModel() {
public boolean getAsBoolean() throws TemplateModelException {
return false;
}
});
// TemplateScalarModel
params.put("property3", new TemplateScalarModel() {
public String getAsString() throws TemplateModelException {
return "toby";
}
});
params.put("property4", new TemplateScalarModel() {
public String getAsString() throws TemplateModelException {
return "phil";
}
});
// TemplateNumberModel
params.put("property5", new TemplateNumberModel() {
public Number getAsNumber() throws TemplateModelException {
return new Integer("10");
}
});
params.put("property6", new TemplateNumberModel() {
public Number getAsNumber() throws TemplateModelException {
return new Float("1.1");
}
});
// TemplateHashModel
params.put("property7", new TemplateHashModel() {
public TemplateModel get(String arg0) throws TemplateModelException {
return null;
}
public boolean isEmpty() throws TemplateModelException {
return true;
}
});
// TemplateSequenceModel
params.put("property8", new TemplateSequenceModel() {
public TemplateModel get(int arg0) throws TemplateModelException {
return null;
}
public int size() throws TemplateModelException {
return 0;
}
});
// TemplateCollectionModel
params.put("property9", new TemplateCollectionModel() {
public TemplateModelIterator iterator() throws TemplateModelException {
return new TemplateModelIterator() {
private Iterator i;
{
i = Collections.EMPTY_LIST.iterator();
}
public boolean hasNext() throws TemplateModelException {
return i.hasNext();
}
public TemplateModel next() throws TemplateModelException {
return (TemplateModel) i.next();
}
};
}
});
// AdapterTemplateModel
params.put("property10", new AdapterTemplateModel() {
public Object getAdaptedObject(Class arg0) {
return ADAPTER_TEMPLATE_MODEL_CONTAINED_OBJECT;
}
});
// WrapperTemplateModel
params.put("property11", new WrapperTemplateModel() {
public Object getWrappedObject() {
return WRAPPING_TEMPLATE_MODEL_CONTAINED_OBJECT;
}
});
TagModel tagModel = new TagModel(stack, request, response) {
protected Component getBean() {
return bean;
}
};
tagModel.getWriter(new StringWriter(), params);
assertNotNull(bean);
assertEquals(bean.getProperty1(), true);
assertEquals(bean.getProperty2(), false);
assertEquals(bean.getProperty3(), "toby");
assertEquals(bean.getProperty4(), "phil");
assertEquals(bean.getProperty5(), new Integer(10));
assertEquals(bean.getProperty6(), new Float(1.1));
assertNotNull(bean.getProperty7());
assertTrue(bean.getProperty7() instanceof Map);
assertNotNull(bean.getProperty8());
assertTrue(bean.getProperty8() instanceof Collection);
assertNotNull(bean.getProperty9());
assertTrue(bean.getProperty9() instanceof Collection);
assertEquals(bean.getProperty10(), ADAPTER_TEMPLATE_MODEL_CONTAINED_OBJECT);
assertEquals(bean.getProperty11(), WRAPPING_TEMPLATE_MODEL_CONTAINED_OBJECT);
}
public static class InternalBean extends Component {
public InternalBean(OgnlValueStack stack) {
super(stack);
}
private boolean property1 = false; // inverse of the expected result, so we could test that it works
private boolean property2 = true; // inverse of the expected result, so we could test that it works
private String property3;
private String property4;
private Integer property5;
private Float property6;
private Map property7;
private Collection property8;
private Collection property9;
private Object property10;
private Object property11;
public void setProperty1(boolean property1) {
this.property1 = property1;
}
public boolean getProperty1() {
return property1;
}
public void setProperty2(boolean property2) {
this.property2 = property2;
}
public boolean getProperty2() {
return property2;
}
public void setProperty3(String property3) {
this.property3 = property3;
}
public String getProperty3() {
return this.property3;
}
public void setProperty4(String property4) {
this.property4 = property4;
}
public String getProperty4() {
return this.property4;
}
public void setProperty5(Integer property5) {
this.property5 = property5;
}
public Integer getProperty5() {
return this.property5;
}
public void setProperty6(Float property6) {
this.property6 = property6;
}
public Float getProperty6() {
return this.property6;
}
public void setProperty7(Map property7) {
this.property7 = property7;
}
public Map getProperty7() {
return property7;
}
public void setProperty8(Collection property8) {
this.property8 = property8;
}
public Collection getProperty8() {
return property8;
}
public void setProperty9(Collection property9) {
this.property9 = property9;
}
public Collection getProperty9() {
return this.property9;
}
public void setProperty10(Object property10) {
this.property10 = property10;
}
public Object getProperty10() {
return this.property10;
}
public void setProperty11(Object property11) {
this.property11 = property11;
}
public Object getProperty11() {
return this.property11;
}
}
}