-
Notifications
You must be signed in to change notification settings - Fork 86
/
ContainerQuery.java
118 lines (105 loc) · 4.56 KB
/
ContainerQuery.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/* $This file is distributed under the terms of the license in LICENSE$ */
package edu.cornell.mannlib.vitro.webapp.dynapi.components.operations;
import edu.cornell.mannlib.vitro.webapp.dynapi.components.OperationResult;
import edu.cornell.mannlib.vitro.webapp.dynapi.components.Parameter;
import edu.cornell.mannlib.vitro.webapp.dynapi.components.Parameters;
import edu.cornell.mannlib.vitro.webapp.dynapi.data.Data;
import edu.cornell.mannlib.vitro.webapp.dynapi.data.DataStore;
import edu.cornell.mannlib.vitro.webapp.dynapi.data.JsonContainerView;
import edu.cornell.mannlib.vitro.webapp.dynapi.data.SimpleDataView;
import edu.cornell.mannlib.vitro.webapp.dynapi.data.conversion.InitializationException;
import edu.cornell.mannlib.vitro.webapp.dynapi.data.implementation.JsonContainer;
import edu.cornell.mannlib.vitro.webapp.utils.configuration.Property;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class ContainerQuery extends AbstractOperation {
private static final Log log = LogFactory.getLog(ContainerQuery.class);
private Parameters keys = new Parameters();
private Parameter containerParam;
private Parameter outputParam;
@Property(uri = "https://vivoweb.org/ontology/vitro-dynamic-api#providesParameter", minOccurs = 1, maxOccurs = 1)
public void addOutputParameter(Parameter param) {
outputParams.add(param);
outputParam = param;
}
@Property(uri = "https://vivoweb.org/ontology/vitro-dynamic-api#requiresParameter", minOccurs = 1, maxOccurs = 1)
public void addInputParameter(Parameter param) {
inputParams.add(param);
keys.add(param);
}
@Property(uri = "https://vivoweb.org/ontology/vitro-dynamic-api#targetContainer", minOccurs = 1, maxOccurs = 1)
public void setContainer(Parameter param) throws InitializationException {
if (!param.isJsonContainer()) {
throw new InitializationException("only JsonContainer parameter is allowed as a target");
}
inputParams.add(param);
containerParam = param;
}
@Override
public OperationResult runOperation(DataStore dataStore) {
JsonContainer container = JsonContainerView.getJsonContainer(dataStore, containerParam);
String key = SimpleDataView.getStringRepresentation(firstKeyData(dataStore));
Data item = container.getItem(key, outputParam);
if (!item.isInitialized()) {
log.error(String.format("Key '%s' not found in container %s", key, JsonContainer.serialize(container)));
return OperationResult.internalServerError();
}
Parameter itemParam = item.getParam();
if (!outputParam.equals(itemParam)) {
log.error("returned result has different parameter");
return OperationResult.internalServerError();
}
dataStore.addData(itemParam.getName(), item);
return OperationResult.ok();
}
private Data firstKeyData(DataStore dataStore) {
return dataStore.getData(firstKeyName());
}
private String firstKeyName() {
return keys.getNames().iterator().next();
}
public boolean isValid() {
if (outputParam == null) {
log.error("output parameter is not set");
return false;
}
if (containerParam == null) {
log.error("container param is not set");
return false;
}
if (!containerParam.isJsonContainer()) {
log.error("container param is not JsonContainer");
return false;
}
if (keys.getNames().isEmpty()) {
log.error("target param key not set");
return false;
}
return true;
}
public boolean isInputValid(DataStore dataStore) {
if (!super.isInputValid(dataStore)) {
return false;
}
Data container = dataStore.getData(containerParam.getName());
if (container == null) {
log.error("container data is not provided in data store");
return false;
}
if (container.getParam() == null) {
log.error("container data param is null");
return false;
}
if (!container.getParam().isJsonContainer()) {
log.error("container data is not json container");
return false;
}
for (String name : inputParams.getNames()) {
if (!dataStore.contains(name)) {
log.error(String.format("Input parameter '%s' is not provided in data store", name));
return false;
}
}
return true;
}
}