Merge branch 'develop' into unify_derivative_views
authorPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 20 Oct 2015 09:31:49 +0000 (11:31 +0200)
committerPatrick Plitzner <p.plitzner@bgbm.org>
Tue, 20 Oct 2015 09:31:49 +0000 (11:31 +0200)
66 files changed:
.gitattributes
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ConvertPerson2TeamHandler.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/handler/ConvertTeam2PersonHandler.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/AgentEditorInput.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/GroupEditorInput.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/NameEditorInput.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/OccurrenceEditorInput.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/ReferenceEditorInput.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/TaxonEditorInput.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/UserEditorInput.java
eu.etaxonomy.taxeditor.bulkeditor/src/main/java/eu/etaxonomy/taxeditor/bulkeditor/input/entitycreator/UserCreator.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/cdm/api/application/CdmApplicationState.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CacheLoader.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/cache/CdmTransientEntityCacher.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/remoting/source/CdmServerInfo.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/service/CdmServiceRequestExecutor.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySession.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionManager.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/DefaultNewEntityListener.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySession.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/ICdmEntitySessionManager.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/NullSession.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySession.java
eu.etaxonomy.taxeditor.cdmlib/src/main/java/eu/etaxonomy/taxeditor/session/mock/MockCdmEntitySessionManager.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/group/authority/CdmAuthorityEditorInput.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/key/polytomous/PolytomousKeyEditorInput.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/TaxonNameEditor.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/name/operation/DeleteSynonymOperation.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientAgentService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientClassificationService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientCollectionService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientDescriptionService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientNameService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientOccurenceService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientReferenceService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTaxonService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/dataimport/transientServices/TransientTermService.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/derivate/DerivateViewEditorInput.java
eu.etaxonomy.taxeditor.editor/src/main/java/eu/etaxonomy/taxeditor/editor/view/descriptive/handler/MoveDescriptionElementsHandler.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/Root.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapter.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/TreeNodeDropAdapterAssistant.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/ChangeAcceptedTaxonToSynonymOperation.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/DeleteOperation.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/MoveTaxonOperation.java
eu.etaxonomy.taxeditor.navigation/src/main/java/eu/etaxonomy/taxeditor/navigation/navigator/operation/RemotingMoveTaxonOperation.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/SelectFeatureTreeWizardPage.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/model/DeleteResultMessagingUtils.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/newWizard/NewDerivedUnitBaseWizard.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/preference/LanguageRepresentationPreferencePage.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/store/LoginManager.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/RemotingLoginDialog.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/AbstractFilteredCdmResourceSelectionDialog.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/NamedAreaSelectionDialog.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/dialog/selection/TaxonNodeSelectionDialog.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/element/MultilanguageTextElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/password/PasswordWizard.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/classification/TaxonNodeDetailElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/feature/FeatureDistributionDetailElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/key/PolytomousKeyNodeDetailElement.java
eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/ui/section/name/NonViralNameDetailElement.java
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/cdm/api/cache/CdmClientCachingTest.java
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/operation/TaxonNameEditorTest.java
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmApplicationStateTest.java [new file with mode: 0644]
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmEntitySessionAwareTest.java
eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/ui/dialogs/CdmServerInfoTest.java

index 567745fa5e74ebc9de6f4513e4930b6fb1d4e56a..c7b12732ea828b23334c43a93041d51136f034dc 100644 (file)
@@ -1969,3 +1969,19 @@ src/site/fml/troubleshooting.fml -text
 src/site/resources/css/site.css -text
 src/site/resources/images/taxeditor_transformed.png -text
 src/site/site.xml -text
