Esempio n. 1
0
  public void test_Set_Chain_Indexed_Property() throws Exception {
    Root root = new Root();
    OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);

    context.setRoot(root);
    context.setCurrentObject(root);

    SimpleNode node =
        (SimpleNode) Ognl.parseExpression("tab.searchCriteriaSelections[index1][index2]");
    node.setValue(context, root, Boolean.FALSE);
  }
Esempio n. 2
0
  protected Object getValueBody(OgnlContext context, Object source) throws OgnlException {
    Object result, root = context.getRoot();
    int count = jjtGetNumChildren();
    Object[] args = OgnlRuntime.getObjectArrayPool().create(count);

    try {
      for (int i = 0; i < count; ++i) {
        args[i] = _children[i].getValue(context, root);
      }
      if (isArray) {
        if (args.length == 1) {
          try {
            Class componentClass = OgnlRuntime.classForName(context, className);
            List sourceList = null;
            int size;

            if (args[0] instanceof List) {
              sourceList = (List) args[0];
              size = sourceList.size();
            } else {
              size = (int) OgnlOps.longValue(args[0]);
            }
            result = Array.newInstance(componentClass, size);
            if (sourceList != null) {
              TypeConverter converter = context.getTypeConverter();

              for (int i = 0, icount = sourceList.size(); i < icount; i++) {
                Object o = sourceList.get(i);

                if ((o == null) || componentClass.isInstance(o)) {
                  Array.set(result, i, o);
                } else {
                  Array.set(
                      result,
                      i,
                      converter.convertValue(context, null, null, null, o, componentClass));
                }
              }
            }
          } catch (ClassNotFoundException ex) {
            throw new OgnlException("array component class '" + className + "' not found", ex);
          }
        } else {
          throw new OgnlException("only expect array size or fixed initializer list");
        }
      } else {
        result = OgnlRuntime.callConstructor(context, className, args);
      }

      return result;
    } finally {
      OgnlRuntime.getObjectArrayPool().recycle(args);
    }
  }
Esempio n. 3
0
  public void test_Set_Get_Multiple_Generic_Types_Property() throws Exception {
    BaseGeneric<GameGenericObject, Long> root = new GameGeneric();
    OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);

    context.setRoot(root);
    context.setCurrentObject(root);

    SimpleNode node = (SimpleNode) Ognl.parseExpression("ids");
    node.setValue(context, root, new String[] {"0", "20", "43"});

    isEqual(new Long[] {new Long(0), new Long(20), new Long(43)}, root.getIds());
    isEqual(node.getValue(context, root), root.getIds());
  }
Esempio n. 4
0
  public void test_Get_Generic_Property() throws Exception {
    GenericRoot root = new GenericRoot();
    OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);

    context.setRoot(root);
    context.setCurrentObject(root);

    SimpleNode node = (SimpleNode) Ognl.parseExpression("cracker.param");
    node.setValue(context, root, "0");

    assertEquals(new Integer(0), node.getValue(context, root));

    node.setValue(context, root, "10");

    assertEquals(new Integer(10), node.getValue(context, root));
  }
Esempio n. 5
0
  public void test_Set_Source() throws Throwable {
    ASTProperty p = new ASTProperty(0);
    p.setIndexedAccess(false);
    ASTConst pRef = new ASTConst(0);
    pRef.setValue("nested");
    pRef.jjtSetParent(p);
    p.jjtAddChild(pRef, 0);

    Map root = new Root().getMap();

    OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
    context.setRoot(root);
    context.setCurrentObject(root);
    context.setCurrentNode(pRef);

    assertEquals(".put(\"nested\", $3)", p.toSetSourceString(context, root));
    assertEquals(Object.class, context.getCurrentType());
    assertEquals(root.get("nested"), context.getCurrentObject());

    assert Map.class.isAssignableFrom(context.getCurrentAccessor());

    assertEquals(root.getClass(), context.getPreviousType());
    assertEquals(null, context.getPreviousAccessor());
  }
Esempio n. 6
0
 protected void setValueBody(OgnlContext context, Object target, Object value)
     throws OgnlException {
   context.setCurrentObject(value);
 }
Esempio n. 7
0
 protected Object getValueBody(OgnlContext context, Object source) throws OgnlException {
   return context.getCurrentObject();
 }
