Author: bpoussin Date: 2012-01-12 16:16:49 +0100 (Thu, 12 Jan 2012) New Revision: 1318 Url: http://nuiton.org/repositories/revision/wikitty/1318 Log: add new WikittyClient.castTo method with list and object as parameter this new method replace deprecated getWikitty method Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-12 14:02:29 UTC (rev 1317) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-01-12 15:16:49 UTC (rev 1318) @@ -1249,7 +1249,9 @@ * * @param entity the BusinessEntity encapsulating the Wikitty * @return the wikitty encapsulated + * @deprecated since 3.4 use {@link #castTo(java.lang.Class, Object) } */ + @Deprecated public Wikitty getWikitty(BusinessEntity entity){ long start = TimeLog.getTime(); Wikitty result; @@ -1340,93 +1342,203 @@ return user; } + /** - * Convert all result to the wanted type and return new WikittyQueryResult - * with this new result list. For business object transformation, if some + * Convert all objects in list parameter to the wanted type and return + * new List. + * For business object transformation, if some * result don't have the right extension (clazz) this extension is * automatically added. - * - * @param queryResult result to convert + * + * If possible this method don't instanciated new Object. If e is Wikitty + * and wanted target is Wikitty a simple cast is done. + * * @param target to cast into. * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[] - * @return new WikittyQueryResult with element in right class or Exception + * @param objects objects to convert + * @return List objects in right class or Exception. * if conversion is impossible + * @since 3.4 */ - public <E> WikittyQueryResult<E> castTo(Class<E> target, - WikittyQueryResult queryResult) { - List<E> castedResult; + public <E, F> List<E> castTo(Class<E> target, List<F> objects) { + List<E> result; - if (queryResult.size() == 0) { + if (objects == null) { + result = null; + } else if (objects.size() == 0) { // on ne fait rien on met juste une nouvelle liste vide - castedResult = new ArrayList<E>(); + result = new ArrayList<E>(); } else if (target.isAssignableFrom(Wikitty.class)) { // On veut des Wikitties en sortie - if (queryResult.peek() instanceof Wikitty) { + Object first = objects.get(0); + if (first instanceof Wikitty) { // W, rien a faire - castedResult = queryResult.getAll(); - } else if (queryResult.peek() instanceof BusinessEntityImpl) { + result = (List<E>)objects; + } else if (first instanceof BusinessEntityImpl) { // BusinessEntityImpl, il faut recuperer les wikitty - castedResult = new ArrayList<E>(queryResult.size()); - for (BusinessEntityImpl e : (WikittyQueryResult<BusinessEntityImpl>)queryResult) { - castedResult.add((E)e.getWikitty()); + result = new ArrayList<E>(objects.size()); + for (BusinessEntityImpl e : (WikittyQueryResult<BusinessEntityImpl>)objects) { + result.add((E)e.getWikitty()); } - } else if (queryResult.peek() instanceof String) { + } else if (first instanceof BusinessEntity) { + // BusinessEntity, il faut faire un restore puis remettre la + // valeur des champs dans les wikitties recuperes + + // on collecte tous les ids + List<String> ids = new ArrayList(objects.size()); + for (BusinessEntity e : (List<BusinessEntity>)objects) { + ids.add(e.getWikittyId()); + } + + result = (List<E>)restore(ids); + + // on copie les champs des entities dans les wikitties recuperes + // try settings all fields except version + try { + // les entites a mettre dans les wikitties + BusinessEntity[] entities = objects.toArray(new BusinessEntity[objects.size()]); + // les wikitties qui seront les resultats + Wikitty[] wikitties = result.toArray(new Wikitty[result.size()]); + + //get all fields + Class entityClass = first.getClass(); + Field[] fields = entityClass.getDeclaredFields(); + + for(Field field:fields){ + //for each field that got WikittyField annotation + if (field.isAnnotationPresent(WikittyField.class)){ + + //get the attribute's wikitty fqn + WikittyField annotation = field.getAnnotation(WikittyField.class); + String fieldFQN = annotation.fqn(); + + //set the value + Method m = entityClass.getMethod("get" + StringUtils.capitalize(field.getName())); + + for(int i=0; i<entities.length; i++) { + if (wikitties[i] != null) { + // le wikitty peut etre null, par exemple a cause de la security + Object value = m.invoke(entities[i]); + wikitties[i].setFqField(fieldFQN, value); + } + } + } + } + //manually set version + for(int i=0; i<entities.length; i++) { + if (wikitties[i] != null) { + // le wikitty peut etre null, par exemple a cause de la security + wikitties[i].setVersion(entities[i].getWikittyVersion()); + } + } + } catch (Exception eee) { + throw new WikittyException("Could not transform entity to Wikitty", eee); + } + } else if (first instanceof String) { // String, il faut faire un restore // le queryResult courant contient des Ids // Si ce n'est pas le cas, ca veut dire que le developpeur utilisant // ce queryResult ne sait pas ce qu'il fait :) - List<String> ids = (List<String>) queryResult.getAll(); - castedResult = (List<E>)getWikittyService().restore(securityToken, ids); + List<String> ids = (List<String>) objects.get(0); + result = (List<E>)restore(ids); } else { throw new ClassCastException("WikittyQueryResult don't contains" + " object convertible to Wikitty" - + " (accepted Wikitty, BusinessEntityImpl, String id) but " - + queryResult.peek().getClass()); + + " (accepted Wikitty, BusinessEntityImpl, String id) but not " + + first.getClass()); } - } else if (target.isAssignableFrom(BusinessEntityImpl.class)) { + } else if (target.isAssignableFrom(BusinessEntity.class)) { // on commence par tout mettre en Wikitty, en utilisant le if du dessus - WikittyQueryResult<Wikitty> resultTmp = castTo(Wikitty.class, queryResult); - castedResult = (List<E>)WikittyUtil.newInstance((Class<BusinessEntity>)target, resultTmp.getAll()); + List<Wikitty> resultTmp = castTo(Wikitty.class, objects); + result = (List<E>)WikittyUtil.newInstance((Class<BusinessEntity>)target, resultTmp); } else if (target.isAssignableFrom(Number.class)) { - castedResult = new ArrayList<E>(queryResult.size()); - for (Object o : queryResult) { + result = new ArrayList<E>(objects.size()); + for (Object o : objects) { BigDecimal v = WikittyUtil.toBigDecimal(o); - castedResult.add((E)v); + result.add((E)v); } } else if (target.isAssignableFrom(Date.class)) { - castedResult = new ArrayList<E>(queryResult.size()); - for (Object o : queryResult) { + result = new ArrayList<E>(objects.size()); + for (Object o : objects) { Date v = WikittyUtil.toDate(o); - castedResult.add((E)v); + result.add((E)v); } } else if (target.isAssignableFrom(Boolean.class)) { - castedResult = new ArrayList<E>(queryResult.size()); - for (Object o : queryResult) { + result = new ArrayList<E>(objects.size()); + for (Object o : objects) { Boolean v = WikittyUtil.toBoolean(o); - castedResult.add((E)v); + result.add((E)v); } } else if (target.isAssignableFrom(byte[].class)) { - castedResult = new ArrayList<E>(queryResult.size()); - for (Object o : queryResult) { + result = new ArrayList<E>(objects.size()); + for (Object o : objects) { byte[] v = WikittyUtil.toBinary(o); - castedResult.add((E)v); + result.add((E)v); } } else if (target.isAssignableFrom(String.class)) { - castedResult = new ArrayList<E>(queryResult.size()); - for (Object o : queryResult) { + result = new ArrayList<E>(objects.size()); + for (Object o : objects) { String v = WikittyUtil.toString(o); - castedResult.add((E)v); + result.add((E)v); } }else { throw new ClassCastException(String.format( - "WikittyQueryResult don't contains" + "Object list don't contains" + " object convertible to %s" + " (accepted Wikitty, BusinessEntityImpl, String id, Date," - + " BigDecimal, Boolean, byte[]) but '%s'", - target.getName(), queryResult.peek().getClass())); + + " BigDecimal, Boolean, byte[]) but not '%s'", + target.getName(), objects.get(0).getClass())); } + return result; + } + + /** + * Convert e parameter to the wanted type and return it. + * For business object transformation, if some + * result don't have the right extension (clazz) this extension is + * automatically added. + * + * If possible this method don't instanciated new Object. If e is Wikitty + * and wanted target is Wikitty a simple cast is done. + * + * @param target to cast into. + * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[] + * @param e object to convert + * @return Object in right class or Exception. + * if conversion is impossible + * @since 3.4 + */ + public <E> E castTo(Class<E> target, Object e) { + E result; + + if (e == null) { + result = null; + } else { + List<E> tmp = castTo(target, Collections.singletonList(e)); + result = tmp.get(0); + } + + return result; + } + + /** + * Convert all result to the wanted type and return new WikittyQueryResult + * with this new result list. For business object transformation, if some + * result don't have the right extension (clazz) this extension is + * automatically added. + * + * @param queryResult result to convert + * @param target to cast into. + * Can be Wikitty, BusinessEntity, String, Date, Number (returned is BigDecimal), Boolean, byte[] + * @return new WikittyQueryResult with element in right class or Exception + * if conversion is impossible + */ + public <E> WikittyQueryResult<E> castTo(Class<E> target, + WikittyQueryResult queryResult) { + List<E> castedResult = castTo(target, queryResult.getAll()); + WikittyQueryResult<E> result = new WikittyQueryResult<E>( queryResult.getQueryName(), queryResult.getFirst(), queryResult.getTotalResult(),
participants (1)
-
bpoussin@users.nuiton.org