Skip to content
Snippets Groups Projects
Verified Commit 875b74f5 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: automatic record state

parent 3f58086d
No related branches found
No related tags found
3 merge requests!21Release v0.4.0,!7F fsm,!6Draft: F acm permissions2
...@@ -15,7 +15,7 @@ import org.caosdb.server.utils.ServerMessages; ...@@ -15,7 +15,7 @@ import org.caosdb.server.utils.ServerMessages;
* *
* @author Timm Fitschen (t.fitschen@indiscale.com) * @author Timm Fitschen (t.fitschen@indiscale.com)
*/ */
@JobAnnotation(time = JobExecutionTime.CHECK, transaction = WriteTransaction.class) @JobAnnotation(time = JobExecutionTime.POST_CHECK, transaction = WriteTransaction.class)
public class CheckStateTransition extends EntityStateJob { public class CheckStateTransition extends EntityStateJob {
private static final Message TRANSITION_NOT_ALLOWED = private static final Message TRANSITION_NOT_ALLOWED =
......
package org.caosdb.server.jobs.core;
import java.util.List;
import org.caosdb.server.entity.Message;
import org.caosdb.server.entity.wrapper.Parent;
import org.caosdb.server.entity.wrapper.Property;
import org.caosdb.server.jobs.JobAnnotation;
import org.caosdb.server.jobs.JobExecutionTime;
@JobAnnotation(time = JobExecutionTime.CHECK)
public class InheritInitialState extends EntityStateJob {
@Override
protected void run() {
try {
State parentState = getFirstParentState();
if (parentState != null) {
getEntity().addMessage(parentState);
}
} catch (Message e) {
getEntity().addError(e);
}
}
private State getFirstParentState() throws Message {
for (Parent par : getEntity().getParents()) {
List<Property> stateProperties = getStateProperties(par, false);
if (stateProperties.size() > 0) {
return createState(stateProperties.get(0));
}
}
return null;
}
}
...@@ -7,8 +7,10 @@ import org.caosdb.server.CaosDBServer; ...@@ -7,8 +7,10 @@ import org.caosdb.server.CaosDBServer;
import org.caosdb.server.entity.ClientMessage; import org.caosdb.server.entity.ClientMessage;
import org.caosdb.server.entity.Entity; import org.caosdb.server.entity.Entity;
import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.EntityInterface;
import org.caosdb.server.entity.InsertEntity;
import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message;
import org.caosdb.server.entity.Message.MessageType; import org.caosdb.server.entity.Message.MessageType;
import org.caosdb.server.entity.Role;
import org.caosdb.server.entity.UpdateEntity; import org.caosdb.server.entity.UpdateEntity;
import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.entity.wrapper.Property;
import org.caosdb.server.jobs.JobAnnotation; import org.caosdb.server.jobs.JobAnnotation;
...@@ -43,6 +45,13 @@ public class InitEntityStateJobs extends EntityStateJob implements Observer { ...@@ -43,6 +45,13 @@ public class InitEntityStateJobs extends EntityStateJob implements Observer {
appendJob(CheckStateTransition.class); appendJob(CheckStateTransition.class);
appendJob(MakeStateProperty.class); appendJob(MakeStateProperty.class);
appendJob(MakeStateMessage.class); appendJob(MakeStateMessage.class);
} else if (newState == null
&& getEntity().getRole() == Role.Record
&& getEntity() instanceof InsertEntity) {
appendJob(InheritInitialState.class);
appendJob(CheckStateTransition.class);
appendJob(MakeStateProperty.class);
appendJob(MakeStateMessage.class);
} }
} }
} }
......
package org.caosdb.server.jobs.core; package org.caosdb.server.jobs.core;
import java.util.List; import java.util.List;
import java.util.Map;
import org.caosdb.server.CaosDBServer; import org.caosdb.server.CaosDBServer;
import org.caosdb.server.entity.Message; import org.caosdb.server.entity.Message;
import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.entity.wrapper.Property;
...@@ -36,26 +37,19 @@ public class MakeStateMessage extends EntityStateJob { ...@@ -36,26 +37,19 @@ public class MakeStateMessage extends EntityStateJob {
List<Property> stateProperties = getStateProperties(true); List<Property> stateProperties = getStateProperties(true);
// only add the State during Retrieve. In all other cases, the State is already present. // only add the State during Retrieve. In all other cases, the State is already present.
if (stateProperties != null && getTransaction() instanceof Retrieve) { if (stateProperties != null
String sparse = && stateProperties.size() > 0
getTransaction().getContainer().getFlags().getOrDefault(SPARSE_FLAG, "false"); && getTransaction() instanceof Retrieve) {
if ("true".equals(sparse)) { if (isSparse()) {
for (Property s : stateProperties) { for (Property s : stateProperties) {
getEntity() getEntity().addMessage(getSparseStateMessage(s));
.addMessage(
new ToElementable() {
@Override
public void addToElement(Element ret) {
Element state = new Element(STATE_XML_TAG);
state.setAttribute(STATE_ATTRIBUTE_ID, s.getValue().toString());
ret.addContent(state);
}
});
} }
} else { } else {
for (Property s : stateProperties) { for (Property s : stateProperties) {
State stateMessage = createState(s); State stateMessage = createState(s);
stateMessage.getStateModel(); stateMessage
.getStateModel(); // trigger retrieval of state model because when the XML Writer
// calls the addToElement method, it is to late.
getEntity().addMessage(stateMessage); getEntity().addMessage(stateMessage);
} }
} }
...@@ -65,4 +59,23 @@ public class MakeStateMessage extends EntityStateJob { ...@@ -65,4 +59,23 @@ public class MakeStateMessage extends EntityStateJob {
} }
} }
} }
private ToElementable getSparseStateMessage(Property s) {
return new ToElementable() {
@Override
public void addToElement(Element ret) {
Element state = new Element(STATE_XML_TAG);
state.setAttribute(STATE_ATTRIBUTE_ID, s.getValue().toString());
ret.addContent(state);
}
};
}
private boolean isSparse() {
Map<String, String> flags = getTransaction().getContainer().getFlags();
if (flags != null) {
return "true".equals(flags.getOrDefault(SPARSE_FLAG, "false"));
}
return false;
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment