Author: bpoussin Date: 2012-03-06 12:08:27 +0100 (Tue, 06 Mar 2012) New Revision: 1443 Url: http://nuiton.org/repositories/revision/wikitty/1443 Log: Evolution #1988: Wikitty pre-loading field methode preload dans le client implantee et testee. ajout pour pouvoir passer en paramettre des restore les patterns de restauration et utilise la methode preload dans le store et restore. Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.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-03-05 19:01:08 UTC (rev 1442) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyClient.java 2012-03-06 11:08:27 UTC (rev 1443) @@ -238,6 +238,9 @@ // update object resp.update(w); + // on recharge les preload, comme demande au moment du restore initial + preload(Collections.singletonList(w)); + timeLog.log(start, "store"); return w; } @@ -306,6 +309,8 @@ for (Wikitty w : wikitties) { resp.update(w); } + // on recharge les preload, comme demande au moment du restore initial + preload(wikitties); timeLog.log(start, "storeWikitty<list>"); return wikitties; @@ -411,8 +416,10 @@ */ protected void preload(Wikitty w, Map<String, Wikitty> available, Set<String> loaded) { - for (String p : w.getAllPreloadPattern()) { - preload(w, available, loaded, p); + if (w != null) { + for (String p : w.getAllPreloadPattern()) { + preload(w, available, loaded, p); + } } } @@ -424,7 +431,7 @@ * @param wikitties la liste des wikitties a precharger * @param preloadPattern la liste des patterns de prechargement a faire */ - public void preload(List<Wikitty> wikitties, String ... preloadPattern) { + public void preload(Collection<Wikitty> wikitties, String ... preloadPattern) { String patterns = StringUtils.join(preloadPattern, ";"); Map<String, Wikitty> available = new HashMap<String, Wikitty>(); for (Wikitty w : wikitties) { @@ -442,7 +449,9 @@ Set<String> loaded = new HashSet<String>(); for (Wikitty w : wikitties) { - preload(w, available, loaded); + if (w != null) { + preload(w, available, loaded); + } } } @@ -450,9 +459,11 @@ * Restore wikitty entity with specified id or {@code null} if entity can't be be found. * * @param id entity ids if null return is empty list + * @param preload patterns des liens qu'il faut precharger par exemple: + * "Company.employee, Employee.person", "Company.address, Address.*" * @return wikitty entity with specified id or {@code null} if entity can't be found */ - public List<Wikitty> restore(List<String> id) { + public List<Wikitty> restore(List<String> id, String ... preload) { long start = TimeLog.getTime(); List<Wikitty> result; @@ -460,6 +471,7 @@ result = new ArrayList<Wikitty>(); } else { result = wikittyService.restore(securityToken, id); + preload(result, preload); } timeLog.log(start, "restore<list>"); @@ -472,11 +484,11 @@ * @param id entity id * @return wikitty entity with specified id or {@code null} if entity can't be found */ - public Wikitty restore(String id) { + public Wikitty restore(String id, String ... preload) { long start = TimeLog.getTime(); Wikitty result = null; if (id != null) { - result = restore(Collections.singletonList(id)).get(0); + result = restore(Collections.singletonList(id), preload).get(0); } timeLog.log(start, "restore"); @@ -495,13 +507,13 @@ * @return wikitty entity with specified id or {@code null} if entity * can't be found or if one wikitty don't have extension wanted by E type */ - public <E extends BusinessEntity> List<E> restore( - Class<E> clazz, List<String> id, boolean checkExtension) { + public <E extends BusinessEntity> List<E> restore(Class<E> clazz, + List<String> id, boolean checkExtension, String ... preload) { long start = TimeLog.getTime(); List<E> result = new ArrayList<E>(); if (id != null) { - List<Wikitty> wikitties = restore(id); + List<Wikitty> wikitties = restore(id, preload); Collection<String> businessExtension = null; if (checkExtension) { @@ -515,7 +527,8 @@ E dto = null; if (!checkExtension || // on ne check pas les extensions ou ... - CollectionUtils.subtract(businessExtension, w.getExtensionNames()).isEmpty()) { + CollectionUtils.subtract( + businessExtension, w.getExtensionNames()).isEmpty()) { // ... on a retrouve toutes les extensions du wikitty dans l'objet // on le prend dans les resultats dto = WikittyUtil.newInstance(clazz, w); @@ -537,8 +550,9 @@ * @param id entity id * @return wikitty entity with specified id or {@code null} if entity can't be found */ - public <E extends BusinessEntity> E restore(Class<E> clazz, String id) { - E result = restore(clazz, id, false); + public <E extends BusinessEntity> E restore(Class<E> clazz, String id, + String ... preload) { + E result = restore(clazz, id, false, preload); return result; } @@ -552,43 +566,48 @@ * declared in clazz * @return wikitty entity with specified id or {@code null} if entity can't be found */ - public <E extends BusinessEntity> E restore(Class<E> clazz, String id, boolean checkExtension) { + public <E extends BusinessEntity> E restore(Class<E> clazz, String id, + boolean checkExtension, String ... preload) { long start = TimeLog.getTime(); E result = null; if (id != null) { - result = restore(clazz, Collections.singletonList(id), checkExtension).get(0); + result = restore(clazz, Collections.singletonList(id), + checkExtension, preload).get(0); } timeLog.log(start, "restore<Business>"); return result; } - public <E extends BusinessEntity> List<E> restore(Class<E> clazz, List<String> id) { - List<E> result = restore(clazz, id, false); + public <E extends BusinessEntity> List<E> restore(Class<E> clazz, + List<String> id, String ... preload) { + List<E> result = restore(clazz, id, false, preload); return result; } - public Set<Wikitty> restore(Set<String> id) { + public Set<Wikitty> restore(Set<String> id, String ... preload) { ArrayList<String> list = null; if (id != null) { list = new ArrayList<String>(id); } - List<Wikitty> resultList = restore(list); + List<Wikitty> resultList = restore(list, preload); Set<Wikitty> result = new LinkedHashSet<Wikitty>(resultList); return result; } - public <E extends BusinessEntity> Set<E> restore(Class<E> clazz, Set<String> id) { - Set<E> result = restore(clazz, id, false); + public <E extends BusinessEntity> Set<E> restore(Class<E> clazz, + Set<String> id, String ... preload) { + Set<E> result = restore(clazz, id, false, preload); return result; } - public <E extends BusinessEntity> Set<E> restore(Class<E> clazz, Set<String> id, boolean checkExtension) { + public <E extends BusinessEntity> Set<E> restore(Class<E> clazz, Set<String> id, + boolean checkExtension, String ... preload) { ArrayList<String> list = null; if (id != null) { list = new ArrayList<String>(id); } - List<E> resultList = restore(clazz, list, checkExtension); + List<E> resultList = restore(clazz, list, checkExtension, preload); Set<E> result = new LinkedHashSet<E>(resultList); return result; } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-05 19:01:08 UTC (rev 1442) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyUtil.java 2012-03-06 11:08:27 UTC (rev 1443) @@ -1199,6 +1199,24 @@ } /** + * Try to convert object to wikitty, this is possible only if object is + * Wikitty or BusinessEntityImpl. If convertion is not possible return null. + * @param o object to convert + * @return null is convertion is impossible Wikitty otherwize. + */ + static public Wikitty getWikitty(Object o) { + Wikitty result = null; + if (o instanceof Wikitty) { + // W, rien a faire + result = (Wikitty)o; + } else if (o instanceof BusinessEntityImpl) { + // BusinessEntityImpl, il faut recuperer les wikitty + result = ((BusinessEntityImpl)o).getWikitty(); + } + return result; + } + + /** * * @param service * @param securityToken Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java 2012-03-05 19:01:08 UTC (rev 1442) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/Wikitty.java 2012-03-06 11:08:27 UTC (rev 1443) @@ -311,6 +311,19 @@ String getFieldAsWikitty(String ext, String fieldName); /** + * return Wikitty for field only if this wikitty is preloaded, null or + * exception otherwize. + * @param extName extension name where this field must to be + * @param fieldName the field name + * @param exceptionIfNotLoaded if true and this field is not preloaded + * an exception is throw, otherwize null is returned. But if field is null + * (never set or set to null) and exceptionIfNotLoaded is true. This method + * must return null and not throw exception. + * @return Wikitty object or null + */ + Wikitty getFieldAsWikitty(String extName, String fieldName, boolean exceptionIfNotLoaded); + + /** * If object is a set, it is automatically transform to list. * @param <E> * @param clazz Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2012-03-05 19:01:08 UTC (rev 1442) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyCopyOnWrite.java 2012-03-06 11:08:27 UTC (rev 1443) @@ -354,6 +354,11 @@ } @Override + public Wikitty getFieldAsWikitty(String extName, String fieldName, boolean exceptionIfNotLoaded) { + return target.getFieldAsWikitty(extName, fieldName, exceptionIfNotLoaded); + } + + @Override public <E> List<E> getFieldAsList(String ext, String fieldName, Class<E> clazz) { return target.getFieldAsList(ext, fieldName, clazz); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2012-03-05 19:01:08 UTC (rev 1442) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/entities/WikittyImpl.java 2012-03-06 11:08:27 UTC (rev 1443) @@ -588,6 +588,20 @@ Object validValue = fieldType.getValidValue(value); fieldValue.put(key, validValue); + // if user pass in argument object that permit to take wikitty, + // we put it, in preload map + if (value != null && fieldType.getType() == WikittyTypes.WIKITTY) { + if (fieldType.isCollection()) { + for ( Object o : (Collection<?>) value ) { + Wikitty w = WikittyUtil.getWikitty(o); + addPreloaded(w); + } + } else { + Wikitty w = WikittyUtil.getWikitty(value); + addPreloaded(w); + } + } + // mark field dirty and call listener setFieldDirty(ext, fieldName, oldValue, validValue); } @@ -771,6 +785,20 @@ return result; } + @Override + public Wikitty getFieldAsWikitty(String extName, String fieldName, boolean exceptionIfNotLoaded) { + String id = getFieldAsWikitty(extName, fieldName); + Wikitty result = null; + if (id != null) { + result = getPreloaded().get(id); + if (exceptionIfNotLoaded && result == null) { + throw new WikittyException(String.format( + "field %s.%s is not preloaded", extName, fieldName)); + } + } + return result; + } + /* * @see org.nuiton.wikitty.Wikitty#getFieldAsList(java.lang.String, java.lang.String, java.lang.Class) */ @@ -831,25 +859,23 @@ // check upper bound only if col exists, // because ask upper bound == 0 is ridiculous - if (fieldType.isUnique()) { - if (!col.contains(value)) { - // only add if not already in collection (unique) - if (col.size() + 1 > fieldType.getUpperBound()) { - // if upper bound reached, throw an exception - throw new WikittyException(String.format( - "Can't add value for field '%s', upper bound is reached", - ext + "." + fieldName)); - } - col.add(value); - setFieldDirty(ext, fieldName, null, col); - } + Object validValue = fieldType.getContainedValidObject(value); + if (fieldType.isUnique() && col.contains(validValue)) { + // do nothing, only add if not already in unique collection } else { if (col.size() + 1 > fieldType.getUpperBound()) { + // if upper bound reached, throw an exception throw new WikittyException(String.format( "Can't add value for field '%s', upper bound is reached", ext + "." + fieldName)); } - col.add(value); + col.add(validValue); + // if user pass in argument object that permit to take wikitty, + // we put it, in preload map + if (fieldType.getType() == WikittyTypes.WIKITTY) { + Wikitty w = WikittyUtil.getWikitty(value); + addPreloaded(w); + } setFieldDirty(ext, fieldName, null, col); } } @@ -869,13 +895,14 @@ Collection col = (Collection) getFieldAsObject(ext, fieldName); if (col != null) { FieldType type = getExtension(ext).getFieldType(fieldName); - if (col.contains(value)) { + Object validValue = type.getContainedValidObject(value); + if (col.contains(validValue)) { if (col.size() - 1 < type.getLowerBound()) { throw new WikittyException(String.format( "Can't remove value for field '%s', lower bound is reached", ext + "." + fieldName)); } else { - if (col.remove(value)) { + if (col.remove(validValue)) { // field is dirty only if remove is done setFieldDirty(ext, fieldName, null, col); } Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-05 19:01:08 UTC (rev 1442) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/WikittyClientTest.java 2012-03-06 11:08:27 UTC (rev 1443) @@ -49,6 +49,8 @@ import org.nuiton.wikitty.entities.ElementField; import org.nuiton.wikitty.entities.ExtensionFactory; import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyAuthorisation; +import org.nuiton.wikitty.entities.WikittyAuthorisationHelper; import org.nuiton.wikitty.entities.WikittyAuthorisationImpl; import org.nuiton.wikitty.entities.WikittyExtension; import org.nuiton.wikitty.entities.WikittyGroup; @@ -2478,6 +2480,51 @@ Assert.assertNotNull(groupRestored.getPreloaded().get(l1.getWikittyId())); Assert.assertNotNull(groupRestored.getPreloaded().get(l2.getWikittyId())); Assert.assertNotNull(groupRestored.getPreloaded().get(l3.getWikittyId())); + } + @Test + public void testRestoreStoreWithPreload() throws Exception { + WikittyUserImpl moi = new WikittyUserImpl(); + moi.setLogin("moi"); + + WikittyAuthorisationImpl auth = new WikittyAuthorisationImpl(); + auth.setOwner(moi.getWikittyId()); + wikittyClient.store(moi, auth); + + Wikitty authRestored = wikittyClient.restore(auth.getWikittyId(), + "WikittyAuthorisation.owner"); + // on verifie que moi est bien present dans les preload + Assert.assertNotNull(authRestored.getPreloaded().get(moi.getWikittyId())); + + WikittyUserImpl other = new WikittyUserImpl(); + other.setLogin("other"); +// WikittyAuthorisationHelper.setOwner(authRestored, other); + authRestored.setFqField( + WikittyAuthorisation.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, other); + // on verifie que si on passe un Wikitty en parametre du set, il est + // bien ajoute au preload, meme s'il n'est pas encore store + Assert.assertNotNull(authRestored.getPreloaded().get(other.getWikittyId())); + + WikittyUserImpl unknown = new WikittyUserImpl(); + other.setLogin("unknown"); + wikittyClient.store(unknown); + + authRestored.setFqField( + WikittyAuthorisation.FQ_FIELD_WIKITTYAUTHORISATION_OWNER, unknown.getWikittyId()); + // on verifie que si on passe un id, on a plus rien + Assert.assertNull(authRestored.getPreloaded().get(unknown.getWikittyId())); + Assert.assertNull(authRestored.getFieldAsWikitty( + WikittyAuthorisation.EXT_WIKITTYAUTHORISATION, + WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_OWNER, false)); + + authRestored = wikittyClient.store(authRestored); + // mais qu'apres un store on l'a a nouveau + Assert.assertNotNull(authRestored.getPreloaded().get(unknown.getWikittyId())); + Assert.assertNotNull(authRestored.getFieldAsWikitty( + WikittyAuthorisation.EXT_WIKITTYAUTHORISATION, + WikittyAuthorisation.FIELD_WIKITTYAUTHORISATION_OWNER, false)); + } + + }