commons, core, persistence: fix subscription entity persistence issue 

Signed-off-by: BOLLE Sebastien <sebastien.bolle@orange.com>
Signed-off-by: BONNARDEL Gregory <gbonnardel.ext@orange.com>
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java
index 1dd9a48..ee11daa 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java
@@ -97,7 +97,7 @@
 			)
 	protected RemoteCSEEntity parentCsr;
 
-	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL}, targetEntity = SubscriptionEntity.class)
+	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL}, targetEntity = SubscriptionEntity.class, mappedBy="parentAcp")
 	@JoinTable(
 			name=DBEntities.ACPSUB_JOIN,
 			inverseJoinColumns={@JoinColumn(name=DBEntities.SUB_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AeEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AeEntity.java
index 1cfe40c..b04632a 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AeEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AeEntity.java
@@ -145,7 +145,7 @@
 	
 	
 	// Database link to Subscriptions
-	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class, cascade = CascadeType.ALL)
+	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class, cascade = CascadeType.ALL, mappedBy="parentAe")
 	@JoinTable(
 			name = DBEntities.AESUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.AE_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkDeviceInfoEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkDeviceInfoEntity.java
index b3737b4..9d0bee4 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkDeviceInfoEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkDeviceInfoEntity.java
@@ -81,7 +81,7 @@
 	
 	
 	// Database link to Subscriptions
-	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class)
+	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class, mappedBy="parentAndi")
 	@JoinTable(
 			name = DBEntities.ANDISUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.ANDI_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkInfoEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkInfoEntity.java
index 662d518..43c5f79 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkInfoEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkInfoEntity.java
@@ -70,7 +70,7 @@
 	protected List<DynamicAuthorizationConsultationEntity> dynamicAuthorizationConsultations;
 
 	// Database link to Subscriptions
-	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class)
+	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class, mappedBy="parentAni")
 	@JoinTable(
 			name = DBEntities.ANISUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.ANI_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java
index dfc04fc..cc66b27 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java
@@ -169,7 +169,7 @@
 	protected List<AccessControlPolicyEntity> childAccessControlPolicies;
 
 	// list of subscription
-	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
+	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}, mappedBy="parentCsb")
 	@JoinTable(
 			name = DBEntities.CSBSUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.CSEB_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ContainerEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ContainerEntity.java
index d70dda8..95153a6 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ContainerEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ContainerEntity.java
@@ -64,7 +64,7 @@
 	@Column(name= ShortName.ONTOLOGY_REF)
 	protected String ontologyRef;
 	
-	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
+	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy="parentCnt")
 	@JoinTable(
 			name = DBEntities.CNTSUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.CNT_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerEntity.java
index 059c448..75ec989 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerEntity.java
@@ -67,7 +67,7 @@
 			)
 	protected List<CustomAttributeEntity> customAttributes;
 	
