BET-34 Store/Load forwarding UUID
diff --git a/db/oracle/UpdateTo2.0.0FromDB_1.0.0/01_migrate_from_2.0.0_to_2.0.1.sql b/db/oracle/UpdateTo2.0.0FromDB_1.0.0/01_migrate_from_2.0.0_to_2.0.1.sql
new file mode 100644
index 0000000..bc6fc20
--- /dev/null
+++ b/db/oracle/UpdateTo2.0.0FromDB_1.0.0/01_migrate_from_2.0.0_to_2.0.1.sql
@@ -0,0 +1 @@
+ALTER TABLE TBL_NOTIFICATION add "RESPONSIBILITY_FORWARDING_UUID" RAW(16);
diff --git a/db/postgreSQL/UpdateTo2.0.0FromDB_1.0.0/01_migrate_from_2.0.0_to_2.0.1.sql b/db/postgreSQL/UpdateTo2.0.0FromDB_1.0.0/01_migrate_from_2.0.0_to_2.0.1.sql
new file mode 100644
index 0000000..b2db146
--- /dev/null
+++ b/db/postgreSQL/UpdateTo2.0.0FromDB_1.0.0/01_migrate_from_2.0.0_to_2.0.1.sql
@@ -0,0 +1,2 @@
+ALTER TABLE tbl_notification add responsibility_forwarding_uuid uuid;
+
diff --git a/pom.xml b/pom.xml
index 8516e68..922f92b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@
         <maven.test.skip>false</maven.test.skip>
         <jacoco-maven-plugin.version>0.7.9</jacoco-maven-plugin.version>
         <sonar-maven-plugin.version>3.0.2</sonar-maven-plugin.version>
-        <!--<javax.mail.version>3.0.2</javax.mail.version>-->
+        <hibernate-annotations.version>3.5.6-Final</hibernate-annotations.version>
     </properties>
     <dependencies>
         <dependency>
@@ -129,6 +129,11 @@
             <version>2.5.4</version>
         </dependency>
         <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-annotations</artifactId>
+            <version>${hibernate-annotations.version}</version>
+        </dependency>
+        <dependency>
             <groupId>com.auth0</groupId>
             <artifactId>java-jwt</artifactId>
             <version>3.2.0</version>
diff --git a/src/main/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapper.java b/src/main/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapper.java
index 92d6b02..8ac4d64 100644
--- a/src/main/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapper.java
+++ b/src/main/java/org/eclipse/openk/elogbook/common/mapper/NotificationMapper.java
@@ -11,13 +11,6 @@
 */
 package org.eclipse.openk.elogbook.common.mapper;
 
-import java.sql.Timestamp;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 import org.eclipse.openk.elogbook.persistence.dao.RefBranchDao;
 import org.eclipse.openk.elogbook.persistence.dao.RefGridTerritoryDao;
 import org.eclipse.openk.elogbook.persistence.dao.RefNotificationPriorityDao;
@@ -30,6 +23,13 @@
 import org.eclipse.openk.elogbook.persistence.model.TblNotification;
 import org.eclipse.openk.elogbook.viewmodel.Notification;
 
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 public class NotificationMapper {
     private Map<Integer, RefNotificationStatus> refStatusMap;
     private Map<Integer, RefNotificationPriority> refPriorityMap;
@@ -77,6 +77,7 @@
         trg.setRefGridTerritory(refGridTerritoryMap.get(vmNot.getFkRefGridTerritory()));
         trg.setAdminFlag(vmNot.isAdminFlag());
         trg.setType(vmNot.getType());
+        trg.setResponsibilityForwardingUuid(vmNot.getResponsibilityForwardingUuid());
         return trg;
     }
 
@@ -126,6 +127,7 @@
         }
 		not.getAdminFlag(tblNot.isAdminFlag());
 		not.setType(tblNot.getType());
+		not.setResponsibilityForwardingUuid(tblNot.getResponsibilityForwardingUuid());
 		return not;
     }
 
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerUser.java b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerUser.java
index 8820ce3..6e0a18d 100644
--- a/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerUser.java
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/BackendControllerUser.java
@@ -29,6 +29,7 @@
 import org.eclipse.openk.elogbook.persistence.model.TblUserSettings;
 import org.eclipse.openk.elogbook.viewmodel.LoginCredentials;
 import org.eclipse.openk.elogbook.viewmodel.UserAuthentication;
+import org.eclipse.openk.elogbook.viewmodel.contactbasedata.ContactTupel;
 
 import javax.persistence.EntityManager;
 import java.util.List;
@@ -85,9 +86,9 @@
 		return ret;
 	}
 
