Add User Profile Core to Profile Service

Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/fcc06e0f
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/fcc06e0f
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/fcc06e0f

Branch: refs/heads/develop
Commit: fcc06e0ff3502de42a2010b420a9d90f43eafb14
Parents: b9bbb78
Author: Gourav Shenoy <[email protected]>
Authored: Sun Mar 5 17:45:13 2017 -0500
Committer: Gourav Shenoy <[email protected]>
Committed: Sun Mar 5 17:45:13 2017 -0500

----------------------------------------------------------------------
 airavata-services/pom.xml                       |   6 +
 airavata-services/profile-service/pom.xml       |   2 +
 .../profile-service/profile-user-core/pom.xml   | 114 +++++++++
 .../user/core/UserProfileRegistryException.java |  28 +++
 .../core/entities/NSFDemographicsEntity.java    |  94 +++++++
 .../user/core/entities/UserProfileEntity.java   | 247 +++++++++++++++++++
 .../core/repositories/AbstractRepository.java   |  98 ++++++++
 .../repositories/UserProfileRepository.java     |  87 +++++++
 .../profile/user/core/utils/Committer.java      |  27 ++
 .../profile/user/core/utils/JPAConstants.java   |  33 +++
 .../profile/user/core/utils/JPAUtils.java       |  83 +++++++
 .../user/core/utils/ObjectMapperSingleton.java  |  39 +++
 .../profile/user/core/utils/QueryConstants.java |  22 ++
 .../service/profile/user/core/utils/Utils.java  | 155 ++++++++++++
 .../src/main/resources/META-INF/persistence.xml |  33 +++
 .../src/main/resources/user_profile_catalog.sql |  84 +++++++
 .../repositories/WorkspaceRepositoryTest.java   | 176 +++++++++++++
 17 files changed, 1328 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/pom.xml
----------------------------------------------------------------------
diff --git a/airavata-services/pom.xml b/airavata-services/pom.xml
index 5d82eab..58d61ec 100644
--- a/airavata-services/pom.xml
+++ b/airavata-services/pom.xml
@@ -17,6 +17,12 @@
 
     <dependencies>
         <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.thrift</groupId>
             <artifactId>libthrift</artifactId>
             <version>${thrift.version}</version>

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/pom.xml
----------------------------------------------------------------------
diff --git a/airavata-services/profile-service/pom.xml 
b/airavata-services/profile-service/pom.xml
index bfe9510..d6ee487 100644
--- a/airavata-services/profile-service/pom.xml
+++ b/airavata-services/profile-service/pom.xml
@@ -19,6 +19,8 @@
 
     <modules>
         <module>profile-service-stubs</module>
