Project

General

Profile

Download (8.61 KB) Statistics
| Branch: | Tag: | Revision:
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
}
(1-1/6)