package org.jboss.windup.rules.apps.xml.confighandler; import static org.joox.JOOX.$; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.jboss.windup.config.exception.ConfigurationException; import org.jboss.windup.config.parser.ElementHandler; import org.jboss.windup.config.parser.NamespaceElementHandler; import org.jboss.windup.config.parser.ParserContext; import org.jboss.windup.config.parser.xml.RuleProviderHandler; import org.jboss.windup.rules.apps.xml.operation.xslt.XSLTTransformation; import org.jboss.windup.util.exception.WindupException; import org.ocpsoft.rewrite.config.Condition; import org.w3c.dom.Element; /** * Represents an {@link XSLTTransformation} {@link Condition}. * * Example: * * <pre> * <xslt description="weblogic.xml converted to jboss.xml" extension="-transformed-file.xml" xsltFile="path/to/xsltfile"/> * </pre> * * @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a> * */ @NamespaceElementHandler(elementName = "xslt", namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE) public class XSLTTransformationHandler implements ElementHandler<XSLTTransformation> { @Override public XSLTTransformation processElement(ParserContext handlerManager, Element element) throws ConfigurationException { String description = $(element).attr("title"); String extension = $(element).attr("extension"); String effort = $(element).attr("effort"); String template = $(element).attr("template"); String of = $(element).attr("of"); if (StringUtils.isBlank(description)) { throw new WindupException("Error, 'xslt' element must have a non-empty 'description' attribute"); } if (StringUtils.isBlank(template)) { throw new WindupException("Error, 'xslt' element must have a non-empty 'template' attribute"); } if (StringUtils.isBlank(extension)) { throw new WindupException("Error, 'xslt' element must have a non-empty 'extension' attribute"); } Map<String, String> parameters = new HashMap<>(); List<Element> children = $(element).children("xslt-parameter").get(); for (Element child : children) { XSLTParameter param = handlerManager.processElement(child); parameters.put(param.getKey(), param.getValue()); } Path pathContainingXml = handlerManager.getXmlInputRootPath(); if (pathContainingXml != null) { String fullPath; if (template.startsWith("/") || template.startsWith("\\")) { fullPath = template; } else { Path path = pathContainingXml.resolve(template).toAbsolutePath(); if (!Files.exists(path)) { Path rulesParentPath = handlerManager.getXmlInputPath().getParent(); fullPath = rulesParentPath.resolve(template).normalize().toAbsolutePath().toString(); } else { fullPath = path.normalize().toString(); } } XSLTTransformation transformation = (XSLTTransformation) XSLTTransformation .usingFilesystem(fullPath) .withDescription(description) .withExtension(extension) .withParameters(parameters); if (of != null) { transformation = (XSLTTransformation) XSLTTransformation .of(of) .usingTemplate(fullPath) .withDescription(description) .withExtension(extension) .withParameters(parameters); return transformation; } return transformation.withEffort(effort == null ? 0 : Integer.valueOf(effort)); } else { ClassLoader xmlFileAddonClassLoader = handlerManager.getAddonContainingInputXML().getClassLoader(); if (of != null) { return (XSLTTransformation) XSLTTransformation .of(of) .usingTemplate(template, xmlFileAddonClassLoader) .withDescription(description) .withExtension(extension) .withParameters(parameters); } return (XSLTTransformation) XSLTTransformation .using(template, xmlFileAddonClassLoader) .withDescription(description) .withExtension(extension) .withParameters(parameters); } } }