-	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
+	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy="parentFlexCnt")
 	@JoinTable(
 			name = DBEntities.FCNTSUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.FCNT_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/GroupEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/GroupEntity.java
index e3ede70..e148376 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/GroupEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/GroupEntity.java
@@ -66,7 +66,7 @@
 	protected String fanOutPoint;
 
 	// subscription list
-	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
+	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy="parentGrp")
 	@JoinTable(
 			name = DBEntities.GRPSUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.GRP_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java
index 2a8fa37..3aa9de1 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java
@@ -151,7 +151,7 @@
 	protected List<AeAnncEntity> childAeAnncs;
 
 	//list of subscription
-	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
+	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy="parentCsr")
 	@JoinTable(
 			name = DBEntities.CSRSUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.CSR_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ScheduleEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ScheduleEntity.java
index c540a3b..a69bbab 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ScheduleEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/ScheduleEntity.java
@@ -56,7 +56,7 @@
 	protected SubscriptionEntity parentSub;
 	
 	
-	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
+	@OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy="parentSch")
 	@JoinTable(
 			name = DBEntities.SCHSUB_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.SCH_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/SubscriptionController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/SubscriptionController.java
index 399aae7..3e3e9d0 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/SubscriptionController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/SubscriptionController.java
@@ -69,7 +69,7 @@
 		ResponsePrimitive response = new ResponsePrimitive(request);
 
 		// Get the DAO of the parent
-		DAO<?> dao = (DAO<?>) Patterns.getDAO(request.getTargetId(), dbs);
+		DAO<ResourceEntity> dao = (DAO<ResourceEntity>) Patterns.getDAO(request.getTargetId(), dbs);
 		if (dao == null){
 			throw new ResourceNotFoundException("Cannot find parent resource");
 		}
@@ -83,48 +83,57 @@
 
 		// Get lists to change in the method corresponding to specific object
 		List<AccessControlPolicyEntity> acpsToCheck = null;
+		List<SubscriptionEntity> parentChildSubscriptions = null;
 
 		// Distinguish parents
 		// Case of CSEBase
 		if(parentEntity.getResourceType().intValue() == (ResourceType.CSE_BASE)){
 			CSEBaseEntity cseBase = (CSEBaseEntity) parentEntity;
 			acpsToCheck = cseBase.getAccessControlPolicies();
+			parentChildSubscriptions = cseBase.getSubscriptions();
 		}
 
 		if(parentEntity.getResourceType().intValue() == (ResourceType.AE)){
 			AeEntity ae = (AeEntity) parentEntity;
 			acpsToCheck = ae.getAccessControlPolicies();
+			parentChildSubscriptions = ae.getSubscriptions();
 		}
 
 		if(parentEntity.getResourceType().intValue() == (ResourceType.REMOTE_CSE)){
 			RemoteCSEEntity remoteCSE = (RemoteCSEEntity) parentEntity;
 			acpsToCheck = remoteCSE.getAccessControlPolicies();
+			parentChildSubscriptions = remoteCSE.getSubscriptions();
 		}
 
 		if(parentEntity.getResourceType().intValue() == (ResourceType.GROUP)){
 			GroupEntity group = (GroupEntity) parentEntity;
 			acpsToCheck = group.getAccessControlPolicies();
+			parentChildSubscriptions = group.getSubscriptions();
 		}
 
 		if(parentEntity.getResourceType().intValue() == (ResourceType.CONTAINER)){
 			ContainerEntity container = (ContainerEntity) parentEntity;
 			acpsToCheck = container.getAccessControlPolicies();
+			parentChildSubscriptions = container.getSubscriptions();
 		}
 		
 		if (parentEntity.getResourceType().intValue() == (ResourceType.FLEXCONTAINER)) {
 			FlexContainerEntity flexContainer = (FlexContainerEntity) parentEntity;
 			acpsToCheck = flexContainer.getAccessControlPolicies();
+			parentChildSubscriptions = flexContainer.getSubscriptions();
 		}
 
 		if(parentEntity.getResourceType().intValue() == (ResourceType.ACCESS_CONTROL_POLICY)){
 			AccessControlPolicyEntity acp = (AccessControlPolicyEntity) parentEntity;
 			acpsToCheck = new ArrayList<>();
 			acpsToCheck.add(acp); // TODO check the acp to check in case of acp parent for subs
+			parentChildSubscriptions = acp.getChildSubscriptions();
 		}
 		
 		if(parentEntity.getResourceType().intValue() == ResourceType.REMOTE_CSE){
 			RemoteCSEEntity csr = (RemoteCSEEntity) parentEntity;
 			acpsToCheck = csr.getAccessControlPolicies();
+			parentChildSubscriptions = csr.getSubscriptions();
 		}
 
 		if(acpsToCheck == null){
@@ -284,7 +293,17 @@
 		
 		
 		subscriptionEntity.setParentEntity(parentEntity);	
+		// create subscription in database
 		dbs.getDAOFactory().getSubsciptionDAO().create(transaction, subscriptionEntity);
+		
+		// retrieve subscription from db
+		SubscriptionEntity subscriptionFromDB = dbs.getDAOFactory().getSubsciptionDAO().find(transaction, subscriptionEntity.getResourceID());
+		
+		// add the subscription to the parentEntity child list
+		parentChildSubscriptions.add(subscriptionFromDB);
+		dao.update(transaction, parentEntity);
+		
+		
 		transaction.commit();
 		response.setResponseStatusCode(ResponseStatusCode.CREATED);
 		setLocationAndCreationContent(request, response, subscriptionEntity);
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/SubscriptionDAO.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/SubscriptionDAO.java
index 892921b..5b183b5 100644
--- a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/SubscriptionDAO.java
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/SubscriptionDAO.java
@@ -28,12 +28,6 @@
 
 public class SubscriptionDAO extends AbstractDAO<SubscriptionEntity> {
 	
-	@Override
-	public void create(DBTransaction dbTransaction, SubscriptionEntity resource) {
-		super.create(dbTransaction, resource);
-		DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
-		transaction.getEm().getEntityManagerFactory().getCache().evictAll();
-	}
 
 	@Override
 	public SubscriptionEntity find(DBTransaction dbTransaction, Object id) {
@@ -51,8 +45,54 @@
 	@Override
 	public void delete(DBTransaction dbTransaction, SubscriptionEntity resource) {
 		DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
+		
+		// de-associate labels
+		List<LabelEntity> labels = resource.getLabelsEntities();
+		for (LabelEntity label : labels) {
+			label.getLinkedSub().remove(resource);
+		}
+		
+		if (resource.getParentAe() != null) {
+			resource.getParentAe().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentAcp() != null) {
+			resource.getParentAcp().getChildSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentAndi() != null) {
+			resource.getParentAndi().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentAni() != null) {
+			resource.getParentAni().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentCnt() != null) {
+			resource.getParentCnt().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentCsb() != null) {
+			resource.getParentCsb().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentCsr() != null) {
+			resource.getParentCsr().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentFlexCnt() != null) {
+			resource.getParentFlexCnt().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentGrp() != null) {
+			resource.getParentGrp().getSubscriptions().remove(resource);
+		}
+		
+		if (resource.getParentSch() != null) {
+			resource.getParentSch().getSubscriptions().remove(resource);
+		}
+		
 		transaction.getEm().remove(resource);
-		transaction.getEm().getEntityManagerFactory().getCache().evictAll();
 	}
 	
 }