http://git-wip-us.apache.org/repos/asf/airavata/blob/e36c145d/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql ---------------------------------------------------------------------- diff --git a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql new file mode 100644 index 0000000..0e58356 --- /dev/null +++ b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-derby.sql @@ -0,0 +1,141 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +CREATE TABLE DOMAIN ( + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (DOMAIN_ID) +); + +CREATE TABLE SHARING_USER ( + USER_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + USER_NAME VARCHAR(255) NOT NULL, + FIRST_NAME VARCHAR (255), + LAST_NAME VARCHAR (255), + ICON BLOB, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (USER_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE USER_GROUP ( + GROUP_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + OWNER_ID VARCHAR(255) NOT NULL, + GROUP_TYPE VARCHAR(255) NOT NULL, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (GROUP_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION, + FOREIGN KEY (OWNER_ID) REFERENCES SHARING_USER(USER_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + + +CREATE TABLE GROUP_MEMBERSHIP ( + PARENT_ID VARCHAR(255) NOT NULL, + CHILD_ID VARCHAR(255) NOT NULL, + CHILD_TYPE VARCHAR(255) NOT NULL, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (PARENT_ID, CHILD_ID), + FOREIGN KEY (PARENT_ID) REFERENCES USER_GROUP(GROUP_ID) ON DELETE CASCADE ON UPDATE NO ACTION, + FOREIGN KEY (CHILD_ID) REFERENCES USER_GROUP(GROUP_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE ENTITY_TYPE ( + ENTITY_TYPE_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (ENTITY_TYPE_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE PERMISSION_TYPE ( + PERMISSION_TYPE_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (PERMISSION_TYPE_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE ENTITY ( + ENTITY_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + ENTITY_TYPE_ID VARCHAR(255) NOT NULL, + OWNER_ID VARCHAR(255) NOT NULL, + PARENT_ENTITY_ID VARCHAR(255), + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + FULL_TEXT CLOB, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (ENTITY_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE NO ACTION, + FOREIGN KEY (ENTITY_TYPE_ID) REFERENCES ENTITY_TYPE(ENTITY_TYPE_ID) ON DELETE CASCADE ON UPDATE NO ACTION, + FOREIGN KEY (OWNER_ID) REFERENCES SHARING_USER(USER_ID) ON DELETE CASCADE ON UPDATE NO ACTION, + FOREIGN KEY (PARENT_ENTITY_ID) REFERENCES ENTITY(ENTITY_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + +-- ALTER TABLE ENTITY ADD FULLTEXT FULL_TEXT_INDEX(FULL_TEXT); + +CREATE TABLE ENTITY_METADATA ( + ENTITY_ID VARCHAR (255) NOT NULL, + META_KEY VARCHAR (255) NOT NULL, + META_VALUE VARCHAR (255) NOT NULL, + PRIMARY KEY (ENTITY_ID, META_KEY), + FOREIGN KEY (ENTITY_ID) REFERENCES ENTITY(ENTITY_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE SHARING ( + PERMISSION_TYPE_ID VARCHAR(255) NOT NULL, + ENTITY_ID VARCHAR(255) NOT NULL, + GROUP_ID VARCHAR(255) NOT NULL, + SHARING_TYPE VARCHAR(255) NOT NULL, + INHERITED_PARENT_ID VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (PERMISSION_TYPE_ID, ENTITY_ID, GROUP_ID, INHERITED_PARENT_ID), + FOREIGN KEY (PERMISSION_TYPE_ID) REFERENCES PERMISSION_TYPE(PERMISSION_TYPE_ID) ON DELETE CASCADE ON UPDATE NO ACTION, + FOREIGN KEY (INHERITED_PARENT_ID) REFERENCES ENTITY(ENTITY_ID) ON DELETE CASCADE ON UPDATE NO ACTION, + FOREIGN KEY (GROUP_ID) REFERENCES USER_GROUP(GROUP_ID) ON DELETE CASCADE ON UPDATE NO ACTION +); + +CREATE TABLE CONFIGURATION +( + CONFIG_KEY VARCHAR(255) NOT NULL, + CONFIG_VALUE VARCHAR(255) NOT NULL, + PRIMARY KEY(CONFIG_KEY, CONFIG_VALUE) +); + +INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VALUE) VALUES('sharing_reg_version', '0.17'); \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/airavata/blob/e36c145d/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql ---------------------------------------------------------------------- diff --git a/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql new file mode 100644 index 0000000..78d5d78 --- /dev/null +++ b/modules/sharing-registry/sharing-registry-server/src/main/resources/sharing-registry-mysql.sql @@ -0,0 +1,141 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +CREATE TABLE DOMAIN ( + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (DOMAIN_ID) +); + +CREATE TABLE SHARING_USER ( + USER_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + USER_NAME VARCHAR(255) NOT NULL, + FIRST_NAME VARCHAR (255), + LAST_NAME VARCHAR (255), + ICON BLOB, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (USER_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE USER_GROUP ( + GROUP_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + OWNER_ID VARCHAR(255) NOT NULL, + GROUP_TYPE VARCHAR(255) NOT NULL, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (GROUP_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (OWNER_ID) REFERENCES SHARING_USER(USER_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + + +CREATE TABLE GROUP_MEMBERSHIP ( + PARENT_ID VARCHAR(255) NOT NULL, + CHILD_ID VARCHAR(255) NOT NULL, + CHILD_TYPE VARCHAR(255) NOT NULL, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (PARENT_ID, CHILD_ID), + FOREIGN KEY (PARENT_ID) REFERENCES USER_GROUP(GROUP_ID) ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (CHILD_ID) REFERENCES USER_GROUP(GROUP_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE ENTITY_TYPE ( + ENTITY_TYPE_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (ENTITY_TYPE_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE PERMISSION_TYPE ( + PERMISSION_TYPE_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (PERMISSION_TYPE_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE ENTITY ( + ENTITY_ID VARCHAR(255) NOT NULL, + DOMAIN_ID VARCHAR(255) NOT NULL, + ENTITY_TYPE_ID VARCHAR(255) NOT NULL, + OWNER_ID VARCHAR(255) NOT NULL, + PARENT_ENTITY_ID VARCHAR(255), + NAME VARCHAR(255) NOT NULL, + DESCRIPTION VARCHAR(255), + FULL_TEXT TEXT, + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (ENTITY_ID), + FOREIGN KEY (DOMAIN_ID) REFERENCES DOMAIN(DOMAIN_ID) ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (ENTITY_TYPE_ID) REFERENCES ENTITY_TYPE(ENTITY_TYPE_ID) ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (OWNER_ID) REFERENCES SHARING_USER(USER_ID) ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (PARENT_ENTITY_ID) REFERENCES ENTITY(ENTITY_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +ALTER TABLE ENTITY ADD FULLTEXT FULL_TEXT_INDEX(FULL_TEXT); + +CREATE TABLE ENTITY_METADATA ( + ENTITY_ID VARCHAR (255) NOT NULL, + META_KEY VARCHAR (255) NOT NULL, + META_VALUE VARCHAR (255) NOT NULL, + PRIMARY KEY (ENTITY_ID, META_KEY), + FOREIGN KEY (ENTITY_ID) REFERENCES ENTITY(ENTITY_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE SHARING ( + PERMISSION_TYPE_ID VARCHAR(255) NOT NULL, + ENTITY_ID VARCHAR(255) NOT NULL, + GROUP_ID VARCHAR(255) NOT NULL, + SHARING_TYPE VARCHAR(255) NOT NULL, + INHERITED_PARENT_ID VARCHAR(255), + CREATED_TIME BIGINT NOT NULL, + UPDATED_TIME BIGINT NOT NULL, + PRIMARY KEY (PERMISSION_TYPE_ID, ENTITY_ID, GROUP_ID, INHERITED_PARENT_ID), + FOREIGN KEY (PERMISSION_TYPE_ID) REFERENCES PERMISSION_TYPE(PERMISSION_TYPE_ID) ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (INHERITED_PARENT_ID) REFERENCES ENTITY(ENTITY_ID) ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (GROUP_ID) REFERENCES USER_GROUP(GROUP_ID) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE CONFIGURATION +( + CONFIG_KEY VARCHAR(255) NOT NULL, + CONFIG_VALUE VARCHAR(255) NOT NULL, + PRIMARY KEY(CONFIG_KEY, CONFIG_VALUE) +); + +INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VALUE) VALUES('sharing_reg_version', '0.17'); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/airavata/blob/e36c145d/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java ---------------------------------------------------------------------- diff --git a/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java new file mode 100644 index 0000000..cf92856 --- /dev/null +++ b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/SharingRegistryServerHandlerTest.java @@ -0,0 +1,290 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ +package org.apache.airavata.sharing.registry; + +import junit.framework.Assert; +import org.apache.airavata.common.exception.ApplicationSettingsException; +import org.apache.airavata.sharing.registry.models.*; +import org.apache.airavata.sharing.registry.server.SharingRegistryServerHandler; +import org.apache.airavata.sharing.registry.util.Initialize; +import org.apache.thrift.TException; +import org.junit.BeforeClass; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +public class SharingRegistryServerHandlerTest { + private final static Logger logger = LoggerFactory.getLogger(SharingRegistryServerHandlerTest.class); + + @BeforeClass + public static void setup() throws SharingRegistryException, SQLException { + Initialize initialize = new Initialize("sharing-registry-derby.sql"); + initialize.initializeDB(); + } + + @Test + public void test() throws TException, ApplicationSettingsException { + SharingRegistryServerHandler sharingRegistryServerHandler = new SharingRegistryServerHandler(); + + //Creating domain + Domain domain = new Domain(); + String domainId = "test-domain."+System.currentTimeMillis(); + domain.setDomainId(domainId); + domain.setName(domainId); + domain.setDescription("test domain description"); + domain.setCreatedTime(System.currentTimeMillis()); + domain.setUpdatedTime(System.currentTimeMillis()); + + Assert.assertNotNull(sharingRegistryServerHandler.createDomain(domain)); + Assert.assertTrue(sharingRegistryServerHandler.getDomains(0, 10).size() > 0); + + + //Creating users + User user1 = new User(); + String userName1 = "test-user-1." + System.currentTimeMillis(); + String userId1 = domainId + ":" + userName1; + user1.setUserId(userId1); + user1.setUserName(userName1); + user1.setDomainId(domainId); + user1.setCreatedTime(System.currentTimeMillis()); + user1.setUpdatedTime(System.currentTimeMillis()); + + Assert.assertNotNull(sharingRegistryServerHandler.createUser(user1)); + + User user2 = new User(); + String userName2 = "test-user-2." + System.currentTimeMillis(); + String userId2 = domainId + ":" + userName2; + user2.setUserId(userId2); + user2.setUserName(userName2); + user2.setDomainId(domainId); + user2.setCreatedTime(System.currentTimeMillis()); + user2.setUpdatedTime(System.currentTimeMillis()); + + Assert.assertNotNull(sharingRegistryServerHandler.createUser(user2)); + + User user3 = new User(); + String userName3 = "test-user-3." + System.currentTimeMillis(); + String userId3 = domainId + ":" + userName3; + user3.setUserId(userId3); + user3.setUserName(userName3); + user3.setDomainId(domainId); + user3.setCreatedTime(System.currentTimeMillis()); + user3.setUpdatedTime(System.currentTimeMillis()); + + Assert.assertNotNull(sharingRegistryServerHandler.createUser(user3)); + + Assert.assertTrue(sharingRegistryServerHandler.getUsers(domainId, 0, 10).size() > 0); + + // Creating user groups + UserGroup userGroup1 = new UserGroup(); + String groupName1 = "test-group-1." + System.currentTimeMillis(); + String groupId1 = domainId + ":" + groupName1; + userGroup1.setGroupId(groupId1); + userGroup1.setDomainId(domainId); + userGroup1.setName(groupName1); + userGroup1.setDescription("test group description"); + userGroup1.setOwnerId(userId1); + userGroup1.setGroupType(GroupType.MULTI_USER); + userGroup1.setCreatedTime(System.currentTimeMillis()); + userGroup1.setUpdatedTime(System.currentTimeMillis()); + + Assert.assertNotNull(sharingRegistryServerHandler.createGroup(userGroup1)); + + UserGroup userGroup2 = new UserGroup(); + String groupName2 = "test-group-2." + System.currentTimeMillis(); + String groupId2 = domainId + ":" + groupName2; + userGroup2.setGroupId(groupId2); + userGroup2.setDomainId(domainId); + userGroup2.setName(groupName2); + userGroup2.setDescription("test group description"); + userGroup2.setOwnerId(userId2); + userGroup2.setGroupType(GroupType.MULTI_USER); + userGroup2.setCreatedTime(System.currentTimeMillis()); + userGroup2.setUpdatedTime(System.currentTimeMillis()); + + Assert.assertNotNull(sharingRegistryServerHandler.createGroup(userGroup2)); + + sharingRegistryServerHandler.addUsersToGroup(Arrays.asList(userId1), groupId1); + sharingRegistryServerHandler.addUsersToGroup(Arrays.asList(userId2, userId3), groupId2); + sharingRegistryServerHandler.addChildGroupToParentGroup(groupId2, groupId1); + + Assert.assertTrue(sharingRegistryServerHandler.getGroupMembers(groupId1, 0, 10).size() == 2); + Assert.assertTrue(sharingRegistryServerHandler.getGroupMembers(groupId2, 0, 10).size() == 2); + + + //Creating permission types + PermissionType permissionType1 = new PermissionType(); + String permissionName1 = "READ"; + permissionType1.setPermissionTypeId(domainId+":"+permissionName1); + permissionType1.setDomainId(domainId); + permissionType1.setName(permissionName1); + permissionType1.setDescription("READ description"); + permissionType1.setCreatedTime(System.currentTimeMillis()); + permissionType1.setUpdatedTime(System.currentTimeMillis()); + String permissionTypeId1 = sharingRegistryServerHandler.createPermissionType(permissionType1); + Assert.assertNotNull(permissionTypeId1); + + PermissionType permissionType2 = new PermissionType(); + String permissionName2 = "WRITE"; + permissionType2.setPermissionTypeId(domainId+":"+permissionName2); + permissionType2.setDomainId(domainId); + permissionType2.setName(permissionName2); + permissionType2.setDescription("WRITE description"); + permissionType2.setCreatedTime(System.currentTimeMillis()); + permissionType2.setUpdatedTime(System.currentTimeMillis()); + String permissionTypeId2 = sharingRegistryServerHandler.createPermissionType(permissionType2); + Assert.assertNotNull(permissionTypeId2); + + //Creating entity types + EntityType entityType1 = new EntityType(); + String entityType1Name = "Project"; + entityType1.setEntityTypeId(domainId+":"+entityType1Name); + entityType1.setDomainId(domainId); + entityType1.setName(entityType1Name); + entityType1.setDescription("test entity type"); + entityType1.setCreatedTime(System.currentTimeMillis()); + entityType1.setUpdatedTime(System.currentTimeMillis()); + String entityTypeId1 = sharingRegistryServerHandler.createEntityType(entityType1); + Assert.assertNotNull(entityTypeId1); + + EntityType entityType2 = new EntityType(); + String entityType2Name = "Experiment"; + entityType2.setEntityTypeId(domainId+":"+entityType2Name); + entityType2.setDomainId(domainId); + entityType2.setName(entityType2Name); + entityType2.setDescription("test entity type"); + entityType2.setCreatedTime(System.currentTimeMillis()); + entityType2.setUpdatedTime(System.currentTimeMillis()); + String entityTypeId2 = sharingRegistryServerHandler.createEntityType(entityType2); + Assert.assertNotNull(entityTypeId2); + + EntityType entityType3 = new EntityType(); + String entityType3Name = "FileInput"; + entityType3.setEntityTypeId(domainId+":"+entityType3Name); + entityType3.setDomainId(domainId); + entityType3.setName(entityType3Name); + entityType3.setDescription("file input type"); + entityType3.setCreatedTime(System.currentTimeMillis()); + entityType3.setUpdatedTime(System.currentTimeMillis()); + String entityTypeId3 = sharingRegistryServerHandler.createEntityType(entityType3); + Assert.assertNotNull(entityTypeId3); + + //Creating Entities + Entity entity1 = new Entity(); + entity1.setEntityId(domainId+":Entity1"); + entity1.setDomainId(domainId); + entity1.setEntityTypeId(entityTypeId1); + entity1.setOwnerId(userId1); + entity1.setName("Project name 1"); + entity1.setDescription("Project description"); + Map<String, String> metadataMap = new HashMap<>(); + metadataMap.put("key", "val"); + entity1.setMetadata(metadataMap); + entity1.setFullText("Project name project description"); + entity1.setCreatedTime(System.currentTimeMillis()); + entity1.setUpdatedTime(System.currentTimeMillis()); + + String entityId1 = sharingRegistryServerHandler.createEntity(entity1); + Assert.assertNotNull(entityId1); + + Entity entity2 = new Entity(); + entity2.setEntityId(domainId+":Entity2"); + entity2.setDomainId(domainId); + entity2.setEntityTypeId(entityTypeId2); + entity2.setOwnerId(userId1); + entity2.setName("Experiment name"); + entity2.setDescription("Experiment description"); + entity2.setParentEntityId(entityId1); + metadataMap = new HashMap<>(); + metadataMap.put("key", "val"); + entity2.setMetadata(metadataMap); + entity2.setFullText("Project name project description"); + entity2.setCreatedTime(System.currentTimeMillis()); + entity2.setUpdatedTime(System.currentTimeMillis()); + + String entityId2 = sharingRegistryServerHandler.createEntity(entity2); + Assert.assertNotNull(entityId2); + + Entity entity3 = new Entity(); + entity3.setEntityId(domainId+":Entity3"); + entity3.setDomainId(domainId); + entity3.setEntityTypeId(entityTypeId2); + entity3.setOwnerId(userId1); + entity3.setName("Experiment name"); + entity3.setDescription("Experiment description"); + entity3.setParentEntityId(entityId1); + metadataMap = new HashMap<>(); + metadataMap.put("key", "val"); + entity3.setMetadata(metadataMap); + entity3.setFullText("Project name project description"); + entity3.setCreatedTime(System.currentTimeMillis()); + entity3.setUpdatedTime(System.currentTimeMillis()); + + String entityId3 = sharingRegistryServerHandler.createEntity(entity3); + Assert.assertNotNull(entityId3); + + sharingRegistryServerHandler.shareEntityWithUsers(entityId1, Arrays.asList(userId2), permissionTypeId1, true); + sharingRegistryServerHandler.shareEntityWithGroups(entityId3, Arrays.asList(groupId2), permissionTypeId1, true); + + Entity entity4 = new Entity(); + entity4.setEntityId(domainId+":Entity4"); + entity4.setDomainId(domainId); + entity4.setEntityTypeId(entityTypeId3); + entity4.setOwnerId(userId3); + entity4.setName("Input name"); + entity4.setDescription("Input file description"); + entity4.setParentEntityId(entityId3); + metadataMap = new HashMap<>(); + metadataMap.put("key", "val"); + entity4.setMetadata(metadataMap); + entity4.setFullText("Input File"); + entity4.setCreatedTime(System.currentTimeMillis()); + entity4.setUpdatedTime(System.currentTimeMillis()); + + String entityId4 = sharingRegistryServerHandler.createEntity(entity4); + Assert.assertNotNull(entityId4); + + Assert.assertTrue(sharingRegistryServerHandler.userHasAccess(domainId, userId3, entityId4, permissionTypeId1)); + Assert.assertTrue(sharingRegistryServerHandler.userHasAccess(domainId, userId2, entityId4, permissionTypeId1)); + Assert.assertTrue(sharingRegistryServerHandler.userHasAccess(domainId, userId1, entityId4, permissionTypeId1)); + Assert.assertFalse(sharingRegistryServerHandler.userHasAccess(domainId, userId3, entityId1, permissionTypeId1)); + + ArrayList<SearchCriteria> filters = new ArrayList<>(); + SearchCriteria searchCriteria = new SearchCriteria(); + searchCriteria.setSearchCondition(SearchCondition.LIKE); + searchCriteria.setValue("Input"); + searchCriteria.setSearchField(EntitySearchField.NAME); + filters.add(searchCriteria); + Assert.assertTrue(sharingRegistryServerHandler.searchEntities(userId1, entityTypeId3, filters, 0, -1).size() > 0); + + Assert.assertNotNull(sharingRegistryServerHandler.getListOfSharedUsers(entityId1, permissionTypeId1)); + Assert.assertNotNull(sharingRegistryServerHandler.getListOfSharedGroups(entityId1, permissionTypeId1)); + +// sharingRegistryServerHandler.revokeEntitySharingFromUsers(entityId1, Arrays.asList(userId2), permissionTypeId1); +// sharingRegistryServerHandler.revokeEntitySharingFromGroups(entityId3, Arrays.asList(groupId2), permissionTypeId1); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/airavata/blob/e36c145d/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/util/Initialize.java ---------------------------------------------------------------------- diff --git a/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/util/Initialize.java b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/util/Initialize.java new file mode 100644 index 0000000..4a89094 --- /dev/null +++ b/modules/sharing-registry/sharing-registry-server/src/test/java/org/apache/airavata/sharing/registry/util/Initialize.java @@ -0,0 +1,298 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +package org.apache.airavata.sharing.registry.util; + +import org.apache.airavata.common.exception.ApplicationSettingsException; +import org.apache.airavata.common.utils.ServerSettings; +import org.apache.airavata.sharing.registry.db.utils.JPAUtils; +import org.apache.derby.drda.NetworkServerControl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.InetAddress; +import java.net.URI; +import java.sql.*; +import java.util.StringTokenizer; + +public class Initialize { + private static final Logger logger = LoggerFactory.getLogger(Initialize.class); + public static final String DERBY_SERVER_MODE_SYS_PROPERTY = "derby.drda.startNetworkServer"; + public String scriptName ; + private NetworkServerControl server; + private static final String delimiter = ";"; + public static final String PERSISTANT_DATA = "Configuration"; + + public Initialize(String scriptName) { + this.scriptName = scriptName; + } + + public static boolean checkStringBufferEndsWith(StringBuffer buffer, String suffix) { + if (suffix.length() > buffer.length()) { + return false; + } + // this loop is done on purpose to avoid memory allocation performance + // problems on various JDKs + // StringBuffer.lastIndexOf() was introduced in jdk 1.4 and + // implementation is ok though does allocation/copying + // StringBuffer.toString().endsWith() does massive memory + // allocation/copying on JDK 1.5 + // See http://issues.apache.org/bugzilla/show_bug.cgi?id=37169 + int endIndex = suffix.length() - 1; + int bufferIndex = buffer.length() - 1; + while (endIndex >= 0) { + if (buffer.charAt(bufferIndex) != suffix.charAt(endIndex)) { + return false; + } + bufferIndex--; + endIndex--; + } + return true; + } + + private static boolean isServerStarted(NetworkServerControl server, int ntries) + { + for (int i = 1; i <= ntries; i ++) + { + try { + Thread.sleep(500); + server.ping(); + return true; + } + catch (Exception e) { + if (i == ntries) + return false; + } + } + return false; + } + + public void initializeDB() throws SQLException{ + String jdbcUrl = null; + String jdbcUser = null; + String jdbcPassword = null; + try{ + jdbcUrl = ServerSettings.getSetting("sharingcatalog.jdbc.url"); + jdbcUser = ServerSettings.getSetting("sharingcatalog.jdbc.user"); + jdbcPassword = ServerSettings.getSetting("sharingcatalog.jdbc.password"); + jdbcUrl = jdbcUrl + "?" + "user=" + jdbcUser + "&" + "password=" + jdbcPassword; + } catch (ApplicationSettingsException e) { + logger.error("Unable to read properties", e); + } + startDerbyInServerMode(); + if(!isServerStarted(server, 20)){ + throw new RuntimeException("Derby server cound not started within five seconds..."); + } + + Connection conn = null; + try { + Class.forName(JPAUtils.readServerProperties(JPAUtils.SHARING_REG_JDBC_DRIVER)).newInstance(); + conn = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword); + if (!isDatabaseStructureCreated(PERSISTANT_DATA, conn)) { + executeSQLScript(conn); + logger.info("New Database created for Registry"); + } else { + logger.debug("Database already created for Registry!"); + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new RuntimeException("Database failure", e); + } finally { + try { + if (conn != null){ + if (!conn.getAutoCommit()) { + conn.commit(); + } + conn.close(); + } + } catch (SQLException e) { + logger.error(e.getMessage(), e); + } + } + } + + public static boolean isDatabaseStructureCreated(String tableName, Connection conn) { + try { + System.out.println("Running a query to test the database tables existence."); + // check whether the tables are already created with a query + Statement statement = null; + try { + statement = conn.createStatement(); + ResultSet rs = statement.executeQuery("select * from " + tableName); + if (rs != null) { + rs.close(); + } + } finally { + try { + if (statement != null) { + statement.close(); + } + } catch (SQLException e) { + return false; + } + } + } catch (SQLException e) { + return false; + } + + return true; + } + + private void executeSQLScript(Connection conn) throws Exception { + StringBuffer sql = new StringBuffer(); + BufferedReader reader = null; + try{ + + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(scriptName); + reader = new BufferedReader(new InputStreamReader(inputStream)); + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (line.startsWith("//")) { + continue; + } + if (line.startsWith("--")) { + continue; + } + StringTokenizer st = new StringTokenizer(line); + if (st.hasMoreTokens()) { + String token = st.nextToken(); + if ("REM".equalsIgnoreCase(token)) { + continue; + } + } + sql.append(" ").append(line); + + // SQL defines "--" as a comment to EOL + // and in Oracle it may contain a hint + // so we cannot just remove it, instead we must end it + if (line.indexOf("--") >= 0) { + sql.append("\n"); + } + if ((checkStringBufferEndsWith(sql, delimiter))) { + executeSQL(sql.substring(0, sql.length() - delimiter.length()), conn); + sql.replace(0, sql.length(), ""); + } + } + // Catch any statements not followed by ; + if (sql.length() > 0) { + executeSQL(sql.toString(), conn); + } + }catch (IOException e){ + logger.error("Error occurred while executing SQL script for creating Airavata database", e); + throw new Exception("Error occurred while executing SQL script for creating Airavata database", e); + }finally { + if (reader != null) { + reader.close(); + } + + } + + } + + private static void executeSQL(String sql, Connection conn) throws Exception { + // Check and ignore empty statements + if ("".equals(sql.trim())) { + return; + } + + Statement statement = null; + try { + logger.debug("SQL : " + sql); + + boolean ret; + int updateCount = 0, updateCountTotal = 0; + statement = conn.createStatement(); + ret = statement.execute(sql); + updateCount = statement.getUpdateCount(); + do { + if (!ret) { + if (updateCount != -1) { + updateCountTotal += updateCount; + } + } + ret = statement.getMoreResults(); + if (ret) { + updateCount = statement.getUpdateCount(); + } + } while (ret); + + logger.debug(sql + " : " + updateCountTotal + " rows affected"); + + SQLWarning warning = conn.getWarnings(); + while (warning != null) { + logger.warn(warning + " sql warning"); + warning = warning.getNextWarning(); + } + conn.clearWarnings(); + } catch (SQLException e) { + if (e.getSQLState().equals("X0Y32")) { + // eliminating the table already exception for the derby + // database + logger.info("Table Already Exists", e); + } else { + throw new Exception("Error occurred while executing : " + sql, e); + } + } finally { + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + logger.error("Error occurred while closing result set.", e); + } + } + } + } + + private void startDerbyInServerMode() { + try { + System.setProperty(DERBY_SERVER_MODE_SYS_PROPERTY, "true"); + String jdbcURL = JPAUtils.readServerProperties(JPAUtils.SHARING_REG_JDBC_URL); + String cleanURI = jdbcURL.substring(5); + URI uri = URI.create(cleanURI); + server = new NetworkServerControl(InetAddress.getByName(uri.getHost()), + 20000, + JPAUtils.readServerProperties(JPAUtils.SHARING_REG_JDBC_USER), JPAUtils.readServerProperties(JPAUtils.SHARING_REG_JDBC_USER)); + java.io.PrintWriter consoleWriter = new java.io.PrintWriter(System.out, true); + server.start(consoleWriter); + } catch (IOException e) { + logger.error("Unable to start Apache derby in the server mode! Check whether " + + "specified port is available"); + } catch (Exception e) { + logger.error("Unable to start Apache derby in the server mode! Check whether " + + "specified port is available"); + } + + } + + public void stopDerbyServer() throws SQLException{ + try { + server.shutdown(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new SQLException("Error while stopping derby server", e); + } + } +} http://git-wip-us.apache.org/repos/asf/airavata/blob/e36c145d/modules/sharing-registry/sharing-registry-stubs/pom.xml ---------------------------------------------------------------------- diff --git a/modules/sharing-registry/sharing-registry-stubs/pom.xml b/modules/sharing-registry/sharing-registry-stubs/pom.xml index eb47dc9..56e8eb4 100644 --- a/modules/sharing-registry/sharing-registry-stubs/pom.xml +++ b/modules/sharing-registry/sharing-registry-stubs/pom.xml @@ -16,7 +16,7 @@ <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> - <version>0.9.3</version> + <version>${thrift.version}</version> </dependency> </dependencies>