diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java index 20ef481cde3845a35fbdc3853fb12a31278dc7e3..3e49b08f2c0771f7770818b412dfa564763db48b 100644 --- a/src/main/java/org/caosdb/server/entity/Entity.java +++ b/src/main/java/org/caosdb/server/entity/Entity.java @@ -537,12 +537,19 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public final Element toElement() { - return getToElementStrategy().toElement(this, new SetFieldStrategy(getSelections())); + return getToElementStrategy().toElement(this, getSerializeFieldStrategy()); + } + + private SetFieldStrategy getSerializeFieldStrategy() { + if (this.serializeFieldStrategy == null) { + this.serializeFieldStrategy = new SetFieldStrategy(getSelections()); + } + return this.serializeFieldStrategy; } @Override public final void addToElement(final Element element) { - addToElement(element, new SetFieldStrategy(getSelections())); + addToElement(element, getSerializeFieldStrategy()); } @Override @@ -930,6 +937,7 @@ public class Entity extends AbstractObservable implements EntityInterface { private boolean datatypeOverride = false; private Version version = new Version(); + private SetFieldStrategy serializeFieldStrategy = null; @Override public EntityInterface setDatatypeOverride(final boolean b) { @@ -1067,4 +1075,9 @@ public class Entity extends AbstractObservable implements EntityInterface { && this.getDatatype() instanceof AbstractCollectionDatatype && ((AbstractCollectionDatatype) getDatatype()).getDatatype() instanceof ReferenceDatatype; } + + @Override + public void setSerializeFieldStrategy(SetFieldStrategy s) { + this.serializeFieldStrategy = s; + } } diff --git a/src/main/java/org/caosdb/server/entity/TransactionEntity.java b/src/main/java/org/caosdb/server/entity/TransactionEntity.java index 7dd96b7f5ba8dc71c976731fed4d91e43688f919..0c41c180fc3bedaa74b07eb04f5135422b6ccc94 100644 --- a/src/main/java/org/caosdb/server/entity/TransactionEntity.java +++ b/src/main/java/org/caosdb/server/entity/TransactionEntity.java @@ -25,6 +25,7 @@ package org.caosdb.server.entity; import java.util.List; import java.util.Map; import java.util.Set; +import org.caosdb.server.entity.xml.SetFieldStrategy; import org.caosdb.server.entity.xml.ToElementStrategy; import org.caosdb.server.entity.xml.ToElementable; import org.caosdb.server.query.Query.Selection; @@ -47,6 +48,8 @@ public interface TransactionEntity { public abstract void setToElementStragegy(ToElementStrategy s); + public abstract void setSerializeFieldStrategy(SetFieldStrategy s); + public abstract Element toElement(); public abstract Set<ToElementable> getMessages(); diff --git a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java index e5115dc219ac427e93ae87c0921ced965023f55e..01c374ecb5c6ac073981db6f44a34989a0e6822e 100644 --- a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java +++ b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java @@ -575,4 +575,9 @@ public class EntityWrapper implements EntityInterface { public boolean isReferenceList() { return this.entity.isReferenceList(); } + + @Override + public void setSerializeFieldStrategy(SetFieldStrategy s) { + this.entity.setSerializeFieldStrategy(s); + } } diff --git a/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java b/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java index 89420c596894da9be35e33a507821c96d10f5b7d..3ca8eecc385270e708588516e931e80c886f9ba9 100644 --- a/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java +++ b/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java @@ -89,7 +89,7 @@ public class EntityToElementStrategy implements ToElementStrategy { if (setFieldStrategy.isToBeSet("id") && entity.hasId()) { element.setAttribute("id", Integer.toString(entity.getId())); } - if (entity.hasVersion()) { + if (setFieldStrategy.isToBeSet("version") && entity.hasVersion()) { Element v = new VersionXMLSerializer().toElement(entity.getVersion()); element.addContent(v); } @@ -109,6 +109,22 @@ public class EntityToElementStrategy implements ToElementStrategy { for (final ToElementable m : entity.getMessages()) { m.addToElement(element); } + } else { + if (setFieldStrategy.isToBeSet("error")) { + for (ToElementable m : entity.getMessages("error")) { + m.addToElement(element); + } + } + if (setFieldStrategy.isToBeSet("warning")) { + for (ToElementable m : entity.getMessages("warning")) { + m.addToElement(element); + } + } + if (setFieldStrategy.isToBeSet("info")) { + for (ToElementable m : entity.getMessages("info")) { + m.addToElement(element); + } + } } if (setFieldStrategy.isToBeSet("query") && entity.getQueryTemplateDefinition() != null) { final Element q = new Element("Query"); diff --git a/src/main/java/org/caosdb/server/entity/xml/IdAndServerMessagesOnlyStrategy.java b/src/main/java/org/caosdb/server/entity/xml/IdAndServerMessagesOnlyStrategy.java new file mode 100644 index 0000000000000000000000000000000000000000..d61d0b5111a094d294e930751e7bd6fed6aa1428 --- /dev/null +++ b/src/main/java/org/caosdb/server/entity/xml/IdAndServerMessagesOnlyStrategy.java @@ -0,0 +1,12 @@ +package org.caosdb.server.entity.xml; + +public class IdAndServerMessagesOnlyStrategy extends SetFieldStrategy { + + @Override + public boolean isToBeSet(String field) { + return "id".equals(field) + || "error".equals(field) + || "warning".equals(field) + || "info".equals(field); + } +} diff --git a/src/main/java/org/caosdb/server/entity/xml/SetFieldStrategy.java b/src/main/java/org/caosdb/server/entity/xml/SetFieldStrategy.java index 1d9f219086e5ddd921d9519d3391e1cca9fbffc9..2d6b696c235052974326dbfca110be32604c3981 100644 --- a/src/main/java/org/caosdb/server/entity/xml/SetFieldStrategy.java +++ b/src/main/java/org/caosdb/server/entity/xml/SetFieldStrategy.java @@ -135,8 +135,9 @@ public class SetFieldStrategy { if (this.cache == null) { this.cache = new HashMap<String, Boolean>(); - // always include the id and the name + // always include the id, version and the name this.cache.put("id", true); + this.cache.put("version", true); this.cache.put("name", true); // ... and the referenced entity. diff --git a/src/main/java/org/caosdb/server/transaction/Retrieve.java b/src/main/java/org/caosdb/server/transaction/Retrieve.java index 45647c1d554d38ab2b90e91f9516305265d370b8..e9a67f5ffccdea6be5e8f2c4a82e37590b38e862 100644 --- a/src/main/java/org/caosdb/server/transaction/Retrieve.java +++ b/src/main/java/org/caosdb/server/transaction/Retrieve.java @@ -27,9 +27,7 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.transaction.RetrieveFullEntityTransaction; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.container.RetrieveContainer; -import org.caosdb.server.entity.xml.SetFieldStrategy; -import org.caosdb.server.entity.xml.ToElementStrategy; -import org.caosdb.server.entity.xml.ToElementable; +import org.caosdb.server.entity.xml.IdAndServerMessagesOnlyStrategy; import org.caosdb.server.jobs.ScheduledJob; import org.caosdb.server.jobs.core.JobFailureSeverity; import org.caosdb.server.jobs.core.RemoveDuplicates; @@ -37,7 +35,6 @@ import org.caosdb.server.jobs.core.ResolveNames; import org.caosdb.server.permissions.EntityPermission; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; -import org.jdom2.Element; public class Retrieve extends Transaction<RetrieveContainer> { @@ -86,34 +83,7 @@ public class Retrieve extends Transaction<RetrieveContainer> { try { e.checkPermission(EntityPermission.RETRIEVE_ENTITY); } catch (final AuthorizationException exc) { - e.setToElementStragegy( - new ToElementStrategy() { - - @Override - public Element toElement( - final EntityInterface entity, final SetFieldStrategy setFieldStrategy) { - Element ret; - if (entity.hasRole()) { - ret = new Element(entity.getRole().toString()); - } else { - ret = new Element("Entity"); - } - ret.setAttribute("id", entity.getId().toString()); - for (final ToElementable m : entity.getMessages()) { - m.addToElement(ret); - } - return ret; - } - - @Override - public Element addToElement( - final EntityInterface entity, - final Element parent, - final SetFieldStrategy setFieldStrategy) { - parent.addContent(toElement(entity, setFieldStrategy)); - return parent; - } - }); + e.setSerializeFieldStrategy(new IdAndServerMessagesOnlyStrategy()); e.setEntityStatus(EntityStatus.UNQUALIFIED); e.addError(ServerMessages.AUTHORIZATION_ERROR); e.addInfo(exc.getMessage());