public static Vector<Expression> extractPrimitives(String anExpression) throws ParseException, TypeMismatchException { final Hashtable<String, Expression> returnedHash = new Hashtable<String, Expression>(); try { Expression e = ExpressionParser.parse(anExpression); e.transform( new ExpressionTransformer() { @Override public Expression performTransformation(Expression e) throws TransformException { if (e instanceof BindingValueAsExpression) { String variableName = ((BindingValueAsExpression) e).toString(); Expression returned = returnedHash.get(variableName); if (returned == null) { returned = new Variable(variableName); returnedHash.put(variableName, returned); } return returned; } return e; } }); } catch (org.openflexo.antar.expr.parser.ParseException e1) { e1.printStackTrace(); } catch (TransformException e) { e.printStackTrace(); } /*DefaultExpressionParser parser = new DefaultExpressionParser(); Expression expression = parser.parse(anExpression, bindable); expression.evaluate(new EvaluationContext(new ExpressionParser.DefaultConstantFactory(), new VariableFactory() { @Override public Expression makeVariable(Word value, Bindable bindable) { Expression returned = returnedHash.get(value.getValue()); if (returned == null) { returned = new Variable(value.getValue()); returnedHash.put(value.getValue(), returned); } return returned; } }, new FunctionFactory() { @Override public Expression makeFunction(String functionName, List<Expression> args, Bindable bindable) { StringBuffer key = new StringBuffer(); key.append(functionName + "("); for (int i = 0; i < args.size(); i++) { key.append((i > 0 ? "," : "") + "arg" + i); } key.append(")"); Expression returned = returnedHash.get(key); if (returned == null) { returned = new Function(functionName, args); returnedHash.put(key.toString(), returned); } return returned; } }), bindable); */ Vector<Expression> returned = new Vector<Expression>(); for (String v : returnedHash.keySet()) { returned.add(returnedHash.get(v)); } return returned; }
protected void updateDependancies() { if (getOwner() instanceof FIBComponent) { if (binding == null) { return; } Vector<Expression> primitives; try { primitives = Expression.extractPrimitives(binding.getStringRepresentation()); FIBComponent component = (FIBComponent) getOwner(); FIBComponent rootComponent = component.getRootComponent(); Iterator<FIBComponent> subComponents = rootComponent.subComponentIterator(); while (subComponents.hasNext()) { FIBComponent next = subComponents.next(); if (next != getOwner()) { if (next instanceof FIBWidget && ((FIBWidget) next).getData() != null && ((FIBWidget) next).getData().isSet()) { String data = ((FIBWidget) next).getData().toString(); if (data != null) { for (Expression p : primitives) { String primitiveValue = null; if (p instanceof Variable) { primitiveValue = ((Variable) p).getName(); } if (p instanceof Function) { primitiveValue = ((Function) p).getName(); } if (primitiveValue != null && primitiveValue.startsWith(data)) { try { component.declareDependantOf(next); } catch (DependancyLoopException e) { logger.warning( "DependancyLoopException raised while declaring dependancy (data lookup)" + "in the context of binding: " + binding.getStringRepresentation() + " primitive: " + primitiveValue + " component: " + component + " dependancy: " + next + " data: " + data + " message: " + e.getMessage()); } } } } } if (next.getName() != null) { for (Expression p : primitives) { String primitiveValue = null; if (p instanceof Variable) { primitiveValue = ((Variable) p).getName(); } if (p instanceof Function) { primitiveValue = ((Function) p).getName(); } if (primitiveValue != null && StringUtils.isNotEmpty(next.getName()) && primitiveValue.startsWith(next.getName())) { try { component.declareDependantOf(next); } catch (DependancyLoopException e) { logger.warning( "DependancyLoopException raised while declaring dependancy (name lookup)" + "in the context of binding: " + binding.getStringRepresentation() + " primitive: " + primitiveValue + " component: " + component + " dependancy: " + next + " message: " + e.getMessage()); } } } } } } } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (TypeMismatchException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }