Author: echatellier Date: 2010-06-15 10:52:02 +0200 (Tue, 15 Jun 2010) New Revision: 127 Url: http://nuiton.org/repositories/revision/wikitty/127 Log: Use opened transaction during export task (paged result cast) Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java 2010-06-11 17:17:10 UTC (rev 126) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java 2010-06-15 08:52:02 UTC (rev 127) @@ -131,6 +131,39 @@ /** * Convert all result to the wanted type and return new PagedResult with + * this new result list. + * + * @param securityToken security token + * @param ws wikitty service + * @param transaction transaction + * + * @return new PagedResult, this result can have less elements that original + * for some reason (security, ...) + */ + public PagedResult<Wikitty> cast(String securityToken, WikittyService ws, WikittyTransaction transaction) { + List<Wikitty> castedResult; + + if (results.size() == 0) { + castedResult = new ArrayList<Wikitty>(); + } else { + if (results.get(0) instanceof String) { + // le pagedresult courant contient des Ids + // Si ce n'est pas le cas, ca veut dire que le developpeur utilisant + // ce PagedResult ne sait pas ce qu'il fait :) + List<String> ids = (List<String>) results; + castedResult = ws.restore(securityToken, transaction, ids); + } else { + throw new ClassCastException("PagedResult don't contains" + + " wikitty String id but " + results.get(0).getClass()); + } + } + PagedResult<Wikitty> result = new PagedResult<Wikitty>( + firstIndice, numFound, queryString, facets, castedResult); + return result; + } + + /** + * Convert all result to the wanted type and return new PagedResult with * this new result list. If some result don't have the right extension (clazz) * this extension is automatically added if autoconvert is true. Else * an exception is thrown when result without extension is found. Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-06-11 17:17:10 UTC (rev 126) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-06-15 08:52:02 UTC (rev 127) @@ -267,6 +267,18 @@ * elements than collection argument */ public List<Wikitty> restore(String securityToken, List<String> id); + + /** + * Restore wikitty using opened transaction. + * + * @param securityToken security token + * @param transaction transaction to use + * @param id list of wikitty ids to restore + * @return list of corresponding wikitty, if one id is not valid (no object + * or deleted or no authorisation) this id is skip and result list have less + * elements than collection argument + */ + public List<Wikitty> restore(String securityToken, WikittyTransaction transaction, List<String> id); /** * delete object if id exists Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java 2010-06-11 17:17:10 UTC (rev 126) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java 2010-06-15 08:52:02 UTC (rev 127) @@ -320,7 +320,45 @@ return result; } + + /** + * Overriden to put all restored object from server in cache + * + * @param securityToken security token + * @param transaction transaction to use + * @param ids wikitty ids to restore + * @return wikitty list + */ + @Override + public List<Wikitty> restore(String securityToken, WikittyTransaction transaction, List<String> ids) { + ArrayList<String> notInCache = new ArrayList<String>(); + // linked to maintains the ordre + LinkedHashMap<String, Wikitty> fromCache = + new LinkedHashMap<String, Wikitty>(); + for (String id : ids) { + Wikitty w = cache.getWikitty(id); + fromCache.put(id, w); // put all to maintains order + if (w == null) { // if not found on cache, ask the server + notInCache.add(id); + } + } + // retrieve missing object + List<Wikitty> missingInCache = ws.restore(securityToken, transaction, notInCache); + + cache.putAllWikitty(missingInCache); + + for (Wikitty w : missingInCache) { + // add missing object + fromCache.put(w.getId(), w); + } + + Collection<Wikitty> tmp = fromCache.values(); + ArrayList<Wikitty> result = new ArrayList<Wikitty>(tmp); + + return result; + } + /** * just wrap service method * Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java 2010-06-11 17:17:10 UTC (rev 126) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java 2010-06-15 08:52:02 UTC (rev 127) @@ -388,7 +388,8 @@ return result; } - protected List<Wikitty> restore(String securityToken, + @Override + public List<Wikitty> restore(String securityToken, WikittyTransaction transaction, List<String> ids) { List<Wikitty> result = new ArrayList<Wikitty>(); for(String id : ids) { Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java 2010-06-11 17:17:10 UTC (rev 126) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java 2010-06-15 08:52:02 UTC (rev 127) @@ -306,12 +306,18 @@ } @Override - public List<Wikitty> restore(String securityToken, List<String> id) { + public List<Wikitty> restore(String securityToken, List<String> ids) { // no notification - return ws.restore(securityToken, id); + return ws.restore(securityToken, ids); } @Override + public List<Wikitty> restore(String securityToken, WikittyTransaction transaction, List<String> ids) { + // no notification + return ws.restore(securityToken, transaction, ids); + } + + @Override public void delete(String securityToken, String id) { ws.delete(securityToken, id); // notify listeners Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java 2010-06-11 17:17:10 UTC (rev 126) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java 2010-06-15 08:52:02 UTC (rev 127) @@ -357,6 +357,24 @@ } @Override + public List<Wikitty> restore(String securityToken, WikittyTransaction transaction, List<String> ids) { + List<String> authorizedIds = new LinkedList<String>(ids); + for (Iterator<String> i=authorizedIds.iterator(); i.hasNext();) { + String id = i.next(); + if (!canRead(securityToken, id)) { + if (log.isDebugEnabled()) { + log.debug(_( + "user %s can't read object %s, remove it in restore list", + getUserId(securityToken), id)); + } + i.remove(); + } + } + + return ws.restore(securityToken, transaction, authorizedIds); + } + + @Override public void delete(String securityToken, String id) { if (canDelete(securityToken, id)) { ws.delete(securityToken, id); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java 2010-06-11 17:17:10 UTC (rev 126) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/importexport/ExportTask.java 2010-06-15 08:52:02 UTC (rev 127) @@ -53,7 +53,7 @@ log.info("Export started"); } // get Wikitty from Id - PagedResult<Wikitty> pageResult = pageResultId.cast(securityToken, ws); + PagedResult<Wikitty> pageResult = pageResultId.cast(securityToken, ws, transaction); ImportExportMethod exporter = format.ieporter(); exporter.exportWriter(securityToken, writer, ws, transaction, pageResult);