merge
[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 initDatabaseConnection();
89 }
90
91 private static void checkProperties(Properties cdmSourceProperties) throws CdmRemoteSourceException {
92 if(!cdmSourceProperties.containsKey(CdmSourceProperties.SERVER.toString())) {
93 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");
94 }
95 String port = (String)cdmSourceProperties.get(CdmSourceProperties.PORT.toString());
96 if(port == null || port.isEmpty()) {
97 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");
98 }
99 if(!cdmSourceProperties.containsKey(CdmSourceProperties.CONTEXTPATH.toString())) {
100 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");
101 }
102 // default NomenclaturalCode is always ICNAFP
103 if(!cdmSourceProperties.containsKey(CdmSourceProperties.NOMENCLATURAL_CODE.toString())) {
104 cdmSourceProperties.put(CdmSourceProperties.NOMENCLATURAL_CODE.toString(), NomenclaturalCode.ICNAFP.name());
105 }
106 }
107
108 /* (non-Javadoc)
109 * @see eu.etaxonomy.cdm.config.ICdmPersistentSource#getBeanName()
110 */
111 @Override
112 public String getBeanName() {
113 return beanName;
114 }
115
116 @Override
117 public String getServer() {
118 return cdmSourceProperties.getProperty(CdmSourceProperties.SERVER.toString());
119 }
120
121 @Override
122 public int getPort() {
123 String port = CdmUtils.Nz(cdmSourceProperties.getProperty(CdmSourceProperties.PORT.toString()));
124 if (port == null || "".equals(port)){
125 return -1;
126 }else{
127 //TODO exception if non integer
128 return Integer.valueOf(port);
129 }
130 }
131
132 @Override
133 public String getContextPath() {
134 return cdmSourceProperties.getProperty(CdmSourceProperties.CONTEXTPATH.toString());
135 }
136
137 @Override
138 public NomenclaturalCode getNomenclaturalCode() {
139 return NomenclaturalCode.fromString(cdmSourceProperties.getProperty(CdmSourceProperties.NOMENCLATURAL_CODE.toString()));
140 }
141
142 public static CdmPersistentRemoteSource save(String strRemoteSourceName, ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
143 Properties cdmSourceProperties = new Properties();
144 cdmSourceProperties.put(CdmSourceProperties.SERVER.toString(), remoteSource.getServer());
145 cdmSourceProperties.put(CdmSourceProperties.PORT.toString(), String.valueOf(remoteSource.getPort()));
146 cdmSourceProperties.put(CdmSourceProperties.CONTEXTPATH.toString(), remoteSource.getContextPath());
147 cdmSourceProperties.put(CdmSourceProperties.NOMENCLATURAL_CODE.toString(), remoteSource.getNomenclaturalCode().name());
148 checkProperties(cdmSourceProperties);
149 return save(strRemoteSourceName, cdmSourceProperties);
150 }
151
152 private static CdmPersistentRemoteSource save(String strRemoteSourceName,Properties cdmSourceProperties) throws CdmRemoteSourceException {
153
154 //root
155 Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
156 if (root == null){
157 return null;
158 }
159 //bean
160 Element bean = XmlHelp.getFirstAttributedChild(root, "bean", "id", CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX));
161 if (bean != null){
162 bean.detach(); //delete old version if necessary
163 }
164 bean = insertXmlBean(root, CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX), CdmPersistentRemoteSource.class.getName());
165
166
167 Properties props = cdmSourceProperties;
168 Enumeration e = props.propertyNames();
169
170 while (e.hasMoreElements()) {
171 String key = (String) e.nextElement();
172 insertXmlValueProperty(bean, key, props.getProperty(key));
173 }
174
175 //save
176 saveToXml(root.getDocument(),
177 CdmPersistentSourceUtils.getResourceDirectory(),
178 CdmPersistentXMLSource.CDMSOURCE_FILE_NAME,
179 XmlHelp.prettyFormat );
180
181 return NewInstance(strRemoteSourceName) ;
182
183 }
184
185 /**
186 * @param strDataSourceName
187 * @param dataSource
188 * @param code
189 * @return
190 * the updated dataSource, null if not succesful
191 */
192 public static CdmPersistentRemoteSource update(String strRemoteSourceName,
193 ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
194 CdmPersistentSourceUtils.delete(CdmPersistentSourceUtils.getBeanName(strRemoteSourceName,REMOTESOURCE_BEAN_POSTFIX));
195 return save(strRemoteSourceName, remoteSource);
196 }
197
198 /**
199 * Tests existing of the datsource in the according config file.
200 * @return true if a datasource with the given name exists in the according datasource config file.
201 */
202 public static boolean exists(String strRemoteSourceName){
203 Element bean = CdmPersistentSourceUtils.getCdmSourceBeanXml(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX);
204 return (bean != null);
205 }
206
207 /**
208 * Returns a list of all datasources stored in the datasource config file
209 * @return all existing data sources
210 * @throws CdmRemoteSourceException
211 */
212 @SuppressWarnings("unchecked")
213 static public List<CdmPersistentRemoteSource> getAllRemoteSources() throws CdmRemoteSourceException{
214 List<CdmPersistentRemoteSource> remoteSources = new ArrayList<CdmPersistentRemoteSource>();
215
216 Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
217 if (root == null){
218 return null;
219 }else{
220 List<Element> lsChildren = root.getChildren("bean", root.getNamespace());
221
222 for (Element elBean : lsChildren){
223 String strId = elBean.getAttributeValue("id");
224 if (strId != null && strId.endsWith(REMOTESOURCE_BEAN_POSTFIX)){
225 strId = strId.replace(REMOTESOURCE_BEAN_POSTFIX, "");
226 remoteSources.add(new CdmPersistentRemoteSource(strId));
227 }
228 }
229 }
230 return remoteSources;
231 }
232
233 @Override
234 public String toString(){
235 if (getName() != null){
236 return getName();
237 }else{
238 return null;
239 }
240 }
241
242 }