From f5ae47505692bb6455942b9ad1685c61e7b0a9f8 Mon Sep 17 00:00:00 2001
From: Joze RIHTARSIC <joze.rihtarsic@ext.ec.europa.eu>
Date: Thu, 9 Aug 2018 15:12:25 +0200
Subject: [PATCH] update oracle patch sql script from 4.0.0 to 4.1.0 add new
 unit and integration tests

---
 .../ec/edelivery/smp/data/dao/BaseDao.java    |   4 -
 .../smp/services/ServiceGroupService.java     |  39 +++---
 ...oupServiceSingleDomainIntegrationTest.java |  73 ++++++++++-
 .../oracle10g-4.0.0-to-4.1.0.ddl              |  12 +-
 .../database-scripts/oracle10g-4.1.0.ddl      |   2 +-
 .../ErrorMappingControllerAdviceTest.java     | 123 ++++++++++++++++++
 6 files changed, 224 insertions(+), 29 deletions(-)
 create mode 100644 smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java

diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java
index b27eb2582..04c3d71e6 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/BaseDao.java
@@ -43,10 +43,6 @@ public abstract class BaseDao<E extends BaseEntity> {
         em.detach(entity);
     }
 
-    public void merge(E entity) {
-        em.merge(entity);
-    }
-
     public void remove(E entity) {
         em.remove(entity);
     }
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java
index a58f84611..55b44f8e1 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ServiceGroupService.java
@@ -87,13 +87,8 @@ public class ServiceGroupService {
     public boolean saveServiceGroup(ServiceGroup serviceGroup, String domain, String serviceGroupOwner, String authenticatedUser) {
         ServiceGroup normalizedServiceGroup = normalizeIdentifierCaseSensitivity(serviceGroup);
         ParticipantIdentifierType normalizedParticipantId = normalizedServiceGroup.getParticipantIdentifier();
-        String newOwnerName;
-        try {
-            newOwnerName = isNotBlank(serviceGroupOwner) ? decode(serviceGroupOwner, UTF_8) : authenticatedUser;
-        } catch (UnsupportedEncodingException | IllegalArgumentException ex) {
-            throw new InvalidOwnerException(serviceGroupOwner, "Unsupported or invalid encoding: " + ex.getMessage());
-        }
 
+        String newOwnerName = defineGroupOwner(serviceGroupOwner, authenticatedUser);
 
         DBUser newOwner = userDao.find(newOwnerName);
         if (newOwner == null) {
@@ -108,15 +103,8 @@ public class ServiceGroupService {
 
         if (dbServiceGroup != null) {
             // test service owner
-            Set<DBOwnership> owSet =  dbServiceGroup.getOwnerships();
-            Optional<DBOwnership> owner =  owSet.stream().filter(dbOwnership -> dbOwnership.getUser().getUsername().equals(newOwnerName)).findFirst();
-            // test serviceGroupOwner but use newOwnerName - because it is decoded
-            if (serviceGroupOwner!=null && !owner.isPresent()){
-                String msg = "User: " +newOwnerName+ " is not owner of service group: " +dbServiceGroup.getId().getBusinessIdentifierScheme() + "::" + dbServiceGroup.getId().getBusinessIdentifier();
-                LOG.error(msg);
-                throw new InvalidOwnerException(serviceGroupOwner, msg);
-            }
-
+            validateOwnership(newOwnerName, dbServiceGroup);
+            //update extensions
             dbServiceGroup.setExtension(extensions);
             serviceGroupDao.persistFlushDetach(dbServiceGroup);
             return false;
@@ -139,6 +127,27 @@ public class ServiceGroupService {
         }
     }
 
+    protected String defineGroupOwner(String serviceGroupOwner, String authenticatedUser){
+        try {
+            return isNotBlank(serviceGroupOwner) ? decode(serviceGroupOwner, UTF_8) : authenticatedUser;
+        } catch (UnsupportedEncodingException | IllegalArgumentException ex) {
+            LOG.error("Error occurred while decoding serviceGroupOwner '" + serviceGroupOwner+"'", ex);
+            throw new InvalidOwnerException(serviceGroupOwner, "Unsupported or invalid encoding: " + ex.getMessage());
+        }
+    }
+
+    protected void validateOwnership(String newOwnerName, DBServiceGroup dbServiceGroup){
+        Set<DBOwnership> owSet =  dbServiceGroup.getOwnerships();
+        Optional<DBOwnership> owner =  owSet.stream().filter(dbOwnership -> dbOwnership.getUser().getUsername().equals(newOwnerName)).findFirst();
+        // test serviceGroupOwner but use newOwnerName - because it is decoded
+        if (newOwnerName!=null && !owner.isPresent()){
+            String msg = "User: " +newOwnerName+ " is not owner of service group: " +dbServiceGroup.getId().getBusinessIdentifierScheme() + "::" + dbServiceGroup.getId().getBusinessIdentifier();
+            LOG.error(msg);
+            throw new InvalidOwnerException(newOwnerName, msg);
+        }
+
+    }
+
     private DBDomain findDomain(String domain) {
         if (isNotBlank(domain)) {
             DBDomain dbDomain = domainDao.find(domain);
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java
index 8653a2d58..14b8ecc8a 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ServiceGroupServiceSingleDomainIntegrationTest.java
@@ -13,9 +13,8 @@
 
 package eu.europa.ec.edelivery.smp.services;
 
-import eu.europa.ec.edelivery.smp.data.model.DBOwnership;
-import eu.europa.ec.edelivery.smp.data.model.DBOwnershipId;
-import eu.europa.ec.edelivery.smp.data.model.DBServiceGroup;
+
+import eu.europa.ec.edelivery.smp.data.model.*;
 import eu.europa.ec.edelivery.smp.exceptions.InvalidOwnerException;
 import eu.europa.ec.edelivery.smp.exceptions.NotFoundException;
 import eu.europa.ec.edelivery.smp.exceptions.UnknownUserException;
@@ -31,6 +30,7 @@ import org.springframework.test.context.jdbc.Sql;
 
 import javax.xml.bind.JAXBException;
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.List;
 import java.util.regex.Matcher;
 
@@ -40,6 +40,7 @@ import static eu.europa.ec.edelivery.smp.testutil.XmlTestUtils.loadDocumentAsStr
 import static eu.europa.ec.edelivery.smp.testutil.XmlTestUtils.marshall;
 import static eu.europa.ec.smp.api.Identifiers.asParticipantId;
 
+import static java.util.Arrays.asList;
 import static org.junit.Assert.*;
 import static eu.europa.ec.edelivery.smp.testutil.TestConstants.*;
 
@@ -120,6 +121,72 @@ public class ServiceGroupServiceSingleDomainIntegrationTest extends AbstractServ
         assertEquals(marshall(newServiceGroup), marshall(resultServiceGroup));
     }
 
+    @Test
+    public void defineGroupOwnerWhenOwnerIsNull(){
+        String testUser = "user";
+        String result = serviceGroupService.defineGroupOwner(null, testUser);
+        assertEquals(testUser, result);
+
+        result = serviceGroupService.defineGroupOwner("", testUser);
+        assertEquals(testUser, result);
+    }
+
+    @Test
+    public void defineGroupOwnerWhenOwnerIsNotNull(){
+        String testUser = "user";
+        String testOwner = "owner";
+        String result = serviceGroupService.defineGroupOwner(testOwner, testUser);
+        assertEquals(testOwner, result);
+    }
+
+    @Test
+    public void validateOwnershipHasRightOwner(){
+        String testOwner = "owner";
+
+        DBServiceGroup dbServiceGroup = new DBServiceGroup(new DBServiceGroupId("",""));
+
+        DBUser duser = new DBUser();
+        duser.setUsername(testOwner);
+        DBOwnershipId dbOwnershipID = new DBOwnershipId(testOwner, "", "");
+        DBOwnership dbOwnership = new DBOwnership();
+        dbOwnership.setId(dbOwnershipID);
+        dbOwnership.setUser(duser);
+
+        DBUser user0 = new DBUser();
+        user0.setUsername("otherOwner");
+        DBOwnershipId dbOwnershipID0 = new DBOwnershipId("otherOwner", "", "");
+        DBOwnership dbOwnership0 = new DBOwnership();
+        dbOwnership0.setId(dbOwnershipID0);
+        dbOwnership0.setUser(user0);
+
+        dbServiceGroup.setOwnerships(new HashSet(asList(dbOwnership0, dbOwnership)));
+
+        serviceGroupService.validateOwnership(testOwner, dbServiceGroup);
+
+    }
+
+    @Test
+    public void validateOwnershipHasInvalidOwner(){
+        String testOwner = "owner";
+        DBServiceGroup dbServiceGroup = new DBServiceGroup(new DBServiceGroupId("",""));
+
+        expectedExeption.expect(InvalidOwnerException.class);
+        expectedExeption.expectMessage("User: " +testOwner+ " is not owner of service group: ");
+
+        DBUser duser = new DBUser();
+        duser.setUsername("otherOwner");
+        DBOwnershipId dbOwnershipID0 = new DBOwnershipId("otherOwner", "", "");
+        DBOwnership dbOwnership0 = new DBOwnership();
+        dbOwnership0.setId(dbOwnershipID0);
+        dbOwnership0.setUser(duser);
+
+
+        dbServiceGroup.setOwnerships(new HashSet(asList(dbOwnership0)));
+
+        serviceGroupService.validateOwnership(testOwner, dbServiceGroup);
+
+    }
+
     @Test
     public void updateUnknownUserException() throws IOException, JAXBException {
 
diff --git a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl
index e83c39ad7..51c15c19b 100644
--- a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl
+++ b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.0.0-to-4.1.0.ddl
@@ -18,7 +18,7 @@ CREATE TABLE smp_domain_AUD (
   signatureCertAlias    VARCHAR(50),
   REV INTEGER NOT NULL, 
   REVTYPE NUMBER(3),
-  CONSTRAINT PK_SMP_DOMAIN_AUD PRIMARY KEY(domainId)
+  CONSTRAINT PK_SMP_DOMAIN_AUD PRIMARY KEY(domainId, REV)
 );
 
 CREATE TABLE smp_service_group_AUD (
@@ -28,7 +28,7 @@ CREATE TABLE smp_service_group_AUD (
   domainId                 VARCHAR(50),
   REV INTEGER NOT NULL, 
   REVTYPE NUMBER(3),
-  CONSTRAINT PK_SMP_GRP_AUD PRIMARY KEY (businessIdentifier, businessIdentifierScheme)
+  CONSTRAINT PK_SMP_GRP_AUD PRIMARY KEY (businessIdentifier, businessIdentifierScheme, REV)
 );
 
 CREATE TABLE smp_service_metadata_AUD (
@@ -43,16 +43,16 @@ CREATE TABLE smp_service_metadata_AUD (
     documentIdentifierScheme,
     businessIdentifier,
     businessIdentifierScheme,
-    documentIdentifier)
+    documentIdentifier, REV)
 );
-
+ 
 CREATE TABLE smp_user_AUD (
   username VARCHAR(256),
   password VARCHAR(256),
   isadmin  NUMBER(1) DEFAULT 0,
   REV INTEGER NOT NULL, 
   REVTYPE NUMBER(3),
-  CONSTRAINT PK_SMP_USER_AUD PRIMARY KEY (username)
+  CONSTRAINT PK_SMP_USER_AUD PRIMARY KEY (username, REV)
 );
 
 CREATE TABLE smp_ownership_AUD (
@@ -61,7 +61,7 @@ CREATE TABLE smp_ownership_AUD (
   businessIdentifierScheme VARCHAR(100),
   REV INTEGER NOT NULL, 
   REVTYPE NUMBER(3),
-  CONSTRAINT PK_OWNERSHIP_AUD PRIMARY KEY (username, businessIdentifier, businessIdentifierScheme)
+  CONSTRAINT PK_OWNERSHIP_AUD PRIMARY KEY (username, businessIdentifier, businessIdentifierScheme, REV)
 );
 
 
diff --git a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl
index cd8bc7fd3..2bef81b21 100644
--- a/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl
+++ b/smp-webapp/src/main/smp-setup/database-scripts/oracle10g-4.1.0.ddl
@@ -131,7 +131,7 @@ CREATE TABLE smp_ownership_AUD (
 
 
 CREATE TABLE SMP_REV_INFO (
-  ID NUMBER(38, 0) NOT NULL, 
+  ID NUMBER(38, 0) NOT NULL,
   TIMESTAMP NUMBER(38, 0), 
   REVISION_DATE TIMESTAMP,
   username VARCHAR2(255), 
diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java
new file mode 100644
index 000000000..b83673e7a
--- /dev/null
+++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/error/ErrorMappingControllerAdviceTest.java
@@ -0,0 +1,123 @@
+package eu.europa.ec.edelivery.smp.error;
+
+import ec.services.smp._1.ErrorResponse;
+import eu.europa.ec.edelivery.smp.error.exceptions.BadRequestException;
+import eu.europa.ec.edelivery.smp.exceptions.NotFoundException;
+import eu.europa.ec.edelivery.smp.exceptions.UnknownUserException;
+import eu.europa.ec.edelivery.smp.exceptions.WrongInputFieldException;
+import eu.europa.ec.edelivery.smp.exceptions.XmlParsingException;
+import eu.europa.ec.smp.api.exceptions.MalformedIdentifierException;
+import eu.europa.ec.smp.api.exceptions.XmlInvalidAgainstSchemaException;
+import org.junit.Test;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.core.AuthenticationException;
+
+import static org.junit.Assert.*;
+import static org.springframework.http.HttpStatus.*;
+
+public class ErrorMappingControllerAdviceTest {
+
+    ErrorMappingControllerAdvice testIntance = new ErrorMappingControllerAdvice();
+
+    @Test
+    public void handleRuntimeException() {
+        ResponseEntity re = testIntance.handleRuntimeException(new RuntimeException("RuntimeExceptionMessage"));
+
+        assertEquals(INTERNAL_SERVER_ERROR, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.TECHNICAL, ((ErrorResponse)re.getBody()).getBusinessCode());
+
+
+    }
+
+    @Test
+    public void handleBadRequestException() {
+
+        ResponseEntity re = testIntance.handleBadRequestException(new BadRequestException(ErrorBusinessCode.WRONG_FIELD, "BadRequestExceptionMessage"));
+
+        assertEquals(BAD_REQUEST, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.WRONG_FIELD, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+
+    @Test
+    public void handleMalformedIdentifierException() {
+        ResponseEntity re = testIntance.handleMalformedIdentifierException(new MalformedIdentifierException("MalformedIdentifierExceptionMessage", null));
+
+        assertEquals(BAD_REQUEST, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.FORMAT_ERROR, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleWrongInputFieldException() {
+
+        ResponseEntity re = testIntance.handleWrongInputFieldException(new WrongInputFieldException("WrongInputFieldExceptionMessage"));
+
+        assertEquals(BAD_REQUEST, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.WRONG_FIELD, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleNotFoundException() {
+        ResponseEntity re = testIntance.handleNotFoundException(new NotFoundException("NotFoundExceptionMessage"));
+
+        assertEquals(NOT_FOUND, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.NOT_FOUND, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleAuthenticationException() {
+
+        ResponseEntity re = testIntance.handleAuthenticationException(new AuthenticationException("AuthenticationException") {
+            @Override
+            public String getMessage() {
+                return super.getMessage();
+            }
+        });
+
+        assertEquals(UNAUTHORIZED, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.UNAUTHORIZED, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleAccessDeniedException() {
+        ResponseEntity re = testIntance.handleAccessDeniedException(new AccessDeniedException("AccessDeniedExceptionMessage"));
+
+        assertEquals(UNAUTHORIZED, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.UNAUTHORIZED, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleUnknownUserException() {
+        ResponseEntity re = testIntance.handleUnknownUserException(new UnknownUserException("UnknownUserExceptionMessage"));
+
+        assertEquals(BAD_REQUEST, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.USER_NOT_FOUND, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleInvalidOwnerException() {
+        ResponseEntity re = testIntance.handleUnknownUserException(new UnknownUserException("UnknownUserExceptionMessage"));
+
+        assertEquals(BAD_REQUEST, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.UNAUTHORIZED, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleXmlParsingException() {
+
+        ResponseEntity re = testIntance.handleXmlParsingException(new XmlParsingException(null));
+
+        assertEquals(BAD_REQUEST, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.XSD_INVALID, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+
+    @Test
+    public void handleXmlInvalidAgainstSchemaException() {
+        ResponseEntity re = testIntance.handleXmlInvalidAgainstSchemaException(
+                new XmlInvalidAgainstSchemaException("XmlInvalidAgainstSchemaExceptionMessage", null));
+
+        assertEquals(BAD_REQUEST, re.getStatusCode());
+        assertEquals(ErrorBusinessCode.XSD_INVALID, ((ErrorResponse)re.getBody()).getBusinessCode());
+    }
+}
\ No newline at end of file
-- 
GitLab