Add ProfileService Server and Client
Project: http://git-wip-us.apache.org/repos/asf/airavata/repo Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/cbe1c280 Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/cbe1c280 Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/cbe1c280 Branch: refs/heads/develop Commit: cbe1c280ca50c75af7bfe0146a15472aa073eba4 Parents: fcc06e0 Author: Gourav Shenoy <[email protected]> Authored: Sun Mar 5 18:16:01 2017 -0500 Committer: Gourav Shenoy <[email protected]> Committed: Sun Mar 5 18:16:01 2017 -0500 ---------------------------------------------------------------------- .../profile-service-server/pom.xml | 30 ++++ .../handlers/UserProfileServiceHandler.java | 141 ++++++++++++++++ .../profile/server/ProfileServiceServer.java | 168 +++++++++++++++++++ .../client/ProfileServiceClientFactory.java | 46 +++++ .../user/cpi/profile_user_cpiConstants.java | 2 + .../main/resources/airavata-server.properties | 2 +- .../profile-user/profile-user-cpi.thrift | 1 + 7 files changed, 389 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/airavata/blob/cbe1c280/airavata-services/profile-service/profile-service-server/pom.xml ---------------------------------------------------------------------- diff --git a/airavata-services/profile-service/profile-service-server/pom.xml b/airavata-services/profile-service/profile-service-server/pom.xml new file mode 100644 index 0000000..1bf16b8 --- /dev/null +++ b/airavata-services/profile-service/profile-service-server/pom.xml @@ -0,0 +1,30 @@ +<?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-service-server</artifactId> + <name>Airavata Profile Service Server</name> + <description>Module to expose a profile service as a thrift service</description> + + <dependencies> + <dependency> + <groupId>org.apache.airavata</groupId> + <artifactId>profile-service-stubs</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.airavata</groupId> + <artifactId>profile-user-core</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/airavata/blob/cbe1c280/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java ---------------------------------------------------------------------- diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java new file mode 100644 index 0000000..5ddfc19 --- /dev/null +++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/handlers/UserProfileServiceHandler.java @@ -0,0 +1,141 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ +package org.apache.airavata.service.profile.handlers; + +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.repositories.UserProfileRepository; +import org.apache.airavata.service.profile.user.cpi.UserProfileService; +import org.apache.airavata.service.profile.user.cpi.exception.UserProfileServiceException; +import org.apache.thrift.TException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; + +public class UserProfileServiceHandler implements UserProfileService.Iface { + + private final static Logger logger = LoggerFactory.getLogger(UserProfileServiceHandler.class); + + private UserProfileRepository userProfileRepository; + + public UserProfileServiceHandler() { + + userProfileRepository = new UserProfileRepository(UserProfile.class, UserProfileEntity.class); + } + + public String addUserProfile(UserProfile userProfile) throws UserProfileServiceException { + try{ + userProfileRepository.create(userProfile); + if (null != userProfile) + return userProfile.getUserId(); + return null; + } catch (Exception e){ + logger.error("Error while creating user profile", e); + UserProfileServiceException exception = new UserProfileServiceException(); + exception.setMessage("Error while creating user profile. More info : " + e.getMessage()); + throw exception; + } + } + + public boolean updateUserProfile(UserProfile userProfile) throws UserProfileServiceException, TException { + try { + if(userProfileRepository.update(userProfile) != null) + return true; + return false; + } catch (Exception e) { + logger.error("Error while Updating user profile", e); + UserProfileServiceException exception = new UserProfileServiceException(); + exception.setMessage("Error while Updating user profile. More info : " + e.getMessage()); + throw exception; + } + } + + public UserProfile getUserProfileById(String userId, String gatewayId) throws UserProfileServiceException { + try{ + UserProfile userProfile = userProfileRepository.getUserProfileByIdAndGateWay(userId, gatewayId); + if(userProfile != null) + return userProfile; + return null; + } catch (Exception e) { + logger.error("Error retrieving user profile by ID", e); + UserProfileServiceException exception = new UserProfileServiceException(); + exception.setMessage("Error retrieving user profile by ID. More info : " + e.getMessage()); + throw exception; + } + } + + // FIXME: shouldn't deleteUserProfile require the gatewayId as well? + public boolean deleteUserProfile(String userId) throws UserProfileServiceException { + try{ + boolean deleteResult = userProfileRepository.delete(userId); + return deleteResult; + } catch (Exception e) { + logger.error("Error while deleting user profile", e); + UserProfileServiceException exception = new UserProfileServiceException(); + exception.setMessage("Error while deleting user profile. More info : " + e.getMessage()); + throw exception; + } + } + + public List<UserProfile> getAllUserProfilesInGateway(String gatewayId, int offset, int limit) throws UserProfileServiceException { + try{ + List<UserProfile> usersInGateway = userProfileRepository.getAllUserProfilesInGateway(gatewayId, offset, limit); + if(usersInGateway != null) + return usersInGateway; + return null; + } catch (Exception e) { + logger.error("Error while retrieving user profile List", e); + UserProfileServiceException exception = new UserProfileServiceException(); + exception.setMessage("Error while retrieving user profile List. More info : " + e.getMessage()); + throw exception; + } + } + + + public UserProfile getUserProfileByName(String userName, String gatewayId) throws UserProfileServiceException { + try{ + UserProfile userProfile = userProfileRepository.getUserProfileByNameAndGateWay(userName, gatewayId); + if(userProfile != null) + return userProfile; + return null; + } catch (Exception e) { + logger.error("Error while retrieving user profile", e); + UserProfileServiceException exception = new UserProfileServiceException(); + exception.setMessage("Error while retrieving user profile. More info : " + e.getMessage()); + throw exception; + } + } + + public boolean doesUserExist(String userName, String gatewayId) throws UserProfileServiceException, TException { + try{ + UserProfile userProfile = userProfileRepository.getUserProfileByNameAndGateWay(userName, gatewayId); + if (null != userProfile) + return true; + return false; + } catch (Exception e) { + logger.error("Error while finding user profile", e); + UserProfileServiceException exception = new UserProfileServiceException(); + exception.setMessage("Error while finding user profile. More info : " + e.getMessage()); + throw exception; + } + } +} http://git-wip-us.apache.org/repos/asf/airavata/blob/cbe1c280/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java ---------------------------------------------------------------------- diff --git a/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java new file mode 100644 index 0000000..459fd36 --- /dev/null +++ b/airavata-services/profile-service/profile-service-server/src/main/java/org/apache/airavata/service/profile/server/ProfileServiceServer.java @@ -0,0 +1,168 @@ +/* + * + * 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.server; + +import org.apache.airavata.common.utils.IServer; +import org.apache.airavata.common.utils.ServerSettings; +import org.apache.airavata.service.profile.handlers.UserProfileServiceHandler; +import org.apache.airavata.service.profile.user.cpi.UserProfileService; +import org.apache.airavata.service.profile.user.cpi.profile_user_cpiConstants; +import org.apache.thrift.TMultiplexedProcessor; +import org.apache.thrift.server.TServer; +import org.apache.thrift.server.TThreadPoolServer; +import org.apache.thrift.transport.TServerSocket; +import org.apache.thrift.transport.TServerTransport; +import org.apache.thrift.transport.TTransportException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.InetSocketAddress; +import java.util.Date; + +public class ProfileServiceServer implements IServer { + + private final static Logger logger = LoggerFactory.getLogger(ProfileServiceServer.class); + + private static final String SERVER_NAME = "Profile Service Server"; + private static final String SERVER_VERSION = "1.0"; + + private ServerStatus status; + private TServer server; + + public ProfileServiceServer() { + setStatus(ServerStatus.STOPPED); + } + + public void updateTime() { + + } + + public Date getTime() { + return null; + } + + public String getName() { + return SERVER_NAME; + } + + public String getVersion() { + return SERVER_VERSION; + } + + public void start() throws Exception { + + try { + setStatus(ServerStatus.STARTING); + final int serverPort = Integer.parseInt(ServerSettings.getProfileServiceServerPort()); + final String serverHost = ServerSettings.getProfileServiceServerHost(); + + // create multiple processors for each profile-service + UserProfileService.Processor userProfileProcessor = new UserProfileService.Processor(new UserProfileServiceHandler()); + + // create a multiplexed processor + TMultiplexedProcessor profileServiceProcessor = new TMultiplexedProcessor(); + profileServiceProcessor.registerProcessor(profile_user_cpiConstants.USER_PROFILE_CPI_NAME, userProfileProcessor); + + TServerTransport serverTransport; + + if (serverHost == null) { + serverTransport = new TServerSocket(serverPort); + } else { + InetSocketAddress inetSocketAddress = new InetSocketAddress(serverHost, serverPort); + serverTransport = new TServerSocket(inetSocketAddress); + } + TThreadPoolServer.Args options = new TThreadPoolServer.Args(serverTransport); + options.minWorkerThreads = 30; + server = new TThreadPoolServer(options.processor(profileServiceProcessor)); + + new Thread() { + public void run() { + server.serve(); + setStatus(ServerStatus.STOPPED); + logger.info("Profile Service Server Stopped."); + } + }.start(); + new Thread() { + public void run() { + while (!server.isServing()) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + break; + } + } + if (server.isServing()) { + setStatus(ServerStatus.STARTED); + logger.info("Starting Profile Service Server on Port " + serverPort); + logger.info("Listening to Profile Service Server clients ...."); + } + } + }.start(); + } catch (TTransportException e) { + setStatus(ServerStatus.FAILED); + throw new Exception("Error while starting the Profile Service Server", e); + } + } + + public void stop() throws Exception { + + if (server != null && server.isServing()) { + setStatus(ServerStatus.STOPING); + server.stop(); + } + } + + public void restart() throws Exception { + + stop(); + start(); + } + + public void configure() throws Exception { + + } + + public ServerStatus getStatus() throws Exception { + return status; + } + + private void setStatus(ServerStatus stat) { + status = stat; + status.updateTime(); + } + + public TServer getServer() { + return server; + } + + public void setServer(TServer server) { + this.server = server; + } + + public static void main(String[] args) { + try { + new ProfileServiceServer().start(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } +} http://git-wip-us.apache.org/repos/asf/airavata/blob/cbe1c280/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/client/ProfileServiceClientFactory.java ---------------------------------------------------------------------- diff --git a/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/client/ProfileServiceClientFactory.java b/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/client/ProfileServiceClientFactory.java new file mode 100644 index 0000000..2c14813 --- /dev/null +++ b/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/client/ProfileServiceClientFactory.java @@ -0,0 +1,46 @@ +/* + * + * 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.client; + +import org.apache.airavata.service.profile.user.cpi.UserProfileService; +import org.apache.airavata.service.profile.user.cpi.exception.UserProfileServiceException; +import org.apache.airavata.service.profile.user.cpi.profile_user_cpiConstants; +import org.apache.thrift.protocol.TBinaryProtocol; +import org.apache.thrift.protocol.TMultiplexedProtocol; +import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.TSocket; +import org.apache.thrift.transport.TTransport; +import org.apache.thrift.transport.TTransportException; + + +public class ProfileServiceClientFactory { + public static UserProfileService.Client createUserProfileServiceClient(String serverHost, int serverPort) throws UserProfileServiceException { + try { + TTransport transport = new TSocket(serverHost, serverPort); + transport.open(); + TProtocol protocol = new TBinaryProtocol(transport); + TMultiplexedProtocol multiplexedProtocol = new TMultiplexedProtocol(protocol, profile_user_cpiConstants.USER_PROFILE_CPI_NAME); + return new UserProfileService.Client(multiplexedProtocol); + } catch (TTransportException e) { + throw new UserProfileServiceException(); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/airavata/blob/cbe1c280/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/user/cpi/profile_user_cpiConstants.java ---------------------------------------------------------------------- diff --git a/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/user/cpi/profile_user_cpiConstants.java b/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/user/cpi/profile_user_cpiConstants.java index 9d583ee..4cc4a89 100644 --- a/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/user/cpi/profile_user_cpiConstants.java +++ b/airavata-services/profile-service/profile-service-stubs/src/main/java/org/apache/airavata/service/profile/user/cpi/profile_user_cpiConstants.java @@ -54,4 +54,6 @@ public class profile_user_cpiConstants { public static final String USER_PROFILE_CPI_VERSION = "0.17"; + public static final String USER_PROFILE_CPI_NAME = "UserProfileService"; + } http://git-wip-us.apache.org/repos/asf/airavata/blob/cbe1c280/modules/configuration/server/src/main/resources/airavata-server.properties ---------------------------------------------------------------------- diff --git a/modules/configuration/server/src/main/resources/airavata-server.properties b/modules/configuration/server/src/main/resources/airavata-server.properties index 55f6086..07a373a 100644 --- a/modules/configuration/server/src/main/resources/airavata-server.properties +++ b/modules/configuration/server/src/main/resources/airavata-server.properties @@ -349,5 +349,5 @@ user.profile.catalog.validationQuery=SELECT 1 # Profile Service Configuration ########################################################################### profile.service.server.host=localhost -profile.service.server.port=8961 +profile.service.server.port=8962 profile_service=org.apache.airavata.service.profile.server.ProfileServiceServer \ No newline at end of file http://git-wip-us.apache.org/repos/asf/airavata/blob/cbe1c280/thrift-interface-descriptions/service-cpis/profile-service/profile-user/profile-user-cpi.thrift ---------------------------------------------------------------------- diff --git a/thrift-interface-descriptions/service-cpis/profile-service/profile-user/profile-user-cpi.thrift b/thrift-interface-descriptions/service-cpis/profile-service/profile-user/profile-user-cpi.thrift index ebf21f7..e575a4b 100644 --- a/thrift-interface-descriptions/service-cpis/profile-service/profile-user/profile-user-cpi.thrift +++ b/thrift-interface-descriptions/service-cpis/profile-service/profile-user/profile-user-cpi.thrift @@ -30,6 +30,7 @@ include "profile_user_cpi_errors.thrift" namespace java org.apache.airavata.service.profile.user.cpi const string USER_PROFILE_CPI_VERSION = "0.17" +const string USER_PROFILE_CPI_NAME = "UserProfileService" service UserProfileService {
