Merge branch 'hotfix/4.8.1' into develop
[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
33 /**
34 * Class representing a CDM remote source which can be persisted to a source config file
35 *
36 */
37 public class CdmPersistentRemoteSource extends CdmRemoteSourceBase implements ICdmPersistentSource{
38 @SuppressWarnings("unused")
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 }
102
103 @Override
104 public String getBeanName() {
105 return beanName;
106 }
107
108 @Override
109 public String getServer() {
110 return cdmSourceProperties.getProperty(CdmSourceProperties.SERVER.toString());
111 }
112
113 @Override
114 public int getPort() {
115 String port = CdmUtils.Nz(cdmSourceProperties.getProperty(CdmSourceProperties.PORT.toString()));
116 if (port == null || "".equals(port)){
117 return -1;
118 }else{
119 //TODO exception if non integer
120 return Integer.valueOf(port);
121 }
122 }
123
124 @Override
125 public String getContextPath() {
126 return cdmSourceProperties.getProperty(CdmSourceProperties.CONTEXTPATH.toString());
127 }
128
129 public static CdmPersistentRemoteSource save(String strRemoteSourceName, ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
130 Properties cdmSourceProperties = new Properties();
131 cdmSourceProperties.put(CdmSourceProperties.SERVER.toString(), remoteSource.getServer());
132 cdmSourceProperties.put(CdmSourceProperties.PORT.toString(), String.valueOf(remoteSource.getPort()));
133 cdmSourceProperties.put(CdmSourceProperties.CONTEXTPATH.toString(), remoteSource.getContextPath());
134 checkProperties(cdmSourceProperties);
135 return save(strRemoteSourceName, cdmSourceProperties);
136 }
137
138 private static CdmPersistentRemoteSource save(String strRemoteSourceName,Properties cdmSourceProperties) throws CdmRemoteSourceException {
139
140 //root
141 Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
142 if (root == null){
143 return null;
144 }
145 //bean
146 Element bean = XmlHelp.getFirstAttributedChild(root, "bean", "id", CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX));
147 if (bean != null){
148 bean.detach(); //delete old version if necessary
149 }
150 bean = insertXmlBean(root, CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX), CdmPersistentRemoteSource.class.getName());
151
152
153 Properties props = cdmSourceProperties;
154 Enumeration e = props.propertyNames();
155
156 while (e.hasMoreElements()) {
157 String key = (String) e.nextElement();
158 insertXmlValueProperty(bean, key, props.getProperty(key));
159 }
160
161 //save
162 saveToXml(root.getDocument(),
163 CdmPersistentSourceUtils.getResourceDirectory(),
164 CdmPersistentXMLSource.CDMSOURCE_FILE_NAME,
165 XmlHelp.prettyFormat );
166
167 return NewInstance(strRemoteSourceName) ;
168
169 }
170
171 /**
172 * @param strDataSourceName
173 * @param dataSource
174 * @param code
175 * @return
176 * the updated dataSource, null if not succesful
177 */
178 public static CdmPersistentRemoteSource update(String strRemoteSourceName,
179 ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
180 CdmPersistentSourceUtils.delete(CdmPersistentSourceUtils.getBeanName(strRemoteSourceName,REMOTESOURCE_BEAN_POSTFIX));
181 return save(strRemoteSourceName, remoteSource);
182 }
183
184 /**
185 * Tests existing of the datsource in the according config file.
186 * @return true if a datasource with the given name exists in the according datasource config file.
187 */
188 public static boolean exists(String strRemoteSourceName){
189 Element bean = CdmPersistentSourceUtils.getCdmSourceBeanXml(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX);
190 return (bean != null);
191 }
192
193 /**
194 * Returns a list of all datasources stored in the datasource config file
195 * @return all existing data sources
196 * @throws CdmRemoteSourceException
197 */
198 @SuppressWarnings("unchecked")
199 static public List<CdmPersistentRemoteSource> getAllRemoteSources() throws CdmRemoteSourceException{
200 List<CdmPersistentRemoteSource> remoteSources = new ArrayList<CdmPersistentRemoteSource>();
201
202 Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
203 if (root == null){
204 return null;
205 }else{
206 List<Element> lsChildren = root.getChildren("bean", root.getNamespace());
207
208 for (Element elBean : lsChildren){
209 String strId = elBean.getAttributeValue("id");
210 if (strId != null && strId.endsWith(REMOTESOURCE_BEAN_POSTFIX)){
211 strId = strId.replace(REMOTESOURCE_BEAN_POSTFIX, "");
212 remoteSources.add(new CdmPersistentRemoteSource(strId));
213 }
214 }
215 }
216 return remoteSources;
217 }
218
219 @Override
220 public String toString(){
221 if (getName() != null){
222 return getName();
223 }else{
224 return super.toString();
225 }
226 }
227
228 }