![JAR search and dependency download from the Maven repository](/logo.png)
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