-
Notifications
You must be signed in to change notification settings - Fork 325
/
JsonSignalHeadHttpService.java
128 lines (118 loc) · 5.46 KB
/
JsonSignalHeadHttpService.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
119
120
121
122
123
124
125
126
127
128
package jmri.server.json.signalhead;
import static jmri.server.json.JSON.APPEARANCE;
import static jmri.server.json.JSON.APPEARANCE_NAME;
import static jmri.server.json.JSON.DATA;
import static jmri.server.json.JSON.LIT;
import static jmri.server.json.JSON.STATE;
import static jmri.server.json.JSON.TOKEN_HELD;
import static jmri.server.json.signalhead.JsonSignalHead.SIGNAL_HEAD;
import static jmri.server.json.signalhead.JsonSignalHead.SIGNAL_HEADS;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import javax.servlet.http.HttpServletResponse;
import jmri.InstanceManager;
import jmri.SignalHead;
import jmri.SignalHeadManager;
import jmri.server.json.JSON;
import jmri.server.json.JsonException;
import jmri.server.json.JsonNonProvidedNamedBeanHttpService;
import jmri.server.json.JsonRequest;
/**
* JSON HTTP service for {@link jmri.SignalHead}s.
*
* @author Randall Wood Copyright 2016, 2018
*/
public class JsonSignalHeadHttpService extends JsonNonProvidedNamedBeanHttpService<SignalHead> {
public JsonSignalHeadHttpService(ObjectMapper mapper) {
super(mapper);
}
@Override
public JsonNode doGet(String type, String name, JsonNode data, JsonRequest request) throws JsonException {
return doGet(InstanceManager.getDefault(jmri.SignalHeadManager.class).getSignalHead(name), name, type, request);
}
@Override
protected ObjectNode doGet(SignalHead signalHead, String name, String type, JsonRequest request) throws JsonException {
ObjectNode root = this.getNamedBean(signalHead, name, type, request); // throws JsonException if signalHead == null
ObjectNode data = root.with(DATA);
if (signalHead != null) {
data.put(LIT, signalHead.getLit());
data.put(APPEARANCE, signalHead.getAppearance());
data.put(TOKEN_HELD, signalHead.getHeld());
//state is appearance, plus a flag for held status
if (signalHead.getHeld()) {
data.put(STATE, SignalHead.HELD);
} else {
data.put(STATE, signalHead.getAppearance());
}
data.put(APPEARANCE_NAME, signalHead.getAppearanceName());
}
return root;
}
@Override
public JsonNode doPost(String type, String name, JsonNode data, JsonRequest request) throws JsonException {
SignalHead signalHead = this.postNamedBean(InstanceManager.getDefault(jmri.SignalHeadManager.class).getSignalHead(name), data, name, type, request);
if (data.path(STATE).isIntegralNumber()) {
int state = data.path(STATE).asInt();
if (state == SignalHead.HELD) {
signalHead.setHeld(true);
} else {
boolean isValid = false;
for (int validState : signalHead.getValidStates()) {
if (state == validState) {
isValid = true;
// TODO: completely insulate JSON state from SignalHead state
if (signalHead.getHeld()) {
signalHead.setHeld(false);
}
signalHead.setAppearance(state);
break;
}
}
if (!isValid) {
throw new JsonException(400, Bundle.getMessage(request.locale, "ErrorUnknownState", SIGNAL_HEAD, state), request.id);
}
}
}
return this.doGet(type, name, data, request);
}
@Override
public JsonNode doGetList(String type, JsonNode data, JsonRequest request) throws JsonException {
ArrayNode array = this.mapper.createArrayNode();
for (SignalHead head : InstanceManager.getDefault(SignalHeadManager.class).getNamedBeanSet()) {
String name = head.getSystemName();
array.add(this.doGet(SIGNAL_HEAD, name, data, request));
}
return message(array, request.id);
}
@Override
public JsonNode doSchema(String type, boolean server, JsonRequest request) throws JsonException {
switch (type) {
case SIGNAL_HEAD:
case SIGNAL_HEADS:
return doSchema(type,
server,
"jmri/server/json/signalhead/signalHead-server.json",
"jmri/server/json/signalhead/signalHead-client.json",
request.id);
default:
throw new JsonException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, Bundle.getMessage(request.locale, JsonException.ERROR_UNKNOWN_TYPE, type), request.id);
}
}
@Override
public SignalHead getNamedBean(String type, String name, JsonNode data, JsonRequest request) throws JsonException {
try {
if (!data.isEmpty() && !data.isNull()) {
if (JSON.PUT.equals(request.method)) {
doPut(type, name, data, request);
} else if (JSON.POST.equals(request.method)) {
doPost(type, name, data, request);
}
}
return InstanceManager.getDefault(SignalHeadManager.class).getBySystemName(name);
} catch (IllegalArgumentException ex) {
throw new JsonException(HttpServletResponse.SC_BAD_REQUEST, Bundle.getMessage(request.locale, "ErrorInvalidSystemName", name, type), request.id);
}
}
}