Author: chemit Date: 2008-12-01 17:10:17 +0000 (Mon, 01 Dec 2008) New Revision: 1046 Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java Log: JXPathDecorator on rocks Modified: lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java =================================================================== --- lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java 2008-12-01 17:09:43 UTC (rev 1045) +++ lutinjaxx/trunk/jaxx-core/src/main/java/jaxx/runtime/JXPathDecorator.java 2008-12-01 17:10:17 UTC (rev 1046) @@ -4,6 +4,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.ArrayList; +import java.util.List; + /** @author chemit */ public class JXPathDecorator<O> extends Decorator<O> { @@ -14,18 +17,74 @@ protected String expression; + protected String[] data; + + protected Boolean[] jxPath; + + protected int nbToken; + public JXPathDecorator(Class<O> internalClass, String expression) { super(internalClass); this.expression = expression; + List<String> lData = new ArrayList<String>(); + List<Boolean> ljxPath = new ArrayList<Boolean>(); + + int index = expression.indexOf("${"); + boolean first = true; + int end = expression.length(); + while (index > -1) { + if (first) { + first = false; + if (index > 0) { + // prefix before first jxpath + lData.add(expression.substring(0, index )); + ljxPath.add(false); + } + } + // seek next } + int last = expression.indexOf("}", index + 1); + if (last != -1) { + // jxpath detected + String s = expression.substring(index + 2, last); + lData.add(s); + ljxPath.add(true); + } + + index = expression.indexOf("${", last + 1); + if (index > -1) { + // inter jxpath code + String s = expression.substring(last + 1, index); + lData.add(s); + ljxPath.add(false); + } else { + if (end > (last + 1)) { + // suffix after last jxpath + String s = expression.substring(last + 1); + lData.add(s); + ljxPath.add(false); + } + } + } + data = lData.toArray(new String[lData.size()]); + jxPath = ljxPath.toArray(new Boolean[ljxPath.size()]); + nbToken = data.length; + if (log.isDebugEnabled()) { + log.debug("lData : " + lData); + log.debug("ljxPath : " + ljxPath); + } + } public String toString(Object bean) { - //todo check bean class JXPathContext jxcontext = JXPathContext.newContext(bean); - String result = (String) jxcontext.getValue(expression); - if (log.isDebugEnabled()) { - log.debug(expression + " : " + result); + StringBuilder buffer = new StringBuilder(); + for (int i = 0; i < nbToken; i++) { + String s = data[i]; + if (jxPath[i]) { + s = String.valueOf(jxcontext.getValue(s)); + } + buffer.append(s); } - return result; + return buffer.toString(); } } Modified: lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java =================================================================== --- lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java 2008-12-01 17:09:43 UTC (rev 1045) +++ lutinjaxx/trunk/jaxx-core/src/test/java/jaxx/runtime/JXPathDecoratorTest.java 2008-12-01 17:10:17 UTC (rev 1046) @@ -1,6 +1,7 @@ package jaxx.runtime; import org.junit.Test; +import org.junit.Assert; /** @author chemit */ public class JXPathDecoratorTest { @@ -35,13 +36,30 @@ @Test public void testDecorator() throws Exception { - //fixme : make me work :) - Decorator<Model> decorator = new JXPathDecorator<Model>(Model.class,"${name} - ${integerValue}"); + Decorator<Model> decorator; + String expected; + String result; Model m = new Model("name", 10); -// String expected = m.getName() + " - " + m.getIntegervalue(); -// String result = decorator.toString(m); - //org.junit.Assert.assertEquals(expected, result); + decorator = new JXPathDecorator<Model>(Model.class,"${name} - ${integervalue}"); + expected = m.getName() + " - " + m.getIntegervalue(); + result = decorator.toString(m); + Assert.assertEquals(expected, result); + + decorator = new JXPathDecorator<Model>(Model.class,"${name}${integervalue}"); + expected = m.getName() + m.getIntegervalue(); + result = decorator.toString(m); + Assert.assertEquals(expected, result); + + decorator = new JXPathDecorator<Model>(Model.class,"before ${name} - ${integervalue} after"); + expected = "before "+m.getName() + " - " + m.getIntegervalue()+" after"; + result = decorator.toString(m); + Assert.assertEquals(expected, result); + + decorator = new JXPathDecorator<Model>(Model.class,"before${name}-${integervalue}after"); + expected = "before"+m.getName() + "-" + m.getIntegervalue()+"after"; + result = decorator.toString(m); + Assert.assertEquals(expected, result); } }