/* * Milyn - Copyright (C) 2006 - 2010 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License (version 2.1) as published by the Free Software * Foundation. * * This library 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 Lesser General Public License for more details: * http://www.gnu.org/licenses/lgpl.txt */ package org.milyn.javabean.dynamic.serialize.freemarker; import freemarker.core.Environment; import freemarker.ext.beans.BeanModel; import freemarker.ext.beans.StringModel; import freemarker.template.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.milyn.javabean.dynamic.BeanMetadata; import org.milyn.javabean.dynamic.BeanRegistrationException; import org.milyn.javabean.dynamic.Model; import org.milyn.javabean.dynamic.serialize.BeanWriter; import org.milyn.xml.XmlUtil; import java.io.IOException; import java.io.StringWriter; import java.util.Arrays; import java.util.Map; /** * Write bean directive. * @author <a href="mailto:tom.fennelly@gmail.com">tom.fennelly@gmail.com</a> */ public class WriteBeanDirective extends AbstractBeanDirective { private static Log logger = LogFactory.getLog(WriteBeanDirective.class); public void execute(Environment environment, Map params, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException { Object bean = getBeanObject(environment, params, "writeBean"); SimpleScalar indentScalar = (SimpleScalar) params.get("indent"); int indent = 0; if(indentScalar != null) { String indentParamVal = indentScalar.getAsString().trim(); try { indent = Integer.parseInt(indentParamVal); indent = Math.min(indent, 100); } catch(NumberFormatException e) { logger.debug("Invalid <@writeNamespaces> 'indent' parameter value '" + indentParamVal + "'. Must be a valid integer (<= 100)."); } } BeanModel modelBeanModel = (BeanModel) environment.getDataModel().get(FreeMarkerBeanWriter.MODEL_CTX_KEY); Model model = (Model) modelBeanModel.getWrappedObject(); BeanMetadata beanMetadata = model.getBeanMetadata(bean); if(beanMetadata == null) { BeanRegistrationException.throwUnregisteredBeanInstanceException(bean); } BeanWriter beanWriter = beanMetadata.getWriter(); if(beanMetadata.getPreText() != null) { environment.getOut().write(beanMetadata.getPreText()); } if(indent > 0) { StringWriter beanWriteBuffer = new StringWriter(); beanWriteBuffer.write('\n'); beanWriter.write(bean, beanWriteBuffer, model); environment.getOut().write(XmlUtil.indent(beanWriteBuffer.toString(), indent)); } else { beanWriter.write(bean, environment.getOut(), model); } } }