summaryrefslogtreecommitdiffstats
path: root/ecomp-sdk/epsdk-fw
diff options
context:
space:
mode:
Diffstat (limited to 'ecomp-sdk/epsdk-fw')
-rw-r--r--ecomp-sdk/epsdk-fw/.gitignore5
-rw-r--r--ecomp-sdk/epsdk-fw/README.md111
-rw-r--r--ecomp-sdk/epsdk-fw/pom.xml87
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalRestAPIService.java175
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalUebAPIService.java47
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalAPIResponse.java58
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalRestAPIProxy.java618
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/SessionCommunicationService.java161
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/exception/PortalAPIException.java46
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutBindingListener.java53
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutHandler.java420
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserContextListener.java54
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserSessionListener.java85
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FavoritesClient.java51
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FunctionalMenuClient.java54
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/RestWebServiceClient.java342
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/CipherUtil.java125
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiConstants.java64
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiProperties.java102
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOFilter.java75
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java45
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompRole.java87
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompUser.java197
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/PortalTimeoutVO.java63
-rw-r--r--ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/SharedContext.java300
25 files changed, 3425 insertions, 0 deletions
diff --git a/ecomp-sdk/epsdk-fw/.gitignore b/ecomp-sdk/epsdk-fw/.gitignore
new file mode 100644
index 00000000..aa0c881b
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/.gitignore
@@ -0,0 +1,5 @@
+/target
+/bin/
+/.settings/
+.project
+.classpath
diff --git a/ecomp-sdk/epsdk-fw/README.md b/ecomp-sdk/epsdk-fw/README.md
new file mode 100644
index 00000000..af36ddc2
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/README.md
@@ -0,0 +1,111 @@
+# ECOMP Portal SDK Framework
+
+## Overview
+
+This is the Maven project for the ECOMP Portal SDK Framework library,
+which is distributed as epsdk-fw-N.N.N.jar. This library
+(once called third-party onboarding) provides features to
+partner applications that use a J2EE Servlet 3.0 container
+as Apache Tomcat. These features include:
+- REST endpoint for use by the ECOMP Portal aplication. This endpoint
+ answers queries about roles, users and user-role assignments.
+ The endpoint methods are defined by the Java interface class
+ IPortalRestAPIService. Application developers must provide a
+ class that implements this interface, and publish the name of
+ that class in the properties file as discussed below.
+- A session listener that updates a collection with current user sessions
+ as sessions are created and destroyed. This information is used to maintain
+ and extend user session timeouts across applications that are on-boarded to
+ the ECOMP portal.
+- Single sign-on to the application via either the AT&T Central Security Platform (SCP)
+ or WebSEAL Junction.
+- Communication with the ECOMP Portal to fetch a user-specific functional menu, either
+ via REST or UEB.
+
+Unlike the other ECOMP SDK libraries, this library does NOT require Hibernate,
+nor does it require Spring.
+
+## Release Notes
+
+### OpenECOMP Distributions
+
+Build 1.2.8, ?? ??? 2017
+* put new entries here *
+
+Build 1.2.7, 10 Apr 2017
+- No changes
+
+Build 1.2.6, 23 Mar 2017
+- No changes
+
+Build 1.2.5, 16 Mar 2017
+- Extended PortalTimeoutHandler to show method names in all exception output
+- US869765 Post OpenSource SDKs and ecompFW apps should listen to endpoint /api/v2 instead of just /api
+
+Build 1.2.4, 10 Mar 2017
+- No changes
+
+Build 1.2.3, 8 Mar 2017
+- No changes
+
+Build 1.2.2, 6 Mar 2017
+- No changes
+
+Build 1.2.1, 2 Mar 2017
+- Refactor to remove dependency on AT&T Global Log On single sign on (SSO) library.
+- Move UEB/Cambria library and demonstration use classes out of FW
+
+Build 1.2.0, 9 Feb 2017
+- Change group to org.openecomp.ecompsdkos; restart version numbering for open-source distribution
+
+### Closed-Source Distributions
+
+The following history is preserved for the benefit of partner application teams.
+
+Version 4.3.5, 2 Feb 2017
+- No changes
+
+Version 4.3.4 13 Jan 2017
+- No changes
+
+Version 4.3.3, 11 Jan 2017
+- US779882 Extend analytics servlet to use content type text/javascript for analytics script;
+ check for empty user ID when validating analytics GET/POST requests
+
+Version 4.3.2, 9 Jan 2017
+- US779882 Extend servlet to provide GET/POST endpoints for Web Analytics
+
+Version 4.3.1, 3 Jan 2017
+- No changes
+
+Version 4.2.1, 15 Dec 2016
+- DE255409 trim trailing space on values fetched from Portal, System properties
+
+Version 4.1.4, 22 Nov 2016
+ - No changes
+
+Version 4.1.3, 14 Nov 2016
+ - No changes
+
+Version 4.1.2, 14 Nov 2016
+ - No changes
+
+Version 4.1.1, 3 Nov 2016
+ - No changes
+
+Version 3.3.3, 13 Oct 2016
+ - No changes
+
+Version 3.3.2, 26 Sep 2016
+ - DE237818, fix bug that blocked return of session timeout information
+
+Version 3.3.1, 22 Sep 2016
+ - No changes
+
+Version 3.2.2, 4 Aug 2016
+
+Version 3.2.1, 12 July 2016
+
+Version 2.0.3, 13 June 2016
+
+Version 2.0.2, 27 May 2016
diff --git a/ecomp-sdk/epsdk-fw/pom.xml b/ecomp-sdk/epsdk-fw/pom.xml
new file mode 100644
index 00000000..504d768a
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.openecomp.ecompsdkos</groupId>
+ <artifactId>epsdk-project</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ </parent>
+
+ <!-- GroupId is inherited from parent -->
+ <artifactId>epsdk-fw</artifactId>
+ <!-- Version is inherited from parent -->
+ <packaging>jar</packaging>
+ <name>ECOMP Portal SDK Framework</name>
+
+ <!-- properties are inherited from parent -->
+
+ <!-- repositories are inherited from parent -->
+
+ <!-- profiles are inherited from parent -->
+
+ <build>
+
+ <resources>
+ <resource>
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**/portal*.properties</include>
+ </includes>
+ </resource>
+ </resources>
+
+ <plugins>
+
+ <!-- some plugins inherited from parent -->
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <archive>
+ <manifestEntries>
+ <archive-version>${project.version}</archive-version>
+ <internal-version>${sdk-internal.version}</internal-version>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+ <dependencies>
+
+ <!-- publicly available -->
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>3.0.1</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.10</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>2.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.6.3</version>
+ </dependency>
+
+ </dependencies>
+
+</project>
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalRestAPIService.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalRestAPIService.java
new file mode 100644
index 00000000..0efd1ce4
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalRestAPIService.java
@@ -0,0 +1,175 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.crossapi;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException;
+import org.openecomp.portalsdk.core.restful.domain.EcompRole;
+import org.openecomp.portalsdk.core.restful.domain.EcompUser;
+
+/**
+ * Defines the REST API Interface that an on-boarding application must implement
+ * to answer queries and accept updates from the ECOMP Portal about the
+ * application's users, roles and user-role assignments.
+ */
+public interface IPortalRestAPIService {
+
+ // EcompUser Interface
+
+ /**
+ * Creates a user with the specified details. If any error occurs, for
+ * example the user exists, the method should throw PortalApiException with
+ * an appropriate message. The FW library will catch the exception and send
+ * an appropriate response to Portal.
+ *
+ * @param user
+ * Model object with attributes of user to be created.
+ * @throws PortalAPIException
+ * If any error occurs while processing the request; for
+ * example, user exists.
+ */
+ public void pushUser(EcompUser user) throws PortalAPIException;
+
+ /**
+ * Updates details about the user with the specified loginId. For example,
+ * mark user as inactive. If any error occurs, the method should throw
+ * PortalApiException with an appropriate message. The FW library will catch
+ * the exception and send an appropriate response to Portal.
+ *
+ * @param loginId
+ * EcompUser ID to be updated.
+ * @param user
+ * Model object with attributes of user to be updated.
+ * @throws PortalAPIException
+ * If any error occurs while processing the request; for
+ * example, unknown user.
+ */
+ public void editUser(String loginId, EcompUser user) throws PortalAPIException;
+
+ /**
+ * Gets and returns the user object with the specified loginId. If any error
+ * occurs, the method should throw PortalApiException with an appropriate
+ * message. The FW library will catch the exception and send an appropriate
+ * response to Portal
+ *
+ * @param loginId
+ * EcompUser ID to be fetched
+ * @return Model object with user attributes.
+ * @throws PortalAPIException
+ * If any error occurs while processing the request; for
+ * example, unknown user.
+ */
+ public EcompUser getUser(String loginId) throws PortalAPIException;
+
+ /**
+ * Gets and returns a list of active users. If any error occurs, the method
+ * should throw PortalApiException with an appropriate message. The FW
+ * library will catch the exception and send an appropriate response to
+ * Portal.
+ *
+ * @return List of user attribute model objects; empty list if none are
+ * found.
+ * @throws PortalAPIException
+ * If any error occurs while processing the request.
+ */
+ public List<EcompUser> getUsers() throws PortalAPIException;
+
+ // Roles Interface
+
+ /**
+ * Gets and returns a list of active roles. If any error occurs, the method
+ * should throw PortalApiException with an appropriate message. The FW
+ * library will catch the exception and send an appropriate response to
+ * Portal.
+ *
+ * @return List of role attribute objects; empty list if none are found.
+ * @throws PortalAPIException
+ * If an unexpected error occurs while processing the request.
+ */
+ public List<EcompRole> getAvailableRoles() throws PortalAPIException;
+
+ /**
+ * Updates roles for the user with the specified loginId to the list of
+ * roles provided as the second argument. After this operation, the should
+ * have ONLY the roles provided in the list above. For example, if user had
+ * roles r1, r2 and r3; and a call was made to pushUserRole with a list
+ * containing only roles r3 and r4, this method should leave the user with
+ * roles r3 and r4 since those were the ONLY roles provided in second
+ * argument. If any error occurs, the method should throw PortalApiException
+ * with an appropriate message. The FW library will catch the exception and
+ * send an appropriate response to Portal.
+ *
+ * @param loginId
+ * EcompUser ID to be updated.
+ * @param roles
+ * List of role attribute objects
+ * @throws PortalAPIException
+ * If any error occurs while processing the request.
+ */
+ public void pushUserRole(String loginId, List<EcompRole> roles) throws PortalAPIException;
+
+ /**
+ * Gets and returns a list of roles for the user with the specified loginId.
+ * If any error occurs, the method should throw PortalApiException with an
+ * appropriate message. The FW library will catch the exception and send an
+ * appropriate response to Portal.
+ *
+ * @param loginId
+ * @return List of model objects; empty if no roles are found.
+ * @throws PortalAPIException
+ * If any error occurs while processing the request; e.g., user
+ * not found.
+ */
+ public List<EcompRole> getUserRoles(String loginId) throws PortalAPIException;
+
+ // Security Interface
+
+ /**
+ * Should return true if the call should be allowed and false if not.
+ * Currently Portal sends two headers of username and password in each
+ * request which the app should check. If match, return true; else return
+ * false. If any error occurs, the method should throw PortalApiException
+ * with an appropriate message. The FW library will catch the exception and
+ * send an appropriate response to Portal.
+ *
+ * @param request
+ * @return true if the request contains appropriate credentials, else false.
+ * @throws PortalAPIException
+ * If an unexpected error occurs while processing the request.
+ */
+ public boolean isAppAuthenticated(HttpServletRequest request) throws PortalAPIException;
+
+ /**
+ * Gets and returns the userId for the logged-in user based on the request.
+ * If any error occurs, the method should throw PortalApiException with an
+ * appropriate message. The FW library will catch the exception and send an
+ * appropriate response to Portal.
+ *
+ * @param request
+ * @return true if the request contains appropriate credentials, else false.
+ * @throws PortalAPIException
+ * If an unexpected error occurs while processing the request.
+ */
+ public String getUserId(HttpServletRequest request) throws PortalAPIException;
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalUebAPIService.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalUebAPIService.java
new file mode 100644
index 00000000..b6e0150e
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/IPortalUebAPIService.java
@@ -0,0 +1,47 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.crossapi;
+
+import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException;
+
+/**
+ *
+ * @author Ikram Ikramullah
+ *
+ * UEB API Interface for all the onboarding third party applications.
+ *
+ */
+
+public interface IPortalUebAPIService {
+ //User Interface
+ public String pushUser(String userJson) throws PortalAPIException;
+ public String editUser(String loginId, String userJson) throws PortalAPIException;
+ public String getUser(String loginId) throws PortalAPIException;
+ public String getUsers() throws PortalAPIException;
+
+ //Roles Interface
+ public String getAvailableRoles() throws PortalAPIException;
+ public String getAvailableFullRoles() throws PortalAPIException;
+ public String pushUserRole(String loginId, String rolesJson) throws PortalAPIException;
+ public String getUserRoles(String loginId) throws PortalAPIException;
+
+ //Security Interface
+ public boolean isAppAuthenticated(String appUserName, String appPassword) throws PortalAPIException;
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalAPIResponse.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalAPIResponse.java
new file mode 100644
index 00000000..ad1eae8d
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalAPIResponse.java
@@ -0,0 +1,58 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.crossapi;
+
+/**
+ * This bean holds a response that is returned by the role and user-management
+ * REST API.
+ */
+public class PortalAPIResponse {
+
+ /**
+ * Either "ok" or "error"
+ */
+ private String status;
+ /**
+ * Optional if status is ok
+ */
+ private String message;
+
+ public PortalAPIResponse(boolean isOk, String msg) {
+ status = (isOk? "ok" : "error");
+ message = msg;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalRestAPIProxy.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalRestAPIProxy.java
new file mode 100644
index 00000000..02d35ae9
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/PortalRestAPIProxy.java
@@ -0,0 +1,618 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.crossapi;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException;
+import org.openecomp.portalsdk.core.onboarding.listener.PortalTimeoutHandler;
+import org.openecomp.portalsdk.core.onboarding.rest.RestWebServiceClient;
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiProperties;
+import org.openecomp.portalsdk.core.restful.domain.EcompRole;
+import org.openecomp.portalsdk.core.restful.domain.EcompUser;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * This servlet performs the functions described below. It listens on a path
+ * like "/api" (see {@link PortalApiConstants#API_PREFIX}). The servlet checks
+ * for authorized access and rejects unauthorized requests.
+ * <OL>
+ * <LI>Proxies user (i.e., browser) requests for web analytics. The GET method
+ * fetches javascript from the Portal and returns it. The POST method forwards
+ * data sent by the browser on to Portal. These requests are checked for a valid
+ * User UID in a header; these requests do NOT use the application
+ * username-password header.</LI>
+ * <LI>Responds to ECOMP Portal API requests to query and update user, role and
+ * user-role information. The servlet proxies all requests on to a local Java
+ * class that implements {@link IPortalRestAPIService}. These requests must have
+ * the application username-password header.</LI>
+ * </OL>
+ * This servlet will not start if the required portal.properties file is not
+ * found on the classpath.
+ */
+
+@WebServlet(urlPatterns = { PortalApiConstants.API_PREFIX + "/*" })
+public class PortalRestAPIProxy extends HttpServlet implements IPortalRestAPIService {
+ private static final long serialVersionUID = 1L;
+
+ private static final String contentTypeAppJson = "application/json";
+
+ private final Log logger = LogFactory.getLog(getClass());
+
+ /**
+ * Mapper for JSON to object etc.
+ */
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ /**
+ * Client-supplied class that implements our interface.
+ */
+ private static IPortalRestAPIService portalRestApiServiceImpl;
+
+ public PortalRestAPIProxy() {
+ // Ensure that any additional fields sent by the Portal
+ // will be ignored when creating objects.
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ }
+
+ @Override
+ public void init() throws ServletException {
+ String className = PortalApiProperties.getProperty(PortalApiConstants.PORTAL_API_IMPL_CLASS);
+ if (className == null)
+ throw new ServletException(
+ "init: Failed to find class name property " + PortalApiConstants.PORTAL_API_IMPL_CLASS);
+ try {
+ logger.debug("init: creating instance of class " + className);
+ Class<?> implClass = Class.forName(className);
+ portalRestApiServiceImpl = (IPortalRestAPIService) (implClass.getConstructor().newInstance());
+ } catch (Exception ex) {
+ throw new ServletException("init: Failed to find or instantiate class " + className, ex);
+ }
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest request, HttpServletResponse response)
+ throws IOException, ServletException {
+
+ if (portalRestApiServiceImpl == null) {
+ // Should never happen due to checks in init()
+ logger.error("doPost: no service class instance");
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ response.getWriter().write(buildJsonResponse(false, "Misconfigured - no instance of service class"));
+ return;
+ }
+ String requestUri = request.getRequestURI();
+ String responseJson = "";
+ String storeAnalyticsContextPath = "/storeAnalytics";
+ if (requestUri.endsWith(PortalApiConstants.API_PREFIX + storeAnalyticsContextPath)) {
+ String userId;
+ try {
+ userId = getUserId(request);
+ } catch (PortalAPIException e) {
+ logger.error("Issue with invoking getUserId implemenation !!! ", e);
+ throw new ServletException(e);
+ }
+ if (userId == null || userId.length() == 0) {
+ logger.debug("doPost: userId is null or empty");
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ responseJson = buildJsonResponse(false, "Not authorized for " + storeAnalyticsContextPath);
+ } else {
+ // User ID obtained from request
+ try {
+ String credential = PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY);
+ // for now lets also pass uebkey as user name and password
+ String requestBody = readRequestBody(request);
+ @SuppressWarnings("unchecked")
+ Map<String, String> bodyMap = mapper.readValue(requestBody, Map.class);
+ // add user ID
+ bodyMap.put("userid", userId);
+ requestBody = mapper.writeValueAsString(bodyMap);
+ responseJson = RestWebServiceClient.getInstance().postPortalContent(storeAnalyticsContextPath,
+ userId, credential, null, credential, credential, "application/json", requestBody);
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: postPortalContent returns " + responseJson);
+ response.setStatus(HttpServletResponse.SC_OK);
+ } catch (Exception ex) {
+ logger.error("doPost: " + storeAnalyticsContextPath + " caught exception", ex);
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+ }
+ writeAndFlush(response, contentTypeAppJson, responseJson);
+ return;
+ } // post analytics
+
+ boolean secure = false;
+ try {
+ secure = isAppAuthenticated(request);
+ } catch (PortalAPIException ex) {
+ logger.error("doPost: isAppAuthenticated threw exception", ex);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ response.getWriter().write(buildJsonResponse(false, "Failed to authenticate request"));
+ return;
+ }
+ if (!secure) {
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: isAppAuthenticated answered false");
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ writeAndFlush(response, contentTypeAppJson, buildJsonResponse(false, "Not authorized"));
+ return;
+ }
+
+ try {
+ String requestBody = readRequestBody(request);
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: URI = " + requestUri + ", payload = " + requestBody);
+
+ /*
+ * All APIs:
+ *
+ * 1. /user <-- save user
+ *
+ * 2. /user/{loginId} <-- edit user
+ *
+ * 3. /user/{loginId}/roles <-- save roles for user
+ */
+
+ // On success return the empty string.
+
+ if (requestUri.endsWith("/updateSessionTimeOuts")) {
+ if (updateSessionTimeOuts(requestBody)) {
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: updated session timeouts");
+ response.setStatus(HttpServletResponse.SC_OK);
+ } else {
+ String msg = "Failed to update session time outs";
+ logger.error("doPost: " + msg);
+ responseJson = buildJsonResponse(false, msg);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+ } else if (requestUri.endsWith("/timeoutSession")) {
+ String portalJSessionId = request.getParameter("portalJSessionId");
+ if (portalJSessionId == null) {
+ portalJSessionId = "";
+ }
+ if (timeoutSession(portalJSessionId)) {
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: timed out session");
+ response.setStatus(HttpServletResponse.SC_OK);
+ } else {
+ String msg = "Failed to timeout session";
+ logger.error("doPost: " + msg);
+ responseJson = buildJsonResponse(false, msg);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+ } else
+ // Example: /user <-- create user
+ if (requestUri.endsWith(PortalApiConstants.API_PREFIX + "/user")) {
+ try {
+ EcompUser user = mapper.readValue(requestBody, EcompUser.class);
+ pushUser(user);
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: pushUser: success");
+ responseJson = buildJsonResponse(true, null);
+ response.setStatus(HttpServletResponse.SC_OK);
+ } catch (Exception ex) {
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doPost: pushUser: caught exception", ex);
+ }
+ } else
+ // Example: /user/fi241c <-- edit user fi241c
+ if (requestUri.contains(PortalApiConstants.API_PREFIX + "/user/") && !(requestUri.endsWith("/roles"))) {
+ String loginId = requestUri.substring(requestUri.lastIndexOf('/') + 1);
+ try {
+ EcompUser user = mapper.readValue(requestBody, EcompUser.class);
+ editUser(loginId, user);
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: editUser: success");
+ responseJson = buildJsonResponse(true, null);
+ response.setStatus(HttpServletResponse.SC_OK);
+ } catch (Exception ex) {
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doPost: editUser: caught exception", ex);
+ }
+ } else
+ // Example: /user/{loginId}/roles <-- save roles for user
+ if (requestUri.contains(PortalApiConstants.API_PREFIX + "/user/") && requestUri.endsWith("/roles")) {
+ String loginId = requestUri.substring(requestUri.indexOf("/user/") + ("/user").length() + 1,
+ requestUri.lastIndexOf('/'));
+ try {
+ TypeReference<List<EcompRole>> typeRef = new TypeReference<List<EcompRole>>() {
+ };
+ List<EcompRole> roles = mapper.readValue(requestBody, typeRef);
+ pushUserRole(loginId, roles);
+ if (logger.isDebugEnabled())
+ logger.debug("doPost: pushUserRole: success");
+ responseJson = buildJsonResponse(true, null);
+ response.setStatus(HttpServletResponse.SC_OK);
+ } catch (Exception ex) {
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doPost: pushUserRole: caught exception", ex);
+ }
+ } else {
+ String msg = "doPost: no match for request " + requestUri;
+ logger.warn(msg);
+ responseJson = buildJsonResponse(false, msg);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ }
+ } catch (Exception ex) {
+ logger.error("doPost: Failed to process request " + requestUri, ex);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ responseJson = buildJsonResponse(ex);
+ }
+
+ writeAndFlush(response, contentTypeAppJson, responseJson);
+
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response)
+ throws IOException, ServletException {
+
+ if (portalRestApiServiceImpl == null) {
+ // Should never happen due to checks in init()
+ logger.error("doGet: no service class instance");
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ writeAndFlush(response, contentTypeAppJson,
+ buildJsonResponse(false, "Misconfigured - no instance of service class"));
+ return;
+ }
+
+ String requestUri = request.getRequestURI();
+ String responseString = "";
+ String contentType = contentTypeAppJson;
+
+ String webAnalyticsContextPath = "/analytics";
+ if (requestUri.endsWith(PortalApiConstants.API_PREFIX + webAnalyticsContextPath)) {
+ String userId;
+ try {
+ userId = getUserId(request);
+ } catch (PortalAPIException e) {
+ logger.error("Issue with invoking getUserId implemenation !!! ", e);
+ throw new ServletException(e);
+ }
+ if (userId == null || userId.length() == 0) {
+ logger.debug("doGet: userId is null or empty");
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ responseString = buildJsonResponse(false, "Not authorized for " + webAnalyticsContextPath);
+ } else {
+ // User ID obtained from request
+ try {
+ String credential = PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY);
+ // for now lets also pass uebkey as user name and password
+ contentType = "text/javascript";
+ responseString = RestWebServiceClient.getInstance().getPortalContent(webAnalyticsContextPath,
+ userId, credential, null, credential, credential);
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: " + webAnalyticsContextPath + ": " + responseString);
+ response.setStatus(HttpServletResponse.SC_OK);
+ } catch (Exception ex) {
+ responseString = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doGet: " + webAnalyticsContextPath + " caught exception", ex);
+ }
+ }
+ writeAndFlush(response, contentType, responseString);
+ return;
+ }
+
+ boolean secure = false;
+ try {
+ secure = isAppAuthenticated(request);
+ } catch (PortalAPIException ex) {
+ logger.error("doGet: isAppAuthenticated threw exception", ex);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ writeAndFlush(response, contentTypeAppJson, buildJsonResponse(false, "Failed to authenticate request"));
+ return;
+ }
+
+ if (!secure) {
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: isAppAuthenticated answered false");
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ writeAndFlush(response, contentTypeAppJson, buildJsonResponse(false, "Not authorized"));
+ return;
+ }
+
+ String responseJson = null;
+ try {
+ // Ignore any request body in a GET.
+ // String requestBody = readRequestBody(request);
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: URI = " + requestUri);
+
+ /*
+ * 1. /roles <-- get roles
+ *
+ * 2. /user/{loginId} <-- get user
+ *
+ * 3. /users <-- get all users
+ *
+ * 4. /user/{loginId}/roles <-- get roles for user
+ */
+
+ if (requestUri.endsWith("/sessionTimeOuts")) {
+ responseJson = getSessionTimeOuts();
+ if (responseJson != null && responseJson.length() > 0) {
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: got session timeouts");
+ response.setStatus(HttpServletResponse.SC_OK);
+ } else {
+ String msg = "Failed to get session time outs";
+ logger.error("doGet: " + msg);
+ responseJson = buildJsonResponse(false, msg);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+ } else
+ // Example: /users <-- get all users
+ if (requestUri.endsWith(PortalApiConstants.API_PREFIX + "/users")) {
+ try {
+ List<EcompUser> users = getUsers();
+ responseJson = mapper.writeValueAsString(users);
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: getUsers: " + responseJson);
+ } catch (Exception ex) {
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doGet: getUsers: caught exception", ex);
+ }
+ } else
+ // Example: /roles <-- get all roles
+ if (requestUri.endsWith(PortalApiConstants.API_PREFIX + "/roles")) {
+ try {
+ List<EcompRole> roles = getAvailableRoles();
+ responseJson = mapper.writeValueAsString(roles);
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: getAvailableRoles: " + responseJson);
+ } catch (Exception ex) {
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doGet: getAvailableRoles: caught exception", ex);
+ }
+ } else
+ // Example: /user/fi241c <-- get user fi241c
+ if (requestUri.contains(PortalApiConstants.API_PREFIX + "/user/") && !requestUri.endsWith("/roles")) {
+ String loginId = requestUri.substring(requestUri.lastIndexOf('/') + 1);
+ try {
+ EcompUser user = getUser(loginId);
+ responseJson = mapper.writeValueAsString(user);
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: getUser: " + responseJson);
+ } catch (Exception ex) {
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doGet: getUser: caught exception", ex);
+ }
+ }
+ // Example: /user/fi241c/roles <-- get roles for user fi241c
+ else if (requestUri.contains(PortalApiConstants.API_PREFIX + "/user/") && requestUri.endsWith("/roles")) {
+ String loginId = requestUri.substring(requestUri.indexOf("/user/") + ("/user").length() + 1,
+ requestUri.lastIndexOf('/'));
+ try {
+ List<EcompRole> roles = getUserRoles(loginId);
+ responseJson = mapper.writeValueAsString(roles);
+ if (logger.isDebugEnabled())
+ logger.debug("doGet: getUserRoles: " + responseJson);
+ } catch (Exception ex) {
+ responseJson = buildJsonResponse(ex);
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ logger.error("doGet: getUserRoles: caught exception", ex);
+ }
+ } else {
+ logger.warn("doGet: no match found for request");
+ responseJson = buildJsonResponse(false, "No match for request");
+ response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ }
+ } catch (Exception ex) {
+ logger.error("doGet: Failed to process request", ex);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ responseJson = buildJsonResponse(ex);
+ }
+ writeAndFlush(response, contentTypeAppJson, responseJson);
+ }
+
+ public String getSessionTimeOuts() throws Exception {
+ return PortalTimeoutHandler.gatherSessionExtensions();
+ }
+
+ public boolean timeoutSession(String portalJSessionId) throws Exception {
+ return PortalTimeoutHandler.invalidateSession(portalJSessionId);
+ }
+
+ public boolean updateSessionTimeOuts(String sessionMap) throws Exception {
+ return PortalTimeoutHandler.updateSessionExtensions(sessionMap);
+ }
+
+ @Override
+ public void pushUser(EcompUser user) throws PortalAPIException {
+ portalRestApiServiceImpl.pushUser(user);
+ }
+
+ @Override
+ public void editUser(String loginId, EcompUser user) throws PortalAPIException {
+ portalRestApiServiceImpl.editUser(loginId, user);
+ }
+
+ @Override
+ public EcompUser getUser(String loginId) throws PortalAPIException {
+ return portalRestApiServiceImpl.getUser(loginId);
+ }
+
+ @Override
+ public List<EcompUser> getUsers() throws PortalAPIException {
+ return portalRestApiServiceImpl.getUsers();
+ }
+
+ @Override
+ public List<EcompRole> getAvailableRoles() throws PortalAPIException {
+ return portalRestApiServiceImpl.getAvailableRoles();
+ }
+
+ @Override
+ public void pushUserRole(String loginId, List<EcompRole> roles) throws PortalAPIException {
+ portalRestApiServiceImpl.pushUserRole(loginId, roles);
+ }
+
+ @Override
+ public List<EcompRole> getUserRoles(String loginId) throws PortalAPIException {
+ return portalRestApiServiceImpl.getUserRoles(loginId);
+ }
+
+ @Override
+ public boolean isAppAuthenticated(HttpServletRequest request) throws PortalAPIException {
+ return portalRestApiServiceImpl.isAppAuthenticated(request);
+ }
+
+ /**
+ * Sets the content type and writes the response.
+ *
+ * @param response
+ * @param contentType
+ * @param responseBody
+ * @throws IOException
+ */
+ private void writeAndFlush(HttpServletResponse response, String contentType, String responseBody)
+ throws IOException {
+ response.setContentType(contentType);
+ PrintWriter out = response.getWriter();
+ out.print(responseBody);
+ out.flush();
+ }
+
+ /**
+ * Reads the request body and closes the input stream.
+ *
+ * @param request
+ * @return String read from the request, the empty string if nothing is
+ * read.
+ * @throws IOException
+ */
+ private static String readRequestBody(HttpServletRequest request) throws IOException {
+
+ String body = null;
+ StringBuilder stringBuilder = new StringBuilder();
+ BufferedReader bufferedReader = null;
+ try {
+ InputStream inputStream = request.getInputStream();
+ if (inputStream != null) {
+ bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+ char[] charBuffer = new char[1024];
+ int bytesRead = -1;
+ while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
+ stringBuilder.append(charBuffer, 0, bytesRead);
+ }
+ } else {
+ stringBuilder.append("");
+ }
+ } finally {
+ if (bufferedReader != null) {
+ try {
+ bufferedReader.close();
+ } catch (IOException ex) {
+ throw ex;
+ }
+ }
+ }
+ body = stringBuilder.toString();
+ return body;
+ }
+
+ /**
+ * Builds JSON object with status + message response body.
+ *
+ * @param success
+ * True to indicate success, false to signal failure.
+ * @param msg
+ * Message to include in the response object; ignored if null.
+ * @return
+ *
+ * <pre>
+ * { "status" : "ok" (or "error"), "message": "some explanation" }
+ * </pre>
+ */
+ private String buildJsonResponse(boolean success, String msg) {
+ PortalAPIResponse response = new PortalAPIResponse(success, msg);
+ String json = null;
+ try {
+ json = mapper.writeValueAsString(response);
+ } catch (JsonProcessingException ex) {
+ // Truly should never, ever happen
+ json = "{ \"status\": \"error\",\"message\":\"" + ex.toString() + "\" }";
+ }
+ return json;
+ }
+
+ /**
+ * Builds JSON object with status of error and message containing stack
+ * trace for the specified throwable.
+ *
+ * @param t
+ * Throwable with stack trace to use as message
+ *
+ * @return
+ *
+ * <pre>
+ * { "status" : "error", "message": "some-big-stacktrace" }
+ * </pre>
+ */
+ private String buildJsonResponse(Throwable t) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ t.printStackTrace(pw);
+ return buildJsonResponse(false, sw.toString());
+ }
+
+ @Override
+ public String getUserId(HttpServletRequest request) throws PortalAPIException {
+ return portalRestApiServiceImpl.getUserId(request);
+ }
+
+ public static IPortalRestAPIService getPortalRestApiServiceImpl() {
+ return portalRestApiServiceImpl;
+ }
+
+ public static void setPortalRestApiServiceImpl(IPortalRestAPIService portalRestApiServiceImpl) {
+ PortalRestAPIProxy.portalRestApiServiceImpl = portalRestApiServiceImpl;
+ }
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/SessionCommunicationService.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/SessionCommunicationService.java
new file mode 100644
index 00000000..be3a7d54
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/crossapi/SessionCommunicationService.java
@@ -0,0 +1,161 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.crossapi;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class SessionCommunicationService {
+
+ protected static final Log logger = LogFactory.getLog(SessionCommunicationService.class);
+
+ /**
+ * Calls the ECOMP Portal to retrieve the session slot check interval.
+ *
+ * @param ecompRestURL
+ * @param userName
+ * application user name used for authentication at Portal
+ * @param password
+ * application password used for authentication at Portal
+ * @param uebKey
+ * application UEB key (basically application ID) used for
+ * authentication at Portal
+ * @return Content read from the remote REST endpoint
+ */
+ public static String getSessionSlotCheckInterval(String ecompRestURL, String userName, String password,
+ String uebKey) {
+ try {
+ String url = ecompRestURL + "/getSessionSlotCheckInterval";
+
+ URL obj = new URL(url);
+
+ HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+
+ // optional default is GET
+ con.setRequestMethod("GET");
+ con.setConnectTimeout(3000);
+ con.setReadTimeout(8000);
+ // add request header
+ con.setRequestProperty("username", userName);
+ con.setRequestProperty("password", password);
+ con.setRequestProperty("uebkey", uebKey);
+
+ int responseCode = con.getResponseCode();
+ if (logger.isDebugEnabled()) {
+ logger.debug("getSessionSlotCheckInterval: Sending 'GET' request to URL : " + url);
+ logger.debug("getSessionSlotCheckInterval: Response Code : " + responseCode);
+ }
+
+ StringBuffer response = new StringBuffer();
+
+ BufferedReader in = null;
+ try {
+ in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
+ String inputLine;
+ while ((inputLine = in.readLine()) != null)
+ response.append(inputLine);
+ } finally {
+ in.close();
+ }
+ return response.toString();
+ } catch (Exception e) {
+ logger.error("getSessionSlotCheckInterval: failed to fetch the session slot check", e);
+ return null;
+ }
+
+ }
+
+ /**
+ * Calls the ECOMP Portal to request an extension of the current session.
+ *
+ * @param ecompRestURL
+ * @param userName
+ * application user name used for authentication at Portal
+ * @param password
+ * application password used for authentication at Portal
+ * @param uebKey
+ * application UEB key (basically application ID) used for
+ * authentication at Portal
+ * @param sessionTimeoutMap
+ * @return Content read from the remote REST endpoint
+ * @throws Exception
+ */
+ public static String requestPortalSessionTimeoutExtension(String ecompRestURL, String userName, String password,
+ String uebKey, String sessionTimeoutMap) throws Exception {
+
+ try {
+
+ String url = ecompRestURL + "/extendSessionTimeOuts";
+ // String decreptedPwd =
+ // app.appPassword;//CipherUtil.decrypt(encriptedPwdDB,
+ // SystemProperties.getProperty(SystemProperties.SECRET_KEY));
+
+ URL obj = new URL(url);
+
+ HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+
+ con.setRequestMethod("POST");
+ con.setConnectTimeout(3000);
+ con.setReadTimeout(15000);
+
+ // add request header
+ con.setRequestProperty("username", userName);
+ con.setRequestProperty("password", password);
+ con.setRequestProperty("uebkey", uebKey);
+ con.setRequestProperty("sessionMap", sessionTimeoutMap);
+ con.setDoInput(true);
+ con.setDoOutput(true);
+ con.getOutputStream().write(sessionTimeoutMap.getBytes());
+ con.getOutputStream().flush();
+ con.getOutputStream().close();
+
+ // con.set
+
+ int responseCode = con.getResponseCode();
+ if (logger.isDebugEnabled()) {
+ logger.debug("requestPortalSessionTimeoutExtension: Sending 'GET' request to URL : " + url);
+ logger.debug("requestPortalSessionTimeoutExtension: Response Code : " + responseCode);
+ }
+
+ StringBuffer response = new StringBuffer();
+ BufferedReader in = null;
+ try {
+ in = new BufferedReader(new InputStreamReader(con.getInputStream()));
+ String inputLine;
+ while ((inputLine = in.readLine()) != null) {
+ response.append(inputLine);
+ }
+ } finally {
+ in.close();
+ }
+ return response.toString();
+ } catch (Exception e) {
+ logger.error("requestPortalSessionTimeoutExtension: failed to request Portal to extend time out ", e);
+ return null;
+ }
+
+ }
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/exception/PortalAPIException.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/exception/PortalAPIException.java
new file mode 100644
index 00000000..ea9b1c66
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/exception/PortalAPIException.java
@@ -0,0 +1,46 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.exception;
+
+public class PortalAPIException extends Exception{
+
+ private static final long serialVersionUID = 4854048794984375707L;
+
+ public PortalAPIException() {
+ super();
+ }
+
+ public PortalAPIException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+
+ public PortalAPIException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public PortalAPIException(String message) {
+ super(message);
+ }
+
+ public PortalAPIException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutBindingListener.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutBindingListener.java
new file mode 100644
index 00000000..4a6b43bc
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutBindingListener.java
@@ -0,0 +1,53 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.listener;
+
+import java.io.Serializable;
+
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionBindingListener;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
+
+public class PortalTimeoutBindingListener implements HttpSessionBindingListener, Serializable {
+
+ private final Log logger = LogFactory.getLog(getClass());
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void valueBound(HttpSessionBindingEvent event) {
+ final HttpSession session = event.getSession();
+ PortalTimeoutHandler.sessionMap.put((String) session.getAttribute(PortalApiConstants.PORTAL_JSESSION_ID),
+ session);
+ }
+
+ @Override
+ public void valueUnbound(HttpSessionBindingEvent event) {
+ final HttpSession session = event.getSession();
+ String portalJSessionId = (String) session.getAttribute(PortalApiConstants.PORTAL_JSESSION_ID);
+ logger.debug(portalJSessionId + " getting removed");
+ PortalTimeoutHandler.sessionMap.remove(portalJSessionId);
+ }
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutHandler.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutHandler.java
new file mode 100644
index 00000000..90a9121c
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/PortalTimeoutHandler.java
@@ -0,0 +1,420 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.listener;
+
+import java.util.Calendar;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.portalsdk.core.onboarding.crossapi.SessionCommunicationService;
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
+import org.openecomp.portalsdk.core.restful.domain.PortalTimeoutVO;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Invoked by listeners (UserContextListener and UserSessionListener) to track
+ * user sessions.
+ */
+public class PortalTimeoutHandler {
+
+ protected static final SessionCommInf sessionComm = new SessionComm();
+
+ public interface SessionCommInf {
+ public Integer fetchSessionSlotCheckInterval(String... params) throws Exception;
+
+ public void extendSessionTimeOuts(String... sessionMap) throws Exception;
+ }
+
+ public static class SessionComm implements SessionCommInf {
+ public Integer fetchSessionSlotCheckInterval(String... params) throws Exception {
+
+ String ecompRestURL = params[0];
+ String userName = params[1];
+ String pwd = params[2];
+ String uebKey = params[3];
+
+ String sessionSlot = SessionCommunicationService.getSessionSlotCheckInterval(ecompRestURL, userName, pwd,
+ uebKey);
+ if (sessionSlot == null)
+ return null;
+ return Integer.parseInt(sessionSlot);
+ }
+
+ public void extendSessionTimeOuts(String... params) throws Exception {
+
+ String ecompRestURL = params[0];
+ String userName = params[1];
+ String pwd = params[2];
+ String uebKey = params[3];
+ String sessionTimeoutMap = params[4];
+
+ SessionCommunicationService.requestPortalSessionTimeoutExtension(ecompRestURL, userName, pwd, uebKey,
+ sessionTimeoutMap);
+ }
+ }
+
+ public static final Map<String, HttpSession> sessionMap = new Hashtable<String, HttpSession>();
+ public static final Integer repeatInterval = 15 * 60; // 15 minutes
+ protected static final Log logger = LogFactory.getLog(PortalTimeoutHandler.class);
+ static ObjectMapper mapper = new ObjectMapper();
+ private static PortalTimeoutHandler timeoutHandler;
+
+ public static PortalTimeoutHandler getInstance() {
+ if (timeoutHandler == null)
+ timeoutHandler = new PortalTimeoutHandler();
+
+ return timeoutHandler;
+ }
+
+ /**
+ * TODO: remove static
+ *
+ * @param portalJSessionId
+ * @param jSessionId
+ * @param session
+ */
+ public static void sessionCreated(String portalJSessionId, String jSessionId, HttpSession session) {
+
+ storeMaxInactiveTime(session);
+
+ // this key is a combination of portal jsession id and app session id
+ String jSessionKey = jSessionKey(jSessionId, portalJSessionId);
+ Object jSessionKeySessionVal = session.getAttribute(PortalApiConstants.PORTAL_JSESSION_ID);
+
+ // do not reset the attributes if the same values have already been set
+ // because that will cause PortalTimeoutBindingListener to unbound the
+ // value from map
+ if (jSessionKeySessionVal != null && jSessionKeySessionVal.equals(jSessionKey)) {
+ logger.debug(" Session Values already exist in te map for sessionKey " + jSessionKey);
+ return;
+ }
+
+ session.setAttribute(PortalApiConstants.PORTAL_JSESSION_ID, jSessionKey);
+
+ // session binding listener will add this value to the static map
+ // and with session replication the listener will fire in all tomcat
+ // instances
+ session.setAttribute(PortalApiConstants.PORTAL_JSESSION_BIND, new PortalTimeoutBindingListener());
+ // sessionMap.put((String)session.getAttribute(PortalApiConstants.PORTAL_JSESSION_ID),
+ // session);
+
+ }
+
+ /**
+ * TODO: remove static
+ *
+ * @param session
+ */
+ protected static void storeMaxInactiveTime(HttpSession session) {
+ if (session.getAttribute(PortalApiConstants.GLOBAL_SESSION_MAX_IDLE_TIME) == null)
+ session.setAttribute(PortalApiConstants.GLOBAL_SESSION_MAX_IDLE_TIME, session.getMaxInactiveInterval());
+ }
+
+ /**
+ * TODO: remove static
+ *
+ * @param session
+ */
+ public static void sessionDestroyed(HttpSession session) {
+ try {
+ logger.info(" Session getting destroyed - id: " + session.getId());
+ session.removeAttribute(PortalApiConstants.PORTAL_JSESSION_BIND);
+ // sessionMap.remove((String)session.getAttribute(PortalApiConstants.PORTAL_JSESSION_ID));
+ } catch (Exception e) {
+ logger.error("sessionDestroyed failed", e);
+ }
+ }
+
+ /***
+ * TODO: remove static
+ *
+ * @param portalJSessionId
+ * @return true on success, false if the session cannot be found, etc.
+ */
+ public static boolean invalidateSession(String portalJSessionId) {
+ boolean result = false;
+ logger.debug("Session Management: request from Portal to invalidate the session: " + portalJSessionId);
+ for (String jSessionKey : sessionMap.keySet()) {
+ try {
+ HttpSession session = sessionMap.get(jSessionKey);
+ if (portalJSessionId(jSessionKey).equals(portalJSessionId)) {
+ session.invalidate();
+ result = true;
+ }
+ } catch (Exception e) {
+ logger.error("invalidateSession failed", e);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * TODO: remove static
+ *
+ * @return json version of the timeout map: session ID -> timeout object
+ */
+ public static String gatherSessionExtensions() {
+ logger.debug("Session Management: gatherSessionExtensions");
+
+ Map<String, PortalTimeoutVO> sessionTimeoutMap = new Hashtable<String, PortalTimeoutVO>();
+ String jsonMap = "";
+
+ for (String jSessionKey : sessionMap.keySet()) {
+
+ try {
+ // get the expirytime in seconds
+ HttpSession session = sessionMap.get(jSessionKey);
+
+ Long lastAccessedTimeMilliSec = session.getLastAccessedTime();
+ Long maxIntervalMilliSec = session.getMaxInactiveInterval() * 1000L;
+ // Long currentTimeMilliSec =
+ // Calendar.getInstance().getTimeInMillis() ;
+ // (maxIntervalMilliSec - (currentTimeMilliSec -
+ // lastAccessedTimeMilliSec) + ;
+ Calendar instance = Calendar.getInstance();
+ instance.setTimeInMillis(session.getLastAccessedTime());
+ logger.debug("Session Management: Last Accessed time for " + jSessionKey + ": " + instance.getTime());
+
+ Long sessionTimOutMilliSec = maxIntervalMilliSec + lastAccessedTimeMilliSec;
+
+ sessionTimeoutMap.put(portalJSessionId(jSessionKey),
+ getSingleSessionTimeoutObj(jSessionKey, sessionTimOutMilliSec));
+ logger.debug("Session Management: putting session in map " + jSessionKey + " sessionTimoutSec"
+ + (int) (sessionTimOutMilliSec / 1000));
+
+ jsonMap = mapper.writeValueAsString(sessionTimeoutMap);
+
+ } catch (Exception e) {
+ logger.error("gatherSessionExtensions failed", e);
+ }
+
+ }
+
+ return jsonMap;
+
+ }
+
+ /**
+ * TODO: remove static
+ *
+ * @param sessionTimeoutMapStr
+ * @return true on success, false otherwise
+ * @throws Exception
+ */
+ public static boolean updateSessionExtensions(String sessionTimeoutMapStr) throws Exception {
+ logger.debug("Session Management: updateSessionExtensions");
+ // Map<String,Object> sessionTimeoutMap =
+ // mapper.readValue(sessionTimeoutMapStr, Map.class);
+ Map<String, PortalTimeoutVO> sessionTimeoutMap = null;
+
+ try {
+ TypeReference<Hashtable<String, PortalTimeoutVO>> typeRef = new TypeReference<Hashtable<String, PortalTimeoutVO>>() {
+ };
+ sessionTimeoutMap = mapper.readValue(sessionTimeoutMapStr, typeRef);
+ } catch (Exception e) {
+ logger.error("updateSessionExtensions failed to parse the sessionTimeoutMap from portal", e);
+ return false;
+ }
+
+ boolean result = true;
+ for (String jPortalSessionId : sessionTimeoutMap.keySet()) {
+ try {
+ PortalTimeoutVO extendedTimeoutVO = mapper.readValue(
+ mapper.writeValueAsString(sessionTimeoutMap.get(jPortalSessionId)), PortalTimeoutVO.class);
+ HttpSession session = sessionMap.get(jSessionKey(extendedTimeoutVO.getjSessionId(), jPortalSessionId));
+
+ if (session == null) {
+ continue;
+ }
+
+ Long lastAccessedTimeMilliSec = session.getLastAccessedTime();
+ Long maxIntervalMilliSec = session.getMaxInactiveInterval() * 1000L;
+ Long sessionTimOutMilliSec = maxIntervalMilliSec + lastAccessedTimeMilliSec;
+
+ Long maxTimeoutTimeMilliSec = extendedTimeoutVO.getSessionTimOutMilliSec();
+ if (maxTimeoutTimeMilliSec > sessionTimOutMilliSec) {
+ session.setMaxInactiveInterval((int) (maxTimeoutTimeMilliSec - lastAccessedTimeMilliSec) / 1000);
+ logger.debug("Session Management: extended session for :" + session.getId() + " to :"
+ + (int) (maxTimeoutTimeMilliSec / 1000));
+ // System.out.println("!!!!!!!!!extended session for :" +
+ // session.getId() + " to :" +
+ // (int)(maxTimeoutTimeMilliSec/1000));
+ }
+ } catch (Exception e) {
+ logger.error("updateSessionExtensions failed to update session timeouts", e);
+ // Signal a problem if any one of them fails
+ result = false;
+ }
+
+ }
+ return result;
+ }
+
+ /**
+ * TODO: Remove static
+ *
+ * @param request
+ * @param userName
+ * @param pwd
+ * @param ecompRestURL
+ * @param _sessionComm
+ */
+ public static void handleSessionUpdatesNative(HttpServletRequest request, String userName, String pwd,
+ String uebKey, String ecompRestURL, SessionCommInf _sessionComm) {
+
+ if (_sessionComm == null) {
+ _sessionComm = sessionComm;
+ }
+ try {
+ synchronizeSessionForLastMinuteRequests(request, ecompRestURL, userName, pwd, uebKey, _sessionComm);
+ } catch (Exception e) {
+ logger.error("handleSesionUpdatesNative failed", e);
+ }
+ resetSessionMaxIdleTimeOut(request);
+ }
+
+ /**
+ * TODO: remove Static
+ *
+ * @param request
+ * @param ecompRestURL
+ * @param userName
+ * @param pwd
+ * @param _sessionComm
+ * @throws JsonProcessingException
+ * @throws Exception
+ */
+ public static void synchronizeSessionForLastMinuteRequests(HttpServletRequest request, String ecompRestURL,
+ String userName, String pwd, String uebKey, SessionCommInf _sessionComm)
+ throws JsonProcessingException, Exception {
+
+ HttpSession session = request.getSession(false);
+ if (session == null)
+ return;
+
+ Object portalSessionSlotCheckObj = session.getServletContext()
+ .getAttribute(PortalApiConstants.PORTAL_SESSION_SLOT_CHECK);
+ Integer portalSessionSlotCheckinMilliSec = 5 * 60 * 1000; // (5 minutes)
+ if (portalSessionSlotCheckObj != null) {
+ portalSessionSlotCheckinMilliSec = Integer.valueOf(portalSessionSlotCheckObj.toString());
+ } else {
+ portalSessionSlotCheckObj = _sessionComm
+ .fetchSessionSlotCheckInterval(new String[] { ecompRestURL, userName, pwd, uebKey });
+ logger.debug("Fetching Portal Session Slot Object: " + portalSessionSlotCheckObj);
+ if (portalSessionSlotCheckObj != null) {
+ portalSessionSlotCheckinMilliSec = Integer.valueOf(portalSessionSlotCheckObj.toString());
+ session.getServletContext().setAttribute(PortalApiConstants.PORTAL_SESSION_SLOT_CHECK,
+ portalSessionSlotCheckinMilliSec);
+ }
+ }
+
+ Object previousToLastAccessTimeObj = session.getAttribute(PortalApiConstants.SESSION_PREVIOUS_ACCESS_TIME);
+ final long lastAccessedTimeMilliSec = session.getLastAccessedTime();
+ if (previousToLastAccessTimeObj == null) {
+ previousToLastAccessTimeObj = lastAccessedTimeMilliSec;
+ session.setAttribute(PortalApiConstants.SESSION_PREVIOUS_ACCESS_TIME, previousToLastAccessTimeObj);
+ } else {
+ Long previousToLastAccessTime = (Long) previousToLastAccessTimeObj;
+ final int maxIntervalMilliSec = session.getMaxInactiveInterval() * 1000;
+ if (maxIntervalMilliSec
+ - (lastAccessedTimeMilliSec - previousToLastAccessTime) <= portalSessionSlotCheckinMilliSec) {
+
+ String jSessionKey = (String) session.getAttribute(PortalApiConstants.PORTAL_JSESSION_ID);
+ Map<String, PortalTimeoutVO> sessionTimeoutMap = new Hashtable<String, PortalTimeoutVO>();
+ Long sessionTimOutMilliSec = maxIntervalMilliSec + lastAccessedTimeMilliSec;
+
+ sessionTimeoutMap.put(PortalTimeoutHandler.portalJSessionId(jSessionKey),
+ PortalTimeoutHandler.getSingleSessionTimeoutObj(jSessionKey, sessionTimOutMilliSec));
+ String jsonMap = mapper.writeValueAsString(sessionTimeoutMap);
+ logger.debug("Extension requested for all the Apps and Portal; JessionKey: " + jSessionKey
+ + "; SessionMap: " + sessionTimeoutMap);
+ _sessionComm.extendSessionTimeOuts(new String[] { ecompRestURL, userName, pwd, uebKey, jsonMap });
+ }
+
+ }
+ }
+
+ /**
+ * TODO: remove static
+ *
+ * @param request
+ */
+ public static void resetSessionMaxIdleTimeOut(HttpServletRequest request) {
+ try {
+ HttpSession session = request.getSession(false);
+ if (session == null)
+ return;
+ final Object maxIdleAttribute = session.getAttribute(PortalApiConstants.GLOBAL_SESSION_MAX_IDLE_TIME);
+ if (maxIdleAttribute != null) {
+ session.setMaxInactiveInterval(Integer.parseInt(maxIdleAttribute.toString()));
+ }
+ } catch (Exception e) {
+ logger.error("resetSessionMaxIdleTimeout failed", e);
+ }
+
+ }
+
+ /**
+ *
+ * @param jSessionKey
+ * @param sessionTimOutMilliSec
+ * @return
+ */
+ private static PortalTimeoutVO getSingleSessionTimeoutObj(String jSessionKey, Long sessionTimOutMilliSec) {
+ return new PortalTimeoutVO(jSessionId(jSessionKey), sessionTimOutMilliSec);
+ }
+
+ /**
+ *
+ * @param jSessionId
+ * @param portalJSessionId
+ * @return
+ */
+ private static String jSessionKey(String jSessionId, String portalJSessionId) {
+ return portalJSessionId + "-" + jSessionId;
+ }
+
+ /**
+ *
+ * @param jSessionKey
+ * @return
+ */
+ private static String portalJSessionId(String jSessionKey) {
+ return jSessionKey.split("-")[0];
+ }
+
+ /**
+ *
+ * @param jSessionKey
+ * @return
+ */
+ private static String jSessionId(String jSessionKey) {
+ return jSessionKey.split("-")[1];
+ }
+
+} \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserContextListener.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserContextListener.java
new file mode 100644
index 00000000..d4793d27
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserContextListener.java
@@ -0,0 +1,54 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.listener;
+
+import java.util.HashMap;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+import javax.servlet.http.HttpSession;
+
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
+
+@WebListener
+public class UserContextListener implements ServletContextListener{
+
+ public void contextInitialized(ServletContextEvent event){
+ ServletContext context = event.getServletContext();
+ //
+ // instanciate a map to store references to all the active
+ // sessions and bind it to context scope.
+ //
+ HashMap<String, HttpSession> activeUsers = new HashMap<String, HttpSession>();
+ context.setAttribute(PortalApiConstants.ACTIVE_USERS_NAME, activeUsers);
+ }
+
+ /**
+ * Needed for the ServletContextListener interface.
+ */
+ public void contextDestroyed(ServletContextEvent event){
+ // To overcome the problem with losing the session references
+ // during server restarts, put code here to serialize the
+ // activeUsers HashMap. Then put code in the contextInitialized
+ // method that reads and reloads it if it exists...
+ }
+} \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserSessionListener.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserSessionListener.java
new file mode 100644
index 00000000..88934282
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/listener/UserSessionListener.java
@@ -0,0 +1,85 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.listener;
+
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.annotation.WebListener;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
+
+/**
+ * Listens to session-create and session-destroy events.
+ */
+@WebListener
+public class UserSessionListener implements HttpSessionListener {
+
+ private Log logger = LogFactory.getLog(getClass());
+
+ public static Map<String, HttpSession> activeSessions = new Hashtable<String, HttpSession>();
+
+ public void init(ServletConfig config) {
+ }
+
+ /**
+ * Adds sessions to the context-scoped HashMap when they begin.
+ */
+ public void sessionCreated(HttpSessionEvent event) {
+ HttpSession session = event.getSession();
+ ServletContext context = session.getServletContext();
+ @SuppressWarnings("unchecked")
+ HashMap<String, HttpSession> activeUsers = (HashMap<String, HttpSession>) context
+ .getAttribute(PortalApiConstants.ACTIVE_USERS_NAME);
+ if (activeUsers != null)
+ activeUsers.put(session.getId(), session);
+ context.setAttribute(PortalApiConstants.ACTIVE_USERS_NAME, activeUsers);
+ activeSessions.put(session.getId(), session);
+ session.getServletContext().setAttribute(PortalApiConstants.MAX_IDLE_TIME, session.getMaxInactiveInterval());
+ }
+
+ /**
+ * Removes sessions from the context-scoped HashMap when they expire or are
+ * invalidated.
+ */
+ public void sessionDestroyed(HttpSessionEvent event) {
+ try {
+ HttpSession session = event.getSession();
+ ServletContext context = session.getServletContext();
+ @SuppressWarnings("unchecked")
+ HashMap<String, HttpSession> activeUsers = (HashMap<String, HttpSession>) context
+ .getAttribute(PortalApiConstants.ACTIVE_USERS_NAME);
+ if (activeUsers != null)
+ activeUsers.remove(session.getId());
+ activeSessions.remove(session.getId());
+ PortalTimeoutHandler.sessionDestroyed(session);
+ } catch (Exception e) {
+ logger.warn(e.getMessage(), e);
+ }
+ }
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FavoritesClient.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FavoritesClient.java
new file mode 100644
index 00000000..b4ca4755
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FavoritesClient.java
@@ -0,0 +1,51 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.rest;
+
+/**
+ * Provides a convenience method for fetching the favorites for a user from the
+ * ECOMP Portal.
+ */
+public class FavoritesClient {
+
+ /**
+ * Fetches the favorites data from portal
+ *
+ * @param userId
+ * userId value that it should be using to fetch the
+ * data
+ * @param appName
+ * Application name for logging etc.
+ * @param requestId
+ * 128-bit UUID value to uniquely identify the transaction; if null, a new one is generated.
+ * @param appUserName
+ * REST API user-name
+ * @param appPassword
+ * REST API decrypted password
+ * @return JSON with favorites
+ * @throws Exception
+ * on any failure
+ */
+ public static String getFavorites(String userId, String appName, String requestId, String appUserName,
+ String appPassword) throws Exception {
+ return RestWebServiceClient.getInstance().getPortalContent("/getFavorites", userId, appName, requestId, appUserName,
+ appPassword);
+ }
+} \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FunctionalMenuClient.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FunctionalMenuClient.java
new file mode 100644
index 00000000..a3a320eb
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/FunctionalMenuClient.java
@@ -0,0 +1,54 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.rest;
+
+/**
+ * Provides a convenience method for fetching the functional menu for a user
+ * from the ECOMP Portal via UEB.
+ */
+public class FunctionalMenuClient {
+
+ /**
+ * Fetches the functional menu data from the configured ECOMP Portal
+ * instance.
+ *
+ * @param userId
+ * userId for the user to whom the menu will be shown
+ * @param appName
+ * Application name for logging etc.
+ * @param requestId
+ * 128-bit UUID value to uniquely identify the transaction; if
+ * null, a new one is generated.
+ * @param appUserName
+ * REST API user name, used by Portal to authenticate the request
+ * @param appPassword
+ * REST API password (in the clear, not encrypted), used by
+ * Portal to authenticate the request
+ * @return JSON with functional menu
+ * @throws Exception
+ * on any failure
+ */
+ public static String getFunctionalMenu(String userId, String appName, String requestId, String appUserName,
+ String appPassword) throws Exception {
+ return RestWebServiceClient.getInstance().getPortalContent("/functionalMenuItemsForUser", userId, appName,
+ requestId, appUserName, appPassword);
+ }
+
+} \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/RestWebServiceClient.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/RestWebServiceClient.java
new file mode 100644
index 00000000..f01590d4
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/rest/RestWebServiceClient.java
@@ -0,0 +1,342 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.rest;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.UUID;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
+import org.openecomp.portalsdk.core.onboarding.util.PortalApiProperties;
+
+/**
+ * Simple REST client for GET-ing content from and POST-ing content to the
+ * Portal application.
+ */
+public class RestWebServiceClient {
+
+ private final Log logger = LogFactory.getLog(RestWebServiceClient.class);
+
+ /**
+ * Singleton instance
+ */
+ private static RestWebServiceClient instance = null;
+
+ /**
+ * Constructor is private. Clients should obtain an instance via
+ * getInstance().
+ */
+ private RestWebServiceClient() {
+ }
+
+ /**
+ * Gets the static instance of RestWebServiceClient; creates it if
+ * necessary. Synchronized to be thread safe.
+ *
+ * @return Static instance of RestWebServiceClient.
+ */
+ public static synchronized RestWebServiceClient getInstance() {
+ if (instance == null)
+ instance = new RestWebServiceClient();
+ return instance;
+ }
+
+ /**
+ * Convenience method that fetches the URL for the Portal REST API endpoint
+ * and the application UEB key, then calls
+ * {@link #get(String, String, String, String, String, String, String)} to
+ * access the Portal's REST endpoint.
+ *
+ * @param restPath
+ * Partial path of the endpoint; e.g., "/specialRestService"
+ * @param userId
+ * userId for the user originating the request
+ * @param appName
+ * Application Name for logging.
+ * @param requestId
+ * 128-bit UUID value to uniquely identify the transaction.
+ * @param appUserName
+ * REST API user name for Portal to authenticate the request
+ * @param appPassword
+ * REST API password (in the clear, not encrypted) for Portal to
+ * authenticate the request
+ * @return Content from REST endpoint
+ * @throws Exception
+ * on any failure
+ */
+ public String getPortalContent(String restPath, String userId, String appName, String requestId, String appUserName,
+ String appPassword) throws Exception {
+ String restURL = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REST_URL);
+ if (restURL == null) {
+ // should never happen
+ String msg = "getPortalContent: failed to get property " + PortalApiConstants.ECOMP_REST_URL;
+ logger.error(msg);
+ throw new Exception(msg);
+ }
+ String appUebKey = PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY);
+ if (appUebKey == null) {
+ // should never happen
+ String msg = "getPortalContent: failed to get property " + PortalApiConstants.UEB_APP_KEY;
+ logger.error(msg);
+ throw new Exception(msg);
+ }
+ final String restEndpointUrl = restURL + restPath;
+ return get(restEndpointUrl, userId, appName, requestId, appUebKey, appUserName, appPassword);
+
+ }
+
+ /**
+ * Makes a call to a Portal REST API using the specified URL and parameters.
+ *
+ * @param url
+ * Complete URL of the REST endpoint.
+ * @param loginId
+ * User that it should be fetching the data
+ * @param appName
+ * Application name for logging; if null or empty, defaulted to
+ * Unknown.
+ * @param requestId
+ * 128-bit UUID value to uniquely identify the transaction; if
+ * null or empty, one is generated.
+ * @param appUebKey
+ * Unique key for the application, used by Portal to authenticate
+ * the request
+ * @param appUserName
+ * REST API user name, used by Portal to authenticate the request
+ * @param appPassword
+ * REST API password, used by Portal to authenticate the request
+ * @return Content from REST endpoint
+ * @throws Exception
+ * On any failure; e.g., unknown host.
+ */
+ public String get(String url, String loginId, String appName, String requestId, String appUebKey,
+ String appUserName, String appPassword) throws Exception {
+
+ logger.debug("RestWebServiceClient.get (" + url + ") operation is started.");
+
+ if (appName == null || appName.trim().length() == 0)
+ appName = "Unknown";
+ if (requestId == null || requestId.trim().length() == 0)
+ requestId = UUID.randomUUID().toString();
+
+ URL obj = new URL(url);
+ // Create the connection object
+ HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+ con.setRequestMethod("GET");
+ con.setConnectTimeout(3000);
+ con.setReadTimeout(8000);
+
+ // add request header
+ con.setRequestProperty("uebkey", appUebKey);
+ con.setRequestProperty("username", appUserName);
+ con.setRequestProperty("password", appPassword);
+ con.setRequestProperty("LoginId", loginId);
+ con.setRequestProperty("user-agent", appName);
+ con.setRequestProperty("X-ECOMP-RequestID", requestId);
+
+ int responseCode = con.getResponseCode();
+ logger.debug("get: received response code '" + responseCode + "' while getting the '" + url + "' for user: "
+ + loginId);
+
+ StringBuffer sb = new StringBuffer();
+ BufferedReader in = null;
+ try {
+ in = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
+ String inputLine = null;
+ while ((inputLine = in.readLine()) != null)
+ sb.append(inputLine);
+ } finally {
+ try {
+ if (in != null)
+ in.close();
+ } catch (IOException ex) {
+ logger.error("get: failed to close reader", ex);
+ }
+ }
+
+ final String response = sb.toString();
+ if (logger.isDebugEnabled())
+ logger.debug("get: url " + url + " yielded " + response);
+ return response;
+ }
+
+ /**
+ * Convenience method that fetches the URL for the Portal REST API endpoint
+ * and the application UEB key, then calls
+ * {@link #post(String, String, String, String, String, String, String, String, String)}
+ * to access the Portal's REST endpoint.
+ *
+ * @param restPath
+ * Partial path of the endpoint; e.g., "/specialRestService"
+ * @param userId
+ * ID for the user originating the request
+ * @param appName
+ * Application Name for logging.
+ * @param requestId
+ * 128-bit UUID value to uniquely identify the transaction.
+ * @param appUserName
+ * REST API user name for Portal to authenticate the request;
+ * ignored if null
+ * @param appPassword
+ * REST API password (in the clear, not encrypted) for Portal to
+ * authenticate the request; ignored if null
+ * @param contentType
+ * content type for header
+ * @param content
+ * String to post
+ * @return Content from REST endpoint
+ * @throws Exception
+ * on any failure
+ */
+ public String postPortalContent(String restPath, String userId, String appName, String requestId,
+ String appUserName, String appPassword, String contentType, String content) throws Exception {
+ String restURL = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REST_URL);
+ if (restURL == null) {
+ // should never happen
+ String msg = "getPortalContent: failed to get property " + PortalApiConstants.ECOMP_REST_URL;
+ logger.error(msg);
+ throw new Exception(msg);
+ }
+ String appUebKey = PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY);
+ if (appUebKey == null) {
+ // should never happen
+ String msg = "getPortalContent: failed to get property " + PortalApiConstants.UEB_APP_KEY;
+ logger.error(msg);
+ throw new Exception(msg);
+ }
+ final String separator = restURL.endsWith("/") || restPath.startsWith("/") ? "" : "/";
+ final String restEndpointUrl = restURL + separator + restPath;
+ return post(restEndpointUrl, userId, appName, requestId, appUebKey, appUserName, appPassword, contentType,
+ content);
+ }
+
+ /**
+ * Makes a POST call to a Portal REST API using the specified URL and
+ * parameters.
+ *
+ * @param url
+ * Complete URL of the REST endpoint.
+ * @param loginId
+ * User who is fetching the data
+ * @param appName
+ * Application name for logging; if null or empty, defaulted to
+ * Unknown.
+ * @param requestId
+ * 128-bit UUID value to uniquely identify the transaction; if
+ * null or empty, one is generated.
+ * @param appUebKey
+ * Unique key for the application, used by Portal to authenticate
+ * the request
+ * @param appUserName
+ * REST API user name used by Portal to authenticate the request;
+ * ignored if null
+ * @param appPassword
+ * REST API password used by Portal to authenticate the request;
+ * ignored if null
+ * @param contentType
+ * MIME header
+ * @param content
+ * Content to POST
+ * @return Any content read from the endpoint
+ * @throws Exception
+ * On any error
+ */
+ public String post(String url, String loginId, String appName, String requestId, String appUebKey,
+ String appUserName, String appPassword, String contentType, String content) throws Exception {
+
+ if (logger.isDebugEnabled())
+ logger.debug("RestWebServiceClient.post to URL " + url);
+ if (appName == null || appName.trim().length() == 0)
+ appName = "Unknown";
+ if (requestId == null || requestId.trim().length() == 0)
+ requestId = UUID.randomUUID().toString();
+
+ URL obj = new URL(url);
+ // Create the connection object
+ HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+ con.setRequestMethod("POST");
+ con.setConnectTimeout(3000);
+ con.setReadTimeout(15000);
+
+ // add request header
+ con.setRequestProperty("uebkey", appUebKey);
+ if (appUserName != null)
+ con.setRequestProperty("username", appUserName);
+ if (appPassword != null)
+ con.setRequestProperty("password", appPassword);
+ con.setRequestProperty("LoginId", loginId);
+ con.setRequestProperty("user-agent", appName);
+ con.setRequestProperty("X-ECOMP-RequestID", requestId);
+ con.setRequestProperty("Content-Type", contentType);
+
+ con.setDoInput(true);
+ con.setDoOutput(true);
+ con.getOutputStream().write(content.getBytes());
+ con.getOutputStream().flush();
+ con.getOutputStream().close();
+
+ int responseCode = con.getResponseCode();
+ logger.debug("Response Code : " + responseCode);
+
+ StringBuffer sb = new StringBuffer();
+ InputStreamReader in = null;
+ char[] buf = new char[8196];
+ int bytes;
+ try {
+ in = new InputStreamReader(con.getInputStream(), "UTF-8");
+ while ((bytes = in.read(buf)) > 0)
+ sb.append(new String(buf, 0, bytes));
+ } finally {
+ try {
+ if (in != null)
+ in.close();
+ } catch (IOException ex) {
+ logger.warn("get: failed to close reader", ex);
+ }
+ }
+
+ return sb.toString();
+ }
+
+ /**
+ * Basic unit test for the client to call Portal app on localhost.
+ *
+ * @param args
+ * Ignored
+ * @throws Exception
+ */
+ public static void main(String[] args) throws Exception {
+ RestWebServiceClient client = RestWebServiceClient.getInstance();
+ final String getUrl = "http://www.ecomp.openecomp.org:8080/ecompportal/auxapi/analytics";
+ String get = client.get(getUrl, "userId", "appName", null, "appUebKey", "appUserName", "appPassword");
+ System.out.println("Get result:\n" + get);
+ final String postUrl = "http://www.ecomp.openecomp.org:8080/ecompportal/auxapi/storeAnalytics";
+ final String content = " { " + " \"action\" : \"test1\", " + " \"page\" : \"test2\", "
+ + " \"function\" : \"test3\", " + " \"userid\" : \"ab1234\" " + "}";
+ String post = client.post(postUrl, "userId", "appName", null, "appUebKey", "appUserName", "appPassword",
+ "application/json", content);
+ System.out.println("Post result:\n" + post);
+ }
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/CipherUtil.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/CipherUtil.java
new file mode 100644
index 00000000..e376cd4c
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/CipherUtil.java
@@ -0,0 +1,125 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+
+public class CipherUtil {
+
+ private final static String key = "AGLDdG4D04BKm2IxIWEr8o==!";
+
+ /**
+ * @param plainText
+ * @param secretKey
+ * @return encrypted version of plain text.
+ * @throws Exception
+ */
+ public static String encrypt(String plainText, String secretKey) throws Exception{
+ byte[] rawKey;
+ String encryptedString;
+ SecretKeySpec sKeySpec;
+ byte[] encryptText = plainText.getBytes("UTF-8");
+ Cipher cipher;
+ rawKey = Base64.decodeBase64(secretKey);
+ sKeySpec = new SecretKeySpec(rawKey, "AES");
+ cipher = Cipher.getInstance("AES");
+ cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
+ encryptedString = Base64.encodeBase64String(cipher.doFinal(encryptText));
+
+ return encryptedString;
+ }
+
+ /**
+ *
+ * @param plainText
+ * @return Encrypted Text
+ * @throws Exception
+ */
+ public static String encrypt(String plainText) throws Exception
+ {
+ return CipherUtil.encrypt(plainText,key);
+ }
+
+ /**
+ * @param encryptedText
+ * @param secretKey
+ * @return plain text version of encrypted text
+ * @throws Exception
+ */
+ public static String decrypt(String encryptedText, String secretKey) throws Exception {
+ Cipher cipher;
+ String encryptedString;
+ byte[] encryptText = null;
+ byte[] rawKey;
+ SecretKeySpec sKeySpec;
+
+ rawKey = Base64.decodeBase64(secretKey);
+ sKeySpec = new SecretKeySpec(rawKey, "AES");
+ encryptText = Base64.decodeBase64(encryptedText.getBytes("UTF-8"));
+ cipher = Cipher.getInstance("AES");
+ cipher.init(Cipher.DECRYPT_MODE, sKeySpec);
+ encryptedString = new String(cipher.doFinal(encryptText));
+
+ return encryptedString;
+ }
+
+ /**
+ * @param encryptedText
+ * @return Decrypted Text
+ * @throws Exception
+ */
+ public static String decrypt(String encryptedText) throws Exception
+ {
+ return CipherUtil.decrypt(encryptedText,key);
+ }
+
+
+ public static void main(String[] args) throws Exception {
+
+ String password = "Welcome123";
+ String encrypted;
+ String decrypted;
+
+ if (args.length != 2) {
+ System.out.println("Default password testing... ");
+ System.out.println("Plain password: " + password);
+ encrypted = encrypt(password);
+ System.out.println("Encrypted password: " + encrypted);
+ decrypted = decrypt(encrypted);
+ System.out.println("Decrypted password: " + decrypted);
+ } else {
+ String whatToDo = args[0];
+ if (whatToDo.equalsIgnoreCase("d")) {
+ encrypted = args[1];
+ System.out.println("Encrypted Text: " + encrypted);
+ decrypted = decrypt(encrypted);
+ System.out.println("Decrypted Text: " + decrypted);
+ } else {
+ decrypted = args[1];
+ System.out.println("Plain Text: " + decrypted);
+ encrypted = encrypt(decrypted);
+ System.out.println("Encrypted Text" + encrypted);
+ }
+ }
+ }
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiConstants.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiConstants.java
new file mode 100644
index 00000000..e706b7ec
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiConstants.java
@@ -0,0 +1,64 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.util;
+
+public interface PortalApiConstants {
+ public static final String API_PREFIX = "/api/v2";
+ public static final String PORTAL_JSESSION_ID = "PORTAL_JSESSION_ID";
+ public static final String PORTAL_JSESSION_BIND = "PORTAL_JSESSION_BIND";
+ public static final String ACTIVE_USERS_NAME = "activeUsers";
+
+ /** Portal service cookie name */
+ public static final String EP_SERVICE = "EPService";
+
+ public static final String GLOBAL_SESSION_MAX_IDLE_TIME = "global_session_max_idle_time";
+ public static final String PORTAL_SESSION_SLOT_CHECK = "portal_session_slot_check";
+ public static final String SESSION_PREVIOUS_ACCESS_TIME = "session_previous_access_time";
+ public static final String MAX_IDLE_TIME = "max.idle.time";
+
+ // Names of keys in the portal.properties file
+ public static final String PORTAL_API_IMPL_CLASS = "portal.api.impl.class";
+ public static final String ECOMP_REDIRECT_URL = "ecomp_redirect_url";
+ public static final String ECOMP_REST_URL = "ecomp_rest_url";
+ public static final String CSP_COOKIE_NAME = "csp_cookie_name";
+ public static final String CSP_GATE_KEEPER_PROD_KEY = "csp_gate_keeper_prod_key";
+
+ // UEB related
+ public static final String UEB_URL_LIST = "ueb_url_list"; // In properties file
+ public static final String ECOMP_PORTAL_INBOX_NAME = "ecomp_portal_inbox_name";
+ public static final String ECOMP_DEFAULT_MSG_ID = "0";
+ public static final String ECOMP_GENERAL_UEB_PARTITION = "EPGeneralPartition";
+ public static final String UEB_LISTENERS_ENABLE = "ueb_listeners_enable";
+ public static final String UEB_APP_INBOUND_MAILBOX_NAME = "ueb_app_mailbox_name";
+ public static final String UEB_APP_CONSUMER_GROUP_NAME = "ueb_app_consumer_group_name";
+ // UebManager generates a consumer group name for special token {UUID}
+ public static final String UEB_APP_CONSUMER_GROUP_NAME_GENERATOR = "{UUID}";
+ public static final String UEB_APP_KEY = "ueb_app_key";
+ public static final String UEB_APP_SECRET = "ueb_app_secret";
+ public static final String ECOMP_UEB_INVALID_MSG = "100: Invalid Message format.";
+ public static final String ECOMP_UEB_TIMEOUT_ERROR = "101: Timeout";
+ public static final String ECOMP_UEB_UNKNOWN_PUBLISH_ERROR = "102: Unknown error during publish";
+ public static final String ECOMP_UEB_UNKNOWN_CONSUME_ERROR = "103: Unknown error during consume";
+ public static final String USE_REST_FOR_FUNCTIONAL_MENU = "use_rest_for_functional_menu";
+
+ //encrpt key
+ public static final String Decryption_Key = "decryption_key";
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiProperties.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiProperties.java
new file mode 100644
index 00000000..93572ee9
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/PortalApiProperties.java
@@ -0,0 +1,102 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Singleton Class representing portal properties. Searches the classpath for
+ * the file "portal.properties".
+ *
+ * To put the file "portal.properties" on the classpath, it can be in the same
+ * directory where the first package folder is - 'myClasses' folder in the
+ * following case as an example:
+ *
+ */
+public class PortalApiProperties {
+
+ private static final Log logger = LogFactory.getLog(PortalApiProperties.class);
+
+ private static Properties properties;
+ private static String propertyFileName = "portal.properties";
+
+ /**
+ * Constructor is private.
+ */
+ private PortalApiProperties() {
+ }
+
+ /**
+ * Gets the property value for the specified key. If a value is found,
+ * leading and trailing space is trimmed.
+ *
+ * @param property
+ * @return Value for the named property; null if the property file was not
+ * loaded or the key was not found.
+ */
+ public static String getProperty(String property) {
+ if (properties == null) {
+ synchronized (propertyFileName) {
+ try {
+ if (!initialize()) {
+ logger.error("Failed to read property file " + propertyFileName);
+ return null;
+ }
+ } catch (IOException e) {
+ logger.error("Failed to read property file " + propertyFileName, e);
+ return null;
+ }
+ }
+ }
+ String value = properties.getProperty(property);
+ if (value != null)
+ value = value.trim();
+ return value;
+ }
+
+ /**
+ * Reads properties from a portal.properties file on the classpath.
+ *
+ * Clients do NOT need to call this method. Clients MAY call this method to
+ * test whether the properties file can be loaded successfully.
+ *
+ * @return True if properties were successfully loaded, else false.
+ * @throws IOException
+ */
+ public static boolean initialize() throws IOException {
+ if (properties != null)
+ return true;
+ InputStream in = PortalApiProperties.class.getClassLoader().getResourceAsStream(propertyFileName);
+ if (in == null)
+ return false;
+ properties = new Properties();
+ try {
+ properties.load(in);
+ } finally {
+ in.close();
+ }
+ return true;
+ }
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOFilter.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOFilter.java
new file mode 100644
index 00000000..1d8a9620
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOFilter.java
@@ -0,0 +1,75 @@
+/* ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.onboarding.util;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.openecomp.portalsdk.core.onboarding.crossapi.PortalRestAPIProxy;
+import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException;
+
+public class SSOFilter implements Filter {
+
+ private final Log logger = LogFactory.getLog(getClass());
+
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws java.io.IOException, ServletException {
+
+ try {
+ if (PortalRestAPIProxy.getPortalRestApiServiceImpl().getUserId((HttpServletRequest) request) == null) {
+ String redirectURL = SSOUtil.getECOMPSSORedirectURL(((HttpServletRequest) request),
+ ((HttpServletResponse) response),
+ (((HttpServletRequest) request).getRequestURI()
+ .substring(((HttpServletRequest) request).getContextPath().length() + 1)
+ + (((HttpServletRequest) request).getQueryString() != null
+ ? ("?" + ((HttpServletRequest) request).getQueryString()) : "")));
+
+ ((HttpServletResponse) response).sendRedirect(redirectURL);
+
+ } else {
+ // Pass request back down the filter chain
+ chain.doFilter(request, response);
+
+ }
+ } catch (PortalAPIException e) {
+ logger.error("Issue calling getUserId method ");
+ throw new ServletException(e);
+ }
+
+ }
+
+ public void destroy() {
+
+ }
+
+ public void init(FilterConfig arg0) throws ServletException {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java
new file mode 100644
index 00000000..67ac567d
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/onboarding/util/SSOUtil.java
@@ -0,0 +1,45 @@
+package org.openecomp.portalsdk.core.onboarding.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class SSOUtil {
+
+ private static final Log logger = LogFactory.getLog(SSOUtil.class);
+
+ /**
+ * Constructs a path for this server, this app's context, etc.
+ *
+ * @param request
+ * @param response
+ * @param forwardPath
+ * @return
+ */
+ public static String getECOMPSSORedirectURL(HttpServletRequest request, HttpServletResponse response,
+ String forwardPath) {
+ String appURL = (request.isSecure() ? "https://" : "http://") + request.getServerName() + ":"
+ + request.getServerPort() + request.getContextPath() + "/" + forwardPath;
+ String encodedAppURL = null;
+ try {
+ encodedAppURL = URLEncoder.encode(appURL, "UTF-8");
+ } catch (UnsupportedEncodingException ex) {
+ logger.error("getECOMPSSORedirectURL: Failed to encode app URL "
+ + appURL);
+ }
+ String portalURL = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL);
+ if (portalURL == null || portalURL.length() == 0) {
+ logger.error("getECOMPSSORedirectURL: Failed to get property " +
+ PortalApiConstants.ECOMP_REDIRECT_URL);
+ return null;
+ }
+ String redirectURL = portalURL + "?redirectUrl=" + encodedAppURL;
+ return redirectURL;
+ }
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompRole.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompRole.java
new file mode 100644
index 00000000..28b74a86
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompRole.java
@@ -0,0 +1,87 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.restful.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+/**
+ * This bean holds the information for a role in the role and user management
+ * REST API.
+ */
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EcompRole implements Comparable<EcompRole>{
+
+ protected Long id;
+ private String name;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ EcompRole other = (EcompRole) obj;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ String s = "@EcompRole[id: " + id + "; name: " + name + "]";
+ return s;
+ }
+
+ @Override
+ public int compareTo(EcompRole o) {
+ return this.id.compareTo(o.id);
+ }
+
+} \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompUser.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompUser.java
new file mode 100644
index 00000000..dde16df8
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/EcompUser.java
@@ -0,0 +1,197 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.restful.domain;
+
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+/**
+ * This bean holds the information for a user in the role and user management
+ * REST API.
+ */
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class EcompUser implements Comparable<EcompUser>{
+
+ private Long orgId;
+ private String managerId;
+ private String firstName;
+ private String middleInitial;
+ private String lastName;
+ private String phone;
+ private String email;
+ private String hrid;
+ private String orgUserId;
+ private String orgCode;
+ private String orgManagerUserId;
+ private String jobTitle;
+ private String loginId;
+ private boolean active;
+
+
+ private Set<EcompRole> roles;
+
+ public Long getOrgId() {
+ return orgId;
+ }
+
+ public void setOrgId(Long orgId) {
+ this.orgId = orgId;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getMiddleInitial() {
+ return middleInitial;
+ }
+
+ public void setMiddleInitial(String middleInitial) {
+ this.middleInitial = middleInitial;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getHrid() {
+ return hrid;
+ }
+
+ public void setHrid(String hrid) {
+ this.hrid = hrid;
+ }
+
+ public String getOrgUserId() {
+ return orgUserId;
+ }
+
+ public void setOrgUserId(String orgUserId) {
+ this.orgUserId = orgUserId;
+ }
+
+ public String getOrgCode() {
+ return orgCode;
+ }
+
+ public void setOrgCode(String orgCode) {
+ this.orgCode = orgCode;
+ }
+
+ public String getOrgManagerUserId() {
+ return orgManagerUserId;
+ }
+
+ public void setOrgManagerUserId(String orgManagerUserId) {
+ this.orgManagerUserId = orgManagerUserId;
+ }
+
+ public String getJobTitle() {
+ return jobTitle;
+ }
+
+ public void setJobTitle(String jobTitle) {
+ this.jobTitle = jobTitle;
+ }
+
+ public String getLoginId() {
+ return loginId;
+ }
+
+ public void setLoginId(String loginId) {
+ this.loginId = loginId;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public Set<EcompRole> getRoles() {
+ return roles;
+ }
+
+ public void setRoles(Set<EcompRole> roles) {
+ this.roles = roles;
+ }
+
+ public String getManagerId() {
+ return managerId;
+ }
+
+ public void setManagerId(String managerId) {
+ this.managerId = managerId;
+ }
+
+ @Override
+ public String toString() {
+ String s = "@EcompUser[orgId: " + orgId //
+ + ", firstName: " + firstName //
+ + ", mi: " + middleInitial //
+ + ", lastName: " + lastName //
+ + ", phone: " + phone //
+ + ", email: " + email //
+ + ", hrid: " + hrid //
+ + ", orgUserId: " + orgUserId //
+ + ", orgCode: " + orgCode //
+ + ", orgManagerUserId: " + orgManagerUserId //
+ + ", jobTitle: " + jobTitle //
+ + ", loginId: " + loginId //
+ + ", active:" + active //
+ + "]";
+ return s;
+ }
+
+ @Override
+ public int compareTo(EcompUser o) {
+ return this.loginId.compareTo(o.loginId);
+ }
+
+
+}
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/PortalTimeoutVO.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/PortalTimeoutVO.java
new file mode 100644
index 00000000..a8e100e5
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/PortalTimeoutVO.java
@@ -0,0 +1,63 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.restful.domain;
+
+public class PortalTimeoutVO implements Comparable<PortalTimeoutVO>{
+
+ private String jSessionId;
+ private Long sessionTimOutMilliSec;
+
+ public PortalTimeoutVO(){
+
+ }
+
+ public PortalTimeoutVO(String _jSessionId, Long _sessionTimOutMilliSec) {
+ setjSessionId(_jSessionId);
+ setSessionTimOutMilliSec(_sessionTimOutMilliSec);
+
+ }
+
+ public String getjSessionId() {
+ return jSessionId;
+ }
+
+ public void setjSessionId(String jSessionId) {
+ this.jSessionId = jSessionId;
+ }
+
+ public Long getSessionTimOutMilliSec() {
+ return sessionTimOutMilliSec;
+ }
+
+ public void setSessionTimOutMilliSec(Long sessionTimOutMilliSec) {
+ this.sessionTimOutMilliSec = sessionTimOutMilliSec;
+ }
+
+ @Override
+ public int compareTo(PortalTimeoutVO o) {
+ return sessionTimOutMilliSec.compareTo(o.sessionTimOutMilliSec);
+ }
+
+
+
+
+
+
+} \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/SharedContext.java b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/SharedContext.java
new file mode 100644
index 00000000..80ed4859
--- /dev/null
+++ b/ecomp-sdk/epsdk-fw/src/main/java/org/openecomp/portalsdk/core/restful/domain/SharedContext.java
@@ -0,0 +1,300 @@
+/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed 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.openecomp.portalsdk.core.restful.domain;
+
+/**
+ * Bean that represents shared-context data transferred in JSON objects. This is
+ * a minimum example:
+ *
+ * <PRE>
+ * {
+ * "context_id": "abc123",
+ * "ckey": "myKey",
+ * "cvalue": "my context value to share"
+ * }
+ * </PRE>
+ */
+public class SharedContext {
+
+ // Response field indicates nothing else is present
+ private String response;
+ // Required fields when data is present
+ private String context_id, ckey, cvalue;
+ private Long id, create_time;
+ // Additional database fields from the DomainVO object.
+ private String created, modified, createdId, modifiedId, auditUserId, auditTrail, rowNum;
+
+ /**
+ * Gets the response field.
+ *
+ * @return response
+ */
+ public String getResponse() {
+ return response;
+ }
+
+ /**
+ * Sets the response field.
+ *
+ * @param response
+ * The response to set
+ */
+ public void setResponse(final String response) {
+ this.response = response;
+ }
+
+ /**
+ * Gets the database row ID.
+ *
+ * @return Database row ID
+ */
+ public Long getId() {
+ return id;
+ }
+
+ /**
+ * Sets the database row ID.
+ *
+ * @param id
+ */
+ public void setId(final Long id) {
+ this.id = id;
+ }
+
+ /**
+ * Gets the creation time
+ *
+ * @return Creation time as a Long
+ */
+ public Long getCreate_time() {
+ return create_time;
+ }
+
+ /**
+ * Sets the creation time
+ *
+ * @param create_time
+ */
+ public void setCreate_time(final Long create_time) {
+ this.create_time = create_time;
+ }
+
+ /**
+ * Gets the context ID
+ *
+ * @return Context ID
+ */
+ public String getContext_id() {
+ return context_id;
+ }
+
+ /**
+ * Sets the context ID
+ *
+ * @param context_id
+ */
+ public void setContext_id(final String context_id) {
+ this.context_id = context_id;
+ }
+
+ /**
+ * Gets the key of the key-value pair. Called ckey because "key" is a
+ * reserved word in Mysql.
+ *
+ * @return The key
+ */
+ public String getCkey() {
+ return ckey;
+ }
+
+ /**
+ * Sets the key of the key-value pair.
+ *
+ * @param ckey
+ */
+ public void setCkey(final String ckey) {
+ this.ckey = ckey;
+ }
+
+ /**
+ * Gets the value of the key-value pair. Called cvalue because "value" is a
+ * reserved word in Mysql.
+ *
+ * @return Value of the key-value pair.
+ */
+ public String getCvalue() {
+ return cvalue;
+ }
+
+ /**
+ * Sets the value of the key-value pair.
+ *
+ * @param cvalue
+ */
+ public void setCvalue(final String cvalue) {
+ this.cvalue = cvalue;
+ }
+
+ /**
+ * Gets the created value.
+ *
+ * @return Created info from database
+ */
+ public String getCreated() {
+ return created;
+ }
+
+ /**
+ * Sets the created value.
+ *
+ * @param created
+ */
+ public void setCreated(String created) {
+ this.created = created;
+ }
+
+ /**
+ * Gets the modified value.
+ *
+ * @return Modified info from database
+ */
+ public String getModified() {
+ return modified;
+ }
+
+ /**
+ * Sets the modified value.
+ *
+ * @param modified
+ */
+ public void setModified(String modified) {
+ this.modified = modified;
+ }
+
+ /**
+ * Gets the createdId value.
+ *
+ * @return CreatedId info from database
+ */
+ public String getCreatedId() {
+ return createdId;
+ }
+
+ /**
+ * Sets the createdId value.
+ *
+ * @param createdId
+ */
+ public void setCreatedId(String createdId) {
+ this.createdId = createdId;
+ }
+
+ /**
+ * Gets the modifiedId value.
+ *
+ * @return ModifiedId info from database
+ */
+ public String getModifiedId() {
+ return modifiedId;
+ }
+
+ /**
+ * Sets the modifiedId value.
+ *
+ * @param modifiedId
+ */
+ public void setModifiedId(String modifiedId) {
+ this.modifiedId = modifiedId;
+ }
+
+ /**
+ * Gets the audit user ID value.
+ *
+ * @return AuditUserId from database
+ */
+ public String getAuditUserId() {
+ return auditUserId;
+ }
+
+ /**
+ * Sets the audit user ID value.
+ *
+ * @param auditUserId
+ */
+ public void setAuditUserId(String auditUserId) {
+ this.auditUserId = auditUserId;
+ }
+
+ /**
+ * Gets the audit trail value.
+ *
+ * @return AuditTrail from database.
+ */
+ public String getAuditTrail() {
+ return auditTrail;
+ }
+
+ /**
+ * Sets the audit trail value.
+ *
+ * @param auditTrail
+ */
+ public void setAuditTrail(String auditTrail) {
+ this.auditTrail = auditTrail;
+ }
+
+ /**
+ * Gets the row num value.
+ *
+ * @return rowNum from database.
+ */
+ public String getRowNum() {
+ return rowNum;
+ }
+
+ /**
+ * Sets the row num value.
+ *
+ * @param rowNum
+ */
+ public void setRowNum(String rowNum) {
+ this.rowNum = rowNum;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ SharedContext other = (SharedContext) obj;
+ return this.id == other.id && this.context_id.equals(other.context_id) && this.ckey.equals(other.ckey)
+ && this.cvalue.equals(other.cvalue);
+ }
+
+ @Override
+ public int hashCode() {
+ return (int) (id + context_id.hashCode() + ckey.hashCode() + cvalue.hashCode());
+ }
+
+ @Override
+ public String toString() {
+ String s = "@SharedContext[id: " + id + "; context_id: " + context_id + "; ckey: " + ckey + "; cvalue: "
+ + cvalue + "]";
+ return s;
+ }
+
+} \ No newline at end of file