Package play.data.binding

Examples of play.data.binding.BeanWrapper


  }
 
  public static <T> T deleteListElement(T o, String fieldName, int idx) {
      try {
        Class<?> clazz = o.getClass();
      BeanWrapper bw = new BeanWrapper(o.getClass());
      Field field = clazz.getField(fieldName);
     
      if(List.class.isAssignableFrom(field.getType())){
        List l = (List)field.get(o);
        if(l == null)
View Full Code Here


 
  public static <T> T addMapElement(T o, String fieldName, String key)
    {
      try {
        Class<?> clazz = o.getClass();
      BeanWrapper bw = new BeanWrapper(o.getClass());
      Field field = clazz.getField(fieldName);
     
      if(Map.class.isAssignableFrom(field.getType())){
        Map l = (Map)field.get(o);
               
        Class<?> embedKeyClass =
          (Class<?>) ((ParameterizedType)
              field.getGenericType()).getActualTypeArguments()[0];
       
        Class<?> embedClass =
          (Class<?>) ((ParameterizedType)
            field.getGenericType()).getActualTypeArguments()[1];
         
        if(l == null){
          l = new HashMap();
        }

        Object embedObj = embedClass.newInstance();
        Object embedKey = Binder.directBind(key, embedKeyClass);
       
        if(l.get(embedKey) != null){
          Logger.debug("element with key %s already existing", embedKey);
          Validation.addError(
              fieldName,
              "validation.fieldMap.alreadyExists", embedKey.toString())
        }
        else {
          l.put(embedKey, embedObj);
          Logger.debug("map added {%s:%s}", embedKey, embedObj);
        }   
       
        bw.set(field.getName(), o, l);     
      }
      else Validation.addError(
          clazz.getName() + "."+field.getName(),
          "validation.fieldMap.badType", fieldName);     
     
View Full Code Here

 
  public static <T> T deleteMapElement(T o, String fieldName, String key)
    {
      try {
        Class<?> clazz = o.getClass();
      BeanWrapper bw = new BeanWrapper(o.getClass());
      Field field = clazz.getField(fieldName);
     
      if(Map.class.isAssignableFrom(field.getType())){
        Map l = (Map)field.get(o);
        if(l == null)
          Validation.addError(
              clazz.getName() + "."+field.getName(),
              "validation.fieldMap.empty", fieldName);
        else {
          Class<?> embedKeyClass =
            (Class<?>) ((ParameterizedType)
                field.getGenericType()).getActualTypeArguments()[0];
          BeanWrapper keybw = new BeanWrapper(embedKeyClass);
          try {
            Object embedKey = Binder.directBind(key, embedKeyClass);
            l.remove(embedKey);
          }catch(Exception ex){
            Validation.addError(
View Full Code Here

        ParamNode paramNode = StringUtils.isEmpty(name) ? rootParamNode : rootParamNode.getChild(name, true);
        // #1195 - Needs to keep track of whick keys we remove so that we can restore it before
        // returning from this method.
        List<ParamNode.RemovedNode> removedNodesList = new ArrayList<ParamNode.RemovedNode>();
        try {
            BeanWrapper bw = BeanWrapper.forClass(o.getClass());
            // Start with relations
            Set<Field> fields = new HashSet<Field>();
            Class<?> clazz = o.getClass();
            while (!clazz.equals(Object.class)) {
                Collections.addAll(fields, clazz.getDeclaredFields());
                clazz = clazz.getSuperclass();
            }
            for (Field field : fields) {
                boolean isEntity = false;
                String relation = null;
                boolean multiple = false;
               
                // First try the field
                Annotation[] fieldAnnotations = field.getAnnotations();
                // and check with the profiles annotations
                final BindingAnnotations bindingAnnotations = new BindingAnnotations(fieldAnnotations, new BindingAnnotations(annotations).getProfiles());
                if (bindingAnnotations.checkNoBinding()) {
                    continue;
                }
               
                if (field.isAnnotationPresent(OneToOne.class) || field.isAnnotationPresent(ManyToOne.class)) {
                    isEntity = true;
                    relation = field.getType().getName();
                }
                if (field.isAnnotationPresent(OneToMany.class) || field.isAnnotationPresent(ManyToMany.class)) {
                    Class<?> fieldType = (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
                    isEntity = true;
                    relation = fieldType.getName();
                    multiple = true;
                }

                if (isEntity) {

                    ParamNode fieldParamNode = paramNode.getChild(field.getName(), true);

                    Class<Model> c = (Class<Model>) Play.classloader.loadClass(relation);
                    if (JPABase.class.isAssignableFrom(c)) {
                        String keyName = Model.Manager.factoryFor(c).keyName();
                        EntityManager em = JPABase.getJPAConfig(c).getJPAContext().em();
                        if (multiple && Collection.class.isAssignableFrom(field.getType())) {
                            Collection l = new ArrayList();
                            if (SortedSet.class.isAssignableFrom(field.getType())) {
                                l = new TreeSet();
                            } else if (Set.class.isAssignableFrom(field.getType())) {
                                l = new HashSet();
                            }
                            String[] ids = fieldParamNode.getChild(keyName, true).getValues();
                            if (ids != null) {
                                // Remove it to prevent us from finding it again later
                                fieldParamNode.removeChild(keyName, removedNodesList);
                                for (String _id : ids) {
                                    if (_id == null || _id.equals("")) {
                                        continue;
                                    }
                                    Query q = em.createQuery("from " + relation + " where " + keyName + " = ?1");
                                    q.setParameter(1, Binder.directBind(rootParamNode.getOriginalKey(), annotations,_id, Model.Manager.factoryFor((Class<Model>) Play.classloader.loadClass(relation)).keyType(), null));
                                    try {
                                        l.add(q.getSingleResult());

                                    } catch (NoResultException e) {
                                        Validation.addError(name + "." + field.getName(), "validation.notFound", _id);
                                    }
                                }
                                bw.set(field.getName(), o, l);
                            }
                        } else {
                            String[] ids = fieldParamNode.getChild(keyName, true).getValues();
                            if (ids != null && ids.length > 0 && !ids[0].equals("")) {

                                Query q = em.createQuery("from " + relation + " where " + keyName + " = ?1");
                                q.setParameter(1, Binder.directBind(rootParamNode.getOriginalKey(), annotations, ids[0], Model.Manager.factoryFor((Class<Model>) Play.classloader.loadClass(relation)).keyType(), null));
                                try {
                                    Object to = q.getSingleResult();
                                    edit(paramNode, field.getName(), to, field.getAnnotations());
                                    // Remove it to prevent us from finding it again later
                                    paramNode.removeChild( field.getName(), removedNodesList);
                                    bw.set(field.getName(), o, to);
                                } catch (NoResultException e) {
                                    Validation.addError(fieldParamNode.getOriginalKey(), "validation.notFound", ids[0]);
                                    // Remove only the key to prevent us from finding it again later
                                    // This how the old impl does it..
                                    fieldParamNode.removeChild(keyName, removedNodesList);
                                    if (fieldParamNode.getAllChildren().size()==0) {
                                        // remove the whole node..
                                        paramNode.removeChild( field.getName(), removedNodesList);
                                    }

                                }

                            } else if (ids != null && ids.length > 0 && ids[0].equals("")) {
                                bw.set(field.getName(), o, null);
                                // Remove the key to prevent us from finding it again later
                                fieldParamNode.removeChild(keyName, removedNodesList);
                            }
                        }
                    }
View Full Code Here

  }

  public static <T extends EbeanSupport> T edit(Object o, String name, Map<String, String[]> params, Annotation[] annotations)
  {
    try {
      BeanWrapper bw = new BeanWrapper(o.getClass());
      // Start with relations
      Set<Field> fields = new HashSet<Field>();
      Class<?> clazz = o.getClass();
      while (!clazz.equals(Object.class)) {
        Collections.addAll(fields, clazz.getDeclaredFields());
        clazz = clazz.getSuperclass();
      }
      for (Field field : fields) {
        boolean isEntity = false;
        String relation = null;
        boolean multiple = false;
        //
        if (field.isAnnotationPresent(OneToOne.class) || field.isAnnotationPresent(ManyToOne.class)) {
          isEntity = true;
          relation = field.getType().getName();
        }
        if (field.isAnnotationPresent(OneToMany.class) || field.isAnnotationPresent(ManyToMany.class)) {
          Class<?> fieldType = (Class<?>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0];
          isEntity = true;
          relation = fieldType.getName();
          multiple = true;
        }

        if (isEntity) {
          Class<Model> cls = (Class<Model>) Play.classloader.loadClass(relation);
          if (EbeanSupport.class.isAssignableFrom(cls)) {
            String keyName = Model.Manager.factoryFor(cls).keyName();
            if (multiple && Collection.class.isAssignableFrom(field.getType())) {
              Collection<Object> l = new ArrayList<Object>();
              if (SortedSet.class.isAssignableFrom(field.getType())) {
                l = new TreeSet<Object>();
              } else if (Set.class.isAssignableFrom(field.getType())) {
                l = new HashSet<Object>();
              }
              String[] ids = params.get(name + "." + field.getName() + "." + keyName);
              if (ids != null) {
                params.remove(name + "." + field.getName() + "." + keyName);
                for (String _id : ids) {
                  if (!_id.equals("")) {
                    Object result = ebean().find(cls, Binder.directBind(_id, Model.Manager.factoryFor((Class<Model>) Play.classloader.loadClass(relation)).keyType()));
                    if (result != null)
                      l.add(result);
                    else
                      Validation.addError(name + "." + field.getName(), "validation.notFound", _id);
                  }
                }
                bw.set(field.getName(), o, l);
              }
            } else {
              String[] ids = params.get(name + "." + field.getName() + "." + keyName);
              if (ids != null && ids.length > 0 && !ids[0].equals("")) {
                params.remove(name + "." + field.getName() + "." + keyName);
                Object to = ebean().find(cls, Binder.directBind(ids[0], Model.Manager.factoryFor((Class<Model>) Play.classloader.loadClass(relation)).keyType()));
                if (to != null)
                  bw.set(field.getName(), o, to);
                else
                  Validation.addError(name + "." + field.getName(), "validation.notFound", ids[0]);
              } else if (ids != null && ids.length > 0 && ids[0].equals("")) {
                bw.set(field.getName(), o, null);
                params.remove(name + "." + field.getName() + "." + keyName);
              }
            }
          }
        }
      }
      bw.bind(name, o.getClass(), params, "", o, annotations != null ? annotations : new Annotation[0]);
      return (T) o;
    } catch (Exception e) {
      throw new UnexpectedException(e);
    }
  }
View Full Code Here

    @SuppressWarnings("unchecked")
    public static <T extends Model> T edit(Object o, String name,
            Map<String, String[]> params, Annotation[] annotations) {
         try {
            BeanWrapper bw = new BeanWrapper(o.getClass());
            // Start with relations
            Set<Field> fields = new HashSet<Field>();
            Class<?> clazz = o.getClass();
            while (!clazz.equals(Object.class)) {
               Collections.addAll(fields, clazz.getDeclaredFields());
               clazz = clazz.getSuperclass();
            }
            for (Field field : fields) {
               boolean isEntity = false;
               String relation = null;
               boolean multiple = false;
               boolean isEmbedded = field.isAnnotationPresent(Embedded.class);

               if (isEmbedded || field.isAnnotationPresent(Reference.class)) {
                  isEntity = true;
                  multiple = false;
                  Class<?> clz = field.getType();
                  Class<?>[] supers = clz.getInterfaces();
                  for (Class<?> c : supers) {
                     if (c.equals(Collection.class)) {
                        multiple = true;
                        break;
                     }
                  }
                  // TODO handle Map<X, Y> relationship
                  // TODO handle Collection<Collection2<..>>
                  relation = multiple ? ((Class<?>) ((ParameterizedType) field
                        .getGenericType()).getActualTypeArguments()[0]).getName()
                        : clz.getName();
               }

               if (isEntity) {
                  Logger.debug("loading relation: %1$s", relation);
                  Class<Model> c = (Class<Model>) Play.classloader
                        .loadClass(relation);
                  if (Model.class.isAssignableFrom(c)) {
                     MorphiaPlugin.MorphiaModelLoader f = (MorphiaModelLoader) MorphiaPlugin.MorphiaModelLoader
                           .getFactory(c);
                     String keyName = null;
                     if (!isEmbedded) {
                        keyName = f.keyName();
                     }
                     if (multiple
                           && Collection.class.isAssignableFrom(field.getType())) {
                        Collection<Model> l = new ArrayList<Model>();
                        if (SortedSet.class.isAssignableFrom(field.getType())) {
                           l = new TreeSet<Model>();
                        } else if (Set.class.isAssignableFrom(field.getType())) {
                           l = new HashSet<Model>();
                        }
                        Logger.debug("Collection intialized: %1$s", l.getClass()
                              .getName());
                        /*
                         * Embedded class does not support Id
                         */
                        if (!isEmbedded) {
                           String[] ids = params.get(name + "." + field.getName()
                                 + "." + keyName);
                           if (ids != null) {
                              params.remove(name + "." + field.getName() + "."
                                    + keyName);
                              for (String _id : ids) {
                                 if (_id.equals("")) {
                                    continue;
                                 }
                                 try {
                                    l.add(f.findById(_id));
                                 } catch (Exception e) {
                                    Validation.addError(
                                          name + "." + field.getName(),
                                          "validation.notFound", _id);
                                 }
                              }
                           }
                        } else {
                           Logger.debug("multiple embedded objects not supported yet");
                        }
                        bw.set(field.getName(), o, l);
                        Logger.debug(
                              "Entity[%1$s]'s field[%2$s] has been set to %3$s", o
                                    .getClass().getName(), field.getName(), l);
                     } else {
                        String name0 = name + "." + field.getName();
                        String name1 = name0 + "." + keyName;
                        String[] ids = params.get(name1);
                        if (ids != null && ids.length > 0 && !ids[0].equals("")) {
                           params.remove(name1);
                           try {
                              Object to = f.findById(ids[0]);
                              bw.set(field.getName(), o, to);
                           } catch (Exception e) {
                              Validation.addError(name0, "validation.notFound",
                                    ids[0]);
                           }
                        } else if (ids != null && ids.length > 0
                              && ids[0].equals("")) {
                           bw.set(field.getName(), o, null);
                           params.remove(name1);
                        } else {
                           // Fix bug: StackOverflowException when one field reference to null with same type
//                           Object o0 = Model.create(field.getType(), name0,
//                                 params, null);
//                           bw.set(field.getName(), o, o0);
                        }
                     }
                  }
               }
            }
            bw.bind(name, o.getClass(), params, "", o, annotations);
            return (T) o;
         } catch (Exception e) {
            throw new UnexpectedException(e);
         }
    }
View Full Code Here

TOP

Related Classes of play.data.binding.BeanWrapper

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.