/*
* JBoss, Home of Professional Open Source
* Copyright 2006, JBoss Inc., and others contributors as indicated
* by the @authors tag. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2005-2006, JBoss Inc.
*/
package org.jboss.tools.smooks.templating.template.util;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jboss.tools.smooks.templating.template.ValueMapping;
import org.jboss.tools.smooks.templating.template.exception.TemplateBuilderException;
import org.milyn.javabean.decoders.DateDecoder;
/**
* FreeMarker utility methods.
*
* @author <a href="mailto:tom.fennelly@jboss.com">tom.fennelly@jboss.com</a>
*/
public class FreeMarkerUtil {
public static String extractJavaPath(String dollarVariable) throws TemplateBuilderException {
return splitDollarVariable(dollarVariable)[0];
}
public static String extractRawFormatting(String dollarVariable) throws TemplateBuilderException {
return splitDollarVariable(dollarVariable)[1];
}
public static String[] splitDollarVariable(String dollarVariable) throws TemplateBuilderException {
String[] splitTokens = new String[2];
dollarVariable = dollarVariable.trim();
if(isDollarVariable(dollarVariable)) {
String withoutDollarBrace = dollarVariable.substring(2, dollarVariable.length() - 1);
int questionMarkIdx = withoutDollarBrace.indexOf('?'); //$NON-NLS-1$
if(questionMarkIdx != -1) {
splitTokens[0] = withoutDollarBrace.substring(0, questionMarkIdx);
splitTokens[1] = withoutDollarBrace.substring(questionMarkIdx + 1); // the raw formatting
} else {
splitTokens[0] = withoutDollarBrace;
splitTokens[1] = null; // no formatting
}
if(splitTokens[0].endsWith("!")) { //$NON-NLS-1$
splitTokens[0] = splitTokens[0].substring(0, splitTokens[0].length() - 1);
}
} else {
throw new TemplateBuilderException("Unsupported FreeMarker variable syntax '" + dollarVariable + "'."); //$NON-NLS-1$ //$NON-NLS-2$
}
return splitTokens;
}
public static boolean isDollarVariable(String variable) {
return (variable.startsWith("${") && variable.endsWith("}")); //$NON-NLS-1$ //$NON-NLS-2$
}
public static String toFreeMarkerVariable(ValueMapping mapping, boolean isNodeModelSource) {
if(isNodeModelSource) {
return "${" + FreeMarkerUtil.toPath(mapping.getSrcPath(), true) + "}";
} else {
StringBuilder builder = new StringBuilder();
Properties encodeProperties = mapping.getEncodeProperties();
String rawFormatting;
if(encodeProperties == null) {
encodeProperties = new Properties();
}
builder.append("${" + mapping.getSrcPath() + "!?"); //$NON-NLS-1$ //$NON-NLS-2$
rawFormatting = encodeProperties.getProperty(ValueMapping.RAW_FORMATING_KEY);
if(rawFormatting != null) {
builder.append(rawFormatting);
builder.append("}"); //$NON-NLS-1$
} else {
Class<?> valueType = mapping.getValueType();
if(valueType != null) {
if(valueType == java.util.Date.class) {
String format = encodeProperties.getProperty(DateDecoder.FORMAT);
if(format != null) {
builder.append("string('" + format + "')}"); //$NON-NLS-1$ //$NON-NLS-2$
} else {
builder.append("string.medium}"); //$NON-NLS-1$
}
} else if(Number.class.isAssignableFrom(valueType)) {
builder.append("c}"); //$NON-NLS-1$
} else if(valueType == Double.TYPE || valueType == Float.TYPE || valueType == Integer.TYPE || valueType == Long.TYPE || valueType == Short.TYPE) {
builder.append("c}"); //$NON-NLS-1$
} else {
builder.append("string}"); //$NON-NLS-1$
}
} else {
builder.append("string}"); //$NON-NLS-1$
}
}
return builder.toString();
}
}
public static String toPath(String srcPath, boolean nodeModelSource) {
if(nodeModelSource) {
StringBuilder builder = new StringBuilder();
if(srcPath.startsWith("/") && srcPath.length() > 0) {
srcPath = srcPath.substring(1);
}
String[] tokens = srcPath.split("/");
builder.append(".vars[\"").append(tokens[0]).append("\"]");
if(tokens.length > 1) {
builder.append("[\"");
for(int i = 1; i < tokens.length; i++) {
if(i > 1) {
builder.append("/");
}
builder.append(tokens[i]);
}
builder.append("\"]");
}
return builder.toString();
} else {
return srcPath;
}
}
private static Pattern varsSinglePattern = Pattern.compile(".vars\\[\"(.*)\"\\]");
private static Pattern varsDoublePattern = Pattern.compile(".vars\\[\"(.*)\"\\]\\[\"(.*)\"\\]");
public static String normalizePath(String srcPath) {
Matcher doubleMatcher = varsDoublePattern.matcher(srcPath);
if(doubleMatcher.matches()) {
return doubleMatcher.group(1) + "/" + doubleMatcher.group(2);
} else {
Matcher singleMatcher = varsSinglePattern.matcher(srcPath);
if(singleMatcher.matches()) {
return singleMatcher.group(1);
} else {
return srcPath;
}
}
}
public static String[] toPathTokens(String srcPath) {
Matcher matcher = varsDoublePattern.matcher(srcPath);
if(matcher.matches()) {
return (matcher.group(1) + "/" + matcher.group(2)).split("/");
} else if(srcPath.indexOf("/") != -1) {
if(srcPath.startsWith("/")) {
return srcPath.substring(1).split("/");
} else {
return srcPath.split("/");
}
} else {
// TODO: Old style used a dot... need to standardize all templating code to use forward slash.
return srcPath.split(".");
}
}
public static boolean isVarsFormat(String srcPath) {
Matcher matcher = varsDoublePattern.matcher(srcPath);
return matcher.matches();
}
}