package org.jboss.windup.rules.apps.xml;

import org.jboss.windup.config.AbstractRuleProvider;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.RuleProvider;
import org.jboss.windup.config.metadata.RuleProviderMetadata;
import org.jboss.windup.config.ruleprovider.IteratingRuleProvider;
import org.jboss.windup.graph.model.WindupVertexFrame;
import org.jboss.windup.rules.apps.xml.model.XmlFileModel;
import org.ocpsoft.rewrite.context.EvaluationContext;
import org.w3c.dom.Document;

import java.util.logging.Logger;

/**
 * This provides a simplified way to extend {@link AbstractRuleProvider} for cases where the rule simply needs to
 * provide some query, and wants to execute a function over each valid xml row.
 *
 * @author <a href="mailto:bradsdavis@gmail.com">Brad Davis</a>
 */
public abstract class IteratingXmlRuleProvider<PAYLOADTYPE extends XmlFileModel> extends IteratingRuleProvider<PAYLOADTYPE> {
    private static Logger LOG = Logger.getLogger(IteratingXmlRuleProvider.class.getCanonicalName());

    public IteratingXmlRuleProvider() {
        super();
    }

    public IteratingXmlRuleProvider(RuleProviderMetadata metadata) {
        super(metadata);
    }

    public IteratingXmlRuleProvider(Class<? extends RuleProvider> implementationType, String id) {
        super(implementationType, id);
    }

    /**
     * Perform this function for each {@link WindupVertexFrame} returned by the "when" clause.
     */
    public void perform(GraphRewrite event, EvaluationContext context, PAYLOADTYPE payload) {
        Document doc = payload.asDocument();
        if (doc == null) {
            LOG.warning("Document is null.");
            return;
        }

        perform(event, context, payload, doc);
    }

    public abstract void perform(GraphRewrite event, EvaluationContext context, PAYLOADTYPE payload, Document doc);
}
