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
.CdmSourceException
;
31 import eu
.etaxonomy
.cdm
.config
.ICdmPersistentSource
;
32 import eu
.etaxonomy
.cdm
.config
.CdmPersistentXMLSource
.CdmSourceProperties
;
33 import eu
.etaxonomy
.cdm
.database
.CdmDataSource
;
34 import eu
.etaxonomy
.cdm
.database
.CdmPersistentDataSource
;
35 import eu
.etaxonomy
.cdm
.database
.DataSourceNotFoundException
;
36 import eu
.etaxonomy
.cdm
.database
.DatabaseTypeEnum
;
37 import eu
.etaxonomy
.cdm
.database
.ICdmDataSource
;
38 import eu
.etaxonomy
.cdm
.database
.types
.IDatabaseType
;
39 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalCode
;
42 * Class representing a CDM remote source which can be persisted to a source config file
45 public class CdmPersistentRemoteSource
extends CdmRemoteSourceBase
implements ICdmPersistentSource
{
46 private static final Logger logger
= Logger
.getLogger(CdmPersistentRemoteSource
.class);
48 public static final String REMOTESOURCE_BEAN_POSTFIX
= "RemoteSource";
49 private String beanName
;
50 private Properties cdmSourceProperties
;
51 private List
<Attribute
> cdmSourceAttributes
;
54 * Creates a new instance of CdmPersistentRemoteSource
60 * @param nomenclaturalCode
62 * @throws CdmRemoteSourceException
64 public static CdmPersistentRemoteSource
NewInstance(String remoteSource
) throws CdmRemoteSourceException
{
65 if(exists(remoteSource
)) {
66 return new CdmPersistentRemoteSource(remoteSource
);
68 throw new CdmRemoteSourceException("Remote source '" + remoteSource
+ "' does not exist in sources setting file");
74 * Creates a new CdmPersistentRemoteSource
80 * @param nomenclaturalCode
81 * @throws CdmRemoteSourceException
83 private CdmPersistentRemoteSource(String remoteSource
) throws CdmRemoteSourceException
{
85 CdmPersistentXMLSource cdmPersistentXMLSource
= CdmPersistentXMLSource
.NewInstance(remoteSource
, REMOTESOURCE_BEAN_POSTFIX
);
86 if(cdmPersistentXMLSource
.getElement() != null) {
87 beanName
= cdmPersistentXMLSource
.getBeanName();
88 // properties from the persistent xml file
89 cdmSourceProperties
= cdmPersistentXMLSource
.getCdmSourceProperties();
90 cdmSourceAttributes
= cdmPersistentXMLSource
.getCdmSourceAttributes();
91 checkProperties(cdmSourceProperties
);
93 throw new CdmRemoteSourceException("Remote source '" + remoteSource
+ "' does not exist in settings file");
95 initDatabaseConnection();
98 private static void checkProperties(Properties cdmSourceProperties
) throws CdmRemoteSourceException
{
99 if(!cdmSourceProperties
.containsKey(CdmSourceProperties
.SERVER
.toString())) {
100 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties
.SERVER
.toString() + "' is missing");
102 String port
= (String
)cdmSourceProperties
.get(CdmSourceProperties
.PORT
.toString());
103 if(port
== null || port
.isEmpty()) {
104 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties
.SERVER
.toString() + "' is missing");
106 if(!cdmSourceProperties
.containsKey(CdmSourceProperties
.CONTEXTPATH
.toString())) {
107 throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties
.SERVER
.toString() + "' is missing");
109 // default NomenclaturalCode is always ICNAFP
110 if(!cdmSourceProperties
.containsKey(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString())) {
111 cdmSourceProperties
.put(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString(), NomenclaturalCode
.ICNAFP
.name());
116 * @see eu.etaxonomy.cdm.config.ICdmPersistentSource#getBeanName()
119 public String
getBeanName() {
124 public String
getServer() {
125 return cdmSourceProperties
.getProperty(CdmSourceProperties
.SERVER
.toString());
129 public int getPort() {
130 String port
= CdmUtils
.Nz(cdmSourceProperties
.getProperty(CdmSourceProperties
.PORT
.toString()));
131 if (port
== null || "".equals(port
)){
134 //TODO exception if non integer
135 return Integer
.valueOf(port
);
140 public String
getContextPath() {
141 return cdmSourceProperties
.getProperty(CdmSourceProperties
.CONTEXTPATH
.toString());
145 public NomenclaturalCode
getNomenclaturalCode() {
146 return NomenclaturalCode
.fromString(cdmSourceProperties
.getProperty(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString()));
149 public static CdmPersistentRemoteSource
save(String strRemoteSourceName
, ICdmRemoteSource remoteSource
) throws CdmRemoteSourceException
{
150 Properties cdmSourceProperties
= new Properties();
151 cdmSourceProperties
.put(CdmSourceProperties
.SERVER
.toString(), remoteSource
.getServer());
152 cdmSourceProperties
.put(CdmSourceProperties
.PORT
.toString(), String
.valueOf(remoteSource
.getPort()));
153 cdmSourceProperties
.put(CdmSourceProperties
.CONTEXTPATH
.toString(), remoteSource
.getContextPath());
154 cdmSourceProperties
.put(CdmSourceProperties
.NOMENCLATURAL_CODE
.toString(), remoteSource
.getNomenclaturalCode().name());
155 checkProperties(cdmSourceProperties
);
156 return save(strRemoteSourceName
, cdmSourceProperties
);
159 private static CdmPersistentRemoteSource
save(String strRemoteSourceName
,Properties cdmSourceProperties
) throws CdmRemoteSourceException
{
162 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
167 Element bean
= XmlHelp
.getFirstAttributedChild(root
, "bean", "id", CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
));
169 bean
.detach(); //delete old version if necessary
171 bean
= insertXmlBean(root
, CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
), CdmPersistentRemoteSource
.class.getName());
174 Properties props
= cdmSourceProperties
;
175 Enumeration e
= props
.propertyNames();
177 while (e
.hasMoreElements()) {
178 String key
= (String
) e
.nextElement();
179 insertXmlValueProperty(bean
, key
, props
.getProperty(key
));
183 saveToXml(root
.getDocument(),
184 CdmPersistentSourceUtils
.getResourceDirectory(),
185 CdmPersistentXMLSource
.CDMSOURCE_FILE_NAME
,
186 XmlHelp
.prettyFormat
);
188 return NewInstance(strRemoteSourceName
) ;
193 * @param strDataSourceName
197 * the updated dataSource, null if not succesful
199 public static CdmPersistentRemoteSource
update(String strRemoteSourceName
,
200 ICdmRemoteSource remoteSource
) throws CdmRemoteSourceException
{
201 CdmPersistentSourceUtils
.delete(CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
,REMOTESOURCE_BEAN_POSTFIX
));
202 return save(strRemoteSourceName
, remoteSource
);
206 * Tests existing of the datsource in the according config file.
207 * @return true if a datasource with the given name exists in the according datasource config file.
209 public static boolean exists(String strRemoteSourceName
){
210 Element bean
= CdmPersistentSourceUtils
.getCdmSourceBeanXml(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
);
211 return (bean
!= null);
215 * Returns a list of all datasources stored in the datasource config file
216 * @return all existing data sources
217 * @throws CdmRemoteSourceException
219 @SuppressWarnings("unchecked")
220 static public List
<CdmPersistentRemoteSource
> getAllRemoteSources() throws CdmRemoteSourceException
{
221 List
<CdmPersistentRemoteSource
> remoteSources
= new ArrayList
<CdmPersistentRemoteSource
>();
223 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
227 List
<Element
> lsChildren
= root
.getChildren("bean", root
.getNamespace());
229 for (Element elBean
: lsChildren
){
230 String strId
= elBean
.getAttributeValue("id");
231 if (strId
!= null && strId
.endsWith(REMOTESOURCE_BEAN_POSTFIX
)){
232 strId
= strId
.replace(REMOTESOURCE_BEAN_POSTFIX
, "");
233 remoteSources
.add(new CdmPersistentRemoteSource(strId
));
237 return remoteSources
;
241 public String
toString(){
242 if (getName() != null){