-	public List<String> getUserSuggestionsFromContactdatabase(String token) throws BtbException {
+	public List<ContactTupel> getUserSuggestionsFromContactdatabase(String token) throws BtbException {
 		LOGGER.debug("getUserSuggestionsFromContactdatabase() is called");
-		List<String> userContacts = ContactBaseDataManager.getInstance().getUserContacts(token);
+		List<ContactTupel> userContacts = ContactBaseDataManager.getInstance().getUserContacts(token);
 		LOGGER.debug("getUserSuggestionsFromContactdatabase() is finished");
 		return userContacts;
 	}
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/ContactBaseDataManager.java b/src/main/java/org/eclipse/openk/elogbook/controller/ContactBaseDataManager.java
index 4005527..8bc650d 100644
--- a/src/main/java/org/eclipse/openk/elogbook/controller/ContactBaseDataManager.java
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/ContactBaseDataManager.java
@@ -16,11 +16,12 @@
 import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
 import org.eclipse.openk.elogbook.communication.RestServiceWrapper;
 import org.eclipse.openk.elogbook.exceptions.BtbException;
+import org.eclipse.openk.elogbook.viewmodel.contactbasedata.ContactTupel;
 import org.eclipse.openk.elogbook.viewmodel.contactbasedata.VwDetailedContact;
 import org.eclipse.openk.elogbook.viewmodel.contactbasedata.VwDetailedContactPage;
 
-import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class ContactBaseDataManager {
 
@@ -33,21 +34,24 @@
         return INSTANCE;
     }
 
-    public List<String> getUserContacts(String token) throws BtbException {
-        List<String> returnList = new ArrayList();
+    public List<ContactTupel> getUserContacts(String token) throws BtbException {
         RestServiceWrapper restServiceWrapper = new RestServiceWrapper(BackendConfig.getInstance().getContactBaseDataApiUrl(), false);
         String response = restServiceWrapper.performGetRequest("contacts?size=2000",token);
         VwDetailedContactPage vwDetailedContactPage = JsonGeneratorBase.getGson().fromJson(response,
                 VwDetailedContactPage.class);
-        List<VwDetailedContact> content = vwDetailedContactPage.getContent();
-        for (VwDetailedContact vwDetailedContact : content) {
-            String userName = vwDetailedContact.getName();
-            if (userName != null) {
-                userName = userName.replace("," ,"");
-            }
-            returnList.add(userName);
+        return vwDetailedContactPage.getContent().stream().map(this::mapFromViewObj ).collect(Collectors.toList());
+    }
+
+    private ContactTupel mapFromViewObj( VwDetailedContact vwDetailedContact ) {
+        String userName = vwDetailedContact.getName();
+        if (userName != null) {
+            userName = userName.replace("," ,"");
         }
-        return returnList;
+        ContactTupel ct = new ContactTupel();
+        ct.setContactName(userName);
+        ct.setContactUuid(vwDetailedContact.getUuid());
+        return ct;
+
     }
 
 }
diff --git a/src/main/java/org/eclipse/openk/elogbook/controller/ControllerImplementations.java b/src/main/java/org/eclipse/openk/elogbook/controller/ControllerImplementations.java
index 5070e94..4b33f32 100644
--- a/src/main/java/org/eclipse/openk/elogbook/controller/ControllerImplementations.java
+++ b/src/main/java/org/eclipse/openk/elogbook/controller/ControllerImplementations.java
@@ -31,6 +31,7 @@
 import org.eclipse.openk.elogbook.viewmodel.TerritoryResponsibility;
 import org.eclipse.openk.elogbook.viewmodel.UserAuthentication;
 import org.eclipse.openk.elogbook.viewmodel.VersionInfo;
+import org.eclipse.openk.elogbook.viewmodel.contactbasedata.ContactTupel;
 
 import javax.ws.rs.core.Response;
 import java.util.List;
@@ -573,7 +574,7 @@
 
 		@Override
 		public Response invoke() throws BtbException {
-			List<String> userSuggestionsList = backendControllerUser.getUserSuggestionsFromContactdatabase(this.token);
+			List<ContactTupel> userSuggestionsList = backendControllerUser.getUserSuggestionsFromContactdatabase(this.token);
 			return ResponseBuilderWrapper.INSTANCE
 					.buildOKResponse(JsonGeneratorBase.getGson().toJson(userSuggestionsList));
 		}
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/model/AbstractNotification.java b/src/main/java/org/eclipse/openk/elogbook/persistence/model/AbstractNotification.java
index 2944de0..5dde8c6 100644
--- a/src/main/java/org/eclipse/openk/elogbook/persistence/model/AbstractNotification.java
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/model/AbstractNotification.java
@@ -11,9 +11,21 @@
 */
 package org.eclipse.openk.elogbook.persistence.model;
 
-import javax.persistence.*;
+import org.eclipse.openk.elogbook.persistence.util.UUIDConverter;
+import org.eclipse.persistence.annotations.Convert;
+import org.eclipse.persistence.annotations.Converter;
+
+import javax.persistence.Column;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.SequenceGenerator;
 import java.io.Serializable;
 import java.sql.Timestamp;
+import java.util.UUID;
 
 
 /**
@@ -72,6 +84,11 @@
 	@Column(name="responsibility_forwarding")
 	private String responsibilityForwarding;
 
+	@Column(name="responsibility_forwarding_uuid")
+	@Converter(converterClass= UUIDConverter.class, name="responsibility_forwarding_uuid")
+	@Convert("responsibility_forwarding_uuid")
+	private UUID responsibilityForwardingUuid;
+
 	@Column(name="version")
 	private Integer version;
 	
@@ -279,4 +296,12 @@
 	public void setType(String type) {
 		this.type = type;
 	}
+
+	public UUID getResponsibilityForwardingUuid() {
+		return responsibilityForwardingUuid;
+	}
+
+	public void setResponsibilityForwardingUuid(UUID responsibilityForwardingUuid) {
+		this.responsibilityForwardingUuid = responsibilityForwardingUuid;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/persistence/util/UUIDConverter.java b/src/main/java/org/eclipse/openk/elogbook/persistence/util/UUIDConverter.java
new file mode 100644
index 0000000..c39247c
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/persistence/util/UUIDConverter.java
@@ -0,0 +1,67 @@
+package org.eclipse.openk.elogbook.persistence.util;
+
+import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.mappings.DatabaseMapping;
+import org.eclipse.persistence.mappings.OneToOneMapping;
+import org.eclipse.persistence.sessions.Session;
+
+import java.sql.Types;
+import java.text.MessageFormat;
+import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class UUIDConverter implements org.eclipse.persistence.mappings.converters.Converter
+{
+    private static final Logger LOG = Logger.getLogger(UUIDConverter.class.getName());
+
+    @Override
+    public UUID convertObjectValueToDataValue(Object objectValue, Session session)
+    {
+        return (UUID) objectValue;
+    }
+
+    @Override
+    public UUID convertDataValueToObjectValue(Object dataValue, Session session)
+    {
+        return (UUID) dataValue;
+    }
+
+    @Override
+    public boolean isMutable()
+    {
+        return false;
+    }
+
+    @Override
+    public void initialize(DatabaseMapping mapping, Session session)
+    {
+        DatabaseField field = mapping.getField();
+        field.setSqlType(Types.OTHER);
+        field.setTypeName("java.util.UUID");
+        field.setColumnDefinition("UUID");
+
+
+        if (LOG.isLoggable(Level.FINE))
+            LOG.log(Level.FINE, MessageFormat.format("Setting local field {0} to be a UUID", field) );
+
+        // Find the bi-directional references other objects have to this field, and update them to be uuid too
+        for (DatabaseMapping m : mapping.getDescriptor().getMappings())
+        {
+            if (m instanceof OneToOneMapping)
+            {
+                OneToOneMapping oneToOneMapping = (OneToOneMapping) m;
+
+                DatabaseField relationshipField = oneToOneMapping.getSourceToTargetKeyFields().get(field);
+                if (relationshipField != null)
+                {
+                    relationshipField.setSqlType(Types.OTHER);
+                    relationshipField.setColumnDefinition("UUID");
+                    relationshipField.setTypeName("java.util.UUID");
+                    if (LOG.isLoggable(Level.FINE))
+                        LOG.log(Level.FINE, MessageFormat.format("Setting foreign key field {0} to be a UUID", relationshipField));
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/Notification.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/Notification.java
index 02c8177..0a29961 100644
--- a/src/main/java/org/eclipse/openk/elogbook/viewmodel/Notification.java
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/Notification.java
@@ -13,6 +13,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.UUID;
 
 public class Notification {
 
@@ -28,6 +29,7 @@
     private String freeText;
     private String freeTextExtended;
     private String responsibilityForwarding;
+    private UUID responsibilityForwardingUuid;
     private String responsibilityControlPoint;
     private Date reminderDate;
     private Date futureDate;
@@ -255,4 +257,12 @@
     public void setType(String type) {
         this.type = type;
     }
+
+    public UUID getResponsibilityForwardingUuid() {
+        return responsibilityForwardingUuid;
+    }
+
+    public void setResponsibilityForwardingUuid(UUID responsibilityForwardingUuid) {
+        this.responsibilityForwardingUuid = responsibilityForwardingUuid;
+    }
 }
diff --git a/src/main/java/org/eclipse/openk/elogbook/viewmodel/contactbasedata/ContactTupel.java b/src/main/java/org/eclipse/openk/elogbook/viewmodel/contactbasedata/ContactTupel.java
new file mode 100644
index 0000000..63d22eb
--- /dev/null
+++ b/src/main/java/org/eclipse/openk/elogbook/viewmodel/contactbasedata/ContactTupel.java
@@ -0,0 +1,24 @@
+package org.eclipse.openk.elogbook.viewmodel.contactbasedata;
+
+import java.util.UUID;
+
+public class ContactTupel {
+    private String contactName;
+    private UUID contactUuid;
+
+    public String getContactName() {
+        return contactName;
+    }
+
+    public void setContactName(String contactName) {
+        this.contactName = contactName;
+    }
+
+    public UUID getContactUuid() {
+        return contactUuid;
+    }
+
+    public void setContactUuid(UUID contactUuid) {
+        this.contactUuid = contactUuid;
+    }
+}