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
;
34 * Class representing a CDM remote source which can be persisted to a source config file
36 public class CdmPersistentRemoteSource
37 extends CdmRemoteSource
38 implements ICdmPersistentSource
{
40 @SuppressWarnings("unused")
41 private static final Logger logger
= Logger
.getLogger(CdmPersistentRemoteSource
.class);
43 public static final String REMOTESOURCE_BEAN_POSTFIX
= "RemoteSource";
44 private String beanName
;
45 private Properties cdmSourceProperties
;
46 private List
<Attribute
> cdmSourceAttributes
;
49 * Creates a new instance of CdmPersistentRemoteSource
55 * @param nomenclaturalCode
57 * @throws CdmRemoteSourceException
59 public static CdmPersistentRemoteSource
NewInstance(String remoteSource
) throws CdmRemoteSourceException
{
60 if(exists(remoteSource
)) {
61 return new CdmPersistentRemoteSource(remoteSource
);
63 throw new CdmRemoteSourceException("Remote source '" + remoteSource
+ "' does not exist in sources setting file");
68 * Creates a new CdmPersistentRemoteSource
74 * @param nomenclaturalCode
75 * @throws CdmRemoteSourceException
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
);
87 throw new CdmRemoteSourceException("Remote source '" + remoteSource
+ "' does not exist in settings file");
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");
105 public String
getBeanName() {
110 public String
getServer() {
111 return cdmSourceProperties
.getProperty(CdmSourceProperties
.SERVER
.toString());
115 public int getPort() {
116 String port
= CdmUtils
.Nz(cdmSourceProperties
.getProperty(CdmSourceProperties
.PORT
.toString()));
117 if (port
== null || "".equals(port
)){
120 //TODO exception if non integer
121 return Integer
.valueOf(port
);
126 public String
getContextPath() {
127 return cdmSourceProperties
.getProperty(CdmSourceProperties
.CONTEXTPATH
.toString());
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
);
139 private static CdmPersistentRemoteSource
save(String strRemoteSourceName
,Properties cdmSourceProperties
) throws CdmRemoteSourceException
{
142 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
147 Element bean
= XmlHelp
.getFirstAttributedChild(root
, "bean", "id", CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
));
149 bean
.detach(); //delete old version if necessary
151 bean
= insertXmlBean(root
, CdmPersistentSourceUtils
.getBeanName(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
), CdmPersistentRemoteSource
.class.getName());
153 Properties props
= cdmSourceProperties
;
154 Enumeration
<?
> e
= props
.propertyNames();
156 while (e
.hasMoreElements()) {
157 String key
= (String
) e
.nextElement();
158 insertXmlValueProperty(bean
, key
, props
.getProperty(key
));
162 saveToXml(root
.getDocument(),
163 CdmPersistentSourceUtils
.getResourceDirectory(),
164 CdmPersistentXMLSource
.CDMSOURCE_FILE_NAME
,
165 XmlHelp
.prettyFormat
);
167 return NewInstance(strRemoteSourceName
) ;
171 * @param strDataSourceName
175 * the updated dataSource, null if not succesful
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
);
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.
187 public static boolean exists(String strRemoteSourceName
){
188 Element bean
= CdmPersistentSourceUtils
.getCdmSourceBeanXml(strRemoteSourceName
, REMOTESOURCE_BEAN_POSTFIX
);
189 return (bean
!= null);
193 * Returns a list of all datasources stored in the datasource config file
194 * @return all existing data sources
195 * @throws CdmRemoteSourceException
197 @SuppressWarnings("unchecked")
198 static public List
<CdmPersistentRemoteSource
> getAllRemoteSources() throws CdmRemoteSourceException
{
199 List
<CdmPersistentRemoteSource
> remoteSources
= new ArrayList
<CdmPersistentRemoteSource
>();
201 Element root
= getBeansRoot(CdmPersistentSourceUtils
.getCdmSourceInputStream());
205 List
<Element
> lsChildren
= root
.getChildren("bean", root
.getNamespace());
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
));
215 return remoteSources
;
219 public String
toString(){
220 if (getName() != null){
223 return super.toString();