001package jmri.server.json.light;
002
003import static jmri.server.json.JSON.DATA;
004import static jmri.server.json.JSON.INCONSISTENT;
005import static jmri.server.json.JSON.OFF;
006import static jmri.server.json.JSON.ON;
007import static jmri.server.json.JSON.STATE;
008import static jmri.server.json.JSON.UNKNOWN;
009import static jmri.server.json.light.JsonLight.LIGHT;
010import static jmri.server.json.light.JsonLight.LIGHTS;
011
012import com.fasterxml.jackson.databind.JsonNode;
013import com.fasterxml.jackson.databind.ObjectMapper;
014import com.fasterxml.jackson.databind.node.ObjectNode;
015import javax.servlet.http.HttpServletResponse;
016
017import jmri.DigitalIO;
018import jmri.InstanceManager;
019import jmri.Light;
020import jmri.LightManager;
021import jmri.NamedBean;
022import jmri.ProvidingManager;
023import jmri.server.json.JsonException;
024import jmri.server.json.JsonNamedBeanHttpService;
025import jmri.server.json.JsonRequest;
026
027/**
028 *
029 * @author Randall Wood
030 */
031public class JsonLightHttpService extends JsonNamedBeanHttpService<Light> {
032
033    public JsonLightHttpService(ObjectMapper mapper) {
034        super(mapper);
035    }
036
037    @Override
038    public ObjectNode doGet(Light light, String name, String type, JsonRequest request) throws JsonException {
039        ObjectNode root = this.getNamedBean(light, name, getType(), request);
040        ObjectNode data = root.with(DATA);
041        if (light != null) {
042            switch (light.getState()) {
043                case DigitalIO.ON:
044                    data.put(STATE, ON);
045                    break;
046                case DigitalIO.OFF:
047                    data.put(STATE, OFF);
048                    break;
049                case NamedBean.INCONSISTENT:
050                    data.put(STATE, INCONSISTENT);
051                    break;
052                case NamedBean.UNKNOWN:
053                default:
054                    data.put(STATE, UNKNOWN);
055                    break;
056            }
057        }
058        return root;
059    }
060
061    @Override
062    public ObjectNode doPost(Light light, String name, String type, JsonNode data, JsonRequest request) throws JsonException {
063        int state = data.path(STATE).asInt(UNKNOWN);
064        switch (state) {
065            case ON:
066                light.setState(DigitalIO.ON);
067                break;
068            case OFF:
069                light.setState(DigitalIO.OFF);
070                break;
071            case UNKNOWN:
072                // leave state alone in this case
073                break;
074            default:
075                throw new JsonException(400, Bundle.getMessage(request.locale, "ErrorUnknownState", LIGHT, state), request.id);
076        }
077        return this.doGet(light, name, type, request);
078    }
079
080    @Override
081    public JsonNode doSchema(String type, boolean server, JsonRequest request) throws JsonException {
082        switch (type) {
083            case LIGHT:
084            case LIGHTS:
085                return doSchema(type,
086                        server,
087                        "jmri/server/json/light/light-server.json",
088                        "jmri/server/json/light/light-client.json",
089                        request.id);
090            default:
091                throw new JsonException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, Bundle.getMessage(request.locale, JsonException.ERROR_UNKNOWN_TYPE, type), request.id);
092        }
093    }
094
095    @Override
096    protected String getType() {
097        return LIGHT;
098    }
099
100    @Override
101    protected ProvidingManager<Light> getManager() {
102        return InstanceManager.getDefault(LightManager.class);
103    }
104}