e40e3625ff441fa1521a11d5d7f0806274a39984
[taxeditor.git] / eu.etaxonomy.taxeditor.cdmlib / src / main / java / eu / etaxonomy / taxeditor / remoting / source / CdmPersistentRemoteSource.java
1 /**
2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.taxeditor.remoting.source;
11
12 import static eu.etaxonomy.cdm.common.XmlHelp.getBeansRoot;
13 import static eu.etaxonomy.cdm.common.XmlHelp.insertXmlBean;
14 import static eu.etaxonomy.cdm.common.XmlHelp.insertXmlValueProperty;
15 import static eu.etaxonomy.cdm.common.XmlHelp.saveToXml;
16
17 import java.util.ArrayList;
18 import java.util.Enumeration;
19 import java.util.List;
20 import java.util.Properties;
21
22 import org.apache.log4j.Logger;
23 import org.jdom.Attribute;
24 import org.jdom.Element;
25
26 import eu.etaxonomy.cdm.common.CdmUtils;
27 import eu.etaxonomy.cdm.common.XmlHelp;
28 import eu.etaxonomy.cdm.config.CdmPersistentSourceUtils;
29 import eu.etaxonomy.cdm.config.CdmPersistentXMLSource;
30 import eu.etaxonomy.cdm.config.CdmPersistentXMLSource.CdmSourceProperties;
31 import eu.etaxonomy.cdm.config.ICdmPersistentSource;
32 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
33
34 /**
35 * Class representing a CDM remote source which can be persisted to a source config file
36 *
37 */
38 public class CdmPersistentRemoteSource extends CdmRemoteSourceBase implements ICdmPersistentSource{
39 private static final Logger logger = Logger.getLogger(CdmPersistentRemoteSource.class);
40
41 public static final String REMOTESOURCE_BEAN_POSTFIX = "RemoteSource";
42 private String beanName;
43 private Properties cdmSourceProperties;
44 private List<Attribute> cdmSourceAttributes;
45
46 /**
47 * Creates a new instance of CdmPersistentRemoteSource
48 *
49 * @param name
50 * @param server
51 * @param port
52 * @param contextPath
53 * @param nomenclaturalCode
54 * @return
55 * @throws CdmRemoteSourceException
56 */
57 public static CdmPersistentRemoteSource NewInstance(String remoteSource) throws CdmRemoteSourceException {
58 if(exists(remoteSource)) {
59 return new CdmPersistentRemoteSource(remoteSource);
60 } else {
61 throw new CdmRemoteSourceException("Remote source '" + remoteSource + "' does not exist in sources setting file");
62 }
63
64 }
65
66 /**S
67 * Creates a new CdmPersistentRemoteSource
68 *
69 * @param name
70 * @param server
71 * @param port
72 * @param contextPath
73 * @param nomenclaturalCode
74 * @throws CdmRemoteSourceException
75 */
76 private CdmPersistentRemoteSource(String remoteSource) throws CdmRemoteSourceException {
77
78 CdmPersistentXMLSource cdmPersistentXMLSource = CdmPersistentXMLSource.NewInstance(remoteSource, REMOTESOURCE_BEAN_POSTFIX);
79 if(cdmPersistentXMLSource.getElement() != null) {
80 beanName = cdmPersistentXMLSource.getBeanName();
81 // properties from the persistent xml file
82 cdmSourceProperties = cdmPersistentXMLSource.getCdmSourceProperties();
83 cdmSourceAttributes = cdmPersistentXMLSource.getCdmSourceAttributes();
84 checkProperties(cdmSourceProperties);
85 } else {
86 throw new CdmRemoteSourceException("Remote source '" + remoteSource + "' does not exist in settings file");
87 }
88 }
89
90 private static void checkProperties(Properties cdmSourceProperties) throws CdmRemoteSourceException {
91 if(!cdmSourceProperties.containsKey(CdmSourceProperties.SERVER.toString())) {
92 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");
93 }
94 String port = (String)cdmSourceProperties.get(CdmSourceProperties.PORT.toString());
95 if(port == null || port.isEmpty()) {
96 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");
97 }
98 if(!cdmSourceProperties.containsKey(CdmSourceProperties.CONTEXTPATH.toString())) {
99 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");
100 }
101 // default NomenclaturalCode is always ICNAFP
102 if(!cdmSourceProperties.containsKey(CdmSourceProperties.NOMENCLATURAL_CODE.toString())) {
103 cdmSourceProperties.put(CdmSourceProperties.NOMENCLATURAL_CODE.toString(), NomenclaturalCode.ICNAFP.name());
104 }
105 }
106
107 /* (non-Javadoc)
108 * @see eu.etaxonomy.cdm.config.ICdmPersistentSource#getBeanName()
109 */
110 @Override
111 public String getBeanName() {
112 return beanName;
113 }
114
115 @Override
116 public String getServer() {
117 return cdmSourceProperties.getProperty(CdmSourceProperties.SERVER.toString());
118 }
119
120 @Override
121 public int getPort() {
122 String port = CdmUtils.Nz(cdmSourceProperties.getProperty(CdmSourceProperties.PORT.toString()));
123 if (port == null || "".equals(port)){
124 return -1;
125 }else{
126 //TODO exception if non integer
127 return Integer.valueOf(port);
128 }
129 }
130
131 @Override
132 public String getContextPath() {
133 return cdmSourceProperties.getProperty(CdmSourceProperties.CONTEXTPATH.toString());
134 }
135
136 @Override
137 public NomenclaturalCode getNomenclaturalCode() {
138 return NomenclaturalCode.fromString(cdmSourceProperties.getProperty(CdmSourceProperties.NOMENCLATURAL_CODE.toString()));
139 }
140
141 public static CdmPersistentRemoteSource save(String strRemoteSourceName, ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
142 Properties cdmSourceProperties = new Properties();
143 cdmSourceProperties.put(CdmSourceProperties.SERVER.toString(), remoteSource.getServer());
144 cdmSourceProperties.put(CdmSourceProperties.PORT.toString(), String.valueOf(remoteSource.getPort()));
145 cdmSourceProperties.put(CdmSourceProperties.CONTEXTPATH.toString(), remoteSource.getContextPath());
146 cdmSourceProperties.put(CdmSourceProperties.NOMENCLATURAL_CODE.toString(), remoteSource.getNomenclaturalCode().name());
147 checkProperties(cdmSourceProperties);
148 return save(strRemoteSourceName, cdmSourceProperties);
149 }
150
151 private static CdmPersistentRemoteSource save(String strRemoteSourceName,Properties cdmSourceProperties) throws CdmRemoteSourceException {
152
153 //root
154 Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
155 if (root == null){
156 return null;
157 }
158 //bean
159 Element bean = XmlHelp.getFirstAttributedChild(root, "bean", "id", CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX));
160 if (bean != null){
161 bean.detach(); //delete old version if necessary
162 }
163 bean = insertXmlBean(root, CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX), CdmPersistentRemoteSource.class.getName());
164
165
166 Properties props = cdmSourceProperties;
167 Enumeration e = props.propertyNames();
168
169 while (e.hasMoreElements()) {
170 String key = (String) e.nextElement();
171 insertXmlValueProperty(bean, key, props.getProperty(key));
172 }
173
174 //save
175 saveToXml(root.getDocument(),
176 CdmPersistentSourceUtils.getResourceDirectory(),
177 CdmPersistentXMLSource.CDMSOURCE_FILE_NAME,
178 XmlHelp.prettyFormat );
179
180 return NewInstance(strRemoteSourceName) ;
181
182 }
183
184 /**
185 * @param strDataSourceName
186 * @param dataSource
187 * @param code
188 * @return
189 * the updated dataSource, null if not succesful
190 */
191 public static CdmPersistentRemoteSource update(String strRemoteSourceName,
192 ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
193 CdmPersistentSourceUtils.delete(CdmPersistentSourceUtils.getBeanName(strRemoteSourceName,REMOTESOURCE_BEAN_POSTFIX));
194 return save(strRemoteSourceName, remoteSource);
195 }
196
197 /**
198 * Tests existing of the datsource in the according config file.
199 * @return true if a datasource with the given name exists in the according datasource config file.
200 */
201 public static boolean exists(String strRemoteSourceName){
202 Element bean = CdmPersistentSourceUtils.getCdmSourceBeanXml(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX);
203 return (bean != null);
204 }
205
206 /**
207 * Returns a list of all datasources stored in the datasource config file
208 * @return all existing data sources
209 * @throws CdmRemoteSourceException
210 */
211 @SuppressWarnings("unchecked")
212 static public List<CdmPersistentRemoteSource> getAllRemoteSources() throws CdmRemoteSourceException{
213 List<CdmPersistentRemoteSource> remoteSources = new ArrayList<CdmPersistentRemoteSource>();
214
215 Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
216 if (root == null){
217 return null;
218 }else{
219 List<Element> lsChildren = root.getChildren("bean", root.getNamespace());
220
221 for (Element elBean : lsChildren){
222 String strId = elBean.getAttributeValue("id");
223 if (strId != null && strId.endsWith(REMOTESOURCE_BEAN_POSTFIX)){
224 strId = strId.replace(REMOTESOURCE_BEAN_POSTFIX, "");
225 remoteSources.add(new CdmPersistentRemoteSource(strId));
226 }
227 }
228 }
229 return remoteSources;
230 }
231
232 @Override
233 public String toString(){
234 if (getName() != null){
235 return getName();
236 }else{
237 return null;
238 }
239 }
240
241 }