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