+
+# The following files will be ignored when merging another
+# branch into this branch in case of merge conflict and 
+# if the 'ours' merge driver is configured.
+# WARNING : This merge driver should NOT be set in development
+#           environments. It is supposed to be used only in CI
+#           environments.
+# The driver can be configured by executing,
+# git config --local merge.ours.driver true
+**/pom.xml merge=ours
+**/MANIFEST.MF merge=ours
+**/feature.xml merge=ours
+eu.etaxonomy.taxeditor.cdmlib/.classpath merge=ours
+eu.etaxonomy.taxeditor.cdmlib/build.properties merge=ours
+eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product merge=ours
+eu.etaxonomy.taxeditor/eu.etaxonomy.taxeditor.product.with.jre merge=ours
\ No newline at end of file
index a016571e2862abf02bffe9917525ea9a842af317..0798ab5e9ddabfff8f3d28ac8d3dec9dab10b38b 100644 (file)
@@ -78,7 +78,7 @@ public class ConvertPerson2TeamHandler extends AbstractHandler {
                                if (object instanceof Person){\r
                                        Person person = HibernateProxyHelper.deproxy(object, Person.class);\r
                                        try {\r
-                                               team = CdmStore.getService(IAgentService.class).convertPerson2Team(person);\r
+                                               team = CdmStore.getService(IAgentService.class).convertPerson2Team(person.getUuid());\r
                                        } catch (IllegalArgumentException e) {\r
                                                MessagingUtils.errorDialog("Can not convert Person into a Team", null, e.getLocalizedMessage(), TaxeditorBulkeditorPlugin.PLUGIN_ID,e, true);\r
                                        } catch (MergeException e) {\r
index 846ada15f14a8bfe3386dd6cb90561ae10a576b5..047cad68c31de532220da0adb89d1f715bf6292b 100644 (file)
@@ -20,10 +20,8 @@ import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.handlers.HandlerUtil;\r
 import org.eclipse.ui.texteditor.IDocumentProvider;\r
 \r
-import eu.etaxonomy.cdm.api.service.AgentServiceImpl;\r
 import eu.etaxonomy.cdm.api.service.IAgentService;\r
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
-import eu.etaxonomy.cdm.model.agent.AgentBase;\r
 import eu.etaxonomy.cdm.model.agent.Person;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.strategy.merge.MergeException;\r
@@ -47,9 +45,9 @@ public class ConvertTeam2PersonHandler extends AbstractHandler {
        @Override\r
        public Person execute(ExecutionEvent event) throws ExecutionException {\r
                ISelection selection = HandlerUtil.getCurrentSelection(event);\r
-               \r
+\r
                IEditorPart editor = HandlerUtil.getActiveEditor(event);\r
-               \r
+\r
                IEditorInput input = editor.getEditorInput();\r
                if (editor.isDirty()){\r
                        boolean proceed = MessageDialog.openQuestion(null,\r
@@ -61,17 +59,17 @@ public class ConvertTeam2PersonHandler extends AbstractHandler {
                        }\r
                }\r
                if((input instanceof IEntityPersistenceService) && (selection instanceof IStructuredSelection)){\r
-                       \r
-                       \r
+\r
+\r
                        IDocumentProvider provider = ((BulkEditor) editor).getDocumentProvider();\r
-                       LineAnnotationModel model = \r
+                       LineAnnotationModel model =\r
                                        (LineAnnotationModel) provider.getAnnotationModel(input);\r
-                       \r
-                       \r
+\r
+\r
                        IStructuredSelection structuredSelection = (IStructuredSelection) selection;\r
-                       \r
+\r
                        IEntityPersistenceService persistenceService = (IEntityPersistenceService) input;\r
-               \r
+\r
                        Person person ;\r
                        for(Object object : structuredSelection.toList()){\r
                                LineAnnotation annotation = (LineAnnotation) model.getAnnotation(object);\r
@@ -79,7 +77,7 @@ public class ConvertTeam2PersonHandler extends AbstractHandler {
                                if (object instanceof Team){\r
                                        Team team = HibernateProxyHelper.deproxy(object, Team.class);\r
                                        try {\r
-                                               person = CdmStore.getService(IAgentService.class).convertTeam2Person(team);\r
+                                               person = CdmStore.getService(IAgentService.class).convertTeam2Person(team.getUuid());\r
                                        } catch (IllegalArgumentException e) {\r
                                                MessagingUtils.informationDialog("Can not convert Team to Person", e.getMessage());\r
                                        } catch (MergeException e) {\r
@@ -88,7 +86,7 @@ public class ConvertTeam2PersonHandler extends AbstractHandler {
                                }else{\r
                                        MessagingUtils.informationDialog("Can not convert Team to Person", "convertTeam2Person can only be called on a team.");\r
                                }\r
-                               \r
+\r
                                if (person != null){\r
                                        ((BulkEditor) editor).removeAnnotatedLine(annotation);\r
                                        ((BulkEditor) editor).createAnnotatedLine(person);\r
index cff075cc25788937175a05579a6445730732f74a..6423cece7d442a113656cc140cd2a6ebfc6c1e72 100644 (file)
@@ -148,7 +148,7 @@ public class AgentEditorInput extends AbstractBulkEditorInput<TeamOrPersonBase>
        @Override
        public TeamOrPersonBase save(TeamOrPersonBase entity) {
            if(CdmStore.getCurrentSessionManager().isRemoting()) {
-               return (TeamOrPersonBase) CdmStore.getService(IAgentService.class).merge(entity, true);
+               return (TeamOrPersonBase) CdmStore.getService(IAgentService.class).merge(entity, true).getMergedEntity();
            } else {
                CdmStore.getService(IAgentService.class).saveOrUpdate(entity) ;
                return entity;
index 6e44e52f6837dfd71e54852649148e4c3695ab65..0082939986a984d95527749de20bf64d7bfb53ca 100644 (file)
@@ -63,7 +63,7 @@ public class GroupEditorInput extends AbstractBulkEditorInput<Group> {
        @Override
        public Group save(Group entity) {
            if(CdmStore.getCurrentSessionManager().isRemoting()) {
-               return CdmStore.getService(IGroupService.class).merge(entity, true) ;
+               return CdmStore.getService(IGroupService.class).merge(entity, true).getMergedEntity();
            } else {
                CdmStore.getService(IGroupService.class).saveOrUpdate(entity);
                return entity;
index 8b56ea1a8c2e0399e99bd2ea15f7d464f2c71cb8..6116162d2857d9b597787d6de27db0edb2ffdbb7 100644 (file)
@@ -119,7 +119,7 @@ public class NameEditorInput extends AbstractBulkEditorInput<TaxonNameBase> {
        @Override
     public TaxonNameBase save(TaxonNameBase entity) {
            if(CdmStore.getCurrentSessionManager().isRemoting()) {
-               return CdmStore.getService(INameService.class).merge(entity, true) ;
+               return CdmStore.getService(INameService.class).merge(entity, true).getMergedEntity();
            } else {
                CdmStore.getService(INameService.class).saveOrUpdate(entity);
                return entity;
index e219a500f5742ab117107a819ad8e06147729950..929379d2731220a67cd558a7815b56545c18e923 100644 (file)
@@ -138,7 +138,7 @@ public class OccurrenceEditorInput extends AbstractBulkEditorInput<SpecimenOrObs
        @Override
     public SpecimenOrObservationBase<IIdentifiableEntityCacheStrategy> save(SpecimenOrObservationBase entity) {
            if(CdmStore.getCurrentSessionManager().isRemoting()) {
-               return CdmStore.getService(IOccurrenceService.class).merge(entity, true) ;
+               return CdmStore.getService(IOccurrenceService.class).merge(entity, true).getMergedEntity();
            } else {
                CdmStore.getService(IOccurrenceService.class).save(entity);
                return entity;
index 32df06a57bba415052508f4c43776c4341b41e0f..8b8c11360c4442e1c160b9ed43ea630209e3b738 100644 (file)
@@ -140,7 +140,7 @@ public class ReferenceEditorInput extends AbstractBulkEditorInput<Reference> {
        @Override
     public Reference save(Reference entity) {
            if(CdmStore.getCurrentSessionManager().isRemoting()) {
-               return CdmStore.getService(IReferenceService.class).merge(entity, true);
+               return CdmStore.getService(IReferenceService.class).merge(entity, true).getMergedEntity();
            } else {
                CdmStore.getService(IReferenceService.class).saveOrUpdate(entity);
                return entity;
index 4f8473544da1aafee7478afb87b8e45248a73b78..aa6dd1537bbae92c19b7a49adc5b35dbb09964eb 100644 (file)
@@ -72,7 +72,7 @@ public class TaxonEditorInput extends AbstractBulkEditorInput<TaxonBase>{
        @Override\r
        public TaxonBase save(TaxonBase entity) {\r
            if(CdmStore.getCurrentSessionManager().isRemoting()) {\r
-               return CdmStore.getService(ITaxonService.class).merge(entity, true);\r
+               return CdmStore.getService(ITaxonService.class).merge(entity, true).getMergedEntity();\r
            } else {\r
                CdmStore.getService(ITaxonService.class).saveOrUpdate(entity);\r
                return entity;\r
index bcbff535c0bf5d4714358ab9d172089b4df89f10..72dd138a4fc45db2581d631c2517b9b69ec6a1ae 100644 (file)
@@ -63,7 +63,7 @@ public class UserEditorInput extends AbstractBulkEditorInput<User> {
        @Override
        public User save(User entity) {
            if(CdmStore.getCurrentSessionManager().isRemoting()) {
-               return CdmStore.getService(IUserService.class).merge(entity, true);
+               return CdmStore.getService(IUserService.class).merge(entity, true).getMergedEntity();
            } else {
                CdmStore.getService(IUserService.class).saveOrUpdate(entity);
                return entity;
index 91b7734797b5af7b5ded0242db68422bb69aab9a..81ebab53c8c63236ee855d06810806a8a13b884d 100644 (file)
@@ -44,7 +44,8 @@ public class UserCreator  implements IEntityCreator<User>{
                try{
                        User user = User.NewInstance(text, text);
                         if(CdmStore.getCurrentSessionManager().isRemoting()) {
-                            user = CdmStore.getService(IUserService.class).merge(user);
+                            CdmStore.getService(IUserService.class).createUser(user);
+                            user = CdmStore.getService(IUserService.class).loadWithUpdate(user.getUuid());
                         } else {
                             CdmStore.getService(IUserService.class).createUser(user);
                         }
index bcd6dff64c1f299e085c1b9a705f8715b7daf988..8bee46bf9946ebd9e7472e970d04d4646aeb4827 100644 (file)
@@ -9,10 +9,25 @@
 */
 package eu.etaxonomy.cdm.api.application;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
-
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Dictionary;
+import java.util.jar.Attributes;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.ManifestElement;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
 import org.springframework.security.core.context.SecurityContext;
 
 import eu.etaxonomy.cdm.api.cache.CdmServiceCacher;
@@ -41,6 +56,8 @@ public class CdmApplicationState {
 
     private static CdmServiceCacher cdmServiceCacher;
 
+    private static String cdmlibVersion = null;
+    private static String cdmlibLastModified = null;
 
     public static CdmApplicationState getInstance() {
         if(cdmApplicationState == null) {
@@ -129,6 +146,8 @@ public class CdmApplicationState {
         getInstance().setSecurityContext(null);
         cdmApplicationState = null;
         cdmServiceCacher = null;
+        cdmlibVersion = null;
+        cdmlibLastModified = null;
     }
 
 
@@ -211,5 +230,61 @@ public class CdmApplicationState {
         cdmServiceCacher = cacher;
     }
 
+    public static void updateCdmlibManifestInfo() {
+        cdmlibVersion = null;
+        cdmlibLastModified = null;
+        String cdmlibPathPrefix = "lib/cdmlib-services-";
+        String jarSuffix = ".jar";
+        Bundle bundle = Platform.getBundle("eu.etaxonomy.taxeditor.cdmlib");
+        Dictionary<String, String> headers = bundle.getHeaders();
+        String bundleClasspath = headers.get(Constants.BUNDLE_CLASSPATH);
+        try {
+            ManifestElement[] elements = ManifestElement.parseHeader(Constants.BUNDLE_CLASSPATH, bundleClasspath);
+            for (ManifestElement manifestElement : elements) {
+                String jar =  manifestElement.getValue();
+                if(jar.startsWith(cdmlibPathPrefix) && jar.endsWith(jarSuffix)) {
+                    URL fileURL = bundle.getEntry(jar);
+                    File file = null;
+                    try {
+                        String urlString = FileLocator.resolve(fileURL).toExternalForm().replace(" ", "%20");;
+                        file = new File(new URI(urlString));
+                        JarFile jarFile = new JarFile(file);
+                        Manifest manifest = jarFile.getManifest();
+                        Attributes attributes = manifest.getMainAttributes();
+                        // from the OSGI spec the LastModified value is " the number of milliseconds
+                        // since midnight Jan. 1, 1970 UTC with the condition that a change must
+                        // always result in a higher value than the previous last modified time
+                        // of any bundle"
+                        cdmlibVersion = attributes.getValue("Bundle-Version");
+                        cdmlibLastModified = attributes.getValue("Bnd-LastModified");
+
+                        jarFile.close();
+                        if(cdmlibVersion == null || cdmlibLastModified == null) {
+                            throw new IllegalStateException("Invalid cdmlib manifest info");
+                        }
+                    } catch (URISyntaxException urise) {
+                        throw new IllegalStateException(urise);
+                    } catch (IOException ioe) {
+                        throw new IllegalStateException(ioe);
+                    }
+                }
+            }
+        } catch (BundleException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    public static String getCdmlibVersion() {
+        if(cdmlibVersion == null) {
+            updateCdmlibManifestInfo();
+        }
+        return cdmlibVersion;
+    }
 
+    public static String getCdmlibLastModified() {
+        if(cdmlibLastModified == null) {
+            updateCdmlibManifestInfo();
+        }
+        return cdmlibLastModified;
+    }
 }
index 526e990e46779b5b09ec00a261e668b6225acc69..79e4adc30c2595397a0fb07f3f723bde63a9126a 100644 (file)
@@ -25,6 +25,7 @@ import org.springframework.util.ReflectionUtils;
 import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.model.ICdmCacher;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 
 /**
  * @author cmathew
@@ -72,6 +73,8 @@ public class CacheLoader {
         } else if(obj instanceof Pager) {
              load(((Pager)obj).getRecords(), recursive, update);
              return obj;
+        } else if(obj instanceof MergeResult) {
+            return (T) load((MergeResult<CdmBase>)obj, recursive, update);
         }
 
         return obj;
@@ -199,6 +202,13 @@ public class CacheLoader {
     }
 
 
+    public MergeResult<CdmBase> load(MergeResult<CdmBase> mergeResult, boolean recursive, boolean update) {
+        CdmBase cdmBase = load(mergeResult.getMergedEntity(), recursive, update);
+        load(mergeResult.getNewEntities(), recursive, update);
+        return new MergeResult(cdmBase, mergeResult.getNewEntities());
+    }
+
+
     /**
      * Puts the (Key,Value) pair of ({@link java.util.UUID}, {@link eu.etaxonomy.cdm.model.common.CdmBase}),
      * in the cache corresponding to the given cache id
index 7e67ecd227ce679d42b066cfede1ec5e66f9c27b..7047b190d5d681558aca023a467b3621cdb5d00a 100644 (file)
@@ -34,6 +34,7 @@ import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.api.service.dto.CdmEntityIdentifier;
 import eu.etaxonomy.cdm.model.ICdmCacher;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
 
 /**
@@ -184,6 +185,10 @@ public class CdmTransientEntityCacher implements ICdmCacher {
         return result;
     }
 
+    public MergeResult<CdmBase> load(MergeResult<CdmBase> mergeResult, boolean update) {
+        return cacheLoader.load(mergeResult, true, update);
+    }
+
     public CdmModelFieldPropertyFromClass getFromCdmlibModelCache(String className) {
         return cacheLoader.getFromCdmlibModelCache(className);
     }
index d6fce9ba007ef4625d4764547e45abda5d9ff4a8..f30a93dcdfb17d7949b400aae3de95c86093d459 100644 (file)
@@ -16,6 +16,7 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
@@ -23,15 +24,19 @@ import org.apache.http.client.HttpClient;
 import org.apache.http.client.ResponseHandler;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
 import org.apache.http.util.EntityUtils;
 import org.apache.log4j.Logger;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
 import eu.etaxonomy.cdm.config.CdmSourceException;
 import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
 import eu.etaxonomy.cdm.database.ICdmDataSource;
+import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
 import eu.etaxonomy.taxeditor.remoting.server.CDMServerException;
 
 /**
@@ -75,11 +80,16 @@ public class CdmServerInfo {
 
     private static List<CdmServerInfo> cdmServerInfoList;
 
+    private String cdmlibServicesVersion = "";
+    private String cdmlibServicesLastModified = "";
+
+
     public CdmServerInfo(String name, String server, int port) {
         this.name = name;
         this.server = server;
         this.port = port;
         instances = new ArrayList<CdmInstanceInfo>();
+
     }
 
 
@@ -98,6 +108,14 @@ public class CdmServerInfo {
         return NAME_LOCALHOST_MGD.equals(name);
     }
 
+    public String getCdmlibServicesVersion() {
+        return cdmlibServicesVersion;
+    }
+
+    public String getCdmlibLastModified() {
+        return cdmlibServicesLastModified;
+    }
+
     public void refreshInstances() throws CDMServerException {
         instances.clear();
         if(isLocalhostMgd()) {
@@ -114,10 +132,54 @@ public class CdmServerInfo {
         });
     }
 
+    public void updateInfo() throws CDMServerException {
+        String url = "http://" + server + ":" + String.valueOf(port) + "/" + CDMSERVER_PREFIX + "/info.jsp";
+        String responseBody = getResponse(url);
+        if(responseBody != null) {
+            try {
+                JSONObject info = new JSONObject(responseBody);
+                cdmlibServicesVersion =  info.getString("cdmlibServicesVersion");
+                cdmlibServicesLastModified = info.getString("cdmlibServicesLastModified");
+            } catch (JSONException e) {
+                throw new CDMServerException(e);
+            }
+        }
+    }
+
     public void addInstancesViaHttp() throws CDMServerException {
+        updateInfo();
         String url = "http://" + server + ":" + String.valueOf(port) + "/" + CDMSERVER_PREFIX + "/instances.jsp";
+        String responseBody = getResponse(url);
+        if(responseBody != null) {
+            try {
+                JSONArray array = new JSONArray(responseBody);
+                for(int i=0;i<array.length();i++) {
+                    JSONObject instance = (JSONObject)array.get(i);
+                    if(instance != null) {
+                        JSONObject conf = (JSONObject)instance.get("configuration");
+                        if(conf != null) {
+                            String instanceName = conf.getString("instanceName");
+                            // we need to remove the first (char) forward slash from
+                            // the base path
+                            String basePath = conf.getString("basePath").substring(1);
+                            addInstance(instanceName, basePath);
+                            logger.info("Added instance with name : " + instanceName + ", basePath : " + basePath);
+                        }
+                    }
+                }
+            } catch (JSONException e) {
+                throw new CDMServerException(e);
+            }
+        }
+    }
 
+    private String getResponse(String url) throws CDMServerException {
         HttpClient client = new DefaultHttpClient();
+        HttpParams params = client.getParams();
+
+        HttpConnectionParams.setConnectionTimeout(params, 5000);
+        HttpConnectionParams.setSoTimeout(params, 5000);
+
         HttpGet httpGet = new HttpGet(url);
 
         logger.info("Executing request " + httpGet.getRequestLine());
@@ -146,29 +208,7 @@ public class CdmServerInfo {
         } catch (IOException e) {
             throw new CDMServerException(e);
         }
-
-
-        if(responseBody != null) {
-            try {
-                JSONArray array = new JSONArray(responseBody);
-                for(int i=0;i<array.length();i++) {
-                    JSONObject instance = (JSONObject)array.get(i);
-                    if(instance != null) {
-                        JSONObject conf = (JSONObject)instance.get("configuration");
-                        if(conf != null) {
-                            String instanceName = conf.getString("instanceName");
-                            // we need to remove the first (char) forward slash from
-                            // the base path
-                            String basePath = conf.getString("basePath").substring(1);
-                            addInstance(instanceName, basePath);
-                            logger.info("Added instance with name : " + instanceName + ", basePath : " + basePath);
-                        }
-                    }
-                }
-            } catch (JSONException e) {
-                throw new CDMServerException(e);
-            }
-        }
+        return responseBody;
     }
 
     public void addInstancesFromDataSourcesConfig() {
@@ -208,13 +248,16 @@ public class CdmServerInfo {
         return null;
     }
 
-    public boolean pingServer(){
+    public boolean pingServer() {
         try {
             Socket s = new Socket(server, port);
             logger.info("[CDM-Server] Available @ " + server + ":" + port );
+            updateInfo();
             return true;
         } catch (IOException ioe) {
 
+        } catch (CDMServerException e) {
+
         }
         return false;
     }
@@ -234,6 +277,85 @@ public class CdmServerInfo {
         return false;
     }
 
+    public int compareDbSchemaVersion(CdmInstanceInfo instance, int port) throws CDMServerException {
+
+        ICdmRemoteSource crs = getCdmRemoteSource(instance, port);
+        String dbSchemaVersion;
+        try {
+            dbSchemaVersion = crs.getDbSchemaVersion();
+        } catch (CdmSourceException e) {
+            throw new CDMServerException(e);
+        }
+
+
+        if(dbSchemaVersion != null) {
+            return CdmMetaData.compareVersion(dbSchemaVersion, CdmMetaData.getDbSchemaVersion(), 3, null);
+        } else {
+            throw new CDMServerException("Cannot determine editor db. schema version");
+        }
+    }
+
+    public int compareCdmlibServicesVersion() throws CdmSourceException {
+
+        String serverVersion = cdmlibServicesVersion;
+        String serverCdmlibLastModified = cdmlibServicesLastModified;
+
+        return compareCdmlibServicesVersion(serverVersion, serverCdmlibLastModified);
+    }
+
+
+    /**
+     * @param serverVersion
+     * @param editorVersion
+     * @throws CdmSourceException
+     */
+    public static int compareCdmlibServicesVersion(String serverVersion, String serverCdmlibLastModified) throws CdmSourceException {
+
+        String editorVersion = CdmApplicationState.getCdmlibVersion();
+        String editorCdmlibLastModified = CdmApplicationState.getCdmlibLastModified();
+
+        int result = 0;
+        if(StringUtils.isBlank(serverVersion) || StringUtils.isBlank(editorVersion)) {
+            throw new CdmSourceException("cdmlib-services server or editor version is empty");
+        }
+
+        String[] serverVersionSplit = serverVersion.split("\\.");
+        String[] editorVersionSplit = editorVersion.split("\\.");
+
+        if(serverVersionSplit.length < 3 || editorVersionSplit.length < 3 || serverVersionSplit.length > 4 || editorVersionSplit.length > 4) {
+            throw new CdmSourceException("cdmlib-services server or editor version is invalid");
+        }
+
+        Integer serverVersionPart;
+        Integer editorVersionPart;
+
+        for(int i=0 ; i<3 ; i++) {
+            serverVersionPart = Integer.valueOf(serverVersionSplit[i]);
+            editorVersionPart = Integer.valueOf(editorVersionSplit[i]);
+
+            int partCompare = serverVersionPart.compareTo(editorVersionPart);
+            if (partCompare != 0){
+                return partCompare;
+            }
+        }
+        // at this point major, minor and patch versions are matching
+
+        if(StringUtils.isBlank(serverCdmlibLastModified) || StringUtils.isBlank(editorCdmlibLastModified)) {
+            throw new CdmSourceException("cdmlib-services server or editor version is empty");
+        }
+
+        String cdmServerIgnoreVersion = System.getProperty("cdm.server.version.lm.ignore");
+        if(StringUtils.isBlank(cdmServerIgnoreVersion) || !cdmServerIgnoreVersion.equals("true")) {
+            Long serverLastModified = Long.valueOf(serverCdmlibLastModified);
+            Long editorLastModified = Long.valueOf(editorCdmlibLastModified);
+            return serverLastModified.compareTo(editorLastModified);
+        }
+
+        return 0;
+    }
+
+
+
     public static List<CdmServerInfo> getCdmServers() {
         if(cdmServerInfoList == null) {
             cdmServerInfoList = new ArrayList<CdmServerInfo>();
index 8084eac89bf742d6cdc4cb1b2508780e8c948f9d..d8a07325c67aef0ee3b8a773eca14d5256e9332c 100644 (file)
@@ -2,6 +2,8 @@ package eu.etaxonomy.taxeditor.service;
 
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 import org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration;
@@ -23,8 +25,17 @@ public class CdmServiceRequestExecutor extends CdmAuthenticatedHttpInvokerReques
 
        private RemoteInvocation currentRemoteInvocation;
 
+       protected final static Set<String> cachableMethods = new HashSet<String>();
 
 
+
+       public CdmServiceRequestExecutor() {
+           cachableMethods.add("merge");
+           cachableMethods.add("save");
+           cachableMethods.add("findWithUpdate");
+           cachableMethods.add("loadWithUpdate");
+       }
+
        @Override
        protected void writeRemoteInvocation(RemoteInvocation invocation, OutputStream os) throws IOException {
            if(cdmEntitySessionManager == null) {
@@ -42,17 +53,11 @@ public class CdmServiceRequestExecutor extends CdmAuthenticatedHttpInvokerReques
                                        java.lang.ClassNotFoundException {
                RemoteInvocationResult rir = fromCache(currentRemoteInvocation);
 
-               // if rir is not null at this point we assume that the
-               // the object has already been loaded in the cache and
-               // does not need to be reloaded
-
                if(rir == null) {
                    logger.info("Remote invoking : " + currentRemoteInvocation.getMethodName() + "@" + config.getServiceUrl());
                        rir = super.doExecuteRequest(config, baos);
                        if(rir.getValue() != null && !rir.hasException()) {
-                if("merge".equals(currentRemoteInvocation.getMethodName()) ||
-                        "save".equals(currentRemoteInvocation.getMethodName()) ||
-                        "findWithUpdate".equals(currentRemoteInvocation.getMethodName())) {
+                if(cachableMethods.contains(currentRemoteInvocation.getMethodName())) {
                     rir = new RemoteInvocationResult(cdmEntitySessionManager.load(rir.getValue(), true));
                 } else if(rir.getValue() instanceof UpdateResult){
                     UpdateResult result = (UpdateResult)rir.getValue();
index 85c7d33bbaa76f044a2c33ce694ff5f3f2e94760..150d7d20e2d53756ba3f49130e59eda67e78c0c9 100644 (file)
@@ -23,6 +23,7 @@ import org.apache.log4j.Logger;
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.taxeditor.remoting.cache.CdmTransientEntityCacher;
 import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
 
@@ -92,6 +93,14 @@ public class CdmEntitySession implements ICdmEntitySession  {
         return cdmTransientEntityCacher.load(updateResult, update);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
+     */
+    @Override
+    public  <T extends CdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
+        return  cdmTransientEntityCacher.load(mergeResult, update);
+    }
+
     @Override
     public <T extends CdmBase> void  update() {
         Collection<T> rootEntities = getRootEntities();
@@ -247,7 +256,7 @@ public class CdmEntitySession implements ICdmEntitySession  {
      */
     @Override
     public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
-        T mergedCdmBase = service.merge(cdmBase, true);
+        T mergedCdmBase = service.merge(cdmBase, true).getMergedEntity();
         return mergedCdmBase;
     }
 
index 1e5d7d889b77c3f3584158c840f53ed8fd395218..80bc0caba5cd87406ef1ea017d416c63eaf8142a 100644 (file)
@@ -22,6 +22,7 @@ import org.springframework.stereotype.Component;
 
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 
 /**
  * @author cmathew
@@ -161,6 +162,18 @@ public class CdmEntitySessionManager implements ICdmEntitySessionManager {
     }
 
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
+     */
+    @Override
+    public MergeResult load(MergeResult mergeResult, boolean update) {
+        if(activeSession == null) {
+            return mergeResult;
+        }
+        return activeSession.load(mergeResult, update);
+    }
+
+
     /* (non-Javadoc)
      * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(java.util.Collection)
      */
@@ -244,7 +257,5 @@ public class CdmEntitySessionManager implements ICdmEntitySessionManager {
         return true;
     }
 
-
-
 }
 
index aaf23e9ef04c5d4bcc811f0d4d028b445acd3719..7ce1808ac77d4a8e4b82d6a9c678e0472c412c04 100644 (file)
@@ -30,7 +30,7 @@ public class DefaultNewEntityListener implements NewEntityListener {
      */
     @Override
     public void onCreate(CdmBase cdmBase) {
-        logger.warn("New Entity created : " + cdmBase);
+        logger.info("New Entity created : " + cdmBase);
         if(CdmApplicationState.getCurrentAppConfig() instanceof CdmApplicationRemoteController){
             ((CdmApplicationRemoteController)CdmApplicationState.getCurrentAppConfig()).getCdmEntitySessionManager().getActiveSession().addNewCdmEntity(cdmBase);
         }
index 22388ed7e5b87827be47628f9c26375c4af6b586..bbd744f77ca2069678df7ab456944461a69e7a79 100644 (file)
@@ -8,6 +8,7 @@ import net.sf.ehcache.statistics.LiveCacheStatistics;
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
 
 public interface ICdmEntitySession {
@@ -22,6 +23,8 @@ public interface ICdmEntitySession {
 
        public  UpdateResult load(UpdateResult updateResult, boolean update);
 
+       public  <T extends CdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update);
+
        public <T extends CdmBase> EntityCacherDebugResult debug(T cdmBase);
 
        public <T extends CdmBase> EntityCacherDebugResult debug(Collection<T> cdmBase);
index ea2c7867b79a2b111101adf08654b173e3e996de..f6418aecbcbb10c9bb89b09c5896ad919a92e931 100644 (file)
@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 
 public interface ICdmEntitySessionManager {
 
@@ -27,6 +28,8 @@ public interface ICdmEntitySessionManager {
 
        public abstract UpdateResult load(UpdateResult updateResult, boolean update);
 
+       public abstract MergeResult load(MergeResult mergeResult, boolean update);
+
 
        public abstract <T extends CdmBase> Collection<T> load(Collection<T> cdmBaseList, boolean update);
 
index 65b8e7c245481d78c085db7d91c2dbaa73f35943..9efd8ec423c075402ad20772a9fdf5accd24c930 100644 (file)
@@ -18,6 +18,7 @@ import net.sf.ehcache.statistics.LiveCacheStatistics;
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
 
 /**
@@ -177,7 +178,7 @@ public class NullSession implements ICdmEntitySession {
      */
     @Override
     public <T extends CdmBase> T remoteUpdate(IService<T> service, T cdmBase) {
-        T mergedCdmBase = service.merge(cdmBase, true);
+        T mergedCdmBase = service.merge(cdmBase, true).getMergedEntity();
         return mergedCdmBase;
     }
 
@@ -218,4 +219,12 @@ public class NullSession implements ICdmEntitySession {
 
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
+     */
+    @Override
+    public <T extends CdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
+        return mergeResult;
+    }
+
 }
index ef72bfa021c366c021aeb87b850aba79d5122646..efe8b7e9301f4cf4f4d7cb4452e3f92256c2f483 100644 (file)
@@ -17,6 +17,7 @@ import net.sf.ehcache.statistics.LiveCacheStatistics;
 import eu.etaxonomy.cdm.api.service.IService;
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.taxeditor.remoting.cache.EntityCacherDebugResult;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
@@ -207,5 +208,13 @@ public class MockCdmEntitySession implements ICdmEntitySession  {
 
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySession#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
+     */
+    @Override
+    public <T extends CdmBase> MergeResult<T> load(MergeResult<T> mergeResult, boolean update) {
+        return mergeResult;
+    }
+
 
 }
index 32467f377a8c2fd8cc59056a683e893eae137f4f..263efab59865ae3c8af3fad4e98797a7b5d60014 100644 (file)
@@ -4,6 +4,7 @@ import java.util.Collection;
 
 import eu.etaxonomy.cdm.api.service.UpdateResult;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySession;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionEnabled;
 import eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager;
@@ -134,4 +135,12 @@ public class MockCdmEntitySessionManager implements ICdmEntitySessionManager {
         return new MockCdmEntitySession();
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.taxeditor.session.ICdmEntitySessionManager#load(eu.etaxonomy.cdm.persistence.dto.MergeResult, boolean)
+     */
+    @Override
+    public MergeResult load(MergeResult mergeResult, boolean update) {
+        return mergeResult;
+    }
+
 }
index 59fa37378eb43b00b039cb4957041edb1a978fd3..fa78b41d88044db94249d9b55fe250b10df73211 100644 (file)
@@ -158,7 +158,7 @@ public class CdmAuthorityEditorInput extends CdmEntitySessionInput implements IE
     @Override
     public void merge() {
         if(CdmStore.getCurrentSessionManager().isRemoting()) {
-            group = CdmStore.getService(IGroupService.class).merge(group, true);
+            group = CdmStore.getService(IGroupService.class).merge(group, true).getMergedEntity();
         }
     }
 }
index e76738ff79a1af2c84b854e183b0e2529b2790f1..7a190f4323be88cf4668390e437fc48080a72867 100644 (file)
@@ -92,7 +92,7 @@ public class PolytomousKeyEditorInput extends AbstractIdentificationEditorInput<
     @Override
     public void merge() {
         if(CdmStore.getCurrentSessionManager().isRemoting()) {
-            key = CdmStore.getService(IPolytomousKeyService.class).merge(key,true);
+            key = CdmStore.getService(IPolytomousKeyService.class).merge(key,true).getMergedEntity();
         }
     }
 
index 7733dfd52805ae37089d6d70b08be14788b5d37a..ce6ff028a2b353521620864c3af847638ff839c6 100644 (file)
@@ -240,6 +240,7 @@ public class TaxonNameEditor extends EditorPart implements
                ContainerFactory.createOrUpdateHeterotypicSynonymyGroups(this);
                ContainerFactory.createOrUpdateMisapplicationsGroup(this);
 
+
                // Redraw composite
                managedForm.reflow(true);
        }
index 00d27bf128bb888f9a9b71ac8ee29cd04f42fb9e..d005de543ea74455d674c432a0105a0cc81c1068 100644 (file)
@@ -79,7 +79,7 @@ public class DeleteSynonymOperation extends AbstractPostTaxonOperation {
                                        element.removeSynonym(synonym);
 
                                } else {
-
+//TODO: this should be moved to the handler, the operations should not contain ui code
                                        DeleteResult result = service.deleteSynonym(synonym.getUuid(), element.getUuid(), null);
                                        if (result.isError()){
                                                DeleteResultMessagingUtils.messageDialogWithDetails(result, "Delete failed", TaxeditorEditorPlugin.PLUGIN_ID);
index c128ec4fd38754e4a3fdf87f54070270590e0709..5b29bd6f36cda2ae7771462cf5778b7aa22fb1da 100644 (file)
@@ -44,6 +44,7 @@ import eu.etaxonomy.cdm.model.media.Rights;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
@@ -793,19 +794,42 @@ public class TransientAgentService implements IAgentService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public AgentBase merge(AgentBase arg0, boolean arg1) {
+    public List<MergeResult<AgentBase>> merge(List<AgentBase> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<AgentBase> merge(List<AgentBase> arg0, boolean arg1) {
-        return defaultService.merge(arg0, arg1);
+    public MergeResult<AgentBase> merge(AgentBase arg0, boolean arg1) {
+       return defaultService.merge(arg0, arg1);
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public AgentBase loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IAgentService#convertPerson2Team(java.util.UUID)
+     */
+    @Override
+    public Team convertPerson2Team(UUID arg0) throws MergeException, IllegalArgumentException {
+        return defaultService.convertPerson2Team(arg0);
+    }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IAgentService#convertTeam2Person(java.util.UUID)
+     */
+    @Override
+    public Person convertTeam2Person(UUID arg0) throws MergeException {
+        return defaultService.convertTeam2Person(arg0);
+    }
 }
index 426d05d1cc89a583a319d54356c8df334192f791..f9051e871d833b20795f36ed3fd5557b6fba29d0 100644 (file)
@@ -46,6 +46,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
@@ -646,8 +647,8 @@ public class TransientClassificationService implements IClassificationService {
      * @see eu.etaxonomy.cdm.api.service.IClassificationService#getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(eu.etaxonomy.cdm.model.taxon.Classification)
      */
     @Override
-    public List<UuidAndTitleCache<TaxonNode>> getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(Classification classification) {
-        return defaultService.getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(classification);
+    public List<UuidAndTitleCache<TaxonNode>> getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(Classification classification, List<UUID> excludeTaxa) {
+        return defaultService.getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(classification, excludeTaxa);
     }
 
     /**
@@ -951,21 +952,28 @@ public class TransientClassificationService implements IClassificationService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public Classification merge(Classification arg0, boolean arg1) {
+    public List<MergeResult<Classification>> merge(List<Classification> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<Classification> merge(List<Classification> arg0, boolean arg1) {
+    public MergeResult<Classification> merge(Classification arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public Classification loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
 
 
 }
index 6ff656705aba346c2feb9f83d4d4ebcfe11bf851..b9e208351c368adf6b431339c40f42528148ac38 100644 (file)
@@ -38,6 +38,7 @@ import eu.etaxonomy.cdm.model.occurrence.Collection;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
@@ -727,19 +728,28 @@ public class TransientCollectionService implements ICollectionService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public Collection merge(Collection arg0, boolean arg1) {
+    public List<MergeResult<Collection>> merge(List<Collection> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<Collection> merge(List<Collection> arg0, boolean arg1) {
+    public MergeResult<Collection> merge(Collection arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public Collection loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
+
+
 }
index 62291f36485f3cd1064ee24cc08a0d8587559142..2954833fc67296f5ddad51a71da81f925115058d 100644 (file)
@@ -54,6 +54,7 @@ import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.TermDto;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
@@ -1197,25 +1198,38 @@ public class TransientDescriptionService implements IDescriptionService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public DescriptionBase merge(DescriptionBase arg0, boolean arg1) {
+    public List<MergeResult<DescriptionBase>> merge(List<DescriptionBase> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
 
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<DescriptionBase> merge(List<DescriptionBase> arg0, boolean arg1) {
-
+    public MergeResult<DescriptionBase> merge(DescriptionBase arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public DescriptionBase loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#moveTaxonDescription(java.util.UUID, java.util.UUID)
+     */
+    @Override
+    public UpdateResult moveTaxonDescription(UUID arg0, UUID arg1) {
 
+        return defaultService.moveTaxonDescriptions(arg0, arg1);
+    }
 
 }
index 6e112f58e3e09d0fe116795e0433fa40d74fe17c..dde29a060dc584f67aeda00692e9d484a46da33c 100644 (file)
@@ -63,6 +63,7 @@ import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
@@ -1199,18 +1200,27 @@ public class TransientNameService implements INameService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public TaxonNameBase merge(TaxonNameBase arg0, boolean arg1) {
+    public List<MergeResult<TaxonNameBase>> merge(List<TaxonNameBase> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<TaxonNameBase> merge(List<TaxonNameBase> arg0, boolean arg1) {
+    public MergeResult<TaxonNameBase> merge(TaxonNameBase arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public TaxonNameBase loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
+
 }
index 6d2bdc085aab1368cf2cc5fd20b8c5ae6c39097b..185dfe470d6d5cfd63af911c608f05df05d6fddc 100644 (file)
@@ -70,6 +70,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
@@ -1053,27 +1054,26 @@ public class TransientOccurenceService implements IOccurrenceService {
         return defaultService.moveSequence(arg0, arg1, arg2);
     }
 
-    /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
-     */
     @Override
-    public SpecimenOrObservationBase merge(SpecimenOrObservationBase arg0, boolean arg1) {
-        return defaultService.merge(arg0, arg1);
+    public Pager<Media> getMediainHierarchy(SpecimenOrObservationBase arg0, Integer arg1, Integer arg2,
+            List<String> arg3) {
+        return defaultService.getMediainHierarchy(arg0, arg1, arg2, arg3);
     }
 
     /* (non-Javadoc)
      * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public List<SpecimenOrObservationBase> merge(List<SpecimenOrObservationBase> arg0, boolean arg1) {
+    public List<MergeResult<SpecimenOrObservationBase>> merge(List<SpecimenOrObservationBase> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     */
     @Override
-    public Pager<Media> getMediainHierarchy(SpecimenOrObservationBase arg0, Integer arg1, Integer arg2,
-            List<String> arg3) {
-        // TODO Auto-generated method stub
-        return null;
+    public MergeResult<SpecimenOrObservationBase> merge(SpecimenOrObservationBase arg0, boolean arg1) {
+        return defaultService.merge(arg0, arg1);
     }
 
     /**
@@ -1085,4 +1085,12 @@ public class TransientOccurenceService implements IOccurrenceService {
         return defaultService.listAssociatedTaxa(arg0, arg1, arg2, arg3, arg4);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public SpecimenOrObservationBase loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
+
 }
index 48192e404e2e397c06d45363884d4a57f2ff1e58..606139a39322ae1bbebe8c8360df649a1e9440e6 100644 (file)
@@ -40,6 +40,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonBase;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
@@ -735,18 +736,28 @@ public class TransientReferenceService implements IReferenceService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public Reference merge(Reference arg0, boolean arg1) {
+    public List<MergeResult<Reference>> merge(List<Reference> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<Reference> merge(List<Reference> arg0, boolean arg1) {
+    public MergeResult<Reference> merge(Reference arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public Reference loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
+
+
 }
index b79f17f12c11885f46a1f2b568193e5e4ce63ef3..242d58f28b910960418ca96aaa341cf993ae7ee6 100644 (file)
@@ -79,6 +79,7 @@ import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.fetch.CdmFetch;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
@@ -1526,19 +1527,28 @@ public class TransientTaxonService implements ITaxonService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public TaxonBase merge(TaxonBase arg0, boolean arg1) {
+    public List<MergeResult<TaxonBase>> merge(List<TaxonBase> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<TaxonBase> merge(List<TaxonBase> arg0, boolean arg1) {
+    public MergeResult<TaxonBase> merge(TaxonBase arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public TaxonBase loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
+
+
 }
index 3df4f25297eb190ccc22a895761e60727e351184..2264aa95446629ebd75e754f2726167b9338ecf9 100644 (file)
@@ -52,6 +52,7 @@ import eu.etaxonomy.cdm.model.media.Rights;
 import eu.etaxonomy.cdm.model.view.AuditEvent;
 import eu.etaxonomy.cdm.model.view.AuditEventRecord;
 import eu.etaxonomy.cdm.persistence.dao.common.AuditEventSort;
+import eu.etaxonomy.cdm.persistence.dto.MergeResult;
 import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache;
 import eu.etaxonomy.cdm.persistence.query.Grouping;
 import eu.etaxonomy.cdm.persistence.query.MatchMode;
@@ -905,18 +906,35 @@ public class TransientTermService implements ITermService {
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
      */
     @Override
-    public DefinedTermBase merge(DefinedTermBase arg0, boolean arg1) {
+    public List<MergeResult<DefinedTermBase>> merge(List<DefinedTermBase> arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
 
     /* (non-Javadoc)
-     * @see eu.etaxonomy.cdm.api.service.IService#merge(java.util.List, boolean)
+     * @see eu.etaxonomy.cdm.api.service.IService#merge(eu.etaxonomy.cdm.model.common.ICdmBase, boolean)
      */
     @Override
-    public List<DefinedTermBase> merge(List<DefinedTermBase> arg0, boolean arg1) {
+    public MergeResult<DefinedTermBase> merge(DefinedTermBase arg0, boolean arg1) {
         return defaultService.merge(arg0, arg1);
     }
+
+    /* (non-Javadoc)
+     * @see eu.etaxonomy.cdm.api.service.IService#loadWithUpdate(java.util.UUID)
+     */
+    @Override
+    public DefinedTermBase loadWithUpdate(UUID arg0) {
+        return defaultService.loadWithUpdate(arg0);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Language getLanguageByLabel(String arg0) {
+        return defaultService.getLanguageByLabel(arg0);
+    }
+
 }
index e0e5efc73865a30af6946722f8b5b1f11a25be1e..4c66f553695ef34415a415a22f61f09e6c8c7537 100644 (file)
@@ -210,7 +210,7 @@ public class DerivateViewEditorInput extends CdmEntitySessionInput implements IE
     @Override
     public void merge() {
         if(CdmStore.getCurrentSessionManager().isRemoting()) {
-            List<SpecimenOrObservationBase> mergedEntities = CdmApplicationState.getCurrentAppConfig().getOccurrenceService().merge(new ArrayList(getRootEntities()), true);
+            CdmApplicationState.getCurrentAppConfig().getOccurrenceService().merge(new ArrayList(getRootEntities()), true);
         }
 
     }
index fb450935f7bbb1e057eef5fb21bbec7756c249c1..459cd29bba13a3a685e091e2a81ab968f240ca69 100644 (file)
@@ -94,16 +94,19 @@ public class MoveDescriptionElementsHandler extends AbstractHandler implements I
                                excludeTaxa.add(actualTaxon.getUuid());
                        }
                        Classification classification = null;
+                       TaxonNode actualNode = null;
                        if (actualTaxon != null){
                            if (!actualTaxon.getTaxonNodes().isEmpty() && actualTaxon.getTaxonNodes().size() ==1){
-                               classification = actualTaxon.getTaxonNodes().iterator().next().getClassification();
+                               actualNode = actualTaxon.getTaxonNodes().iterator().next();
+                               classification = actualNode.getClassification();
+
                            }
                        }
                        TaxonNode newAcceptedTaxonNode = TaxonNodeSelectionDialog.select(HandlerUtil.getActiveShell(event),
                                        editor.getConversationHolder(),
                                        "Choose the accepted taxon",
                                        excludeTaxa,
-                                       null,classification
+                                       null, classification
                                        );
                        if (newAcceptedTaxonNode != null){
                        Taxon targetTaxon = newAcceptedTaxonNode.getTaxon();
index 7294a137b6ec2d071fb95cd74ee4cf4f0dad4d75..55b29173d78d2b7adcd76de258e0cbba337040fd 100644 (file)
@@ -55,7 +55,9 @@ public class Root extends PlatformObject implements IAdaptable, IPersistableElem
         * @return a {@link java.util.List} object.
         */
        public List<Classification> getParentBeans() {
-               List<String> propertyPaths = Arrays.asList(new String[]{"name"});
+               List<String> propertyPaths = Arrays.asList(new String[]{
+                       "name",
+                       "rootNode.childNodes"});
 
                List<Classification> classifications = CdmStore.getService(IClassificationService.class).list(null, null, null, null, propertyPaths);
 
index e0f8a056682c00baa38a17452a86ab1df8f46d55..bdf2eb91cfed78ef4a8ac22aa47a92c4b91d722f 100644 (file)
@@ -238,7 +238,7 @@ public class TreeNodeDropAdapter extends ViewerDropAdapter implements IPostOpera
                                TaxonNode targetNode = (TaxonNode) targetITaxonTreeNode;
 
                                AbstractPostOperation operation = new MoveTaxonOperation
-                                               ("Move Taxon", workspaceUndoContext, uuids, targetNode.getParent(), this, taxonNavigator, false);
+                                               ("Move Taxon", workspaceUndoContext, uuids, targetNode, this, taxonNavigator, false);
                                NavigationUtil.executeOperation(operation);
 
                                logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
index 842f9a8c6fb0b43ff0cf68a2cc98fac3f1957b10..6b698ffcff7b570b5d594d0724a0f60be9286269 100644 (file)
@@ -244,7 +244,7 @@ public class TreeNodeDropAdapterAssistant extends CommonDropAdapterAssistant imp
                                    NavigationUtil.executeOperation(operation, null);
                                } else {
                                    AbstractPostOperation operation = new MoveTaxonOperation
-                                           ("Move Taxon", workspaceUndoContext, uuids, targetNode.getParent(), this, taxonNavigator, false);
+                                           ("Move Taxon", workspaceUndoContext, uuids, targetNode, this, taxonNavigator, false);
                                    NavigationUtil.executeOperation(operation);
                                }
                                logger.info("Moved taxa to new parent " + targetITaxonTreeNode);
index d06bfba63c176450d12982e12bf6f15a814df443..6d9d0f091393e80123d7535b5952b0759b2895e8 100644 (file)
@@ -91,13 +91,19 @@ public class ChangeAcceptedTaxonToSynonymOperation extends
                    if (!result.getExceptions().isEmpty() && result.isOk()){
                        String separator = ", ";
                            String exceptionString = "";
+                           int count = result.getExceptions().size();
+                           int n = 0;
                            for (Exception exception : result.getExceptions()) {
-                           exceptionString += exception.getLocalizedMessage()+separator;
+                               n++;
+                           exceptionString += exception.getLocalizedMessage();
+                           if (n<count){
+                               exceptionString += separator;
+                           }
                        }
 
-                       MessagingUtils.informationDialog("Synonym created but taxon is not deleted.", exceptionString);
+                       MessagingUtils.informationDialog("Synonym created but taxon deletion not possible.", exceptionString);
                    } else if (result.isAbort() || result.isError()){
-                       MessagingUtils.errorDialog("Synonym could not created", null, result.toString(), TaxeditorNavigationPlugin.PLUGIN_ID, null, true);
+                       MessagingUtils.errorDialog("Synonym creation not possible", null, result.toString(), TaxeditorNavigationPlugin.PLUGIN_ID, null, true);
                    }
                } catch (IllegalArgumentException e) {
             MessagingUtils.errorDialog("Operation failed", this, e.getMessage(), TaxeditorNavigationPlugin.PLUGIN_ID, e, false);
index cd0fbef49e3ea40493493963de799a531c2337fe..ee5880e967155116444bdb8576206b8a53d54612 100644 (file)
@@ -105,33 +105,33 @@ public class DeleteOperation extends AbstractPersistentPostOperation{
                monitor.worked(20);
                ICdmApplicationConfiguration controller = CdmStore.getCurrentApplicationConfiguration();
                ITaxonNodeService service = controller.getTaxonNodeService();
-                       if(taxonNode != null && taxonNode instanceof TaxonNode){
-                               //((TaxonNode) treeNode).delete();
-
-                               element = ((TaxonNode)taxonNode).getTaxon();
-
-                               DeleteResult result = service.deleteTaxonNode((TaxonNode)taxonNode, config);
-                               if (result.isError() && !result.getExceptions().isEmpty()){
-
-                                       DeleteResultMessagingUtils.messageDialogWithDetails(result, "TaxonNode could not be deleted.", TaxeditorNavigationPlugin.PLUGIN_ID);
-                               } else if (!result.getExceptions().isEmpty()){
-                                       String separator = ", ";
-                                   String exceptionString = "";
-                                   for (Exception exception : result.getExceptions()) {
-                                   exceptionString += exception.getLocalizedMessage()+separator;
-                               }
-                                   DeleteResultMessagingUtils.messageDialogWithDetails(result, "TaxonNode was successfully deleted, but related object(s) could not be deleted", TaxeditorNavigationPlugin.PLUGIN_ID);
-                               }
+               if(taxonNode != null && taxonNode instanceof TaxonNode){
+                       //((TaxonNode) treeNode).delete();
+
+                       element = ((TaxonNode)taxonNode).getTaxon();
+
+                       DeleteResult result = service.deleteTaxonNode((TaxonNode)taxonNode, config);
+                       if (result.isError() && !result.getExceptions().isEmpty()){
+
+                               DeleteResultMessagingUtils.messageDialogWithDetails(result, "TaxonNode could not be deleted.", TaxeditorNavigationPlugin.PLUGIN_ID);
+                       } else if (!result.getExceptions().isEmpty()){
+                               String separator = ", ";
+                           String exceptionString = "";
+                           for (Exception exception : result.getExceptions()) {
+                           exceptionString += exception.getLocalizedMessage()+separator;
+                       }
+                           DeleteResultMessagingUtils.messageDialogWithDetails(result, "TaxonNode was successfully deleted, but related object(s) could not be deleted", TaxeditorNavigationPlugin.PLUGIN_ID);
+                       }
 
 
-                       }else if(taxonNode != null && taxonNode instanceof Classification){
-                               Classification taxonomicTree = (Classification) taxonNode;
+               }else if(taxonNode != null && taxonNode instanceof Classification){
+                       Classification taxonomicTree = (Classification) taxonNode;
 
-                               DeleteResult result = CdmStore.getService(IClassificationService.class).delete(taxonomicTree.getUuid());
-                if (result.isError() && !result.getExceptions().isEmpty()){
-                    //TODO:Error message!
-                    DeleteResultMessagingUtils.messageDialogWithDetails(result, "TaxonNode could not be deleted.", TaxeditorNavigationPlugin.PLUGIN_ID);
-                }
+                       DeleteResult result = CdmStore.getService(IClassificationService.class).delete(taxonomicTree.getUuid());
+            if (result.isError() && !result.getExceptions().isEmpty()){
+                //TODO:Error message!
+                DeleteResultMessagingUtils.messageDialogWithDetails(result, "TaxonNode could not be deleted.", TaxeditorNavigationPlugin.PLUGIN_ID);
+            }
         } else {
             Set<UUID> treeNodeUuids = new HashSet<UUID>();
             ITaxonTreeNode entity = null;
index 830d572a4cb9088551fbeca75738c0cfdec9846b..eef8af10c273dad438d0a6265e88a86113949038 100644 (file)
@@ -84,7 +84,7 @@ public class MoveTaxonOperation extends AbstractPersistentPostOperation {
                bind();
                monitor.worked(20);
 
-               UpdateResult result = CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(this.taxonNodesUuid,newParentTreeNode.getUuid());
+               UpdateResult result = CdmStore.getService(ITaxonNodeService.class).moveTaxonNodes(this.taxonNodesUuid,newParentTreeNode.getUuid(), moveToParentNode);
 //             try {
 //                     for (TaxonNode taxonNode : taxonNodes){
 //                             TaxonNode newTaxonNode = newParentTreeNode.addChildNode(taxonNode,
index 65e5144786e02ec4063cc8ca92468a7910b2ee86..fca68db76daef3c4f9fabf1ed99af86a723e82cf 100644 (file)
@@ -32,7 +32,7 @@ public class RemotingMoveTaxonOperation extends RemotingCdmUpdateOperation {
 
     private final static String LABEL = "Move Taxon operation";
 
-    private Set<UUID> taxonNodesToMoveUuid;
+    private final Set<UUID> taxonNodesToMoveUuid;
     private final UUID newParentTreeNodeUuid;
     private final boolean moveToParentNode;
 
@@ -77,7 +77,7 @@ public class RemotingMoveTaxonOperation extends RemotingCdmUpdateOperation {
     @Override
     protected UpdateResult doUpdateExecute(IProgressMonitor monitor, IAdaptable info) throws Exception {
         return CdmApplicationState.getService(ITaxonNodeService.class).moveTaxonNodes(taxonNodesToMoveUuid,
-                newParentTreeNodeUuid);
+                newParentTreeNodeUuid, moveToParentNode);
     }
 
 }
index 9457d0969e75f394043336e778a4d343786473f0..1a8b2a88922cd8dbc50e1b18e5daec245bbc10a0 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 /**
 * Copyright (C) 2007 EDIT
-* European Distributed Institute of Taxonomy 
+* European Distributed Institute of Taxonomy
 * http://www.e-taxonomy.eu
-* 
+*
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * See LICENSE.TXT at the top of this package for the full license terms.
 */
@@ -12,7 +12,6 @@ package eu.etaxonomy.taxeditor.featuretree;
 
 import java.util.List;
 
-import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ListViewer;
@@ -33,10 +32,8 @@ import org.eclipse.swt.widgets.Text;
 
 import eu.etaxonomy.cdm.api.service.DeleteResult;
 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
-import eu.etaxonomy.cdm.api.service.exception.DataChangeNoRollbackException;
 import eu.etaxonomy.cdm.model.description.FeatureTree;
 import eu.etaxonomy.taxeditor.store.CdmStore;
-import eu.etaxonomy.taxeditor.store.StoreUtil;
 
 /**
  * <p>SelectFeatureTreeWizardPage class.</p>
@@ -61,7 +58,7 @@ public class SelectFeatureTreeWizardPage extends WizardPage implements ISelectio
                super(pageName);
                setMessage("Select a Feature Tree or create a new one.");
        }
-       
+
        /* (non-Javadoc)
         * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
         */
@@ -69,48 +66,48 @@ public class SelectFeatureTreeWizardPage extends WizardPage implements ISelectio
        @Override
        public void createControl(Composite parent) {
                Composite composite = new Composite(parent, SWT.NULL);
-               
+
                composite.setLayout(new GridLayout());
-               
+
                Composite composite_treeContent = new Composite(composite, SWT.NULL);
                composite_treeContent.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
                                true, true));
                composite_treeContent.setLayout(new GridLayout(2, false));
-               
+
                viewer = new ListViewer(composite_treeContent);
                viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-       
+
                button_remove = new Button(composite_treeContent, SWT.PUSH);
                button_remove.setText("Remove");
                button_remove.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
-               
+
                Composite composite_treeTitle = new Composite(composite, SWT.NULL);
                composite_treeTitle.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true,
                                false));
                composite_treeTitle.setLayout(new GridLayout(3, false));
 
-               
-               
+
+
                Label label_title = new Label(composite_treeTitle, SWT.NULL);
                label_title.setText("New Feature Tree");
 
                text_title = new Text(composite_treeTitle, SWT.NULL);
                text_title.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-               
+
                button_add = new Button(composite_treeTitle, SWT.PUSH);
                button_add.setText("Add");
-                               
+
                viewer.setContentProvider(new FeatureTreeContentProvider());
                viewer.setLabelProvider(new FeatureTreeLabelProvider());
-               
+
                viewer.addSelectionChangedListener(this);
-               
+
                text_title.addModifyListener(this);
                button_add.addSelectionListener(new AddButtonSelectionListener());
                button_remove.addSelectionListener(new RemoveButtonSelectionListener());
-               
+
                List<FeatureTree> input = CdmStore.getService(IFeatureTreeService.class).list(FeatureTree.class, null, null, null, null);
-               
+
                viewer.setInput(input);
                modifyText(null);
                setControl(composite);
@@ -120,15 +117,15 @@ public class SelectFeatureTreeWizardPage extends WizardPage implements ISelectio
        @Override
        public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                       
+
                if(selection.size() == 1){
                        FeatureTree selectedFeatureTree = (FeatureTree) selection.getFirstElement();
                        ((FeatureTreeEditorWizard) getWizard()).setSelectedFeatureTree(selectedFeatureTree);
-                       
+
                }
-               
+
                setPageComplete(true);
-               
+
                button_remove.setEnabled(selection.size() >= 1);
        }
 
@@ -137,36 +134,42 @@ public class SelectFeatureTreeWizardPage extends WizardPage implements ISelectio
        public boolean canFlipToNextPage() {
                return ((IStructuredSelection) viewer.getSelection()).size() == 1;
        }
-       
+
        /** {@inheritDoc} */
        @Override
        public void modifyText(ModifyEvent e) {
                button_add.setEnabled(! text_title.getText().isEmpty());
        }
-       
+
        private class AddButtonSelectionListener extends SelectionAdapter {
-               public void widgetSelected(SelectionEvent e) {
+               @Override
+        public void widgetSelected(SelectionEvent e) {
                        FeatureTree featureTree = FeatureTree.NewInstance();
                        featureTree.setTitleCache(text_title.getText(), true);
-                       
+
                        viewer.add(featureTree);
-                       CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(featureTree);
+                       if(CdmStore.getCurrentSessionManager().isRemoting()) {
+                CdmStore.getService(IFeatureTreeService.class).merge(featureTree);
+                       } else {
+                           CdmStore.getService(IFeatureTreeService.class).saveOrUpdate(featureTree);
+                       }
                        text_title.setText("");
                        viewer.setSelection(new StructuredSelection(featureTree));
-                       
+
                }
        }
-       
+
        private class RemoveButtonSelectionListener extends SelectionAdapter {
-               public void widgetSelected(SelectionEvent e) {
+               @Override
+        public void widgetSelected(SelectionEvent e) {
                        IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
                        for(Object element : selection.toArray()){
                                viewer.remove(element);
-                               
-                               DeleteResult result =   CdmStore.getService(IFeatureTreeService.class).delete((FeatureTree) element);
-                               
+
+                               DeleteResult result =   CdmStore.getService(IFeatureTreeService.class).delete(((FeatureTree) element).getUuid());
+
                                if (result.isError()){
-                                       
+
                                }
                                viewer.setSelection(new StructuredSelection(new Object[0]));
                        }
index 8e46d480601319bcaf27e881dd2c62dcd9a25e33..55854c6bf00fafdd3f4592ed4b73239e3c3e81db 100644 (file)
@@ -57,7 +57,8 @@ public class DeleteResultMessagingUtils extends MessagingUtils {
             while (objects.hasNext()){
                 CdmBase object = objects.next();
                 if (object instanceof IdentifiableEntity){
-                    relatedObjects.add("[" + object.getClass().getSimpleName() + "] " +((IdentifiableEntity)object).getTitleCache() );
+
+                    relatedObjects.add(((IdentifiableEntity)object).getTitleCache() );
                 } else{
                     relatedObjects.add(object.getUserFriendlyTypeName());
                 }
@@ -67,7 +68,7 @@ public class DeleteResultMessagingUtils extends MessagingUtils {
             for (String relatedObject: relatedObjects){
 
                 relatedObjectsString.append(relatedObject);
-                relatedObjectsString.append("\n");
+                relatedObjectsString.append(System.lineSeparator());
             }
         }
         message = message + "\n" ;
index 1189402b1c1e3793d27b491175161d479f3fdb37..1c5ea07fb1c2b24d73808622d96bf23021983c30 100644 (file)
@@ -58,6 +58,7 @@ public class NewDerivedUnitBaseWizard extends AbstractNewEntityWizard<SpecimenOr
 
     public NewDerivedUnitBaseWizard() {
         super();
+        CdmStore.getCurrentSessionManager().bindNullSession();
     }
 
     public NewDerivedUnitBaseWizard(SpecimenOrObservationType specOrObsType) {
@@ -170,6 +171,7 @@ public class NewDerivedUnitBaseWizard extends AbstractNewEntityWizard<SpecimenOr
                 MessagingUtils.error(NewDerivedUnitBaseWizard.class, e);
             }
         }
+
         return performFinish;
     }
 
index 901a5b91f01cc02d650e8755f00086126abc6102..d15037da2018708b498b91c25109a4e8d8ded848 100644 (file)
@@ -104,7 +104,7 @@ public class LanguageRepresentationPreferencePage extends PreferencePage impleme
                        @Override
                        public void widgetSelected(SelectionEvent e) {
                                int selectionIndex = combo_globalLanguage.getSelectionIndex();
-                               globalLanguage = Language.getLanguageByLabel(combo_globalLanguage.getItem(selectionIndex));
+                               globalLanguage = CdmStore.getCurrentApplicationConfiguration().getTermService().getLanguageByLabel(combo_globalLanguage.getItem(selectionIndex));
                        }
                });
        }
index 79f06e52435f2816aad730342610f69f7ee5a336..04f2d13d0f9b815556e2e074fa9e51a2bd27eb79 100644 (file)
@@ -68,6 +68,7 @@ public class LoginManager extends Observable implements IConversationEnabled, IC
                doAuthenticate(username, password);
            } catch (CdmAuthenticationException e) {
                MessagingUtils.warningDialog("Could not authenticate", this, e.getMessage());
+               return false;
         }
            return true;
        }
index 9d56c4da20b24f83f9f42584aad443c123ce5b97..bddb7a0f34ae25778b6189847a83ce8fa862b74d 100644 (file)
@@ -9,10 +9,13 @@
  */
 package eu.etaxonomy.taxeditor.ui.dialog;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang.StringUtils;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
@@ -44,6 +47,8 @@ import org.eclipse.wb.swt.SWTResourceManager;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
 
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
+import eu.etaxonomy.cdm.model.metadata.CdmMetaData;
 import eu.etaxonomy.taxeditor.model.MessagingUtils;
 import eu.etaxonomy.taxeditor.remoting.server.CDMServerException;
 import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;
@@ -76,6 +81,11 @@ public class RemotingLoginDialog extends Dialog {
     private final static String STATUS_NO_INSTANCES = "No Instances Found";
     private final static String STATUS_ERROR = "Error";
     private final static String STATUS_REMOTING_NOT_ACTIVATED = "Remoting not activated";
+    private final static String STATUS_NOT_COMPATIBLE = "Not Compatible";
+
+    private final static String MESG_COMPATIBLE_EDITOR_OLD = "Please update the Taxonomic Editor (Help->Check for Updates) or choose a compatible cdm-server";
+    private final static String MESG_COMPATIBLE_SERVER_OLD = "Please choose a compatible cdm-server or update the chosen cdm-server";
+
     private final static String STORE_PREFERENCES_NODE = "eu.etaxonomy.taxeditor.store";
 
     private final static String LOGIN_NODE = "login";
@@ -108,7 +118,7 @@ public class RemotingLoginDialog extends Dialog {
 
     private final int MIN_WIDTH = 530;
     private final int MIN_HEIGHT = 220;
-    private final int MIN_EXP_HEIGHT = 350;
+    private final int MIN_EXP_HEIGHT = 380;
     private final int MESSAGE_HEIGHT = 25;
     private Label lblEditorVersion;
     private Text txtEditorVersion;
@@ -163,6 +173,7 @@ public class RemotingLoginDialog extends Dialog {
             readPrefLastServerInstance();
         }
 
+        setEditorInfo();
         populateCdmServerCombo();
         shlConnect.open();
         shlConnect.layout();
@@ -385,11 +396,10 @@ public class RemotingLoginDialog extends Dialog {
 
         lblServerVersion = new Label(compAdvanced, SWT.CENTER);
         lblServerVersion.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblServerVersion.setText("Server Version :");
+        lblServerVersion.setText("Server Cdmlib Version :");
         lblServerVersion.setFont(SWTResourceManager.getFont("Ubuntu", 9, SWT.NORMAL));
 
         txtServerVersion = new Text(compAdvanced, SWT.BORDER);
-        txtServerVersion.setEnabled(false);
         txtServerVersion.setEditable(false);
         txtServerVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
         new Label(compAdvanced, SWT.NONE);
@@ -397,11 +407,10 @@ public class RemotingLoginDialog extends Dialog {
 
         lblEditorVersion = new Label(compAdvanced, SWT.CENTER);
         lblEditorVersion.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
-        lblEditorVersion.setText("Editor Version :");
+        lblEditorVersion.setText("Editor Cdmlib Version :");
         lblEditorVersion.setFont(SWTResourceManager.getFont("Ubuntu", 9, SWT.NORMAL));
 
         txtEditorVersion = new Text(compAdvanced, SWT.BORDER);
-        txtEditorVersion.setEnabled(false);
         txtEditorVersion.setEditable(false);
         txtEditorVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
         new Label(compAdvanced, SWT.NONE);
@@ -413,7 +422,6 @@ public class RemotingLoginDialog extends Dialog {
         lblServerCDMVersion.setFont(SWTResourceManager.getFont("Ubuntu", 9, SWT.NORMAL));
 
         txtServerCDMVersion = new Text(compAdvanced, SWT.BORDER);
-        txtServerCDMVersion.setEnabled(false);
         txtServerCDMVersion.setEditable(false);
         txtServerCDMVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
         new Label(compAdvanced, SWT.NONE);
@@ -425,7 +433,6 @@ public class RemotingLoginDialog extends Dialog {
         lblEditorCDMVersion.setFont(SWTResourceManager.getFont("Ubuntu", 9, SWT.NORMAL));
 
         txtEditorCDMVersion = new Text(compAdvanced, SWT.BORDER);
-        txtEditorCDMVersion.setEnabled(false);
         txtEditorCDMVersion.setEditable(false);
         txtEditorCDMVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
 
@@ -511,9 +518,7 @@ public class RemotingLoginDialog extends Dialog {
 
     private void checkSelectedCdmServer() {
 
-        txtCdmInstanceStatus.setText("");
-        txtPort.setEditable(false);
-        txtPort.setEnabled(false);
+        clearOnServerChange();
         emptyCredentials();
 
         if(selectedCsii != null) {
@@ -524,6 +529,8 @@ public class RemotingLoginDialog extends Dialog {
             if(selectedCsii.pingServer()) {
                 txtCdmServerStatus.setText(STATUS_AVAILABLE);
                 populateCdmInstanceCombo(true);
+                txtServerVersion.setText(selectedCsii.getCdmlibServicesVersion());
+                txtServerVersion.setToolTipText(generateLastModifiedTooltip(selectedCsii.getCdmlibLastModified()));
 
             } else {
                 txtCdmServerStatus.setText(STATUS_NOT_AVAILABLE);
@@ -538,6 +545,7 @@ public class RemotingLoginDialog extends Dialog {
         comboCdmInstance.setEnabled(false);
         btnConnect.setEnabled(false);
         txtCdmInstanceStatus.setText(STATUS_RETRIEVING);
+        txtCdmInstanceStatus.setToolTipText("");
 
         Job job = new Job("Retrieve Server Instances") {
             @Override
@@ -579,12 +587,13 @@ public class RemotingLoginDialog extends Dialog {
                             }
                         });
                     }
-                } catch (CDMServerException e) {
+                } catch (final CDMServerException e) {
                     MessagingUtils.warn(getClass(), e);
                     Display.getDefault().asyncExec(new Runnable() {
                         @Override
                         public void run() {
-                            txtCdmInstanceStatus.setText(STATUS_REMOTING_NOT_ACTIVATED);
+                            txtCdmInstanceStatus.setText(STATUS_NOT_AVAILABLE);
+                            txtCdmInstanceStatus.setToolTipText(e.getMessage());
                             comboCdmInstance.setEnabled(false);
                             btnConnect.setEnabled(false);
                         }
@@ -603,6 +612,7 @@ public class RemotingLoginDialog extends Dialog {
 
     private void refreshCdmInstance() {
         txtCdmInstanceStatus.setText(STATUS_CHECKING_AVAILABILITY);
+        clearOnInstanceChange();
         updateSelectedCdmInstance();
         checkSelectedCdmInstance();
     }
@@ -618,19 +628,52 @@ public class RemotingLoginDialog extends Dialog {
     }
 
     private void checkSelectedCdmInstance() {
+        boolean available = false;
+        String status = STATUS_NOT_AVAILABLE;
+        String message = null;
+
         if(txtCdmServerStatus.getText().equals(STATUS_AVAILABLE)) {
             try {
                 if(selectedCsii.pingInstance(selectedCdmInstance, getPort())) {
-                    txtCdmInstanceStatus.setText(STATUS_AVAILABLE);
-                    btnConnect.setEnabled(true);
+                    status = STATUS_AVAILABLE;
+                    available = true;
                 } else {
-                    txtCdmInstanceStatus.setText(STATUS_NOT_AVAILABLE);
-                    btnConnect.setEnabled(false);
+                    status = STATUS_NOT_AVAILABLE;
+                    available = false;
+                }
+
+                if(available) {
+                    txtServerCDMVersion.setText(selectedCsii.getCdmRemoteSource(selectedCdmInstance, getPort()).getDbSchemaVersion());
+                    int compareDbSchemaVersion = selectedCsii.compareDbSchemaVersion(selectedCdmInstance, getPort());
+                    int compareCdmlibServicesVersion = selectedCsii.compareCdmlibServicesVersion();
+
+                    if(compareDbSchemaVersion > 0 || compareCdmlibServicesVersion > 0) {
+                        status =  STATUS_NOT_COMPATIBLE;
+                        available = false;
+                        message = MESG_COMPATIBLE_EDITOR_OLD;
+                    } else if(compareDbSchemaVersion < 0 || compareCdmlibServicesVersion < 0) {
+                        status = STATUS_NOT_COMPATIBLE;
+                        available = false;
+                        message = MESG_COMPATIBLE_SERVER_OLD;
+                    } else {
+                        status =  STATUS_AVAILABLE;
+                        available = true;
+                        message = "";
+                    }
+
+
                 }
+
             } catch (Exception e) {
-                txtCdmInstanceStatus.setText(STATUS_NOT_AVAILABLE);
                 txtCdmInstanceStatus.setToolTipText(e.getMessage());
+            } finally {
+                btnConnect.setEnabled(available);
+                txtCdmInstanceStatus.setText(status);
+                if(!StringUtils.isBlank(message)) {
+                    setMessage(message);
+                }
             }
+
         }
 
     }
@@ -751,18 +794,25 @@ public class RemotingLoginDialog extends Dialog {
             styledTxtMessage.setText(message);
             styledTxtMessage.setVisible(true);
             ((GridData)styledTxtMessage.getLayoutData()).exclude = false;
-            shlConnect.setSize(MIN_WIDTH, MIN_HEIGHT+MESSAGE_HEIGHT);
-            shlConnect.setMinimumSize(MIN_WIDTH, MIN_HEIGHT+MESSAGE_HEIGHT);
+            shlConnect.setSize(MIN_WIDTH, getHeightWithoutMessage() + MESSAGE_HEIGHT);
+            shlConnect.setMinimumSize(MIN_WIDTH, getHeightWithoutMessage() + MESSAGE_HEIGHT);
         } else {
             styledTxtMessage.setText("");
             styledTxtMessage.setVisible(false);
             ((GridData)styledTxtMessage.getLayoutData()).exclude = true;
-            shlConnect.setSize(MIN_WIDTH, MIN_HEIGHT);
-            shlConnect.setMinimumSize(MIN_WIDTH, MIN_HEIGHT);
+            shlConnect.setSize(MIN_WIDTH, getHeightWithoutMessage());
+            shlConnect.setMinimumSize(MIN_WIDTH, getHeightWithoutMessage());
         }
         remotingComposite.layout();
     }
 
+    private int getHeightWithoutMessage() {
+        if(xpndblcmpstAdvanced.isExpanded()) {
+            return MIN_EXP_HEIGHT;
+        } else {
+            return MIN_HEIGHT;
+        }
+    }
 
 
     public void hide(boolean isHidden) {
@@ -790,4 +840,41 @@ public class RemotingLoginDialog extends Dialog {
             }
         });
     }
+
+    private String generateLastModifiedTooltip(String cdmlibLastModified) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss z");
+        Date cdmlibLastModifiedDate;
+        String cdmlibLastModifiedTimestamp = "";
+
+        cdmlibLastModifiedDate = new Date(Long.valueOf(cdmlibLastModified));
+        cdmlibLastModifiedTimestamp = sdf.format(cdmlibLastModifiedDate);
+
+        return "last modified : " + cdmlibLastModifiedTimestamp;
+    }
+
+    private void setEditorInfo() {
+        txtEditorCDMVersion.setText(CdmMetaData.getDbSchemaVersion());
+        txtEditorVersion.setText(CdmApplicationState.getCdmlibVersion());
+        txtEditorVersion.setToolTipText(generateLastModifiedTooltip(CdmApplicationState.getCdmlibLastModified()));
+    }
+
+    private void clearOnServerChange() {
+        setMessage("");
+        txtServerCDMVersion.setText("");
+        txtServerVersion.setText("");
+        txtServerVersion.setToolTipText("");
+        txtServerCDMVersion.setText("");
+        txtPort.setEditable(false);
+        txtPort.setEnabled(false);
+    }
+
+    private void clearOnInstanceChange() {
+        setMessage("");
+        txtServerCDMVersion.setText("");
+    }
+
+    private void updateOnServerChange(String serverVersion, String serverVersionTooltip) {
+
+    }
+
 }
index 8bfa50dd67f542f256411f7858a241e01b48bfef..fba0ce6c3ee5ad90283aaea259c60e6070a82ad0 100644 (file)
@@ -91,7 +91,7 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
                this.settings = settings;
 
                this.conversation = conversation;
-
+               this.cdmBaseToBeFiltered = cdmObject;
                Cursor cursor = shell.getCursor();
                shell.setCursor(shell.getDisplay().getSystemCursor(SWT.CURSOR_WAIT));
                init();
@@ -223,7 +223,7 @@ public abstract class AbstractFilteredCdmResourceSelectionDialog<T extends ICdmB
        /** {@inheritDoc} */
        @Override
        public void refresh() {
-               //initModel();
+               initModel();
                filterExcludedObjects();
                super.refresh();
        }
index 4444f18f585cfc20875dc89a724e0755f229a6c9..c7f7d4a76186bae01c99189431258f728c03a9be 100644 (file)
@@ -28,6 +28,7 @@ import eu.etaxonomy.cdm.api.conversation.ConversationHolder;
 import eu.etaxonomy.cdm.api.service.IVocabularyService;
 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
+import eu.etaxonomy.cdm.model.common.TermType;
 import eu.etaxonomy.cdm.model.common.TermVocabulary;
 import eu.etaxonomy.cdm.model.location.Country;
 import eu.etaxonomy.cdm.model.location.NamedArea;
@@ -65,7 +66,7 @@ public class NamedAreaSelectionDialog extends
                }
        }
 
-       private Collection<TermVocabulary<NamedArea>> selectedVocabularies;
+       private Collection<TermVocabulary> selectedVocabularies;
     private ArrayList<TermVocabulary> preselectedVocabularies;
 
 
@@ -134,9 +135,8 @@ public class NamedAreaSelectionDialog extends
                selectedVocabularies = getAvailableVocabularies();
        }
 
-       private List<TermVocabulary<NamedArea>> getAvailableVocabularies(){
-               List<TermVocabulary<NamedArea>> vocabularies = CdmStore.getService(IVocabularyService.class).listByTermClass(NamedArea.class, null, null, null, null);
-               vocabularies.add(CdmStore.getService(IVocabularyService.class).find(Country.uuidCountryVocabulary));
+       private List<TermVocabulary> getAvailableVocabularies(){
+               List<TermVocabulary> vocabularies = CdmStore.getService(IVocabularyService.class).listByTermType(TermType.NamedArea, true, null, null, null, null);
                return vocabularies;
        }
 
index 24f6125eb59ee0f239bb50680f3930db4c7b9634..821fc8c5bd8377e720cf0f043061a73f9a1e1d0d 100644 (file)
@@ -49,6 +49,7 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
        private List<Classification> classifications;
 
        private Classification selectedClassification;
+       private final List<UUID> excludeTaxa;
 
        protected TaxonNodeSelectionDialog(Shell shell, ConversationHolder conversation, String title, List<UUID> excludeTaxa, boolean multi, TaxonNode node, Classification classification) {
                super(shell, conversation, title, multi, TaxonNodeSelectionDialog.class.getCanonicalName(), node);
@@ -57,10 +58,11 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
 
                setListLabelProvider(labelProvider);
                setDetailsLabelProvider(labelProvider);
-
+               this.excludeTaxa = excludeTaxa;
                if(classification != null){
                        selectedClassification = classification;
                }
+               initModel();
        }
 
        /** {@inheritDoc} */
@@ -134,10 +136,14 @@ public class TaxonNodeSelectionDialog extends AbstractFilteredCdmResourceSelecti
                     return o1.getTitleCache().compareTo(o2.getTitleCache());
                 }
             });
-                       selectedClassification = classifications.iterator().next();
+                       if (this.cdmBaseToBeFiltered == null){
+                           selectedClassification = classifications.iterator().next();
+                       } else {
+                           selectedClassification = this.cdmBaseToBeFiltered.getClassification();
+                       }
                }
 
-               model = CdmStore.getService(IClassificationService.class).getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(selectedClassification);
+               model = CdmStore.getService(IClassificationService.class).getTaxonNodeUuidAndTitleCacheOfAcceptedTaxaByClassification(selectedClassification, excludeTaxa);
        }
 
        /** {@inheritDoc} */
index 4c4578719796d02838d45ea76fde4f4d018e27e1..7f040a8680ade1770d7d2e0efcbd235db569e885 100644 (file)
@@ -214,8 +214,9 @@ public class MultilanguageTextElement extends AbstractCdmFormElement implements
                                                                .getDefaultLanguage() }));
 
                element_languageString.setLanguageString(preferredLanguageString);
+
                if (PreferencesUtil.isMultilanguageTextEditingCapability()) {
-                       combo_language.setSelection(preferredLanguageString.getLanguage());
+                       combo_language.setSelection(preferredLanguageString == null?CdmStore.getDefaultLanguage():preferredLanguageString.getLanguage());
                        button.setEnabled(true);
                }
        }
index 3dbe100ef6134198a5933bbfcbff633414377f34..177a16a917db82ccab6e70126f11b7a7f0c3679b 100644 (file)
@@ -73,6 +73,7 @@ public class PasswordWizard extends Wizard implements IConversationEnabled{
                            // change others passwords
                            CdmStore.getService(IUserService.class).changePasswordForUser(user.getUsername(), passwordPage.getNewPassword());
                        }
+                       CdmStore.getService(IUserService.class).loadWithUpdate(user.getUuid());
                    internalConversation.commit(false);
                    internalConversation.unbind();
                    internalConversation.close();
@@ -82,7 +83,7 @@ public class PasswordWizard extends Wizard implements IConversationEnabled{
                        return false;
                }catch (AuthenticationException e){
                        MessagingUtils.warningDialog("Could not change password", this, "The old password is not correct.");
-               
+
                        return false;
                }catch(Exception e){
                        MessagingUtils.warningDialog("Problem with changing password", this, "The password could not be changed. " + e.getMessage());
index 31af3b5e3df834de493588786494558755e976d3..037e7c75b273fab57cb75a446d55be2c28fe7008 100644 (file)
@@ -95,9 +95,7 @@ public class TaxonNodeDetailElement extends AbstractCdmDetailElement<ITaxonTreeN
                selection_parentTaxonNode = formFactory
                                .createTaxonNodeSelectionElement(getConversationHolder(), formElement, "Parent", null,
                                                EntitySelectionElement.DELETABLE, style);
-               selection_SecRef = formFactory
-                               .createSelectionElement(Reference.class,getConversationHolder(), formElement, "Secundum Reference", null,
-                                               EntitySelectionElement.DELETABLE, style);
+
                selection_reuseExistingTaxon = formFactory
                                .createSelectionElement(Taxon.class,
                                                getConversationHolder(), formElement,
@@ -109,7 +107,9 @@ public class TaxonNodeDetailElement extends AbstractCdmDetailElement<ITaxonTreeN
                                                getConversationHolder(), formElement,
                                                "Reuse existing name", null,
                                                EntitySelectionElement.DELETABLE, style);
-
+               selection_SecRef = formFactory
+                .createSelectionElement(Reference.class,getConversationHolder(), formElement, "Secundum Reference", null,
+                        EntitySelectionElement.DELETABLE, style);
                textNewTaxonName = formFactory.createTextWithLabelElement(formElement,
                                "New Taxon", "", style);
                textNewTaxonName.setFocus();
@@ -241,12 +241,14 @@ public class TaxonNodeDetailElement extends AbstractCdmDetailElement<ITaxonTreeN
                        selection_classification.setEntity(classification);
                        selection_parentTaxonNode.setEntity(null);
                        selection_parentTaxonNode.setClassification(classification);
+                       selection_SecRef.setEntity(classification.getReference());
                } else if (parentTreeNode instanceof TaxonNode) {
                        classification = (Classification) HibernateProxyHelper
                                        .deproxy(((TaxonNode) parentTreeNode).getClassification());
                        selection_classification.setEntity(classification);
                        selection_parentTaxonNode.setEntity((TaxonNode) parentTreeNode);
                        selection_parentTaxonNode.setClassification(classification);
+                       selection_SecRef.setEntity(((TaxonNode)parentTreeNode).getTaxon().getSec());
                } else if(parentTreeNode == null){
                        this.parentTreeNode = selection_classification.getEntity();
                }
@@ -260,7 +262,7 @@ public class TaxonNodeDetailElement extends AbstractCdmDetailElement<ITaxonTreeN
        private void setTaxon(Taxon taxon) {
                this.taxon = taxon;
                textNewTaxonName.setText(taxon.getName().getTitleCache());
-               this.secReference = taxon.getSec();
+               selection_SecRef.setEntity(taxon.getSec());
        }
 
        private void setTaxon(String taxonNameString) {
@@ -274,17 +276,19 @@ public class TaxonNodeDetailElement extends AbstractCdmDetailElement<ITaxonTreeN
                if (getParentTreeNode() != null) {
                        if (this.secReference != null){
                                secundum = this.secReference;
-                       } else if (getParentTreeNode() instanceof Classification) {
+                       } /*else if (getParentTreeNode() instanceof Classification) {
                                secundum = ((Classification) getParentTreeNode())
                                                .getReference();
                        } else if (getParentTreeNode() instanceof TaxonNode) {
                                secundum = ((TaxonNode) getParentTreeNode()).getTaxon()
                                                .getSec();
-                       }
+                       }*/
                }
                if (taxonName != null){
                    taxon = Taxon.NewInstance(taxonName, secundum);
-                   textNewTaxonName.setText(taxonName.getTitleCache());
+                   if (!taxonName.getTitleCache().trim().equals(textNewTaxonName.getText().trim())){
+                       textNewTaxonName.setText(taxonName.getTitleCache());
+                   }
                } else {
                    textNewTaxonName.setText(null);
                }
index e3021facf203f57fbf358539619f00bdf82624d9..138a0e760e1fd26c56f20604fa18269b58ea021a 100644 (file)
@@ -108,10 +108,14 @@ public class FeatureDistributionDetailElement extends AbstractCdmDetailElement<F
                // FIXME due to a bug in the rest map service we have to ensure that width will always be an even number
                // image.calculateWidth() % 2 == 1 ? image.calculateWidth() + 1 :
                int width = image.calculateWidth();
-
+                IEditGeoService editGeoService;
                List<Language> languages = Arrays.asList(new Language[]{CdmStore.getDefaultLanguage()});
-
-               IEditGeoService editGeoService = ((CdmApplicationRemoteConfiguration)CdmStore.getCurrentApplicationConfiguration()).getEditGeoService();
+               if(CdmStore.getCurrentApplicationConfiguration() instanceof CdmApplicationRemoteConfiguration) {
+                   editGeoService = ((CdmApplicationRemoteConfiguration)CdmStore.getCurrentApplicationConfiguration()).getEditGeoService();
+               }else{
+                   editGeoService =(IEditGeoService) CdmStore.getCurrentApplicationConfiguration().getBean(
+                       "editGeoService");
+               }
                String parameter = editGeoService.getDistributionServiceRequestParameterString(
                                getTaxonDescriptions(),
                 false,
index 9bc9a078c570bafa95cb4db4029dd0f06f84acf7..6981bc6617d6a0abdd90340f6582446c194f74d9 100644 (file)
@@ -107,7 +107,7 @@ public class PolytomousKeyNodeDetailElement extends
                if (eventSource == element_question) {
                        getEntity().getParent().setQuestion(element_question.updateKeyStatement(getEntity().getQuestion()));
                } else if (eventSource == element_statement) {
-                   getEntity().getParent().setStatement(element_statement.updateKeyStatement(getEntity().getStatement()));
+                   getEntity().setStatement(element_statement.updateKeyStatement(getEntity().getStatement()));
                } else if (eventSource == selection_feature) {
                        getEntity().getParent().setFeature(selection_feature.getEntity());
                } else if (eventSource == selection_taxon) {
index bbc3a44ab87fb3db18312d94daf1d2313901df55..9661e045877c5354ac46bcd0b59840678b1dbfa0 100644 (file)
@@ -58,7 +58,7 @@ public class NonViralNameDetailElement extends
                toggleable_cache.setVisible(false);
                combo_nomenclaturalCode.setVisible(false);
            }
-
+           textLsid = formFactory.createLsidWithExceptionLabelElement(formElement, "Lsid", entity.getLsid(), style);
            section_name = formFactory.createNameDetailSection(getConversationHolder(), formElement, null, ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
            section_name.setLayoutData(LayoutConstants.FILL_HORIZONTALLY(2, 1));
            addControl(section_name);
@@ -76,7 +76,7 @@ public class NonViralNameDetailElement extends
                addElement(section_hybrid);
            }
 
-           textLsid = formFactory.createLsidWithExceptionLabelElement(formElement, "Lsid", entity.getLsid(), style);
+
     }
 
        /** {@inheritDoc} */
index 43f4be96cd91cb907228c85614b45033be0d7e27..db2f094f854769ecb380955f86a17b32bcc5a5d8 100644 (file)
@@ -84,9 +84,8 @@ public class CdmClientCachingTest extends RemotingSessionAwareTest {
        // in a recursive call
         PolytomousKey pkey1 = CdmBase.deproxy(polytomousKeyService.load(polytomousKeyUuid, PKEY_DEPTH1_INIT_STRATEGY),PolytomousKey.class);
 
-
         // checking to make sure the root object is in the session cache
-        Assert.assertSame(pkey1.getRoot(), cacher.getFromCache(pkey1.getRoot()));
+        Assert.assertSame(CdmBase.deproxy(pkey1.getRoot(),PolytomousKeyNode.class), cacher.getFromCache(pkey1.getRoot()));
 
     }
 
@@ -103,9 +102,9 @@ public class CdmClientCachingTest extends RemotingSessionAwareTest {
         PolytomousKey pkey = CdmBase.deproxy(polytomousKeyService.load(polytomousKeyUuid, PKEY_DEPTH2_INIT_STRATEGY),PolytomousKey.class);
         CdmTransientEntityCacher cacher = getCacher(sessionOwner);
         // checking to make sure the root object is in the session cache
-        Assert.assertSame(pkey.getRoot(), cacher.getFromCache(pkey.getRoot()));
-        Assert.assertSame(pkey.getRoot().getStatement(), cacher.getFromCache(pkey.getRoot().getStatement()));
-        Assert.assertSame(pkey.getRoot().getQuestion(), cacher.getFromCache(pkey.getRoot().getQuestion()));
+        Assert.assertSame(CdmBase.deproxy(pkey.getRoot(),PolytomousKeyNode.class), cacher.getFromCache(pkey.getRoot()));
+        Assert.assertSame(CdmBase.deproxy(pkey.getRoot().getStatement(),KeyStatement.class), cacher.getFromCache(pkey.getRoot().getStatement()));
+        Assert.assertSame(CdmBase.deproxy(pkey.getRoot().getQuestion(),KeyStatement.class), cacher.getFromCache(pkey.getRoot().getQuestion()));
 
     }
 
@@ -172,7 +171,7 @@ public class CdmClientCachingTest extends RemotingSessionAwareTest {
        //              |- statement : KeyStatement
         PolytomousKey pkey1 = CdmBase.deproxy(polytomousKeyService.load(polytomousKeyUuid, PKEY_DEPTH2_INIT_STRATEGY),PolytomousKey.class);
         KeyStatement ks1 = pkey1.getRoot().getStatement();
-        Assert.assertSame(cacher.getFromCache(pkey1.getRoot().getStatement()), pkey1.getRoot().getStatement());
+        Assert.assertSame(ks1, pkey1.getRoot().getStatement());
         CdmTransientEntityCacher cacher = getCacher(sessionOwner);
 
        // this call will load into the session cache the graph and update the objects in the sub-graph for a
@@ -206,7 +205,7 @@ public class CdmClientCachingTest extends RemotingSessionAwareTest {
         // that it exists in the cache and
         // that both the original object and the
         // cached object are the same
-        Assert.assertNotNull(pkey1.getRoot().getStatement());
+        Assert.assertNotNull(CdmBase.deproxy(pkey1.getRoot().getStatement(), KeyStatement.class));
         Assert.assertNotNull(cacher.getFromCache(pkey1.getRoot().getStatement()));
 
        // this call will load into the session cache the graph and update the objects in the sub-graph for a
@@ -257,8 +256,8 @@ public class CdmClientCachingTest extends RemotingSessionAwareTest {
        PolytomousKey pkey2 = CdmBase.deproxy(polytomousKeyService.load(polytomousKeyUuid, PKEY_DEPTH2_INIT_STRATEGY),PolytomousKey.class);
 
 
-       Assert.assertSame(pkey2.getRoot().getStatement(), cacher.getFromCache(pkey2.getRoot().getStatement(), KeyStatement.class));
-       Assert.assertSame(st, pkey2.getRoot().getStatement());
+       Assert.assertSame(CdmBase.deproxy(pkey2.getRoot().getStatement(), KeyStatement.class), cacher.getFromCache(pkey2.getRoot().getStatement(), KeyStatement.class));
+       Assert.assertSame(st, CdmBase.deproxy(pkey2.getRoot().getStatement(), KeyStatement.class));
        Assert.assertSame(cacher.getFromCache(st), cacher.getFromCache(pkey2.getRoot().getStatement(), KeyStatement.class));
     }
 
index 57aa4c41019b5c591529a779c59c5b7ce835652a..77fc90f0c62a1d8358dcab51a69af5e7df339fc6 100644 (file)
@@ -193,11 +193,18 @@ public class TaxonNameEditorTest extends BaseOperationTest {
         Taxon grandChildTaxon = Taxon.NewInstance(null, null);
         TaxonNode grandChildTaxonNode = childTaxonNode.addChildTaxon(grandChildTaxon, null, null);
 
-        CdmStore.getService(ITaxonNodeService.class).merge(taxonNode, true);
+        CdmStore.getService(ITaxonNodeService.class).merge(taxonNode,true);
 
         Assert.assertEquals(taxonNode.getChildNodes().get(0).getId(), childTaxonNode.getId());
+
+        Assert.assertTrue(childTaxonNode.treeIndex() != null);
+        Assert.assertEquals(taxonNode.getChildNodes().get(0).treeIndex(), childTaxonNode.treeIndex());
+        Assert.assertFalse(childTaxon.getId() == 0);
         Assert.assertEquals(taxonNode.getChildNodes().get(0).getTaxon().getId(), childTaxon.getId());
+
+        Assert.assertTrue(grandChildTaxonNode.treeIndex() != null);
         Assert.assertEquals(taxonNode.getChildNodes().get(0).getChildNodes().get(0).getId(), grandChildTaxonNode.getId());
+        Assert.assertFalse(grandChildTaxon.getId() == 0);
         Assert.assertEquals(taxonNode.getChildNodes().get(0).getChildNodes().get(0).getTaxon().getId(), grandChildTaxon.getId());
     }
 
diff --git a/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmApplicationStateTest.java b/eu.etaxonomy.taxeditor.test/src/test/java/eu/etaxonomy/taxeditor/session/CdmApplicationStateTest.java
new file mode 100644 (file)
index 0000000..f09d37a
--- /dev/null
@@ -0,0 +1,31 @@
+// $Id$
+/**
+* Copyright (C) 2015 EDIT
+* European Distributed Institute of Taxonomy
+* http://www.e-taxonomy.eu
+*
+* The contents of this file are subject to the Mozilla Public License Version 1.1
+* See LICENSE.TXT at the top of this package for the full license terms.
+*/
+package eu.etaxonomy.taxeditor.session;
+
+import org.junit.Test;
+import org.springframework.util.Assert;
+import org.unitils.UnitilsJUnit4;
+
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
+
+/**
+ * @author cmathew
+ * @date 5 Oct 2015
+ *
+ */
+public class CdmApplicationStateTest extends UnitilsJUnit4 {
+
+    @Test
+    public void testCdmlibManifestInfoUpdate() {
+        CdmApplicationState.updateCdmlibManifestInfo();
+        Assert.notNull(CdmApplicationState.getCdmlibVersion());
+        Assert.notNull(CdmApplicationState.getCdmlibLastModified());
+    }
+}
index 82b9e94d13020b096b20972adfc1a2e33b1cf565..ed9579b1dbeb9e1a9bcf2c284472889b5ffef97c 100644 (file)
@@ -175,12 +175,12 @@ public class CdmEntitySessionAwareTest extends RemotingSessionAwareTest {
         PolytomousKeyNode grandChildNode = PolytomousKeyNode.NewInstance();
         rootChildNode.addChild(grandChildNode);
 
-        pKey = polytomousKeyService.merge(pKey, true);
+        polytomousKeyService.merge(pKey, true);
         grandChildNode = pKey.getRoot().getChildAt(0).getChildAt(0);
         Assert.assertTrue(0 != grandChildNode.getId());
         KeyStatement ks = KeyStatement.NewInstance("test");
         grandChildNode.setStatement(ks);
-        pKey = polytomousKeyService.merge(pKey, true);
+        polytomousKeyService.merge(pKey, true);
 
         //grandChildNode = pKey.getRoot().getChildAt(0).getChildAt(0);
         //KeyStatement ks = grandChildNode.getStatement();
@@ -425,7 +425,6 @@ public class CdmEntitySessionAwareTest extends RemotingSessionAwareTest {
         }
     }
 
-    @Ignore // should be enabled once resolution of #5066 is merged into cdmlib main branch
     @Test
     public void saveNewTerm() {
         UUID vocNameFeatureUuid = UUID.fromString("fa7ca3eef-4092-49e1-beec-ed5096193e5e");
index f950b0473cea94addb938121babb9363f5ba2e9c..d968fe56471e8ad3c7d520f34c2096b908c557d4 100644 (file)
@@ -16,6 +16,8 @@ import org.junit.Ignore;
 import org.junit.Test;
 import org.unitils.UnitilsJUnit4;
 
+import eu.etaxonomy.cdm.api.application.CdmApplicationState;
+import eu.etaxonomy.cdm.config.CdmSourceException;
 import eu.etaxonomy.taxeditor.remoting.server.CDMServerException;
 import eu.etaxonomy.taxeditor.remoting.source.CdmServerInfo;
 import eu.etaxonomy.taxeditor.remoting.source.CdmServerInfo.CdmInstanceInfo;
@@ -73,6 +75,47 @@ public class CdmServerInfoTest extends UnitilsJUnit4 {
         Assert.assertTrue(instances != null && !instances.isEmpty());
     }
 
+    @Test
+    public void compareCdmlibServicesVersionTest() throws CdmSourceException {
+        String editorVersion = CdmApplicationState.getCdmlibVersion();
+        String editorCdmlibLastModified = CdmApplicationState.getCdmlibLastModified();
+        Long editorCdmlibLastModifiedLong = Long.valueOf(editorCdmlibLastModified);
+
+        String[] editorVersionSplit = editorVersion.split("\\.");
+
+        Assert.assertEquals(0, CdmServerInfo.compareCdmlibServicesVersion(editorVersion, editorCdmlibLastModified));
+
+
+        int editorVersionMajor = Integer.valueOf(editorVersionSplit[0]);
+        int editorVersionMinor = Integer.valueOf(editorVersionSplit[1]);
+        int editorVersionPatch = Integer.valueOf(editorVersionSplit[2]);
+
+        String serverVersionMajorNew = String.valueOf(editorVersionMajor+1) + "." + String.valueOf(editorVersionMinor) + "." +  String.valueOf(editorVersionPatch);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(serverVersionMajorNew, editorCdmlibLastModified) > 0);
+
+        String serverVersionMinorNew = String.valueOf(editorVersionMajor) + "." + String.valueOf(editorVersionMinor+1) + "." + String.valueOf(editorVersionPatch);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(serverVersionMinorNew, editorCdmlibLastModified) > 0);
+
+        String serverVersionPatchNew = String.valueOf(editorVersionMajor) + "." + String.valueOf(editorVersionMinor) + "." + String.valueOf(editorVersionPatch+1);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(serverVersionPatchNew, editorCdmlibLastModified) > 0);
+
+        String serverVersionMajorOld = String.valueOf(editorVersionMajor-1) + "." + String.valueOf(editorVersionMinor) + "." + String.valueOf(editorVersionPatch);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(serverVersionMajorOld, editorCdmlibLastModified) < 0);
+
+        String serverVersionMinorOld = String.valueOf(editorVersionMajor) + "." + String.valueOf(editorVersionMinor-1) + "." + String.valueOf(editorVersionPatch);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(serverVersionMinorOld, editorCdmlibLastModified) < 0);
+
+        String serverVersionPatchOld = String.valueOf(editorVersionMajor) + "." + String.valueOf(editorVersionMinor) + "." + String.valueOf(editorVersionPatch-1);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(serverVersionPatchOld, editorCdmlibLastModified) < 0);
+
+        String serverCdmlibLastModifiedNew = String.valueOf(editorCdmlibLastModifiedLong+1);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(editorVersion, serverCdmlibLastModifiedNew) > 0);
+
+        String serverCdmlibLastModifiedOld = String.valueOf(editorCdmlibLastModifiedLong-1);
+        Assert.assertTrue(CdmServerInfo.compareCdmlibServicesVersion(editorVersion, serverCdmlibLastModifiedOld) < 0);
+
+    }
+
     @Test
     public void convertToServerConfigTest() {