Esempio n. 8
0
  public void test_Get_Value_Body() throws Exception {
    ASTProperty p = new ASTProperty(0);
    p.setIndexedAccess(false);
    ASTConst pRef = new ASTConst(0);
    pRef.setValue("nested");
    pRef.jjtSetParent(p);
    p.jjtAddChild(pRef, 0);

    Map root = new Root().getMap();

    OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
    context.setRoot(root);
    context.setCurrentObject(root);
    context.setCurrentNode(pRef);

    assertEquals(root.getClass(), context.getCurrentType());
    assertEquals(null, context.getPreviousType());
    assertEquals(root, context.getCurrentObject());
    assertEquals(null, context.getCurrentAccessor());
    assertEquals(null, context.getPreviousAccessor());

    Object value = p.getValue(context, root);

    assertEquals(root.get("nested"), value);
    assertEquals(root.getClass(), context.getCurrentType());
    assertEquals(null, context.getPreviousType());
    assertEquals(null, context.getCurrentAccessor());
    assertEquals(null, context.getPreviousAccessor());
  }
Esempio n. 9
0
  public void test_Indexed_Object_Type() throws Throwable {
    // ASTChain chain = new ASTChain(0);

    ASTProperty listp = new ASTProperty(0);
    listp.setIndexedAccess(false);
    // listp.jjtSetParent(chain);

    ASTConst listc = new ASTConst(0);
    listc.setValue("list");
    listc.jjtSetParent(listp);
    listp.jjtAddChild(listc, 0);

    // chain.jjtAddChild(listp, 0);

    ASTProperty p = new ASTProperty(0);
    p.setIndexedAccess(true);

    ASTProperty pindex = new ASTProperty(0);

    ASTConst pRef = new ASTConst(0);
    pRef.setValue("genericIndex");
    pRef.jjtSetParent(pindex);
    pindex.jjtAddChild(pRef, 0);

    p.jjtAddChild(pindex, 0);
    // chain.jjtAddChild(p, 1);

    Root root = new Root();

    OgnlContext context = (OgnlContext) Ognl.createDefaultContext(null);
    context.setRoot(root);
    context.setCurrentObject(root);
    context.setCurrentNode(listp);

    assertEquals(".getList()", listp.toGetSourceString(context, root));
    assertEquals(List.class, context.getCurrentType());
    assertEquals(Root.class, context.getCurrentAccessor());
    assertEquals(null, context.getPreviousAccessor());
    assertEquals(root.getClass(), context.getPreviousType());
    assertEquals(root.getList(), context.getCurrentObject());

    // re test with chain

    context = (OgnlContext) Ognl.createDefaultContext(null);
    context.setRoot(root);
    context.setCurrentObject(root);

    ASTChain chain = new ASTChain(0);
    listp.jjtSetParent(chain);
    chain.jjtAddChild(listp, 0);

    context.setCurrentNode(chain);

    assertEquals(".getList()", chain.toGetSourceString(context, root));
    assertEquals(List.class, context.getCurrentType());
    assertEquals(Root.class, context.getCurrentAccessor());
    assertEquals(null, context.getPreviousAccessor());
    assertEquals(Root.class, context.getPreviousType());
    assertEquals(root.getList(), context.getCurrentObject());

    // test with only getIndex

    assertEquals(
        ".get(ognl.OgnlOps#getIntValue(((org.ognl.test.objects.Root)$2)..getGenericIndex().toString()))",
        p.toGetSourceString(context, root.getList()));
    assertEquals(root.getArray(), context.getCurrentObject());
    assertEquals(Object.class, context.getCurrentType());
  }
