r362 - trunk/wikitty-api/src/main/java/org/nuiton/wikitty
Author: echatellier Date: 2010-09-28 17:55:27 +0200 (Tue, 28 Sep 2010) New Revision: 362 Url: http://nuiton.org/repositories/revision/wikitty/362 Log: Imporve wikitty in memory service Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceInMemory.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceInMemory.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceInMemory.java 2010-09-28 15:54:22 UTC (rev 361) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceInMemory.java 2010-09-28 15:55:27 UTC (rev 362) @@ -63,12 +63,62 @@ protected Map<String, Wikitty> wikitties = new LinkedHashMap<String, Wikitty>(); @Override - public UpdateResponse store(WikittyTransaction transaction, Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { + public UpdateResponse store(WikittyTransaction transaction, Collection<Wikitty> wikitties, boolean force) { UpdateResponse result = new UpdateResponse(); for (Wikitty wikitty : wikitties) { - wikitty.setVersion(WikittyUtil.incrementMajorRevision(wikitty.getVersion())); + + String actualVersion = null; + Wikitty inMemoryWikitty = this.wikitties.get(wikitty.getId()); + if (inMemoryWikitty != null) { + actualVersion = inMemoryWikitty.getVersion(); + } + String requestedVersion = wikitty.getVersion(); + + String newVersion = null; + if (force) { + if (actualVersion == null) { //no version in place + if (requestedVersion == null) { //no version requested + newVersion = WikittyUtil.DEFAULT_VERSION; + } else { //version requested + newVersion = requestedVersion; + } + } else { //version in place is not null + if (requestedVersion == null) { //no version requested + newVersion = WikittyUtil.incrementMajorRevision(actualVersion); + } else if (WikittyUtil.versionEquals(actualVersion, requestedVersion)) { //same version + // wikitty is not modified, do nothing + continue; + } else if (WikittyUtil.versionGreaterThan(requestedVersion, actualVersion)) { //requested version is newer + newVersion = requestedVersion; + } else { //requested version is obsolete + throw new WikittyObsoleteException(String.format( + "Your wikitty '%s' is obsolete (saving: '%s'; existing: '%s')", wikitty.getId(), requestedVersion, actualVersion)); + } + } + } + else { + if (WikittyUtil.versionEquals(actualVersion, requestedVersion)) { + // no modification, continue + continue; + } + else if (WikittyUtil.versionGreaterThan(actualVersion, requestedVersion)) { + throw new WikittyObsoleteException(String.format( + "Your wikitty '%s' is obsolete", wikitty.getId())); + } + else { + newVersion = WikittyUtil.incrementMajorRevision(actualVersion); + } + } + wikitty.setVersion(newVersion); wikitty.clearDirty(); - this.wikitties.put(wikitty.getId(), wikitty); + + try { + this.wikitties.put(wikitty.getId(), wikitty.clone()); + } catch (CloneNotSupportedException ex) { + if (log.isErrorEnabled()) { + log.error("Can't clone ?", ex); + } + } result.addVersionUpdate(wikitty.getId(), wikitty.getVersion()); } return result; @@ -243,17 +293,18 @@ public boolean checkRestriction( Restriction restriction, Wikitty w ) { if ( restriction instanceof BinaryOperator ) { BinaryOperator binOp = (BinaryOperator) restriction; - + if ( binOp.getElement().getName().equals(Element.ELT_EXTENSION) ) { return w.hasExtension(binOp.getValue()); } - // FIXME: 20091104 jru manage search on extension and id String fqfieldName = binOp.getElement().getName(); - if(Element.ELT_EXTENSION.equals(fqfieldName) || - Element.ELT_ID.equals(fqfieldName)) { + if(Element.ELT_EXTENSION.equals(fqfieldName)) { return true; } + else if (Element.ELT_ID.equals(fqfieldName)) { + return w.getId().equals(binOp.getValue()); + } // Le check restriction, ne doit pas tester les champs // si les wikitty n'ont meme pas l'extension concerné @@ -264,7 +315,7 @@ Object o = w.getFqField( fqfieldName ); FieldType t = w.getFieldType(fqfieldName); - Object value = t.getValidValue( binOp.getValue() ); + Object value = t.getValidValue(binOp.getValue()); boolean checked = false; switch( restriction.getName() ) { case EQUALS: @@ -329,8 +380,8 @@ Wikitty w = entry.getValue(); String id = entry.getKey(); Restriction dto = criteria.getRestriction(); - - if ( checkRestriction(dto, w) ) { + + if ( !w.isDeleted() && checkRestriction(dto, w) ) { currentIndex++; if (currentIndex > firstIndex) { ids.add(id);
participants (1)
-
echatellier@users.nuiton.org