CdmPersistentRemoteSource : implemented all source methods including save and delete
authorCherian Mathew <c.mathew@bgbm.org>
Wed, 9 Apr 2014 14:19:16 +0000 (14:19 +0000)
committerCherian Mathew <c.mathew@bgbm.org>
Wed, 9 Apr 2014 14:19:16 +0000 (14:19 +0000)
CdmRemoteSourceException : new exception to deal with cdm source errors
CdmRemoteSourceBase : added default constructor

.gitattributes
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmPersistentRemoteSource.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmRemoteSourceBase.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmRemoteSourceException.java [new file with mode: 0644]

index 6426603d0c6f312ed8802cb789e5791e1230e419..5fa1f3c688f67d26669003cc23534cb432796aef 100644 (file)
@@ -324,6 +324,7 @@ eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/lazyloading/Cdm
 eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmPersistentRemoteSource.java -text
 eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmRemoteSource.java -text
 eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmRemoteSourceBase.java -text
+eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmRemoteSourceException.java -text
 eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/ICdmRemoteSource.java -text
 eu.etaxonomy.taxeditor.cdmlib/src/main/java/org/hibernate/collection/internal/AbstractPersistentCollection.java -text
 eu.etaxonomy.taxeditor.cdmlib/src/main/java/org/hibernate/proxy/AbstractLazyInitializer.java -text
index 342376c34e68d096c5f21b5f3c6fff83bcde2d71..487430b713852af3ea0fa292c69a82a1cbf2bcff 100644 (file)
@@ -9,13 +9,44 @@
 
 package eu.etaxonomy.cdm.remote;
 
+import static eu.etaxonomy.cdm.common.XmlHelp.getBeansRoot;
+import static eu.etaxonomy.cdm.common.XmlHelp.insertXmlBean;
+import static eu.etaxonomy.cdm.common.XmlHelp.insertXmlValueProperty;
+import static eu.etaxonomy.cdm.common.XmlHelp.saveToXml;
+
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+import org.jdom.Attribute;
+import org.jdom.Element;
+
+import eu.etaxonomy.cdm.common.CdmUtils;
+import eu.etaxonomy.cdm.common.XmlHelp;
+import eu.etaxonomy.cdm.config.CdmPersistentSourceUtils;
+import eu.etaxonomy.cdm.config.CdmPersistentXMLSource;
+import eu.etaxonomy.cdm.config.ICdmPersistentSource;
+import eu.etaxonomy.cdm.config.CdmPersistentXMLSource.CdmSourceProperties;
+import eu.etaxonomy.cdm.database.CdmDataSource;
+import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
+import eu.etaxonomy.cdm.database.DataSourceNotFoundException;
+import eu.etaxonomy.cdm.database.DatabaseTypeEnum;
+import eu.etaxonomy.cdm.database.ICdmDataSource;
+import eu.etaxonomy.cdm.database.types.IDatabaseType;
 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
 
 /**
  * Class representing a CDM remote source which can be persisted to a source config file
  *
  */
