2 * Copyright (C) 2014 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.taxeditor
.remoting
.source
;
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
;
17 import java
.util
.ArrayList
;
18 import java
.util
.Enumeration
;
19 import java
.util
.List
;
20 import java
.util
.Properties
;
22 import org
.apache
.log4j
.Logger
;
23 import org
.jdom
.Attribute
;
24 import org
.jdom
.Element
;
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
;
35 * Class representing a CDM remote source which can be persisted to a source config file
38 public class CdmPersistentRemoteSource
extends CdmRemoteSourceBase
implements ICdmPersistentSource
{
39 private static final Logger logger
= Logger
.getLogger(CdmPersistentRemoteSource
.class);
41 public static final String REMOTESOURCE_BEAN_POSTFIX
= "RemoteSource";
42 private String beanName
;
43 private Properties cdmSourceProperties
;
44 private List
<Attribute
> cdmSourceAttributes
;
47 * Creates a new instance of CdmPersistentRemoteSource
53 * @param nomenclaturalCode
55 * @throws CdmRemoteSourceException
57 public static CdmPersistentRemoteSource
NewInstance(String remoteSource
) throws CdmRemoteSourceException
{
58 if(exists(remoteSource
)) {
59 return new CdmPersistentRemoteSource(remoteSource
);
61 throw new CdmRemoteSourceException("Remote source '" + remoteSource
+ "' does not exist in sources setting file");
67 * Creates a new CdmPersistentRemoteSource
73 * @param nomenclaturalCode
74 * @throws CdmRemoteSourceException
76 private CdmPersistentRemoteSource(String remoteSource
) throws CdmRemoteSourceException
{
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
);
86 throw new CdmRemoteSourceException("Remote source '" + remoteSource
+ "' does not exist in settings file");
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");
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");
98 if(!cdmSourceProperties
.containsKey(CdmSourceProperties
.CONTEXTPATH
.toString())) {
99 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties
.SERVER
.toString() + "' is missing");
101 // default NomenclaturalCode is always ICNAFP
102 if(!cdmSourceProperties
.containsKey(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString())) {
103 cdmSourceProperties
.put(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString(), NomenclaturalCode
.ICNAFP
.name());
108 * @see eu.etaxonomy.cdm.config.ICdmPersistentSource#getBeanName()
111 public String
getBeanName() {
116 public String
getServer() {
117 return cdmSourceProperties
.getProperty(CdmSourceProperties
.SERVER
.toString());
121 public int getPort() {
122 String port
= CdmUtils
.Nz(cdmSourceProperties
.getProperty(CdmSourceProperties
.PORT
.toString()));
123 if (port
== null || "".equals(port
)){
126 //TODO exception if non integer
127 return Integer
.valueOf(port
);
132 public String
getContextPath() {
133 return cdmSourceProperties
.getProperty(CdmSourceProperties
.CONTEXTPATH
.toString());
137 public NomenclaturalCode
getNomenclaturalCode() {
138 return NomenclaturalCode
.fromString(cdmSourceProperties
.getProperty(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString()));
141 public static CdmPersistentRemoteSource
save(String strRemoteSourceName
, ICdmRemoteSource remoteSource
) throws CdmRemoteSourceException
{
142 Properties cdmSourceProperties
= new Properties();
143 cdmSourceProperties
.put(CdmSourceProperties
.SERVER
.toString(), remoteSource
.getServer());
144 cdmSourceProperties
.put(CdmSourceProperties
.PORT
.toString(), String
.valueOf(remoteSource
.getPort()));
145 cdmSourceProperties
.put(CdmSourceProperties
.CONTEXTPATH
.toString(), remoteSource
.getContextPath());
146 cdmSourceProperties
.put(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString(), remoteSource
.getNomenclaturalCode().name());
147 checkProperties(cdmSourceProperties
);
148 return save(strRemoteSourceName
, cdmSourceProperties
);
151 private static CdmPersistentRemoteSource
save(String strRemoteSourceName
,Properties cdmSourceProperties
) throws CdmRemoteSourceException
{
154 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
159 Element bean
= XmlHelp
.getFirstAttributedChild(root
, "bean", "id", CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
));
161 bean
.detach(); //delete old version if necessary
163 bean
= insertXmlBean(root
, CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
), CdmPersistentRemoteSource
.class.getName());
166 Properties props
= cdmSourceProperties
;
167 Enumeration e
= props
.propertyNames();
169 while (e
.hasMoreElements()) {
170 String key
= (String
) e
.nextElement();
171 insertXmlValueProperty(bean
, key
, props
.getProperty(key
));
175 saveToXml(root
.getDocument(),
176 CdmPersistentSourceUtils
.getResourceDirectory(),
177 CdmPersistentXMLSource
.CDMSOURCE_FILE_NAME
,
178 XmlHelp
.prettyFormat
);
180 return NewInstance(strRemoteSourceName
) ;
185 * @param strDataSourceName
189 * the updated dataSource, null if not succesful
191 public static CdmPersistentRemoteSource
update(String strRemoteSourceName
,
192 ICdmRemoteSource remoteSource
) throws CdmRemoteSourceException
{
193 CdmPersistentSourceUtils
.delete(CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
,REMOTESOURCE_BEAN_POSTFIX
));
194 return save(strRemoteSourceName
, remoteSource
);
198 * Tests existing of the datsource in the according config file.
199 * @return true if a datasource with the given name exists in the according datasource config file.
201 public static boolean exists(String strRemoteSourceName
){
202 Element bean
= CdmPersistentSourceUtils
.getCdmSourceBeanXml(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
);
203 return (bean
!= null);
207 * Returns a list of all datasources stored in the datasource config file
208 * @return all existing data sources
209 * @throws CdmRemoteSourceException
211 @SuppressWarnings("unchecked")
212 static public List
<CdmPersistentRemoteSource
> getAllRemoteSources() throws CdmRemoteSourceException
{
213 List
<CdmPersistentRemoteSource
> remoteSources
= new ArrayList
<CdmPersistentRemoteSource
>();
215 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
219 List
<Element
> lsChildren
= root
.getChildren("bean", root
.getNamespace());
221 for (Element elBean
: lsChildren
){
222 String strId
= elBean
.getAttributeValue("id");
223 if (strId
!= null && strId
.endsWith(REMOTESOURCE_BEAN_POSTFIX
)){
224 strId
= strId
.replace(REMOTESOURCE_BEAN_POSTFIX
, "");
225 remoteSources
.add(new CdmPersistentRemoteSource(strId
));
229 return remoteSources
;
233 public String
toString(){
234 if (getName() != null){