Project

General

Profile

Download (8.01 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

    
33
/**
34
 * Class representing a CDM remote source which can be persisted to a source config file
35
 */
36
public class CdmPersistentRemoteSource
37
        extends CdmRemoteSource
38
        implements ICdmPersistentSource{
39

    
40
    @SuppressWarnings("unused")
41
	private static final Logger logger = Logger.getLogger(CdmPersistentRemoteSource.class);
42

    
43
	public static final String REMOTESOURCE_BEAN_POSTFIX = "RemoteSource";
44
	private String beanName;
45
	private Properties cdmSourceProperties;
46
	private List<Attribute> cdmSourceAttributes;
47

    
48
	/**
49
	 * Creates a new instance of CdmPersistentRemoteSource
50
	 *
51
	 * @param name
52
	 * @param server
53
	 * @param port
54
	 * @param contextPath
55
	 * @param nomenclaturalCode
56
	 * @return
57
	 * @throws CdmRemoteSourceException
58
	 */
59
	public static CdmPersistentRemoteSource NewInstance(String remoteSource) throws CdmRemoteSourceException {
60
		if(exists(remoteSource)) {
61
			return new CdmPersistentRemoteSource(remoteSource);
62
		} else {
63
			throw new CdmRemoteSourceException("Remote source '" + remoteSource + "' does not exist in sources setting file");
64
		}
65
	}
66

    
67
	/**S
68
	 * Creates a new CdmPersistentRemoteSource
69
	 *
70
	 * @param name
71
	 * @param server
72
	 * @param port
73
	 * @param contextPath
74
	 * @param nomenclaturalCode
75
	 * @throws CdmRemoteSourceException
76
	 */
77
	private CdmPersistentRemoteSource(String remoteSource) throws CdmRemoteSourceException {
78
	    super(DEFAULT_NAME, DEFAULT_SERVER, DEFAULT_PORT, DEFAULT_CONTEXT_PATH);
79
		CdmPersistentXMLSource cdmPersistentXMLSource = CdmPersistentXMLSource.NewInstance(remoteSource, REMOTESOURCE_BEAN_POSTFIX);
80
		if(cdmPersistentXMLSource.getElement() != null) {
81
			beanName = cdmPersistentXMLSource.getBeanName();
82
			// properties from the persistent xml file
83
			cdmSourceProperties = cdmPersistentXMLSource.getCdmSourceProperties();
84
			cdmSourceAttributes = cdmPersistentXMLSource.getCdmSourceAttributes();
85
			checkProperties(cdmSourceProperties);
86
		} else {
87
			throw new CdmRemoteSourceException("Remote source '" + remoteSource + "' does not exist in settings file");
88
		}
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
	}
103

    
104
	@Override
105
	public String getBeanName() {
106
		return beanName;
107
	}
108

    
109
	@Override
110
	public String getServer() {
111
		return cdmSourceProperties.getProperty(CdmSourceProperties.SERVER.toString());
112
	}
113

    
114
	@Override
115
	public int getPort() {
116
		String port = CdmUtils.Nz(cdmSourceProperties.getProperty(CdmSourceProperties.PORT.toString()));
117
		if (port == null || "".equals(port)){
118
			return -1;
119
		}else{
120
			//TODO exception if non integer
121
			return Integer.valueOf(port);
122
		}
123
	}
124

    
125
	@Override
126
	public String getContextPath() {
127
		return cdmSourceProperties.getProperty(CdmSourceProperties.CONTEXTPATH.toString());
128
	}
129

    
130
	public static CdmPersistentRemoteSource save(String strRemoteSourceName, CdmRemoteSource remoteSource) throws CdmRemoteSourceException {
131
		Properties cdmSourceProperties = new Properties();
132
		cdmSourceProperties.put(CdmSourceProperties.SERVER.toString(), remoteSource.getServer());
133
		cdmSourceProperties.put(CdmSourceProperties.PORT.toString(), String.valueOf(remoteSource.getPort()));
134
		cdmSourceProperties.put(CdmSourceProperties.CONTEXTPATH.toString(), remoteSource.getContextPath());
135
		checkProperties(cdmSourceProperties);
136
		return save(strRemoteSourceName, cdmSourceProperties);
137
	}
138

    
139
	private static CdmPersistentRemoteSource save(String strRemoteSourceName,Properties cdmSourceProperties) throws CdmRemoteSourceException {
140

    
141
		//root
142
		Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
143
		if (root == null){
144
			return null;
145
		}
146
		//bean
147
		Element bean = XmlHelp.getFirstAttributedChild(root, "bean", "id", CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX));
148
		if (bean != null){
149
			bean.detach();  //delete old version if necessary
150
		}
151
		bean = insertXmlBean(root, CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX), CdmPersistentRemoteSource.class.getName());
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
	 * @param strDataSourceName
172
	 * @param dataSource
173
	 * @param code
174
	 * @return
175
	 * 			the updated dataSource, null if not succesful
176
	 */
177
	public static CdmPersistentRemoteSource update(String strRemoteSourceName,
178
			CdmRemoteSource remoteSource) throws CdmRemoteSourceException {
179
		CdmPersistentSourceUtils.delete(CdmPersistentSourceUtils.getBeanName(strRemoteSourceName,REMOTESOURCE_BEAN_POSTFIX));
180
		return save(strRemoteSourceName, remoteSource);
181
	}
182

    
183
	/**
184
	 * Tests existing of the datsource in the according config  file.
185
	 * @return true if a datasource with the given name exists in the according datasource config file.
186
	 */
187
	public static boolean exists(String strRemoteSourceName){
188
		Element bean = CdmPersistentSourceUtils.getCdmSourceBeanXml(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX);
189
		return (bean != null);
190
	}
191

    
192
	/**
193
	 * Returns a list of all datasources stored in the datasource config file
194
	 * @return all existing data sources
195
	 * @throws CdmRemoteSourceException
196
	 */
197
	@SuppressWarnings("unchecked")
198
	static public List<CdmPersistentRemoteSource> getAllRemoteSources() throws CdmRemoteSourceException{
199
		List<CdmPersistentRemoteSource> remoteSources = new ArrayList<CdmPersistentRemoteSource>();
200

    
201
		Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
202
		if (root == null){
203
			return null;
204
		}else{
205
	    	List<Element> lsChildren  = root.getChildren("bean", root.getNamespace());
206

    
207
	    	for (Element elBean : lsChildren){
208
	    		String strId = elBean.getAttributeValue("id");
209
	    		if (strId != null && strId.endsWith(REMOTESOURCE_BEAN_POSTFIX)){
210
	    			strId = strId.replace(REMOTESOURCE_BEAN_POSTFIX, "");
211
	    			remoteSources.add(new CdmPersistentRemoteSource(strId));
212
	    		}
213
	    	}
214
		}
215
		return remoteSources;
216
	}
217

    
218
	@Override
219
	public String toString(){
220
		if (getName() != null){
221
			return getName();
222
		}else{
223
			return super.toString();
224
		}
225
	}
226
}
(1-1/8)