You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sm...@apache.org on 2017/12/22 18:36:01 UTC

[airavata] 04/06: Adding JPA Utils and Tests

This is an automated email from the ASF dual-hosted git repository.

smarru pushed a commit to branch registry-refactoring
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit 17c25b44b5cd3fe87fb31158b1daf326d0879be5
Author: Sachin Kariyattin <sa...@gmail.com>
AuthorDate: Thu Dec 21 14:44:47 2017 -0500

    Adding JPA Utils and Tests
---
 modules/registry-refactoring/pom.xml               |   5 +
 .../appcatalog/ComputeResourcePreferencePK.java    |  14 +-
 .../appcatalog/AppCatAbstractRepository.java       | 132 +++++
 .../appcatalog/ComputeResourceRepository.java      |   6 +-
 .../appcatalog/GwyResourceProfileRepository.java   |  38 +-
 .../appcatalog/StoragePrefRepository.java          |   2 +-
 .../airavata/registry/core/utils/DBConstants.java  |   2 +
 .../core/utils/JPAUtil/AppCatalogJPAUtils.java     |  67 +++
 .../registry/core/utils/QueryConstants.java        |  10 +-
 .../src/main/resources/META-INF/persistence.xml    |   2 +-
 .../src/main/resources/appcatalog-derby.sql        | 583 +++++++++++++++++++++
 .../src/main/resources/appcatalog-mysql.sql        | 579 ++++++++++++++++++++
 .../repositories/GatewayProfileRepositoryTest.java |  69 +++
 .../core/repositories/util/Initialize.java         | 318 +++++++++++
 14 files changed, 1787 insertions(+), 40 deletions(-)

diff --git a/modules/registry-refactoring/pom.xml b/modules/registry-refactoring/pom.xml
index 7f1180a..b1cc56c 100644
--- a/modules/registry-refactoring/pom.xml
+++ b/modules/registry-refactoring/pom.xml
@@ -74,6 +74,11 @@
             <artifactId>airavata-commons</artifactId>
             <version>0.17-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.airavata</groupId>
