/** * Create an alias for the expression * * @return */ @SuppressWarnings("unchecked") public Expression<T> as(Path<T> alias) { return OperationImpl.create(getType(),Ops.ALIAS, this, alias); }
/** * Create an alias for the expression * * @return */ public Expression<T> as(String alias) { return as(new PathImpl<T>(getType(), alias)); }
private List<Field> initFields(Map<String, ? extends Expression<?>> args) { List<Field> fields = new ArrayList<Field>(args.size()); for (Map.Entry<String,? extends Expression<?>> entry : args.entrySet()) { String property = entry.getKey(); Expression<?> expr = entry.getValue(); Class<?> beanType = getType(); Field field = null; while (!beanType.equals(Object.class)) { try { field = beanType.getDeclaredField(property); field.setAccessible(true); if (!normalize(field.getType()).isAssignableFrom(expr.getType())) { typeMismatch(field.getType(), expr); } beanType = Object.class; } catch (SecurityException e) { // do nothing } catch (NoSuchFieldException e) { beanType = beanType.getSuperclass(); } } if (field == null) { propertyNotFound(expr, property); } fields.add(field); } return fields; }
private List<Method> initMethods(Map<String, ? extends Expression<?>> args) { try { List<Method> methods = new ArrayList<Method>(args.size()); BeanInfo beanInfo = Introspector.getBeanInfo(getType()); PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); for (Map.Entry<String, ? extends Expression<?>> entry : args.entrySet()) { String property = entry.getKey(); Expression<?> expr = entry.getValue(); Method setter = null; for (PropertyDescriptor prop : propertyDescriptors) { if (prop.getName().equals(property)) { setter = prop.getWriteMethod(); if (!normalize(prop.getPropertyType()).isAssignableFrom(expr.getType())) { typeMismatch(prop.getPropertyType(), expr); } break; } } if (setter == null) { propertyNotFound(expr, property); } methods.add(setter); } return methods; } catch (IntrospectionException e) { throw new RuntimeException(e.getMessage(), e); } }
@Override public T newInstance(Object... a) { try { T rv = create(getType()); if (fieldAccess) { for (int i = 0; i < a.length; i++) { Object value = a[i]; if (value != null) { Field field = fields.get(i); if (field != null) field.set(rv, value); } } } else { for (int i = 0; i < a.length; i++) { Object value = a[i]; if (value != null) { Method setter = setters.get(i); if (setter != null) setter.invoke(rv, value); } } } return rv; } catch (InstantiationException e) { throw new ExpressionException(e.getMessage(), e); } catch (IllegalAccessException e) { throw new ExpressionException(e.getMessage(), e); } catch (InvocationTargetException e) { throw new ExpressionException(e.getMessage(), e); } }