package org.jboss.windup.rules.files.condition;
import static org.joox.JOOX.$;
import java.util.logging.Logger;
import org.apache.commons.lang3.StringUtils;
import org.jboss.windup.config.exception.ConfigurationException;
import org.jboss.windup.config.operation.Iteration;
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.util.Logging;
import org.jboss.windup.util.exception.WindupException;
import org.ocpsoft.rewrite.config.Condition;
import org.w3c.dom.Element;
/**
* Represents a {@link FileContent} {@link Condition}.
*
* Example:
*
* <pre>
* <filecontent pattern="Some example {text}"> filename="{filename}" />
* </pre>
*
* @author <a href="mailto:jesse.sightler@gmail.com">Jesse Sightler</a>
*
*/
@NamespaceElementHandler(elementName = FileContentHandler.ELEM_NAME, namespace = RuleProviderHandler.WINDUP_RULE_NAMESPACE)
public class FileContentHandler implements ElementHandler<FileContent>
{
public static final String ELEM_NAME = "filecontent";
private static final String ATTR_PATTERN = "pattern";
private static final String ATTR_FILENAME = "filename";
private static final String ATTR_FROM = "from";
private static final Logger LOG = Logging.get(FileContentHandler.class);
@Override
public FileContent processElement(ParserContext handlerManager, Element element) throws ConfigurationException
{
String contentPattern = $(element).attr(ATTR_PATTERN);
String filenamePattern = $(element).attr(ATTR_FILENAME);
String from = $(element).attr(ATTR_FROM);
String as = $(element).attr("as");
if (as == null)
{
as = Iteration.DEFAULT_VARIABLE_LIST_STRING;
}
if (StringUtils.isBlank(contentPattern))
{
throw new WindupException("The '" + ELEM_NAME + "' element must have a non-empty '" + ATTR_PATTERN + "' attribute");
}
Object obj = null;
obj = applyFrom(obj, from);
obj = applyMatches(obj, contentPattern);
obj = applyFileName(obj, filenamePattern);
//At least content pattern should have matched (otherwise exception would be thrown),
// so FileContent instance should have been created
FileContent f = (FileContent) obj;
f.as(as);
if (StringUtils.isBlank(from) && StringUtils.isBlank(filenamePattern))
{
LOG.warning("One of the filecontent conditions (" + f.toString() + ") is scanning all the files for a regex. This may have"
+ "significant performance overhead.");
}
return f;
}
private Object applyFrom(Object fileContentBuilder, String from)
{
if (from != null)
{
fileContentBuilder = FileContent.from(from);
}
return fileContentBuilder;
}
private Object applyMatches(Object fileContentBuilder, String contentPattern)
{
if (contentPattern != null)
{
if (fileContentBuilder == null)
{
fileContentBuilder = FileContent.matches(contentPattern);
}
else
{
fileContentBuilder = ((FileContentFrom) fileContentBuilder).matches(contentPattern);
}
}
return fileContentBuilder;
}
private Object applyFileName(Object fileContentBuilder, String fileName)
{
if (fileName != null)
{
if (fileContentBuilder == null)
{
//We do not support starting with fileName without content. Should use File condition. This should not happen thanks to checks
}
else
{
fileContentBuilder = ((FileContent) fileContentBuilder).inFileNamed(fileName);
}
}
return fileContentBuilder;
}
}