ClassFab generateClassFab(CompiledExpression compiled) throws Exception { if (compiled.getGeneratedClass() != null) return compiled.getGeneratedClass(); ClassFab classFab = _classFactory.newClass(ClassFabUtils.generateClassName(compiled.getExpression().getClass()), Object.class); classFab.addInterface(ExpressionAccessor.class); compiled.setGeneratedClass(classFab); return classFab; }
protected String generateSetter(OgnlContext context, CompiledExpression compiled) throws Exception if (ExpressionNode.class.isInstance(compiled.getExpression()) || ASTConst.class.isInstance(compiled.getExpression())) throw new UnsupportedCompilationException("Can't compile expression/constant setters."); context.setRoot(compiled.getRoot()); context.setCurrentObject(compiled.getRoot()); context.remove(PRE_CAST); String setterCode = compiled.getExpression().toSetSourceString(context, compiled.getRoot()); String castExpression = (String) context.get(PRE_CAST); throw new UnsupportedCompilationException("Can't compile null setter body."); if (compiled.getRoot() == null) throw new UnsupportedCompilationException("Can't compile setters with a null root object."); String pre = getRootExpression(compiled.getExpression(), compiled.getRoot(), context); setterValue = ""; createLocalReferences(context, generateClassFab(compiled), compiled.getSettermethod().getParameterTypes());
String getterCode; context.setRoot(compiled.getRoot()); context.setCurrentObject(compiled.getRoot()); context.remove(PRE_CAST); getterCode = compiled.getExpression().toGetSourceString(context, compiled.getRoot()); } catch (NullPointerException e) && !ASTVarRef.class.isAssignableFrom(compiled.getExpression().getClass())) String rootExpr = !getterCode.equals("null") ? getRootExpression(compiled.getExpression(), compiled.getRoot(), context) : ""; rootExpr = ""; createLocalReferences(context, generateClassFab(compiled), compiled.getGetterMethod().getParameterTypes()); if (OrderedReturn.class.isInstance(compiled.getExpression()) && ((OrderedReturn) compiled.getExpression()).getLastExpression() != null) + (ASTMethod.class.isInstance(compiled.getExpression()) || ASTChain.class.isInstance(compiled.getExpression()) ? rootExpr : "") + (castExpression != null ? castExpression : "") + ((OrderedReturn) compiled.getExpression()).getCoreExpression() + " return " + pre + ((OrderedReturn) compiled.getExpression()).getLastExpression() + post + ";}";
MethodSignature valueSetter = new MethodSignature(void.class, "set", new Class[]{OgnlContext.class, Object.class, Object.class}, null); CompiledExpression compiled = new CompiledExpression(expression, root, valueGetter, valueSetter);
protected String generateSetter(OgnlContext context, CompiledExpression compiled) throws Exception if (ExpressionNode.class.isInstance(compiled.getExpression()) || ASTConst.class.isInstance(compiled.getExpression())) throw new UnsupportedCompilationException("Can't compile expression/constant setters."); context.setRoot(compiled.getRoot()); context.setCurrentObject(compiled.getRoot()); context.remove(PRE_CAST); String setterCode = compiled.getExpression().toSetSourceString(context, compiled.getRoot()); String castExpression = (String) context.get(PRE_CAST); throw new UnsupportedCompilationException("Can't compile null setter body."); if (compiled.getRoot() == null) throw new UnsupportedCompilationException("Can't compile setters with a null root object."); String pre = getRootExpression(compiled.getExpression(), compiled.getRoot(), context); setterValue = ""; createLocalReferences(context, generateClassFab(compiled), compiled.getSettermethod().getParameterTypes());
String getterCode; context.setRoot(compiled.getRoot()); context.setCurrentObject(compiled.getRoot()); context.remove(PRE_CAST); getterCode = compiled.getExpression().toGetSourceString(context, compiled.getRoot()); } catch (NullPointerException e) && !ASTVarRef.class.isAssignableFrom(compiled.getExpression().getClass())) String rootExpr = !getterCode.equals("null") ? getRootExpression(compiled.getExpression(), compiled.getRoot(), context) : ""; rootExpr = ""; createLocalReferences(context, generateClassFab(compiled), compiled.getGetterMethod().getParameterTypes()); if (OrderedReturn.class.isInstance(compiled.getExpression()) && ((OrderedReturn) compiled.getExpression()).getLastExpression() != null) + (ASTMethod.class.isInstance(compiled.getExpression()) || ASTChain.class.isInstance(compiled.getExpression()) ? rootExpr : "") + (castExpression != null ? castExpression : "") + ((OrderedReturn) compiled.getExpression()).getCoreExpression() + " return " + pre + ((OrderedReturn) compiled.getExpression()).getLastExpression() + post + ";}";
MethodSignature valueSetter = new MethodSignature(void.class, "set", new Class[]{OgnlContext.class, Object.class, Object.class}, null); CompiledExpression compiled = new CompiledExpression(expression, root, valueGetter, valueSetter);
ClassFab generateClassFab(CompiledExpression compiled) throws Exception { if (compiled.getGeneratedClass() != null) return compiled.getGeneratedClass(); ClassFab classFab = _classFactory.newClass(ClassFabUtils.generateClassName(compiled.getExpression().getClass()), Object.class); classFab.addInterface(ExpressionAccessor.class); compiled.setGeneratedClass(classFab); return classFab; }