1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.nuiton.eugene.models.state;
24
25 import org.apache.commons.digester3.Digester;
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.codehaus.plexus.component.annotations.Component;
29 import org.nuiton.eugene.ModelHelper;
30 import org.nuiton.eugene.ModelReader;
31 import org.nuiton.eugene.models.state.xml.DigesterStateModelRuleSet;
32 import org.nuiton.eugene.models.state.xml.StateModelImpl;
33 import org.nuiton.eugene.writer.ChainedWriterEngine;
34 import org.nuiton.util.FileUtil;
35 import org.nuiton.util.RecursiveProperties;
36 import org.xml.sax.SAXException;
37
38 import java.io.File;
39 import java.io.FileInputStream;
40 import java.io.IOException;
41
42
43
44
45
46
47
48
49 @Component(role = ModelReader.class, hint = "statemodel")
50 public class StateModelReader extends ModelReader<StateModel> {
51
52 private static final Log log = LogFactory.getLog(StateModelReader.class);
53
54 @Override
55 public String getModelType() {
56 return ModelHelper.ModelType.STATE.getAlias();
57 }
58
59 @Override
60 public String getInputType() {
61 return ModelHelper.ModelInputType.XML.getAlias();
62 }
63
64 @Override
65 public StateModel read(File... files) {
66 Digester digester = new Digester();
67 digester.addRuleSet(new DigesterStateModelRuleSet());
68
69 StateModelImpl stateModel = new StateModelImpl();
70
71
72 for (File file : files) {
73
74
75 try {
76 digester.push(stateModel);
77 digester.parse(file);
78
79
80 loadPropertyFile(file, stateModel);
81 } catch (IOException | SAXException e) {
82 log.warn("Can't read model file", e);
83 }
84 }
85 return stateModel;
86 }
87
88
89
90
91
92
93
94 protected void loadPropertyFile(File stateModelFile, StateModelImpl stateModel) {
95
96 File dir = stateModelFile.getParentFile();
97 String ext = FileUtil.extension(stateModelFile);
98 String name = FileUtil.basename(stateModelFile, "." + ext);
99 File propFile = new File(dir, name + ".properties");
100 RecursiveProperties prop = new RecursiveProperties();
101
102 if (!propFile.exists()) {
103 if (log.isInfoEnabled()) {
104 log.info("No property file associated to model : " + propFile);
105 }
106 } else {
107 if (log.isInfoEnabled()) {
108 log.info("Reading model property file " + propFile);
109 }
110 try (FileInputStream inStream = new FileInputStream(propFile)) {
111 prop.load(inStream);
112 } catch (IOException e) {
113 log.warn("Cannot read or close property file " + propFile, e);
114 }
115
116
117 for (Object o : prop.keySet()) {
118 String key = (String) o;
119 String value = prop.getProperty(key);
120
121 if (!key.startsWith("model.tagvalue.")) {
122 log.warn("only tagvalue is allowed on model in properties");
123 } else {
124 String tag = key.substring("model.tagvalue.".length());
125 stateModel.addTagValue(tag, value);
126 }
127 }
128 }
129 }
130 }