/* * Copyright (C) 2003-2011 eXo Platform SAS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.wikbook.template.freemarker.caller; import freemarker.template.SimpleScalar; import freemarker.template.TemplateMethodModel; import freemarker.template.TemplateModelException; import org.wikbook.template.freemarker.TemplateExpression; import org.wikbook.template.freemarker.FreemarkerDataFactory; import org.wikbook.template.processing.metamodel.TemplateAnnotation; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; /** * @author <a href="mailto:alain.defrance@exoplatform.com">Alain Defrance</a> * @version $Revision$ */ public class AttributeCallerMethod implements TemplateMethodModel { private Map<String, Object> attributes; private FreemarkerDataFactory dataFactory; public AttributeCallerMethod(final FreemarkerDataFactory dataFactory, final Map<String, Object> attributes) { this.attributes = attributes; this.dataFactory = dataFactory; } public Object exec(final List arguments) throws TemplateModelException { TemplateExpression e = new TemplateExpression((String) arguments.get(0)); Object got = attributes.get(e.getValue()); if (got != null) { Class valuesClass = got.getClass(); // Array if (valuesClass.isArray()) { // Annotation[] if (TemplateAnnotation.class.equals(valuesClass.getComponentType())) { List<Map<String, Object>> l = new ArrayList<Map<String, Object>>(); for (TemplateAnnotation annotation : (TemplateAnnotation[]) got) { l.add(dataFactory.create(annotation)); } return l; } // Object[] else { return performArray(Arrays.asList((String[]) got), e); } } // Single value else { // Annotation if (got instanceof TemplateAnnotation) { return dataFactory.create((TemplateAnnotation) got); } // Object else { return new SimpleScalar(got.toString()); } } } else { return null; } } private Object performArray(List<String> data, TemplateExpression e) { // switch (e.getOutput()) { case LIST: case NONE: return data; case FLAT: case BLOC: case NOEXPR: return e.flatStringList(data); } // if (e.getOutput().equals(TemplateExpression.Output.LIST)) { return Collections.emptyList(); } // return ""; } }