Esempio n. 10
0
  public String toGetSourceString(OgnlContext context, Object target) {
    String result = "new " + className;

    Class clazz = null;
    Object ctorValue = null;
    try {

      clazz = OgnlRuntime.classForName(context, className);

      ctorValue = this.getValueBody(context, target);
      context.setCurrentObject(ctorValue);

      if (clazz != null && ctorValue != null) {

        context.setCurrentType(ctorValue.getClass());
        context.setCurrentAccessor(ctorValue.getClass());
      }

      if (isArray) context.put("_ctorClass", clazz);

    } catch (Throwable t) {
      throw OgnlOps.castToRuntime(t);
    }

    try {

      if (isArray) {
        if (_children[0] instanceof ASTConst) {

          result = result + "[" + _children[0].toGetSourceString(context, target) + "]";
        } else if (ASTProperty.class.isInstance(_children[0])) {

          result =
              result
                  + "["
                  + ExpressionCompiler.getRootExpression(_children[0], target, context)
                  + _children[0].toGetSourceString(context, target)
                  + "]";
        } else if (ASTChain.class.isInstance(_children[0])) {

          result = result + "[" + _children[0].toGetSourceString(context, target) + "]";
        } else {

          result = result + "[] " + _children[0].toGetSourceString(context, target);
        }

      } else {
        result = result + "(";

        if ((_children != null) && (_children.length > 0)) {

          Object[] values = new Object[_children.length];
          String[] expressions = new String[_children.length];
          Class[] types = new Class[_children.length];

          // first populate arrays with child values

          for (int i = 0; i < _children.length; i++) {

            Object objValue = _children[i].getValue(context, context.getRoot());
            String value = _children[i].toGetSourceString(context, target);

            if (!ASTRootVarRef.class.isInstance(_children[i])) {
              value = ExpressionCompiler.getRootExpression(_children[i], target, context) + value;
            }

            String cast = "";
            if (ExpressionCompiler.shouldCast(_children[i])) {

              cast = (String) context.remove(ExpressionCompiler.PRE_CAST);
            }
            if (cast == null) cast = "";

            if (!ASTConst.class.isInstance(_children[i])) value = cast + value;

            values[i] = objValue;
            expressions[i] = value;
            types[i] = context.getCurrentType();
          }

          // now try and find a matching constructor

          Constructor[] cons = clazz.getConstructors();
          Constructor ctor = null;
          Class[] ctorParamTypes = null;

          for (int i = 0; i < cons.length; i++) {
            Class[] ctorTypes = cons[i].getParameterTypes();

            if (OgnlRuntime.areArgsCompatible(values, ctorTypes)
                && (ctor == null || OgnlRuntime.isMoreSpecific(ctorTypes, ctorParamTypes))) {
              ctor = cons[i];
              ctorParamTypes = ctorTypes;
            }
          }

          if (ctor == null)
            ctor =
                OgnlRuntime.getConvertedConstructorAndArgs(
                    context,
                    clazz,
                    OgnlRuntime.getConstructors(clazz),
                    values,
                    new Object[values.length]);

          if (ctor == null)
            throw new NoSuchMethodException(
                "Unable to find constructor appropriate for arguments in class: " + clazz);

          ctorParamTypes = ctor.getParameterTypes();

          // now loop over child values again and build up the actual source string

          for (int i = 0; i < _children.length; i++) {
            if (i > 0) {
              result = result + ", ";
            }

            String value = expressions[i];

            if (types[i].isPrimitive()) {

              String literal = OgnlRuntime.getNumericLiteral(types[i]);
              if (literal != null) value += literal;
            }

            if (ctorParamTypes[i] != types[i]) {

              if (values[i] != null
                  && !types[i].isPrimitive()
                  && !values[i].getClass().isArray()
                  && !ASTConst.class.isInstance(_children[i])) {

                value =
                    "("
                        + OgnlRuntime.getCompiler()
                            .getInterfaceClass(values[i].getClass())
                            .getName()
                        + ")"
                        + value;
              } else if (!ASTConst.class.isInstance(_children[i])
                  || (ASTConst.class.isInstance(_children[i]) && !types[i].isPrimitive())) {

                if (!types[i].isArray()
                    && types[i].isPrimitive()
                    && !ctorParamTypes[i].isPrimitive())
                  value =
                      "new "
                          + ExpressionCompiler.getCastString(
                              OgnlRuntime.getPrimitiveWrapperClass(types[i]))
                          + "("
                          + value
                          + ")";
                else value = " ($w) " + value;
              }
            }

            result += value;
          }
        }
        result = result + ")";
      }

      context.setCurrentType(ctorValue != null ? ctorValue.getClass() : clazz);
      context.setCurrentAccessor(clazz);
      context.setCurrentObject(ctorValue);

    } catch (Throwable t) {
      throw OgnlOps.castToRuntime(t);
    }

    context.remove("_ctorClass");

    return result;
  }