+        <module>profile-user-core</module>
+        <module>profile-service-server</module>
     </modules>
     
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/pom.xml
----------------------------------------------------------------------
diff --git a/airavata-services/profile-service/profile-user-core/pom.xml 
b/airavata-services/profile-service/profile-user-core/pom.xml
new file mode 100644
index 0000000..8eba129
--- /dev/null
+++ b/airavata-services/profile-service/profile-user-core/pom.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <parent>
+        <groupId>org.apache.airavata</groupId>
+        <artifactId>profile-service</artifactId>
+        <version>0.17-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>profile-user-core</artifactId>
+
+    <properties>
+        <derby.version>10.11.1.1</derby.version>
+        <surefire.version>2.18.1</surefire.version>
+        <skipTests>false</skipTests>
+        <mysql.connector.version>5.1.34</mysql.connector.version>
+        <openjpa.version>2.2.0</openjpa.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>net.sf.dozer</groupId>
+            <artifactId>dozer</artifactId>
+            <version>5.4.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.openjpa</groupId>
+            <artifactId>openjpa-all</artifactId>
+            <version>${openjpa.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>${mysql.connector.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <version>${derby.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derbyclient</artifactId>
+            <version>${derby.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derbynet</artifactId>
+            <version>${derby.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derbytools</artifactId>
+            <version>${derby.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.1</version>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.openjpa</groupId>
+                <artifactId>openjpa-maven-plugin</artifactId>
+                <version>2.2.0</version>
+                <configuration>
+                    <includes>**/entities/*.class</includes>
+                    <excludes>**/entities/XML*.class</excludes>
+                    <addDefaultConstructor>true</addDefaultConstructor>
+                    
<enforcePropertyRestrictions>true</enforcePropertyRestrictions>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>enhancer</id>
+                        <phase>process-classes</phase>
+                        <goals>
+                            <goal>enhance</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.openjpa</groupId>
+                        <artifactId>openjpa</artifactId>
+                        <version>${openjpa.version}</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${surefire.version}</version>
+                <inherited>true</inherited>
+                <configuration>
+                    <failIfNoTests>false</failIfNoTests>
+                    <!--<skipTests>${skipTests}</skipTests>-->
+                    <skipTests>true</skipTests>
+                    
<workingDirectory>${project.build.testOutputDirectory}</workingDirectory>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/UserProfileRegistryException.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/UserProfileRegistryException.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/UserProfileRegistryException.java
new file mode 100644
index 0000000..7aee651
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/UserProfileRegistryException.java
@@ -0,0 +1,28 @@
+/*
+ *
+ * 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.service.profile.user.core;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UserProfileRegistryException extends Exception {
+    private final static Logger logger = 
LoggerFactory.getLogger(UserProfileRegistryException.class);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/NSFDemographicsEntity.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/NSFDemographicsEntity.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/NSFDemographicsEntity.java
new file mode 100644
index 0000000..7c1701b
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/NSFDemographicsEntity.java
@@ -0,0 +1,94 @@
+/*
+ *
+ * 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.service.profile.user.core.entities;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name = "NSF_DEMOGRAPHIC")
+public class NSFDemographicsEntity {
+    private String airavataInternalUserId;
+    private String gender;
+    private List<String> ethnicities;
+    private List<String> races;
+    private List<String> disabilities;
+    private UserProfileEntity userProfile;
+
+    @Id
+    @Column(name = "AIRAVATA_INTERNAL_USER_ID")
+    public String getAiravataInternalUserId() {
+        return airavataInternalUserId;
+    }
+
+    public void setAiravataInternalUserId(String userId) {
+        this.airavataInternalUserId = userId;
+    }
+
+    @Column(name = "GENDER")
+    public String getGender() {
+        return gender;
+    }
+
+    public void setGender(String gender) {
+        this.gender = gender;
+    }
+
+    @ElementCollection
+    @CollectionTable(name="NSF_DEMOGRAPHIC_ETHNICITY", joinColumns = 
@JoinColumn(name="AIRAVATA_INTERNAL_USER_ID"))
+    public List<String> getEthnicities() {
+        return ethnicities;
+    }
+
+    public void setEthnicities(List<String> ethnicities) {
+        this.ethnicities = ethnicities;
+    }
+
+    @ElementCollection
+    @CollectionTable(name="NSF_DEMOGRAPHIC_RACE", joinColumns = 
@JoinColumn(name="AIRAVATA_INTERNAL_USER_ID"))
+    public List<String> getRaces() {
+        return races;
+    }
+
+    public void setRaces(List<String> races) {
+        this.races = races;
+    }
+
+    @ElementCollection
+    @CollectionTable(name="NSF_DEMOGRAPHIC_DISABILITY", joinColumns = 
@JoinColumn(name="AIRAVATA_INTERNAL_USER_ID"))
+    public List<String> getDisabilities() {
+        return disabilities;
+    }
+
+    public void setDisabilities(List<String> disabilities) {
+        this.disabilities = disabilities;
+    }
+
+    @OneToOne(targetEntity = UserProfileEntity.class, cascade = 
CascadeType.ALL)
+    @PrimaryKeyJoinColumn(name = "AIRAVATA_INTERNAL_USER_ID", 
referencedColumnName = "AIRAVATA_INTERNAL_USER_ID")
+    public UserProfileEntity getUserProfile() {
+        return userProfile;
+    }
+
+    public void setUserProfile(UserProfileEntity userProfile) {
+        this.userProfile = userProfile;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/UserProfileEntity.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/UserProfileEntity.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/UserProfileEntity.java
new file mode 100644
index 0000000..d8444c0
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/entities/UserProfileEntity.java
@@ -0,0 +1,247 @@
+/*
+ *
+ * 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.service.profile.user.core.entities;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@Table(name="USER_PROFILE")
+public class UserProfileEntity {
+    private String airavataInternalUserId;
+    private String userId;
+    private String gatewayId;
+    private String userModelVersion;
+    private String userName;
+    private String orcidId;
+    private String country;
+    private String homeOrganization;
+    private String orginationAffiliation;
+    private long creationTime;
+    private long lastAccessTime;
+    private long validUntil;
+    private String state;
+    private String comments;
+    private List<String> labeledURI;
+    private String gpgKey;
+    private String timeZone;
+
+    private List<String> nationality;
+    private List<String> emails;
+    private List<String> phones;
+    private NSFDemographicsEntity nsfDemographics;
+
+    @Id
+    @Column(name = "AIRAVATA_INTERNAL_USER_ID")
+    public String getAiravataInternalUserId() {
+        return airavataInternalUserId;
+    }
+
+    public void setAiravataInternalUserId(String id) {
+        this.airavataInternalUserId = id;
+    }
+
+    @Column(name = "USER_ID")
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    @Column(name = "GATEWAY_ID")
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    @Column(name = "USER_MODEL_VERSION")
+    public String getUserModelVersion() {
+        return userModelVersion;
+    }
+
+    public void setUserModelVersion(String userModelVersion) {
+        this.userModelVersion = userModelVersion;
+    }
+
+    @ElementCollection(fetch = FetchType.EAGER)
+    @CollectionTable(name="USER_PROFILE_EMAIL", joinColumns = 
@JoinColumn(name="AIRAVATA_INTERNAL_USER_ID"))
+    public List<String> getEmails() {
+        return emails;
+    }
+
+    public void setEmails(List<String> emails) {
+        this.emails = emails;
+    }
+
+    @Column(name = "USER_NAME")
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    @Column(name = "ORCID_ID")
+    public String getOrcidId() {
+        return orcidId;
+    }
+
+    public void setOrcidId(String orcidId) {
+        this.orcidId = orcidId;
+    }
+
+    @ElementCollection(fetch = FetchType.EAGER)
+    @CollectionTable(name="USER_PROFILE_PHONE", joinColumns = 
@JoinColumn(name="AIRAVATA_INTERNAL_USER_ID"))
+    public List<String> getPhones() {
+        return phones;
+    }
+
+    public void setPhones(List<String> phones) {
+        this.phones = phones;
+    }
+
+    @Column(name = "COUNTRY")
+    public String getCountry() {
+        return country;
+    }
+
+    public void setCountry(String country) {
+        this.country = country;
+    }
+
+    @ElementCollection(fetch = FetchType.EAGER)
+    @CollectionTable(name="USER_PROFILE_NATIONALITY", joinColumns = 
@JoinColumn(name="AIRAVATA_INTERNAL_USER_ID"))
+    public List<String> getNationality() {
+        return nationality;
+    }
+
+    public void setNationality(List<String> nationality) {
+        this.nationality = nationality;
+    }
+
+    @Column(name = "HOME_ORGANIZATION")
+    public String getHomeOrganization() {
+        return homeOrganization;
+    }
+
+    public void setHomeOrganization(String homeOrganization) {
+        this.homeOrganization = homeOrganization;
+    }
+
+    @Column(name = "ORIGINATION_AFFILIATION")
+    public String getOrginationAffiliation() {
+        return orginationAffiliation;
+    }
+
+    public void setOrginationAffiliation(String orginationAffiliation) {
+        this.orginationAffiliation = orginationAffiliation;
+    }
+
+    @Column(name="CREATION_TIME")
+    public long getCreationTime() {
+        return creationTime;
+    }
+
+    public void setCreationTime(long creationTime) {
+        this.creationTime = creationTime;
+    }
+
+    @Column(name = "LAST_ACCESS_TIME")
+    public long getLastAccessTime() {
+        return lastAccessTime;
+    }
+
+    public void setLastAccessTime(long lastAccessTime) {
+        this.lastAccessTime = lastAccessTime;
+    }
+
+    @Column(name = "VALID_UNTIL")
+    public long getValidUntil() {
+        return validUntil;
+    }
+
+    public void setValidUntil(long validUntil) {
+        this.validUntil = validUntil;
+    }
+
+    @Column(name = "STATE")
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    @Lob
+    @Column(name = "COMMENTS")
+    public String getComments() {
+        return comments;
+    }
+
+    public void setComments(String comments) {
+        this.comments = comments;
+    }
+
+    @ElementCollection(fetch = FetchType.EAGER)
+    @CollectionTable(name="USER_PROFILE_LABELED_URI", joinColumns = 
@JoinColumn(name="AIRAVATA_INTERNAL_USER_ID"))
+    public List<String> getLabeledURI() {
+        return labeledURI;
+    }
+
+    public void setLabeledURI(List<String> labeledURI) {
+        this.labeledURI = labeledURI;
+    }
+
+    @Lob
+    @Column(name = "GPG_KEY")
+    public String getGpgKey() {
+        return gpgKey;
+    }
+
+    public void setGpgKey(String gpgKey) {
+        this.gpgKey = gpgKey;
+    }
+
+    @Column(name = "TIME_ZONE")
+    public String getTimeZone() {
+        return timeZone;
+    }
+
+    public void setTimeZone(String timeZone) {
+        this.timeZone = timeZone;
+    }
+
+    @OneToOne(targetEntity = NSFDemographicsEntity.class, cascade = 
CascadeType.ALL, mappedBy = "userProfile", fetch = FetchType.EAGER)
+    public NSFDemographicsEntity getNsfDemographics() {
+        return nsfDemographics;
+    }
+
+    public void setNsfDemographics(NSFDemographicsEntity nsfDemographics) {
+        this.nsfDemographics = nsfDemographics;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/AbstractRepository.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/AbstractRepository.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/AbstractRepository.java
new file mode 100644
index 0000000..3cf6925
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/AbstractRepository.java
@@ -0,0 +1,98 @@
+/*
+ *
+ * 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.service.profile.user.core.repositories;
+
+import org.apache.airavata.service.profile.user.core.utils.JPAUtils;
+import 
org.apache.airavata.service.profile.user.core.utils.ObjectMapperSingleton;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.Query;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public abstract class AbstractRepository<T, E, Id> {
+    private final static Logger logger = 
LoggerFactory.getLogger(AbstractRepository.class);
+
+    private Class<T> thriftGenericClass;
+    private Class<E> dbEntityGenericClass;
+
+    public AbstractRepository(Class<T> thriftGenericClass, Class<E> 
dbEntityGenericClass) {
+        this.thriftGenericClass = thriftGenericClass;
+        this.dbEntityGenericClass = dbEntityGenericClass;
+    }
+
+    public T create(T t) {
+        return update(t);
+    }
+
+    public T update(T t) {
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        E entity = mapper.map(t, dbEntityGenericClass);
+        E persistedCopy = JPAUtils.execute(entityManager -> 
entityManager.merge(entity));
+        return mapper.map(persistedCopy, thriftGenericClass);
+    }
+
+    public boolean delete(Id id) {
+        JPAUtils.execute(entityManager -> {
+            E entity = entityManager.find(dbEntityGenericClass, id);
+            entityManager.remove(entity);
+            return entity;
+        });
+        return true;
+    }
+
+    public T get(Id id) {
+        E entity = JPAUtils.execute(entityManager -> entityManager
+                .find(dbEntityGenericClass, id));
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        return mapper.map(entity, thriftGenericClass);
+    }
+
+    public List<T> select(String query, int limit, int offset) {
+        List resultSet = (List) JPAUtils.execute(entityManager -> 
entityManager.createQuery(query).setFirstResult(offset)
+                .setMaxResults(offset).getResultList());
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        List<T> gatewayList = new ArrayList<>();
+        resultSet.stream().forEach(rs -> gatewayList.add(mapper.map(rs, 
thriftGenericClass)));
+        return gatewayList;
+    }
+
+    public List<T> select(String query, int limit, int offset, Map<String, 
Object> queryParams) {
+        List resultSet = (List) JPAUtils.execute(entityManager -> {
+            Query jpaQuery = entityManager.createQuery(query);
+
+            for (Map.Entry<String, Object> entry : queryParams.entrySet()) {
+
+                jpaQuery.setParameter(entry.getKey(), entry.getValue());
+            }
+
+            return 
jpaQuery.setFirstResult(offset).setMaxResults(limit).getResultList();
+
+        });
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        List<T> gatewayList = new ArrayList<>();
+        resultSet.stream().forEach(rs -> gatewayList.add(mapper.map(rs, 
thriftGenericClass)));
+        return gatewayList;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/UserProfileRepository.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/UserProfileRepository.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/UserProfileRepository.java
new file mode 100644
index 0000000..8fd799b
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/repositories/UserProfileRepository.java
@@ -0,0 +1,87 @@
+/*
+ *
+ * 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.service.profile.user.core.repositories;
+
+import org.apache.airavata.model.user.UserProfile;
+import 
org.apache.airavata.service.profile.user.core.entities.UserProfileEntity;
+import org.apache.airavata.service.profile.user.core.utils.QueryConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class UserProfileRepository extends AbstractRepository<UserProfile, 
UserProfileEntity, String> {
+    private final static Logger logger = 
LoggerFactory.getLogger(UserProfileRepository.class);
+
+    public UserProfileRepository(Class<UserProfile> thriftGenericClass, 
Class<UserProfileEntity> dbEntityGenericClass) {
+        super(thriftGenericClass, dbEntityGenericClass);
+    }
+
+    @Override
+    public List<UserProfile> select(String query, int offset, int limit) {
+        throw new UnsupportedOperationException("Due to performance overheads 
this method is not supported. Instead use" +
+                " UserProfileSummaryRepository");
+    }
+
+    public UserProfile getUserProfileByIdAndGateWay(String userId, String 
gatewayId)   {
+
+        UserProfile userProfile = null;
+
+        Map<String, Object> queryParam = new HashMap<String, Object>();
+        queryParam.put(UserProfile._Fields.USER_ID.getFieldName(), userId);
+        queryParam.put(UserProfile._Fields.GATEWAY_ID.getFieldName(), 
gatewayId);
+        List<UserProfile> resultList = 
select(QueryConstants.FIND_USER_PROFILE_BY_USER_ID, 1, 0, queryParam);
+
+        if (resultList != null && resultList.size() > 0)
+            userProfile =  resultList.get(0);
+
+
+        return userProfile;
+    }
+
+    public List<UserProfile> getAllUserProfilesInGateway(String gatewayId, int 
offset, int limit)  {
+
+        Map<String, Object> queryParam = new HashMap<String, Object>();
+        queryParam.put(UserProfile._Fields.GATEWAY_ID.getFieldName(), 
gatewayId);
+
+        List<UserProfile> resultList = 
select(QueryConstants.FIND_ALL_USER_PROFILES_BY_GATEWAY_ID, limit, offset, 
queryParam);
+
+        return  resultList;
+    }
+
+    public UserProfile getUserProfileByNameAndGateWay(String name, String 
gatewayId)   {
+
+        UserProfile userProfile = null;
+
+        Map<String, Object> queryParam = new HashMap<String, Object>();
+        queryParam.put(UserProfile._Fields.USER_NAME.getFieldName(), name);
+        queryParam.put(UserProfile._Fields.GATEWAY_ID.getFieldName(), 
gatewayId);
+        List<UserProfile> resultList = 
select(QueryConstants.FIND_USER_PROFILE_BY_USER_NAME, 0, 1, queryParam);
+
+        if (resultList != null && resultList.size() > 0)
+            userProfile =  resultList.get(0);
+
+
+        return userProfile;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Committer.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Committer.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Committer.java
new file mode 100644
index 0000000..e55c2ad
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Committer.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * 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.service.profile.user.core.utils;
+
+@FunctionalInterface
+public interface Committer<T, R>  {
+
+    R commit(T t);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAConstants.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAConstants.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAConstants.java
new file mode 100644
index 0000000..8350f4c
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAConstants.java
@@ -0,0 +1,33 @@
+/*
+ *
+ * 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.service.profile.user.core.utils;
+public class JPAConstants {
+       public static final String KEY_JDBC_URL = 
"user.profile.catalog.registry.jdbc.url";
+       public static final String KEY_JDBC_USER = 
"user.profile.catalog.registry.jdbc.user";
+       public static final String KEY_JDBC_PASSWORD = 
"user.profile.catalog.registry.jdbc.password";
+       public static final String KEY_JDBC_DRIVER = 
"user.profile.catalog.registry.jdbc.driver";
+       // TODO: is this needed?
+       public static final String KEY_DERBY_START_ENABLE = 
"user.profile.catalog.start.derby.server.mode";
+       public static final String VALIDATION_QUERY = 
"user.profile.catalog.validationQuery";
+       public static final String JPA_CACHE_SIZE = 
"user.profile.catalog.jpa.cache.size";
+       public static final String ENABLE_CACHING = 
"user.profile.catalog.cache.enable";
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAUtils.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAUtils.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAUtils.java
new file mode 100644
index 0000000..3e95efd
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/JPAUtils.java
@@ -0,0 +1,83 @@
+/*
+ *
+ * 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.service.profile.user.core.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.*;
+import java.util.HashMap;
+import java.util.Map;
+
+public class JPAUtils {
+    private final static Logger logger = 
LoggerFactory.getLogger(JPAUtils.class);
+    private static final String PERSISTENCE_UNIT_NAME = "user_profile_catalog";
+    @PersistenceUnit(unitName = "user_profile_catalog")
+    protected static EntityManagerFactory factory;
+    @PersistenceContext(unitName = "user_profile_catalog")
+    private static EntityManager entityManager;
+
+    public static EntityManager getEntityManager(){
+
+        if (factory == null) {
+            //FIXME
+            String connectionProperties = "DriverClassName=" + 
Utils.getJDBCDriver() + "," + "Url=" +
+                    Utils.getJDBCURL() + "?autoReconnect=true," +
+                    "Username=" + Utils.getJDBCUser() + "," + "Password=" + 
Utils.getJDBCPassword() +
+                    ",validationQuery=" + Utils.getValidationQuery();
+            logger.info(connectionProperties);
+            Map<String, String> properties = new HashMap<String, String>();
+            properties.put("openjpa.ConnectionDriverName", 
"org.apache.commons.dbcp.BasicDataSource");
+            properties.put("openjpa.ConnectionProperties", 
connectionProperties);
+            properties.put("openjpa.DynamicEnhancementAgent", "true");
+            properties.put("openjpa.RuntimeUnenhancedClasses", "warn");
+            properties.put("openjpa.RemoteCommitProvider", "sjvm");
+            properties.put("openjpa.Log", "DefaultLevel=INFO, Runtime=INFO, 
Tool=INFO, SQL=INFO");
+            properties.put("openjpa.jdbc.SynchronizeMappings", 
"buildSchema(ForeignKeys=true)");
+            properties.put("openjpa.jdbc.QuerySQLCache", "false");
+            properties.put("openjpa.ConnectionFactoryProperties", 
"PrettyPrint=true, PrettyPrintLineLength=72," +
+                    " PrintParameters=true, MaxActive=10, MaxIdle=5, 
MinIdle=2, MaxWait=31536000,  autoReconnect=true");
+            factory = 
Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, properties);
+        }
+
+        entityManager = factory.createEntityManager();
+        return entityManager;
+    }
+
+    public static <R> R execute(Committer<EntityManager, R> committer){
+        EntityManager entityManager = JPAUtils.getEntityManager();
+        try {
+            entityManager.getTransaction().begin();
+            R r = committer.commit(entityManager);
+            entityManager.getTransaction().commit();
+            return  r;
+        }finally {
+            if (entityManager != null && entityManager.isOpen()) {
+                if (entityManager.getTransaction().isActive()) {
+                    entityManager.getTransaction().rollback();
+                }
+                entityManager.close();
+            }
+        }
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/ObjectMapperSingleton.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/ObjectMapperSingleton.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/ObjectMapperSingleton.java
new file mode 100644
index 0000000..60f3292
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/ObjectMapperSingleton.java
@@ -0,0 +1,39 @@
+/*
+ *
+ * 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.service.profile.user.core.utils;
+
+import org.dozer.DozerBeanMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ObjectMapperSingleton extends DozerBeanMapper{
+    private final static Logger logger = 
LoggerFactory.getLogger(ObjectMapperSingleton.class);
+
+    private static ObjectMapperSingleton instance;
+
+    private ObjectMapperSingleton(){}
+
+    public static ObjectMapperSingleton getInstance(){
+        if(instance == null)
+            instance = new ObjectMapperSingleton();
+        return instance;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/QueryConstants.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/QueryConstants.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/QueryConstants.java
new file mode 100644
index 0000000..5ad5dde
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/QueryConstants.java
@@ -0,0 +1,22 @@
+package org.apache.airavata.service.profile.user.core.utils;
+
+import org.apache.airavata.model.user.UserProfile;
+
+/**
+ * Created by abhij on 11/11/2016.
+ */
+public interface QueryConstants {
+
+
+
+    String FIND_USER_PROFILE_BY_USER_ID = "SELECT u FROM UserProfileEntity u " 
+
+            "where u.userId LIKE :" + 
UserProfile._Fields.USER_ID.getFieldName() + " " +
+            "AND u.gatewayId LIKE :"+ 
UserProfile._Fields.GATEWAY_ID.getFieldName() + "";
+
+    String FIND_ALL_USER_PROFILES_BY_GATEWAY_ID = "SELECT u FROM 
UserProfileEntity u " +
+            "where u.gatewayId LIKE :"+ 
UserProfile._Fields.GATEWAY_ID.getFieldName() + "";
+
+    String FIND_USER_PROFILE_BY_USER_NAME = "SELECT u FROM UserProfileEntity u 
" +
+            "where u.userId LIKE :" + 
UserProfile._Fields.USER_NAME.getFieldName() + " " +
+            "AND u.gatewayId LIKE :"+ 
UserProfile._Fields.GATEWAY_ID.getFieldName() + "";
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Utils.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Utils.java
 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Utils.java
new file mode 100644
index 0000000..a12a536
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/java/org/apache/airavata/service/profile/user/core/utils/Utils.java
@@ -0,0 +1,155 @@
+/*
+ *
+ * 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.service.profile.user.core.utils;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.URI;
+
+
+public class Utils {
+    private final static Logger logger = LoggerFactory.getLogger(Utils.class);
+
+    public static String getJDBCFullURL(){
+               String jdbcUrl = getJDBCURL();
+               String jdbcUser = getJDBCUser();
+               String jdbcPassword = getJDBCPassword();
+        jdbcUrl = jdbcUrl + "?"  + "user=" + jdbcUser + "&" + "password=" + 
jdbcPassword;
+        return jdbcUrl;
+    }
+
+    public static String getJDBCURL(){
+       try {
+            return ServerSettings.getSetting(JPAConstants.KEY_JDBC_URL);
+               } catch (ApplicationSettingsException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+    public static String getHost(){
+        try{
+            String jdbcURL = getJDBCURL();
+            String cleanURI = jdbcURL.substring(5);
+            URI uri = URI.create(cleanURI);
+            return uri.getHost();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+    public static int getPort(){
+        try{
+            String jdbcURL = getJDBCURL();
+            String cleanURI = jdbcURL.substring(5);
+            URI uri = URI.create(cleanURI);
+            return uri.getPort();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return -1;
+        }
+    }
+
+    public static int getJPACacheSize (){
+        try {
+            String cache = 
ServerSettings.getSetting(JPAConstants.JPA_CACHE_SIZE, "5000");
+            return Integer.parseInt(cache);
+        }catch (Exception e){
+            logger.error(e.getMessage(), e);
+            return -1;
+        }
+    }
+
+    public static String isCachingEnabled (){
+        try {
+            return ServerSettings.getSetting(JPAConstants.ENABLE_CACHING, 
"true");
+        }catch (Exception e){
+            logger.error(e.getMessage(), e);
+            return "true";
+        }
+    }
+
+    public static String getDBType(){
+        try{
+            String jdbcURL = getJDBCURL();
+            String cleanURI = jdbcURL.substring(5);
+            URI uri = URI.create(cleanURI);
+            return uri.getScheme();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return null;
+        }
+    }
+
+    public static boolean isDerbyStartEnabled(){
+        try {
+            String s = 
ServerSettings.getSetting(JPAConstants.KEY_DERBY_START_ENABLE);
+            if("true".equals(s)){
+                return true;
+            }
+        } catch (ApplicationSettingsException e) {
+            logger.error(e.getMessage(), e);
+            return false;
+        }
+        return false;
+    }
+
+    public static String getJDBCUser(){
+       try {
+                   return 
ServerSettings.getSetting(JPAConstants.KEY_JDBC_USER);
+               } catch (ApplicationSettingsException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+               }
+    }
+
+    public static String getValidationQuery(){
+       try {
+            return ServerSettings.getSetting(JPAConstants.VALIDATION_QUERY);
+               } catch (ApplicationSettingsException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+               }
+    }
+
+    public static String getJDBCPassword(){
+       try {
+            return ServerSettings.getSetting(JPAConstants.KEY_JDBC_PASSWORD);
+               } catch (ApplicationSettingsException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+               }
+
+    }
+
+    public static String getJDBCDriver(){
+       try {
+            return ServerSettings.getSetting(JPAConstants.KEY_JDBC_DRIVER);
+               } catch (ApplicationSettingsException e) {
+            logger.error(e.getMessage(), e);
+            return null;
+               }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/resources/META-INF/persistence.xml
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/resources/META-INF/persistence.xml
 
b/airavata-services/profile-service/profile-user-core/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000..12ae6cc
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--*
+ *
+ * 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.
+ *
+* -->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence"; version="2.0">
+    <persistence-unit name="user_profile_catalog">
+        
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
+        
<class>org.apache.airavata.user.registry.core.entities.UserProfileEntity</class>
+        
<class>org.apache.airavata.user.registry.core.entities.NSFDemographicsEntity</class>
+        <exclude-unlisted-classes>true</exclude-unlisted-classes>
+        <properties>
+            <property name="openjpa.jdbc.MappingDefaults"
+                      value="ForeignKeyDeleteAction=cascade, 
JoinForeignKeyDeleteAction=cascade" />
+        </properties>
+    </persistence-unit>
+</persistence>

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql
 
b/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql
new file mode 100644
index 0000000..4653c45
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/main/resources/user_profile_catalog.sql
@@ -0,0 +1,84 @@
+CREATE TABLE IF NOT EXISTS USER_PROFILE (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    USER_ID VARCHAR (255),
+    GATEWAY_ID VARCHAR (255),
+    USER_MODEL_VERSION VARCHAR (255),
+    USER_NAME VARCHAR (255),
+    ORCID_ID VARCHAR (255),
+    COUNTRY VARCHAR (255),
+    HOME_ORGANIZATION VARCHAR (255),
+    ORIGINATION_AFFILIATION VARCHAR (255),
+    CREATION_TIME BIGINT,
+    LAST_ACCESS_TIME BIGINT,
+    VALID_UNTIL BIGINT,
+    STATE VARCHAR (255),
+    COMMENTS TEXT,
+    GPG_KEY VARCHAR (8192),
+    TIME_ZONE VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID)
+);
+
+CREATE TABLE IF NOT EXISTS USER_PROFILE_EMAIL (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    EMAIL VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, EMAIL),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS USER_PROFILE_PHONE (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    PHONE VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, PHONE ),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS USER_PROFILE_NATIONALITY (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    NATIONALITY VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, NATIONALITY ),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS USER_PROFILE_LABELED_URI (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    LABELED_URI VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, LABELED_URI ),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    GENDER VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
USER_PROFILE(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC_ETHNICITY (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    ETHNICITY VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, ETHNICITY ),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC_RACE (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    RACE VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, RACE ),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE IF NOT EXISTS NSF_DEMOGRAPHIC_DISABILITY (
+    AIRAVATA_INTERNAL_USER_ID VARCHAR (255),
+    DISABILITY VARCHAR (255),
+    PRIMARY KEY (AIRAVATA_INTERNAL_USER_ID, DISABILITY ),
+    FOREIGN KEY (AIRAVATA_INTERNAL_USER_ID) REFERENCES 
NSF_DEMOGRAPHIC(AIRAVATA_INTERNAL_USER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE CONFIGURATION
+(
+        CONFIG_KEY VARCHAR(255),
+        CONFIG_VAL VARCHAR(255),
+        PRIMARY KEY(CONFIG_KEY, CONFIG_VAL)
+);
+
+INSERT INTO CONFIGURATION (CONFIG_KEY, CONFIG_VAL) 
VALUES('user_profile_catalog_version', '0.17');
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/airavata/blob/fcc06e0f/airavata-services/profile-service/profile-user-core/src/test/java/org/apache/airavata/registry/core/repositories/WorkspaceRepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/airavata-services/profile-service/profile-user-core/src/test/java/org/apache/airavata/registry/core/repositories/WorkspaceRepositoryTest.java
 
b/airavata-services/profile-service/profile-user-core/src/test/java/org/apache/airavata/registry/core/repositories/WorkspaceRepositoryTest.java
new file mode 100644
index 0000000..67ba550
--- /dev/null
+++ 
b/airavata-services/profile-service/profile-user-core/src/test/java/org/apache/airavata/registry/core/repositories/WorkspaceRepositoryTest.java
@@ -0,0 +1,176 @@
+/*
+ *
+ * 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.registry.core.repositories;
+
+public class WorkspaceRepositoryTest {
+//    private final static Logger logger = 
LoggerFactory.getLogger(WorkspaceRepositoryTest.class);
+//
+//    private GatewayRepository gatewayRepository;
+//    private NotificationRepository notificationRepository;
+//    private UserProfileRepository userProfileRepository;
+//    private ProjectRepository projectRepository;
+//    private String gatewayId;
+//    private String notificationId;
+//    private String userId;
+//    private String projectId;
+//
+//    private final String GATEWAY_DOMAIN = "test1.com";
+//    private final String NOTIFY_MESSAGE = "NotifyMe";
+//    private final String USER_COMMENT = "TestComment";
+//    private final String PROJECT_DESCRIPTION = "Test Description";
+//
+//
+//    @Before
+//    public void setupRepository() {
+//
+//        gatewayRepository = new GatewayRepository(Gateway.class, 
GatewayEntity.class);
+//        notificationRepository = new 
NotificationRepository(Notification.class,
+//                NotificationEntity.class);
+//        userProfileRepository = new UserProfileRepository(UserProfile.class, 
UserProfileEntity.class);
+//        projectRepository = new ProjectRepository(Project.class, 
ProjectEntity.class);
+//
+//        gatewayId = "test.com" + System.currentTimeMillis();
+//        notificationId = UUID.randomUUID().toString();
+//        userId = "testuser" + System.currentTimeMillis();
+//        projectId = "project" + System.currentTimeMillis();
+//    }
+//
+//    @Test
+//    public void userProfileRepositoryTest() {
+//
+//             /*
+//         * Creating Gateway required for UserProfile creation
+//              */
+//        Gateway gateway = new Gateway();
+//        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.ACTIVE);
+//        gateway.setGatewayId(gatewayId);
+//        gateway.setDomain(GATEWAY_DOMAIN);
+//        gateway = gatewayRepository.create(gateway);
+//        Assert.assertTrue(!gateway.getGatewayId().isEmpty());
+//
+//
+//
+//             /*
+//         * UserProfile Instance creation
+//              */
+//        UserProfile userProfile = new UserProfile();
+//        userProfile.setAiravataInternalUserId(userId);
+//        userProfile.setGatewayId(gateway.getGatewayId());
+//
+//        /*
+//         * Workspace UserProfile Repository Insert Operation Test
+//              */
+//        userProfile = userProfileRepository.create(userProfile);
+//        
Assert.assertTrue(!userProfile.getAiravataInternalUserId().isEmpty());
+//
+//        /*
+//         * Workspace UserProfile Repository Update Operation Test
+//              */
+//        userProfile.setComments(USER_COMMENT);
+//        userProfileRepository.update(userProfile);
+//        userProfile = userProfileRepository.get(userId);
+//        System.out.println(userProfile.getComments());
+//        Assert.assertEquals(userProfile.getComments(), USER_COMMENT);
+//
+//             /*
+//         * Workspace UserProfile Repository Select Operation Test
+//              */
+//        userProfile = userProfileRepository.get(userId);
+//        Assert.assertNotNull(userProfile);
+//
+//             /*
+//         * Workspace UserProfile Repository Delete Operation
+//              */
+//        boolean deleteResult = userProfileRepository.delete(userId);
+//        Assert.assertTrue(deleteResult);
+//        deleteResult = gatewayRepository.delete(gatewayId);
+//        Assert.assertTrue(deleteResult);
+//
+//
+//    }
+//
+//    @Test
+//    public void projectRepositoryTest() {
+//
+//             /*
+//         * Creating Gateway required for UserProfile & Project creation
+//              */
+//        Gateway gateway = new Gateway();
+//        gateway.setGatewayApprovalStatus(GatewayApprovalStatus.ACTIVE);
+//        gateway.setGatewayId(gatewayId);
+//        gateway.setDomain(GATEWAY_DOMAIN);
+//        gateway = gatewayRepository.create(gateway);
+//        Assert.assertTrue(!gateway.getGatewayId().isEmpty());
+//
+//             /*
+//         * UserProfile Instance creation required for Project Creation
+//              */
+//        UserProfile userProfile = new UserProfile();
+//        userProfile.setAiravataInternalUserId(userId);
+//        userProfile.setGatewayId(gateway.getGatewayId());
+//        userProfile = userProfileRepository.create(userProfile);
+//        
Assert.assertTrue(!userProfile.getAiravataInternalUserId().isEmpty());
+//
+//        /*
+//         * Project Instance creation
+//         */
+//        Project project = new Project();
+//        project.setGatewayId(gatewayId);
+//        project.setOwner(userId);
+//        project.setProjectID(projectId);
+//        project.setGatewayIdIsSet(true);
+//
+//
+//        /*
+//         * Workspace Project Repository Insert Operation Test
+//              */
+//        project = projectRepository.create(project);
+//        Assert.assertTrue(!project.getProjectID().isEmpty());
+//
+//        /*
+//         * Workspace Project Repository Update Operation Test
+//              */
+//        project.setDescription(PROJECT_DESCRIPTION);
+//        projectRepository.update(project);
+//        project = projectRepository.get(projectId);
+//        Assert.assertEquals(project.getDescription(), PROJECT_DESCRIPTION);
+//
+//             /*
+//         * Workspace Project Repository Select Operation Test
+//              */
+//        project = projectRepository.get(projectId);
+//        Assert.assertNotNull(project);
+//
+//             /*
+//         * Workspace Project Repository Delete Operation
+//              */
+//        boolean deleteResult = projectRepository.delete(projectId);
+//        Assert.assertTrue(deleteResult);
+//
+//        deleteResult = userProfileRepository.delete(userId);
+//        Assert.assertTrue(deleteResult);
+//
+//        deleteResult = gatewayRepository.delete(gatewayId);
+//        Assert.assertTrue(deleteResult);
+//
+//
+//    }
+}
\ No newline at end of file

Reply via email to