/* * Copyright 2011 JBoss Inc * * Licensed 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.jbpm.formapi.server.trans; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.net.URL; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.runtime.resource.loader.URLResourceLoader; import org.jbpm.formapi.shared.api.FBScript; import org.jbpm.formapi.shared.api.FormItemRepresentation; import org.jbpm.formapi.shared.api.FormRepresentation; public class ScriptingTranslator implements Translator { private final VelocityEngine engine = new VelocityEngine(); private final Map<URL, Template> templates = new HashMap<URL, Template>(); private final String language; private final String folderLocation; public ScriptingTranslator(String language, String folderClassPathLocation) { this.language = language; this.folderLocation = folderClassPathLocation; String url = getClass().getResource(folderClassPathLocation + "form.vm").toExternalForm(); String folderFileLocation = url.replace("form.vm", ""); engine.setProperty(RuntimeConstants.RESOURCE_LOADER, "url"); engine.setProperty("url." + RuntimeConstants.RESOURCE_LOADER + ".class", URLResourceLoader.class.getName()); engine.setProperty("url." + RuntimeConstants.RESOURCE_LOADER + ".root", folderFileLocation); engine.init(); } @Override public String getLanguage() { return language; } @Override public String translateItem(FormItemRepresentation item) throws TranslatorException { return runVelocityScript(item, item.getTypeId()); } @Override public URL translateForm(FormRepresentation form) throws TranslatorException { return saveToURL(runVelocityScript(form, "form")); } /* * utilitary methods */ private String runVelocityScript(Object item, String scriptName) throws TranslatorException { URL velocityTemplate = getClass().getResource(folderLocation + scriptName + ".vm"); if (velocityTemplate == null) { throw new TranslatorException("Unknown typeId: " + scriptName); } Template template = null; synchronized (this) { if (!templates.containsKey(velocityTemplate)) { Template temp = engine.getTemplate(scriptName + ".vm"); templates.put(velocityTemplate, temp); } template = templates.get(velocityTemplate); } VelocityContext context = new VelocityContext(); context.put("item", item); context.put("language", this); StringWriter writer = new StringWriter(); template.merge(context, writer); return writer.toString(); } private URL saveToURL(String fileContent) throws TranslatorException { try { File tmpFile = File.createTempFile("formBuilderTrans", ".ftl"); FileUtils.writeStringToFile(tmpFile, fileContent); return new URL(URLDecoder.decode(tmpFile.toURI().toString(), "UTF-8")); } catch (IOException e) { throw new TranslatorException("Problem saving URL file", e); } } public String getParam(String paramName, String paramValue) { StringBuilder builder = new StringBuilder(""); if (paramValue != null && !"".equals(paramValue)) { builder.append(paramName).append("=\"").append(paramValue).append("\" "); } return builder.toString(); } public String getParam(String paramName, Integer paramValue) { StringBuilder builder = new StringBuilder(""); if (paramValue != null) { builder.append(paramName).append("=\"").append(paramValue).append("\" "); } return builder.toString(); } public String getStyleParam(String paramName, String paramValue) { StringBuilder builder = new StringBuilder(""); if (paramValue != null && !"".equals(paramValue)) { builder.append(paramName).append(": ").append(paramValue).append("; "); } return builder.toString(); } public String getOnEventParams(FormItemRepresentation item) { Map<String, FBScript> actions = item.getEventActions(); StringBuilder builder = new StringBuilder(); for (Map.Entry<String, FBScript> entry : actions.entrySet()) { String attrName = entry.getKey(); FBScript script = entry.getValue(); if (script != null) { String attrContent = script.getContent().replaceAll("\n", " "); builder.append(getParam(attrName, attrContent)).append(' '); } } return builder.toString(); } }