-public class CdmPersistentRemoteSource extends CdmRemoteSourceBase {
+public class CdmPersistentRemoteSource extends CdmRemoteSourceBase implements ICdmPersistentSource{
+       private static final Logger logger = Logger.getLogger(CdmPersistentRemoteSource.class);
+       
+       public static final String REMOTESOURCE_BEAN_POSTFIX = "RemoteSource";
+       private String beanName;
+       private Properties cdmSourceProperties;
+       private List<Attribute> cdmSourceAttributes;
        
        /**
         * Creates a new instance of CdmPersistentRemoteSource
@@ -26,12 +57,18 @@ public class CdmPersistentRemoteSource extends CdmRemoteSourceBase {
         * @param contextPath
         * @param nomenclaturalCode
         * @return
+        * @throws CdmRemoteSourceException 
         */
-       public CdmPersistentRemoteSource NewInstance(String name, String server, int port, String contextPath, NomenclaturalCode nomenclaturalCode) {
-               return new CdmPersistentRemoteSource(name, server, port, contextPath, nomenclaturalCode);
+       public static CdmPersistentRemoteSource NewInstance(String remoteSource) throws CdmRemoteSourceException {
+               if(exists(remoteSource)) {
+                       return new CdmPersistentRemoteSource(remoteSource);
+               } else {
+                       throw new CdmRemoteSourceException("Remote source '" + remoteSource + "' does not exist in sources setting file");
+               }
+               
        }
        
-       /**
+       /**S
         * Creates a new CdmPersistentRemoteSource
         * 
         * @param name
@@ -39,10 +76,136 @@ public class CdmPersistentRemoteSource extends CdmRemoteSourceBase {
         * @param port
         * @param contextPath
         * @param nomenclaturalCode
+        * @throws CdmRemoteSourceException 
         */
-       private CdmPersistentRemoteSource(String name, String server, int port, String contextPath, NomenclaturalCode nomenclaturalCode) { 
-               super(name, server, port, contextPath, nomenclaturalCode);
-               
+       private CdmPersistentRemoteSource(String remoteSource) throws CdmRemoteSourceException { 
+               setName(remoteSource);          
+               CdmPersistentXMLSource cdmPersistentXMLSource = CdmPersistentXMLSource.NewInstance(remoteSource, REMOTESOURCE_BEAN_POSTFIX);
+               if(cdmPersistentXMLSource.getElement() != null) {
+                       beanName = cdmPersistentXMLSource.getBeanName();
+                       // properties from the persistent xml file 
+                       cdmSourceProperties = cdmPersistentXMLSource.getCdmSourceProperties();
+                       cdmSourceAttributes = cdmPersistentXMLSource.getCdmSourceAttributes();
+                       checkProperties(cdmSourceProperties);
+               } else {
+                       throw new CdmRemoteSourceException("Remote source '" + remoteSource + "' does not exist in settings file");
+               }               
+       }
+       
+       private static void checkProperties(Properties cdmSourceProperties) throws CdmRemoteSourceException {
+               if(!cdmSourceProperties.containsKey(CdmSourceProperties.SERVER.toString())) {
+                       throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");                 
+               }
+               String port = (String)cdmSourceProperties.get(CdmSourceProperties.PORT.toString());
+               if(port == null || port.isEmpty()) {
+                       throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");                 
+               }       
+               if(!cdmSourceProperties.containsKey(CdmSourceProperties.CONTEXTPATH.toString())) {
+                       throw new CdmRemoteSourceException("Could not initialise remote source. Required property '" + CdmSourceProperties.SERVER.toString() + "' is missing");                 
+               }       
+               // default NomenclaturalCode is always ICNAFP
+               if(!cdmSourceProperties.containsKey(CdmSourceProperties.NOMENCLATURAL_CODE.toString())) {                               
+                       cdmSourceProperties.put(CdmSourceProperties.NOMENCLATURAL_CODE.toString(), NomenclaturalCode.ICNAFP.name());
+               }                       
+       }
+
+       /* (non-Javadoc)
+        * @see eu.etaxonomy.cdm.config.ICdmPersistentSource#getBeanName()
+        */
+       @Override
+       public String getBeanName() {
+               return beanName;
+       }
+       
+       @Override
+       public String getServer() {
+               return cdmSourceProperties.getProperty(CdmSourceProperties.SERVER.toString());
+       }
+       
+       @Override
+       public int getPort() {
+               String port = CdmUtils.Nz(cdmSourceProperties.getProperty(CdmSourceProperties.PORT.toString()));
+               if (port == null || "".equals(port)){
+                       return -1;
+               }else{
+                       //TODO exception if non integer
+                       return Integer.valueOf(port);
+               }
+       }
+       
+       @Override
+       public String getContextPath() {
+               return cdmSourceProperties.getProperty(CdmSourceProperties.CONTEXTPATH.toString());
+       }
+       
+       @Override
+       public NomenclaturalCode getNomenclaturalCode() {
+               return NomenclaturalCode.fromString(cdmSourceProperties.getProperty(CdmSourceProperties.NOMENCLATURAL_CODE.toString()));
+       }
+       
+       public static CdmPersistentRemoteSource save(String strRemoteSourceName, ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
+               Properties cdmSourceProperties = new Properties();
+               cdmSourceProperties.put(CdmSourceProperties.SERVER.toString(), remoteSource.getServer());
+               cdmSourceProperties.put(CdmSourceProperties.PORT.toString(), String.valueOf(remoteSource.getPort()));
+               cdmSourceProperties.put(CdmSourceProperties.CONTEXTPATH.toString(), remoteSource.getContextPath());
+               cdmSourceProperties.put(CdmSourceProperties.NOMENCLATURAL_CODE.toString(), remoteSource.getNomenclaturalCode().name());
+               checkProperties(cdmSourceProperties);
+               return save(strRemoteSourceName, cdmSourceProperties);
+       }
+       
+       private static CdmPersistentRemoteSource save(String strRemoteSourceName,Properties cdmSourceProperties) throws CdmRemoteSourceException {
+
+               //root
+               Element root = getBeansRoot(CdmPersistentSourceUtils.getCdmSourceInputStream());
+               if (root == null){
+                       return null;
+               }
+               //bean
+               Element bean = XmlHelp.getFirstAttributedChild(root, "bean", "id", CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX));
+               if (bean != null){
+                       bean.detach();  //delete old version if necessary
+               }
+               bean = insertXmlBean(root, CdmPersistentSourceUtils.getBeanName(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX), CdmPersistentRemoteSource.class.getName());
+
+
+               Properties props = cdmSourceProperties;
+               Enumeration e = props.propertyNames();
+
+               while (e.hasMoreElements()) {
+                       String key = (String) e.nextElement();
+                       insertXmlValueProperty(bean, key, props.getProperty(key));
+               }
+
+               //save
+               saveToXml(root.getDocument(), 
+                               CdmPersistentSourceUtils.getResourceDirectory(), 
+                               CdmPersistentXMLSource.CDMSOURCE_FILE_NAME, 
+                               XmlHelp.prettyFormat );
+
+               return NewInstance(strRemoteSourceName) ;
+
+       }
+       
+       /**
+        * @param strDataSourceName
+        * @param dataSource
+        * @param code 
+        * @return
+        *                      the updated dataSource, null if not succesful
+        */
+       public static CdmPersistentRemoteSource update(String strRemoteSourceName,
+                       ICdmRemoteSource remoteSource) throws CdmRemoteSourceException {
+               CdmPersistentSourceUtils.delete(CdmPersistentSourceUtils.getBeanName(strRemoteSourceName,REMOTESOURCE_BEAN_POSTFIX));
+               return save(strRemoteSourceName, remoteSource);
+       }
+       
+       /**
+        * Tests existing of the datsource in the according config  file.
+        * @return true if a datasource with the given name exists in the according datasource config file.
+        */
+       public static boolean exists(String strRemoteSourceName){
+               Element bean = CdmPersistentSourceUtils.getCdmSourceBeanXml(strRemoteSourceName, REMOTESOURCE_BEAN_POSTFIX);
+               return (bean != null);
        }
 
 }
index e2b4c4490551a890436e04060fdd87bbe8ec8c4b..031377cb064e0360c1b49db7cdeaa64635692280 100644 (file)
@@ -28,6 +28,18 @@ public class CdmRemoteSourceBase extends CdmSource implements ICdmRemoteSource {
        
        private IDatabaseService databaseService;
        
+       /**
+        * Constructs a CdmRemoteSourceBase object with default values.
+        * 
+        */
+       protected CdmRemoteSourceBase() {
+               setName("default");
+               setServer("127.0.0.1");
+               setPort(8080);
+               setContextPath("");
+               setNomenclaturalCode(NomenclaturalCode.ICNAFP);
+       }
+       
        /**
         * Constructs a CdmRemoteSourceBase
         * 
diff --git a/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmRemoteSourceException.java b/eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/remote/CdmRemoteSourceException.java
new file mode 100644 (file)
index 0000000..3c2d715
--- /dev/null
@@ -0,0 +1,19 @@
+/**
+ * 
+ */
+package eu.etaxonomy.cdm.remote;
+
+/**
+ * 
+ *
+ */
+public class CdmRemoteSourceException extends Exception {
+       
+       public CdmRemoteSourceException(String message) {
+               super(message);
+       }
+
+       public CdmRemoteSourceException(Exception e) {
+               super(e);
+       }
+}