summaryrefslogtreecommitdiffstats
path: root/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF
diff options
context:
space:
mode:
authorTATTAVARADA <statta@research.att.com>2017-04-27 07:53:18 -0400
committerst782s <statta@research.att.com>2017-04-27 08:31:27 -0400
commit6beb446925c967aca92f5513adf36c5db77c00d6 (patch)
tree9392057ed0739de2445c5b2a2a8bee6dcdacbcf7 /ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF
parent246b225194e3e8dc1926294de591a94fd9787fa7 (diff)
[PORTAL-7] Rebase
This rebasing includes common libraries and common overlays projects abstraction of components Change-Id: Ia1efa4deacdc5701e6205104ac021a6c80ed60ba Signed-off-by: st782s <statta@research.att.com>
Diffstat (limited to 'ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF')
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties69
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/defs/definitions.xml17
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties29
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/footer.jsp17
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/header.jsp1
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp778
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml44
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/index.jsp24
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login.jsp113
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp117
-rw-r--r--ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/web.xml17
11 files changed, 1226 insertions, 0 deletions
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties
new file mode 100644
index 00000000..1f8aac82
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties
@@ -0,0 +1,69 @@
+# Properties read by ECOMP Core library, epsdk-core.jar
+
+##########################################################################
+# The following properties should NOT be changed by partner applications.
+##########################################################################
+
+application_user_id = 30000
+post_default_role_id = 16
+clustered = true
+
+#Enable Fusion Mobile capabilities for the application
+mobile_enable = false
+
+# Cache config file is needed on the classpath
+cache_config_file_path = /WEB-INF/classes/cache.ccf
+cache_switch = 199
+cache_load_on_startup = false
+
+user_name = fullName
+decryption_key = AGLDdG4D04BKm2IxIWEr8o==
+
+##########################################################################
+# The following properties REQUIRE changes by partner applications.
+##########################################################################
+
+
+#Mysql
+db.driver = com.mysql.jdbc.Driver
+db.connectionURL = jdbc:mysql://localhost:3306/ecomp_sdk_os
+db.userName = xxxx
+db.password = xxxxxxxx
+db.encrypt_flag = false
+db.hib.dialect = org.hibernate.dialect.MySQLDialect
+db.min_pool_size = 5
+db.max_pool_size = 10
+hb.dialect = org.hibernate.dialect.MySQLDialect
+# SQL statements are logged to stdout
+hb.show_sql = true
+hb.idle_connection_test_period = 3600
+
+app_display_name = EP SDK App OS
+# license file area
+files_path = /tmp
+
+#element map files
+element_map_file_path = app/fusionapp/files/
+element_map_icon_path = app/fusionapp/icons/
+
+#Cron Schedules have 6 required fields and 1 optional field:
+# Seconds Minutes Hours Day-of-Month Month Day-of-Week Year
+log_cron = 0 0/1 * * * ?;
+#sessiontimeout_feed_cron = 0 * * * * ? *
+
+# Link shown in Help menu
+contact_us_link = https://wiki.onap.org/display/DW/Portal
+
+# An Unique 128-bit value defined to identify a specific version
+# of an application deployed on a specific virtual machine.
+# This value must be generated and updated by the application
+# which is using the ECOMP SDK at the time of its deployment.
+# Online Unique UUID generator - https://www.uuidgenerator.net/
+instance_uuid=8da691c9-987d-43ed-a358-00ac2f35685d
+
+# Application base URL has the host and app context only; a proper prefix of the on-boarded URL.
+# Only required for applications using FE/BE separation. For example:
+# app_base_url = https://www.openecomp.org/app_context/
+
+#authenticate user server
+authenticate_user_server=http://todo_enter_auth_server_hostname:8383/openid-connect-server-webapp/allUsers \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/defs/definitions.xml b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/defs/definitions.xml
new file mode 100644
index 00000000..22f75c9d
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/defs/definitions.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tiles-definitions PUBLIC
+ "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
+ "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
+
+<!--
+ This tiles definitions file is defs/definitions.xml.
+ It maps tokens used by app controllers to JSP file paths.
+ Applications that use JSP pages should modify this file.
+ Configured by ExternalAppConfig#addTileDefinitions().
+-->
+
+<tiles-definitions>
+
+ <definition name="tileKey" template="/path/to/page_template.html"/>
+
+</tiles-definitions>
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties
new file mode 100644
index 00000000..25465cb1
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties
@@ -0,0 +1,29 @@
+# login settings
+login_method_backdoor = backdoor
+login_method_attribute_name = login_method
+
+#login message
+login.error.hrid.empty = Login failed, please contact system administrator.
+login.error.hrid.not-found = User not found, please contact system administrator.
+login.error.user.inactive = Account is disabled, please contact system administrator.
+
+# User Session settings
+user_attribute_name = user
+roles_attribute_name = roles
+role_functions_attribute_name = role_functions
+
+# Import-user LDAP settings
+post_initial_context_factory = com.sun.jndi.ldap.LdapCtxFactory
+post_provider_url = ldap://ldap.mycompany.com:389
+post_security_principal = ou=people,o=mycompany,c=us
+post_max_result_size = 499
+
+# menu settings
+menu_query_name = menuData
+application_menu_set_name = APP
+application_menu_attribute_name = applicationMenuData
+business_direct_menu_set_name = BD
+business_direct_menu_attribute_name = businessDirectMenuData
+
+# Role settings
+sys_admin_role_id = 1
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/footer.jsp b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/footer.jsp
new file mode 100644
index 00000000..3374b75f
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/footer.jsp
@@ -0,0 +1,17 @@
+<script src="./app/fusion/external/angular-1.5/angular.min.js"></script>
+<script src="app/fusion/external/ds2/js/b2b-angular/b2b-library.min.js"></script>
+<link rel="stylesheet" type="text/css" href="./app/fusion/external/ds2/css/b2b-angular/b2b-angular.css"></style>
+
+<div style="position: relative; bottom: 0; left: 0; width: 100%">
+ <footer class="b2b-footer-wrapper" role="contentinfo"
+ aria-label="footer">
+ <div class="b2b-footer-container" b2b-column-switch-footer>
+ <!-- footer-link-items='footerItems' -->
+ <!-- <hr> -->
+ <div style="margin-top: -25px;" class="divider-bottom-footer">
+ <div class="span12 footerLogo">
+ </div>
+ </div>
+ </div>
+ </footer>
+</div> \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/header.jsp b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/header.jsp
new file mode 100644
index 00000000..94213a2a
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/header.jsp
@@ -0,0 +1 @@
+<div ds2-menu id="menuContainer" class="menu-container" ></div> \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp
new file mode 100644
index 00000000..cbf7f8ad
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp
@@ -0,0 +1,778 @@
+<%--
+ ================================================================================
+ eCOMP Portal SDK
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ================================================================================
+ --%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
+<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
+<%@ page isELIgnored="false"%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<%@ page import="org.openecomp.portalsdk.core.onboarding.util.PortalApiProperties"%>
+<%@ page import="org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants"%>
+<%@ page import="org.openecomp.portalsdk.core.domain.MenuData"%>
+<link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/ebz_header/header.css">
+<link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/ebz_header/portal_ebz_header.css">
+<link rel="stylesheet" type="text/css" href="app/fusion/external/ebz/sandbox/styles/style.css" >
+
+
+<!-- <script src= "app/fusion/external/ebz/angular_js/angular.js"></script>
+<script src= "app/fusion/external/ebz/angular_js/angular-route.min.js"></script>
+<script src= "app/fusion/external/ebz/angular_js/angular-sanitize.js"></script>
+<script src= "app/fusion/external/ebz/angular_js/angular-cookies.js"></script>
+<script src= "app/fusion/external/ebz/angular_js/app.js"></script>
+<script src= "app/fusion/external/ebz/angular_js/gestures.js"></script>
+<script src="static/js/jquery-1.10.2.js"></script>
+<script src="app/fusion/scripts/modalService.js"></script>
+<script src="static/js/jquery.mask.min.js" type="text/javascript"></script>
+<script src="static/js/jquery-ui.js" type="text/javascript"></script>
+<script src="app/fusion/external/ebz/sandbox/att-abs-tpls.js" type="text/javascript"></script>
+<script src="static/fusion/js/att_angular_gridster/ui-gridster-tpls.js"></script>
+<script src="static/fusion/js/att_angular_gridster/angular-gridster.js"></script>
+<script src= "app/fusion/external/ebz/angular_js/checklist-model.js"></script>
+<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/0.10.0/lodash.min.js"></script>
+<script src="app/fusion/external/angular-ui/ui-bootstrap-tpls-1.1.2.min.js"></script>
+<script src="app/fusion/scripts/services/userInfoService.js"></script>
+<script src="app/fusion/scripts/services/leftMenuService.js"></script> -->
+
+
+<jsp:include page="/WEB-INF/fusion/jsp/ebz/loginSnippet.html" ></jsp:include>
+
+
+<c:set var="UserName" value="<%= session.getAttribute(\"fullName\")%>" />
+<c:set var="UserFirstName" value="<%= session.getAttribute(\"first_name\")%>" />
+
+<%
+ String contactUsLink = SystemProperties.getProperty(SystemProperties.CONTACT_US_LINK);
+ String redirectUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL);
+ String portalUrl = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/process_csp";
+ String getAccessLink = redirectUrl.substring(0, redirectUrl.lastIndexOf('/')) + "/get_access";
+%>
+<c:set var="returnPortalUrl" value="<%=portalUrl%>" />
+<c:set var="contactUsLink" value="<%=contactUsLink%>" />
+<c:set var="getAccessLink" value="<%=getAccessLink%>" />
+
+<style>
+</style>
+
+<%@include file="/WEB-INF/fusion/jsp/ebz/loginSnippet.html" %>
+
+<div style="position: relative; z-index: 999;">
+ <div ng-controller="headerController">
+
+ <div class="headerContainer" id="headerContainer" ng-cloak ng-show="{{showHeader}}">
+ <div id="megaMenuContainer" class="megaMenuContainer" style="margin-top: 0; overflow: visible;">
+ <div>
+ <!--for mega Menu-->
+ <!-- Mega Menu parent-tab directive with three models menu-items, active-sub-menu, active-menu -->
+ <div id="topMenu" class="top-megamenu" ng-mouseleave="activeClickSubMenu.x.active=false; activeClickMenu.x.active=false">
+ <div style="float:left;width:100%;"parent-tab menu-items="megaMenuDataObject" active-sub-menu='activeClickSubMenu.x' active-menu='activeClickMenu.x'>
+ <div parentmenu-tabs mega-menu="true" menu-items="megaMenuDataObject" style="height:55px;">
+ <div style="float:left">
+ <li class="megamenu__item" style="line-height:55px;" onclick="returnToPortal()">
+ <img src="app/fusion/external/ebz/images/att_logo.png" class="ATTLogo" ></span>
+ <strong style="font-weight: 400 !important; font-family: "Omnes-ECOMP-W02", Arial !important; font-size: 18px;" id='returnPortal' >ECOMP Portal</strong>
+ </li>
+ <div menu-tabs mega-menu="true" tab-name="item.text" menu-item="item" active-menu="activeClickMenu.x"
+ ng-repeat="item in megaMenuDataObject" style="font-size: 18px;" ng-mousedown="loadFavorites()" >
+ <div parentmenu-tabs sub-menu="true" ng-show="activeClickMenu.x.active && item.active" menu-items="activeClickMenu.x.children">
+ <!-- Second level menu -->
+ <div>
+ <div menu-tabs sub-menu="true" tab-name="subItem.text"
+ tab-url="subItem.url" menu-item="subItem"
+ ng-repeat="subItem in activeClickMenu.x.children | orderBy : 'column'" active-menu="activeClickSubMenu.x"
+ sub-item-active="{{subItem.active}}" style="float:left;" aria-label="{{subItem.text}}"
+ ng-mouseenter="submenuLevelAction(subItem.text,subItem.column)"
+ ng-mouseleave="submenuLevelAction(subItem.text,subItem.column)"
+ ng-click="submenuLevelAction(subItem.text,subItem.column)" >
+ <i ng-if="subItem.text=='Favorites'" id="favorite-star"
+ class="icon-star favorites-icon-active">
+ </i>
+ </div>
+
+ <div class="sub__menu" ng-mouseleave="activeClickSubMenu.x.active=false" >
+ <ul ng-show="activeClickSubMenu.x.active" role="menubar" class="columns">
+ <!-- Third level menu -->
+ <div menu-tabs menu-item="subItem"
+ class="columns-div"
+ ng-repeat="subItem in activeClickSubMenu.x.children | orderBy : 'column'"
+ ng-show="activeClickSubMenu.x.active">
+
+ <i id="favorite-selector-third-level"
+ ng-show="isUrlFavorite(subItem.menuId)==false"
+ class="icon-star favorites-icon-inactive"
+ ng-if="subItem.url.length > 1">
+ </i>
+ <i id="favorite-selector-third-level"
+ ng-show="isUrlFavorite(subItem.menuId)"
+ class="icon-star favorites-icon-active"
+ ng-if="subItem.url.length > 1">
+ </i>
+ <span class="title" aria-label="{{subItem.text}}"
+ ng-click="goToUrl(subItem)">{{subItem.text}}</span>
+ <!-- Fourth level menus -->
+ <div att-links-list="">
+ <i id="favorite-selector-fourth-level"
+ class="icon-star favorites-icon-inactive"
+ ng-show="isUrlFavorite(tabValue.menuId)==false"
+ ng-if="tabValue.url.length > 1">
+
+ </i>
+ <i id="favorite-selector-fourth-level"
+ class="icon-star favorites-icon-active"
+ ng-show="isUrlFavorite(tabValue.menuId)"
+ ng-if="tabValue.url.length > 1">
+
+ </i>
+ <span role="menuitem" att-links-list-item=""
+ ng-repeat="tabValue in subItem.children"
+ ng-click="goToUrl(tabValue)"
+ att-accessibility-click="13,32"
+ ng-class="{'disabled': tabValue.disabled}">{{tabValue.text}}</span>
+ </div>
+ <hr ng-show="!$last"/>
+
+ </div>
+ </ul>
+ <!-- Favorites level menu -->
+ <div class="favorites-window" ng-show='favoritesWindow' ng-mouseleave="hideFavoritesWindow()">
+ <div id="favorites-menu-items" ng-show="showFavorites">
+ <div ng-repeat="subItem in favoritesMenuItems" att-links-list="" style='display: inline'>
+ <i id="favorite-selector-favorites-list" class="icon-star favorites-icon-active">
+ </i>
+ <a id="favorites-list" aria-label="{{subItem.text}}"
+ ng-click="goToUrl(subItem)"
+ style="margin-left: 3px; margin-right: 20px; text-decoration: none; color: #666666;">
+ {{subItem.text}}
+ </a>
+ </div>
+ <div>
+ <br>
+ <p style='font-weight: 400; font-family: "Omnes-ECOMP-W02", Arial !important;
+ font-size: 18px; text-align: center; background-color: lightgray;
+ width: 400px; margin-left: 25%; margin-right: 25%;'>
+ Manage favorites on ECOMP Portal.
+ </p>
+ </div>
+ </div>
+ <!-- Favorites when empty -->
+ <div id="favorites-empty" ng-show='favoritesWindow' ng-show="emptyFavorites">
+ <div id="favorites-empty" ng-show="emptyFavorites" class="favorites-window-empty">
+ <div>
+ <img src="app/fusion/external/ebz/images/no_favorites_star.png">
+ <p class='favoritesLargeText'>No Favorites</p>
+ <p class='favoritesNormalText'>Manage favorites on ECOMP Portal.</p>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ </div>
+ </div >
+ <li class="megamenu__item" style="line-height:55px;" ng-if="loadMenufail">
+ <strong style="font-weight: 400 !important; font-family: "Omnes-ECOMP-W02", Arial !important; font-size: 18px;" >Unable to load menus</strong>
+ </li>
+<!-- <li class="megamenu__item" style="width: 20%;">&nbsp;</li>
+ --> </div>
+ <!-- Login Snippet-->
+ <div style="float:right">
+ <li id="bcLoginSnippet" class="megamenu__item" style="width: 140px;" >
+ <div popover="loginSnippet.html" aria-label="Login Snippet" referby="loginSnippet" att-accessibility-click="13,32" popover-style="\" popover-placement="below" style="width: 200px;">
+ <div class="icon-user-small login-snippet-icon"></div>
+ <div class="login-snippet-text" style="display: inline-block; font-size:12px; margin-left:5px;overflow: hidden; max-height: 31px; max-width:120px; padding-top: 0px; margin-top: 0px; white-space: nowrap;" ng-bind="userProfile.firstName"></div>
+ </div>
+ </li>
+ <li class="megamenu__item" style="width:120px;">&nbsp;</li>
+ </div>
+
+ </div>
+ </div>
+ <div style="clear: both"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="license-notification" id="license-notification">
+ <a href="javascript:void(0)" style="background-color:#bbb;" class="button button--small" tooltip="Please contact ECOMP Portal team to get the license" tooltip-placement="below" tooltip-style="light" tooltip-popup-delay="500" >
+ <span style="">{{app_name_full}}</span>
+ </a>
+ </div>
+ <div style="position: relative; color: black; top: 70px;">
+ <div ng-cloak>
+ <span ng-style="adjustHLeftMenu('burgerIcon')" style="z-index:998; position:fixed; left:0%; font-size:35px; margin-left:10px;text-decoration:none;">
+ <a ng-click="toggleDrawer();isOpen = !isOpen" href="javascript:void(0);" class="arrow-icon-left" >
+ <span class="icon-hamburger"></span></a>
+ <span ng-init="isOpen = true" ng-show="isOpen" style="font-size:16px; position:relative; top:-8px; left:-15px;">&nbsp&nbsp&nbsp {{app_name}}</span>
+ </span>
+ <div att-drawer drawer-slide="left" drawer-custom-top="{{drawer_custom_top}}px" drawer-size="200px" drawer-open="drawerOpen" drawer-custom-height="100%" >
+ <div ng-style="adjustHLeftMenu('leftMenu')">
+ <div class="attDrawer" style="margin-top:{{drawer_margin_top}}px;">
+ <div style="margin-left:10px; margin-right:10px;">
+ <accordion close-others="true" css="att-accordion--no-box">
+ <accordion-group ng-repeat="parent in menuItems" heading="{{parent.parentLabel}}" child="{{parent.parentAction}}" parent-link="{{parent.parentAction}}" image-source="{{parent.parentImageSrc}}" child-length="{{parent.childItemList.length}}" is-open="parent.open">
+ <div ng-repeat="subMenu in parent.childItemList" style="font-size:12px; margin-left:10px;">
+ <a href="{{subMenu.action}}" style="font-size:12px; color:#666666;" >{{subMenu.label}}</a>
+ </div>
+ </accordion-group>
+ </accordion>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script>
+ function returnToPortal(){
+ window.location.href = "<c:out value='${returnPortalUrl}'/>";
+ }
+ detectScrollEvent = function() {
+ var footerOff = $('#footerContainer').offset().top;
+ var headOff = $('#headerContainer').offset().top;
+ var winHeight = $(window).height();
+ if ((footerOff - headOff) <= winHeight) {
+ $('.att-drawer').css({
+ "height" : footerOff - headOff - 55
+ });
+ } else {
+ $('.att-drawer').css({
+ "height" : "94vh"
+ });
+ }
+ }
+ $(window).scroll(function() {
+ if ($('.att-drawer').is(':visible')) {
+ detectScrollEvent();
+ }
+ });
+ app.controller("headerController", function($scope, $timeout, $log, $http, UserInfoService, $window, $cookies,LeftMenuService) {
+ // $log.debug('HeaderController started');
+ $scope.jsonMenuData = [];
+ $scope.loadMenufail=false;
+ $scope.app_name = "";
+ $scope.app_name_full = "";
+ $scope.megaMenuDataObject =[];
+ $scope.activeClickSubMenu = {
+ x: ''
+ };
+ $scope.activeClickMenu = {
+ x: ''
+ };
+ $scope.favoritesMenuItems = [];
+ $scope.favoriteItemsCount = 0;
+ $scope.showFavorites = false;
+ $scope.emptyFavorites = false;
+ $scope.favoritesWindow = false;
+ $scope.userProfile={
+ firstName:'',
+ lastName:'',
+ fullName:'',
+ email:''
+ }
+ /*Put user info into fields*/
+ $scope.inputUserInfo = function(userInfo){
+ if (typeof(userInfo) != "undefined" && userInfo!=null && userInfo!=''){
+ if (typeof(userInfo.USER_FIRST_NAME) != "undefined" && userInfo.USER_FIRST_NAME!=null && userInfo.USER_FIRST_NAME!='')
+ $scope.userProfile.firstName = userInfo.USER_FIRST_NAME;
+ if (typeof(userInfo.USER_LAST_NAME) != "undefined" && userInfo.USER_LAST_NAME!=null && userInfo.USER_LAST_NAME!='')
+ $scope.userProfile.lastName = userInfo.USER_LAST_NAME;
+ if (typeof(userInfo.USER_EMAIL) != "undefined" && userInfo.USER_EMAIL!=null && userInfo.USER_EMAIL!='')
+ $scope.userProfile.email = userInfo.USER_EMAIL;
+ }
+ }
+ /*getting user info from session*/
+ $scope.getUserNameFromSession = function(){
+ UserInfoService.getFunctionalMenuStaticDetailSession()
+ .then(function (res) {
+ $scope.userProfile.firstName = res.firstName;
+ $scope.redirectUrl = res.portalUrl;
+ });
+ }
+ $scope.getTopMenuStaticInfo=function() {
+ var promise = UserInfoService.getFunctionalMenuStaticDetailShareContext();
+ promise.then(
+ function(res) {
+ if(res==null || res==''){
+ $log.info('failed getting static User information');
+ $scope.getUserNameFromSession();
+ }else{
+ $log.info('Received static User information');
+ var resData = res;
+ $scope.inputUserInfo(resData);
+ $scope.userProfile.fullName = $scope.userProfile.firstName+ ' '+ $scope.userProfile.lastName;
+ }
+ },
+ function(err) {
+ $log.info('failed getting static User information');
+ }
+ );
+ }
+
+ var unflatten = function( array, parent, tree ){
+ tree = typeof tree !== 'undefined' ? tree : [];
+ parent = typeof parent !== 'undefined' ? parent : { menuId: null };
+ var children = _.filter( array, function(child){ return child.parentMenuId == parent.menuId; });
+
+ if( !_.isEmpty( children ) ){
+ if( parent.menuId === null ){
+ tree = children;
+ }else{
+ parent['children'] = children
+ }
+ _.each( children, function( child ){ unflatten( array, child ) } );
+ }
+
+ return tree;
+ }
+
+ var menuStructureConvert = function(menuItems) {
+ var megaMenuDataObjectTemp = [
+ {
+ text: "ECOMP",
+ children:menuItems
+ },
+ {
+ text: "Help",
+ children: [{
+ text:"Contact Us",
+ url:"<c:out value='${contactUsLink}'/>"
+ },
+ {
+ text:"Get Access",
+ url:"<c:out value='${getAccessLink}'/>"
+ }]
+ }
+ ];
+ return megaMenuDataObjectTemp;
+ };
+
+
+ /*Left Menu*/
+ LeftMenuService.getAppName().then(function(response){
+ var j = response;
+ try{
+ if(j && j !== "null" && j!== "undefined"){
+ // console.log("app name is " + $scope.app_name);
+ $scope.app_name_full = j.data;
+ var processed_app_name = j.data;
+ if(processed_app_name.indexOf("[")<=-1) {
+ if (document.getElementById('license-notification')!=null)
+ document.getElementById('license-notification').style.display = "none";
+ }
+ var n = processed_app_name.length;
+ if (n > 15) {
+ n = 15;
+ }
+ $scope.app_name = processed_app_name.substr(0, n);
+ }else{
+ throw "Get app_name response is not an object/is empty";
+ }
+ }catch (e) {
+ console.log("error happened while trying to get app name "+e);
+ return;
+ }
+ },function(error){
+ console.log('getAppName failed', error);
+ });
+
+ $scope.getTopMenuStaticInfo();
+ $scope.getMenu=function() {
+
+ $http({
+ method: "GET",
+ url: 'get_functional_menu',
+// TIMEOUT USED FOR LOCAL TESTING ONLY
+// timeout: 100
+ }).success(function (response) {
+ if(response == '101: Timeout') {
+ $log.error('Timeout attempting to get_functional_menu');
+ // TIMEOUT USED FOR LOCAL TESTING ONLY
+// $scope.createErrorMenu();
+ $scope.megaMenuDataObject = menuStructureConvert('');
+ }else {
+ $log.debug('get_functional_menu success: ' + response);
+ if(typeof response != 'undefined' && response.length!=0 && typeof response[0] != 'undefined' && typeof response[0].error!="undefined"){
+// createErrorMenu() USED FOR LOCAL TESTING ONLY
+// $scope.createErrorMenu();
+ $scope.megaMenuDataObject = menuStructureConvert('');
+ // $scope.loadMenufail=true;
+ }else{
+ $scope.jsonMenuData = unflatten( response );
+ $scope.megaMenuDataObject = menuStructureConvert($scope.jsonMenuData);
+ }
+ }
+ }).error(function (response){
+// createErrorMenu() USED FOR LOCAL TESTING ONLY
+// $scope.createErrorMenu();
+
+ //$scope.loadMenufail=true;
+ $scope.megaMenuDataObject = menuStructureConvert('');
+ $log.debug('REST API failed get_functional_menu...'+ response);
+ });
+ }
+ $scope.adjustHLeftMenu = function (type){
+ $scope.showHeader = ($cookies.show_app_header == undefined ? true : $cookies.show_app_header);
+
+ if($scope.showHeader == true) {
+ $scope.drawer_margin_top = 60;
+ $scope.drawer_custom_top = 54;
+ $scope.toggle_drawer_top = 55;
+ }
+ else {
+
+ $scope.drawer_margin_top = 50;
+ $scope.drawer_custom_top = 0;
+ $scope.toggle_drawer_top = 10;
+ }
+ if(type=='burgerIcon'){
+ return { "top": $scope.toggle_drawer_top+"px"};
+ }else if(type=='leftMenu'){
+ return { "margin-top": $scope.drawer_margin_top+"px"};
+ }else
+ return;
+ }
+ $scope.adjustHeader=function() {
+ $scope.showHeader = ($cookies.show_app_header == undefined ? true : $cookies.show_app_header);
+
+ if($scope.showHeader == true) {
+ $scope.drawer_margin_top = 50;
+ $scope.drawer_custom_top = 54;
+ $scope.toggle_drawer_top = 55;
+ }
+ else {
+
+ $scope.drawer_margin_top = 40;
+ $scope.drawer_custom_top = 0;
+ $scope.toggle_drawer_top = 10;
+ }
+
+
+ }
+
+
+ //$scope.getMenu();
+ $scope.adjustHeader();
+
+
+ /* **************************************************************************/
+ /* Logic for the favorite menus is here */
+
+ $scope.loadFavorites = function () {
+ $log.debug('loadFavorites has happened.');
+ if ($scope.favoritesMenuItems == '') {
+ $scope.generateFavoriteItems();
+ $log.debug('loadFavorites is calling generateFavoriteItems()');
+ } else {
+ $log.debug('loadFavorites is NOT calling generateFavoriteItems()');
+ }
+ }
+
+ $scope.goToUrl = function (item) {
+ $log.info("goToUrl called")
+ $log.info(item);
+
+ var url = item.url;
+ var restrictedApp = item.restrictedApp;
+ $log.debug('Restricted app status is: ' + restrictedApp);
+ if (!url) {
+ $log.info('No url found for this application, doing nothing..');
+ return;
+ }
+ if (restrictedApp) {
+ $window.open(url, '_blank');
+ } else {
+ $window.open(url, '_self');
+ }
+
+ }
+
+ $scope.submenuLevelAction = function(index, column) {
+ if ($scope.favoritesMenuItems == '') {
+ $scope.generateFavoriteItems();
+ $log.debug('submenuLevelAction is calling generateFavoriteItems()');
+ }
+ $log.debug('item hovered/clicked: ' + index + '; column = ' + column);
+ if (column == 2) { // 2 is Design
+ $scope.favoritesWindow = false;
+ $scope.showFavorites = false;
+ $scope.emptyFavorites = false;
+ }
+ if (index=='Favorites' && $scope.favoriteItemsCount != 0) {
+ $log.debug('Showing Favorites window');
+ $scope.favoritesWindow = true;
+ $scope.showFavorites = true;
+ $scope.emptyFavorites = false;
+ }
+ if (index=='Favorites' && $scope.favoriteItemsCount == 0) {
+ $log.debug('Hiding Favorites window in favor of No Favorites Window');
+ $scope.favoritesWindow = true;
+ $scope.showFavorites = false;
+ $scope.emptyFavorites = true;
+ }
+ if (column > 2) {
+ $scope.favoritesWindow = false;
+ $scope.showFavorites = false;
+ $scope.emptyFavorites = false;
+ }
+ };
+
+ $scope.hideFavoritesWindow = function() {
+ $log.debug('$scope.hideFavoritesWindow has been called');
+ $scope.showFavorites = false;
+ $scope.emptyFavorites = false;
+ }
+
+ $scope.isUrlFavorite = function (menuId) {
+// $log.debug('array objects in menu favorites = ' + $scope.favoriteItemsCount + '; menuId=' + menuId);
+ var jsonMenu = JSON.stringify($scope.favoritesMenuItems);
+ var isMenuFavorite = jsonMenu.indexOf('menuId\":' + menuId);
+ if (isMenuFavorite==-1) {
+ return false;
+ } else {
+ return true;
+ }
+
+ }
+
+ $scope.generateFavoriteItems = function() {
+ $http({
+ method: "GET",
+ url: 'get_favorites',
+ // TIMEOUT USED FOR LOCAL TESTING ONLY
+// timeout: 100
+ }).success(function (response) {
+ if (response == '101: Timeout') {
+ $log.error('Timeout attempting to get_favorites_menu');
+ } else {
+ if(typeof response != 'undefined' && response.length!=0 && typeof response[0] != 'undefined' && typeof response[0].error!="undefined"){
+ $log.error('REST API failed get_favorites' + response);
+ }else{
+ $log.debug('get_favorites = ' + JSON.stringify(response));
+ $scope.favoritesMenuItems = response;
+ $scope.favoriteItemsCount = Object.keys($scope.favoritesMenuItems).length;
+ $log.info('number of favorite menus: ' + $scope.favoriteItemsCount);
+ }
+ }
+ }).error(function (response){
+ $log.error('REST API failed get_favorites' + response);
+ //createFavoriteErrorMenu() USED FOR LOCAL TESTING ONLY
+// $scope.createFavoriteErrorMenu();
+ });
+ }
+
+ $scope.createFavoriteErrorMenu=function() {
+ $scope.favoritesMenuItems = [
+//
+ ];
+ $scope.favoriteItemsCount = Object.keys($scope.favoritesMenuItems).length;
+ $log.info('number of favorite menus: ' + $scope.favoriteItemsCount);
+ }
+
+ /* end of Favorite Menu code */
+ /* **************************************************************************/
+
+
+ /* **************************************************************************/
+ // THIS IS USED FOR LOCAL TESTING ONLY
+ /* **************************************************************************/
+
+ $scope.createErrorMenu=function() {
+ $scope.jsonMenuData = [
+ {
+ "menuId": 1,
+ "column": 2,
+ "text": "Design",
+ "parentMenuId": null,
+ "url": ""
+ },
+ {
+ "menuId": 2,
+ "column": 3,
+ "text": "Infrastructure Ordering",
+ "parentMenuId": null,
+ "url": ""
+ },
+ {
+ "menuId": 3,
+ "column": 4,
+ "text": "Service Creation",
+ "parentMenuId": null,
+ "url": ""
+ },
+ {
+ "menuId": 4,
+ "column": 5,
+ "text": "Service Mgmt",
+ "parentMenuId": null,
+ "url": ""
+ },
+ {
+ "menuId": 90,
+ "column": 1,
+ "text": "Google",
+ "parentMenuId": 1,
+ "url": "http://google.com"
+ },
+ {
+ "menuId": 91,
+ "column": 1,
+ "text": "Mike Little's Coffee Cup",
+ "parentMenuId": 2,
+ "url": "http://coffee.com"
+ },
+ {
+ "menuId": 92,
+ "column": 2,
+ "text": "Andy and his Astrophotgraphy",
+ "parentMenuId": 3,
+ "url": "http://nightskypix.com"
+ },
+ {
+ "menuId": 93,
+ "column": 1,
+ "text": "JSONLint",
+ "parentMenuId": 4,
+ "url": "http://http://jsonlint.com"
+ },
+ {
+ "menuId": 94,
+ "column": 2,
+ "text": "HROneStop",
+ "parentMenuId": 4,
+ "url": "http://ebiz.sbc.com/hronestop"
+ },
+
+ {
+ "menuId": 96,
+ "column": 3,
+ "text": "3rd Level App1c R200",
+ "parentMenuId": 4,
+ "url": "http://app1c.com"
+ },
+ {
+ "menuId": 97,
+ "column": 1,
+ "text": "3rd Level App4b R16",
+ "parentMenuId": 5,
+ "url": "http://app4b.com"
+ },
+ {
+ "menuId": 98,
+ "column": 2,
+ "text": "3rd Level App2b R16",
+ "parentMenuId": 5,
+ "url": "http://app2b.com"
+ },
+ {
+ "menuId": 99,
+ "column": 1,
+ "text": "Favorites",
+ "parentMenuId": null,
+ "url": ""
+ }
+ ];
+ $scope.jsonMenuData = unflatten( $scope.jsonMenuData );
+ $scope.megaMenuDataObject = menuStructureConvert($scope.jsonMenuData);
+// $log.debug(JSON.stringify($scope.jsonMenuData));
+ }
+ var childItemList="";
+ var parentList = "";
+ try{
+ childItemList = ${menu.childItemList};
+ parentList = ${menu.parentList};
+ }catch(err){
+ console.log("ebz_header: failed to get child/parent lists", err);
+ }
+
+ var pageUrl = window.location.href.split('/')[window.location.href.split('/').length-1];
+
+ $scope.menuItems = [];
+ for (var i = 0; i < parentList.length; i++) {
+ $scope.openCurrentMenu = false;
+ if(pageUrl==parentList[i].action)
+ $scope.openCurrentMenu = true;
+ $scope.childItemList = childItemList[i];
+ for(chIndex in $scope.childItemList){
+ if($scope.childItemList.length>0)
+ if($scope.childItemList[chIndex].action!=null){
+ if($scope.childItemList[chIndex].action==pageUrl)
+ $scope.openCurrentMenu = true;
+ }
+ }
+ $scope.item = {
+ parentLabel : parentList[i].label,
+ parentAction : parentList[i].action,
+ parentImageSrc : parentList[i].imageSrc,
+ open:$scope.openCurrentMenu,
+ childItemList : $scope.childItemList
+ }
+ $scope.menuItems.push($scope.item);
+ }
+ $scope.arrowShow = true;
+ $scope.drawerOpen = false;
+ $scope.subMenuContent = false;
+ $scope.toggleSubMenu = function() {
+ $scope.subMenuContent = !$scope.subMenuContent;
+ };
+
+ var drawerOpen = 'open';
+ if (drawerOpen == 'open') {
+ $scope.drawerOpen = true;
+ $scope.arrowShow = true;
+ } else {
+ $scope.arrowShow = false;
+ }
+ $scope.arrowShow = true;
+ $scope.drawerOpen = false;
+ $scope.toggleDrawer = function() {
+ $scope.drawerOpen = !($scope.drawerOpen);
+ if ($scope.drawerOpen) {
+ $scope.arrowShow = true;
+ if (document.getElementById('mContent')!=null)
+ document.getElementById('mContent').style.marginLeft = "0px";
+ } else {
+ $scope.arrowShow = false;
+ if (document.getElementById('mContent')!=null)
+ document.getElementById('mContent').style.marginLeft = "-150px";
+ }
+ };
+ //var drawerOpen = getCookie('drawerOpen');
+ if (drawerOpen == 'open') {
+ $scope.drawerOpen = true;
+ $scope.arrowShow = true;
+ } else {
+ $scope.arrowShow = false;
+ }
+ $timeout(function() {
+ detectScrollEvent();
+ }, 800);
+
+ });
+
+ app.filter("ellipsis", function(){
+ return function(text, length){
+ if (text) {
+ var ellipsis = text.length > length ? "..." : "";
+ return text.slice(0, length) + ellipsis;
+ };
+ return text;
+ }
+ });
+</script> \ No newline at end of file
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml
new file mode 100644
index 00000000..6638b4bc
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!--
+ ================================================================================
+ eCOMP Portal SDK
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ================================================================================
+ -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.openecomp.portalsdk.rnotebookintegration.domain">
+
+
+ <!-- RNotebookIntegration mapping details -->
+ <class name="RNoteBookCredentials" table="rcloudinvocation">
+ <id name="token" column="ID">
+
+ </id>
+ <property name="createdDate" column="created"/>
+ <property name="userString" column="userInfo"/>
+ <property name="notebookID" column="notebookID"/>
+ <property name="parametersString" column="parameters"/>
+ <property name="tokenReadDate" column="tokenreaddate"/>
+
+ </class>
+
+
+
+</hibernate-mapping>
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/index.jsp b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/index.jsp
new file mode 100644
index 00000000..f6030c97
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/index.jsp
@@ -0,0 +1,24 @@
+<%--
+ ================================================================================
+ eCOMP Portal SDK
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ================================================================================
+ --%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
+<%-- Redirected because we can't set the welcome page to a virtual URL. --%>
+<%-- Forward to the intended start page to reduce frustration for new users. --%>
+<c:redirect url="/login.htm"></c:redirect>
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login.jsp b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login.jsp
new file mode 100644
index 00000000..09320356
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login.jsp
@@ -0,0 +1,113 @@
+<%--
+ ================================================================================
+ ECOMP Portal SDK
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ================================================================================
+--%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<!DOCTYPE html>
+<%
+ // Name is defined by app; do not throw if missing
+ final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME)
+ ? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)
+ : SystemProperties.APP_DISPLAY_NAME;
+%>
+
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Login</title>
+ <style>
+ html {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ }
+ body {
+ padding-top: 15px;
+ }
+ .logo {
+ position: fixed;
+ left: 15px;
+ top: 15px;
+ z-index: -1;
+ }
+ .loginError {
+ font-size: 18px;
+ color: red;
+ text-align: center;
+ }
+ .login {
+ font-size: 16px;
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ width: 100%;
+ }
+ .login input[type=submit] {
+ font-size: 16px;
+ }
+ .terms {
+ font-size: 10px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .terms a {
+ font-size: 10px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="login">
+ <img src="static/fusion/images/ecomp_trans.png" />
+ <h2>
+ <%=appDisplayName%>
+ </h2>
+ <br />
+ <form action="login_external" method="POST">
+ <label for="loginId">Login ID:</label>
+ <input id="loginId" name="loginId" type="text" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" maxlength="30">
+ <br/>
+ <br/>
+ <label for="password">Password:</label>
+ <input id="password" name="password" type="password" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;"
+ maxlength="30" >
+ <br />
+ <br />
+ <input id="loginBtn" type="submit" alt="Login" value="Login">
+ </form>
+ </div>
+ <br />
+ <br />
+ <div class="loginError">${model.error}</div>
+ <br />
+ <br />
+ <br />
+ <br />
+ <br />
+ <br />
+ <div id="footer">
+ <div class="terms">
+ Copyright 2017 Open ECOMP and Linux Foundation.
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp
new file mode 100644
index 00000000..9d099bf0
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp
@@ -0,0 +1,117 @@
+<%--
+ ================================================================================
+ ECOMP Portal SDK
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property
+ ================================================================================
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ================================================================================
+--%>
+<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%>
+<!DOCTYPE html>
+<%
+ // Name is defined by app; do not throw if missing
+ final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME)
+ ? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)
+ : SystemProperties.APP_DISPLAY_NAME;
+%>
+
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <style>
+ html {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ }
+ body {
+ padding-top: 15px;
+ }
+ .logo {
+ position: fixed;
+ left: 15px;
+ top: 15px;
+ z-index: -1;
+ }
+ .loginError {
+ font-size: 18px;
+ color: red;
+ text-align: center;
+ }
+ .login {
+ font-size: 16px;
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ width: 100%;
+ }
+ .login input[type=submit] {
+ font-size: 16px;
+ }
+ .terms {
+ font-size: 10px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .terms a {
+ font-size: 10px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ </style>
+ </head>
+ <body>
+
+ <div class="login">
+ <img src="static/fusion/images/ecomp_trans.png" />
+ <h2>
+ <%=appDisplayName%>
+ </h2>
+ <br />
+ <form action="login_external" method="POST">
+ <label for="loginId">Login ID:</label>
+ <input id="loginId" name="loginId" type="text" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" maxlength="30">
+ <br/>
+ <br/>
+ <label for="password">Password:</label>
+ <input id="password" name="password" type="password" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;"
+ maxlength="30" >
+ <br />
+ <br />
+ <input id="loginBtn" type="submit" alt="Login" value="Login">
+ </form>
+ </div>
+ <br />
+ <br />
+ <div class="loginError">${model.error}</div>
+ <br />
+ <br />
+ <br />
+ <br />
+ <br />
+ <br />
+ <div id="footer">
+ <div class="terms">
+ Copyright 2017 Open ECOMP and Linux Foundation.
+ </div>
+ <p>
+ <div class="terms">
+
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/web.xml b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 00000000..0290f1fc
--- /dev/null
+++ b/ecomp-sdk/epsdk-app-os/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee"
+ xmlns:web="http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+ version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
+
+ <display-name>ecomp-sdk-app-os</display-name>
+
+ <!-- The app can function on a HA cluster -->
+ <distributable />
+
+ <session-config>
+ <session-timeout>7</session-timeout>
+ <tracking-mode>COOKIE</tracking-mode>
+ </session-config>
+
+</web-app> \ No newline at end of file