+            <artifactId>airavata-server-configuration</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferencePK.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferencePK.java
index 7cfba0c..f94cd65 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferencePK.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/entities/appcatalog/ComputeResourcePreferencePK.java
@@ -36,7 +36,7 @@ public class ComputeResourcePreferencePK implements Serializable {
     private String gatewayId;
 
     @Column(name = "RESOURCE_ID", insertable = false, updatable = false)
-    private String resourceId;
+    private String computeResourceId;
 
     public ComputeResourcePreferencePK() {
     }
@@ -49,12 +49,12 @@ public class ComputeResourcePreferencePK implements Serializable {
         this.gatewayId = gatewayId;
     }
 
-    public String getResourceId() {
-        return resourceId;
+    public String getComputeResourceId() {
+        return computeResourceId;
     }
 
-    public void setResourceId(String resourceId) {
-        this.resourceId = resourceId;
+    public void setComputeResourceId(String computeResourceId) {
+        this.computeResourceId = computeResourceId;
     }
 
     public boolean equals(Object other) {
@@ -67,14 +67,14 @@ public class ComputeResourcePreferencePK implements Serializable {
         ComputeResourcePreferencePK castOther = (ComputeResourcePreferencePK) other;
         return
                 this.gatewayId.equals(castOther.gatewayId)
-                        && this.resourceId.equals(castOther.resourceId);
+                        && this.computeResourceId.equals(castOther.computeResourceId);
     }
 
     public int hashCode() {
         final int prime = 31;
         int hash = 17;
         hash = hash * prime + this.gatewayId.hashCode();
-        hash = hash * prime + this.resourceId.hashCode();
+        hash = hash * prime + this.computeResourceId.hashCode();
 
         return hash;
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/AppCatAbstractRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/AppCatAbstractRepository.java
new file mode 100644
index 0000000..f4b91e0
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/AppCatAbstractRepository.java
@@ -0,0 +1,132 @@
+/*
+ *
+ * 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.appcatalog;
+
+import org.apache.airavata.registry.core.utils.Committer;
+import org.apache.airavata.registry.core.utils.DBConstants;
+import org.apache.airavata.registry.core.utils.JPAUtil.AppCatalogJPAUtils;
+import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
+import org.dozer.Mapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public abstract class AppCatAbstractRepository<T, E, Id> {
+    private final static Logger logger = LoggerFactory.getLogger(AppCatAbstractRepository.class);
+
+    private Class<T> thriftGenericClass;
+    private Class<E> dbEntityGenericClass;
+
+    public AppCatAbstractRepository(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 = execute(entityManager -> entityManager.merge(entity));
+        return mapper.map(persistedCopy, thriftGenericClass);
+    }
+
+    public boolean delete(Id id) {
+        execute(entityManager -> {
+            E entity = entityManager.find(dbEntityGenericClass, id);
+            entityManager.remove(entity);
+            return entity;
+        });
+        return true;
+    }
+
+    public T get(Id id) {
+        E entity = execute(entityManager -> entityManager
+                .find(dbEntityGenericClass, id));
+        if(entity == null)
+            return null;
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        return mapper.map(entity, thriftGenericClass);
+    }
+
+    public List<T> select(String query, int offset) {
+        List resultSet = (List) execute(entityManager -> entityManager.createQuery(query).setFirstResult(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) {
+        int newLimit = limit < 0 ? DBConstants.SELECT_MAX_ROWS: limit;
+
+        List resultSet = (List) 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(newLimit).getResultList();
+
+        });
+        Mapper mapper = ObjectMapperSingleton.getInstance();
+        List<T> gatewayList = new ArrayList<>();
+        resultSet.stream().forEach(rs -> gatewayList.add(mapper.map(rs, thriftGenericClass)));
+        return gatewayList;
+    }
+
+    public boolean isExists(Id id) {
+        return get(id) != null;
+    }
+
+    public <R> R execute(Committer<EntityManager, R> committer){
+        EntityManager entityManager = null;
+        try {
+            entityManager = AppCatalogJPAUtils.getEntityManager();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        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
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
index 6add69f..0a4136c 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
@@ -2,13 +2,13 @@ package org.apache.airavata.registry.core.repositories.appcatalog;
 
 import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
 import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourceEntity;
+import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePreferenceEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePreferencePK;
 import org.apache.airavata.registry.core.repositories.AbstractRepository;
 
-public class ComputeResourceRepository extends AbstractRepository<ComputeResourcePreference, ComputeResourceEntity, ComputeResourcePreferencePK> {
+public class ComputeResourceRepository extends AppCatAbstractRepository<ComputeResourcePreference, ComputeResourcePreferenceEntity, ComputeResourcePreferencePK> {
 
     public ComputeResourceRepository() {
-        super(ComputeResourcePreference.class, ComputeResourceEntity.class);
+        super(ComputeResourcePreference.class, ComputeResourcePreferenceEntity.class);
     }
-
 }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java
index 7003201..fb3d4a7 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java
@@ -7,9 +7,7 @@ import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
 import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePreferencePK;
 import org.apache.airavata.registry.core.entities.appcatalog.StoragePreferencePK;
 import org.apache.airavata.registry.core.entities.appcatalog.GatewayProfileEntity;
-import org.apache.airavata.registry.core.repositories.AbstractRepository;
 import org.apache.airavata.registry.core.utils.DBConstants;
-import org.apache.airavata.registry.core.utils.JPAUtils;
 import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.dozer.Mapper;
@@ -21,7 +19,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class GwyResourceProfileRepository extends AbstractRepository<GatewayResourceProfile, GatewayProfileEntity, String>{
+public class GwyResourceProfileRepository extends AppCatAbstractRepository<GatewayResourceProfile, GatewayProfileEntity, String>{
 
     private final static Logger logger = LoggerFactory.getLogger(GwyResourceProfileRepository.class);
 
@@ -30,15 +28,21 @@ public class GwyResourceProfileRepository extends AbstractRepository<GatewayReso
     }
 
     public String addGatewayResourceProfile(GatewayResourceProfile gatewayResourceProfile) {
-            return updateGatewayResourceProfile(gatewayResourceProfile);
+
+        return updateGatewayResourceProfile(gatewayResourceProfile);
     }
 
     public String updateGatewayResourceProfile(GatewayResourceProfile gatewayResourceProfile) {
         String gatewayId = gatewayResourceProfile.getGatewayID();
         Mapper mapper = ObjectMapperSingleton.getInstance();
         GatewayProfileEntity gatewayProfileEntity = mapper.map(gatewayResourceProfile, GatewayProfileEntity.class);
-        gatewayProfileEntity.setUpdateTime(AiravataUtils.getCurrentTimestamp());
-        GatewayProfileEntity persistedCopy = JPAUtils.execute(entityManager -> entityManager.merge(gatewayProfileEntity));
+        if (get(gatewayId) != null) {
+            gatewayProfileEntity.setUpdateTime(AiravataUtils.getCurrentTimestamp());
+        }
+        else {
+            gatewayProfileEntity.setCreationTime(AiravataUtils.getCurrentTimestamp());
+        }
+        GatewayProfileEntity persistedCopy = execute(entityManager -> entityManager.merge(gatewayProfileEntity));
 
         List<ComputeResourcePreference> computeResourcePreferences = gatewayResourceProfile.getComputeResourcePreferences();
         if (computeResourcePreferences != null && !computeResourcePreferences.isEmpty()) {
@@ -57,41 +61,29 @@ public class GwyResourceProfileRepository extends AbstractRepository<GatewayReso
     }
 
     public GatewayResourceProfile getGatewayProfile(String gatewayId) {
-        GatewayResourceProfile gatewayResourceProfile = (new GwyResourceProfileRepository()).getGatewayProfile(gatewayId);
+        GatewayResourceProfile gatewayResourceProfile = get(gatewayId);
         gatewayResourceProfile.setComputeResourcePreferences(getAllComputeResourcePreferences(gatewayId));
         gatewayResourceProfile.setStoragePreferences(getAllStoragePreferences(gatewayId));
         return gatewayResourceProfile;
     }
 
- /*   public boolean removeGatewayResourceProfile(String gatewayId) {
-        //return delete(gatewayId);
-    }
-
-    public boolean isGatewayResourceProfileExists(String gatewayId) {
-        //return isExists(gatewayId);
-    }*/
-
-    /*public List<String> getGatewayProfileIds(String gatewayName) {
-        // TODO - Not used anywhere (dev list??)
-    }*/
-
     public List<GatewayResourceProfile> getAllGatewayProfiles() {
 
         List<GatewayResourceProfile> gwyResourceProfileList = new ArrayList<GatewayResourceProfile>();
-        List<GatewayResourceProfile> gatewayResourceProfileList = select(QueryConstants.FIND_ALL_GATEWAY_PROFILES,-1, 0);
+        List<GatewayResourceProfile> gatewayResourceProfileList = select(QueryConstants.FIND_ALL_GATEWAY_PROFILES, 0);
         if (gatewayResourceProfileList != null && !gatewayResourceProfileList.isEmpty()) {
             for (GatewayResourceProfile gatewayResourceProfile: gatewayResourceProfileList) {
                 gatewayResourceProfile.setComputeResourcePreferences(getAllComputeResourcePreferences(gatewayResourceProfile.getGatewayID()));
                 gatewayResourceProfile.setStoragePreferences(getAllStoragePreferences(gatewayResourceProfile.getGatewayID()));
             }
         }
-        return gwyResourceProfileList;
+        return gatewayResourceProfileList;
     }
 
     public boolean removeComputeResourcePreferenceFromGateway(String gatewayId, String preferenceId) {
         ComputeResourcePreferencePK computeResourcePreferencePK = new ComputeResourcePreferencePK();
         computeResourcePreferencePK.setGatewayId(gatewayId);
-        computeResourcePreferencePK.setResourceId(preferenceId);
+        computeResourcePreferencePK.setComputeResourceId(preferenceId);
         (new ComputeResourceRepository()).delete(computeResourcePreferencePK);
         return true;
     }
@@ -107,7 +99,7 @@ public class GwyResourceProfileRepository extends AbstractRepository<GatewayReso
     public ComputeResourcePreference getComputeResourcePreference(String gatewayId, String hostId) {
         ComputeResourcePreferencePK computeResourcePreferencePK = new ComputeResourcePreferencePK();
         computeResourcePreferencePK.setGatewayId(gatewayId);
-        computeResourcePreferencePK.setResourceId(hostId);
+        computeResourcePreferencePK.setComputeResourceId(hostId);
         return (new ComputeResourceRepository()).get(computeResourcePreferencePK);
     }
 
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java
index d5b054a..423cd2b 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java
@@ -5,7 +5,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.StoragePreferenceEn
 import org.apache.airavata.registry.core.entities.appcatalog.StoragePreferencePK;
 import org.apache.airavata.registry.core.repositories.AbstractRepository;
 
-public class StoragePrefRepository extends AbstractRepository<StoragePreference, StoragePreferenceEntity, StoragePreferencePK> {
+public class StoragePrefRepository extends AppCatAbstractRepository<StoragePreference, StoragePreferenceEntity, StoragePreferencePK> {
 
     public StoragePrefRepository() {
         super(StoragePreference.class, StoragePreferenceEntity.class);
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java
index 752b556..bdd3cb4 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/DBConstants.java
@@ -2,6 +2,8 @@ package org.apache.airavata.registry.core.utils;
 
 public class DBConstants {
 
+    public static int SELECT_MAX_ROWS = 1000;
+
     public static class ComputeResourcePreference {
         public static final String GATEWAY_ID = "gatewayId";
     }
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
new file mode 100644
index 0000000..c42de64
--- /dev/null
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/JPAUtil/AppCatalogJPAUtils.java
@@ -0,0 +1,67 @@
+package org.apache.airavata.registry.core.utils.JPAUtil;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.registry.core.utils.Committer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.persistence.*;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AppCatalogJPAUtils {
+
+    private final static Logger logger = LoggerFactory.getLogger(AppCatalogJPAUtils.class);
+    private static final String PERSISTENCE_UNIT_NAME = "appcatalog_data";
+    private static final String APPCATALOG_JDBC_DRIVER = "appcatalog.jdbc.driver";
+    private static final String APPCATALOG_JDBC_URL = "appcatalog.jdbc.url";
+    private static final String APPCATALOG_JDBC_USER = "appcatalog.jdbc.user";
+    private static final String APPCATALOG_JDBC_PWD = "appcatalog.jdbc.password";
+    private static final String APPCATALOG_VALIDATION_QUERY = "appcatalog.validationQuery";
+    @PersistenceUnit(unitName = "appcatalog_data")
+    protected static EntityManagerFactory factory;
+    @PersistenceContext(unitName = "appcatalog_data")
+    private static EntityManager appCatEntityManager;
+
+    public static EntityManager getEntityManager() throws ApplicationSettingsException {
+        if (factory == null) {
+            String connectionProperties = "DriverClassName=" + readServerProperties(APPCATALOG_JDBC_DRIVER) + "," +
+                    "Url=" + readServerProperties(APPCATALOG_JDBC_URL) + "?autoReconnect=true," +
+                    "Username=" + readServerProperties(APPCATALOG_JDBC_USER) + "," +
+                    "Password=" + readServerProperties(APPCATALOG_JDBC_PWD) +
+                    ",validationQuery=" + readServerProperties(APPCATALOG_VALIDATION_QUERY);
+            System.out.println(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", "unsupported");
+            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);
+        }
+        // clear cache at entitymangerfactory level
+        if (factory.getCache() != null) {
+            factory.getCache().evictAll();
+        }
+        appCatEntityManager = factory.createEntityManager();
+        // clear the entitymanager cache
+        if (appCatEntityManager != null) {
+            appCatEntityManager.clear();
+        }
+        return appCatEntityManager;
+    }
+
+    private static String readServerProperties(String propertyName) throws ApplicationSettingsException {
+        try {
+            return ServerSettings.getSetting(propertyName);
+        } catch (ApplicationSettingsException e) {
+            logger.error("Unable to read airavata-server.properties...", e);
+            throw new ApplicationSettingsException("Unable to read airavata-server.properties...");
+        }
+    }
+}
diff --git a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java
index 244f9d6..7802c84 100644
--- a/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java
+++ b/modules/registry-refactoring/src/main/java/org/apache/airavata/registry/core/utils/QueryConstants.java
@@ -15,9 +15,9 @@ public interface QueryConstants {
     String FIND_ALL_USER_PROFILES_BY_GATEWAY_ID = "SELECT u FROM UserProfileEntity u " +
             "where u.gatewayId LIKE :"+ UserProfile._Fields.GATEWAY_ID.getFieldName() + "";
 
-    String FIND_ALL_GATEWAY_PROFILES = "SELECT G FROM " + GatewayProfileEntity.class.getSimpleName() + "G";
-    String FIND_ALL_COMPUTE_RESOURCE_PREFERENCES = "SELECT DISTINCT CR FROM " + ComputeResourcePreferenceEntity.class.getSimpleName() + "CR " +
-            "WHERE CR.gatewayId LIKE : " + DBConstants.ComputeResourcePreference.GATEWAY_ID;
-    String FIND_ALL_STORAGE_RESOURCE_PREFERENCES = "SELECT DISTINCT S FROM " + StoragePreferenceEntity.class.getSimpleName() + "S " +
-            "WHERE S.gatewayId LIKE : " + DBConstants.StorageResourcePreference.GATEWAY_ID;
+    String FIND_ALL_GATEWAY_PROFILES = "SELECT G FROM " + GatewayProfileEntity.class.getSimpleName() + " G";
+    String FIND_ALL_COMPUTE_RESOURCE_PREFERENCES = "SELECT DISTINCT CR FROM " + ComputeResourcePreferenceEntity.class.getSimpleName() + " CR " +
+            "WHERE CR.id.gatewayId LIKE : " + DBConstants.ComputeResourcePreference.GATEWAY_ID;
+    String FIND_ALL_STORAGE_RESOURCE_PREFERENCES = "SELECT DISTINCT S FROM " + StoragePreferenceEntity.class.getSimpleName() + " S " +
+            "WHERE S.id.gatewayId LIKE : " + DBConstants.StorageResourcePreference.GATEWAY_ID;
 }
diff --git a/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml b/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml
index 645165d..7f0297f 100644
--- a/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml
+++ b/modules/registry-refactoring/src/main/resources/META-INF/persistence.xml
@@ -20,7 +20,7 @@
  *
 * -->
 <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
-    <persistence-unit name="airavata_catalog">
+    <persistence-unit name="appcatalog_data">
         <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
         <class>org.apache.airavata.registry.core.entities.workspacecatalog.GatewayEntity</class>
         <class>org.apache.airavata.registry.core.entities.workspacecatalog.UserProfileEntity</class>
diff --git a/modules/registry-refactoring/src/main/resources/appcatalog-derby.sql b/modules/registry-refactoring/src/main/resources/appcatalog-derby.sql
new file mode 100644
index 0000000..db9e261
--- /dev/null
+++ b/modules/registry-refactoring/src/main/resources/appcatalog-derby.sql
@@ -0,0 +1,583 @@
+/*
+ *
+ * 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 COMPUTE_RESOURCE
+(
+        RESOURCE_ID VARCHAR (255) NOT NULL,
+        HOST_NAME VARCHAR (255) NOT NULL,
+        RESOURCE_DESCRIPTION VARCHAR (255),
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        MAX_MEMORY_NODE INTEGER,
+        CPUS_PER_NODE INTEGER,
+        DEFAULT_NODE_COUNT INTEGER,
+        DEFAULT_CPU_COUNT INTEGER,
+        DEFAULT_WALLTIME INTEGER,
+        ENABLED SMALLINT,
+        GATEWAY_USAGE_REPORTING SMALLINT,
+        GATEWAY_USAGE_MODULE_LOAD_CMD VARCHAR(500),
+        GATEWAY_USAGE_EXECUTABLE VARCHAR(255),
+        PRIMARY KEY (RESOURCE_ID)
+);
+
+CREATE TABLE HOST_ALIAS
+(
+         RESOURCE_ID VARCHAR(255),
+         ALIAS VARCHAR(255),
+         PRIMARY KEY(RESOURCE_ID,ALIAS),
+         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE HOST_IPADDRESS
+(
+         RESOURCE_ID VARCHAR(255),
+         IP_ADDRESS VARCHAR(255),
+         PRIMARY KEY(RESOURCE_ID,IP_ADDRESS),
+         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GSISSH_SUBMISSION
+(
+         SUBMISSION_ID VARCHAR(255),
+         RESOURCE_JOB_MANAGER VARCHAR(255),
+         SSH_PORT INTEGER,
+         INSTALLED_PATH VARCHAR(255),
+         MONITOR_MODE VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID)
+);
+
+CREATE TABLE GSISSH_EXPORT
+(
+         SUBMISSION_ID VARCHAR(255),
+         EXPORT VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID, EXPORT),
+         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
+);
+
+
+
+CREATE TABLE GLOBUS_SUBMISSION
+(
+         SUBMISSION_ID VARCHAR(255),
+         RESOURCE_JOB_MANAGER VARCHAR(255),
+         SECURITY_PROTOCAL VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID)
+);
+
+CREATE TABLE UNICORE_SUBMISSION
+(
+         SUBMISSION_ID VARCHAR(255),
+         SECURITY_PROTOCAL VARCHAR(255),
+         UNICORE_ENDPOINT_URL VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID)
+);
+
+CREATE TABLE UNICORE_DATAMOVEMENT
+(
+         DATAMOVEMENT_ID VARCHAR(255),
+         SECURITY_PROTOCAL VARCHAR(255),
+         UNICORE_ENDPOINT_URL VARCHAR(255),
+         PRIMARY KEY(DATAMOVEMENT_ID)
+);
+
+
+CREATE TABLE GLOBUS_GK_ENDPOINT
+(
+         SUBMISSION_ID VARCHAR(255),
+         ENDPOINT VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID, ENDPOINT),
+         FOREIGN KEY (SUBMISSION_ID) REFERENCES GLOBUS_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE RESOURCE_JOB_MANAGER
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        PUSH_MONITORING_ENDPOINT VARCHAR (255),
+        JOB_MANAGER_BIN_PATH VARCHAR (255),
+        RESOURCE_JOB_MANAGER_TYPE VARCHAR (255) NOT NULL,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID)
+);
+
+
+
+CREATE TABLE SSH_JOB_SUBMISSION
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
+        ALTERNATIVE_SSH_HOSTNAME VARCHAR (255),
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        SSH_PORT INTEGER,
+        MONITOR_MODE VARCHAR (255),
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
+);
+
+CREATE TABLE SCP_DATA_MOVEMENT
+(
+        QUEUE_DESCRIPTION VARCHAR (255),
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        ALTERNATIVE_SCP_HOSTNAME VARCHAR (255),
+        SSH_PORT INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
+);
+
+CREATE TABLE GRIDFTP_DATA_MOVEMENT
+(
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
+);
+
+CREATE TABLE GRIDFTP_ENDPOINT
+(
+        ENDPOINT VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID,ENDPOINT),
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        FOREIGN KEY (DATA_MOVEMENT_INTERFACE_ID) REFERENCES GRIDFTP_DATA_MOVEMENT(DATA_MOVEMENT_INTERFACE_ID) ON DELETE CASCADE
+);
+
+--CREATE TABLE JOB_SUBMISSION_PROTOCOL
+--(
+--         RESOURCE_ID VARCHAR(255),
+--         SUBMISSION_ID VARCHAR(255),
+--         JOB_TYPE VARCHAR(255),
+--         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+--         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+--         PRIMARY KEY(RESOURCE_ID,SUBMISSION_ID,JOB_TYPE),
+--         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+--);
+--
+--CREATE TABLE DATA_MOVEMENT_PROTOCOL
+--(
+--         RESOURCE_ID VARCHAR(255),
+--         DATA_MOVE_ID VARCHAR(255),
+--         DATA_MOVE_TYPE VARCHAR(255),
+--         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+--         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+--         PRIMARY KEY(RESOURCE_ID,DATA_MOVE_ID,DATA_MOVE_TYPE),
+--         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+--);
+
+CREATE TABLE APPLICATION_MODULE
+(
+         MODULE_ID VARCHAR(255),
+         MODULE_NAME VARCHAR(255),
+         MODULE_VERSION VARCHAR(255),
+         MODULE_DESC VARCHAR(500),
+         GATEWAY_ID VARCHAR (255),
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+         PRIMARY KEY(MODULE_ID)
+);
+
+CREATE TABLE APPLICATION_DEPLOYMENT
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         APP_MODULE_ID VARCHAR(255),
+         COMPUTE_HOSTID VARCHAR(255),
+         EXECUTABLE_PATH VARCHAR(255),
+	       PARALLELISM VARCHAR(255),
+         APPLICATION_DESC VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+         GATEWAY_ID VARCHAR(255),
+         DEFAULT_QUEUE_NAME VARCHAR(255),
+         DEFAULT_NODE_COUNT INTEGER,
+         DEFAULT_CPU_COUNT INTEGER,
+         DEFAULT_WALLTIME INTEGER,
+         EDITABLE_BY_USER BOOLEAN,
+         PRIMARY KEY(DEPLOYMENT_ID),
+         FOREIGN KEY (COMPUTE_HOSTID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
+         FOREIGN KEY (APP_MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE MODULE_LOAD_CMD
+(
+        CMD VARCHAR (255) NOT NULL,
+        APP_DEPLOYMENT_ID VARCHAR (255) NOT NULL,
+        PRIMARY KEY (APP_DEPLOYMENT_ID,CMD),
+        FOREIGN KEY (APP_DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PREJOB_COMMAND
+(
+         APPDEPLOYMENT_ID VARCHAR(255),
+         COMMAND VARCHAR(255),
+         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
+         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE POSTJOB_COMMAND
+(
+         APPDEPLOYMENT_ID VARCHAR(255),
+         COMMAND VARCHAR(255),
+         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
+         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE LIBRARY_PREPAND_PATH
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         NAME VARCHAR(255),
+         VALUE VARCHAR(255),
+         PRIMARY KEY(DEPLOYMENT_ID, NAME),
+         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE LIBRARY_APEND_PATH
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         NAME VARCHAR(255),
+         VALUE VARCHAR(255),
+         PRIMARY KEY(DEPLOYMENT_ID, NAME),
+         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APP_ENVIRONMENT
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         NAME VARCHAR(255),
+         VALUE VARCHAR(255),
+         PRIMARY KEY(DEPLOYMENT_ID, NAME),
+         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APPLICATION_INTERFACE
+(
+         INTERFACE_ID VARCHAR(255),
+         APPLICATION_NAME VARCHAR(255),
+         APPLICATION_DESCRIPTION VARCHAR(500),
+         GATEWAY_ID VARCHAR(255),
+         ARCHIVE_WORKING_DIRECTORY SMALLINT,
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+         PRIMARY KEY(INTERFACE_ID)
+);
+
+CREATE TABLE APP_MODULE_MAPPING
+(
+         INTERFACE_ID VARCHAR(255),
+         MODULE_ID VARCHAR(255),
+         PRIMARY KEY(INTERFACE_ID, MODULE_ID),
+         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE,
+         FOREIGN KEY (MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APPLICATION_INPUT
+(
+         INTERFACE_ID VARCHAR(255),
+         INPUT_KEY VARCHAR(255),
+         INPUT_VALUE VARCHAR(255),
+         DATA_TYPE VARCHAR(255),
+         METADATA VARCHAR(255),
+         APP_ARGUMENT VARCHAR(255),
+         STANDARD_INPUT SMALLINT,
+         INPUT_ORDER INTEGER,
+         IS_REQUIRED SMALLINT,
+         REQUIRED_TO_COMMANDLINE SMALLINT,
+         DATA_STAGED SMALLINT,
+         USER_FRIENDLY_DESC VARCHAR(255),
+  IS_READ_ONLY SMALLINT,
+         PRIMARY KEY(INTERFACE_ID,INPUT_KEY),
+         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APPLICATION_OUTPUT
+(
+         INTERFACE_ID VARCHAR(255),
+         OUTPUT_KEY VARCHAR(255),
+         OUTPUT_VALUE VARCHAR(255),
+         DATA_TYPE VARCHAR(255),
+         IS_REQUIRED SMALLINT,
+         REQUIRED_TO_COMMANDLINE SMALLINT,
+         DATA_MOVEMENT SMALLINT,
+         DATA_NAME_LOCATION VARCHAR(255),
+         SEARCH_QUERY VARCHAR(255),
+         APP_ARGUMENT VARCHAR(255),
+         OUTPUT_STREAMING SMALLINT,
+         PRIMARY KEY(INTERFACE_ID,OUTPUT_KEY),
+         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GATEWAY_PROFILE
+(
+         GATEWAY_ID VARCHAR(255),
+         CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+         CS_TOKEN VARCHAR (255),
+         IDENTITY_SERVER_TENANT VARCHAR (255),
+         IDENTITY_SERVER_PWD_CRED_TOKEN VARCHAR (255),
+         PRIMARY KEY(GATEWAY_ID)
+);
+
+CREATE TABLE COMPUTE_RESOURCE_PREFERENCE
+(
+        GATEWAY_ID VARCHAR(255),
+        RESOURCE_ID VARCHAR(255),
+        OVERRIDE_BY_AIRAVATA SMALLINT,
+        PREFERED_JOB_SUB_PROTOCOL VARCHAR(255),
+        PREFERED_DATA_MOVE_PROTOCOL VARCHAR(255),
+        PREFERED_BATCH_QUEUE VARCHAR(255),
+        SCRATCH_LOCATION VARCHAR(255),
+        ALLOCATION_PROJECT_NUMBER VARCHAR(255),
+        LOGIN_USERNAME VARCHAR(255),
+        RESOURCE_CS_TOKEN VARCHAR(255),
+        USAGE_REPORTING_GATEWAY_ID VARCHAR(255),
+        QUALITY_OF_SERVICE VARCHAR(255),
+        RESERVATION VARCHAR (255),
+        RESERVATION_START_TIME timestamp,
+        RESERVATION_END_TIME timestamp,
+        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
+        SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO VARCHAR(1000),
+        PRIMARY KEY(GATEWAY_ID,RESOURCE_ID),
+        FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE SSH_ACCOUNT_PROVISIONER_CONFIG
+(
+        GATEWAY_ID VARCHAR(255),
+        RESOURCE_ID VARCHAR(255),
+        CONFIG_NAME VARCHAR(255),
+        CONFIG_VALUE VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, RESOURCE_ID, CONFIG_NAME),
+        FOREIGN KEY (GATEWAY_ID, RESOURCE_ID) REFERENCES COMPUTE_RESOURCE_PREFERENCE (GATEWAY_ID, RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE BATCH_QUEUE
+(
+        COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,
+        MAX_RUNTIME INTEGER,
+        MAX_JOB_IN_QUEUE INTEGER,
+        QUEUE_DESCRIPTION VARCHAR(255),
+        QUEUE_NAME VARCHAR(255) NOT NULL,
+        MAX_PROCESSORS INTEGER,
+        MAX_NODES INTEGER,
+        MAX_MEMORY INTEGER,
+        CPU_PER_NODE INTEGER,
+        DEFAULT_NODE_COUNT INTEGER,
+        DEFAULT_CPU_COUNT INTEGER,
+        DEFAULT_WALLTIME INTEGER,
+        QUEUE_SPECIFIC_MACROS VARCHAR(255),
+        IS_DEFAULT_QUEUE BOOLEAN,
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,QUEUE_NAME),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE COMPUTE_RESOURCE_FILE_SYSTEM
+(
+        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        PATH VARCHAR (255),
+        FILE_SYSTEM VARCHAR (255) NOT NULL,
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,FILE_SYSTEM),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+  );
+
+CREATE TABLE JOB_SUBMISSION_INTERFACE
+(
+        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
+        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        JOB_SUBMISSION_PROTOCOL VARCHAR (255) NOT NULL,
+        PRIORITY_ORDER INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,JOB_SUBMISSION_INTERFACE_ID),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+ 
+CREATE TABLE DATA_MOVEMENT_INTERFACE
+(
+        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        PRIORITY_ORDER INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE STORAGE_RESOURCE
+(
+        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        HOST_NAME VARCHAR (255) NOT NULL,
+        DESCRIPTION VARCHAR (255),
+        ENABLED SMALLINT ,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (STORAGE_RESOURCE_ID)
+);
+
+CREATE TABLE STORAGE_INTERFACE
+(
+        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
+        PRIORITY_ORDER INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (STORAGE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
+        FOREIGN KEY (STORAGE_RESOURCE_ID) REFERENCES STORAGE_RESOURCE(STORAGE_RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE JOB_MANAGER_COMMAND
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        COMMAND_TYPE VARCHAR (255) NOT NULL,
+        COMMAND VARCHAR (255),
+        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PARALLELISM_COMMAND
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        COMMAND_TYPE VARCHAR (255) NOT NULL,
+        COMMAND VARCHAR (255),
+        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE LOCAL_SUBMISSION
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
+);
+
+CREATE TABLE STORAGE_PREFERENCE
+(
+        GATEWAY_ID VARCHAR(255),
+        STORAGE_RESOURCE_ID VARCHAR(255),
+        LOGIN_USERNAME VARCHAR(255),
+        FS_ROOT_LOCATION VARCHAR(255),
+        RESOURCE_CS_TOKEN VARCHAR(255),
+        PRIMARY KEY(GATEWAY_ID,STORAGE_RESOURCE_ID),
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE LOCAL_DATA_MOVEMENT
+(
+	     DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+	     PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
+);
+
+CREATE TABLE WORKFLOW
+(
+        WF_TEMPLATE_ID VARCHAR (255) NOT NULL,
+        WF_NAME VARCHAR (255) NOT NULL,
+        GRAPH CLOB,
+        OWNER VARCHAR(255),
+        GATEWAY_ID VARCHAR(255),
+        CREATION_TIME TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        IMAGE BLOB,
+        PRIMARY KEY (WF_TEMPLATE_ID)
+);
+
+CREATE TABLE WORKFLOW_INPUT
+(
+         WF_TEMPLATE_ID VARCHAR(255),
+         INPUT_KEY VARCHAR(255),
+         INPUT_VALUE CLOB,
+         DATA_TYPE VARCHAR(255),
+         METADATA VARCHAR(255),
+         APP_ARGUMENT VARCHAR(255),
+         STANDARD_INPUT SMALLINT,
+         USER_FRIENDLY_DESC VARCHAR(255),
+         PRIMARY KEY(WF_TEMPLATE_ID,INPUT_KEY),
+         FOREIGN KEY (WF_TEMPLATE_ID) REFERENCES WORKFLOW(WF_TEMPLATE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE WORKFLOW_OUTPUT
+(
+         WF_TEMPLATE_ID VARCHAR(255),
+         OUTPUT_KEY VARCHAR(255),
+         OUTPUT_VALUE CLOB,
+         DATA_TYPE VARCHAR(255),
+         PRIMARY KEY(WF_TEMPLATE_ID,OUTPUT_KEY),
+         FOREIGN KEY (WF_TEMPLATE_ID) REFERENCES WORKFLOW(WF_TEMPLATE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE USER_RESOURCE_PROFILE (
+  USER_ID varchar(255) NOT NULL,
+  CREATION_TIME TIMESTAMP DEFAULT NULL,
+  CS_TOKEN varchar(255) DEFAULT NULL,
+  GATEWAY_ID varchar(255) DEFAULT NULL,
+  IDENTITY_SERVER_PWD_CRED_TOKEN varchar(255) DEFAULT NULL,
+  IDENTITY_SERVER_TENANT varchar(255) DEFAULT NULL,
+  UPDATE_TIME TIMESTAMP DEFAULT NULL,
+  PRIMARY KEY (USER_ID,GATEWAY_ID)
+);
+
+CREATE TABLE USER_STORAGE_PREFERENCE (
+  STORAGE_RESOURCE_ID varchar(255) NOT NULL,
+  USER_ID varchar(255) NOT NULL,
+  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
+  FS_ROOT_LOCATION varchar(255) DEFAULT NULL,
+  GATEWAY_ID varchar(255) DEFAULT NULL,
+  LOGIN_USERNAME varchar(255) DEFAULT NULL,
+  PRIMARY KEY (STORAGE_RESOURCE_ID,USER_ID,GATEWAY_ID)
+);
+
+CREATE TABLE USER_COMPUTE_RESOURCE_PREFERENCE (
+  RESOURCE_ID varchar(255) NOT NULL,
+  USER_ID varchar(255) NOT NULL,
+  PREFERED_BATCH_QUEUE varchar(255) DEFAULT NULL,
+  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
+  GATEWAY_ID varchar(255) DEFAULT NULL,
+  LOGIN_USERNAME varchar(255) DEFAULT NULL,
+  ALLOCATION_PROJECT_NUMBER varchar(255) DEFAULT NULL,
+  QUALITY_OF_SERVICE varchar(255) DEFAULT NULL,
+  RESERVATION varchar(255) DEFAULT NULL,
+  RESERVATION_END_TIME TIMESTAMP DEFAULT NULL,
+  RESERVATION_START_TIME TIMESTAMP DEFAULT NULL,
+  SCRATCH_LOCATION varchar(255) DEFAULT NULL,
+  VALIDATED SMALLINT NOT NULL DEFAULT 0,
+  PRIMARY KEY (RESOURCE_ID,USER_ID,GATEWAY_ID)
+);
+
+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('app_catalog_version', '0.16');
+
+
+
diff --git a/modules/registry-refactoring/src/main/resources/appcatalog-mysql.sql b/modules/registry-refactoring/src/main/resources/appcatalog-mysql.sql
new file mode 100644
index 0000000..3664a63
--- /dev/null
+++ b/modules/registry-refactoring/src/main/resources/appcatalog-mysql.sql
@@ -0,0 +1,579 @@
+/*
+ *
+ * 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 COMPUTE_RESOURCE
+(
+          RESOURCE_ID VARCHAR (255) NOT NULL,
+          HOST_NAME VARCHAR (255) NOT NULL,
+          RESOURCE_DESCRIPTION VARCHAR (255),
+          CREATION_TIME TIMESTAMP DEFAULT NOW(),
+          UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+          MAX_MEMORY_NODE INTEGER,
+          CPUS_PER_NODE INTEGER,
+          DEFAULT_NODE_COUNT INTEGER,
+          DEFAULT_CPU_COUNT INTEGER,
+          DEFAULT_WALLTIME INTEGER,
+          ENABLED SMALLINT,
+          GATEWAY_USAGE_REPORTING SMALLINT,
+          GATEWAY_USAGE_MODULE_LOAD_CMD VARCHAR(500),
+          GATEWAY_USAGE_EXECUTABLE VARCHAR(255),
+          PRIMARY KEY (RESOURCE_ID)
+);
+
+CREATE TABLE HOST_ALIAS
+(
+         RESOURCE_ID VARCHAR(255),
+         ALIAS VARCHAR(255),
+         PRIMARY KEY(RESOURCE_ID,ALIAS),
+         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE HOST_IPADDRESS
+(
+         RESOURCE_ID VARCHAR(255),
+         IP_ADDRESS VARCHAR(255),
+         PRIMARY KEY(RESOURCE_ID,IP_ADDRESS),
+         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GSISSH_SUBMISSION
+(
+         SUBMISSION_ID VARCHAR(255),
+         RESOURCE_JOB_MANAGER VARCHAR(255),
+         SSH_PORT INTEGER,
+         INSTALLED_PATH VARCHAR(255),
+         MONITOR_MODE VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID)
+);
+
+CREATE TABLE GSISSH_EXPORT
+(
+         SUBMISSION_ID VARCHAR(255),
+         EXPORT VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID, EXPORT),
+         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GSISSH_PREJOBCOMMAND
+(
+         SUBMISSION_ID VARCHAR(255),
+         COMMAND VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID, COMMAND),
+         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GSISSH_POSTJOBCOMMAND
+(
+         SUBMISSION_ID VARCHAR(255),
+         COMMAND VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID, COMMAND),
+         FOREIGN KEY (SUBMISSION_ID) REFERENCES GSISSH_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GLOBUS_SUBMISSION
+(
+         SUBMISSION_ID VARCHAR(255),
+         RESOURCE_JOB_MANAGER VARCHAR(255),
+         SECURITY_PROTOCAL VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID)
+);
+CREATE TABLE UNICORE_SUBMISSION
+(
+         SUBMISSION_ID VARCHAR(255),
+         SECURITY_PROTOCAL VARCHAR(255),
+         UNICORE_ENDPOINT_URL VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID)
+);
+
+CREATE TABLE UNICORE_DATAMOVEMENT
+(
+         DATAMOVEMENT_ID VARCHAR(255),
+         SECURITY_PROTOCAL VARCHAR(255),
+         UNICORE_ENDPOINT_URL VARCHAR(255),
+         PRIMARY KEY(DATAMOVEMENT_ID)
+);
+
+CREATE TABLE GLOBUS_GK_ENDPOINT
+(
+         SUBMISSION_ID VARCHAR(255),
+         ENDPOINT VARCHAR(255),
+         PRIMARY KEY(SUBMISSION_ID, ENDPOINT),
+         FOREIGN KEY (SUBMISSION_ID) REFERENCES GLOBUS_SUBMISSION(SUBMISSION_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE RESOURCE_JOB_MANAGER
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        PUSH_MONITORING_ENDPOINT VARCHAR (255),
+        JOB_MANAGER_BIN_PATH VARCHAR (255),
+        RESOURCE_JOB_MANAGER_TYPE VARCHAR (255) NOT NULL,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID)
+);
+
+CREATE TABLE SSH_JOB_SUBMISSION
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
+        ALTERNATIVE_SSH_HOSTNAME VARCHAR (255),
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        SSH_PORT INTEGER,
+        MONITOR_MODE VARCHAR (255),
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
+        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
+);
+
+
+CREATE TABLE SCP_DATA_MOVEMENT
+(
+        QUEUE_DESCRIPTION VARCHAR (255),
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        ALTERNATIVE_SCP_HOSTNAME VARCHAR (255),
+        SSH_PORT INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
+        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
+);
+
+CREATE TABLE GRIDFTP_DATA_MOVEMENT
+(
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
+        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
+);
+
+CREATE TABLE GRIDFTP_ENDPOINT
+(
+        ENDPOINT VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID,ENDPOINT),
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
+        FOREIGN KEY (DATA_MOVEMENT_INTERFACE_ID) REFERENCES GRIDFTP_DATA_MOVEMENT(DATA_MOVEMENT_INTERFACE_ID) ON DELETE CASCADE
+);
+
+--CREATE TABLE JOB_SUBMISSION_PROTOCOL
+--(
+--         RESOURCE_ID VARCHAR(255),
+--         SUBMISSION_ID VARCHAR(255),
+--         JOB_TYPE VARCHAR(255),
+--         PRIMARY KEY(RESOURCE_ID,SUBMISSION_ID,JOB_TYPE),
+--         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+--);
+--
+--CREATE TABLE DATA_MOVEMENT_PROTOCOL
+--(
+--         RESOURCE_ID VARCHAR(255),
+--         DATA_MOVE_ID VARCHAR(255),
+--         DATA_MOVE_TYPE VARCHAR(255),
+--         PRIMARY KEY(RESOURCE_ID,DATA_MOVE_ID,DATA_MOVE_TYPE),
+--         FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+--);
+
+CREATE TABLE APPLICATION_MODULE
+(
+         MODULE_ID VARCHAR(255),
+         MODULE_NAME VARCHAR(255),
+         MODULE_VERSION VARCHAR(255),
+         MODULE_DESC VARCHAR(500),
+         GATEWAY_ID VARCHAR (255),
+	       CREATION_TIME TIMESTAMP DEFAULT NOW(),
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
+         PRIMARY KEY(MODULE_ID)
+);
+
+CREATE TABLE APPLICATION_DEPLOYMENT
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         APP_MODULE_ID VARCHAR(255),
+         COMPUTE_HOSTID VARCHAR(255),
+         EXECUTABLE_PATH VARCHAR(255),
+	       PARALLELISM VARCHAR(255),
+         APPLICATION_DESC VARCHAR(255),
+         ENV_MODULE_LOAD_CMD VARCHAR(255),
+	       CREATION_TIME TIMESTAMP DEFAULT NOW(),
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
+         GATEWAY_ID VARCHAR(255),
+         DEFAULT_QUEUE_NAME VARCHAR(255),
+         DEFAULT_NODE_COUNT INTEGER,
+         DEFAULT_CPU_COUNT INTEGER,
+         DEFAULT_WALLTIME INTEGER,
+         EDITABLE_BY_USER TINYINT(1),
+         PRIMARY KEY(DEPLOYMENT_ID),
+         FOREIGN KEY (COMPUTE_HOSTID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
+         FOREIGN KEY (APP_MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE LIBRARY_PREPAND_PATH
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         NAME VARCHAR(255),
+         VALUE VARCHAR(255),
+         PRIMARY KEY(DEPLOYMENT_ID, NAME),
+         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE LIBRARY_APEND_PATH
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         NAME VARCHAR(255),
+         VALUE VARCHAR(255),
+         PRIMARY KEY(DEPLOYMENT_ID, NAME),
+         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APP_ENVIRONMENT
+(
+         DEPLOYMENT_ID VARCHAR(255),
+         NAME VARCHAR(255),
+         VALUE VARCHAR(255),
+         PRIMARY KEY(DEPLOYMENT_ID, NAME),
+         FOREIGN KEY (DEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PREJOB_COMMAND
+(
+         APPDEPLOYMENT_ID VARCHAR(255),
+         COMMAND VARCHAR(255),
+         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
+         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE POSTJOB_COMMAND
+(
+         APPDEPLOYMENT_ID VARCHAR(255),
+         COMMAND VARCHAR(255),
+         PRIMARY KEY(APPDEPLOYMENT_ID, COMMAND),
+         FOREIGN KEY (APPDEPLOYMENT_ID) REFERENCES APPLICATION_DEPLOYMENT(DEPLOYMENT_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APPLICATION_INTERFACE
+(
+         INTERFACE_ID VARCHAR(255),
+         APPLICATION_NAME VARCHAR(255),
+         APPLICATION_DESCRIPTION VARCHAR(500),
+         GATEWAY_ID VARCHAR(255),
+         ARCHIVE_WORKING_DIRECTORY SMALLINT,
+	       CREATION_TIME TIMESTAMP DEFAULT NOW(),
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+         PRIMARY KEY(INTERFACE_ID)
+);
+
+CREATE TABLE APP_MODULE_MAPPING
+(
+         INTERFACE_ID VARCHAR(255),
+         MODULE_ID VARCHAR(255),
+         PRIMARY KEY(INTERFACE_ID, MODULE_ID),
+         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE,
+         FOREIGN KEY (MODULE_ID) REFERENCES APPLICATION_MODULE(MODULE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APPLICATION_INPUT
+(
+         INTERFACE_ID VARCHAR(255),
+         INPUT_KEY VARCHAR(255),
+         INPUT_VALUE VARCHAR(255),
+         DATA_TYPE VARCHAR(255),
+         METADATA VARCHAR(255),
+         APP_ARGUMENT VARCHAR(255),
+         STANDARD_INPUT SMALLINT,
+         USER_FRIENDLY_DESC VARCHAR(255),
+         INPUT_ORDER INTEGER,
+         IS_REQUIRED SMALLINT,
+         REQUIRED_TO_COMMANDLINE SMALLINT,
+         DATA_STAGED SMALLINT,
+         IS_READ_ONLY SMALLINT,
+         PRIMARY KEY(INTERFACE_ID,INPUT_KEY),
+         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE APPLICATION_OUTPUT
+(
+         INTERFACE_ID VARCHAR(255),
+         OUTPUT_KEY VARCHAR(255),
+         OUTPUT_VALUE VARCHAR(255),
+         DATA_TYPE VARCHAR(255),
+         IS_REQUIRED SMALLINT,
+         REQUIRED_TO_COMMANDLINE SMALLINT,
+         DATA_MOVEMENT SMALLINT,
+         DATA_NAME_LOCATION VARCHAR(255),
+         SEARCH_QUERY VARCHAR(255),
+         APP_ARGUMENT VARCHAR(255),
+         OUTPUT_STREAMING SMALLINT,
+         PRIMARY KEY(INTERFACE_ID,OUTPUT_KEY),
+         FOREIGN KEY (INTERFACE_ID) REFERENCES APPLICATION_INTERFACE(INTERFACE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE GATEWAY_PROFILE
+(
+         GATEWAY_ID VARCHAR(255),
+	       CREATION_TIME TIMESTAMP DEFAULT NOW(),
+         UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00' ,
+         CS_TOKEN VARCHAR (255),
+         IDENTITY_SERVER_TENANT VARCHAR (255),
+         IDENTITY_SERVER_PWD_CRED_TOKEN VARCHAR (255),
+         PRIMARY KEY(GATEWAY_ID)
+);
+
+CREATE TABLE COMPUTE_RESOURCE_PREFERENCE
+(
+        GATEWAY_ID VARCHAR(255),
+        RESOURCE_ID VARCHAR(255),
+        OVERRIDE_BY_AIRAVATA SMALLINT,
+        PREFERED_JOB_SUB_PROTOCOL VARCHAR(255),
+        PREFERED_DATA_MOVE_PROTOCOL VARCHAR(255),
+        PREFERED_BATCH_QUEUE VARCHAR(255),
+        SCRATCH_LOCATION VARCHAR(255),
+        ALLOCATION_PROJECT_NUMBER VARCHAR(255),
+        LOGIN_USERNAME VARCHAR(255),
+        RESOURCE_CS_TOKEN VARCHAR(255),
+        USAGE_REPORTING_GATEWAY_ID VARCHAR(255),
+        QUALITY_OF_SERVICE VARCHAR(255),
+        RESERVATION VARCHAR (255),
+        RESERVATION_START_TIME timestamp,
+        RESERVATION_END_TIME timestamp,
+        SSH_ACCOUNT_PROVISIONER VARCHAR(255),
+        SSH_ACCOUNT_PROVISIONER_ADDITIONAL_INFO VARCHAR(1000),
+        PRIMARY KEY(GATEWAY_ID,RESOURCE_ID),
+        FOREIGN KEY (RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE,
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+CREATE TABLE SSH_ACCOUNT_PROVISIONER_CONFIG
+(
+        GATEWAY_ID VARCHAR(255),
+        RESOURCE_ID VARCHAR(255),
+        CONFIG_NAME VARCHAR(255),
+        CONFIG_VALUE VARCHAR(255),
+        PRIMARY KEY (GATEWAY_ID, RESOURCE_ID, CONFIG_NAME),
+        FOREIGN KEY (GATEWAY_ID, RESOURCE_ID) REFERENCES COMPUTE_RESOURCE_PREFERENCE (GATEWAY_ID, RESOURCE_ID) ON DELETE CASCADE
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+CREATE TABLE BATCH_QUEUE
+(
+        COMPUTE_RESOURCE_ID VARCHAR(255) NOT NULL,
+        MAX_RUNTIME INTEGER,
+        MAX_JOB_IN_QUEUE INTEGER,
+        QUEUE_DESCRIPTION VARCHAR(255),
+        QUEUE_NAME VARCHAR(255) NOT NULL,
+        MAX_PROCESSORS INTEGER,
+        MAX_NODES INTEGER,
+        MAX_MEMORY INTEGER,
+        CPU_PER_NODE INTEGER,
+        DEFAULT_NODE_COUNT INTEGER,
+        DEFAULT_CPU_COUNT INTEGER,
+        DEFAULT_WALLTIME INTEGER,
+        QUEUE_SPECIFIC_MACROS VARCHAR(255),
+        IS_DEFAULT_QUEUE TINYINT(1),
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,QUEUE_NAME),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE COMPUTE_RESOURCE_FILE_SYSTEM
+(
+        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        PATH VARCHAR (255),
+        FILE_SYSTEM VARCHAR (255) NOT NULL,
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,FILE_SYSTEM),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE JOB_SUBMISSION_INTERFACE
+(
+        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
+        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        JOB_SUBMISSION_PROTOCOL VARCHAR (255) NOT NULL,
+        PRIORITY_ORDER INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,JOB_SUBMISSION_INTERFACE_ID),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+ 
+CREATE TABLE DATA_MOVEMENT_INTERFACE
+(
+        COMPUTE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        PRIORITY_ORDER INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (COMPUTE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
+        FOREIGN KEY (COMPUTE_RESOURCE_ID) REFERENCES COMPUTE_RESOURCE(RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE STORAGE_RESOURCE
+(
+        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        HOST_NAME VARCHAR (255) NOT NULL,
+        DESCRIPTION VARCHAR (255),
+        ENABLED SMALLINT,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (STORAGE_RESOURCE_ID)
+);
+
+CREATE TABLE STORAGE_INTERFACE
+(
+        STORAGE_RESOURCE_ID VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_PROTOCOL VARCHAR (255) NOT NULL,
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        PRIORITY_ORDER INTEGER,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (STORAGE_RESOURCE_ID,DATA_MOVEMENT_INTERFACE_ID),
+        FOREIGN KEY (STORAGE_RESOURCE_ID) REFERENCES STORAGE_RESOURCE(STORAGE_RESOURCE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE JOB_MANAGER_COMMAND
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        COMMAND_TYPE VARCHAR (255) NOT NULL,
+        COMMAND VARCHAR (255),
+        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE PARALLELISM_COMMAND
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        COMMAND_TYPE VARCHAR (255) NOT NULL,
+        COMMAND VARCHAR (255),
+        PRIMARY KEY (RESOURCE_JOB_MANAGER_ID,COMMAND_TYPE),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE LOCAL_SUBMISSION
+(
+        RESOURCE_JOB_MANAGER_ID VARCHAR (255) NOT NULL,
+        JOB_SUBMISSION_INTERFACE_ID VARCHAR (255) NOT NULL,
+        SECURITY_PROTOCOL VARCHAR (255) NOT NULL,
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        PRIMARY KEY (JOB_SUBMISSION_INTERFACE_ID),
+        FOREIGN KEY (RESOURCE_JOB_MANAGER_ID) REFERENCES RESOURCE_JOB_MANAGER(RESOURCE_JOB_MANAGER_ID)
+);
+
+CREATE TABLE LOCAL_DATA_MOVEMENT
+(
+        DATA_MOVEMENT_INTERFACE_ID VARCHAR (255) NOT NULL,
+        PRIMARY KEY (DATA_MOVEMENT_INTERFACE_ID)
+);
+
+CREATE TABLE DATA_STORAGE_PREFERENCE
+(
+        GATEWAY_ID VARCHAR(255),
+        STORAGE_RESOURCE_ID VARCHAR(255),
+        LOGIN_USERNAME VARCHAR(255),
+        FS_ROOT_LOCATION VARCHAR(255),
+        RESOURCE_CS_TOKEN VARCHAR(255),
+        PRIMARY KEY(GATEWAY_ID,STORAGE_RESOURCE_ID),
+        FOREIGN KEY (GATEWAY_ID) REFERENCES GATEWAY_PROFILE(GATEWAY_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE WORKFLOW
+(
+        WF_TEMPLATE_ID VARCHAR (255) NOT NULL,
+        WF_NAME VARCHAR (255) NOT NULL,
+        GRAPH LONGTEXT,
+        OWNER VARCHAR(255),
+        CREATION_TIME TIMESTAMP DEFAULT NOW(),
+        UPDATE_TIME TIMESTAMP DEFAULT '0000-00-00 00:00:00',
+        IMAGE BLOB,
+        PRIMARY KEY (WF_TEMPLATE_ID)
+);
+
+CREATE TABLE WORKFLOW_INPUT
+(
+         WF_TEMPLATE_ID VARCHAR(255),
+         INPUT_KEY VARCHAR(255),
+         INPUT_VALUE LONGTEXT,
+         DATA_TYPE VARCHAR(255),
+         METADATA VARCHAR(255),
+         APP_ARGUMENT VARCHAR(255),
+         STANDARD_INPUT SMALLINT,
+         USER_FRIENDLY_DESC VARCHAR(255),
+         PRIMARY KEY(WF_TEMPLATE_ID,INPUT_KEY),
+         FOREIGN KEY (WF_TEMPLATE_ID) REFERENCES WORKFLOW(WF_TEMPLATE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE WORKFLOW_OUTPUT
+(
+         WF_TEMPLATE_ID VARCHAR(255),
+         OUTPUT_KEY VARCHAR(255),
+         OUTPUT_VALUE LONGTEXT,
+         DATA_TYPE VARCHAR(255),
+         PRIMARY KEY(WF_TEMPLATE_ID,OUTPUT_KEY),
+         FOREIGN KEY (WF_TEMPLATE_ID) REFERENCES WORKFLOW(WF_TEMPLATE_ID) ON DELETE CASCADE
+);
+
+CREATE TABLE USER_RESOURCE_PROFILE (
+  USER_ID varchar(255) NOT NULL,
+  CREATION_TIME datetime DEFAULT NULL,
+  CS_TOKEN varchar(255) DEFAULT NULL,
+  GATEWAY_ID varchar(255) DEFAULT NULL,
+  IDENTITY_SERVER_PWD_CRED_TOKEN varchar(255) DEFAULT NULL,
+  IDENTITY_SERVER_TENANT varchar(255) DEFAULT NULL,
+  UPDATE_TIME datetime DEFAULT NULL,
+  PRIMARY KEY (USER_ID,GATEWAY_ID)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE USER_STORAGE_PREFERENCE (
+  STORAGE_RESOURCE_ID varchar(255) NOT NULL,
+  USER_ID varchar(255) NOT NULL,
+  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
+  FS_ROOT_LOCATION varchar(255) DEFAULT NULL,
+  GATEWAY_ID varchar(255) DEFAULT NULL,
+  LOGIN_USERNAME varchar(255) DEFAULT NULL,
+  PRIMARY KEY (STORAGE_RESOURCE_ID,USER_ID,GATEWAY_ID)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+CREATE TABLE USER_COMPUTE_RESOURCE_PREFERENCE (
+  RESOURCE_ID varchar(255) NOT NULL,
+  USER_ID varchar(255) NOT NULL,
+  PREFERED_BATCH_QUEUE varchar(255) DEFAULT NULL,
+  RESOURCE_CS_TOKEN varchar(255) DEFAULT NULL,
+  GATEWAY_ID varchar(255) DEFAULT NULL,
+  LOGIN_USERNAME varchar(255) DEFAULT NULL,
+  ALLOCATION_PROJECT_NUMBER varchar(255) DEFAULT NULL,
+  QUALITY_OF_SERVICE varchar(255) DEFAULT NULL,
+  RESERVATION varchar(255) DEFAULT NULL,
+  RESERVATION_END_TIME datetime DEFAULT NULL,
+  RESERVATION_START_TIME datetime DEFAULT NULL,
+  SCRATCH_LOCATION varchar(255) NOT NULL DEFAULT NULL,
+  VALIDATED TINYINT(1) DEFAULT 0,
+  PRIMARY KEY (RESOURCE_ID,USER_ID,GATEWAY_ID)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+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('app_catalog_version', '0.16');
+
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/GatewayProfileRepositoryTest.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/GatewayProfileRepositoryTest.java
new file mode 100644
index 0000000..5eec2e0
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/GatewayProfileRepositoryTest.java
@@ -0,0 +1,69 @@
+package org.apache.airavata.registry.core.repositories;
+
+import org.apache.airavata.model.appcatalog.gatewayprofile.GatewayResourceProfile;
+import org.apache.airavata.registry.core.repositories.appcatalog.GwyResourceProfileRepository;
+import org.apache.airavata.registry.core.repositories.util.Initialize;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+import static org.junit.Assert.assertTrue;
+
+public class GatewayProfileRepositoryTest {
+
+    private static Initialize initialize;
+    private GwyResourceProfileRepository gwyResourceProfileRepository;
+    private static final Logger logger = LoggerFactory.getLogger(GatewayProfileRepositoryTest.class);
+
+    @Before
+    public void setUp() {
+        try {
+            initialize = new Initialize("appcatalog-derby.sql");
+            initialize.initializeDB();
+            gwyResourceProfileRepository = new GwyResourceProfileRepository();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        System.out.println("********** TEAR DOWN ************");
+        initialize.stopDerbyServer();
+    }
+
+    @Test
+    public void gatewayProfileRepositorytest() {
+        GatewayResourceProfile gf = new GatewayResourceProfile();
+        gf.setGatewayID("testGateway");
+        gf.setCredentialStoreToken("testCredential");
+        gf.setIdentityServerPwdCredToken("pwdCredential");
+        gf.setIdentityServerTenant("testTenant");
+
+        GatewayResourceProfile gf1 = new GatewayResourceProfile();
+        gf1.setGatewayID("testGateway1");
+        gf1.setCredentialStoreToken("testCredential");
+        gf1.setIdentityServerPwdCredToken("pwdCredential");
+        gf1.setIdentityServerTenant("testTenant");
+
+        String gwId = gwyResourceProfileRepository.addGatewayResourceProfile(gf);
+        GatewayResourceProfile retrievedProfile = null;
+        if (gwyResourceProfileRepository.isExists(gwId)){
+            retrievedProfile = gwyResourceProfileRepository.getGatewayProfile(gwId);
+            System.out.println("************ gateway id ************** :" + retrievedProfile.getGatewayID());
+            assertTrue("Retrieved gateway id matched", retrievedProfile.getGatewayID().equals("testGateway"));
+            assertTrue(retrievedProfile.getCredentialStoreToken().equals("testCredential"));
+            assertTrue(retrievedProfile.getIdentityServerPwdCredToken().equals("pwdCredential"));
+            assertTrue(retrievedProfile.getIdentityServerTenant().equals("testTenant"));
+        }
+
+        gwyResourceProfileRepository.addGatewayResourceProfile(gf1);
+        List<GatewayResourceProfile> getGatewayResourceList = gwyResourceProfileRepository.getAllGatewayProfiles();
+        assertTrue(getGatewayResourceList.size() == 2);
+    }
+
+}
diff --git a/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/util/Initialize.java b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/util/Initialize.java
new file mode 100644
index 0000000..8581cb7
--- /dev/null
+++ b/modules/registry-refactoring/src/test/java/org/apache/airavata/registry/core/repositories/util/Initialize.java
@@ -0,0 +1,318 @@
+/**
+ *
+ * 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.util;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.ServerSettings;
+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 = "appcatalog-derby.sql";
+    private NetworkServerControl server;
+    private static final String delimiter = ";";
+    public static final String COMPUTE_RESOURCE_TABLE = "COMPUTE_RESOURCE";
+    private String jdbcUrl = null;
+    private String jdbcDriver = null;
+    private String jdbcUser = null;
+    private String jdbcPassword = null;
+
+    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() {
+
+        try{
+            jdbcDriver = ServerSettings.getSetting("appcatalog.jdbc.driver");
+            jdbcUrl = ServerSettings.getSetting("appcatalog.jdbc.url");
+            jdbcUser = ServerSettings.getSetting("appcatalog.jdbc.user");
+            jdbcPassword = ServerSettings.getSetting("appcatalog.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...");
+        }
+//      startDerbyInEmbeddedMode();
+
+        Connection conn = null;
+        try {
+            Class.forName(jdbcDriver).newInstance();
+            conn = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
+            if (!isDatabaseStructureCreated(COMPUTE_RESOURCE_TABLE, conn)) {
+                executeSQLScript(conn);
+                logger.info("New Database created for App Catalog !!!");
+            } else {
+                logger.debug("Database already created for App Catalog!");
+            }
+        } 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");
+            server = new NetworkServerControl(InetAddress.getByName("0.0.0.0"),
+                    20000,
+                    jdbcUser, jdbcPassword);
+            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 static int getPort(String jdbcURL){
+        try{
+            String cleanURI = jdbcURL.substring(5);
+            URI uri = URI.create(cleanURI);
+            return uri.getPort();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+            return -1;
+        }
+    }
+
+    private void startDerbyInEmbeddedMode(){
+        try {
+            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
+            DriverManager.getConnection("jdbc:derby:memory:unit-testing-jpa;create=true").close();
+        } catch (ClassNotFoundException e) {
+            logger.error(e.getMessage(), e);
+        } catch (SQLException e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+
+    public void stopDerbyServer() {
+        try {
+            server.shutdown();
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+    }
+}

-- 
To stop receiving notification emails like this one, please contact
"commits@airavata.apache.org" <co...@airavata.apache.org>.