Search in sources :

Example 1 with IS_LONG_ADDRESS

use of jmri.server.json.JSON.IS_LONG_ADDRESS in project JMRI by JMRI.

the class JsonConsistHttpService method doPost.

/**
     * Change the properties and locomotives of a consist.
     *
     * This method takes as input the JSON representation of a consist as
     * provided by {@link #getConsist(Locale, jmri.DccLocoAddress) }.
     *
     * If present in the JSON, this method sets the following consist
     * properties:
     * <ul>
     * <li>consistID</li>
     * <li>consistType</li>
     * <li>locomotives (<em>engines</em> in the JSON representation)<br>
     * <strong>NOTE</strong> Since this method adds, repositions, and deletes
     * locomotives, the JSON representation must contain <em>every</em>
     * locomotive that should be in the consist, if it contains the engines
     * node.</li>
     * </ul>
     *
     * @param type   the JSON message type
     * @param locale the locale to throw exceptions in
     * @param name   the consist address, ignored if data contains an
     *               {@value jmri.server.json.JSON#ADDRESS} and
     *               {@value jmri.server.json.JSON#IS_LONG_ADDRESS} nodes
     * @param data   the consist as a JsonObject
     * @return the JSON representation of the Consist
     * @throws jmri.server.json.JsonException if there is no consist manager
     *                                        (code 503), the consist does not
     *                                        exist (code 404), or the consist
     *                                        cannot be saved (code 500).
     */
@Override
public JsonNode doPost(String type, String name, JsonNode data, Locale locale) throws JsonException {
    if (!this.manager.isConsistManager()) {
        // NOI18N
        throw new JsonException(503, Bundle.getMessage(locale, "ErrorNoConsistManager"));
    }
    DccLocoAddress address;
    if (data.path(ADDRESS).canConvertToInt()) {
        address = new DccLocoAddress(data.path(ADDRESS).asInt(), data.path(IS_LONG_ADDRESS).asBoolean(false));
    } else {
        address = JsonUtilHttpService.addressForString(data.path(ADDRESS).asText());
    }
    if (!this.manager.getConsistList().contains(address)) {
        throw new JsonException(404, Bundle.getMessage(locale, "ErrorObject", CONSIST, name));
    }
    Consist consist = this.manager.getConsist(address);
    if (data.path(ID).isTextual()) {
        consist.setConsistID(data.path(ID).asText());
    }
    if (data.path(TYPE).isInt()) {
        consist.setConsistType(data.path(TYPE).asInt());
    }
    if (data.path(ENGINES).isArray()) {
        ArrayList<DccLocoAddress> engines = new ArrayList<>();
        // add every engine
        for (JsonNode engine : data.path(ENGINES)) {
            DccLocoAddress engineAddress = new DccLocoAddress(engine.path(ADDRESS).asInt(), engine.path(IS_LONG_ADDRESS).asBoolean());
            if (!consist.contains(engineAddress)) {
                consist.add(engineAddress, engine.path(FORWARD).asBoolean());
            }
            consist.setPosition(engineAddress, engine.path(POSITION).asInt());
            engines.add(engineAddress);
        }
        // remove engines if needed
        ArrayList<DccLocoAddress> consistEngines = new ArrayList<>(consist.getConsistList());
        consistEngines.stream().filter((engineAddress) -> (!engines.contains(engineAddress))).forEach((engineAddress) -> {
            consist.remove(engineAddress);
        });
    }
    try {
        (new ConsistFile()).writeFile(this.manager.getConsistList());
    } catch (IOException ex) {
        throw new JsonException(500, ex.getLocalizedMessage());
    }
    return this.getConsist(locale, address);
}
Also used : JsonException(jmri.server.json.JsonException) InstanceManager(jmri.InstanceManager) ADDRESS(jmri.server.json.JSON.ADDRESS) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) CONSIST(jmri.server.json.consist.JsonConsist.CONSIST) IOException(java.io.IOException) DccLocoAddress(jmri.DccLocoAddress) JsonHttpService(jmri.server.json.JsonHttpService) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) JsonException(jmri.server.json.JsonException) FORWARD(jmri.server.json.JSON.FORWARD) ArrayList(java.util.ArrayList) ConsistFile(jmri.jmrit.consisttool.ConsistFile) TYPE(jmri.server.json.JSON.TYPE) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) Locale(java.util.Locale) SIZE_LIMIT(jmri.server.json.JSON.SIZE_LIMIT) DATA(jmri.server.json.JSON.DATA) ID(jmri.server.json.JSON.ID) JsonNode(com.fasterxml.jackson.databind.JsonNode) IS_LONG_ADDRESS(jmri.server.json.JSON.IS_LONG_ADDRESS) Consist(jmri.Consist) JsonUtilHttpService(jmri.server.json.util.JsonUtilHttpService) ENGINES(jmri.server.json.JSON.ENGINES) POSITION(jmri.server.json.JSON.POSITION) ConsistFile(jmri.jmrit.consisttool.ConsistFile) Consist(jmri.Consist) ArrayList(java.util.ArrayList) JsonNode(com.fasterxml.jackson.databind.JsonNode) IOException(java.io.IOException) DccLocoAddress(jmri.DccLocoAddress)

Aggregations

JsonNode (com.fasterxml.jackson.databind.JsonNode)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)1 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Locale (java.util.Locale)1 Consist (jmri.Consist)1 DccLocoAddress (jmri.DccLocoAddress)1 InstanceManager (jmri.InstanceManager)1 ConsistFile (jmri.jmrit.consisttool.ConsistFile)1 ADDRESS (jmri.server.json.JSON.ADDRESS)1 DATA (jmri.server.json.JSON.DATA)1 ENGINES (jmri.server.json.JSON.ENGINES)1 FORWARD (jmri.server.json.JSON.FORWARD)1 ID (jmri.server.json.JSON.ID)1 IS_LONG_ADDRESS (jmri.server.json.JSON.IS_LONG_ADDRESS)1 POSITION (jmri.server.json.JSON.POSITION)1 SIZE_LIMIT (jmri.server.json.JSON.SIZE_LIMIT)1 TYPE (jmri.server.json.JSON.TYPE)1