From 64968dd9e69d929464505472d3c79847a1620926 Mon Sep 17 00:00:00 2001 From: Simon Bernard Date: Thu, 26 Mar 2015 14:15:00 +0100 Subject: [PATCH] add API to be able to load model from stream --- .../leshan/core/model/DDFFileParser.java | 19 +++++-- .../leshan/core/model/ObjectLoader.java | 52 ++++++++++++++----- 2 files changed, 54 insertions(+), 17 deletions(-) diff --git a/leshan-core/src/main/java/org/eclipse/leshan/core/model/DDFFileParser.java b/leshan-core/src/main/java/org/eclipse/leshan/core/model/DDFFileParser.java index 4edd022eb0..0fba6886d6 100644 --- a/leshan-core/src/main/java/org/eclipse/leshan/core/model/DDFFileParser.java +++ b/leshan-core/src/main/java/org/eclipse/leshan/core/model/DDFFileParser.java @@ -16,7 +16,9 @@ package org.eclipse.leshan.core.model; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.HashMap; import java.util.Map; @@ -46,18 +48,29 @@ public DDFFileParser() { } public ObjectModel parse(File ddfFile) { - LOG.debug("Parsing DDF file {}", ddfFile.getName()); + try (InputStream input = new FileInputStream(ddfFile)) { + return parse(input, ddfFile.getName()); + } catch (IOException e) { + LOG.error("Could not parse the resource definition file " + ddfFile.getName(), e); + } + return null; + } + + public ObjectModel parse(InputStream inputStream, String streamName) { + streamName = streamName == null ? "" : streamName; + + LOG.debug("Parsing DDF file {}", streamName); ObjectModel result = null; try { DocumentBuilder builder = factory.newDocumentBuilder(); - Document document = builder.parse(ddfFile); + Document document = builder.parse(inputStream); Node object = document.getDocumentElement().getElementsByTagName("Object").item(0); result = this.parseObject(object); } catch (SAXException | IOException | ParserConfigurationException e) { - LOG.error("Could not parse the resource definition file " + ddfFile.getName(), e); + LOG.error("Could not parse the resource definition file " + streamName, e); } return result; diff --git a/leshan-core/src/main/java/org/eclipse/leshan/core/model/ObjectLoader.java b/leshan-core/src/main/java/org/eclipse/leshan/core/model/ObjectLoader.java index 8b729b472e..c5ca0d0b01 100644 --- a/leshan-core/src/main/java/org/eclipse/leshan/core/model/ObjectLoader.java +++ b/leshan-core/src/main/java/org/eclipse/leshan/core/model/ObjectLoader.java @@ -57,10 +57,7 @@ public static List loadDefault() { InputStream input = ObjectLoader.class.getResourceAsStream("/oma-objects-spec.json"); if (input != null) { try (Reader reader = new InputStreamReader(input)) { - ObjectModel[] objectModels = GSON.fromJson(reader, ObjectModel[].class); - for (ObjectModel objectModel : objectModels) { - models.add(objectModel); - } + models.addAll(loadJsonFile(input)); } catch (IOException e) { LOG.error("Unable to load object models", e); } @@ -84,6 +81,32 @@ public static List load(File modelDir) { return loadObjectsFromDir(modelDir); } + /** + * Load object definition from DDF file. + * + * @param input An inputStream to a DFF file. + * @param streamName A name for the stream used for logging only + */ + public static ObjectModel loadDdfFile(InputStream input, String streamName) { + DDFFileParser ddfFileParser = new DDFFileParser(); + return ddfFileParser.parse(input, streamName); + } + + /** + * Load object definitions from JSON file. + * + * @param input An inputStream to a JSON file. + */ + public static List loadJsonFile(InputStream input) { + List models = new ArrayList<>(); + Reader reader = new InputStreamReader(input); + ObjectModel[] objectModels = GSON.fromJson(reader, ObjectModel[].class); + for (ObjectModel objectModel : objectModels) { + models.add(objectModel); + } + return models; + } + /* * Load object definitions from files */ @@ -104,19 +127,21 @@ private static List loadObjectsFromDir(File modelsDir) { if (file.getName().endsWith(".xml")) { // from DDF file LOG.debug("Loading object models from DDF file {}", file.getAbsolutePath()); - DDFFileParser ddfFileParser = new DDFFileParser(); - ObjectModel objectModel = ddfFileParser.parse(file); - if (objectModel != null) { - models.add(objectModel); + try (FileInputStream input = new FileInputStream(file)) { + ObjectModel objectModel = loadDdfFile(input, file.getName()); + if (objectModel != null) { + models.add(objectModel); + } + } catch (IOException e) { + LOG.warn(MessageFormat.format("Unable to load object models for {0}", file.getAbsolutePath()), + e); } + } else if (file.getName().endsWith(".json")) { // from JSON file LOG.debug("Loading object models from JSON file {}", file.getAbsolutePath()); - try (Reader reader = new InputStreamReader(new FileInputStream(file))) { - ObjectModel[] objectModels = GSON.fromJson(reader, ObjectModel[].class); - for (ObjectModel objectModel : objectModels) { - models.add(objectModel); - } + try (FileInputStream input = new FileInputStream(file)) { + models.addAll(loadJsonFile(input)); } catch (IOException e) { LOG.warn(MessageFormat.format("Unable to load object models for {0}", file.getAbsolutePath()), e); @@ -126,5 +151,4 @@ private static List loadObjectsFromDir(File modelsDir) { } return models; } - }