All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jaxx.runtime.MultiJXPathDecorator Maven / Gradle / Ivy

The newest version!
package jaxx.runtime;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;

/**
 * TODO
 *
 * @param  type of decorated objects
 * @author chemit
 * @see jaxx.runtime.Decorator
 */
public class MultiJXPathDecorator extends JXPathDecorator {

    /** to use log facility, just put in your code: log.info(\"...\"); */
    private static final Log log = LogFactory.getLog(MultiJXPathDecorator.class);

    private static final long serialVersionUID = 1L;

    public static  MultiJXPathDecorator newDecorator(Class internalClass,
                                                           String expression,
                                                           String separator)
            throws IllegalArgumentException, NullPointerException {

        return newDecorator(internalClass, expression, separator, separator);
    }

    public static  MultiJXPathDecorator newDecorator(Class internalClass,
                                                           String expression,
                                                           String separator,
                                                           String separatorReplacement)
            throws IllegalArgumentException, NullPointerException {

        Context[] contexts = createInitialContexts(expression, separator, separatorReplacement);

        return new MultiJXPathDecorator(internalClass, expression, separator, separatorReplacement, contexts);
    }

    protected Context[] contexts;
    protected String separator;
    protected String separatorReplacement;


    public MultiJXPathDecorator(Class internalClass, String expression,
                                String separator, String separatorReplacement,
                                Context[] contexts) throws IllegalArgumentException, NullPointerException {
        super(internalClass, expression, false);
        this.separator = separator;
        this.separatorReplacement = separatorReplacement;
        this.contexts = contexts;

        setContextIndex(0);

        if (log.isDebugEnabled()) {
            log.debug(expression + " --> " + this.context);
        }
    }

    public void setContextIndex(int index) {
        ensureContextIndex(this, index);
        setContext(contexts[index]);
    }

    public int getNbContext() {
        return contexts.length;
    }

    public String getSeparator() {
        return separator;
    }

    public String getSeparatorReplacement() {
        return separatorReplacement;
    }

    @Override
    protected Comparator getComparator(int pos) {
        ensureContextIndex(this, pos);
        Context context1 = contexts[pos];
        return context1.getComparator(0);
    }

    public static  Context[] createInitialContexts(String expression, String separator, String separatorReplacement) {
        int sep = expression.indexOf(separator);
        if (sep == -1) {
            Context[] result = MultiJXPathDecorator.newInstance(1);
            result[0] = createInitialContext(expression);
            return result;
        }

        List tokens = new ArrayList();
        StringTokenizer stk = new StringTokenizer(expression, separator);
        while (stk.hasMoreTokens()) {
            tokens.add(stk.nextToken());
        }

        int nbTokens = tokens.size();
        Context[] contexts = newInstance(nbTokens);
        for (int i = 0; i < nbTokens; i++) {
            StringBuilder buffer = new StringBuilder(expression.length());
            for (int j = 0; j < nbTokens; j++) {
                int index = (i + j) % nbTokens;
                String str = tokens.get(index);
                //todo replace %index with %j
                buffer.append(separatorReplacement).append(str);
            }
            contexts[i] = createInitialContext(buffer.substring(separatorReplacement.length()));
        }
        return contexts;
    }

    protected static void ensureContextIndex(MultiJXPathDecorator decorator, int pos) {
        if (pos < -1 || pos > decorator.contexts.length) {
            throw new ArrayIndexOutOfBoundsException("context index " + pos + " is out of bound, can be inside [" + 0 + "," + decorator.contexts.length + "]");
        }
    }

    @SuppressWarnings("unchecked")
    protected static  Context[] newInstance(int size) {
        // fixme how to instanciate a typed array with no checking warning ?
        return new Context[size];
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy