Search in sources :

Example 1 with ConsistFile

use of jmri.jmrit.consisttool.ConsistFile in project JMRI by JMRI.

the class JsonUtil method setConsist.

/**
     * 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 locale  the locale to throw exceptions in
     * @param address the consist address
     * @param data    the consist as a JsonObject
     * @throws jmri.server.json.JsonException if no ConsistManager is available
     */
public static void setConsist(Locale locale, DccLocoAddress address, JsonNode data) throws JsonException {
    try {
        if (InstanceManager.getDefault(jmri.ConsistManager.class).getConsistList().contains(address)) {
            Consist consist = InstanceManager.getDefault(jmri.ConsistManager.class).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 in
                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);
                }
                @SuppressWarnings("unchecked") ArrayList<DccLocoAddress> consistEngines = (ArrayList<DccLocoAddress>) consist.getConsistList().clone();
                for (DccLocoAddress engineAddress : consistEngines) {
                    if (!engines.contains(engineAddress)) {
                        consist.remove(engineAddress);
                    }
                }
            }
            try {
                (new ConsistFile()).writeFile(InstanceManager.getDefault(jmri.ConsistManager.class).getConsistList());
            } catch (IOException ex) {
                throw new JsonException(500, ex.getLocalizedMessage());
            }
        }
    } catch (NullPointerException ex) {
        // NOI18N
        throw new JsonException(503, Bundle.getMessage(locale, "ErrorNoConsistManager"));
    }
}
Also used : JsonException(jmri.server.json.JsonException) 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)

Example 2 with ConsistFile

use of jmri.jmrit.consisttool.ConsistFile 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)2 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 Consist (jmri.Consist)2 DccLocoAddress (jmri.DccLocoAddress)2 ConsistFile (jmri.jmrit.consisttool.ConsistFile)2 JsonException (jmri.server.json.JsonException)2 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)1 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 Locale (java.util.Locale)1 InstanceManager (jmri.InstanceManager)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