aboutsummaryrefslogtreecommitdiffstats
path: root/dcae_dmaapbc_webapp/dbca-common
diff options
context:
space:
mode:
Diffstat (limited to 'dcae_dmaapbc_webapp/dbca-common')
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/.gitignore6
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/README.md7
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/db-scripts/dbca-ddl-mysql-1707-common.sql918
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/db-scripts/readme.md4
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/pom.xml218
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/DmaapBcRestClient.java1495
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/HttpStatusAndResponse.java66
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/IRestClientConstants.java34
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/SimpleRestClientBase.java291
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataBusHomeController.java35
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataRouterController.java321
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java968
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DmaapAccessController.java356
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/HealthCheckController.java142
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/MessageRouterController.java207
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/DmaapAccess.java152
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/ManifestTransportModel.java32
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java182
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java42
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java46
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessService.java63
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java97
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/util/DbcappProperties.java71
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java87
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java96
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java152
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java96
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java141
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java70
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java65
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java193
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java110
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java108
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java144
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/model/Result.java18
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java13
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java37
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java116
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/SanityTest.java20
-rw-r--r--dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java37
40 files changed, 7256 insertions, 0 deletions
diff --git a/dcae_dmaapbc_webapp/dbca-common/.gitignore b/dcae_dmaapbc_webapp/dbca-common/.gitignore
new file mode 100644
index 0000000..0a897e3
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/.gitignore
@@ -0,0 +1,6 @@
+.classpath
+.project
+.settings/
+/bin/
+/target/
+/catalina.base_IS_UNDEFINED/
diff --git a/dcae_dmaapbc_webapp/dbca-common/README.md b/dcae_dmaapbc_webapp/dbca-common/README.md
new file mode 100644
index 0000000..af44f85
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/README.md
@@ -0,0 +1,7 @@
+# DCAE DMaaP Bus Controller Web Application
+
+## Java Common Project
+
+This is the maven project with the DMaaP Bus Controller web application common
+Java files. This project contains classes used by both the closed-source and
+the open-source versions of the application.
diff --git a/dcae_dmaapbc_webapp/dbca-common/db-scripts/dbca-ddl-mysql-1707-common.sql b/dcae_dmaapbc_webapp/dbca-common/db-scripts/dbca-ddl-mysql-1707-common.sql
new file mode 100644
index 0000000..b0d5159
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/db-scripts/dbca-ddl-mysql-1707-common.sql
@@ -0,0 +1,918 @@
+-- ---------------------------------------------------------------------------------------------------------------
+-- This script creates tables for the DMaaP Bus Controller Application
+-- in the 1707 release, same tables for both internal and external use.
+--
+-- This file is suitable for deployment to Application Hosting in 1704 and later:
+-- 1. This file does NOT name the database; i.e., no statements like this:
+-- "use foo;"
+-- 2. This file uses "--" not NOT "/* */" comment notation; i.e., no statements from mysqldump like this:
+-- /*!40101 SET character_set_client = utf8 */;
+--
+-- Note to : Database Admin, set the MySQL system variable called lower_case_table_names
+--
+-- It can be set 3 different ways:
+-- command-line options (Cmd-line),
+-- options valid in configuration files (Option file), or
+-- server system variables (System Var).
+--
+-- It needs to be set to 1, then table names are stored in lowercase on disk and comparisons are not case sensitive.
+--
+-- MySql/MariaDB Version compatibility information
+-- $ mysql --version
+-- mysql Ver 15.1 Distrib 5.5.35-MariaDB, for Linux (x86_64) using readline 5.1
+--
+-- bash-4.2$ mysql --version – cluster version
+-- mysql Ver 15.1 Distrib 10.1.13-MariaDB, for Linux (x86_64) using readline 5.1
+--
+-- All versions newer or older than these DO NOT necessarily mean they are compatible.
+-- ------------------------------------------------------------------------------------------------------------------
+
+SET FOREIGN_KEY_CHECKS=1;
+
+--
+-- NAME: FN_LU_TIMEZONE; TYPE: TABLE
+--
+create table fn_lu_timezone (
+ TIMEZONE_ID INT(11) NOT NULL,
+ TIMEZONE_NAME CHARACTER VARYING(100) NOT NULL,
+ TIMEZONE_VALUE CHARACTER VARYING(100) NOT NULL
+);
+
+create table fn_user (
+ USER_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ ORG_ID INT(11),
+ MANAGER_ID INT(11),
+ FIRST_NAME CHARACTER VARYING(25),
+ MIDDLE_NAME CHARACTER VARYING(25),
+ LAST_NAME CHARACTER VARYING(25),
+ PHONE CHARACTER VARYING(25),
+ FAX CHARACTER VARYING(25),
+ CELLULAR CHARACTER VARYING(25),
+ EMAIL CHARACTER VARYING(50),
+ ADDRESS_ID NUMERIC(11,0),
+ ALERT_METHOD_CD CHARACTER VARYING(10),
+ HRID CHARACTER VARYING(20),
+ ORG_USER_ID CHARACTER VARYING(20),
+ ORG_CODE CHARACTER VARYING(30),
+ LOGIN_ID CHARACTER VARYING(25),
+ LOGIN_PWD CHARACTER VARYING(25),
+ LAST_LOGIN_DATE TIMESTAMP,
+-- LAST_LOGIN_DATE TIMESTAMP WITHOUT TIME ZONE,
+ ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL,
+-- ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y'::CHARACTER VARYING NOT NULL,
+ CREATED_ID INT(11),
+ CREATED_DATE TIMESTAMP DEFAULT NOW(),
+-- CREATED_DATE TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
+ MODIFIED_ID INT(11),
+ MODIFIED_DATE TIMESTAMP default now(),
+-- MODIFIED_DATE TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
+ IS_INTERNAL_YN CHARACTER(1) DEFAULT 'N' NOT NULL,
+-- IS_INTERNAL_YN CHARACTER(1) DEFAULT 'N'::BPCHAR NOT NULL,
+ ADDRESS_LINE_1 CHARACTER VARYING(100),
+ ADDRESS_LINE_2 CHARACTER VARYING(100),
+ CITY CHARACTER VARYING(50),
+ STATE_CD CHARACTER VARYING(3),
+ ZIP_CODE CHARACTER VARYING(11),
+ COUNTRY_CD CHARACTER VARYING(3),
+ LOCATION_CLLI CHARACTER VARYING(8),
+ ORG_MANAGER_USERID CHARACTER VARYING(6),
+ COMPANY CHARACTER VARYING(100),
+ DEPARTMENT_NAME CHARACTER VARYING(100),
+ JOB_TITLE CHARACTER VARYING(100),
+ TIMEZONE INT(11),
+ DEPARTMENT CHARACTER VARYING(25),
+ BUSINESS_UNIT CHARACTER VARYING(25),
+ BUSINESS_UNIT_NAME CHARACTER VARYING(100),
+ COST_CENTER CHARACTER VARYING(25),
+ FIN_LOC_CODE CHARACTER VARYING(10),
+ SILO_STATUS CHARACTER VARYING(10)
+);
+
+--
+-- NAME: FN_ROLE; TYPE: TABLE
+--
+create table fn_role (
+ ROLE_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ ROLE_NAME CHARACTER VARYING(50) NOT NULL,
+ ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL,
+-- ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y'::CHARACTER VARYING NOT NULL,
+ PRIORITY NUMERIC(4,0)
+);
+
+--
+-- NAME: FN_APP_MME_CPU; TYPE: TABLE
+--
+create table fn_app_mme_cpu (
+ MME CHARACTER VARYING(200),
+ YEARMONTH INTEGER,
+ SCTP_CPU INTEGER,
+ AP_CPU INTEGER,
+ DP_CPU INTEGER,
+ ROUTER_CPU INTEGER,
+ PEB_CPU INTEGER,
+ SAU INTEGER
+);
+
+--
+-- NAME: FN_AUDIT_ACTION; TYPE: TABLE
+--
+create table fn_audit_action (
+ AUDIT_ACTION_ID INTEGER NOT NULL,
+ CLASS_NAME CHARACTER VARYING(500) NOT NULL,
+ METHOD_NAME CHARACTER VARYING(50) NOT NULL,
+ AUDIT_ACTION_CD CHARACTER VARYING(20) NOT NULL,
+ AUDIT_ACTION_DESC CHARACTER VARYING(200),
+ ACTIVE_YN CHARACTER VARYING(1)
+);
+
+--
+-- NAME: FN_AUDIT_ACTION_LOG; TYPE: TABLE
+--
+create table fn_audit_action_log (
+ AUDIT_LOG_ID INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ AUDIT_ACTION_CD CHARACTER VARYING(200),
+ ACTION_TIME TIMESTAMP,
+-- ACTION_TIME TIMESTAMP WITHOUT TIME ZONE,
+ USER_ID NUMERIC(11,0),
+ CLASS_NAME CHARACTER VARYING(100),
+ METHOD_NAME CHARACTER VARYING(50),
+ SUCCESS_MSG CHARACTER VARYING(20),
+ ERROR_MSG CHARACTER VARYING(500)
+);
+
+--
+-- NAME: FN_LU_ACTIVITY; TYPE: TABLE
+--
+create table fn_lu_activity (
+ ACTIVITY_CD CHARACTER VARYING(50) NOT NULL PRIMARY KEY,
+ ACTIVITY CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_AUDIT_LOG; TYPE: TABLE
+--
+create table fn_audit_log (
+ LOG_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ USER_ID INT(11) NOT NULL,
+ ACTIVITY_CD CHARACTER VARYING(50) NOT NULL,
+ AUDIT_DATE TIMESTAMP DEFAULT NOW() NOT NULL,
+-- AUDIT_DATE TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW() NOT NULL,
+ COMMENTS CHARACTER VARYING(1000),
+ AFFECTED_RECORD_ID_BK CHARACTER VARYING(500),
+ AFFECTED_RECORD_ID CHARACTER VARYING(4000),
+ CONSTRAINT FK_FN_AUDIT_REF_209_FN_USER FOREIGN KEY (USER_ID) REFERENCES FN_USER(USER_ID)
+);
+
+--
+-- NAME: FN_BROADCAST_MESSAGE; TYPE: TABLE
+--
+create table fn_broadcast_message (
+ MESSAGE_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ MESSAGE_TEXT CHARACTER VARYING(1000) NOT NULL,
+ MESSAGE_LOCATION_ID NUMERIC(11,0) NOT NULL,
+ BROADCAST_START_DATE TIMESTAMP NOT NULL DEFAULT NOW(),
+-- BROADCAST_START_DATE TIMESTAMP WITHOUT TIME ZONE NOT NULL,
+ BROADCAST_END_DATE TIMESTAMP NOT NULL DEFAULT NOW(),
+-- BROADCAST_END_DATE TIMESTAMP WITHOUT TIME ZONE NOT NULL,
+ ACTIVE_YN CHARACTER(1) DEFAULT 'Y' NOT NULL,
+-- ACTIVE_YN CHARACTER(1) DEFAULT 'Y'::BPCHAR NOT NULL,
+ SORT_ORDER NUMERIC(4,0) NOT NULL,
+ BROADCAST_SITE_CD CHARACTER VARYING(50)
+);
+
+--
+-- NAME: FN_CHAT_LOGS; TYPE: TABLE
+--
+create table fn_chat_logs (
+ CHAT_LOG_ID INTEGER NOT NULL,
+ CHAT_ROOM_ID INTEGER,
+ USER_ID INTEGER,
+ MESSAGE CHARACTER VARYING(1000),
+ MESSAGE_DATE_TIME TIMESTAMP
+-- MESSAGE_DATE_TIME TIMESTAMP WITHOUT TIME ZONE
+);
+
+--
+-- NAME: FN_CHAT_ROOM; TYPE: TABLE
+--
+create table fn_chat_room (
+ CHAT_ROOM_ID INTEGER NOT NULL,
+ NAME CHARACTER VARYING(50) NOT NULL,
+ DESCRIPTION CHARACTER VARYING(500),
+ OWNER_ID INTEGER,
+ CREATED_DATE TIMESTAMP DEFAULT NOW(),
+-- CREATED_DATE TIMESTAMP WITHOUT TIME ZONE,
+ UPDATED_DATE TIMESTAMP DEFAULT NOW()
+-- UPDATED_DATE TIMESTAMP WITHOUT TIME ZONE
+);
+
+--
+-- NAME: FN_CHAT_USERS; TYPE: TABLE
+--
+create table fn_chat_users (
+ CHAT_ROOM_ID INTEGER,
+ USER_ID INTEGER,
+ LAST_ACTIVITY_DATE_TIME TIMESTAMP,
+-- LAST_ACTIVITY_DATE_TIME TIMESTAMP WITHOUT TIME ZONE,
+ CHAT_STATUS CHARACTER VARYING(20),
+ ID INTEGER NOT NULL
+);
+
+--
+-- NAME: FN_DATASOURCE; TYPE: TABLE
+--
+create table fn_datasource (
+ ID INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ NAME CHARACTER VARYING(50),
+ DRIVER_NAME CHARACTER VARYING(256),
+ SERVER CHARACTER VARYING(256),
+ PORT INTEGER,
+ USER_NAME CHARACTER VARYING(256),
+ PASSWORD CHARACTER VARYING(256),
+ URL CHARACTER VARYING(256),
+ MIN_POOL_SIZE INTEGER,
+ MAX_POOL_SIZE INTEGER,
+ ADAPTER_ID INTEGER,
+ DS_TYPE CHARACTER VARYING(20)
+);
+
+--
+-- NAME: FN_FUNCTION; TYPE: TABLE
+--
+create table fn_function (
+ FUNCTION_CD CHARACTER VARYING(30) NOT NULL PRIMARY KEY,
+ FUNCTION_NAME CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_LU_ALERT_METHOD; TYPE: TABLE
+--
+create table fn_lu_alert_method (
+ ALERT_METHOD_CD CHARACTER VARYING(10) NOT NULL,
+ ALERT_METHOD CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_LU_BROADCAST_SITE; TYPE: TABLE
+--
+create table fn_lu_broadcast_site (
+ BROADCAST_SITE_CD CHARACTER VARYING(50) NOT NULL,
+ BROADCAST_SITE_DESCR CHARACTER VARYING(100)
+);
+
+--
+-- NAME: FN_LU_CALL_TIMES; TYPE: TABLE
+--
+create table fn_lu_call_times (
+ CALL_TIME_ID NUMERIC(10,0) NOT NULL,
+ CALL_TIME_AMOUNT NUMERIC(10,0) NOT NULL,
+ CALL_TIME_DISPLAY CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_LU_CITY; TYPE: TABLE
+--
+create table fn_lu_city (
+ CITY_CD CHARACTER VARYING(2) NOT NULL,
+ CITY CHARACTER VARYING(100) NOT NULL,
+ STATE_CD CHARACTER VARYING(2) NOT NULL
+);
+
+--
+-- NAME: FN_LU_COUNTRY; TYPE: TABLE
+--
+create table fn_lu_country (
+ COUNTRY_CD CHARACTER VARYING(3) NOT NULL,
+ COUNTRY CHARACTER VARYING(100) NOT NULL,
+ FULL_NAME CHARACTER VARYING(100),
+ WEBPHONE_COUNTRY_LABEL CHARACTER VARYING(30)
+);
+
+--
+-- NAME: FN_LU_MENU_SET; TYPE: TABLE
+--
+create table fn_lu_menu_set (
+ MENU_SET_CD CHARACTER VARYING(10) NOT NULL PRIMARY KEY,
+ MENU_SET_NAME CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_LU_PRIORITY; TYPE: TABLE
+--
+create table fn_lu_priority (
+ PRIORITY_ID NUMERIC(11,0) NOT NULL,
+ PRIORITY CHARACTER VARYING(50) NOT NULL,
+ ACTIVE_YN CHARACTER(1) NOT NULL,
+ SORT_ORDER NUMERIC(5,0)
+);
+
+--
+-- NAME: FN_LU_ROLE_TYPE; TYPE: TABLE
+--
+create table fn_lu_role_type (
+ ROLE_TYPE_ID NUMERIC(11,0) NOT NULL,
+ ROLE_TYPE CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_LU_STATE; TYPE: TABLE
+--
+create table fn_lu_state (
+ STATE_CD CHARACTER VARYING(2) NOT NULL,
+ STATE CHARACTER VARYING(100) NOT NULL
+);
+
+--
+-- NAME: FN_LU_TAB_SET; TYPE: TABLE
+--
+create table fn_lu_tab_set (
+ TAB_SET_CD CHARACTER VARYING(30) NOT NULL,
+ TAB_SET_NAME CHARACTER VARYING(50) NOT NULL
+);
+
+--
+-- NAME: FN_MENU; TYPE: TABLE
+--
+create table fn_menu (
+ MENU_ID INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ LABEL CHARACTER VARYING(100),
+ PARENT_ID INT(11),
+ SORT_ORDER NUMERIC(4,0),
+ ACTION CHARACTER VARYING(200),
+ FUNCTION_CD CHARACTER VARYING(30),
+ ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y' NOT NULL,
+-- ACTIVE_YN CHARACTER VARYING(1) DEFAULT 'Y'::CHARACTER VARYING NOT NULL,
+ SERVLET CHARACTER VARYING(50),
+ QUERY_STRING CHARACTER VARYING(200),
+ EXTERNAL_URL CHARACTER VARYING(200),
+ TARGET CHARACTER VARYING(25),
+ MENU_SET_CD CHARACTER VARYING(10) DEFAULT 'APP',
+-- MENU_SET_CD CHARACTER VARYING(10) DEFAULT 'APP'::CHARACTER VARYING,
+ SEPARATOR_YN CHARACTER(1) DEFAULT 'N',
+-- SEPARATOR_YN CHARACTER(1) DEFAULT 'N'::BPCHAR,
+ IMAGE_SRC CHARACTER VARYING(100),
+ CONSTRAINT FK_FN_MENU_REF_196_FN_MENU FOREIGN KEY (PARENT_ID) REFERENCES FN_MENU(MENU_ID),
+ CONSTRAINT FK_FN_MENU_MENU_SET_CD FOREIGN KEY (MENU_SET_CD) REFERENCES FN_LU_MENU_SET(MENU_SET_CD),
+ CONSTRAINT FK_FN_MENU_REF_223_FN_FUNCT FOREIGN KEY (FUNCTION_CD) REFERENCES FN_FUNCTION(FUNCTION_CD)
+);
+
+--
+-- NAME: FN_ORG; TYPE: TABLE
+--
+create table fn_org (
+ ORG_ID INT(11) NOT NULL,
+ ORG_NAME CHARACTER VARYING(50) NOT NULL,
+ ACCESS_CD CHARACTER VARYING(10)
+);
+
+--
+-- NAME: FN_RESTRICTED_URL; TYPE: TABLE
+--
+create table fn_restricted_url (
+ RESTRICTED_URL CHARACTER VARYING(250) NOT NULL,
+ FUNCTION_CD CHARACTER VARYING(30) NOT NULL
+);
+
+--
+-- NAME: FN_ROLE_COMPOSITE; TYPE: TABLE
+--
+create table fn_role_composite (
+ PARENT_ROLE_ID INT(11) NOT NULL,
+ CHILD_ROLE_ID INT(11) NOT NULL,
+ CONSTRAINT FK_FN_ROLE_COMPOSITE_CHILD FOREIGN KEY (CHILD_ROLE_ID) REFERENCES FN_ROLE(ROLE_ID),
+ CONSTRAINT FK_FN_ROLE_COMPOSITE_PARENT FOREIGN KEY (PARENT_ROLE_ID) REFERENCES FN_ROLE(ROLE_ID)
+);
+
+--
+-- NAME: FN_ROLE_FUNCTION; TYPE: TABLE
+--
+create table fn_role_function (
+ ROLE_ID INT(11) NOT NULL,
+ FUNCTION_CD CHARACTER VARYING(30) NOT NULL,
+ CONSTRAINT FK_FN_ROLE__REF_198_FN_ROLE FOREIGN KEY (ROLE_ID) REFERENCES FN_ROLE(ROLE_ID)
+);
+
+--
+-- NAME: FN_TAB; TYPE: TABLE
+--
+create table fn_tab (
+ TAB_CD CHARACTER VARYING(30) NOT NULL,
+ TAB_NAME CHARACTER VARYING(50) NOT NULL,
+ TAB_DESCR CHARACTER VARYING(100),
+ ACTION CHARACTER VARYING(100) NOT NULL,
+ FUNCTION_CD CHARACTER VARYING(30) NOT NULL,
+ ACTIVE_YN CHARACTER(1) NOT NULL,
+ SORT_ORDER NUMERIC(11,0) NOT NULL,
+ PARENT_TAB_CD CHARACTER VARYING(30),
+ TAB_SET_CD CHARACTER VARYING(30)
+);
+
+--
+-- NAME: FN_TAB_SELECTED; TYPE: TABLE
+--
+create table fn_tab_selected (
+ SELECTED_TAB_CD CHARACTER VARYING(30) NOT NULL,
+ TAB_URI CHARACTER VARYING(40) NOT NULL
+);
+
+--
+-- NAME: FN_USER_PSEUDO_ROLE; TYPE: TABLE
+--
+create table fn_user_pseudo_role (
+ PSEUDO_ROLE_ID INT(11) NOT NULL,
+ USER_ID INT(11) NOT NULL
+);
+
+--
+-- NAME: FN_USER_ROLE; TYPE: TABLE
+--
+create table fn_user_role (
+ USER_ID INT(10) NOT NULL,
+ ROLE_ID INT(10) NOT NULL,
+ PRIORITY NUMERIC(4,0),
+ APP_ID INT(11) DEFAULT 1,
+ CONSTRAINT FK_FN_USER__REF_172_FN_USER FOREIGN KEY (USER_ID) REFERENCES FN_USER(USER_ID),
+ CONSTRAINT FK_FN_USER__REF_175_FN_ROLE FOREIGN KEY (ROLE_ID) REFERENCES FN_ROLE(ROLE_ID)
+);
+
+--
+-- NAME: FN_XMLTYPE; TYPE: TABLE
+--
+create table fn_xmltype (
+ ID NUMERIC(10,0) NOT NULL,
+ XML_DOCUMENT TEXT
+);
+
+--
+-- NAME: SCHEMA_INFO; TYPE: TABLE
+--
+create table schema_info (
+ SCHEMA_ID CHARACTER VARYING(25) NOT NULL,
+ SCHEMA_DESC CHARACTER VARYING(75) NOT NULL,
+ DATASOURCE_TYPE CHARACTER VARYING(100),
+ CONNECTION_URL VARCHAR(200) NOT NULL,
+ USER_NAME VARCHAR(45) NOT NULL,
+ PASSWORD VARCHAR(45) NULL DEFAULT NULL,
+ DRIVER_CLASS VARCHAR(100) NOT NULL,
+ MIN_POOL_SIZE INT NOT NULL,
+ MAX_POOL_SIZE INT NOT NULL,
+ IDLE_CONNECTION_TEST_PERIOD INT NOT NULL
+
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_APP; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_app (
+ APP_ID int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
+ APP_NAME varchar(100) NOT NULL DEFAULT '?',
+ APP_IMAGE_URL varchar(256) DEFAULT NULL,
+ APP_DESCRIPTION varchar(512) DEFAULT NULL,
+ APP_NOTES varchar(4096) DEFAULT NULL,
+ APP_URL varchar(256) DEFAULT NULL,
+ APP_ALTERNATE_URL varchar(256) DEFAULT NULL,
+ APP_REST_ENDPOINT varchar(2000) DEFAULT NULL,
+ ML_APP_NAME varchar(50) NOT NULL DEFAULT '?',
+ ML_APP_ADMIN_ID varchar(7) NOT NULL DEFAULT '?',
+ MOTS_ID int(11) DEFAULT NULL,
+ APP_PASSWORD varchar(256) NOT NULL DEFAULT '?',
+ OPEN char(1) DEFAULT 'N',
+ ENABLED char(1) DEFAULT 'Y',
+ THUMBNAIL mediumblob,
+ APP_USERNAME varchar(50),
+ UEB_KEY VARCHAR(256) DEFAULT NULL,
+ UEB_SECRET VARCHAR(256) DEFAULT NULL,
+ UEB_TOPIC_NAME VARCHAR(256) DEFAULT NULL
+
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_FN_WORKFLOW; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_workflow (
+ id mediumint(9) NOT NULL AUTO_INCREMENT,
+ name varchar(20) NOT NULL,
+ description varchar(500) DEFAULT NULL,
+ run_link varchar(300) DEFAULT NULL,
+ suspend_link varchar(300) DEFAULT NULL,
+ modified_link varchar(300) DEFAULT NULL,
+ active_yn varchar(300) DEFAULT NULL,
+ created varchar(300) DEFAULT NULL,
+ created_by int(11) DEFAULT NULL,
+ modified varchar(300) DEFAULT NULL,
+ modified_by int(11) DEFAULT NULL,
+ workflow_key varchar(50) DEFAULT NULL,
+ PRIMARY KEY (id),
+ UNIQUE KEY name (name)
+);
+
+-- ----------------------------------------------------------
+-- NAME: FN_SCHEDULE_WORKFLOWS; TYPE: TABLE
+-- ----------------------------------------------------------
+create table fn_schedule_workflows (
+ id_schedule_workflows bigint(25) PRIMARY KEY NOT NULL AUTO_INCREMENT,
+ workflow_server_url varchar(45) DEFAULT NULL,
+ workflow_key varchar(45) NOT NULL,
+ workflow_arguments varchar(45) DEFAULT NULL,
+ startDateTimeCron varchar(45) DEFAULT NULL,
+ endDateTime TIMESTAMP DEFAULT NOW(),
+ start_date_time TIMESTAMP DEFAULT NOW(),
+ recurrence varchar(45) DEFAULT NULL
+ );
+
+--
+-- Name: fn_license; Type: TABLE
+--
+create table fn_license (
+ id numeric(11,0) NOT NULL,
+ app_id numeric(11,0) NOT NULL,
+ ip_address character varying(100) NOT NULL,
+ quantum_version_id numeric(11,0) NOT NULL,
+ created_date timestamp DEFAULT now(),
+ -- created_date timestamp without time zone DEFAULT now(),
+ modified_date timestamp DEFAULT now(),
+ -- modified_date timestamp without time zone DEFAULT now(),
+ created_id numeric(11,0),
+ modified_id numeric(11,0),
+ end_date timestamp default '2036-01-19 03:14:07'
+ -- end_date timestamp without time zone
+);
+
+--
+-- Name: fn_license_app; Type: TABLE
+--
+create table fn_license_app (
+ id numeric(11,0) NOT NULL,
+ app_name character varying(100) NOT NULL,
+ ctxt_name character varying(100)
+);
+
+--
+-- Name: fn_license_contact; Type: TABLE
+--
+create table fn_license_contact (
+ id integer NOT NULL,
+ license_id integer,
+ sbcid character varying(20)
+);
+
+--
+-- Name: fn_license_history; Type: TABLE
+--
+create table fn_license_history (
+ license_id numeric(11,0),
+ app_id numeric(11,0),
+ ip_address character varying(100),
+ quantum_version_id numeric(11,0),
+ created_date timestamp default now(),
+ -- created_date timestamp without time zone,
+ modified_date timestamp default now(),
+ -- modified_date timestamp without time zone,
+ created_id numeric(11,0),
+ modified_id numeric(11,0),
+ id numeric(11,0) NOT NULL
+);
+
+--
+-- Name: fn_license_version; Type: TABLE
+--
+create table fn_license_version (
+ id numeric(11,0) NOT NULL,
+ quantum_version character varying(25)
+);
+
+--
+-- Name: fn_lu_message_location; Type: TABLE
+--
+
+CREATE TABLE fn_lu_message_location (
+ message_location_id numeric(11,0) NOT NULL,
+ message_location_descr character varying(30) NOT NULL
+);
+
+--
+-- Name: fn_lu_message_location_MESSAGE_LOCATION_ID; Type: CONSTRAINT
+--
+
+ALTER TABLE fn_lu_message_location
+ ADD CONSTRAINT fn_lu_message_location_MESSAGE_LOCATION_ID PRIMARY KEY (message_location_id);
+
+-- ------------------ CREATE VIEW SECTION
+--
+-- NAME: V_URL_ACCESS; TYPE: VIEW
+--
+CREATE VIEW v_url_access AS
+ SELECT DISTINCT M.ACTION AS URL,
+ M.FUNCTION_CD
+ FROM FN_MENU M
+ WHERE (M.ACTION IS NOT NULL)
+UNION
+ SELECT DISTINCT T.ACTION AS URL,
+ T.FUNCTION_CD
+ FROM FN_TAB T
+ WHERE (T.ACTION IS NOT NULL)
+UNION
+ SELECT R.RESTRICTED_URL AS URL,
+ R.FUNCTION_CD
+ FROM FN_RESTRICTED_URL R;
+
+--
+-- NAME: FN_AUDIT_ACTION_AUDIT_ACTION_ID; TYPE: CONSTRAINT
+--
+alter table fn_audit_action
+ add constraint fn_audit_action_audit_action_id primary key (audit_action_id);
+--
+--
+-- NAME: FK_FN_AUDIT_REF_205_FN_LU_AC; TYPE: CONSTRAINT
+--
+alter table fn_audit_log
+ add constraint fk_fn_audit_ref_205_fn_lu_ac foreign key (activity_cd) references fn_lu_activity(activity_cd);
+--
+-- NAME: FK_FN_ROLE__REF_201_FN_FUNCT; TYPE: CONSTRAINT
+--
+alter table fn_role_function
+ add constraint fk_fn_role__ref_201_fn_funct foreign key (function_cd) references fn_function(function_cd);
+--
+-- NAME: FN_CHAT_LOGS_CHAT_LOG_ID; TYPE: CONSTRAINT
+--
+alter table fn_chat_logs
+ add constraint fn_chat_logs_chat_log_id primary key (chat_log_id);
+--
+-- NAME: FN_CHAT_ROOM_CHAT_ROOM_ID; TYPE: CONSTRAINT
+--
+alter table fn_chat_room
+ add constraint fn_chat_room_chat_room_id primary key (chat_room_id);
+--
+-- NAME: FN_CHAT_USERS_ID; TYPE: CONSTRAINT
+--
+alter table fn_chat_users
+ add constraint fn_chat_users_id primary key (id);
+--
+-- NAME: FN_LU_ALERT_METHOD_ALERT_METHOD_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_alert_method
+ add constraint fn_lu_alert_method_alert_method_cd primary key (alert_method_cd);
+--
+-- NAME: FN_LU_BROADCAST_SITE_BROADCAST_SITE_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_broadcast_site
+ add constraint fn_lu_broadcast_site_broadcast_site_cd primary key (broadcast_site_cd);
+--
+-- NAME: FN_LU_CALL_TIMES_CALL_TIME_ID; TYPE: CONSTRAINT
+--
+alter table fn_lu_call_times
+ add constraint fn_lu_call_times_call_time_id primary key (call_time_id);
+--
+-- NAME: FN_LU_CITY_CITY_CDSTATE_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_city
+ add constraint fn_lu_city_city_cdstate_cd primary key (city_cd, state_cd);
+--
+-- NAME: FN_LU_COUNTRY_COUNTRY_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_country
+ add constraint fn_lu_country_country_cd primary key (country_cd);
+--
+-- NAME: FN_LU_PRIORITY_PRIORITY_ID; TYPE: CONSTRAINT
+--
+alter table fn_lu_priority
+ add constraint fn_lu_priority_priority_id primary key (priority_id);
+--
+-- NAME: FN_LU_ROLE_TYPE_ROLE_TYPE_ID; TYPE: CONSTRAINT
+--
+alter table fn_lu_role_type
+ add constraint fn_lu_role_type_role_type_id primary key (role_type_id);
+--
+-- NAME: FN_LU_STATE_STATE_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_state
+ add constraint fn_lu_state_state_cd primary key (state_cd);
+--
+-- NAME: FN_LU_TAB_SET_TAB_SET_CD; TYPE: CONSTRAINT
+--
+alter table fn_lu_tab_set
+ add constraint fn_lu_tab_set_tab_set_cd primary key (tab_set_cd);
+--
+-- NAME: FN_LU_TIMEZONE_TIMEZONE_ID; TYPE: CONSTRAINT
+--
+alter table fn_lu_timezone
+ add constraint fn_lu_timezone_timezone_id primary key (timezone_id);
+--
+-- NAME: FN_ORG_ORG_ID; TYPE: CONSTRAINT
+--
+alter table fn_org
+ add constraint fn_org_org_id primary key (org_id);
+--
+-- NAME: FN_RESTRICTED_URL_RESTRICTED_URLFUNCTION_CD; TYPE: CONSTRAINT
+--
+alter table fn_restricted_url
+ add constraint fn_restricted_url_restricted_urlfunction_cd primary key (restricted_url, function_cd);
+--
+-- NAME: FN_ROLE_COMPOSITE_PARENT_ROLE_IDCHILD_ROLE_ID; TYPE: CONSTRAINT
+--
+alter table fn_role_composite
+ add constraint fn_role_composite_parent_role_idchild_role_id primary key (parent_role_id, child_role_id);
+--
+-- NAME: FN_ROLE_FUNCTION_ROLE_IDFUNCTION_CD; TYPE: CONSTRAINT
+--
+alter table fn_role_function
+ add constraint fn_role_function_role_idfunction_cd primary key (role_id, function_cd);
+--
+-- NAME: FN_TAB_TAB_CD; TYPE: CONSTRAINT
+--
+alter table fn_tab
+ add constraint fn_tab_tab_cd primary key (tab_cd);
+--
+-- NAME: FN_TAB_SELECTED_SELECTED_TAB_CDTAB_URI; TYPE: CONSTRAINT
+--
+alter table fn_tab_selected
+ add constraint fn_tab_selected_selected_tab_cdtab_uri primary key (selected_tab_cd, tab_uri);
+--
+-- NAME: FN_USER_PSEUDO_ROLE_PSEUDO_ROLE_IDUSER_ID; TYPE: CONSTRAINT
+--
+alter table fn_user_pseudo_role
+ add constraint fn_user_pseudo_role_pseudo_role_iduser_id primary key (pseudo_role_id, user_id);
+--
+-- NAME: FN_USER_ROLE_USER_IDROLE_ID; TYPE: CONSTRAINT
+--
+alter table fn_user_role
+ add constraint fn_user_role_user_idrole_id primary key (user_id, role_id, app_id);
+--
+-- Name: fn_license_ID; Type: CONSTRAINT
+--
+alter table fn_license
+ add constraint fn_license_id primary key (id);
+--
+-- Name: fn_license_contact_ID; Type: CONSTRAINT
+--
+alter table fn_license_contact
+ add constraint fn_license_contact_id primary key (id);
+--
+-- Name: fn_license_history_ID; Type: CONSTRAINT
+--
+alter table fn_license_history
+ add constraint fn_license_history_id primary key (id);
+--
+-- Name: fn_license_version_ID; Type: CONSTRAINT
+--
+alter table fn_license_version
+ add constraint fn_license_version_id primary key (id);
+
+--
+-- NAME: FN_AUDIT_LOG_ACTIVITY_CD; TYPE: INDEX
+--
+create index fn_audit_log_activity_cd using btree on fn_audit_log (activity_cd);
+--
+-- NAME: FN_AUDIT_LOG_USER_ID; TYPE: INDEX
+--
+create index fn_audit_log_user_id using btree on fn_audit_log (user_id);
+--
+-- NAME: FN_MENU_FUNCTION_CD; TYPE: INDEX
+--
+create index fn_menu_function_cd using btree on fn_menu (function_cd);
+--
+-- NAME: FN_ORG_ACCESS_CD; TYPE: INDEX
+--
+create index fn_org_access_cd using btree on fn_org (access_cd);
+--
+-- NAME: FN_ROLE_FUNCTION_FUNCTION_CD; TYPE: INDEX
+--
+create index fn_role_function_function_cd using btree on fn_role_function (function_cd);
+--
+-- NAME: FN_ROLE_FUNCTION_ROLE_ID; TYPE: INDEX
+--
+create index fn_role_function_role_id using btree on fn_role_function (role_id);
+--
+-- NAME: FN_USER_ADDRESS_ID; TYPE: INDEX
+--
+create index fn_user_address_id using btree on fn_user (address_id);
+--
+-- NAME: FN_USER_ALERT_METHOD_CD; TYPE: INDEX
+--
+create index fn_user_alert_method_cd using btree on fn_user (alert_method_cd);
+--
+-- NAME: FN_USER_HRID; TYPE: INDEX
+--
+create unique index fn_user_hrid using btree on fn_user (hrid);
+--
+-- NAME: FN_USER_LOGIN_ID; TYPE: INDEX
+--
+create unique index fn_user_login_id using btree on fn_user (login_id);
+--
+-- NAME: FN_USER_ORG_ID; TYPE: INDEX
+--
+create index fn_user_org_id using btree on fn_user (org_id);
+--
+-- NAME: FN_USER_ROLE_ROLE_ID; TYPE: INDEX
+--
+create index fn_user_role_role_id using btree on fn_user_role (role_id);
+--
+-- NAME: FN_USER_ROLE_USER_ID; TYPE: INDEX
+--
+create index fn_user_role_user_id using btree on fn_user_role (user_id);
+--
+-- NAME: FN_XMLTYPE_ID; TYPE: INDEX
+--
+create unique index fn_xmltype_id using btree on fn_xmltype (id);
+--
+-- NAME: FK_FN_USER__REF_178_FN_APP_idx; TYPE: INDEX
+--
+create index fk_fn_user__ref_178_fn_app_IDX on fn_user_role (app_id);
+--
+-- Name: fn_license_app_ID; Type: INDEX
+--
+create index fn_license_app_id using btree on fn_license_app (id);
+
+-- ------------------ ALTER TABLE ADD CONSTRAINT FOREIGN KEY SECTION
+--
+-- NAME: FK_FN_USER__REF_178_FN_APP; TYPE: FK CONSTRAINT
+--
+alter table fn_user_role
+ add constraint fk_fn_user__ref_178_fn_app foreign key (app_id) references fn_app(app_id);
+--
+-- NAME: FK_FN_TAB_FUNCTION_CD; TYPE: FK CONSTRAINT
+--
+alter table fn_tab
+ add constraint fk_fn_tab_function_cd foreign key (function_cd) references fn_function(function_cd);
+--
+-- NAME: FK_FN_TAB_SELECTED_TAB_CD; TYPE: FK CONSTRAINT
+--
+alter table fn_tab_selected
+ add constraint fk_fn_tab_selected_tab_cd foreign key (selected_tab_cd) references fn_tab(tab_cd);
+--
+-- NAME: FK_FN_TAB_SET_CD; TYPE: FK CONSTRAINT
+--
+alter table fn_tab
+ add constraint fk_fn_tab_set_cd foreign key (tab_set_cd) references fn_lu_tab_set(tab_set_cd);
+--
+-- NAME: FK_FN_USER_REF_110_FN_ORG; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+ add constraint fk_fn_user_ref_110_fn_org foreign key (org_id) references fn_org(org_id);
+--
+-- NAME: FK_FN_USER_REF_123_FN_LU_AL; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+ add constraint fk_fn_user_ref_123_fn_lu_al foreign key (alert_method_cd) references fn_lu_alert_method(alert_method_cd);
+--
+-- NAME: FK_FN_USER_REF_197_FN_USER; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+ add constraint fk_fn_user_ref_197_fn_user foreign key (manager_id) references fn_user(user_id);
+--
+-- NAME: FK_FN_USER_REF_198_FN_USER; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+ add constraint fk_fn_user_ref_198_fn_user foreign key (created_id) references fn_user(user_id);
+--
+-- NAME: FK_FN_USER_REF_199_FN_USER; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+ add constraint fk_fn_user_ref_199_fn_user foreign key (modified_id) references fn_user(user_id);
+--
+-- NAME: FK_PSEUDO_ROLE_PSEUDO_ROLE_ID; TYPE: FK CONSTRAINT
+--
+alter table fn_user_pseudo_role
+ add constraint fk_pseudo_role_pseudo_role_id foreign key (pseudo_role_id) references fn_role(role_id);
+--
+-- NAME: FK_PSEUDO_ROLE_USER_ID; TYPE: FK CONSTRAINT
+--
+alter table fn_user_pseudo_role
+ add constraint fk_pseudo_role_user_id foreign key (user_id) references fn_user(user_id);
+--
+-- NAME: FK_RESTRICTED_URL_FUNCTION_CD; TYPE: FK CONSTRAINT
+--
+alter table fn_restricted_url
+ add constraint fk_restricted_url_function_cd foreign key (function_cd) references fn_function(function_cd);
+--
+-- NAME: FK_TIMEZONE; TYPE: FK CONSTRAINT
+--
+alter table fn_user
+ add constraint fk_timezone foreign key (timezone) references fn_lu_timezone(timezone_id);
+--
+-- Name: fn_license_r02; Type: FK CONSTRAINTs
+--
+alter table fn_license
+ add constraint fn_license_r02 foreign key (quantum_version_id) references fn_license_version(id);
+
+--
+-- DBCA adds just one table to the base EPSDK set.
+-- Content is added by app for users.
+--
+DROP TABLE IF EXISTS `dbca_dmaap_access`;
+CREATE TABLE `dbca_dmaap_access` (
+ `DMAAP_ID` int(11) NOT NULL AUTO_INCREMENT,
+ `USER_ID` varchar(16) NOT NULL,
+ `NAME` varchar(100) NOT NULL,
+ `DMAAP_URL` varchar(256) NOT NULL,
+ `MECH_ID` varchar(96) DEFAULT NULL,
+ `PASSWORD` varchar(96) DEFAULT NULL,
+ `CREATED_ID` int(11) DEFAULT NULL,
+ `CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `MODIFIED_ID` int(11) DEFAULT NULL,
+ `MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `SELECT_YN` char(1) DEFAULT 'N',
+ PRIMARY KEY (`DMAAP_ID`)
+) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8;
+
+commit;
diff --git a/dcae_dmaapbc_webapp/dbca-common/db-scripts/readme.md b/dcae_dmaapbc_webapp/dbca-common/db-scripts/readme.md
new file mode 100644
index 0000000..3d9f4b2
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/db-scripts/readme.md
@@ -0,0 +1,4 @@
+# DMAAP-BC Database Scripts
+
+This directory has common database scripts - usable in all environments.
+A complete deployment will use common and environment-specific scripts!
diff --git a/dcae_dmaapbc_webapp/dbca-common/pom.xml b/dcae_dmaapbc_webapp/dbca-common/pom.xml
new file mode 100644
index 0000000..edd69a6
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/pom.xml
@@ -0,0 +1,218 @@
+<?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/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.openecomp.ui.dmaapbc</groupId>
+ <artifactId>dmaap-bc-app-common</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+ <name>DCAE DMaaP Bus Controller Webapp Common Java Files</name>
+ <description>Code for the DCAE DMaaP Bus Controller GUI</description>
+
+ <properties>
+ <encoding>UTF-8</encoding>
+ <springframework.version>4.2.0.RELEASE</springframework.version>
+ <hibernate.version>4.3.11.Final</hibernate.version>
+ <epsdk.version>1.1.0-SNAPSHOT</epsdk.version>
+ <dbca.version>1.1.0-SNAPSHOT</dbca.version>
+ <skipTests>true</skipTests>
+ <nexusproxy>https://nexus.onap.org</nexusproxy>
+ <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
+ <stagingNexusPath>/content/repositories/staging/</stagingNexusPath>
+ <releaseNexusPath>/content/repositories/releases/</releaseNexusPath>
+ </properties>
+
+ <repositories>
+ <repository>
+ <id>snapshots-repo</id>
+ <url>${nexusproxy}${snapshotNexusPath}</url>
+ </repository>
+ <repository>
+ <id>staging-repo</id>
+ <url>${nexusproxy}${stagingNexusPath}</url>
+ </repository>
+ <repository>
+ <id>releases-repo</id>
+ <url>${nexusproxy}${releaseNexusPath}</url>
+ </repository>
+ <repository>
+ <id>LF-EELF-jar-repo</id>
+ <url>${nexusproxy}/content/groups/public/</url>
+ </repository>
+ </repositories>
+
+ <build>
+ <plugins>
+
+ <!-- Compile to Java 1.8 class output format -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+
+ <!-- Put version into jar also -->
+ <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>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+
+ <!-- Generate javadoc jar; see profile for Java 8 -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.10.3</version>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- Generate source jar -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>3.0.0</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+ <dependencies>
+ <!-- SDK components -->
+ <dependency>
+ <groupId>org.openecomp.ecompsdkos</groupId>
+ <artifactId>epsdk-core</artifactId>
+ <version>${epsdk.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.elasticsearch</groupId>
+ <artifactId>elasticsearch</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <!-- For using HTTP Basic Auth in uService REST client -->
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.3.5</version>
+ </dependency>
+ <!-- Use Mariadb connector/j for failover -->
+ <dependency>
+ <groupId>org.mariadb.jdbc</groupId>
+ <artifactId>mariadb-java-client</artifactId>
+ <version>1.5.8</version>
+ </dependency>
+ <!-- Mapper -->
+ <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-core</artifactId>
+ <version>2.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.mchange</groupId>
+ <artifactId>c3p0</artifactId>
+ <version>0.9.5.2</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>3.1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ </dependency>
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>20160212</version>
+ </dependency>
+ <!-- bridge to implement commons-logging using slf4j -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
+ <version>1.7.12</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context-support</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>${springframework.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-tx</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-webmvc</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ </dependencies>
+
+ <!-- no distributionManagement section; no jars pushed to any Nexus repository -->
+
+</project>
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/DmaapBcRestClient.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/DmaapBcRestClient.java
new file mode 100644
index 0000000..39d28dd
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/DmaapBcRestClient.java
@@ -0,0 +1,1495 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller REST Client
+ * ================================================================================
+ * 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.dcae.dmaapbc.client;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.http.client.utils.URIBuilder;
+import org.openecomp.dcae.dmaapbc.model.DR_Node;
+import org.openecomp.dcae.dmaapbc.model.DR_Pub;
+import org.openecomp.dcae.dmaapbc.model.DR_Sub;
+import org.openecomp.dcae.dmaapbc.model.DcaeLocation;
+import org.openecomp.dcae.dmaapbc.model.Dmaap;
+import org.openecomp.dcae.dmaapbc.model.DmaapObject;
+import org.openecomp.dcae.dmaapbc.model.ErrorResponse;
+import org.openecomp.dcae.dmaapbc.model.Feed;
+import org.openecomp.dcae.dmaapbc.model.MR_Client;
+import org.openecomp.dcae.dmaapbc.model.MR_Cluster;
+import org.openecomp.dcae.dmaapbc.model.Topic;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Provides methods to communicate with the DMaaP Bus Controller REST API. This
+ * hides all JSON; instead it accepts and returns Java objects.
+ */
+public class DmaapBcRestClient extends SimpleRestClientBase {
+
+ private static Logger logger = LoggerFactory.getLogger(DmaapBcRestClient.class);
+
+ // Omit leading and trailing slashes here
+ private static final String DCAELOCATIONS = "dcaeLocations";
+ private static final String DMAAP = "dmaap";
+ private static final String DR_NODES = "dr_nodes";
+ private static final String DR_PUBS = "dr_pubs";
+ private static final String DR_SUBS = "dr_subs";
+ private static final String FEEDS = "feeds";
+ private static final String TOPICS = "topics";
+ private static final String MR_CLUSTERS = "mr_clusters";
+ private static final String MR_CLIENTS = "mr_clients";
+
+ /**
+ * Reusable JSON (de)serializer
+ */
+ private final ObjectMapper mapper;
+
+ /**
+ * URL of the DMAAP REST endpoint
+ */
+ private final String dmaapRestUrl;
+
+ /**
+ * Constructor that configures the client for the specified endpoint using
+ * no authentication.
+ *
+ * @param dmaapRestUrl
+ * URL of the endpoint
+ */
+ public DmaapBcRestClient(final String dmaapRestUrl) {
+ super();
+ this.dmaapRestUrl = dmaapRestUrl;
+ this.mapper = new ObjectMapper();
+ // Don't serialize null-value fields in objects
+ this.mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ /**
+ * Constructor that onfigures the client for the specified endpoint using
+ * the specified username and password for basic HTTP authentication.
+ *
+ * @param dmaapRestUrl
+ * URL of the endpoint
+ * @param username
+ * User name
+ * @param password
+ * Password
+ */
+ public DmaapBcRestClient(final String dmaapRestUrl, final String username, final String password) {
+ super(username, password);
+ this.dmaapRestUrl = dmaapRestUrl;
+ this.mapper = new ObjectMapper();
+ // Don't serialize null-value fields in objects
+ this.mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ /**
+ * Configures the behavior of the JSON deserializer used to build business
+ * objects (e.g., a Feed) from REST responses.
+ *
+ * @param failOnUnknownProperties
+ * If true, rejects JSON responses with unexpected fields
+ * (default behavior); if false, ignores unexpected fields.
+ */
+ public void setFailOnUnknownProperties(boolean failOnUnknownProperties) {
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, failOnUnknownProperties);
+ }
+
+ /**
+ * Gets the DMaaP endpoint URL that is used by methods in this class.
+ *
+ * @return dmaapEndpointUrl
+ */
+ public String getDmaapRestUrl() {
+ return this.dmaapRestUrl;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of DCAE locations.
+ *
+ * @return List of DmaapObject: list contains DcaeLocation object(s) on
+ * success; a single ErrorResponse object if the remote site rejects
+ * the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getDcaeLocations() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DCAELOCATIONS));
+ logger.debug("getDcaeLocations: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDcaeLocations: unexpected null response");
+
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<DcaeLocation>> typeRef = new TypeReference<List<DcaeLocation>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getDcaeLocations: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets the DCAE location with the specified name.
+ *
+ * @param locName
+ * name of the location to get
+ * @return DmaapObject: a DcaeLocation object on success; an ErrorResponse
+ * object if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getDcaeLocation(final String locName) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DCAELOCATIONS, locName));
+ logger.debug("getDcaeLocation: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDcaeLocation: unexpected null response");
+
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), DcaeLocation.class);
+ } catch (Exception ex) {
+ logger.debug("getDcaeLocation: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a DCAE location in DMaaP.
+ *
+ * @param dcaeLoc
+ * DcaeLocation to be created
+ * @return Status and response: expect 200 and a DcaeLocation on success; a
+ * code and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postDcaeLocation(DcaeLocation dcaeLoc) throws Exception {
+ String jsonBody = mapper.writeValueAsString(dcaeLoc);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(DCAELOCATIONS), jsonBody);
+ if (hsr == null)
+ throw new Exception("postDcaeLocation: unexpected null response");
+ logger.debug("postDcaeLocation: resp is {}", hsr);
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postDcaeLocation: null response body");
+ return response;
+ }
+ try {
+ DcaeLocation resp = mapper.readValue(hsr.getResponseString(), DcaeLocation.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postDcaeLocation: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the DCAE location with the specified name.
+ *
+ * @param locName
+ * Name of the location to delete
+ * @return Status and response: expect 204 and a DcaeLocation on success; a
+ * code and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteDcaeLocation(final String locName) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(DCAELOCATIONS, locName));
+ logger.debug("deleteDcaeLocation: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("deleteDcaeLocation: unexpected null response");
+ // Returns a loc on success, error message string on error.
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteDcaeLocation: null response body");
+ return response;
+ }
+ try {
+ DcaeLocation resp = mapper.readValue(hsr.getResponseString(), DcaeLocation.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteDcaeLocation: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates a DCAE location.
+ *
+ * @param dcaeLoc
+ * DCAE Location to be updated
+ * @return Status and response; expect 200 and a DcaeLocation on success, a
+ * string error on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putDcaeLocation(DcaeLocation dcaeLoc) throws Exception {
+ String jsonBody = mapper.writeValueAsString(dcaeLoc);
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(DCAELOCATIONS, dcaeLoc.getDcaeLocationName()),
+ jsonBody);
+ logger.debug("putDcaeLocation: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("putDcaeLocation: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putDcaeLocation: null response body");
+ return response;
+ }
+ try {
+ DcaeLocation resp = mapper.readValue(hsr.getResponseString(), DcaeLocation.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("putDcaeLocation: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets the DMAAP instance for this DCAE deployment.
+ *
+ * @return DmaapObject: a Dmaap object on success; an ErrorResponse object
+ * if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getDmaap() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DMAAP));
+ logger.debug("getDmaap: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDmaap: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), Dmaap.class);
+ } catch (Exception ex) {
+ logger.debug("getDmaap: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a new DMaaP set system wide configuration settings for the
+ * dcaeEnvironment
+ *
+ * @param dmaap
+ * Dmaap properties
+ * @return Status and response: expect 200 and a Dmaap on success; a code
+ * and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postDmaap(Dmaap dmaap) throws Exception {
+ String jsonBody = mapper.writeValueAsString(dmaap);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(DMAAP), jsonBody);
+ if (hsr == null)
+ throw new Exception("postDmaap: unexpected null response");
+ logger.debug("postDmaap: resp is {}", hsr);
+ // Returns ? on success, error message string on error.
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postDmaap: null response body");
+ return response;
+ }
+ try {
+ Dmaap resp = mapper.readValue(hsr.getResponseString(), Dmaap.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postDmaap: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates DMaaP system wide configuration settings for the dcaeEnvironment.
+ *
+ * @param dmaap
+ * Dmaap properties
+ * @return Status and response; expect 200 and a DR_Pub on success; a code
+ * and and ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putDmaap(Dmaap dmaap) throws Exception {
+ String jsonBody = mapper.writeValueAsString(dmaap);
+ // Oddly, this PUT has no ID parameter in the URL
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(DMAAP), jsonBody);
+ if (hsr == null)
+ throw new Exception("putDmaap: unexpected null response");
+ logger.debug("putDmaap: resp is {}", hsr);
+ // Returns ? on success, error message string on error.
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putDmaap: null response body");
+ return response;
+ }
+ try {
+ Dmaap resp = mapper.readValue(hsr.getResponseString(), Dmaap.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("putDmaap: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ // NO DELETE_DMAAP METHOD
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of data router nodes.
+ *
+ * @return List of DmaapObject: list contains DR_Node object(s) on success;
+ * a single ErrorResponse object if the remote site rejects the
+ * request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getDRNodes() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DR_NODES));
+ logger.debug("getDRNodes: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDRNodes: unexpected null response");
+
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<DR_Node>> typeRef = new TypeReference<List<DR_Node>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getDRNodes: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets a data router node with the specified ID.
+ *
+ * @param fqdn
+ * Name of the node to get
+ * @return DmaapObject: a DR_Node object on success; an ErrorResponse object
+ * if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getDRNode(final String fqdn) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DR_NODES, fqdn));
+ logger.debug("getDRNode: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDRNode: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), DR_Node.class);
+ } catch (Exception ex) {
+ logger.debug("getDRNode: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a data router node.
+ *
+ * @param drNode
+ * Node to be created
+ * @return Status and response: expect 200 and a DR_Node on success; a code
+ * and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postDRNode(DR_Node drNode) throws Exception {
+ String jsonBody = mapper.writeValueAsString(drNode);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(DR_NODES), jsonBody);
+ logger.debug("postDRNode: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("postDRNode: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postDRNode: null response body");
+ return response;
+ }
+ try {
+ DR_Node resp = mapper.readValue(hsr.getResponseString(), DR_Node.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postDRNode: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates a data router node.
+ *
+ * @param drNode
+ * Node to be updated
+ * @return Status and response: expect 200 and a DR_Node on success; a code
+ * and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putDRNode(DR_Node drNode) throws Exception {
+ String jsonBody = mapper.writeValueAsString(drNode);
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(DR_NODES, drNode.getFqdn()), jsonBody);
+ logger.debug("putDRNode: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("putDRNode: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putDRNode: null response body");
+ return response;
+ }
+ try {
+ DR_Node resp = mapper.readValue(hsr.getResponseString(), DR_Node.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postDRNode: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the data router node with the specified FQDN.
+ *
+ * @param fqdn
+ * Name of the node to delete
+ * @return Status and response: expect 204 and a null on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteDRNode(final String fqdn) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(DR_NODES, fqdn));
+ logger.debug("deleteDRNode: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("deleteDRNode: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteDRNode: null response body");
+ return response;
+ }
+ try {
+ DR_Node resp = mapper.readValue(hsr.getResponseString(), DR_Node.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteDRNode: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of data router publishers.
+ *
+ * @return List of DmaapObject: list contains DR_Pub object(s) on success; a
+ * single ErrorResponse object if the remote site rejects the
+ * request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getDRPubs() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DR_PUBS));
+ logger.debug("getDRPubs: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDRPubs: unexpected null response");
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<DR_Pub>> typeRef = new TypeReference<List<DR_Pub>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getDRPubs: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets a data router publisher with the specified ID.
+ *
+ * @param pubId
+ * ID of the publisher to get
+ * @return DmaapObject: a DR_Pub object on success; an ErrorResponse object
+ * if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getDRPub(final String pubId) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DR_PUBS, pubId));
+ logger.debug("getDRPub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDRPub: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), DR_Pub.class);
+ } catch (Exception ex) {
+ logger.debug("getDRPub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a data router publisher.
+ *
+ * @param drPub
+ * Data router publisher properties
+ * @return Status and response: expect 200 and a DR_Pub on success; a code
+ * and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postDRPub(DR_Pub drPub) throws Exception {
+ String jsonBody = mapper.writeValueAsString(drPub);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(DR_PUBS), jsonBody);
+ logger.debug("postDRPub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("postDRPub: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postDRPub: null response body");
+ return response;
+ }
+ try {
+ DR_Pub resp = mapper.readValue(hsr.getResponseString(), DR_Pub.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postDRPub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates a data router publisher.
+ *
+ * @param drPub
+ * Publisher to be updated
+ * @return Status and response: expect 200 and a DR_Pub on success, a code
+ * and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putDRPub(DR_Pub drPub) throws Exception {
+ String jsonBody = mapper.writeValueAsString(drPub);
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(DR_PUBS, drPub.getPubId()), jsonBody);
+ logger.debug("putDRPub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("putDRPub: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putDRPub: null response body");
+ return response;
+ }
+ try {
+ DR_Pub resp = mapper.readValue(hsr.getResponseString(), DR_Pub.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postDRPub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the data router publisher with the specified ID.
+ *
+ * @param pubId
+ * ID of the publisher to delete
+ * @return Status and response: expect 204 and a null on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteDRPub(final String pubId) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(DR_PUBS, pubId));
+ logger.debug("deleteDRPub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("deleteDRPub: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteDRPub: null response body");
+ return response;
+ }
+ try {
+ DR_Pub resp = mapper.readValue(hsr.getResponseString(), DR_Pub.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteDRPub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of data router subscribers.
+ *
+ * @return List of DmaapObject: list contains DR_Sub object(s) on success; a
+ * single ErrorResponse object if the remote site rejects the
+ * request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getDRSubs() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DR_SUBS));
+ logger.debug("getDRSubs: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDRSubs: unexpected null response");
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<DR_Sub>> typeRef = new TypeReference<List<DR_Sub>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getDRSubs: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets a data router subscriber with the specified ID.
+ *
+ * @param subId
+ * ID of the subscriber to get
+ * @return DmaapObject: a DR_Sub object on success; an ErrorResponse object
+ * if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getDRSub(final String subId) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(DR_SUBS, subId));
+ logger.debug("getDRPub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getDRSub: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), DR_Sub.class);
+ } catch (Exception ex) {
+ logger.debug("getDRSub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a data router subscriber.
+ *
+ * @param drSub
+ * Data router subscriber properties
+ * @return Status and response: expect 200 and a DR_Sub on success; a code
+ * and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postDRSub(DR_Sub drSub) throws Exception {
+ String jsonBody = mapper.writeValueAsString(drSub);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(DR_SUBS), jsonBody);
+ logger.debug("postDRSub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("postDRSub: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postDRSub: null response body");
+ return response;
+ }
+ try {
+ DR_Sub resp = mapper.readValue(hsr.getResponseString(), DR_Sub.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postDRSub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates a data router subscriber.
+ *
+ * @param drSub
+ * Subscriber to be updated
+ * @return Status and response; expect 200 and a DR_Sub on success, a string
+ * error on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putDRSub(DR_Sub drSub) throws Exception {
+ String jsonBody = mapper.writeValueAsString(drSub);
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(DR_SUBS, drSub.getSubId()), jsonBody);
+ logger.debug("putDRSub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("putDRSub: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putDRSub: null response body");
+ return response;
+ }
+ try {
+ DR_Sub resp = mapper.readValue(hsr.getResponseString(), DR_Sub.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("putDRSub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the data router subscriber with the specified ID.
+ *
+ * @param subId
+ * ID of the subscriber to delete
+ * @return Status and response: expect 204 and a null on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteDRSub(final String subId) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(DR_SUBS, subId));
+ logger.debug("deleteDRSub: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("deleteDRSub: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteDRSub: null response body");
+ return response;
+ }
+ try {
+ DR_Sub resp = mapper.readValue(hsr.getResponseString(), DR_Sub.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteDRSub: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of data router feeds.
+ *
+ * @return List of DmaapObject: list contains DcaeLocation object(s) on
+ * success; a single ErrorResponse object if the remote site rejects
+ * the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getFeeds() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(FEEDS));
+ logger.debug("getFeeds: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getFeeds: unexpected null response");
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<Feed>> typeRef = new TypeReference<List<Feed>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getFeeds: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets a data router feed with the specified ID.
+ *
+ * @param feedId
+ * ID of the feed to get
+ * @return DmaapObject: a Feed object on success; an ErrorResponse object if
+ * the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getFeed(final String feedId) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(FEEDS, feedId));
+ logger.debug("getFeed: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getFeed: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), Feed.class);
+ } catch (Exception ex) {
+ logger.debug("getFeed: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a feed and adds any specified pubs and subs.
+ *
+ * @param feed
+ * Data router feed properties
+ * @return Status and response: expect 200 and a Feed on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postFeed(Feed feed) throws Exception {
+ String jsonBody = mapper.writeValueAsString(feed);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(FEEDS), jsonBody);
+ logger.debug("postFeed: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("postFeed: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postFeed: null response body");
+ return response;
+ }
+ try {
+ Feed resp = mapper.readValue(hsr.getResponseString(), Feed.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postFeed: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates a data router feed.
+ *
+ * @param feed
+ * Feed to be updated
+ * @return Status and response: expect 200 and a Feed on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putFeed(Feed feed) throws Exception {
+ String jsonBody = mapper.writeValueAsString(feed);
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(FEEDS, feed.getFeedId()), jsonBody);
+ logger.debug("putFeed: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("putFeed: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putFeed: null response body");
+ return response;
+ }
+ try {
+ Feed resp = mapper.readValue(hsr.getResponseString(), Feed.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("putFeed: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the data router feed with the specified ID.
+ *
+ * @param feedId
+ * ID of the feed to delete
+ * @return Status and response: expect 204 and a null on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteFeed(final String feedId) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(FEEDS, feedId));
+ logger.debug("deleteFeed: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("deleteFeed: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteFeed: null response body");
+ return response;
+ }
+ try {
+ Feed resp = mapper.readValue(hsr.getResponseString(), Feed.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteFeed: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of message router topics.
+ *
+ * @return List of DmaapObject: list contains Topic object(s) on success; a
+ * single ErrorResponse object if the remote site rejects the
+ * request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getTopics() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(TOPICS));
+ logger.debug("getTopics: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getTopics: unexpected null response");
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<Topic>> typeRef = new TypeReference<List<Topic>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getTopics: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets the message router topic with the specified FQTN.
+ *
+ * @param fqtn
+ * Fully qualified topic name
+ * @return DmaapObject: a Topic object on success; an ErrorResponse object
+ * if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getTopic(final String fqtn) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(TOPICS, fqtn));
+ logger.debug("getTopic: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getTopic: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), Topic.class);
+ } catch (Exception ex) {
+ logger.debug("getTopic: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a topic and grants appropriate permissions to specified pubs and
+ * subs.
+ *
+ * @param topic
+ * Message router topic properties
+ * @return Status and response: expect 200 and a Topic on success; a code
+ * and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postTopic(Topic topic) throws Exception {
+ String jsonBody = mapper.writeValueAsString(topic);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(TOPICS), jsonBody);
+ logger.debug("postTopic: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("postTopic: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postTopic: null response body");
+ return response;
+ }
+ try {
+ Topic resp = mapper.readValue(hsr.getResponseString(), Topic.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postTopic: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the message router topic with the specified FQTN.
+ *
+ * @param fqtn
+ * Fully qualified topic name to delete
+ * @return Status and response: expect 204 and a null on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteTopic(final String fqtn) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(TOPICS, fqtn));
+ logger.debug("deleteTopic: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("deleteTopic: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteTopic: null response body");
+ return response;
+ }
+ try {
+ Topic resp = mapper.readValue(hsr.getResponseString(), Topic.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteTopic: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of message router clients.
+ *
+ * @return List of DmaapObject: list contains MR_Client object(s) on
+ * success; a single ErrorResponse object if the remote site rejects
+ * the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getMRClients() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(MR_CLIENTS));
+ logger.debug("getMRClients: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getMRClients: unexpected null response");
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<MR_Client>> typeRef = new TypeReference<List<MR_Client>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getMRClients: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets the message router client with the specified ID.
+ *
+ * @param mrClientId
+ * ID of the client to get
+ * @return DmaapObject: a MR_Client object on success; an ErrorResponse
+ * object if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getMRClient(final String mrClientId) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(MR_CLIENTS, mrClientId));
+ logger.debug("getMRClient: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getMRClient: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), MR_Client.class);
+ } catch (Exception ex) {
+ logger.debug("getMRClient: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a message router client.
+ *
+ * @param mrClient
+ * Message router client properties
+ * @return Status and response: expect 200 and a MR_Client on success; a
+ * code and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postMRClient(MR_Client mrClient) throws Exception {
+ String jsonBody = mapper.writeValueAsString(mrClient);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(MR_CLIENTS), jsonBody);
+ logger.debug("postMRClient: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("postMRClient: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postMRClient: null response body");
+ return response;
+ }
+ try {
+ MR_Client resp = mapper.readValue(hsr.getResponseString(), MR_Client.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postMRClient: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates a message router client.
+ *
+ * @param mrClient
+ * client to be updated
+ * @return Status and response; expect 200 and a MR_Client on success, a
+ * string error on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putMRClient(MR_Client mrClient) throws Exception {
+ String jsonBody = mapper.writeValueAsString(mrClient);
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(MR_CLIENTS, mrClient.getMrClientId()),
+ jsonBody);
+ logger.debug("putMRClient: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("putMRClient: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putMRClient: null response body");
+ return response;
+ }
+ try {
+ MR_Client resp = mapper.readValue(hsr.getResponseString(), MR_Client.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("putMRClient: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the message router client with the specified ID.
+ *
+ * @param mrClientId
+ * ID of the client to delete
+ * @return Status and response; expect 204 and a null on success, a string
+ * error on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteMRClient(final String mrClientId) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(MR_CLIENTS, mrClientId));
+ logger.debug("deleteMRClient: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("deleteMRClient: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteMRClient: null response body");
+ return response;
+ }
+ try {
+ MR_Client resp = mapper.readValue(hsr.getResponseString(), MR_Client.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteMRClient: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Gets a list of message router clusters.
+ *
+ * @return List of DmaapObject: list contains MR_Cluster object(s) on
+ * success; a single ErrorResponse object if the remote site rejects
+ * the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public List<DmaapObject> getMRClusters() throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(MR_CLUSTERS));
+ logger.debug("getMRClusters: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getMRClusters: unexpected null response");
+ List<DmaapObject> responseList = null;
+ try {
+ TypeReference<List<MR_Cluster>> typeRef = new TypeReference<List<MR_Cluster>>() {
+ };
+ responseList = mapper.readValue(hsr.getResponseString(), typeRef);
+ } catch (Exception ex) {
+ logger.debug("getDcaeLocations: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ responseList = new ArrayList<DmaapObject>();
+ responseList.add(errResp);
+ }
+ return responseList;
+ }
+
+ /**
+ * Gets the message router cluster with the specified location name.
+ *
+ * @param dcaeLocName
+ * name of the cluster to get
+ * @return DmaapObject: a MR_Cluster object on success; an ErrorResponse
+ * object if the remote site rejects the request.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public DmaapObject getMRCluster(final String dcaeLocName) throws Exception {
+ HttpStatusAndResponse<String> hsr = getRestContent(buildDmaapUri(MR_CLUSTERS, dcaeLocName));
+ logger.debug("getMRCluster: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("getMRCluster: unexpected null response");
+ DmaapObject response = null;
+ try {
+ response = mapper.readValue(hsr.getResponseString(), MR_Cluster.class);
+ } catch (Exception ex) {
+ logger.debug("getMRCluster: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ response = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ }
+ return response;
+ }
+
+ /**
+ * Creates a message router cluster.
+ *
+ * @param mrCluster
+ * Message router cluster properties
+ * @return Status and response: expect 200 and a MR_Cluster on success; a
+ * code and an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> postMRCluster(MR_Cluster mrCluster) throws Exception {
+ String jsonBody = mapper.writeValueAsString(mrCluster);
+ HttpStatusAndResponse<String> hsr = postRestContent(buildDmaapUri(MR_CLUSTERS), jsonBody);
+ logger.debug("postMRCluster: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("postMRCluster: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("postMRCluster: null response body");
+ return response;
+ }
+ try {
+ MR_Cluster resp = mapper.readValue(hsr.getResponseString(), MR_Cluster.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("postMRCluster: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Updates a message router cluster.
+ *
+ * @param mrCluster
+ * cluster to be updated
+ * @return Status and response; expect 200 and a MR_Cluster on success, a
+ * string error on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> putMRCluster(MR_Cluster mrCluster) throws Exception {
+ String jsonBody = mapper.writeValueAsString(mrCluster);
+ HttpStatusAndResponse<String> hsr = putRestContent(buildDmaapUri(MR_CLUSTERS, mrCluster.getDcaeLocationName()),
+ jsonBody);
+ logger.debug("putMRCluster: resp is {}", hsr);
+ if (hsr == null)
+ throw new Exception("putMRCluster: unexpected null response");
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("putMRCluster: null response body");
+ return response;
+ }
+ try {
+ MR_Cluster resp = mapper.readValue(hsr.getResponseString(), MR_Cluster.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("putMRCluster: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /**
+ * Deletes the message router cluster with the specified location name.
+ *
+ * @param dcaeLocName
+ * Location name of the cluster to delete
+ * @return Status and response: expect 204 and a null on success; a code and
+ * an ErrorResponse on failure.
+ * @throws Exception
+ * if host cannot be reached, response cannot be parsed, etc.
+ */
+ public HttpStatusAndResponse<Object> deleteMRCluster(final String dcaeLocName) throws Exception {
+ HttpStatusAndResponse<String> hsr = deleteRestContent(buildDmaapUri(MR_CLUSTERS, dcaeLocName));
+ if (hsr == null)
+ throw new Exception("deleteMRCluster: unexpected null response");
+ logger.debug("deleteMRCluster: resp is {}", hsr);
+ HttpStatusAndResponse<Object> response = new HttpStatusAndResponse<Object>(hsr.getStatusCode(), null);
+ if (hsr.getResponse() == null) {
+ logger.debug("deleteMRCluster: null response body");
+ return response;
+ }
+ try {
+ MR_Cluster resp = mapper.readValue(hsr.getResponseString(), MR_Cluster.class);
+ response.setResponse(resp);
+ } catch (Exception ex) {
+ logger.debug("deleteMRCluster: trying to parse response as error: {}", ex.toString());
+ // If this parse fails, let the exception be thrown
+ ErrorResponse errResp = mapper.readValue(hsr.getResponseString(), ErrorResponse.class);
+ response.setResponse(errResp);
+ }
+ return response;
+ }
+
+ /////////////////////////////////////////////////////////////////////
+
+ /**
+ * Builds the URI for the DMaaP REST endpoint using configuration and the
+ * specified task and path parameter(s). Deals with extra or missing slashes
+ * to allow for some flexibility in the config file.
+ *
+ * @param requestPath
+ * Last part of endpoint path
+ * @param pathParam
+ * Additional path parameters in order; ignored if null or empty
+ * @return REST endpoint URI
+ * @throws Exception
+ * if the RESAT URL property is not found
+ */
+ private URI buildDmaapUri(String task, String... pathParam) throws Exception {
+ if (dmaapRestUrl == null || dmaapRestUrl.length() == 0)
+ throw new Exception("buildUrlPath: unconfigured, must set dmaapEndpointUrl");
+ StringBuilder sb = new StringBuilder();
+ // Clean the base of any trailing slashes
+ sb.append(trimSlashes(dmaapRestUrl));
+ sb.append('/');
+ // task is controlled in this file, don't clean it.
+ sb.append(task);
+ if (pathParam != null) {
+ for (String pp : pathParam) {
+ sb.append('/');
+ // path comes from the user, definitely clean it.
+ sb.append(trimSlashes(pp));
+ }
+ }
+ String urlPath = sb.toString();
+ URIBuilder uriBuilder = new URIBuilder(urlPath);
+ return uriBuilder.build();
+ }
+
+ /**
+ * Strips the specified string of leading and trailing forward-slash
+ * characters.
+ *
+ * @param s
+ * String to trim
+ * @return String without any leading or trailing '/' characters.
+ */
+ private String trimSlashes(String s) {
+ while (s.length() > 0 && s.charAt(0) == '/')
+ s = s.substring(1, s.length());
+ while (s.length() > 0 && s.charAt(s.length() - 1) == '/')
+ s = s.substring(0, s.length() - 1);
+ return s;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/HttpStatusAndResponse.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/HttpStatusAndResponse.java
new file mode 100644
index 0000000..a9b1585
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/HttpStatusAndResponse.java
@@ -0,0 +1,66 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller REST Client
+ * ================================================================================
+ * 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.dcae.dmaapbc.client;
+
+/**
+ * Holds the status code and body that result from accessing an HTTP URL.
+ */
+public class HttpStatusAndResponse<ResponseType> {
+
+ private int statusCode;
+ private ResponseType response;
+
+ public HttpStatusAndResponse(int status, ResponseType resp) {
+ this.statusCode = status;
+ this.response = resp;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(final int code) {
+ this.statusCode = code;
+ }
+
+ public ResponseType getResponse() {
+ return response;
+ }
+
+ public void setResponse(ResponseType response) {
+ this.response = response;
+ }
+
+ /**
+ * Convenience method to avoid testing for null and calling .toString()
+ *
+ * @return String version of the response object; null if the object is
+ * null.
+ */
+ public String getResponseString() {
+ return response == null ? null : response.toString();
+ }
+
+ @Override
+ public String toString() {
+ return "HttpStatusAndResponse[" + Integer.toString(statusCode) + ";"
+ + (response == null ? "" : response.toString()) + "]";
+ }
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/IRestClientConstants.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/IRestClientConstants.java
new file mode 100644
index 0000000..1db390b
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/IRestClientConstants.java
@@ -0,0 +1,34 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller REST Client
+ * ================================================================================
+ * 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.dcae.dmaapbc.client;
+
+public interface IRestClientConstants {
+
+ /**
+ * Default configuration file to be found on classpath
+ */
+ public static final String PROPERTY_FILE_NAME = "bc-rest-client.properties";
+
+ /**
+ * Base URL of the Bus Controller REST service API
+ */
+ public static final String DMAAP_BUS_CONTROLLER_REST_URL = "dmaap_bus_controller_rest_url";
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/SimpleRestClientBase.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/SimpleRestClientBase.java
new file mode 100644
index 0000000..7868d8c
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/client/SimpleRestClientBase.java
@@ -0,0 +1,291 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller REST Client
+ * ================================================================================
+ * 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.dcae.dmaapbc.client;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.http.Consts;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.config.RequestConfig.Builder;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides a basic client to access a REST endpoint, optionally using HTTP
+ * basic authentication.
+ *
+ * Caveat: If HTTPS access is used and the server uses a self-signed
+ * certificate, the local trust store must be extended appropriately. The client
+ * throws exceptions if the JVM cannot validate the server certificate.
+ */
+public class SimpleRestClientBase {
+
+ private static Logger logger = LoggerFactory.getLogger(SimpleRestClientBase.class);
+
+ /**
+ * Credentials for HTTP basic authentication (optional).
+ */
+ private final String username;
+ private final String password;
+
+ /**
+ * Timeouts (optional)
+ */
+ private Integer connectTimeoutMs = null;
+ private Integer connectionRequestTimeoutMs = null;
+ private Integer socketTimeoutMs = null;
+
+ /**
+ * Constructs a client that does not use any authentication and uses Apache
+ * HTTPD client default values for timeouts.
+ */
+ public SimpleRestClientBase() {
+ this(null, null, null, null, null);
+ }
+
+ /**
+ * Convenience constructor to build a client that uses the specified
+ * username and password for basic HTTP authentication on all requests. In
+ * other words, this client pre-emptively sends the "Basic" header instead
+ * of first trying the request without, failing, negotiating, then sending
+ * with credentials.
+ *
+ * @param username
+ * User name for basic HTTP authentication.
+ * @param password
+ * Password for basic HTTP authentication.
+ */
+ public SimpleRestClientBase(final String username, final String password) {
+ this(username, password, null, null, null);
+ }
+
+ /**
+ * Convenience constructor to build a client that uses the specified
+ * timeouts on all requests.
+ *
+ * @param connectTimeoutMs
+ * Connection timeout, in milliseconds
+ * @param connectionRequestTimeoutMs
+ * Connection request timeout, in milliseconds
+ * @param socketTimeoutMs
+ * Socket timeout, in milliseconds
+ */
+ public SimpleRestClientBase(final Integer connectTimeoutMs, final Integer connectionRequestTimeoutMs,
+ final Integer socketTimeoutMs) {
+ this(null, null, connectTimeoutMs, connectionRequestTimeoutMs, socketTimeoutMs);
+ }
+
+ /**
+ * Constructs a client with the specified credentials and timeout values.
+ *
+ * @param username
+ * User name for basic HTTP authentication; ignored if null
+ * @param password
+ * Password for basic HTTP authentication; ignored if null
+ * @param connectTimeoutMs
+ * ignored if null
+ * @param connectionRequestTimeoutMs
+ * ignored if null
+ * @param socketTimeoutMs
+ * ignored if null
+ */
+ public SimpleRestClientBase(final String username, final String password, final Integer connectTimeoutMs,
+ final Integer connectionRequestTimeoutMs, final Integer socketTimeoutMs) {
+ this.username = username;
+ this.password = password;
+ this.connectTimeoutMs = null;
+ this.connectionRequestTimeoutMs = null;
+ this.socketTimeoutMs = null;
+ }
+
+ /**
+ * Constructs and sends a GET request for the URI.
+ *
+ * @param uri
+ * REST endpoint
+ * @return Result of the get
+ * @throws Exception
+ * On any error
+ */
+ public HttpStatusAndResponse<String> getRestContent(final URI uri) throws Exception {
+ HttpGet httpGet = new HttpGet(uri);
+ return doRestRequest(httpGet);
+ }
+
+ /**
+ * Constructs and sends a POST request using the specified body.
+ *
+ * @param uri
+ * REST endpoint
+ * @param json
+ * Content to post
+ * @return Result of the post; null if an error happens
+ * @throws Exception
+ * On any error
+ */
+ public HttpStatusAndResponse<String> postRestContent(final URI uri, final String json) throws Exception {
+ HttpPost httpPost = new HttpPost(uri);
+ StringEntity postEntity = new StringEntity(json, ContentType.create("application/json", Consts.UTF_8));
+ httpPost.setEntity(postEntity);
+ return doRestRequest(httpPost);
+ }
+
+ /**
+ * Constructs and sends a PUT request using the specified body.
+ *
+ * @param uri
+ * REST endpoint
+ * @param json
+ * Content to put
+ * @return Result of the put; null if an error happens
+ * @throws Exception
+ * On any error
+ */
+ public HttpStatusAndResponse<String> putRestContent(final URI uri, final String json) throws Exception {
+ HttpPut httpPut = new HttpPut(uri);
+ StringEntity postEntity = new StringEntity(json, ContentType.create("application/json", Consts.UTF_8));
+ httpPut.setEntity(postEntity);
+ return doRestRequest(httpPut);
+ }
+
+ /**
+ * Constructs and sends a DELETE request for the URI.
+ *
+ * @param uri
+ * REST endpoint
+ * @return Result of the get
+ * @throws Exception
+ * On any error
+ */
+ public HttpStatusAndResponse<String> deleteRestContent(final URI uri) throws Exception {
+ HttpDelete httpDel = new HttpDelete(uri);
+ return doRestRequest(httpDel);
+ }
+
+ /**
+ * Executes the specified request and gathers the response.
+ *
+ * @param request
+ * HttpGet, HttpPost, etc.
+ * @return Status code and response body
+ * @throws ClientProtocolException
+ * On HTTP protocol error
+ * @throws IOException
+ * On read/write error
+ */
+ private HttpStatusAndResponse<String> doRestRequest(final HttpRequestBase request)
+ throws ClientProtocolException, IOException {
+
+ // Set up authentication if needed
+ final HttpClientContext context = HttpClientContext.create();
+ if (this.username != null || this.password != null) {
+ UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(this.username, this.password);
+ CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+ credentialsProvider.setCredentials(AuthScope.ANY, credentials);
+ context.setCredentialsProvider(credentialsProvider);
+
+ HttpHost host = new HttpHost(request.getURI().getHost(), request.getURI().getPort(),
+ request.getURI().getScheme());
+ AuthCache authCache = new BasicAuthCache();
+ authCache.put(host, new BasicScheme());
+ context.setAuthCache(authCache);
+ }
+ final Builder requestConfigBuilder = RequestConfig.custom();
+ if (connectionRequestTimeoutMs != null)
+ requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeoutMs);
+ if (connectTimeoutMs != null)
+ requestConfigBuilder.setConnectTimeout(connectTimeoutMs);
+ if (socketTimeoutMs != null)
+ requestConfigBuilder.setSocketTimeout(socketTimeoutMs);
+ RequestConfig requestConfig = requestConfigBuilder.build();
+ final CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
+ CloseableHttpResponse response = null;
+ String responseJson = null;
+ try {
+ response = httpClient.execute(request, context);
+ // Some methods return non-200 on success
+ logger.debug("doRestRequest: status is {}", response.getStatusLine());
+ HttpEntity entity = response.getEntity();
+ // This is common; don't warn
+ if (entity == null) {
+ logger.debug("doRestRequest: Entity is null");
+ } else {
+ // entity content length is never set;
+ // this naively tries to read everything.
+ responseJson = EntityUtils.toString(entity);
+ EntityUtils.consume(entity);
+ // Don't give back empty string;
+ // it has no more meaning than null.
+ if (responseJson.length() == 0)
+ responseJson = null;
+ }
+ } finally {
+ if (response != null)
+ response.close();
+ }
+ if (response == null)
+ return null;
+ return new HttpStatusAndResponse<String>(response.getStatusLine().getStatusCode(), responseJson);
+ }
+
+ /**
+ * Basic test invocation.
+ *
+ * @param args
+ * Expect 1 argument, the URL of a REST endpoint.
+ * @throws Exception
+ * if anything goes wrong
+ */
+ public static void main(String[] args) throws Exception {
+ if (args.length != 1)
+ throw new IllegalArgumentException("Expect 1 argument: REST URL for GET");
+ SimpleRestClientBase client = new SimpleRestClientBase();
+ URIBuilder uriBuilder = new URIBuilder(args[0]);
+ URI uri = uriBuilder.build();
+ HttpStatusAndResponse<String> hsr = client.getRestContent(uri);
+ System.out.println("Response code is " + hsr.getStatusCode());
+ System.out.println(hsr.getResponseString());
+ System.out.println("main ends.");
+ }
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataBusHomeController.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataBusHomeController.java
new file mode 100644
index 0000000..8748f29
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataBusHomeController.java
@@ -0,0 +1,35 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.controller;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+/**
+ * This controller maps requests for the DMaaP-BC-App's landing page, which is
+ * an Angular single-page application.
+ */
+@Controller
+@RequestMapping("/")
+public class DataBusHomeController extends DbcappRestrictedBaseController {
+
+ public static final String APP_NAME = "dmaap-bc-app";
+ public static final DateFormat logDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+
+ /**
+ * At one time I published the landing page as simply "/dbc", but it can
+ * also be accessed with a default suffix; e.g., "/dbc.htm".
+ *
+ * @return View name key, which is resolved to a file using an Apache tiles
+ * "definitions.xml" file.
+ */
+ @RequestMapping(value = { "/dbc" }, method = RequestMethod.GET)
+ public ModelAndView dbcDefaultController() {
+ // a model is only useful for JSP; this app is angular.
+ return new ModelAndView("dbc_home_tdkey");
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataRouterController.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataRouterController.java
new file mode 100644
index 0000000..cb6aa93
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DataRouterController.java
@@ -0,0 +1,321 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.controller;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.openecomp.dcae.dmaapbc.dbcapp.util.DbcappProperties;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * Data Router controller: serves Ajax requests made by Angular scripts on pages
+ * that show feeds, publishers and subscribers.
+ */
+@Controller
+@RequestMapping("/")
+public class DataRouterController extends DbcappRestrictedBaseController {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DataRouterController.class);
+
+ /**
+ * Application properties - NOT available to constructor.
+ */
+ @Autowired
+ private DbcappProperties appProperties;
+
+ private static final String FEED_PATH = "/dr_feed";
+ private static final String PUB_PATH = "/dr_pub";
+ private static final String SUB_PATH = "/dr_sub";
+
+ public DataRouterController() {
+ }
+
+ /**
+ * Answers a request for one page of data router feeds.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Result of
+ * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)}
+ */
+ @RequestMapping(value = { FEED_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getDRFeedsByPage(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = getItemListForPageWrapper(request, DmaapDataItem.DR_FEED);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Answers a request for one page of data router publishers.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Result of
+ * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)}
+ */
+ @RequestMapping(value = { PUB_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getDRPubsByPage(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = getItemListForPageWrapper(request, DmaapDataItem.DR_PUB);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Answers a request for one page of data router subscribers.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Result of
+ * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)}
+ */
+ @RequestMapping(value = { SUB_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getDRSubsByPage(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = getItemListForPageWrapper(request, DmaapDataItem.DR_SUB);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Adds a feed with the specified information. Expects a JSON block in the
+ * request body - a Feed object.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return a JSON object; on success it has a "status" and possibly a "data"
+ * item; on failure, also has an "error" item.
+ */
+ @RequestMapping(value = { FEED_PATH }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String addDRFeed(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = addItem(request, DmaapDataItem.DR_FEED, null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Adds a publisher with the specified information. Expects a JSON block in
+ * the request body - a DR_Pub object.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return a JSON object; on success it has a "status" and possibly a "data"
+ * item; on failure, also has an "error" item.
+ */
+ @RequestMapping(value = { PUB_PATH }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String addDRPub(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = addItem(request, DmaapDataItem.DR_PUB, HttpServletResponse.SC_CREATED);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Adds a subscriber with the specified information. Expects a JSON block in
+ * the request body - a DR_Sub object.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return a JSON object; on success it has a "status" and possibly a "data"
+ * item; on failure, also has an "error" item.
+ */
+ @RequestMapping(value = { SUB_PATH }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String addDRSub(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = addItem(request, DmaapDataItem.DR_SUB, HttpServletResponse.SC_CREATED);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Updates a feed with the specified information. Expects a JSON block in
+ * the request body - a Feed object.
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return a JSON object; on success it has a "status" and possibly a "data"
+ * item; on failure, also has an "error" item.
+ */
+ @RequestMapping(value = { FEED_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json")
+ @ResponseBody
+ public String updateFeed(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = updateItem(request, DmaapDataItem.DR_FEED, Long.toString(id), null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Updates a publisher with the specified information. Expects a JSON block
+ * in the request body - a DR_Pub object.
+ *
+ * The pubId may have a dot in it. Spring, in its infinite wisdom, truncates
+ * extensions on dotted path parameters; e.g., "foo.json" becomes "foo".
+ * Avoid truncation here with the extra ":.+" incantation at the end.
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return a JSON object; on success it has a "status" and possibly a "data"
+ * item; on failure, also has an "error" item.
+ */
+ @RequestMapping(value = { PUB_PATH + "/{id:.+}" }, method = RequestMethod.PUT, produces = "application/json")
+ @ResponseBody
+ public String updateDRPub(@PathVariable("id") String id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = updateItem(request, DmaapDataItem.DR_PUB, id, null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Updates a subscriber with the specified information. Expects a JSON block
+ * in the request body - a DR_Sub object.
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return a JSON object; on success it has a "status" and possibly a "data"
+ * item; on failure, also has an "error" item.
+ */
+ @RequestMapping(value = { SUB_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json")
+ @ResponseBody
+ public String updateDRSub(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = updateItem(request, DmaapDataItem.DR_SUB, Long.toString(id), null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Deletes a feed with the ID specified as a path parameter. On successful
+ * delete the endpoint returns 204 (confusingly).
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return A JSON object as an HTTP response; on success it only has
+ * "status" item; on failure, also has an "error" item.
+ */
+ @RequestMapping(value = { FEED_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json")
+ @ResponseBody
+ public String deleteDRFeed(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = deleteItem(request, DmaapDataItem.DR_FEED, Long.toString(id), 204);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Deletes the publisher with the ID specified as a path parameter.
+ *
+ * The pubId may have a dot in it. Spring, in its infinite wisdom, truncates
+ * extensions on dotted path parameters; e.g., "foo.json" becomes "foo".
+ * Avoid truncation here with the extra ":.+" incantation at the end.
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return a JSON object; on success it only has "status" item; on failure,
+ * also has an "error" item.
+ */
+ @RequestMapping(value = { PUB_PATH + "/{id:.+}" }, method = RequestMethod.DELETE, produces = "application/json")
+ @ResponseBody
+ public String deleteDRPub(@PathVariable("id") String id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = deleteItem(request, DmaapDataItem.DR_PUB, id, null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Deletes the subscriber with the ID specified as a path parameter.
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return A JSON object; on success it only has "status" item; on failure,
+ * also has an "error" item.
+ */
+ @RequestMapping(value = { SUB_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json")
+ @ResponseBody
+ public String deleteDRSub(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = deleteItem(request, DmaapDataItem.DR_SUB, Long.toString(id), 204);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Answers a request for data router feed classification labels, such as
+ * "Customer Proprietary", which are read from properties.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return List of string values
+ */
+ @RequestMapping(value = { FEED_PATH + "_pii_types" }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public List<String> getDRFeedPiiType(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ ArrayList<String> response = new ArrayList<>();
+ String[] propKeys = appProperties.getCsvListProperty(DbcappProperties.DMAAP_PII_TYPE_LIST);
+ for (String key : propKeys)
+ response.add(appProperties.getProperty(key));
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java
new file mode 100644
index 0000000..517af09
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DbcappRestrictedBaseController.java
@@ -0,0 +1,968 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.controller;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.openecomp.dcae.dmaapbc.client.DmaapBcRestClient;
+import org.openecomp.dcae.dmaapbc.client.HttpStatusAndResponse;
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.DmaapAccess;
+import org.openecomp.dcae.dmaapbc.dbcapp.rest.DbcUsvcRestClient;
+import org.openecomp.dcae.dmaapbc.dbcapp.service.DmaapAccessService;
+import org.openecomp.dcae.dmaapbc.dbcapp.util.DbcappProperties;
+import org.openecomp.dcae.dmaapbc.model.DR_Pub;
+import org.openecomp.dcae.dmaapbc.model.DR_Sub;
+import org.openecomp.dcae.dmaapbc.model.DcaeLocation;
+import org.openecomp.dcae.dmaapbc.model.Dmaap;
+import org.openecomp.dcae.dmaapbc.model.DmaapObject;
+import org.openecomp.dcae.dmaapbc.model.ErrorResponse;
+import org.openecomp.dcae.dmaapbc.model.Feed;
+import org.openecomp.dcae.dmaapbc.model.MR_Client;
+import org.openecomp.dcae.dmaapbc.model.Topic;
+import org.openecomp.portalsdk.core.controller.RestrictedBaseController;
+import org.openecomp.portalsdk.core.domain.User;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.onboarding.util.CipherUtil;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * This base class provides utility methods to child controllers. All of the
+ * requests are forwarded on to a remote REST API, so there's a large degree of
+ * commonality among the implementations. Combining them kept the lines-of-code
+ * count down, at the expense of some complexity.
+ */
+public class DbcappRestrictedBaseController extends RestrictedBaseController {
+
+ /**
+ * Query parameter for desired page number
+ */
+ protected static final String PAGE_NUM_QUERY_PARAM = "pageNum";
+
+ /**
+ * Query parameter for desired items per page
+ */
+ protected static final String VIEW_PER_PAGE_QUERY_PARAM = "viewPerPage";
+
+ /**
+ * Tag for status code in JSON responses - ALWAYS PRESENT.
+ */
+ protected static final String STATUS_RESPONSE_KEY = "status";
+
+ /**
+ * Tag for data in JSON responses.
+ */
+ protected static final String DATA_RESPONSE_KEY = "data";
+
+ /**
+ * Tag for error message in JSON responses; absent on success.
+ */
+ protected static final String ERROR_RESPONSE_KEY = "error";
+
+ /**
+ * Tag for response integer, pages required to display complete result list
+ */
+ protected static final String TOTAL_PAGES_RESPONSE_KEY = "totalPages";
+
+ /**
+ * Tag for DMaaP name obtained from REST client.
+ */
+ protected static final String PROFILE_NAME_RESPONSE_KEY = "profileName";
+
+ /**
+ * Tag for DMaaP name obtained from REST client.
+ */
+ protected static final String DMAAP_NAME_RESPONSE_KEY = "dmaapName";
+
+ /**
+ * Tag for DCAE location name list obtained from REST client.
+ */
+ protected static final String DCAE_LOCATIONS_RESPONSE_KEY = "dcaeLocations";
+
+ /**
+ * Logger that conforms with ECOMP guidelines
+ */
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DbcappRestrictedBaseController.class);
+
+ /**
+ * For general use in these methods and subclasses
+ */
+ protected final ObjectMapper mapper = new ObjectMapper();
+
+ /**
+ * DAO accesses the profiles via a local database. REST accesses the
+ * profiles via a remote REST service.
+ */
+ public enum AccessMethod {
+ DAO, REST
+ };
+
+ /**
+ * Enum for selecting an item type.
+ */
+ public enum DmaapDataItem {
+ DR_FEED, DR_PUB, DR_SUB, MR_TOPIC, MR_CLIENT;
+ }
+
+ /**
+ * Application properties - NOT available to constructor.
+ */
+ @Autowired
+ private DbcappProperties appProperties;
+
+ /**
+ * Database access - which might not be used.
+ */
+ @Autowired
+ private DmaapAccessService dmaapAccessDaoServiceAuto;
+
+ /**
+ * Read from application properties.
+ */
+ private String mechIdName, mechIdPass;
+
+ /**
+ * This is set by {@link #getDmaapAccessService()} to the DAO or REST
+ * implementation as configured in properties.
+ */
+ private DmaapAccessService dmaapAccessService;
+
+ /**
+ * Hello Spring, here's your no-arg constructor.
+ */
+ public DbcappRestrictedBaseController() {
+ // Do not serialize null values
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ /**
+ * Access method for subclasses.
+ *
+ * @return DbcappProperties object that was autowired by Spring.
+ */
+ protected DbcappProperties getAppProperties() {
+ return appProperties;
+ }
+
+ /**
+ * Lazy initialization. As a side effect, caches mech ID and password.
+ *
+ * @return Either DAO or REST client that implements the access service
+ * interface.
+ */
+ protected DmaapAccessService getDmaapAccessService() {
+ if (dmaapAccessService != null)
+ return dmaapAccessService;
+
+ // Get the application's mechid
+ mechIdName = appProperties.getProperty(DbcappProperties.DMAAP_MECHID_NAME);
+ // This is encrypted
+ String cipher = appProperties.getProperty(DbcappProperties.DMAAP_MECHID_PASSWORD);
+ if (mechIdName == null || cipher == null)
+ throw new RuntimeException("Failed to get MECH_ID name and/or password from properties");
+ try {
+ mechIdPass = CipherUtil.decrypt(cipher);
+ } catch (Exception ex) {
+ throw new RuntimeException("Failed to decrypt password from config file", ex);
+ }
+
+ String accessMethod = appProperties.getProperty(DbcappProperties.PROFILE_ACCESS_METHOD);
+ if (accessMethod == null)
+ throw new RuntimeException("Failed to get property " + DbcappProperties.PROFILE_ACCESS_METHOD);
+ AccessMethod profileAccessMethod = AccessMethod.valueOf(accessMethod.toUpperCase());
+ if (AccessMethod.DAO == profileAccessMethod) {
+ // Spring auto-wired this field
+ dmaapAccessService = dmaapAccessDaoServiceAuto;
+ } else {
+ String url = appProperties.getProperty(DbcappProperties.PROFILE_USVC_URL);
+ String user = appProperties.getProperty(DbcappProperties.PROFILE_USVC_USER);
+ String pass = appProperties.getProperty(DbcappProperties.PROFILE_USVC_PASS);
+ if (url == null || user == null || pass == null)
+ throw new RuntimeException("getDmaapAccessService: missing property: one of url, user, pass");
+ String clearText = null;
+ try {
+ clearText = CipherUtil.decrypt(pass);
+ } catch (Exception ex) {
+ throw new RuntimeException("getDmaapAccessService: failed to decrypt password from config");
+ }
+ dmaapAccessService = new DbcUsvcRestClient(url, user, clearText);
+ }
+ return dmaapAccessService;
+ }
+
+ /**
+ * Creates a REST client with appropriate credentials, the user/pass from
+ * the access profile if present, otherwise with the default mech ID and
+ * password.
+ *
+ * @param dmaapAccess
+ * Profile
+ * @return REST client.
+ */
+ protected DmaapBcRestClient getDmaapBcRestClient(DmaapAccess dmaapAccess) {
+ DmaapBcRestClient restClient = null;
+ if (dmaapAccess.getMechId() == null || dmaapAccess.getMechId().length() == 0)
+ restClient = new DmaapBcRestClient(dmaapAccess.getDmaapUrl(), mechIdName, mechIdPass);
+ else
+ restClient = new DmaapBcRestClient(dmaapAccess.getDmaapUrl(), dmaapAccess.getMechId(),
+ dmaapAccess.getPassword());
+ return restClient;
+ }
+
+ /**
+ * Pulls out of the specified list the appropriate items for the page of
+ * results specified by the page number and view-per-page parameters.
+ *
+ * @param pageNum
+ * Page number requested by user
+ * @param viewPerPage
+ * Number of items per page
+ * @param itemList
+ * List of items available
+ * @return List of items to display
+ */
+ @SuppressWarnings("rawtypes")
+ private static List shrinkListToPage(final int pageNum, final int viewPerPage, final List itemList) {
+ // user-friendly page numbers index from 1
+ int firstIndexOnThisPage = viewPerPage * (pageNum - 1);
+ int firstIndexOnNextPage = viewPerPage * pageNum;
+ int fromIndex = firstIndexOnThisPage < itemList.size() ? firstIndexOnThisPage : itemList.size();
+ int toIndex = firstIndexOnNextPage < itemList.size() ? firstIndexOnNextPage : itemList.size();
+ // answers empty list if from==to
+ return itemList.subList(fromIndex, toIndex);
+ }
+
+ /**
+ * Gets the body of a HTTP request assuming UTF-8 encoding.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return String version of request body
+ * @throws IOException
+ * If the read fails
+ */
+ protected static String getBody(HttpServletRequest request) throws IOException {
+ StringBuilder stringBuilder = new StringBuilder();
+ BufferedReader bufferedReader = null;
+ try {
+ InputStream inputStream = request.getInputStream();
+ if (inputStream != null) {
+ bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
+ char[] charBuffer = new char[512];
+ 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;
+ }
+ }
+
+ }
+ return stringBuilder.toString();
+ }
+
+ /**
+ * Builds a JSON success response from the specified inputs.
+ *
+ * @param statusCode
+ * e.g., 200 for OK
+ * @param dataPojo
+ * Plain old Java object to serialize as JSON; ignored if null.
+ * @throws JsonProcessingException
+ * If the POJO cannot be serialized
+ * @return JSON block with items "status" : 200 and "data" : (data..)
+ */
+ protected String buildJsonSuccess(int statusCode, Object dataPojo) throws JsonProcessingException {
+ Map<String, Object> model = new HashMap<String, Object>();
+ model.put(STATUS_RESPONSE_KEY, statusCode);
+ if (dataPojo != null)
+ model.put(DATA_RESPONSE_KEY, dataPojo);
+ String json = mapper.writeValueAsString(model);
+ return json;
+ }
+
+ /**
+ * Builds a JSON error response from the specified inputs.
+ *
+ * @param statusCode
+ * e.g., 500 for internal server error
+ * @param errMsg
+ * Information about the operation that failed
+ * @param exception
+ * Converted to string; ignored if null.
+ * @return JSON block with tags "status" and "error".
+ */
+ protected String buildJsonError(int statusCode, String errMsg, Exception exception) {
+ Map<String, Object> model = new HashMap<String, Object>();
+ model.put(STATUS_RESPONSE_KEY, new Integer(500));
+ if (exception == null) {
+ model.put(ERROR_RESPONSE_KEY, errMsg);
+ } else {
+ final int enough = 512;
+ String exString = exception.toString();
+ String exceptionMsg = exString.length() > enough ? exString.substring(0, enough) : exString;
+ model.put(ERROR_RESPONSE_KEY, errMsg + ": " + exceptionMsg);
+ }
+ String json = null;
+ try {
+ json = mapper.writeValueAsString(model);
+ } catch (JsonProcessingException ex) {
+ // serializing the trivial map should never fail
+ String err = "buildJsonError: failed to serialize";
+ logger.error(EELFLoggerDelegate.errorLogger, err, ex);
+ throw new RuntimeException(err, ex);
+ }
+ return json;
+ }
+
+ /**
+ * Gets a list of DMaaP access profiles for this user from the database. The
+ * profiles have passwords in the clear - this method decrypts the database
+ * entries.
+ *
+ * Initializes the list for new users and/or configuration changes. Checks
+ * the database list against the configured list of URLs, and creates new
+ * rows for any configured URLs not present for the user. Most environments
+ * are expected to have exactly one valid URL, and the webapp uses a fixed
+ * MechID to authenticate itself to the DMaaP bus controller, so this
+ * approach means new users can start without any setup of URLs.
+ *
+ * @param userId
+ * User ID
+ * @return List of DmaapAccess objects
+ * @throws Exception
+ * If the URL list is not available in properties
+ */
+ protected List<DmaapAccess> getOrInitDmaapAccessList(String userId) throws Exception {
+ String[] configUrls = getAppProperties().getCsvListProperty(DbcappProperties.DMAAP_REST_URL_LIST);
+ if (configUrls == null || configUrls.length == 0)
+ throw new Exception("getOrInitDmaapAccessList: Failed to get DMAAP REST URL list");
+ // Update this list to track which URLs are in the database.
+ List<String> configUrlList = new ArrayList<String>(configUrls.length);
+ for (String c : configUrls) {
+ // Validate URL to detect config botches
+ URL url = new URL(c);
+ configUrlList.add(url.toExternalForm());
+ }
+
+ List<DmaapAccess> dbAccessList = getDmaapAccessService().getDmaapAccessList(userId);
+
+ // Check the database entries against the configuration. Also
+ // build a list of non-DAO objects with clear-text passwords.
+ List<DmaapAccess> clearList = new ArrayList<DmaapAccess>(dbAccessList.size());
+ for (DmaapAccess dmaapAccess : dbAccessList) {
+ // drop this URL from the list.
+ // If it's not known to config, complain because that's a bogus row.
+ if (!configUrlList.remove(dmaapAccess.getDmaapUrl()))
+ logger.warn(EELFLoggerDelegate.errorLogger, "getOrInitDmaapAccessList: detected extra URL {}",
+ dmaapAccess.getDmaapUrl());
+ // Return cleartext in JSON
+ DmaapAccess clone = new DmaapAccess(dmaapAccess);
+ clone.setPassword(clone.decryptPassword());
+ clearList.add(clone);
+ }
+
+ // Create new rows for any configured URLs not found for this user.
+ for (int i = 0; i < configUrlList.size(); ++i) {
+ String missUrl = configUrlList.get(i);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getOrInitDmaapAccessList: adding missing URL {}", missUrl);
+ DmaapAccess newDmaapAccess = new DmaapAccess();
+ // Create a semi-reasonable name for the table
+ newDmaapAccess.setName("dmaap-" + Integer.toString(i + 1));
+ newDmaapAccess.setUserId(userId);
+ newDmaapAccess.setDmaapUrl(missUrl);
+ // Write to db.
+ getDmaapAccessService().saveDmaapAccess(newDmaapAccess);
+ // Add to response, which assumes the write was successful.
+ clearList.add(newDmaapAccess);
+ }
+
+ return clearList;
+ }
+
+ /**
+ * Gets the user's selected DMaaP access profile.
+ *
+ * @param userId
+ * User ID
+ * @return DmaapAccess object that is currently selected, or the first one
+ * found if none are selected; null if no access profiles are
+ * configured.
+ * @throws Exception
+ * If the profile is not found
+ */
+ protected DmaapAccess getSelectedDmaapAccess(String userId) throws Exception {
+ List<DmaapAccess> profiles = getOrInitDmaapAccessList(userId);
+ if (profiles.size() == 0) {
+ logger.debug("getSelectedDmaapAccess: no rows found, returning null");
+ return null;
+ }
+
+ // Return the first one by default if nothing is selected.
+ DmaapAccess selected = profiles.get(0);
+ for (DmaapAccess da : profiles)
+ if (da.getSelected())
+ selected = da;
+
+ return selected;
+ }
+
+ /**
+ * Supports sorting a list of feeds by the first column displayed: ID
+ */
+ private static Comparator<DmaapObject> feedComparator = new Comparator<DmaapObject>() {
+ @Override
+ public int compare(DmaapObject o1, DmaapObject o2) {
+ Feed f1 = (Feed) o1;
+ Feed f2 = (Feed) o2;
+ // sort these numbers lexicographically, same as the front end
+ // table.
+ return f1.getFeedId().compareTo(f2.getFeedId());
+ }
+ };
+
+ /**
+ * Supports sorting a list of publishers by the first column displayed: pub
+ * ID
+ */
+ private static Comparator<DmaapObject> pubComparator = new Comparator<DmaapObject>() {
+ @Override
+ public int compare(DmaapObject o1, DmaapObject o2) {
+ DR_Pub p1 = (DR_Pub) o1;
+ DR_Pub p2 = (DR_Pub) o2;
+ return p1.getPubId().compareTo(p2.getPubId());
+ }
+ };
+
+ /**
+ * Supports sorting a list of subscribers by the first column displayed: sub
+ * ID
+ */
+ private static Comparator<DmaapObject> subComparator = new Comparator<DmaapObject>() {
+ @Override
+ public int compare(DmaapObject o1, DmaapObject o2) {
+ DR_Sub s1 = (DR_Sub) o1;
+ DR_Sub s2 = (DR_Sub) o2;
+ // sort these numbers lexicographically, same as the front end
+ // table.
+ return s1.getSubId().compareTo(s2.getSubId());
+ }
+ };
+
+ /**
+ * Supports sorting a list of topics by the first column displayed: FQTN
+ */
+ private static Comparator<DmaapObject> topicComparator = new Comparator<DmaapObject>() {
+ @Override
+ public int compare(DmaapObject o1, DmaapObject o2) {
+ Topic t1 = (Topic) o1;
+ Topic t2 = (Topic) o2;
+ return t1.getFqtn().compareTo(t2.getFqtn());
+ }
+ };
+
+ /**
+ * Supports sorting a list of clients by the first column displayed: client
+ * ID.
+ */
+ private static Comparator<DmaapObject> clientComparator = new Comparator<DmaapObject>() {
+ @Override
+ public int compare(DmaapObject o1, DmaapObject o2) {
+ MR_Client c1 = (MR_Client) o1;
+ MR_Client c2 = (MR_Client) o2;
+ // sort these numbers lexicographically, same as the front end
+ // table.
+ return c1.getMrClientId().compareTo(c2.getMrClientId());
+ }
+ };
+
+ /**
+ * Gets one page of DMaaP objects and supporting information via the Bus
+ * Controller REST client. On success, returns a JSON object as String with
+ * the following tags:
+ * <UL>
+ * <LI>status: Integer; HTTP status code 200.
+ * <LI>dmaapName: String, name returned by the remote DMaaP instance.
+ * <LI>dcaeLocations: Array of string, locations returned by the remote
+ * DMaaP instance.
+ * <LI>data: Array of the desired items; e.g., data router feeds.
+ * <LI>totalPages: Integer, the number of pages required to display the
+ * complete list of items using the submitted page size
+ * </UL>
+ *
+ * This duplicates all of {@link #buildJsonSuccess(int, Object)}.
+ *
+ * @param dmaapAccess
+ * Access details for the DMaaP REST API
+ * @param option
+ * Specifies which item list type to get: data router feeds, etc.
+ * @param pageNum
+ * Page number of results
+ * @param viewPerPage
+ * Number of items per page
+ * @return JSON block as String, see above.
+ * @throws Exception
+ * On any error
+ */
+ private String getItemListForPage(DmaapAccess dmaapAccess, DmaapDataItem option, int pageNum, int viewPerPage)
+ throws Exception {
+ DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess);
+ // Get the instance so the page can display its name
+ DmaapObject dmaap = restClient.getDmaap();
+ if (dmaap instanceof ErrorResponse) {
+ // Bad password is caught here.
+ ErrorResponse err = (ErrorResponse) dmaap;
+ throw new Exception(err.getMessage());
+ }
+ // Get locations for editing
+ List<DmaapObject> dcaeLocations = restClient.getDcaeLocations();
+ if (dcaeLocations.size() == 1 && dcaeLocations.get(0) instanceof ErrorResponse) {
+ // Should never happen - bad password is caught right above - but be
+ // careful.
+ ErrorResponse err = (ErrorResponse) dcaeLocations.get(0);
+ throw new Exception(err.getMessage());
+ }
+ // Pass them back as String array
+ String[] dcaeLocs = new String[dcaeLocations.size()];
+ for (int i = 0; i < dcaeLocs.length; ++i) {
+ DcaeLocation dcaeLoc = (DcaeLocation) dcaeLocations.get(i);
+ dcaeLocs[i] = dcaeLoc.getDcaeLocationName();
+ }
+ // Get the requested item list
+ List<DmaapObject> itemList = null;
+ switch (option) {
+ case DR_FEED:
+ itemList = restClient.getFeeds();
+ // size 1 may be error response
+ if (itemList.size() > 1)
+ Collections.sort(itemList, feedComparator);
+ break;
+ case DR_PUB:
+ itemList = restClient.getDRPubs();
+ // size 1 may be error response
+ if (itemList.size() > 1)
+ Collections.sort(itemList, pubComparator);
+ break;
+ case DR_SUB:
+ itemList = restClient.getDRSubs();
+ // size 1 may be error response
+ if (itemList.size() > 1)
+ Collections.sort(itemList, subComparator);
+ break;
+ case MR_TOPIC:
+ itemList = restClient.getTopics();
+ // size 1 may be error response
+ if (itemList.size() > 1)
+ Collections.sort(itemList, topicComparator);
+ break;
+ case MR_CLIENT:
+ itemList = restClient.getMRClients();
+ // size 1 may be error response
+ if (itemList.size() > 1)
+ Collections.sort(itemList, clientComparator);
+ break;
+ default:
+ throw new Exception("getItemListForPage: pgmr error, unimplemented case: " + option.name());
+ }
+
+ logger.debug("getItemListForPage: list size is {}", itemList.size());
+ int pageCount = (int) Math.ceil((double) itemList.size() / viewPerPage);
+ @SuppressWarnings("unchecked")
+ List<DmaapObject> subList = shrinkListToPage(pageNum, viewPerPage, itemList);
+ itemList = subList;
+ // Build response here
+ Map<String, Object> model = new HashMap<String, Object>();
+ model.put(STATUS_RESPONSE_KEY, new Integer(200));
+ model.put(PROFILE_NAME_RESPONSE_KEY, dmaapAccess.getName());
+ model.put(DMAAP_NAME_RESPONSE_KEY, ((Dmaap) dmaap).getDmaapName());
+ model.put(DCAE_LOCATIONS_RESPONSE_KEY, dcaeLocs);
+ model.put(DATA_RESPONSE_KEY, itemList);
+ model.put(TOTAL_PAGES_RESPONSE_KEY, pageCount);
+
+ // build the response
+ String outboundJson = null;
+ try {
+ outboundJson = mapper.writeValueAsString(model);
+ } catch (Exception ex) {
+ // should never happen
+ logger.error("getItemListForPage: failed to serialize model: ", ex);
+ throw new Exception("sendItemListForPage", ex);
+ }
+
+ return outboundJson;
+ }
+
+ /**
+ * Gets a page of the specified DMaaP items. This method traps errors and
+ * constructs an appropriate JSON block if an error happens.
+ *
+ * See {@link #getItemListForPage(DmaapAccess, DmaapDataItem, int, int)}.
+ *
+ * @param request
+ * Inbound request
+ * @param option
+ * DMaaP item type to get
+ * @return JSON with list of serialized objects, or an error.
+ */
+ protected String getItemListForPageWrapper(HttpServletRequest request, DmaapDataItem option) {
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("getItemListForPageWrapper: Failed to get Login UID");
+ DmaapAccess selected = getSelectedDmaapAccess(appUser.getLoginId());
+ if (selected == null) // leap into exception handler
+ throw new Exception("No DMaaP access profiles are configured.");
+ int pageNum = Integer.parseInt(request.getParameter(PAGE_NUM_QUERY_PARAM));
+ int viewPerPage = Integer.parseInt(request.getParameter(VIEW_PER_PAGE_QUERY_PARAM));
+ outboundJson = getItemListForPage(selected, option, pageNum, viewPerPage);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to get DMaaP item type " + option.name(), ex);
+ }
+ return outboundJson;
+ }
+
+ /**
+ * Adds an item of the specified type with the specified content. Constructs
+ * an object by deserializing the JSON block, but ignores any ID field that
+ * is supplied.
+ *
+ * On success, returns a JSON block as String with any data returned by the
+ * REST client. Throws an exception on any failure.
+ *
+ * @param dmaapAccess
+ * Access details for the DMaaP REST API
+ * @param userId
+ * The login ID of the user making the request
+ * @param itemType
+ * DMaaP item type to add
+ * @param itemContent
+ * JSON block to deserialize as an object
+ * @param scAddlStatus
+ * HTTP status code 200 is always accepted. If this parameter is
+ * not null, the value is also considered a valid HTTP status
+ * code on success; e.g., 204.
+ * @return JSON object with result of the operation
+ * @throws Exception
+ * on any problem
+ */
+ private String addDmaapItem(DmaapAccess dmaapAccess, String userId, DmaapDataItem itemType, String itemContent,
+ Integer scAddlStatus) throws Exception {
+ DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess);
+ HttpStatusAndResponse<Object> hsr = null;
+ switch (itemType) {
+ case DR_FEED:
+ Feed feed = mapper.readValue(itemContent, Feed.class);
+ logger.debug("addDmaapItem: received feed: {} ", feed);
+ // Null out any ID to get an auto-generated ID
+ feed.setFeedId(null);
+ // Assign the owner to be the webapp user
+ feed.setOwner(userId);
+ hsr = restClient.postFeed(feed);
+ break;
+ case DR_PUB:
+ DR_Pub pub = mapper.readValue(itemContent, DR_Pub.class);
+ logger.debug("addDmaapItem: received pub: {} ", pub);
+ // Null out any ID to get an auto-generated ID
+ pub.setPubId(null);
+ hsr = restClient.postDRPub(pub);
+ break;
+ case DR_SUB:
+ DR_Sub sub = mapper.readValue(itemContent, DR_Sub.class);
+ logger.debug("addDmaapItem: received sub: {} ", sub);
+ // Null out any ID to get an auto-generated ID
+ sub.setSubId(null);
+ // Assign the owner to be the webapp user
+ sub.setOwner(userId);
+ hsr = restClient.postDRSub(sub);
+ break;
+ case MR_TOPIC:
+ Topic topic = mapper.readValue(itemContent, Topic.class);
+ logger.debug("addDmaapItem: received topic: {} ", topic);
+ // No ID on topic
+ topic.setOwner(userId);
+ hsr = restClient.postTopic(topic);
+ break;
+ case MR_CLIENT:
+ MR_Client client = mapper.readValue(itemContent, MR_Client.class);
+ logger.debug("addDmaapItem: received client: {} ", client);
+ client.setMrClientId(null);
+ hsr = restClient.postMRClient(client);
+ break;
+ default:
+ throw new Exception("addDmaapItem: pgmr error, unimplemented case: " + itemType.name());
+ }
+
+ // Build result here
+ String outboundJson = null;
+ if (hsr.getStatusCode() == HttpServletResponse.SC_OK
+ || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) {
+ outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString());
+ } else {
+ throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode())
+ + " with content " + hsr.getResponseString());
+ }
+ return outboundJson;
+ }
+
+ /**
+ * Adds the specified DMaaP item that is read from the request body. This
+ * method traps errors and constructs an appropriate JSON block if an error
+ * happens.
+ *
+ * @param request
+ * Used to obtain user info from the active session
+ * @param itemType
+ * DMaaP item type to add
+ * @param scAddlStatus
+ * HTTP status code 200 is always accepted. If this parameter is
+ * not null, the value is also considered a valid HTTP status
+ * code on success; e.g., 204.
+ * @return JSON block with success or failure object
+ */
+ protected String addItem(HttpServletRequest request, DmaapDataItem itemType, Integer scAddlStatus) {
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("addDmaapItem: Failed to get Login ID");
+
+ DmaapAccess access = getSelectedDmaapAccess(appUser.getLoginId());
+ if (access == null) // leap into exception handler
+ throw new Exception("No DMaaP access profiles are configured.");
+ String jsonContent = getBody(request);
+ outboundJson = addDmaapItem(access, appUser.getLoginId(), itemType, jsonContent, scAddlStatus);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to add DMaaP item " + itemType.name(), ex);
+ }
+
+ return outboundJson;
+ }
+
+ /**
+ * Updates an item of the specified type with the specified content.
+ * Constructs an object by deserializing the JSON block.
+ *
+ * On success, returns a JSON block as String with any data returned by the
+ * REST client. Throws an exception on any failure.
+ *
+ * @param dmaapAccess
+ * Access details for the DMaaP REST API
+ * @param userId
+ * The Login ID of the user making the request
+ * @param itemType
+ * DMaaP item type to update
+ * @param itemId
+ * Item identification
+ * @param itemContent
+ * JSON block to deserialize as an object
+ * @param scAddlStatus
+ * HTTP status code 200 is always accepted. If this parameter is
+ * not null, the value is also considered a valid HTTP status
+ * code on success; e.g., 204.
+ * @return JSON object with result of the operation
+ * @throws Exception
+ * on any problem
+ */
+ private String updateDmaapItem(DmaapAccess dmaapAccess, String userId, DmaapDataItem itemType, String itemId,
+ String itemContent, Integer scAddlStatus) throws Exception {
+ DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess);
+ HttpStatusAndResponse<Object> hsr = null;
+ switch (itemType) {
+ case DR_FEED:
+ Feed feed = mapper.readValue(itemContent, Feed.class);
+ logger.debug("updateDmaapItem: received feed: {} ", feed);
+ // Ensure the owner is the webapp user
+ feed.setOwner(userId);
+ hsr = restClient.putFeed(feed);
+ break;
+ case DR_PUB:
+ DR_Pub pub = mapper.readValue(itemContent, DR_Pub.class);
+ logger.debug("updateDmaapItem: received pub: {} ", pub);
+ hsr = restClient.putDRPub(pub);
+ break;
+ case DR_SUB:
+ DR_Sub sub = mapper.readValue(itemContent, DR_Sub.class);
+ logger.debug("updateDmaapItem: received sub: {} ", sub);
+ // Ensure the owner is the webapp user
+ sub.setOwner(userId);
+ hsr = restClient.putDRSub(sub);
+ break;
+ case MR_TOPIC:
+ Topic topic = mapper.readValue(itemContent, Topic.class);
+ logger.debug("updateDmaapItem: received topic: {} ", topic);
+ // Ensure the owner is the webapp user
+ topic.setOwner(userId);
+ // DCAE backend may implement PUT someday.
+ if (true && userId != null)
+ throw new UnsupportedOperationException("put topic not supported (yet)");
+ break;
+ case MR_CLIENT:
+ MR_Client client = mapper.readValue(itemContent, MR_Client.class);
+ logger.debug("updateDmaapItem: received client: {} ", client);
+ hsr = restClient.putMRClient(client);
+ break;
+ default:
+ throw new Exception("updateDmaapItem: pgmr error, unimplemented case: " + itemType.name());
+ }
+
+ // Build result here
+ String outboundJson = null;
+ if (hsr.getStatusCode() == HttpServletResponse.SC_OK
+ || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) {
+ outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString());
+ } else {
+ throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode())
+ + " with content " + hsr.getResponseString());
+ }
+ return outboundJson;
+ }
+
+ /**
+ * Updates the specified DMaaP item that is read from the request body. This
+ * method traps errors and constructs an appropriate JSON block if an error
+ * happens.
+ *
+ * @param request
+ * Used to obtain user info from the active session
+ * @param itemType
+ * DMaaP item type to update
+ * @param itemId
+ * Item identification to update
+ * @param scUpdatelStatus
+ * HTTP status code 200 is always accepted. If this parameter is
+ * not null, the value is also considered a valid HTTP status
+ * code on success; e.g., 204.
+ * @return JSON object with success or error information.
+ */
+ protected String updateItem(HttpServletRequest request, DmaapDataItem itemType, String itemId,
+ Integer scUpdatelStatus) {
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("updateItem: Failed to get Login ID");
+ DmaapAccess access = getSelectedDmaapAccess(appUser.getLoginId());
+ if (access == null) // leap into exception handler
+ throw new Exception("No DMaaP access profiles are configured.");
+ String jsonContent = getBody(request);
+ outboundJson = updateDmaapItem(access, appUser.getLoginId(), itemType, itemId, jsonContent,
+ scUpdatelStatus);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to update DMaaP item " + itemType.name(), ex);
+ }
+
+ return outboundJson;
+ }
+
+ /**
+ * Deletes an item of the specified type with the specified ID.
+ *
+ * @param dmaapAccess
+ * Access details for the DMaaP REST API
+ * @param itemType
+ * DMaaP item type to delete
+ * @param itemId
+ * Item identification
+ * @param scAddlStatus
+ * HTTP status code 200 is always accepted. If this parameter is
+ * not null, the value is also considered a valid HTTP status
+ * code on success; e.g., 204.
+ * @return On success, returns a JSON block as String with any data returned
+ * by the REST client.
+ * @throws Exception
+ * On any failure.
+ */
+ private String deleteDmaapItem(DmaapAccess dmaapAccess, DmaapDataItem itemType, String itemId, Integer scAddlStatus)
+ throws Exception {
+ DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess);
+ HttpStatusAndResponse<Object> hsr = null;
+ switch (itemType) {
+ case DR_FEED:
+ hsr = restClient.deleteFeed(itemId);
+ break;
+ case DR_PUB:
+ hsr = restClient.deleteDRPub(itemId);
+ break;
+ case DR_SUB:
+ hsr = restClient.deleteDRSub(itemId);
+ break;
+ case MR_TOPIC:
+ hsr = restClient.deleteTopic(itemId);
+ break;
+ case MR_CLIENT:
+ hsr = restClient.deleteMRClient(itemId);
+ break;
+ default:
+ throw new Exception("deleteDmaapItem: pgmr error, unimplemented case: " + itemType.name());
+ }
+
+ // Build result here
+ String outboundJson = null;
+ if (hsr.getStatusCode() == HttpServletResponse.SC_OK
+ || (scAddlStatus != null && hsr.getStatusCode() == scAddlStatus)) {
+ outboundJson = buildJsonSuccess(hsr.getStatusCode(), hsr.getResponseString());
+ } else {
+ throw new Exception("Unexpected HTTP response code " + Integer.toString(hsr.getStatusCode())
+ + " with content " + hsr.getResponseString());
+ }
+ return outboundJson;
+ }
+
+ /**
+ * Deletes the specified DMaaP item. This method traps errors and constructs
+ * an appropriate JSON block if an error happens.
+ *
+ * @param request
+ * Used to obtain user info from the active session
+ * @param itemType
+ * DMaaP item type to delete
+ * @param itemId
+ * item ID to delete
+ * @param scAddlStatus
+ * HTTP status code 200 is always accepted. If this parameter is
+ * not null, the value is also considered a valid HTTP status
+ * code on success; e.g., 204.
+ * @return JSON object with success or error information.
+ */
+ protected String deleteItem(HttpServletRequest request, DmaapDataItem itemType, String itemId,
+ Integer scAddlStatus) {
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("deleteItem: Failed to get Login ID");
+ DmaapAccess selected = getSelectedDmaapAccess(appUser.getLoginId());
+ if (selected == null) // leap into exception handler
+ throw new Exception("No DMaaP access profiles are configured.");
+ outboundJson = deleteDmaapItem(selected, itemType, itemId, scAddlStatus);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to delete DMaaP item " + itemType.name() + " ID " + itemId, ex);
+ }
+ return outboundJson;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DmaapAccessController.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DmaapAccessController.java
new file mode 100644
index 0000000..5f81a74
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/DmaapAccessController.java
@@ -0,0 +1,356 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.controller;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.openecomp.dcae.dmaapbc.client.DmaapBcRestClient;
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.DmaapAccess;
+import org.openecomp.dcae.dmaapbc.model.Dmaap;
+import org.openecomp.dcae.dmaapbc.model.DmaapObject;
+import org.openecomp.dcae.dmaapbc.model.ErrorResponse;
+import org.openecomp.portalsdk.core.domain.User;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.openecomp.portalsdk.core.web.support.UserUtils;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * DMaaP Access controller: serves Ajax requests made by Angular on pages where
+ * the user adds, edits and deletes DMaaP access profiles. This controller must
+ * defend the database against rogue requests including SQL injection attacks.
+ */
+@Controller
+@RequestMapping("/")
+public class DmaapAccessController extends DbcappRestrictedBaseController {
+
+ /**
+ * Logger that conforms with ECOMP guidelines
+ */
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DmaapAccessController.class);
+
+ private static final String DMAAP_ACCESS_PATH = "/dmaap_access";
+ private static final String SELECT_DMAAP_ACCESS_PATH = "/select_dmaap_access";
+
+ /**
+ * For general use in these methods
+ */
+ private final ObjectMapper mapper;
+
+ /**
+ * Never forget that Spring autowires fields AFTER the constructor is
+ * called.
+ */
+ public DmaapAccessController() {
+ mapper = new ObjectMapper();
+ }
+
+ /**
+ * Gets a list of DMaaP access profiles for this user from the database and
+ * returns them in a JSON array nested within a response object. Traps errors and constructs an appropriate JSON block if an error
+ * happens.
+ *
+ * See {@link #getOrInitDmaapAccessList(String)}.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return JSON with access profiles, or an error JSON if the request fails.
+ */
+ @RequestMapping(value = { DMAAP_ACCESS_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getDmaapAccessList(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("getDmaapAccessList: Failed to get Login ID");
+ List<DmaapAccess> dbAccessList = getOrInitDmaapAccessList(appUser.getLoginId());
+ // Wrap the list in the status indicator.
+ Map<String, Object> model = new HashMap<String, Object>();
+ model.put(STATUS_RESPONSE_KEY, new Integer(200));
+ model.put(DATA_RESPONSE_KEY, dbAccessList);
+ outboundJson = mapper.writeValueAsString(model);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to get DMaaP access profile list", ex);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return outboundJson;
+ }
+
+ /**
+ * Adds a DMaaP access profile for the requesting user ID; ignores any
+ * values for row ID and user ID in the body. Traps errors and
+ * constructs an appropriate JSON block if an error happens.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Trivial JSON object indicating success or failure.
+ */
+ @RequestMapping(value = { DMAAP_ACCESS_PATH }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String addDmaapAccess(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("addDmaapAccess: Failed to get Login ID");
+
+ DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class);
+ logger.debug("addDmaapAccess: received object: {} ", dmaapAccess);
+
+ // Null out ID to get an auto-generated ID
+ dmaapAccess.setId(null);
+ // Overwrite any submitted user id
+ dmaapAccess.setUserId(appUser.getLoginId());
+ // Encrypt password
+ if (dmaapAccess.getPassword() != null)
+ dmaapAccess.encryptPassword(dmaapAccess.getPassword());
+
+ // Create a new row
+ getDmaapAccessService().saveDmaapAccess(dmaapAccess);
+
+ // Answer success
+ outboundJson = buildJsonSuccess(200, null);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to add DMaaP access profile", ex);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return outboundJson;
+ }
+
+ /**
+ * Updates a DMaaP access profile if the row user ID matches the requesting
+ * user ID. Traps errors and
+ * constructs an appropriate JSON block if an error happens.
+ *
+ * @param id
+ * Path parameter with ID of the DMaaP access profile
+ * @param request
+ * HttpServletRequest
+ * @return Trivial JSON object indicating success or failure.
+ */
+ @RequestMapping(value = { DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json")
+ @ResponseBody
+ public String updateDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("updateDmaapAccess: Failed to get Login ID");
+
+ DmaapAccess domainObj = getDmaapAccessService().getDmaapAccess(id);
+ if (!appUser.getLoginId().equals(domainObj.getUserId()))
+ throw new Exception("updateDmaapAccess: mismatch of appUser and row user ID");
+
+ DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class);
+ logger.debug("updateDmaapAccess: received object: {} ", dmaapAccess);
+
+ // Use the path-parameter id; don't trust the one in the object
+ dmaapAccess.setId(id);
+ // Encrypt password if present
+ if (dmaapAccess.getPassword() != null)
+ dmaapAccess.encryptPassword(dmaapAccess.getPassword());
+
+ // Update the existing row
+ getDmaapAccessService().saveDmaapAccess(dmaapAccess);
+
+ // Answer "OK"
+ outboundJson = buildJsonSuccess(200, null);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to update DMaaP access profile", ex);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return outboundJson;
+ }
+
+ /**
+ * Deletes a DMaaP access profile if the row user ID matches the requesting
+ * user ID. Traps errors and
+ * constructs an appropriate JSON block if an error happens.
+ *
+ * @param id
+ * Path parameter with ID of the DMaaP access profile
+ * @param request
+ * HttpServletRequest
+ * @return Trivial JSON object indicating success or failure (altho this is
+ * slightly contrary to conventions for a DELETE method)
+ */
+ @RequestMapping(value = {
+ DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.DELETE, produces = "application/json")
+ @ResponseBody
+ public String deleteDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("deleteDmaapAccess: Failed to get Login ID");
+ // Validate that this user owns the row with the specified ID
+ DmaapAccess domainObj = getDmaapAccessService().getDmaapAccess(id);
+ if (!appUser.getLoginId().equals(domainObj.getUserId()))
+ throw new Exception("deleteDmaapAccess: mismatch of appUser and row user ID");
+
+ getDmaapAccessService().deleteDmaapAccess(id);
+
+ // Answer "OK"
+ outboundJson = buildJsonSuccess(200, null);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to delete DMaaP access profile", ex);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return outboundJson;
+ }
+
+ /**
+ * Gets the selected DMaaP access row for the requesting user.
+ *
+ * See {@link #getSelectedDmaapAccess(String)}
+ *
+ * @param request
+ * HttpServletRequest
+ * @return JSON object with one DmaapAccessProfile, or an error
+ */
+ @RequestMapping(value = { SELECT_DMAAP_ACCESS_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getSelectedDmaapAccessProfile(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("getSelectedDmaapAccessProfile: Failed to get Login ID");
+ DmaapAccess selected = super.getSelectedDmaapAccess(appUser.getLoginId());
+ // clone and decrypt
+ DmaapAccess clear = new DmaapAccess(selected);
+ try {
+ clear.setPassword(clear.decryptPassword());
+ } catch (Exception ex) {
+ // Should never happen
+ throw new RuntimeException("getSelectedDmaapAccessProfile: Failed to decrypt password", ex);
+ }
+ outboundJson = buildJsonSuccess(200, clear);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to get selected DMaaP access profile", ex);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return outboundJson;
+ }
+
+ /**
+ * Marks the DMaaP access row as selected (first choice) for the requesting
+ * user if the row user ID matches the requesting user ID. As a side effect,
+ * removes selected marking from all other user rows. Returns status,
+ * additionally an error message on failure. Traps errors and
+ * constructs an appropriate JSON block if an error happens.
+ *
+ * Choice of PUT is fairly arbitrary - there is no body, but GET is for
+ * actions that do not change data.
+ *
+ * @param id
+ * Path parameter with ID of the DMaaP access profile
+ * @param request
+ * HttpServletRequest
+ * @return Trivial JSON object indicating success or failure.
+ */
+ @RequestMapping(value = {
+ SELECT_DMAAP_ACCESS_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json")
+ @ResponseBody
+ public String selectDmaapAccess(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new Exception("selectDmaapAccess: Failed to get Login UID");
+ // A little inefficient in that it requires 3 database accesses;
+ // probably could be done in 1 with some sophisticated SQL.
+ List<DmaapAccess> dmaapAccessList = getDmaapAccessService().getDmaapAccessList(appUser.getLoginId());
+ for (DmaapAccess dmaap : dmaapAccessList) {
+ // Only write out the changed rows.
+ boolean changed = false;
+ if (id == dmaap.getId()) {
+ changed = !dmaap.getSelected();
+ dmaap.setSelected(true);
+ } else {
+ changed = dmaap.getSelected();
+ dmaap.setSelected(false);
+ }
+ if (changed)
+ getDmaapAccessService().saveDmaapAccess(dmaap);
+ }
+
+ // Answer OK
+ outboundJson = buildJsonSuccess(200, null);
+ } catch (Exception ex) {
+ outboundJson = buildJsonError(500, "Failed to select a DMaaP access profile", ex);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return outboundJson;
+ }
+
+ /**
+ * Tests the URL in the DMaaP access profile object. Traps errors and
+ * constructs an appropriate JSON block if an error happens.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return JSON with a Dmaap object (which has name etc.) on success, error
+ * on failure.
+ */
+ @RequestMapping(value = { "test_dmaap_access" }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String testDmaapAccess(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String outboundJson = null;
+ try {
+ DmaapAccess dmaapAccess = mapper.readValue(request.getReader(), DmaapAccess.class);
+ logger.debug("testDmaapAccess: received object: {} ", dmaapAccess);
+ if (dmaapAccess.getDmaapUrl() == null || dmaapAccess.getDmaapUrl().trim().length() == 0)
+ throw new Exception("Null or empty URL");
+
+ DmaapBcRestClient restClient = getDmaapBcRestClient(dmaapAccess);
+ // Get the instance so the page can display its name
+ DmaapObject dmaap = restClient.getDmaap();
+ if (dmaap instanceof Dmaap) {
+ outboundJson = buildJsonSuccess(200, dmaap);
+ } else {
+ // Bad credentials lands here.
+ ErrorResponse err = (ErrorResponse) dmaap;
+ outboundJson = buildJsonError(500, "Test failed: " + err.getMessage(), null);
+ }
+ } catch (Exception ex) {
+ // This is entirely likely; e.e., unknown host exception on typo.
+ outboundJson = buildJsonError(500, "Invalid DMaaP URL", ex);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return outboundJson;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/HealthCheckController.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/HealthCheckController.java
new file mode 100644
index 0000000..5754244
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/HealthCheckController.java
@@ -0,0 +1,142 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.controller;
+
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.openecomp.dcae.dmaapbc.dbcapp.service.DmaapAccessService;
+import org.openecomp.portalsdk.core.controller.UnRestrictedBaseController;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * This controller responds to probes for application health, returning a JSON
+ * body to indicate current status.
+ */
+@RestController
+@Configuration
+@EnableAspectJAutoProxy
+@RequestMapping("/")
+public class HealthCheckController extends UnRestrictedBaseController {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthCheckController.class);
+
+ private static final String HEALTH_CHECK_PATH = "/healthCheck";
+
+ @Autowired
+ private DmaapAccessService dmaapAccessService;
+
+ /**
+ * Model for JSON response with health-check results.
+ */
+ public class HealthStatus {
+ // Either 200 or 500
+ public int statusCode;
+ // Additional detail in case of error, empty in case of success.
+ public String message;
+
+ public HealthStatus(int code, String msg) {
+ this.statusCode = code;
+ this.message = msg;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(int code) {
+ this.statusCode = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String msg) {
+ this.message = msg;
+ }
+ }
+
+ /**
+ * Checks application health by making a trivial query to the database.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return 200 if database access succeeds, 500 if it fails.
+ */
+ @RequestMapping(value = { HEALTH_CHECK_PATH }, method = RequestMethod.GET, produces = "application/json")
+ public HealthStatus healthCheck(HttpServletRequest request) {
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ HealthStatus healthStatus = null;
+ try {
+ logger.debug(EELFLoggerDelegate.debugLogger, "Performing health check");
+ dmaapAccessService.getDmaapAccessCount();
+ healthStatus = new HealthStatus(200, "health check succeeded");
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex);
+ healthStatus = new HealthStatus(500, "health check failed: " + ex.toString());
+ }
+ return healthStatus;
+ }
+
+ /**
+ * This implementation does not support suspend/resume.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Trivial success
+ */
+ @RequestMapping(value = {
+ HEALTH_CHECK_PATH + "/suspend" }, method = RequestMethod.GET, produces = "application/json")
+ public HealthStatus healthCheckSuspend(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ HealthStatus response = new HealthStatus(200, "suspend not implemented");
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * This implementation does not support suspend/resume.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Trivial success
+ */
+ @RequestMapping(value = {
+ HEALTH_CHECK_PATH + "/resume" }, method = RequestMethod.GET, produces = "application/json")
+ public HealthStatus healthCheckResume(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ HealthStatus response = new HealthStatus(200, "resume not implemented");
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Answers ping request without checking the application health.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Trivial success
+ */
+ @RequestMapping(value = { HEALTH_CHECK_PATH + "/ping" }, method = RequestMethod.GET, produces = "application/json")
+ public HealthStatus ping(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ HealthStatus response = new HealthStatus(200, "ping received");
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/MessageRouterController.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/MessageRouterController.java
new file mode 100644
index 0000000..9d889dd
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/controller/MessageRouterController.java
@@ -0,0 +1,207 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.controller;
+
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * Message Router controller: serves Ajax requests made by Angular scripts on
+ * pages that show topics and clients.
+ */
+@Controller
+@RequestMapping("/")
+public class MessageRouterController extends DbcappRestrictedBaseController {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MessageRouterController.class);
+
+ private static final String TOPIC_PATH = "/mr_topic";
+ private static final String CLIENT_PATH = "/mr_client";
+
+ public MessageRouterController() {
+ }
+
+ /**
+ * Answers a request for one page of message router topics. See
+ * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)}
+ *
+ * @param request
+ * HttpServletRequest
+ * @return One page of MR topics
+ */
+ @RequestMapping(value = { TOPIC_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getMRTopicsByPage(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = getItemListForPageWrapper(request, DmaapDataItem.MR_TOPIC);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Answers a request for one page of message router clients. See
+ * {@link #getItemListForPageWrapper(HttpServletRequest, DmaapDataItem)}
+ *
+ * @param request
+ * HttpServletRequest
+ * @return One page of MR clients
+ */
+ @RequestMapping(value = { CLIENT_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getMRClientsByPage(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = getItemListForPageWrapper(request, DmaapDataItem.MR_CLIENT);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Adds a topic with the specified information. Expects a JSON block in the
+ * request body - a Topic object.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return JSON success/failure response
+ */
+ @RequestMapping(value = { TOPIC_PATH }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String addTopic(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = addItem(request, DmaapDataItem.MR_TOPIC, HttpServletResponse.SC_CREATED);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Adds a client with the specified information. Expects a JSON block in the
+ * request body - a MR_Client object.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return JSON success/failure response
+ */
+ @RequestMapping(value = { CLIENT_PATH }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String addMRClient(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = addItem(request, DmaapDataItem.MR_CLIENT, HttpServletResponse.SC_CREATED);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Updates a topic with the specified information. Expects a JSON block in
+ * the request body - a Topic object.
+ *
+ * Writes a JSON object as an HTTP response; on success it has a "status"
+ * and possibly a "data" item; on failure, also has an "error" item.
+ *
+ * @param id
+ * ID of the topic to update
+ * @param request
+ * HttpServletRequest
+ * @return JSON success/failure response
+ */
+ @RequestMapping(value = { TOPIC_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json")
+ @ResponseBody
+ public String updateTopic(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = updateItem(request, DmaapDataItem.MR_TOPIC, Long.toString(id), null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Updates a client with the specified information. Expects a JSON block in
+ * the request body - a MR_Client object.
+ *
+ * Writes a JSON object as an HTTP response; on success it has a "status"
+ * and possibly a "data" item; on failure, also has an "error" item.
+ *
+ * @param id
+ * ID of the client to update
+ * @param request
+ * HttpServletRequest
+ * @return JSON success/failure response
+ */
+ @RequestMapping(value = { CLIENT_PATH + "/{id}" }, method = RequestMethod.PUT, produces = "application/json")
+ @ResponseBody
+ public String updateMRClient(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = updateItem(request, DmaapDataItem.MR_CLIENT, Long.toString(id), null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Deletes a topic with the FQTN ID specified as a path parameter.
+ *
+ * FQTN is a string of dot-separated names. Spring, in its infinite wisdom,
+ * truncates extensions on dotted path parameters; e.g., "foo.json" becomes
+ * "foo". Avoid truncation here with the extra ":.+" incantation at the end.
+ *
+ * Writes a JSON object as an HTTP response; on success it only has "status"
+ * item; on failure, also has an "error" item.
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return JSON success/failure response
+ */
+ @RequestMapping(value = { "/mr_topic/{id:.+}" }, method = RequestMethod.DELETE, produces = "application/json")
+ @ResponseBody
+ public String deleteTopic(@PathVariable("id") String id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = deleteItem(request, DmaapDataItem.MR_TOPIC, id, 204);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+ /**
+ * Deletes a client with the mrClientId specified as a path parameter.
+ *
+ * Writes a JSON object as an HTTP response; on success it only has "status"
+ * item; on failure, also has an "error" item.
+ *
+ * @param id
+ * Path parameter with object ID
+ * @param request
+ * HttpServletRequest
+ * @return JSON success/failure response
+ */
+ @RequestMapping(value = { "/mr_client/{id}" }, method = RequestMethod.DELETE, produces = "application/json")
+ @ResponseBody
+ public String deleteMRClient(@PathVariable("id") long id, HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DataBusHomeController.APP_NAME);
+ String response = deleteItem(request, DmaapDataItem.MR_CLIENT, Long.toString(id), null);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, DataBusHomeController.logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return response;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/DmaapAccess.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/DmaapAccess.java
new file mode 100644
index 0000000..3edd3ba
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/DmaapAccess.java
@@ -0,0 +1,152 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.domain;
+
+import org.openecomp.portalsdk.core.domain.support.DomainVo;
+import org.openecomp.portalsdk.core.onboarding.util.CipherUtil;
+
+/**
+ * Hold an access profile for a DMaaP REST endpoint. Represents one row in the
+ * DBCA_DMAAP table.
+ */
+public class DmaapAccess extends DomainVo {
+
+ private static final long serialVersionUID = 6443219375733216340L;
+
+ // parent class defines these fields:
+ // ID, created, modified, created_id, modified_id
+
+ /** Login ID for user who owns this row */
+ private String userId;
+ /** Nickname for this row */
+ private String name;
+ /** REST API endpoint */
+ private String dmaapUrl;
+ /** Credentials */
+ private String mechId;
+ /** Credentials */
+ private String password;
+ /** User's preferred access profile */
+ private boolean selected;
+
+ /**
+ * Standard POJO no-arg constructor
+ */
+ public DmaapAccess() {
+ }
+
+ /**
+ * Copy constructor
+ *
+ * @param copy
+ * Instance to copy
+ */
+ public DmaapAccess(final DmaapAccess copy) {
+ // Unfortunately DomainVo doesn't provide a copy constructor;
+ // only the ID field is needed.
+ this.id = copy.id;
+ // Our fields
+ this.userId = copy.userId;
+ this.name = copy.name;
+ this.dmaapUrl = copy.dmaapUrl;
+ this.mechId = copy.mechId;
+ this.password = copy.password;
+ this.selected = copy.selected;
+ }
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDmaapUrl() {
+ return dmaapUrl;
+ }
+
+ public void setDmaapUrl(String dmaapUrl) {
+ this.dmaapUrl = dmaapUrl;
+ }
+
+ public String getMechId() {
+ return mechId;
+ }
+
+ public void setMechId(String mechId) {
+ this.mechId = mechId;
+ }
+
+ /**
+ * Gets the encrypted password. Applications should use
+ * {@link #decryptPassword()}!
+ *
+ * @return The encrypted password
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Sets the encrypted password. Applications should use
+ * {@link #encryptPassword(String)}!
+ *
+ * @param password
+ * The encrypted password
+ */
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public boolean getSelected() {
+ return selected;
+ }
+
+ public void setSelected(boolean selected) {
+ this.selected = selected;
+ }
+
+ /**
+ * A getter that decrypts the value read from the database and returns the
+ * clear text. Has no side effects.
+ *
+ * @return Clear-text password.
+ * @throws Exception
+ * If the password cannot be decrypted
+ */
+ public String decryptPassword() throws Exception {
+ if (password == null)
+ return null;
+ return CipherUtil.decrypt(password);
+ }
+
+ /**
+ * A setter that encrypts the clear-text in preparation for storing in the
+ * database.
+ *
+ * @param clearText
+ * The clear-text password to be encrypted
+ * @throws Exception
+ * If the password cannot be encrypted
+ */
+ public void encryptPassword(String clearText) throws Exception {
+ if (clearText == null) {
+ password = null;
+ return;
+ }
+ password = CipherUtil.encrypt(clearText);
+ }
+
+ @Override
+ public String toString() {
+ return "DmaapAccess[id=" + id + ", url=" + dmaapUrl + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/ManifestTransportModel.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/ManifestTransportModel.java
new file mode 100644
index 0000000..a98f14d
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/domain/ManifestTransportModel.java
@@ -0,0 +1,32 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.domain;
+
+import java.util.Map;
+
+/**
+ * Holds a set of String key-value pairs, the JSON version of a
+ * java.util.Attributes object read from a jar/war file.
+ */
+public class ManifestTransportModel {
+
+ private Map<String, String> manifest;
+
+ /**
+ * Standard POJO no-arg constructor
+ */
+ public ManifestTransportModel() {
+ }
+
+ public Map<String, String> getManifest() {
+ return manifest;
+ }
+
+ public void setManifest(Map<String, String> manifest) {
+ this.manifest = manifest;
+ }
+
+ @Override
+ public String toString() {
+ return "Manifest[size=" + manifest.size() + "]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java
new file mode 100644
index 0000000..3700c3d
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestClient.java
@@ -0,0 +1,182 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.rest;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.DmaapAccess;
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.ManifestTransportModel;
+import org.openecomp.dcae.dmaapbc.dbcapp.service.DmaapAccessService;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * Provides methods for accessing the DBC microservice via REST using basic HTTP
+ * authentication.
+ *
+ */
+public class DbcUsvcRestClient implements DmaapAccessService {
+
+ public static final String endpointPath = "/dmaap_access";
+ private final String baseUrl;
+ private final RestTemplate restTemplate;
+
+ /**
+ * Builds a restTemplate that uses basic HTTP authentication for use by all
+ * methods in this class.
+ *
+ * @param webapiUrl
+ * URL of the web endpoint
+ * @param user
+ * user name
+ * @param pass
+ * password
+ */
+ public DbcUsvcRestClient(String webapiUrl, String user, String pass) {
+ if (webapiUrl == null || user == null || pass == null)
+ throw new IllegalArgumentException("Nulls not permitted");
+
+ baseUrl = webapiUrl;
+ URL url = null;
+ try {
+ url = new URL(baseUrl);
+ } catch (MalformedURLException ex) {
+ throw new RuntimeException("Failed to parse URL", ex);
+ }
+ final HttpHost httpHost = new HttpHost(url.getHost(), url.getPort());
+
+ // Build a client with a credentials provider
+ CredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(new AuthScope(httpHost), new UsernamePasswordCredentials(user, pass));
+ HttpClientBuilder clientBuilder = HttpClientBuilder.create();
+ CloseableHttpClient httpClient = clientBuilder.setDefaultCredentialsProvider(credsProvider).build();
+
+ // Create request factory with our superpower client
+ HttpComponentsClientHttpRequestFactoryBasicAuth requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(
+ httpHost);
+ requestFactory.setHttpClient(httpClient);
+
+ // Put the factory in the template
+ this.restTemplate = new RestTemplate();
+ restTemplate.setRequestFactory(requestFactory);
+ }
+
+ /**
+ * Gets the manifest from the micro service.
+ */
+ @Override
+ public ManifestTransportModel getManifest() {
+ String url = baseUrl + "/manifest";
+ ResponseEntity<ManifestTransportModel> daResponse = restTemplate.exchange(url, HttpMethod.GET, null,
+ ManifestTransportModel.class);
+ ManifestTransportModel response = daResponse.getBody();
+ return response;
+ }
+
+ /**
+ * Gets the count of DMaaP access profiles.
+ *
+ * @return Number of access profiles in the database.
+ */
+ public int getDmaapAccessCount() {
+ String url = baseUrl + "/count_dmaap_access";
+ ResponseEntity<DbcUsvcRestResponse> daResponse = restTemplate.exchange(url, HttpMethod.GET, null,
+ DbcUsvcRestResponse.class);
+ DbcUsvcRestResponse response = daResponse.getBody();
+ return response.getStatus();
+ }
+
+ /**
+ * Gets the DMaaP access profiles for the specified userId.
+ *
+ * @param userId
+ * User ID
+ * @return List of access profiles
+ */
+ @Override
+ public List<DmaapAccess> getDmaapAccessList(final String userId) {
+ String url = baseUrl + endpointPath + "?userId=" + userId;
+ ResponseEntity<List<DmaapAccess>> daResponse = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<List<DmaapAccess>>() {
+ });
+ List<DmaapAccess> daList = daResponse.getBody();
+ return daList;
+ }
+
+ /**
+ * Gets the specified DMaaP access profile.
+ */
+ @Override
+ public DmaapAccess getDmaapAccess(Long dmaapId) {
+ String url = baseUrl + endpointPath + "?dmaapId=" + dmaapId;
+ ResponseEntity<DmaapAccess> daResponse = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<DmaapAccess>() {
+ });
+ DmaapAccess da = daResponse.getBody();
+ return da;
+ }
+
+ /**
+ * POSTs or PUTs the DMaaP access profile as needed, based on whether the
+ * object's ID field is set. If not set it creates a new row; if set, it
+ * updates a row in the remote service table.
+ *
+ * @param dmaapAccess
+ * Access profile
+ */
+ @Override
+ public void saveDmaapAccess(final DmaapAccess dmaapAccess) {
+ if (dmaapAccess.getId() == null) {
+ String url = baseUrl + endpointPath;
+ restTemplate.postForObject(url, dmaapAccess, String.class);
+ } else {
+ String url = baseUrl + endpointPath + "/" + Long.toString(dmaapAccess.getId());
+ restTemplate.put(url, dmaapAccess);
+ }
+ }
+
+ /**
+ * Deletes the DMaaP access profile row in the remote service table with the
+ * specified id.
+ *
+ * @param id
+ * Access profile ID
+ */
+ @Override
+ public void deleteDmaapAccess(final Long id) {
+ String url = baseUrl + endpointPath + "/" + Long.toString(id);
+ restTemplate.delete(url);
+ }
+
+ /**
+ * Simple test
+ *
+ * @param args
+ * UserID
+ * @throws Exception
+ * On any failure
+ */
+ public static void main(String[] args) throws Exception {
+ if (args.length != 1)
+ throw new IllegalArgumentException("Single argument expected: userid");
+ DbcUsvcRestClient client = new DbcUsvcRestClient("http://localhost:8081/dbus", "dbus_user", "dbus_pass");
+ final String userId = args[0];
+ System.out.println("Requesting profiles for user " + userId);
+ List<DmaapAccess> access = client.getDmaapAccessList(userId);
+ if (access == null)
+ System.err.println("Received null");
+ else
+ for (DmaapAccess da : access)
+ System.out.println(da);
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java
new file mode 100644
index 0000000..98cfc20
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/DbcUsvcRestResponse.java
@@ -0,0 +1,42 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.rest;
+
+/**
+ * Models the responses sent by the micro service in JSON format.
+ */
+public class DbcUsvcRestResponse {
+
+ private int status;
+ private String data, error, exception;
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ public String getException() {
+ return exception;
+ }
+
+ public void setException(String exception) {
+ this.exception = exception;
+ }
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java
new file mode 100644
index 0000000..432d61c
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/rest/HttpComponentsClientHttpRequestFactoryBasicAuth.java
@@ -0,0 +1,46 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.rest;
+
+import java.net.URI;
+
+import org.apache.http.HttpHost;
+import org.apache.http.client.AuthCache;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.BasicAuthCache;
+import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.HttpContext;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+
+/**
+ * Utility class to enable Basic HTTP Authentication with Spring REST templates.
+ *
+ * From:
+ * http://www.baeldung.com/2012/04/16/how-to-use-resttemplate-with-basic-authentication-in-spring-3-1/
+ */
+public class HttpComponentsClientHttpRequestFactoryBasicAuth extends HttpComponentsClientHttpRequestFactory {
+
+ private HttpHost host;
+
+ public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) {
+ super();
+ this.host = host;
+ }
+
+ protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
+ return createHttpContext();
+ }
+
+ private HttpContext createHttpContext() {
+ // Create AuthCache instance
+ AuthCache authCache = new BasicAuthCache();
+ // Generate BASIC scheme object and add it to the local auth cache
+ BasicScheme basicAuth = new BasicScheme();
+ authCache.put(host, basicAuth);
+
+ // Add AuthCache to the execution context
+ BasicHttpContext localcontext = new BasicHttpContext();
+ localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
+ return localcontext;
+ }
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessService.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessService.java
new file mode 100644
index 0000000..c4d85bf
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessService.java
@@ -0,0 +1,63 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.service;
+
+import java.util.List;
+
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.DmaapAccess;
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.ManifestTransportModel;
+
+/**
+ * Defines methods to manipulate the database table with DmaapAccess domain
+ * objects. No method throws a checked exception, in keeping with the Spring
+ * philosophy of throwing unchecked exceptions.
+ */
+public interface DmaapAccessService {
+
+ /**
+ * Gets build information.
+ *
+ * @return List of key-value pairs; implementations may return null.
+ */
+ ManifestTransportModel getManifest();
+
+ /**
+ * Gets the number of Dmaap Access entries.
+ *
+ * @return Number of rows in the table.
+ */
+ int getDmaapAccessCount();
+
+ /**
+ * Gets all DMaaP access rows in the table for the specified user.
+ *
+ * @param userId
+ * Login ID of the user
+ * @return List of DMaaP instance objects, which may be empty.
+ */
+ List<DmaapAccess> getDmaapAccessList(String userId);
+
+ /**
+ * Gets the DMaaP access object with the specified row ID.
+ *
+ * @param dmaapId
+ * Access profile ID
+ * @return DMaap instance; null if none exists.
+ */
+ DmaapAccess getDmaapAccess(Long dmaapId);
+
+ /**
+ * Creates a new managed object (a new row in the table).
+ *
+ * @param dmaap
+ * DMaaP instance to create.
+ */
+ void saveDmaapAccess(DmaapAccess dmaap);
+
+ /**
+ * Deletes the DMaaP access row with the specified ID.
+ *
+ * @param dmaapId
+ * Access profile ID
+ */
+ void deleteDmaapAccess(Long dmaapId);
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java
new file mode 100644
index 0000000..bca8458
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/service/DmaapAccessServiceImpl.java
@@ -0,0 +1,97 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.criterion.Criterion;
+import org.hibernate.criterion.Restrictions;
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.DmaapAccess;
+import org.openecomp.dcae.dmaapbc.dbcapp.domain.ManifestTransportModel;
+import org.openecomp.portalsdk.core.service.DataAccessService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Hibernate-assisted methods to manipulate the DBCA_DMAAP table.
+ */
+@Service("dmaapAccessService")
+@Transactional
+public class DmaapAccessServiceImpl implements DmaapAccessService {
+
+ @Autowired
+ private DataAccessService dataAccessService;
+
+ public DataAccessService getDataAccessService() {
+ return dataAccessService;
+ }
+
+ public void setDataAccessService(DataAccessService dataAccessService) {
+ this.dataAccessService = dataAccessService;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService#getManifest()
+ */
+ @Override
+ public ManifestTransportModel getManifest() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService#getDmaapAccessCount()
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public int getDmaapAccessCount() {
+ List<DmaapAccess> accesses = (List<DmaapAccess>) getDataAccessService().getList(DmaapAccess.class, null);
+ return accesses.size();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService#getDmaapAccessList(java.lang.String)
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<DmaapAccess> getDmaapAccessList(String userId) {
+ List<Criterion> restrictionsList = new ArrayList<Criterion>();
+ Criterion criterion1 = Restrictions.eq("userId", userId);
+ restrictionsList.add(criterion1);
+ List<DmaapAccess> accesses = (List<DmaapAccess>) getDataAccessService().getList(DmaapAccess.class, null,
+ restrictionsList, null);
+ return accesses;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService#getDmaapAccess(java.lang.Long)
+ */
+ @Override
+ public DmaapAccess getDmaapAccess(Long dmaapId) {
+ return (DmaapAccess) getDataAccessService().getDomainObject(DmaapAccess.class, dmaapId, null);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService#saveDmaapAccess(org.openecomp.dmaapbc.dbcapp.domain.DmaapAccess)
+ */
+ @Override
+ public void saveDmaapAccess(DmaapAccess dmaap) {
+ getDataAccessService().saveDomainObject(dmaap, null);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.openecomp.dmaapbc.dbcapp.service.DmaapAccessService#deleteDmaapAccess(java.lang.Long)
+ */
+ @Override
+ public void deleteDmaapAccess(Long dmaapId) {
+ DmaapAccess dmaapAccess = getDmaapAccess(dmaapId);
+ if (dmaapAccess != null)
+ getDataAccessService().deleteDomainObject(dmaapAccess, null);
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/util/DbcappProperties.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/util/DbcappProperties.java
new file mode 100644
index 0000000..b08e007
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/dbcapp/util/DbcappProperties.java
@@ -0,0 +1,71 @@
+package org.openecomp.dcae.dmaapbc.dbcapp.util;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+
+/**
+ * Publishes a list of constants and methods to access the properties that are
+ * read by Spring from the specified configuration file(s).
+ *
+ * Should be used like this (and never in a constructor):
+ *
+ * <pre>
+ * &#64;Autowired
+ * DbcappProperties properties;
+ * </pre>
+ */
+@Configuration
+@PropertySource(value = { "${container.classpath:}/WEB-INF/dbcapp/dbcapp.properties" })
+public class DbcappProperties {
+
+ public static final String DMAAP_REST_URL_LIST = "dmaap.rest.url.list";
+ public static final String DMAAP_MECHID_NAME = "dmaap.mechid.name";
+ public static final String DMAAP_MECHID_PASSWORD = "dmaap.mechid.password";
+ public static final String PROFILE_ACCESS_METHOD = "profile.access.method";
+ public static final String PROFILE_USVC_URL = "profile.microservice.url";
+ public static final String PROFILE_USVC_USER = "profile.microservice.user.name";
+ public static final String PROFILE_USVC_PASS = "profile.microservice.user.password";
+ public static final String DMAAP_PII_TYPE_LIST = "dmaap.pii.type.list";
+
+ private Environment environment;
+
+ public DbcappProperties() {
+ }
+
+ protected Environment getEnvironment() {
+ return environment;
+ }
+
+ @Autowired
+ public void setEnvironment(final Environment environment) {
+ this.environment = environment;
+ }
+
+ public boolean containsProperty(String key) {
+ return environment.containsProperty(key);
+ }
+
+ public String getProperty(String key) {
+ return environment.getRequiredProperty(key);
+ }
+
+ /**
+ * Gets the values for a comma-separated list property value as a String
+ * array.
+ *
+ * @param key
+ * Property key
+ * @return Array of values with leading and trailing whitespace removed;
+ * null if key is not found.
+ */
+ public String[] getCsvListProperty(final String key) {
+ String listVal = getProperty(key);
+ if (listVal == null)
+ return null;
+ String[] vals = listVal.split("\\s*,\\s*");
+ return vals;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java
new file mode 100644
index 0000000..87ad86e
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Node.java
@@ -0,0 +1,87 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Bean that models a DMaaP Data Router node.
+ */
+public class DR_Node extends DmaapObject {
+
+ private String fqdn;
+ /** dcaeLocation where node VM is deployed */
+ private String dcaeLocationName;
+ /**
+ * name for this VM (sometimes this is a local VM name and may be different
+ * than FQDN)
+ */
+ private String hostName;
+ /** version of Node software package */
+ private String version;
+
+ public DR_Node() {
+ }
+
+ public DR_Node(String lastMod, Dmaap_Status status, String fqdn, String dcaeLocationName, String hostName,
+ String version) {
+ super(lastMod, status);
+ this.fqdn = fqdn;
+ this.dcaeLocationName = dcaeLocationName;
+ this.hostName = hostName;
+ this.version = version;
+ }
+
+ public String getFqdn() {
+ return fqdn;
+ }
+
+ public void setFqdn(String fqdn) {
+ this.fqdn = fqdn;
+ }
+
+ public String getDcaeLocationName() {
+ return dcaeLocationName;
+ }
+
+ public void setDcaeLocationName(String dcaeLocationName) {
+ this.dcaeLocationName = dcaeLocationName;
+ }
+
+ public String getHostName() {
+ return hostName;
+ }
+
+ public void setHostName(String hostName) {
+ this.hostName = hostName;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ @Override
+ public String toString() {
+ return "DR_Node[fqdn=" + fqdn + ", dcaeLocationName=" + dcaeLocationName + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java
new file mode 100644
index 0000000..fe0aeca
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Pub.java
@@ -0,0 +1,96 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Bean that models a DMaaP Data Router publisher.
+ */
+public class DR_Pub extends DmaapObject {
+
+ /** dcaeLocation tag where this publisher is deployed */
+ private String dcaeLocationName;
+ /** name used for basic authentication to DR */
+ private String username;
+ /** password used for basic authentication to DR */
+ private String userpwd;
+ /** tag of feed for which this publisher is a source */
+ private String feedId;
+ /** unique id of a DCAE publisher (generated by Data Router PROV) */
+ private String pubId;
+
+ public DR_Pub() {
+ }
+
+ public DR_Pub(Dmaap_Status status, String lastMod, String dcaeLocationName, String username, String userpwd,
+ String feedId, String pubId) {
+ super(lastMod, status);
+ this.dcaeLocationName = dcaeLocationName;
+ this.username = username;
+ this.userpwd = userpwd;
+ this.feedId = feedId;
+ this.pubId = pubId;
+ }
+
+ public String getDcaeLocationName() {
+ return dcaeLocationName;
+ }
+
+ public void setDcaeLocationName(String dcaeLocationName) {
+ this.dcaeLocationName = dcaeLocationName;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getUserpwd() {
+ return userpwd;
+ }
+
+ public void setUserpwd(String userpwd) {
+ this.userpwd = userpwd;
+ }
+
+ public String getFeedId() {
+ return feedId;
+ }
+
+ public void setFeedId(String feedId) {
+ this.feedId = feedId;
+ }
+
+ public String getPubId() {
+ return pubId;
+ }
+
+ public void setPubId(String pubId) {
+ this.pubId = pubId;
+ }
+
+ @Override
+ public String toString() {
+ return "DR_Pub[dcaeLocationName=" + dcaeLocationName + ", feedId=" + feedId + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java
new file mode 100644
index 0000000..45adf9c
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DR_Sub.java
@@ -0,0 +1,152 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Bean that models a DMaaP Data Router subscriber.
+ */
+public class DR_Sub extends DmaapObject {
+
+ /** Tag where this publisher is deployed */
+ private String dcaeLocationName;
+ /** name used for basic authentication from DR */
+ private String username;
+ /** password used for basic authentication from DR */
+ private String userpwd;
+ /** tag of feed for which this publisher is a source */
+ private String feedId;
+ /** URL used by DR to deliver files to this subscriber */
+ private String deliveryURL;
+ /** URL for accessing the transaction log for this susbcriber */
+ private String logURL;
+ /** unique ID for a subscriber in this DR environment */
+ private String subId;
+ /** TODO */
+ private boolean suspended;
+ /** TODO */
+ private boolean use100;
+ /** TODO */
+ private String owner;
+
+ public DR_Sub() {
+ }
+
+ public DR_Sub(String lastMod, Dmaap_Status status, String dcaeLocationName, String username, String userpwd,
+ String feedId, String deliveryURL, String logURL, String subId, boolean suspended, boolean use100,
+ String owner) {
+ super(lastMod, status);
+ this.dcaeLocationName = dcaeLocationName;
+ this.username = username;
+ this.userpwd = userpwd;
+ this.feedId = feedId;
+ this.deliveryURL = deliveryURL;
+ this.logURL = logURL;
+ this.subId = subId;
+ this.suspended = suspended;
+ this.use100 = use100;
+ this.owner = owner;
+ }
+
+ public String getDcaeLocationName() {
+ return dcaeLocationName;
+ }
+
+ public void setDcaeLocationName(String dcaeLocationName) {
+ this.dcaeLocationName = dcaeLocationName;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getUserpwd() {
+ return userpwd;
+ }
+
+ public void setUserpwd(String userpwd) {
+ this.userpwd = userpwd;
+ }
+
+ public String getFeedId() {
+ return feedId;
+ }
+
+ public void setFeedId(String feedId) {
+ this.feedId = feedId;
+ }
+
+ public String getDeliveryURL() {
+ return deliveryURL;
+ }
+
+ public void setDeliveryURL(String deliveryURL) {
+ this.deliveryURL = deliveryURL;
+ }
+
+ public String getLogURL() {
+ return logURL;
+ }
+
+ public void setLogURL(String logURL) {
+ this.logURL = logURL;
+ }
+
+ public String getSubId() {
+ return subId;
+ }
+
+ public void setSubId(String subId) {
+ this.subId = subId;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public boolean isSuspended() {
+ return suspended;
+ }
+
+ public void setSuspended(boolean suspended) {
+ this.suspended = suspended;
+ }
+
+ public boolean isUse100() {
+ return use100;
+ }
+
+ public void setUse100(boolean use100) {
+ this.use100 = use100;
+ }
+
+ @Override
+ public String toString() {
+ return "DR_Sub[dcaeLocationName=" + dcaeLocationName + ", feedId=" + feedId + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java
new file mode 100644
index 0000000..c0a79c1
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DcaeLocation.java
@@ -0,0 +1,96 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Bean that models a DMaaP DCAE location.
+ */
+public class DcaeLocation extends DmaapObject {
+
+ public enum Dcae_Status {
+ EMPTY, NEW, STAGED, VALID, INVALID
+ }
+
+ /**
+ * network location code used to identify the location.
+ */
+ private String clli;
+ /**
+ * indicator of DCAE layer. Either opendcae-central or opendcae-local-ntc
+ */
+ private String dcaeLayer;
+ /**
+ * unique name of this dcaeLocation. Value should match what DCAE Controller
+ * uses.
+ */
+ private String dcaeLocationName;
+ /** determines where within the OpenStack deployment the edge exists */
+ private String openStackAvailabilityZone;
+
+ public DcaeLocation() {
+ }
+
+ public DcaeLocation(String lastMod, Dmaap_Status status, String clli, String dcaeLayer, String dcaeLocationName,
+ String openStackAvailabilityZone) {
+ super(lastMod, status);
+ this.clli = clli;
+ this.dcaeLayer = dcaeLayer;
+ this.dcaeLocationName = dcaeLocationName;
+ this.openStackAvailabilityZone = openStackAvailabilityZone;
+ }
+
+ public String getClli() {
+ return clli;
+ }
+
+ public void setClli(String clli) {
+ this.clli = clli;
+ }
+
+ public String getDcaeLayer() {
+ return dcaeLayer;
+ }
+
+ public void setDcaeLayer(String dcaeLayer) {
+ this.dcaeLayer = dcaeLayer;
+ }
+
+ public String getDcaeLocationName() {
+ return dcaeLocationName;
+ }
+
+ public void setDcaeLocationName(String dcaeLocationName) {
+ this.dcaeLocationName = dcaeLocationName;
+ }
+
+ public String getOpenStackAvailabilityZone() {
+ return openStackAvailabilityZone;
+ }
+
+ public void setOpenStackAvailabilityZone(String openStackAvailabilityZone) {
+ this.openStackAvailabilityZone = openStackAvailabilityZone;
+ }
+
+ @Override
+ public String toString() {
+ return "DcaeLocation[dcaeLocationName=" + dcaeLocationName + ", dcaeLayer=" + dcaeLayer + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java
new file mode 100644
index 0000000..fd00557
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Dmaap.java
@@ -0,0 +1,141 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Bean that models a DMaaP instance.
+ */
+public class Dmaap extends DmaapObject {
+
+ /** the version of DMaaP BC software */
+ private String version;
+ /** the root portion of the topic namespace */
+ private String topicNsRoot;
+ /**
+ * a unique identifier for this instance.
+ */
+ private String dmaapName;
+ /** URL for DR Provisioning Server */
+ private String drProvUrl;
+ /**
+ * topic name used by MR Bridge Admin to communicate which topics to
+ * replicate
+ */
+ private String bridgeAdminTopic;
+ /** used by DCAE Controller to upload event logs */
+ private String loggingUrl;
+ /** used by DCAE Controller to authenticate inter-node messages */
+ private String nodeKey;
+ /** used by DCAE Controller to set up ssh access to VMs */
+ private String accessKeyOwner;
+
+ public Dmaap() {
+ }
+
+ public Dmaap(String lastMod, Dmaap_Status status, String version, String topicNsRoot, String dmaapName,
+ String drProvUrl, String loggingUrl, String nodeKey, String accessKeyOwner) {
+ super(lastMod, status);
+ this.version = version;
+ this.topicNsRoot = topicNsRoot;
+ this.dmaapName = dmaapName;
+ this.drProvUrl = drProvUrl;
+ this.loggingUrl = loggingUrl;
+ this.nodeKey = nodeKey;
+ this.accessKeyOwner = accessKeyOwner;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getTopicNsRoot() {
+ return topicNsRoot;
+ }
+
+ public void setTopicNsRoot(String topicNsRoot) {
+ this.topicNsRoot = topicNsRoot;
+ }
+
+ public String getDmaapName() {
+ return dmaapName;
+ }
+
+ public void setDmaapName(String dmaapName) {
+ this.dmaapName = dmaapName;
+ }
+
+ public String getDrProvUrl() {
+ return drProvUrl;
+ }
+
+ public void setDrProvUrl(String drProvUrl) {
+ this.drProvUrl = drProvUrl;
+ }
+
+ public String getLogginUrl() {
+ return loggingUrl;
+ }
+
+ public void setLogginUrl(String logginUrl) {
+ this.loggingUrl = logginUrl;
+ }
+
+ public String getNodeKey() {
+ return nodeKey;
+ }
+
+ public void setNodeKey(String nodeKey) {
+ this.nodeKey = nodeKey;
+ }
+
+ public String getAccessKeyOwner() {
+ return accessKeyOwner;
+ }
+
+ public void setAccessKeyOwner(String accessKeyOwner) {
+ this.accessKeyOwner = accessKeyOwner;
+ }
+
+ public String getLoggingUrl() {
+ return loggingUrl;
+ }
+
+ public void setLoggingUrl(String loggingUrl) {
+ this.loggingUrl = loggingUrl;
+ }
+
+ public String getBridgeAdminTopic() {
+ return bridgeAdminTopic;
+ }
+
+ public void setBridgeAdminTopic(String bridgeAdminTopic) {
+ this.bridgeAdminTopic = bridgeAdminTopic;
+ }
+
+ @Override
+ public String toString() {
+ return "Dmaap[dmaapName=" + dmaapName + ", version=" + version + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java
new file mode 100644
index 0000000..fc66281
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/DmaapObject.java
@@ -0,0 +1,70 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Parent class for all DMaaP BC models.
+ */
+public abstract class DmaapObject {
+
+ public enum Dmaap_Status {
+ EMPTY, NEW, STAGED, VALID, INVALID //, DELETED
+ }
+
+ /** time stamp when object was last modified */
+ private String lastMod;
+ /** indicator of health of this object using values common in this API */
+ private Dmaap_Status status;
+ /** TODO */
+ private String type;
+
+ public DmaapObject() {
+ }
+
+ public DmaapObject(String lastMod, Dmaap_Status status) {
+ this.lastMod = lastMod;
+ this.status = status;
+ }
+
+ public String getLastMod() {
+ return lastMod;
+ }
+
+ public void setLastMod(String lastMod) {
+ this.lastMod = lastMod;
+ }
+
+ public Dmaap_Status getStatus() {
+ return status;
+ }
+
+ public void setStatus(Dmaap_Status status) {
+ this.status = status;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java
new file mode 100644
index 0000000..2cdb182
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/ErrorResponse.java
@@ -0,0 +1,65 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Bean that models a DMaaP Bus Controller error response.
+ *
+ * This inherits some fields (e.g., lastMod and status) that are not used.
+ */
+public class ErrorResponse extends DmaapObject {
+
+ private Integer code;
+ private String message;
+ private String fields;
+
+ public ErrorResponse() {
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public String getFields() {
+ return fields;
+ }
+
+ public void setFields(String fields) {
+ this.fields = fields;
+ }
+
+ @Override
+ public String toString() {
+ return "ErrorResponse[code=" + code + ", message=" + message + ", fields=" + fields + "]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java
new file mode 100644
index 0000000..f56aa54
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Feed.java
@@ -0,0 +1,193 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Bean that models a DMaaP Data Router feed.
+ */
+public class Feed extends DmaapObject {
+
+ public enum Feed_Status {
+ EMPTY, NEW, STAGED, VALID, INVALID, DELETED
+ }
+
+ /** unique id assigned by the DR PROV server for this feed */
+ private String feedId;
+ /** name of feed. Combined with feedVersion must be unique */
+ private String feedName;
+ /** version of feed. Combined with feedName must be unique */
+ private String feedVersion;
+ /** description */
+ private String feedDescription;
+ /** ASPR classification */
+ private String asprClassification;
+ /** provisioning URL for adding subscribers to this feed */
+ private String subscribeURL;
+ /** URL publisher use to connect to DR */
+ private String publishURL;
+ /** URL for transaction log for this feed */
+ private String logURL;
+ /** indicator of whether the feed is suspended */
+ private boolean suspended;
+ /** what identity owns this feed */
+ private String owner;
+ /** id of format description of feed content */
+ private String formatUuid;
+ /** a set of publishers for this feed */
+ private List<DR_Pub> pubs;
+ /** a set of subscribers for this feed */
+ private List<DR_Sub> subs;
+
+ public Feed() {
+ this.pubs = new ArrayList<DR_Pub>();
+ this.subs = new ArrayList<DR_Sub>();
+ }
+
+ public Feed(Dmaap_Status status, String lastMod, String feedName, String feedVersion, String feedDescription,
+ String asprClassification, String subscribeURL, String publishURL, String logURL, boolean suspended,
+ String owner, String formatUuid) {
+ super(lastMod, status);
+ this.feedName = feedName;
+ this.feedVersion = feedVersion;
+ this.feedDescription = feedDescription;
+ this.asprClassification = asprClassification;
+ this.subscribeURL = subscribeURL;
+ this.publishURL = publishURL;
+ this.logURL = logURL;
+ this.suspended = suspended;
+ this.owner = owner;
+ this.formatUuid = formatUuid;
+ this.pubs = new ArrayList<DR_Pub>();
+ this.subs = new ArrayList<DR_Sub>();
+ }
+
+ public String getFeedId() {
+ return feedId;
+ }
+
+ public void setFeedId(String feedId) {
+ this.feedId = feedId;
+ }
+
+ public String getFeedName() {
+ return feedName;
+ }
+
+ public void setFeedName(String feedName) {
+ this.feedName = feedName;
+ }
+
+ public String getFeedVersion() {
+ return feedVersion;
+ }
+
+ public void setFeedVersion(String feedVersion) {
+ this.feedVersion = feedVersion;
+ }
+
+ public String getFeedDescription() {
+ return feedDescription;
+ }
+
+ public void setFeedDescription(String feedDescription) {
+ this.feedDescription = feedDescription;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public String getAsprClassification() {
+ return asprClassification;
+ }
+
+ public void setAsprClassification(String asprClassification) {
+ this.asprClassification = asprClassification;
+ }
+
+ public String getSubscribeURL() {
+ return subscribeURL;
+ }
+
+ public void setSubscribeURL(String subscribeURL) {
+ this.subscribeURL = subscribeURL;
+ }
+
+ public String getPublishURL() {
+ return publishURL;
+ }
+
+ public void setPublishURL(String publishURL) {
+ this.publishURL = publishURL;
+ }
+
+ public String getLogURL() {
+ return logURL;
+ }
+
+ public void setLogURL(String logURL) {
+ this.logURL = logURL;
+ }
+
+ public boolean isSuspended() {
+ return suspended;
+ }
+
+ public void setSuspended(boolean suspended) {
+ this.suspended = suspended;
+ }
+
+ public String getFormatUuid() {
+ return formatUuid;
+ }
+
+ public void setFormatUuid(String formatUuid) {
+ this.formatUuid = formatUuid;
+ }
+
+ public List<DR_Pub> getPubs() {
+ return pubs;
+ }
+
+ public void setPubs(List<DR_Pub> pubs) {
+ this.pubs = pubs;
+ }
+
+ public List<DR_Sub> getSubs() {
+ return subs;
+ }
+
+ public void setSubs(List<DR_Sub> subs) {
+ this.subs = subs;
+ }
+
+ @Override
+ public String toString() {
+ return "Feed[feedId=" + feedId + ", feedName=" + feedName + ", feedVersion=" + feedVersion + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java
new file mode 100644
index 0000000..a1abc70
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Client.java
@@ -0,0 +1,110 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+/**
+ * Bean that models a DMaaP Message Router client.
+ */
+public class MR_Client extends DmaapObject {
+
+ /** dcaeLocation tag where this client is deployed */
+ private String dcaeLocationName;
+ /** fully qualified topic name */
+ private String fqtn;
+ /**
+ * name of role of client which will be
+ * granted the AAF permission associated with any action
+ */
+ private String clientRole;
+ /** an array of actions. Current possibilities are view, pub, sub */
+ private String[] action;
+ /** unique handle for this client, generated by DMaaP Bus Controller */
+ private String mrClientId;
+ /** TODO */
+ private String topicURL;
+
+ public MR_Client() {
+ }
+
+ public MR_Client(String lastMod, Dmaap_Status status, String dcaeLocationName, String fqtn, String clientRole,
+ String[] action, String mrClientId, String topicURL) {
+ super(lastMod, status);
+ this.dcaeLocationName = dcaeLocationName;
+ this.fqtn = fqtn;
+ this.clientRole = clientRole;
+ this.action = action;
+ this.mrClientId = mrClientId;
+ this.topicURL = topicURL;
+ }
+
+ public String getDcaeLocationName() {
+ return dcaeLocationName;
+ }
+
+ public void setDcaeLocationName(String dcaeLocationName) {
+ this.dcaeLocationName = dcaeLocationName;
+ }
+
+ public String getFqtn() {
+ return fqtn;
+ }
+
+ public void setFqtn(String fqtn) {
+ this.fqtn = fqtn;
+ }
+
+ public String getClientRole() {
+ return clientRole;
+ }
+
+ public void setClientRole(String clientRole) {
+ this.clientRole = clientRole;
+ }
+
+ public String[] getAction() {
+ return action;
+ }
+
+ public void setAction(String[] action) {
+ this.action = action;
+ }
+
+ public String getMrClientId() {
+ return mrClientId;
+ }
+
+ public void setMrClientId(String mrClientId) {
+ this.mrClientId = mrClientId;
+ }
+
+ public String getTopicURL() {
+ return topicURL;
+ }
+
+ public void setTopicURL(String topicURL) {
+ this.topicURL = topicURL;
+ }
+
+ @Override
+ public String toString() {
+ return "MR_Client[dcaeLocationName=" + dcaeLocationName + ", fqtn=" + fqtn + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java
new file mode 100644
index 0000000..6b213b6
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/MR_Cluster.java
@@ -0,0 +1,108 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+import java.util.List;
+
+/**
+ * Bean that models a DMaaP Message Router cluster.
+ */
+public class MR_Cluster extends DmaapObject {
+
+ /** dcaeLocation where cluster VMs are deployed */
+ private String dcaeLocationName;
+ /** DNS name used by MR clients for this cluster */
+ private String fqdn;
+ /** an array of hosts that are part of the MR Cluster. */
+ private List<String> hosts;
+ /** TODO */
+ private String topicPort;
+ /** TODO */
+ private String topicProtocol;
+
+ public MR_Cluster() {
+ }
+
+ /**
+ * @param status
+ * Status
+ * @param lastMod
+ * Last modification
+ * @param dcaeLocationName
+ * dcaeLocation where cluster VMs are deployed
+ * @param fqdn
+ * DNS name used by MR clients for this cluster
+ * @param hosts
+ * an array of hosts that are part of the MR Cluster
+ */
+ public MR_Cluster(Dmaap_Status status, String lastMod, String dcaeLocationName, String fqdn, final String[] hosts) {
+ super(lastMod, status);
+ this.dcaeLocationName = dcaeLocationName;
+ this.fqdn = fqdn;
+ for (String h : hosts)
+ this.hosts.add(h);
+ }
+
+ public String getDcaeLocationName() {
+ return dcaeLocationName;
+ }
+
+ public void setDcaeLocationName(String dcaeLocationName) {
+ this.dcaeLocationName = dcaeLocationName;
+ }
+
+ public String getFqdn() {
+ return fqdn;
+ }
+
+ public void setFqdn(String fqdn) {
+ this.fqdn = fqdn;
+ }
+
+ public List<String> getHosts() {
+ return hosts;
+ }
+
+ public void setHosts(List<String> hosts) {
+ this.hosts = hosts;
+ }
+
+ public String getTopicPort() {
+ return topicPort;
+ }
+
+ public void setTopicPort(String topicPort) {
+ this.topicPort = topicPort;
+ }
+
+ public String getTopicProtocol() {
+ return topicProtocol;
+ }
+
+ public void setTopicProtocol(String topicProtocol) {
+ this.topicProtocol = topicProtocol;
+ }
+
+ @Override
+ public String toString() {
+ return "MR_Cluster[dcaeLocationName=" + dcaeLocationName + ", fqdn=" + fqdn + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java
new file mode 100644
index 0000000..229ae3f
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/dcae/dmaapbc/model/Topic.java
@@ -0,0 +1,144 @@
+/*-
+ * ================================================================================
+ * DCAE DMaaP Bus Controller Models
+ * ================================================================================
+ * 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.dcae.dmaapbc.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Bean that models a DMaaP Message Router topic.
+ */
+public class Topic extends DmaapObject {
+
+ /** fully qualified topic name (topic_ns_root.environment.topic_name) */
+ private String fqtn;
+ /** application supplied value for topicName */
+ private String topicName;
+ /** description of topic */
+ private String topicDescription;
+ /** what identity owns this topic */
+ private String owner;
+ /** flag to MR indicating whether transactions are enabled for this topic */
+ private String tnxEnabled;
+ /** id of format description of feed content */
+ private String formatUuid;
+ /** indicates what replication pattern, if any, is desired */
+ private String replicationCase;
+ /** name of a specific Global MR host */
+ private String globalMrURL;
+ /** a set of publishers and subscribers for this topic */
+ private List<MR_Client> clients;
+
+ public Topic() {
+ this.clients = new ArrayList<MR_Client>();
+ }
+
+ public Topic(String lastMod, Dmaap_Status status, String fqtn, String topicName, String topicDescription,
+ String owner, String tnxEnabled, String formatUuid, String replicationCase, String globalMrURL) {
+ super(lastMod, status);
+ this.fqtn = fqtn;
+ this.topicName = topicName;
+ this.topicDescription = topicDescription;
+ this.owner = owner;
+ this.tnxEnabled = tnxEnabled;
+ this.formatUuid = formatUuid;
+ this.replicationCase = replicationCase;
+ this.globalMrURL = globalMrURL;
+ this.clients = new ArrayList<MR_Client>();
+ }
+
+ public String getFqtn() {
+ return fqtn;
+ }
+
+ public void setFqtn(String fqtn) {
+ this.fqtn = fqtn;
+ }
+
+ public String getTopicName() {
+ return topicName;
+ }
+
+ public void setTopicName(String topicName) {
+ this.topicName = topicName;
+ }
+
+ public String getTopicDescription() {
+ return topicDescription;
+ }
+
+ public void setTopicDescription(String topicDescription) {
+ this.topicDescription = topicDescription;
+ }
+
+ public String getTnxEnabled() {
+ return tnxEnabled;
+ }
+
+ public void setTnxEnabled(String tnxEnabled) {
+ this.tnxEnabled = tnxEnabled;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public String getFormatUuid() {
+ return formatUuid;
+ }
+
+ public void setFormatUuid(String formatUuid) {
+ this.formatUuid = formatUuid;
+ }
+
+ public List<MR_Client> getClients() {
+ return clients;
+ }
+
+ public void setClients(List<MR_Client> clients) {
+ this.clients = clients;
+ }
+
+ public String getReplicationCase() {
+ return replicationCase;
+ }
+
+ public void setReplicationCase(String replicationCase) {
+ this.replicationCase = replicationCase;
+ }
+
+ public String getGlobalMrURL() {
+ return globalMrURL;
+ }
+
+ public void setGlobalMrURL(String globalMrURL) {
+ this.globalMrURL = globalMrURL;
+ }
+
+ @Override
+ public String toString() {
+ return "Topic[fqtn=" + fqtn + ", topicName=" + topicName + ", ...]";
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/model/Result.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/model/Result.java
new file mode 100644
index 0000000..d23ed72
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/model/Result.java
@@ -0,0 +1,18 @@
+package org.openecomp.fusionapp.model;
+
+public class Result {
+ private String result;
+
+ public Result(String result) {
+ this.result = result;
+ }
+
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(String result) {
+ this.result = result;
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java
new file mode 100644
index 0000000..5d71602
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/service/AdminAuthExtension.java
@@ -0,0 +1,13 @@
+package org.openecomp.fusionapp.service;
+
+import org.openecomp.portalsdk.core.domain.User;
+
+//@Service("adminAuthExtension")
+//@Transactional
+public class AdminAuthExtension {
+
+ public void saveUserExtension(User user){
+ //app's developer implement their own logic here, like updating app's related tables
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java
new file mode 100644
index 0000000..4562584
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/main/java/org/openecomp/fusionapp/util/CustomLoggingFilter.java
@@ -0,0 +1,37 @@
+package org.openecomp.fusionapp.util;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.filter.Filter;
+import ch.qos.logback.core.spi.FilterReply;
+
+/**
+ * Custom Filter class bind with logback.xml configuration file to strip out
+ * certain log messages coming out of special packages or classes.
+ *
+ */
+public class CustomLoggingFilter extends Filter<ILoggingEvent> {
+
+ /**
+ * Custom Filter is added to strip out the continuous U-EB logging messages
+ * But make sure we log the ERROR and WARNING Level messages.
+ *
+ * @param event
+ * Logging event
+ */
+ @Override
+ public FilterReply decide(ILoggingEvent event) {
+ try {
+ if ((event.getLevel() != Level.ERROR || event.getLevel() != Level.WARN)
+ && (event.getThreadName().equalsIgnoreCase("UEBConsumerThread"))
+ && (event.getLoggerName().contains("com.att.nsa")
+ || event.getLoggerName().contains("org.apache.http"))) {
+ return FilterReply.DENY;
+ } else {
+ return FilterReply.NEUTRAL;
+ }
+ } catch (Exception e) {
+ return FilterReply.NEUTRAL;
+ }
+ }
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java b/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java
new file mode 100644
index 0000000..e828c88
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusion/core/MockApplicationContextTestSuite.java
@@ -0,0 +1,116 @@
+package org.openecomp.fusion.core;
+
+import java.io.IOException;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.openecomp.portalsdk.core.conf.AppConfig;
+import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager;
+import org.openecomp.portalsdk.core.util.CacheManager;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.AnnotationConfigWebContextLoader;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+
+/**
+ * In order to write a unit test, 1. inherit this class - See SanityTest.java 2.
+ * place the "war" folder on your test class's classpath 3. run the test with
+ * the following VM argument; This is important because when starting the
+ * application from Container, the System Properties file
+ * (SystemProperties.java) can have the direct path but, when running from the
+ * Mock Junit container, the path should be prefixed with "classpath" to enable
+ * the mock container to search for the file in the classpath
+ * -Dcontainer.classpath="classpath:"
+ *
+ */
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { MockAppConfig.class })
+@ActiveProfiles(value = "test")
+public class MockApplicationContextTestSuite {
+
+ @Autowired
+ public WebApplicationContext wac;
+
+ private MockMvc mockMvc;
+
+ @Before
+ public void setup() {
+ if (mockMvc == null) {
+ this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+
+ }
+ }
+
+ public Object getBean(String name) {
+ return this.wac.getBean(name);
+ }
+
+ public MockMvc getMockMvc() {
+ return mockMvc;
+ }
+
+ public void setMockMvc(MockMvc mockMvc) {
+ this.mockMvc = mockMvc;
+ }
+
+ public WebApplicationContext getWebApplicationContext() {
+ return wac;
+ }
+
+}
+
+@Configuration
+@ComponentScan(basePackages = "org.openecomp", excludeFilters = {
+ // see AppConfig class
+})
+@Profile("test")
+class MockAppConfig extends AppConfig {
+
+ @Bean
+ public SystemProperties systemProperties() {
+ return new MockSystemProperties();
+ }
+
+ @Bean
+ public AbstractCacheManager cacheManager() {
+ return new CacheManager() {
+
+ public void configure() throws IOException {
+
+ }
+ };
+ }
+
+ protected String[] tileDefinitions() {
+ return new String[] { "classpath:/WEB-INF/fusion/defs/definitions.xml",
+ "classpath:/WEB-INF/defs/definitions.xml" };
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ // registry.addInterceptor(new
+ // SessionTimeoutInterceptor()).excludePathPatterns(getExcludeUrlPathsForSessionTimeout());
+ // registry.addInterceptor(resourceInterceptor());
+ }
+
+ public static class MockSystemProperties extends SystemProperties {
+
+ public MockSystemProperties() {
+ }
+
+ }
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/SanityTest.java b/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/SanityTest.java
new file mode 100644
index 0000000..a5022f9
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/SanityTest.java
@@ -0,0 +1,20 @@
+package org.openecomp.fusionapp;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.fusion.core.MockApplicationContextTestSuite;
+import org.springframework.test.web.servlet.ResultActions;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+public class SanityTest extends MockApplicationContextTestSuite {
+
+ @Test
+ public void testGetAvailableRoles() throws Exception {
+
+ ResultActions ra =getMockMvc().perform(MockMvcRequestBuilders.get("/api/roles"));
+ //Assert.assertEquals(UrlAccessRestrictedException.class,ra.andReturn().getResolvedException().getClass());
+ Assert.assertEquals("application/json",ra.andReturn().getResponse().getContentType());
+ }
+
+
+}
diff --git a/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java b/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java
new file mode 100644
index 0000000..1e6d78c
--- /dev/null
+++ b/dcae_dmaapbc_webapp/dbca-common/src/test/java/org/openecomp/fusionapp/service/ProfileServiceTest.java
@@ -0,0 +1,37 @@
+package org.openecomp.fusionapp.service;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.fusion.core.MockApplicationContextTestSuite;
+import org.openecomp.portalsdk.core.domain.Profile;
+import org.openecomp.portalsdk.core.domain.User;
+import org.openecomp.portalsdk.core.service.ProfileService;
+import org.openecomp.portalsdk.core.service.UserProfileService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+public class ProfileServiceTest extends MockApplicationContextTestSuite {
+
+ @Autowired
+ ProfileService service;
+
+ @Autowired
+ UserProfileService userProfileService;
+
+ @Test
+ public void testFindAll() {
+
+ List<Profile> profiles = service.findAll();
+ Assert.assertTrue(profiles.size() > 0);
+ }
+
+ @Test
+ public void testFindAllActive() {
+
+ List<User> users = userProfileService.findAllActive();
+ List<User> activeUsers = userProfileService.findAllActive();
+ Assert.assertTrue(users.size() - activeUsers.size() >= 0);
+ }
+}