package org.jboss.windup.rules.files.condition; 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.util.Logging; import org.jboss.windup.util.exception.WindupException; import org.ocpsoft.rewrite.config.Condition; import org.w3c.dom.Element; import java.util.logging.Logger; import static org.joox.JOOX.$; /** * Represents a {@link File} {@link Condition}.. * <p/> * Example: * <p/> * <pre> * <file filename="{filename}" /> * </pre> * * @author <a href="mailto:mbriskar@gmail.com">Matej Briskar</a> */ @NamespaceElementHandler(elementName = FileHandler.ELEM_NAME, namespace = "http://windup.jboss.org/schema/jboss-ruleset") public class FileHandler implements ElementHandler<File> { public static final String ELEM_NAME = "file"; private static final String ATTR_FILENAME = "filename"; private static final String ATTR_FROM = "from"; private static final Logger LOG = Logging.get(FileHandler.class); @Override public File processElement(ParserContext handlerManager, Element element) throws ConfigurationException { String filenamePattern = $(element).attr(ATTR_FILENAME); String from = $(element).attr(ATTR_FROM); String as = $(element).attr("as"); if (StringUtils.isBlank(filenamePattern)) { throw new WindupException("The '" + ELEM_NAME + "' element must have a non-empty '" + ATTR_FILENAME + "' attribute"); } Object obj = null; obj = applyFrom(obj, from); obj = applyFileName(obj, filenamePattern); //At least filename should have matched (otherwise exception would be thrown), // so FileContent instance should have been created File f = (File) obj; if(as!=null) { f.as(as); } return f; } private Object applyFrom(Object fileContentBuilder, String from) { if (from != null) { fileContentBuilder = File.from(from); } return fileContentBuilder; } private Object applyFileName(Object fileContentBuilder, String fileName) { if (fileName != null) { if (fileContentBuilder == null) { fileContentBuilder=File.inFileNamed(fileName); } else { fileContentBuilder = ((File) fileContentBuilder).inFileNamed(fileName); } } return fileContentBuilder; } }