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
.cdm
.remote
;
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");
88 initDatabaseConnection();
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");
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");
99 if(!cdmSourceProperties
.containsKey(CdmSourceProperties
.CONTEXTPATH
.toString())) {
100 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties
.SERVER
.toString() + "' is missing");
102 // default NomenclaturalCode is always ICNAFP
103 if(!cdmSourceProperties
.containsKey(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString())) {
104 cdmSourceProperties
.put(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString(), NomenclaturalCode
.ICNAFP
.name());
109 * @see eu.etaxonomy.cdm.config.ICdmPersistentSource#getBeanName()
112 public String
getBeanName() {
117 public String
getServer() {
118 return cdmSourceProperties
.getProperty(CdmSourceProperties
.SERVER
.toString());
122 public int getPort() {
123 String port
= CdmUtils
.Nz(cdmSourceProperties
.getProperty(CdmSourceProperties
.PORT
.toString()));
124 if (port
== null || "".equals(port
)){
127 //TODO exception if non integer
128 return Integer
.valueOf(port
);
133 public String
getContextPath() {
134 return cdmSourceProperties
.getProperty(CdmSourceProperties
.CONTEXTPATH
.toString());
138 public NomenclaturalCode
getNomenclaturalCode() {
139 return NomenclaturalCode
.fromString(cdmSourceProperties
.getProperty(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString()));
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
);
152 private static CdmPersistentRemoteSource
save(String strRemoteSourceName
,Properties cdmSourceProperties
) throws CdmRemoteSourceException
{
155 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
160 Element bean
= XmlHelp
.getFirstAttributedChild(root
, "bean", "id", CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
));
162 bean
.detach(); //delete old version if necessary
164 bean
= insertXmlBean(root
, CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
), CdmPersistentRemoteSource
.class.getName());
167 Properties props
= cdmSourceProperties
;
168 Enumeration e
= props
.propertyNames();
170 while (e
.hasMoreElements()) {
171 String key
= (String
) e
.nextElement();
172 insertXmlValueProperty(bean
, key
, props
.getProperty(key
));
176 saveToXml(root
.getDocument(),
177 CdmPersistentSourceUtils
.getResourceDirectory(),
178 CdmPersistentXMLSource
.CDMSOURCE_FILE_NAME
,
179 XmlHelp
.prettyFormat
);
181 return NewInstance(strRemoteSourceName
) ;
186 * @param strDataSourceName
190 * the updated dataSource, null if not succesful
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
);
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.
202 public static boolean exists(String strRemoteSourceName
){
203 Element bean
= CdmPersistentSourceUtils
.getCdmSourceBeanXml(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
);
204 return (bean
!= null);
208 * Returns a list of all datasources stored in the datasource config file
209 * @return all existing data sources
210 * @throws CdmRemoteSourceException
212 @SuppressWarnings("unchecked")
213 static public List
<CdmPersistentRemoteSource
> getAllRemoteSources() throws CdmRemoteSourceException
{
214 List
<CdmPersistentRemoteSource
> remoteSources
= new ArrayList
<CdmPersistentRemoteSource
>();
216 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
220 List
<Element
> lsChildren
= root
.getChildren("bean", root
.getNamespace());
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
));
230 return remoteSources
;
234 public String
toString(){
235 if (getName() != null){