ref #6169 RegistrationWorkingSets more complete, validation problems accessible via UI
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / cdm / mock / RegistrationService.java
index fa5e9942cb4777df4a77fb942fcb60dec63bab27..dcf23eb5d33675314dded3b4277ab8e5b32e7c40 100644 (file)
@@ -8,6 +8,7 @@
 */
 package eu.etaxonomy.cdm.mock;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -15,8 +16,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import javax.annotation.PostConstruct;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
@@ -27,7 +26,9 @@ import eu.etaxonomy.cdm.api.application.CdmRepository;
 import eu.etaxonomy.cdm.model.common.CdmBase;
 import eu.etaxonomy.cdm.model.name.Rank;
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
-import eu.etaxonomy.cdm.vaadin.presenter.phycobank.RegistrationDTO;
+import eu.etaxonomy.cdm.vaadin.model.registration.RegistrationWorkingSet;
+import eu.etaxonomy.cdm.vaadin.presenter.registration.RegistrationDTO;
+import eu.etaxonomy.cdm.vaadin.presenter.registration.RegistrationValidationException;
 
 /**
  * @author a.kohlbecker
@@ -38,13 +39,20 @@ import eu.etaxonomy.cdm.vaadin.presenter.phycobank.RegistrationDTO;
 @Transactional
 public class RegistrationService {
 
+    /**
+     *
+     */
+    private static final int SIZE = 50; // FIXME test performance with 50 !!!!!
+
     @Autowired
     @Qualifier("cdmRepository")
     private CdmRepository repo;
 
     private Map<UUID, Registration> registrationsByUUID = new HashMap<>();
-    private Map<String, Registration> registrationsByRegID = new HashMap<>();
-    private Map<String, RegistrationDTO> registrationDTOsByRegID = new HashMap<>();
+    private Map<Integer, Registration> registrationsByRegID = new HashMap<>();
+    private Map<Integer, RegistrationDTO> registrationDTOsById = new HashMap<>();
+    private Map<String, RegistrationDTO> registrationDTOsByIdentifier = new HashMap<>();
+    private Map<Integer, List<RegistrationDTO>> registrationDTOsByCitationId = new HashMap<>();
 
     private Collection<CdmBase> cdmEntities = new HashSet<>();
 
@@ -54,40 +62,50 @@ public class RegistrationService {
 
     int minTypeDesignationCount = 1;
 
-    @PostConstruct
     protected void init(){
-        TransactionStatus tx = repo.startTransaction(true);
-        while(registrationsByUUID.size() < 20){
-            List<TaxonNameBase> names = repo.getNameService().list(TaxonNameBase.class, 100, 0, null, null);
-            for(TaxonNameBase name : names){
-                if(name.getRank() != null && name.getRank().isLower(Rank.SUBFAMILY())){
-                    if(name.getTypeDesignations().size() > minTypeDesignationCount - 1) {
-
-                        // name
-                        Registration nameReg = new Registration();
-                        nameReg.setName(name);
-                        cdmEntities.add(name);
-                        put(nameReg, new RegistrationDTO(nameReg, null));
-
-                        // typedesignation
-                        Registration typedesignationReg = new Registration();
-                        typedesignationReg.addTypeDesignations(name.getTypeDesignations());
-                        cdmEntities.addAll(name.getTypeDesignations());
-                        put(typedesignationReg,  new RegistrationDTO(typedesignationReg, name));
+        if(registrationsByUUID.size() == 0){
+            TransactionStatus tx = repo.startTransaction(true);
+            int pageIndex = 0;
+            while(registrationsByUUID.size() < SIZE){
+                List<TaxonNameBase> names = repo.getNameService().list(TaxonNameBase.class, 100, pageIndex++, null, null);
+                for(TaxonNameBase name : names){
+                    if(name != null && name.getRank() != null && name.getRank().isLower(Rank.SUBFAMILY())){
+                        if(name.getTypeDesignations().size() > minTypeDesignationCount - 1) {
+
+                            // name
+                            Registration nameReg = new Registration();
+                            nameReg.setName(name);
+                            cdmEntities.add(name);
+                            put(new RegistrationDTO(nameReg));
+
+                            // typedesignation
+                            Registration typedesignationReg = new Registration();
+                            typedesignationReg.addTypeDesignations(name.getTypeDesignations());
+                            cdmEntities.addAll(name.getTypeDesignations());
+                            put(new RegistrationDTO(typedesignationReg));
+                        }
                     }
                 }
             }
+            repo.commitTransaction(tx);
         }
-        repo.commitTransaction(tx);
     }
 
     /**
      * @param reg
      */
-    private void put(Registration reg, RegistrationDTO dto) {
-        registrationsByUUID.put(reg.getUuid(), reg);
-        registrationsByRegID.put(reg.getSpecificIdentifier(), reg);
-        registrationDTOsByRegID.put(reg.getSpecificIdentifier(), dto);
+    private void put(RegistrationDTO dto) {
+        Registration reg = dto.registration();
+        registrationsByUUID.put(dto.getUuid(), reg);
+        registrationsByRegID.put(reg.getId(), reg);
+
+        registrationDTOsById.put(reg.getId(), dto);
+        registrationDTOsByIdentifier.put(reg.getIdentifier(), dto);
+
+        if(! registrationDTOsByCitationId.containsKey(dto.getCitationID())){
+            registrationDTOsByCitationId.put(dto.getCitationID(), new ArrayList<RegistrationDTO>());
+        }
+        registrationDTOsByCitationId.get(dto.getCitationID()).add(dto);
     }
 
     private void mergeBack(){
@@ -98,23 +116,63 @@ public class RegistrationService {
      * {@inheritDoc}
      */
     public Registration load(UUID uuid) {
+        init();
         return registrationsByUUID.get(uuid);
     }
 
+
     public Collection<Registration> list(){
+        init();
         return registrationsByUUID.values();
     }
 
     public Collection<RegistrationDTO> listDTOs() {
-        return registrationDTOsByRegID.values();
+        init();
+        return registrationDTOsById.values();
+    }
+
+    public Map<Integer, List<RegistrationDTO>> listDTOsByWorkingSet() {
+        init();
+        return registrationDTOsByCitationId;
+    }
+
+    /**
+     * @param  id the CDM Entity id
+     * @return
+     */
+    public Registration loadByRegistrationID(Integer id) {
+        init();
+        return registrationsByRegID.get(id);
+    }
+
+    /**
+     * @param identifier the Registration Identifier String
+     * @return
+     */
+    public RegistrationDTO loadDtoByIdentifier(String identifier) {
+        init();
+        return registrationDTOsById.get(identifier);
     }
 
     /**
-     * @param registrationID
+     * @param id the CDM Entity id
      * @return
      */
-    public Registration loadByRegistrationID(Integer registrationID) {
-        return registrationsByRegID.get(registrationID.toString());
+    public RegistrationDTO loadDtoById(Integer id) {
+        init();
+        return registrationDTOsById.get(id);
+    }
+
+    /**
+     * @param  id the CDM Entity id
+     * @return
+     * @throws RegistrationValidationException
+     */
+    public RegistrationWorkingSet loadWorkingSetByRegistrationID(Integer id) throws RegistrationValidationException {
+        init();
+        RegistrationDTO dto = registrationDTOsById.get(id);
+
+        return new RegistrationWorkingSet(registrationDTOsByCitationId.get(dto.getCitationID()));
     }