View Javadoc
1   /*
2    * #%L
3    * EUGene :: EUGene
4    * %%
5    * Copyright (C) 2004 - 2012 CodeLutin, Chatellier Eric
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 3 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
20   * #L%
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   * To read state model files into a memory state model.
44   *
45   * Created: 26 oct. 2009
46   *
47   * @author Florian Desbois - desbois@codelutin.com
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          // process each file
72          for (File file : files) {
73  
74              // fin a deplacer
75              try {
76                  digester.push(stateModel);
77                  digester.parse(file);
78  
79                  // try to load property file
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       * Try to load property file, associated to current statemodel file
90       *
91       * @param stateModelFile state model file
92       * @param stateModel     state model
93       */
94      protected void loadPropertyFile(File stateModelFile, StateModelImpl stateModel) {
95          // recherche et charge le fichier propriete associe au modele
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             // on ajoute les proprietes du fichier associe au model
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 }