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
* @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
* @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);
}
}