From 428150834ee60899b9a8da019bae3c8bf009adf1 Mon Sep 17 00:00:00 2001 From: rb7147 Date: Mon, 4 Dec 2017 16:45:55 -0500 Subject: [PATCH] Upgraded the latest ONAP SDK Upgraded latest ONAP SDK Code. Change-Id: I669d6cfcefe068b1e4c078889d7d6c77ce788e2e Issue-ID: POLICY-432 Signed-off-by: rb7147 --- .../pap/xacml/rest/components/PolicyDBDao.java | 8 +- .../onap/policy/rest/adapter/AddressGroupJson.java | 8 +- .../onap/policy/rest/adapter/AddressMembers.java | 9 + .../policy/rest/adapter/AddressMembersJson.java | 46 ++++ .../org/onap/policy/rest/jpa/PolicyVersion.java | 2 +- ONAP-SDK-APP/README.md | 68 ------ ONAP-SDK-APP/pom.xml | 100 +++++--- .../portalapp/conf/ExternalAppConfig.java | 44 ++-- .../portalapp/conf/ExternalAppInitializer.java | 4 +- .../portalapp/conf/HibernateMappingLocations.java | 19 +- .../onap/portalapp/filter/SecurityXssFilter.java | 90 +++++++ .../onap/portalapp/login/LoginStrategyImpl.java | 113 +++++++++ .../portalapp/scheduler/Register.java | 25 +- .../portalapp/scheduler/RegistryAdapter.java | 17 +- .../portalapp/service/AdminAuthExtension.java | 12 +- .../portalapp/lm/FusionLicenseManagerImpl.java | 88 ------- .../portalapp/lm/LicenseableClassImpl.java | 62 ----- .../portalapp/login/LoginStrategyImpl.java | 93 ------- ONAP-SDK-APP/src/main/resources/key.properties | 23 ++ ONAP-SDK-APP/src/main/resources/logback.xml | 49 ++-- ONAP-SDK-APP/src/main/resources/portal.properties | 28 +-- .../src/main/webapp/WEB-INF/conf/system.properties | 38 +-- .../src/main/webapp/WEB-INF/defs/definitions.xml | 10 +- .../webapp/WEB-INF/fusion/conf/fusion.properties | 9 +- .../webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp | 33 +-- .../fusion/orm/RNoteBookIntegration.hbm.xml | 2 +- ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login.jsp | 2 +- .../src/main/webapp/WEB-INF/jsp/login_external.jsp | 2 +- ONAP-SDK-APP/src/main/webapp/WEB-INF/web.xml | 10 +- .../ds2/css/digital-ng-library/ecomp-ionicons.css | 193 +++++++++++++++ .../ds2/css/digital-ng-library/ionicons.css | 105 ++++---- .../ds2-profile/profile_searchDS2.html | 9 +- .../DS2-view-models/ds2-profile/self_profile.html | 41 ++-- .../ds2-samplePages/samplePage.html | 62 ----- .../fusion/scripts/DS2-view-models/ds2Header.html | 68 ------ .../scripts/DS2-view-models/header-logo.html | 2 + .../app/fusion/scripts/utils/page-resource-ds2.js | 97 -------- .../static/fusion/sample/html/data/worddata.csv | 2 +- .../static/fusion/sample/images/Calendar-16x16.png | Bin 552 -> 0 bytes .../static/fusion/sample/images/arrow-next.png | Bin 1561 -> 0 bytes .../static/fusion/sample/images/arrow-prev.png | Bin 1557 -> 0 bytes .../static/fusion/sample/images/copyicon.png | Bin 235 -> 0 bytes .../static/fusion/sample/images/deleteicon.gif | Bin 579 -> 0 bytes .../static/fusion/sample/images/example-frame.png | Bin 33699 -> 0 bytes .../webapp/static/fusion/sample/images/loading.gif | Bin 6820 -> 0 bytes .../static/fusion/sample/js/slides.min.jquery.js | 20 -- .../webapp/static/fusion/sample/js/spacegallery.js | 235 ------------------ .../sample/org_chart/css/jquery.jOrgChart.css | 51 ---- .../static/fusion/sample/org_chart/example.html | 85 ------- .../fusion/sample/org_chart/example_vsp.html | 88 ------- .../static/fusion/sample/org_chart/images/bkgd.png | Bin 133 -> 0 bytes .../fusion/sample/org_chart/images/raspberry.jpg | Bin 5755 -> 0 bytes .../fusion/sample/org_chart/jquery.jOrgChart.js | 267 --------------------- POLICY-SDK-APP/pom.xml | 2 +- .../onap/policy/admin/PolicyManagerServlet.java | 27 ++- .../onap/policy/admin/PolicyNotificationMail.java | 3 + .../onap/policy/admin/PolicyRestController.java | 48 +++- .../policy/admin/PolicyUserInfoController.java | 6 +- .../policy/controller/ActionPolicyController.java | 6 +- .../onap/policy/controller/AdminTabController.java | 9 +- .../onap/policy/controller/AutoPushController.java | 20 +- .../controller/CreateBRMSParamController.java | 2 +- .../CreateClosedLoopFaultController.java | 2 +- .../CreateDcaeMicroServiceController.java | 54 ++--- .../controller/CreateFirewallController.java | 158 +++++++----- .../policy/controller/CreatePolicyController.java | 2 +- .../policy/controller/DashboardController.java | 17 +- .../controller/DecisionPolicyController.java | 4 +- .../org/onap/policy/controller/PDPController.java | 31 ++- .../onap/policy/controller/PolicyController.java | 13 +- .../PolicyExportAndImportController.java | 6 +- .../controller/PolicyNotificationController.java | 4 +- .../policy/controller/PolicyRolesController.java | 9 +- .../controller/PolicyValidationController.java | 6 +- .../{openecomp => onap}/policy/model/Roles.java | 2 +- .../policy/admin/PolicyManagerServletTest.java | 2 +- .../policy/admin/PolicyRestControllerTest.java | 4 +- .../policy/admin/PolicyUserInfoControllerTest.java | 4 +- .../policy/controller/AdminTabControllerTest.java | 13 +- .../onap/policy/controller/PDPControllerTest.java | 2 +- 80 files changed, 1039 insertions(+), 1756 deletions(-) create mode 100644 ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembersJson.java delete mode 100644 ONAP-SDK-APP/README.md rename ONAP-SDK-APP/src/main/java/org/{openecomp => onap}/portalapp/conf/ExternalAppConfig.java (80%) rename ONAP-SDK-APP/src/main/java/org/{openecomp => onap}/portalapp/conf/ExternalAppInitializer.java (94%) rename ONAP-SDK-APP/src/main/java/org/{openecomp => onap}/portalapp/conf/HibernateMappingLocations.java (79%) create mode 100644 ONAP-SDK-APP/src/main/java/org/onap/portalapp/filter/SecurityXssFilter.java create mode 100644 ONAP-SDK-APP/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java rename ONAP-SDK-APP/src/main/java/org/{openecomp => onap}/portalapp/scheduler/Register.java (73%) rename ONAP-SDK-APP/src/main/java/org/{openecomp => onap}/portalapp/scheduler/RegistryAdapter.java (88%) rename ONAP-SDK-APP/src/main/java/org/{openecomp => onap}/portalapp/service/AdminAuthExtension.java (92%) delete mode 100644 ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/FusionLicenseManagerImpl.java delete mode 100644 ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/LicenseableClassImpl.java delete mode 100644 ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/login/LoginStrategyImpl.java create mode 100644 ONAP-SDK-APP/src/main/resources/key.properties create mode 100644 ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css delete mode 100644 ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-samplePages/samplePage.html delete mode 100644 ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2Header.html create mode 100644 ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html delete mode 100644 ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/utils/page-resource-ds2.js delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/Calendar-16x16.png delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/arrow-next.png delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/arrow-prev.png delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/copyicon.png delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/deleteicon.gif delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/example-frame.png delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/loading.gif delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/js/slides.min.jquery.js delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/js/spacegallery.js delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/css/jquery.jOrgChart.css delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example.html delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example_vsp.html delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/images/bkgd.png delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/images/raspberry.jpg delete mode 100644 ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/jquery.jOrgChart.js rename POLICY-SDK-APP/src/main/java/org/{openecomp => onap}/policy/model/Roles.java (98%) diff --git a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDBDao.java b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDBDao.java index 7591781ff..cf183114c 100644 --- a/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDBDao.java +++ b/ONAP-PAP-REST/src/main/java/org/onap/policy/pap/xacml/rest/components/PolicyDBDao.java @@ -1219,13 +1219,12 @@ public class PolicyDBDao { groupQuery.setParameter("groupId", group.getId()); groupQuery.setParameter("deleted", false); List groupQueryList = groupQuery.getResultList(); - if(groupQueryList!=null){ + if(groupQueryList!=null && !groupQueryList.isEmpty()){ GroupEntity dbgroup = (GroupEntity)groupQueryList.get(0); updatedGroup = synchronizeGroupPoliciesInFileSystem(group, dbgroup); + logger.info("Group was updated during file system audit: " + updatedGroup.toString()); } - } catch (PAPException e) { - logger.error(e); - } catch (PolicyDBException e) { + } catch (PAPException | PolicyDBException e) { logger.error(e); } catch (Exception e) { logger.error(e); @@ -1236,7 +1235,6 @@ public class PolicyDBDao { em.getTransaction().commit(); em.close(); - logger.info("Group was updated during file system audit: " + updatedGroup.toString()); return updatedGroup; } diff --git a/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressGroupJson.java b/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressGroupJson.java index c634a74d1..da4671ba4 100644 --- a/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressGroupJson.java +++ b/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressGroupJson.java @@ -28,7 +28,7 @@ public class AddressGroupJson { protected String name; protected String description; - protected List members; + protected List members; // name public String getName() { @@ -66,16 +66,16 @@ public class AddressGroupJson { this.description = value; } - public List getMembers() + public List getMembers() { if(members==null) { - members= new ArrayList(); + members= new ArrayList(); } return this.members; } - public void setMembers(List members) + public void setMembers(List members) { this.members = members; } diff --git a/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembers.java b/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembers.java index 14e46f15f..e6b993fb9 100644 --- a/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembers.java +++ b/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembers.java @@ -25,6 +25,7 @@ package org.onap.policy.rest.adapter; public class AddressMembers { protected String type; + protected String name; protected String value; public String getType() { @@ -35,6 +36,14 @@ public class AddressMembers { this.type = type; } + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public String getValue() { return value; } diff --git a/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembersJson.java b/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembersJson.java new file mode 100644 index 000000000..e97d2b2cf --- /dev/null +++ b/ONAP-REST/src/main/java/org/onap/policy/rest/adapter/AddressMembersJson.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP Policy Engine + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.rest.adapter; + + + +public class AddressMembersJson { + + protected String type; + protected String name; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/ONAP-REST/src/main/java/org/onap/policy/rest/jpa/PolicyVersion.java b/ONAP-REST/src/main/java/org/onap/policy/rest/jpa/PolicyVersion.java index bc6ad99fd..dd51bee2a 100644 --- a/ONAP-REST/src/main/java/org/onap/policy/rest/jpa/PolicyVersion.java +++ b/ONAP-REST/src/main/java/org/onap/policy/rest/jpa/PolicyVersion.java @@ -168,7 +168,7 @@ public class PolicyVersion implements Serializable { return modifiedDate; } - public void setModifiedDate(Timestamp modifiedDate) { + public void setModifiedDate(Date modifiedDate) { this.modifiedDate = modifiedDate; } diff --git a/ONAP-SDK-APP/README.md b/ONAP-SDK-APP/README.md deleted file mode 100644 index 043a967fd..000000000 --- a/ONAP-SDK-APP/README.md +++ /dev/null @@ -1,68 +0,0 @@ -Onap SDK Web App -================= - -This is a Maven project with the ONAP SDK web application for public release, containing files specific to requirements of the open-source version. This project uses the Maven war plugin to copy in ("overlay") the contents of the ONAP SDK web application overlay files distribution at package time. - -Use Apache Maven to build, package and deploy this webapp to a web container like Apache Tomcat. Eclipse users must install the M2E-WTP connector, see https://www.eclipse.org/m2e-wtp/ -Release Notes - -All of the release notes in the epsdk-app-common and epsdk-app-overlay areas apply here! - -Build 1.2.8, ?? ??? 2017 - - put new entries here * - -Build 1.2.7, 10 Apr 2017 - - Drop shared context property - -Build 1.2.6, 23 Mar 2017 - - DE270905 Removed total page/current page text boxes from bottom of Profile Search page - DE272154 SDK-App: self profile page, changes on drop downs not saved (120272) - DE273128 Revise left menu to have unique IDs - DE271378 fixed Camunda Page link in fn_menu; additional links were updated: Notebook - US847688 Abstraction of support page content for AT&T vs Open Source in SQL Scripts - Add sample defs/definitions.xml file for partner applications to configure jsp pages - Downgrade angularJS from 1.5.0 to 1.4.8 - -Build 1.2.5, 16 Mar 2017 - - DE272709 Update icon names from DS1 to DS2 in database load script - Upgrade to EPSDK libraries version 1.2.5 - -Build 1.2.4, 10 Mar 2017 - - DE272042 Add missing includes so left menu appears on collaborate and notebook pages - DE272193 Fix class/icon name to restore role icon on Self Profile page - Restore spinners by changing class name from icon-spinner to icon-primary-spinner - DE272202 updated ionicon.css for open source version of report search page - Removed unused js files from samplePage.html in epsdk-app-os - Upgrade to EPSDK libraries version 1.2.4 - -Build 1.2.3, 8 Mar 2017 - - DE271038 Remove references to famous telecommunications company from system.properties - Upgrade to EPSDK libraries version 1.2.3 - -Build 1.2.2, 6 Mar 2017 - - DE270658 EPSDK-app-os header is covering part of left menu. - DE271510 Pages not loading in IE and FF properly. Drop page-resource-ds2.js; load scripts in HTML directly - Remove references to famous telecommunications company hosts from fusion.properties, portal.properties - Upgrade to EPSDK libraries version 1.2.2 - -Build 1.2.1, 2 Mar 2017 - - DE269231 Separated footer files on OS module displaying black footer with no content - US847688 Split database scripts; include full set in distributions - US847706 Refactored AdminAuthExtension to implement interface expected in OnboardingApiServiceImpl - Added class conf/HibernateMappingLocations - moved out of common to apps - Added file logback.xml to src/main/resources with appropriate logger names - Extend HibernateMappingLocations with method that returns list of package names to scan - Remove references to famous telecommunications company hosts from system.properties file - Upgrade to EPSDK libraries version 1.2.1 - -Build 1.2.0, 9 Feb 2017 - - Initial release diff --git a/ONAP-SDK-APP/pom.xml b/ONAP-SDK-APP/pom.xml index 32cac6e92..e1497ccac 100644 --- a/ONAP-SDK-APP/pom.xml +++ b/ONAP-SDK-APP/pom.xml @@ -17,7 +17,6 @@ limitations under the License. ============LICENSE_END========================================================= --> - 4.0.0 @@ -31,14 +30,17 @@ UTF-8 - 1.3.1 + 2.1.0-SNAPSHOT 4.2.0.RELEASE 4.3.11.Final true 2.6.0 - **/gen/**,**/generated-sources/**,**/yang-gen**,**/pax/**,src/main/webapp/**/* + **/gen/**,**/generated-sources/**,**/yang-gen**,**/pax/**,src/main/webapp/**/* + + http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.37/bin + apache-tomcat-8.0.37 @@ -96,7 +98,7 @@ maven-war-plugin 2.1 - true + true true @@ -111,8 +113,8 @@ org.onap.portal.sdk epsdk-app-overlay - static/fusion/raptor/uigrid/vfs_fonts.js - + static/fusion/raptor/uigrid/vfs_fonts.js + org.onap.policy.engine @@ -122,29 +124,71 @@ - org.apache.maven.plugins - maven-assembly-plugin - 3.0.0 - - ${skipassembly} - - ${basedir}/distribution.xml - - - - - make-assembly - package - - single - - - - + org.apache.maven.plugins + maven-assembly-plugin + 3.0.0 + + ${skipassembly} + + ${basedir}/distribution.xml + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-deploy-plugin + + + true + + + + io.fabric8 + docker-maven-plugin + 0.22.0 + + true + + + onap/portal-sdk:${project.version} + + frolvlad/alpine-oraclejdk8:slim + + artifact + + + + + tar -xzf ${tomcat.download.name}.tar.gz + rm -f ${tomcat.download.name}.tar.gz + rm -fr ${tomcat.download.name}/webapps/[a-z]* + mkdir -p /opt + mv ${tomcat.download.name} /opt + + + + /opt/${tomcat.download.name}/bin/catalina.sh run + + + + + + + - + org.onap.policy.engine POLICY-SDK-APP @@ -202,7 +246,7 @@ mysql - mysql-connector-java + mysql-connector-java @@ -227,7 +271,7 @@ eelf-core 0.0.1 - + org.slf4j jcl-over-slf4j diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/ExternalAppConfig.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java similarity index 80% rename from ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/ExternalAppConfig.java rename to ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java index 1b6397c05..7db760a93 100644 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/ExternalAppConfig.java +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java @@ -17,21 +17,20 @@ * limitations under the License. * ================================================================================ */ -package org.openecomp.portalapp.conf; +package org.onap.portalapp.conf; import java.util.ArrayList; import java.util.List; -import org.openecomp.portalapp.login.LoginStrategyImpl; -import org.openecomp.portalapp.scheduler.RegistryAdapter; -import org.openecomp.portalsdk.core.auth.LoginStrategy; -import org.openecomp.portalsdk.core.conf.AppConfig; -import org.openecomp.portalsdk.core.conf.Configurable; -import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager; -import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException; -import org.openecomp.portalsdk.core.service.DataAccessService; -import org.openecomp.portalsdk.core.util.CacheManager; -import org.openecomp.portalsdk.core.util.SystemProperties; +import org.onap.portalapp.login.LoginStrategyImpl; +import org.onap.portalapp.scheduler.RegistryAdapter; +import org.onap.portalsdk.core.auth.LoginStrategy; +import org.onap.portalsdk.core.conf.AppConfig; +import org.onap.portalsdk.core.conf.Configurable; +import org.onap.portalsdk.core.objectcache.AbstractCacheManager; +import org.onap.portalsdk.core.service.DataAccessService; +import org.onap.portalsdk.core.util.CacheManager; +import org.onap.portalsdk.core.util.SystemProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -48,12 +47,12 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; /** - * ONAP Portal SDK sample application. ONAP Portal SDK core AppConfig class to + * ONAP Portal SDK sample application. Extends core AppConfig class to * reuse interceptors, view resolvers and other features defined there. */ @Configuration @EnableWebMvc -@ComponentScan(basePackages = "org.onap, org.openecomp") +@ComponentScan(basePackages = "org.onap") @PropertySource(value = { "${container.classpath:}/WEB-INF/conf/app/test.properties" }, ignoreResourceNotFound = true) @Profile("src") @EnableAsync @@ -68,24 +67,27 @@ public class ExternalAppConfig extends AppConfig implements Configurable { } /** - * @see org.openecomp.portalsdk.core.conf.AppConfig#viewResolver() + * @see org.onap.portalsdk.core.conf.AppConfig#viewResolver() */ + @Override public ViewResolver viewResolver() { return super.viewResolver(); } /** - * @see org.openecomp.portalsdk.core.conf.AppConfig#addResourceHandlers(ResourceHandlerRegistry) + * @see org.onap.portalsdk.core.conf.AppConfig#addResourceHandlers(ResourceHandlerRegistry) * * @param registry */ + @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { super.addResourceHandlers(registry); } /** - * @see org.openecomp.portalsdk.core.conf.AppConfig#dataAccessService() + * @see org.onap.portalsdk.core.conf.AppConfig#dataAccessService() */ + @Override public DataAccessService dataAccessService() { // Echo the JDBC URL to assist developers when starting the app. System.out.println("ExternalAppConfig: " + SystemProperties.DB_CONNECTIONURL + " is " @@ -99,6 +101,7 @@ public class ExternalAppConfig extends AppConfig implements Configurable { * * @return List of String, size 1 */ + @Override public List addTileDefinitions() { List definitions = new ArrayList<>(); definitions.add("/WEB-INF/defs/definitions.xml"); @@ -136,15 +139,11 @@ public class ExternalAppConfig extends AppConfig implements Configurable { */ // @Bean // ANNOTATION COMMENTED OUT // APPLICATIONS REQUIRING QUARTZ SHOULD RESTORE ANNOTATION - public SchedulerFactoryBean schedulerFactoryBean() throws PortalAPIException { + public SchedulerFactoryBean schedulerFactoryBean() throws Exception { SchedulerFactoryBean scheduler = new SchedulerFactoryBean(); scheduler.setTriggers(schedulerRegistryAdapter.getTriggers()); scheduler.setConfigLocation(appApplicationContext.getResource("WEB-INF/conf/quartz.properties")); - try{ - scheduler.setDataSource(dataSource()); - }catch(Exception e){ - throw new PortalAPIException(e); - } + scheduler.setDataSource(dataSource()); return scheduler; } @@ -160,7 +159,6 @@ public class ExternalAppConfig extends AppConfig implements Configurable { @Bean public LoginStrategy loginStrategy() { - return new LoginStrategyImpl(); } } diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/ExternalAppInitializer.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/ExternalAppInitializer.java similarity index 94% rename from ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/ExternalAppInitializer.java rename to ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/ExternalAppInitializer.java index 2a904ce3c..8a1fff0f5 100644 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/ExternalAppInitializer.java +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/ExternalAppInitializer.java @@ -17,9 +17,9 @@ * limitations under the License. * ================================================================================ */ -package org.openecomp.portalapp.conf; +package org.onap.portalapp.conf; -import org.openecomp.portalsdk.core.conf.AppInitializer; +import org.onap.portalsdk.core.conf.AppInitializer; public class ExternalAppInitializer extends AppInitializer { diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/HibernateMappingLocations.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/HibernateMappingLocations.java similarity index 79% rename from ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/HibernateMappingLocations.java rename to ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/HibernateMappingLocations.java index c66a96c6b..01591ccf3 100644 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/conf/HibernateMappingLocations.java +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/conf/HibernateMappingLocations.java @@ -17,25 +17,18 @@ * limitations under the License. * ================================================================================ */ -package org.openecomp.portalapp.conf; +package org.onap.portalapp.conf; +import org.onap.portalsdk.core.conf.HibernateMappingLocatable; import org.springframework.context.annotation.Profile; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.stereotype.Component; -import org.openecomp.portalsdk.core.conf.HibernateMappingLocatable; - @Component @Profile("src") public class HibernateMappingLocations implements HibernateMappingLocatable { - /* - * (non-Javadoc) - * - * @see org.openecomp.portalsdk.core.conf.HibernateMappingLocatable# - * getMappingLocations() - */ @Override public Resource[] getMappingLocations() { return new Resource[] { new ClassPathResource("../fusion/orm/Fusion.hbm.xml"), @@ -43,15 +36,9 @@ public class HibernateMappingLocations implements HibernateMappingLocatable { new ClassPathResource("../fusion/orm/RNoteBookIntegration.hbm.xml") }; } - /* - * (non-Javadoc) - * - * @see org.openecomp.portalsdk.core.conf.HibernateMappingLocatable# - * getPackagesToScan() - */ @Override public String[] getPackagesToScan() { - return new String[] { "org.onap", "org.openecomp" }; + return new String[] { "org.onap" }; } } diff --git a/ONAP-SDK-APP/src/main/java/org/onap/portalapp/filter/SecurityXssFilter.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/filter/SecurityXssFilter.java new file mode 100644 index 000000000..9843f604a --- /dev/null +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/filter/SecurityXssFilter.java @@ -0,0 +1,90 @@ +/*- + * ================================================================================ + * ONAP Portal SDK + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ +package org.onap.portalapp.filter; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.onap.portalapp.util.SecurityXssValidator; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; +import org.springframework.web.util.WebUtils; + +public class SecurityXssFilter extends OncePerRequestFilter { + + private static final String BAD_REQUEST = "BAD_REQUEST"; + + private SecurityXssValidator validator = SecurityXssValidator.getInstance(); + + private static String getRequestData(final HttpServletRequest request) throws UnsupportedEncodingException { + String payload = null; + ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class); + if (wrapper != null) { + byte[] buf = wrapper.getContentAsByteArray(); + if (buf.length > 0) { + payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding()); + } + } + return payload; + } + + private static String getResponseData(final HttpServletResponse response) throws IOException { + String payload = null; + ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, + ContentCachingResponseWrapper.class); + if (wrapper != null) { + byte[] buf = wrapper.getContentAsByteArray(); + if (buf.length > 0) { + payload = new String(buf, 0, buf.length, wrapper.getCharacterEncoding()); + wrapper.copyBodyToResponse(); + } + } + return payload; + } + + @SuppressWarnings("unused") + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + if (request.getMethod().equalsIgnoreCase("POST") || request.getMethod().equalsIgnoreCase("PUT")) { + + HttpServletRequest requestToCache = new ContentCachingRequestWrapper(request); + HttpServletResponse responseToCache = new ContentCachingResponseWrapper(response); + filterChain.doFilter(requestToCache, responseToCache); + String requestData = getRequestData(requestToCache); + String responseData = getResponseData(responseToCache); + if (StringUtils.isNotBlank(requestData) && validator.denyXSS(requestData)) { + throw new SecurityException(BAD_REQUEST); + } + + } else { + filterChain.doFilter(request, response); + } + + } +} diff --git a/ONAP-SDK-APP/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java new file mode 100644 index 000000000..af6e0ae69 --- /dev/null +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java @@ -0,0 +1,113 @@ +/*- + * ================================================================================ + * ONAP Portal SDK + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ================================================================================ + */ + +package org.onap.portalapp.login; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.onap.portalsdk.core.auth.LoginStrategy; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.onap.portalsdk.core.onboarding.exception.CipherUtilException; +import org.onap.portalsdk.core.onboarding.exception.PortalAPIException; +import org.onap.portalsdk.core.onboarding.util.CipherUtil; +import org.onap.portalsdk.core.util.SystemProperties; +import org.springframework.web.servlet.ModelAndView; + +/** + * Implements basic single-signon login strategy for open-source applications + * when users start at Portal. Extracts an encrypted user ID sent by Portal. + */ +public class LoginStrategyImpl extends LoginStrategy { + + private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(LoginStrategyImpl.class); + + /** + * login for open source is same as external login in the non-open-source + * version. + */ + @Override + public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception { + return doExternalLogin(request, response); + } + + @Override + public String getUserId(HttpServletRequest request) throws PortalAPIException { + // Check ECOMP Portal cookie + Cookie ep = getCookie(request, EP_SERVICE); + if (ep == null) { + logger.debug(EELFLoggerDelegate.debugLogger, "getUserId: no EP_SERVICE cookie, returning null"); + return null; + } + + String userid = null; + try { + userid = getUserIdFromCookie(request); + } catch (Exception e) { + logger.error(EELFLoggerDelegate.errorLogger, "getUserId failed", e); + } + return userid; + } + + /** + * Searches the request for the user-ID cookie and decrypts the value using a + * key configured in properties + * + * @param request + * HttpServletRequest + * @return User ID + * @throws CipherUtilException + * On any failure to decrypt + */ + @SuppressWarnings("deprecation") + private String getUserIdFromCookie(HttpServletRequest request) throws CipherUtilException { + String userId = ""; + Cookie userIdCookie = getCookie(request, USER_ID); + if (userIdCookie != null) { + final String cookieValue = userIdCookie.getValue(); + if (!SystemProperties.containsProperty(SystemProperties.Decryption_Key)) + throw new IllegalStateException("Failed to find property " + SystemProperties.Decryption_Key); + final String decryptionKey = SystemProperties.getProperty(SystemProperties.Decryption_Key); + userId = CipherUtil.decrypt(cookieValue, decryptionKey); + logger.debug(EELFLoggerDelegate.debugLogger, "getUserIdFromCookie: decrypted as {}", userId); + } + return userId; + } + + /** + * Searches the request for the named cookie. + * + * @param request + * HttpServletRequest + * @param cookieName + * Name of desired cookie + * @return Cookie if found; otherwise null. + */ + private Cookie getCookie(HttpServletRequest request, String cookieName) { + Cookie[] cookies = request.getCookies(); + if (cookies != null) + for (Cookie cookie : cookies) + if (cookie.getName().equals(cookieName)) + return cookie; + return null; + } + +} diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/scheduler/Register.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/scheduler/Register.java similarity index 73% rename from ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/scheduler/Register.java rename to ONAP-SDK-APP/src/main/java/org/onap/portalapp/scheduler/Register.java index 0bb7da14a..2a355787b 100644 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/scheduler/Register.java +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/scheduler/Register.java @@ -17,14 +17,14 @@ * limitations under the License. * ================================================================================ */ -package org.openecomp.portalapp.scheduler; +package org.onap.portalapp.scheduler; import java.util.ArrayList; import java.util.List; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.scheduler.Registerable; -import org.openecomp.portalsdk.core.util.SystemProperties; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.onap.portalsdk.core.scheduler.Registerable; +import org.onap.portalsdk.core.util.SystemProperties; import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.DependsOn; @@ -34,10 +34,10 @@ import org.springframework.stereotype.Component; @DependsOn({ "logRegistry", "systemProperties" }) public class Register implements Registerable { - EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(Register.class); + private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(Register.class); private List scheduleTriggers = new ArrayList<>(); - Trigger trigger[] = new Trigger[1]; + Trigger[] trigger = new Trigger[1]; @Autowired private LogRegistry logRegistry; @@ -49,15 +49,12 @@ public class Register implements Registerable { @Override public void registerTriggers() { - // if the property value is not available; the cron will not be added - // and can be ignored. its safe to ignore the exceptions - try { - if (SystemProperties.getProperty(SystemProperties.LOG_CRON) != null) - getScheduleTriggers().add(logRegistry.getTrigger()); - } catch (IllegalStateException ies) { - logger.info(EELFLoggerDelegate.debugLogger, ("Log Cron not available") + ies); + // if the property value is not available; the cron will not be added. + if (SystemProperties.containsProperty(SystemProperties.LOG_CRON)) { + logger.debug(EELFLoggerDelegate.debugLogger, + "Adding log registry for cron property {}", SystemProperties.getProperty(SystemProperties.LOG_CRON)); + getScheduleTriggers().add(logRegistry.getTrigger()); } - } public List getScheduleTriggers() { diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/scheduler/RegistryAdapter.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/scheduler/RegistryAdapter.java similarity index 88% rename from ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/scheduler/RegistryAdapter.java rename to ONAP-SDK-APP/src/main/java/org/onap/portalapp/scheduler/RegistryAdapter.java index 18b3fa45f..241d2a18e 100644 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/scheduler/RegistryAdapter.java +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/scheduler/RegistryAdapter.java @@ -17,14 +17,14 @@ * limitations under the License. * ================================================================================ */ -package org.openecomp.portalapp.scheduler; +package org.onap.portalapp.scheduler; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.openecomp.portalsdk.core.scheduler.Registerable; -import org.openecomp.portalsdk.workflow.services.WorkflowScheduleService; +import org.onap.portalsdk.core.scheduler.Registerable; +import org.onap.portalsdk.workflow.services.WorkflowScheduleService; import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.SchedulerFactoryBean; @@ -41,20 +41,15 @@ public class RegistryAdapter { private SchedulerFactoryBean schedulerBean; - Trigger trigger[] = new Trigger[1]; + Trigger [] trigger = new Trigger[1]; public Trigger[] getTriggers() { - registry.registerTriggers(); - List allTriggers = new ArrayList<>(); - List coreTriggers = addCoreTriggers(); final Trigger[] extTriggerArray = registry.getTriggers(); - allTriggers.addAll(Arrays.asList(extTriggerArray)); allTriggers.addAll(coreTriggers); - return allTriggers.toArray(trigger); } @@ -65,8 +60,8 @@ public class RegistryAdapter { return triggers; } - public void setSchedulerBean(SchedulerFactoryBean _schedulerBean) { - schedulerBean = _schedulerBean; + public void setSchedulerBean(final SchedulerFactoryBean schedulerBean) { + this.schedulerBean = schedulerBean; } public SchedulerFactoryBean getSchedulerBean() { diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/service/AdminAuthExtension.java b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/service/AdminAuthExtension.java similarity index 92% rename from ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/service/AdminAuthExtension.java rename to ONAP-SDK-APP/src/main/java/org/onap/portalapp/service/AdminAuthExtension.java index db5c0a69a..c769ded26 100644 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/service/AdminAuthExtension.java +++ b/ONAP-SDK-APP/src/main/java/org/onap/portalapp/service/AdminAuthExtension.java @@ -17,17 +17,17 @@ * limitations under the License. * ================================================================================ */ -package org.openecomp.portalapp.service; +package org.onap.portalapp.service; import java.util.Set; +import org.onap.policy.model.Roles; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.UserInfo; -import org.openecomp.policy.model.Roles; -import org.openecomp.portalapp.service.IAdminAuthExtension; -import org.openecomp.portalsdk.core.domain.Role; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.onap.portalapp.service.IAdminAuthExtension; +import org.onap.portalsdk.core.domain.Role; +import org.onap.portalsdk.core.domain.User; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/FusionLicenseManagerImpl.java b/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/FusionLicenseManagerImpl.java deleted file mode 100644 index 454cd3378..000000000 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/FusionLicenseManagerImpl.java +++ /dev/null @@ -1,88 +0,0 @@ -/*- - * ================================================================================ - * ONAP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ================================================================================ - */ -package org.openecomp.portalapp.lm; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletContext; - -import org.openecomp.portalsdk.core.lm.FusionLicenseManager; -import org.springframework.stereotype.Component; - -/* - * Please note that this class is not being used; its a dummy stub to have a qualifying bean for the interface. - */ - -@Component -public class FusionLicenseManagerImpl implements FusionLicenseManager { - - @Override - public void initKeyStoreParam() { - - } - - @Override - public void initCipherParam() { - - } - - @Override - public void initLicenseParam() { - - } - - @Override - public void doInitWork() { - - } - - @Override - public int installLicense() { - return 0; - } - - @Override - public synchronized int verifyLicense(ServletContext context) { - return 0; - } - - @Override - public void generateLicense(Map clientInfoMap, List ipAddressList) throws Exception { - - } - - @Override - public String nvl(String s) { - return null; - } - - @Override - public Date getExpiredDate() { - return null; - } - - @Override - public void setExpiredDate(Date expiredDate) { - - } - -} diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/LicenseableClassImpl.java b/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/LicenseableClassImpl.java deleted file mode 100644 index 26c5d9174..000000000 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/lm/LicenseableClassImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -/*- - * ================================================================================ - * onap Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ================================================================================ - */ -package org.openecomp.portalapp.lm; - -import java.io.FileNotFoundException; -import java.io.InputStream; - -import org.openecomp.portalsdk.core.lm.LicenseableClass; - -/* - * Please note that this class is not being used; its a dummy stub to have a qualifying bean for the interface. - */ - -public class LicenseableClassImpl implements LicenseableClass { - - public String getApplicationName() { - return ""; - } - - public InputStream getPublicKeystoreAsInputStream() throws FileNotFoundException { - return null; - } - - public String getAlias() { - return ""; - } - - public String getKeyPasswd() { - return ""; - } - - public String getPublicKeystorePassword() { - return ""; - } - - public String getCipherParamPassword() { - return ""; - } - - @SuppressWarnings("rawtypes") - public Class getClassToLicense() { - return this.getClass(); - } -} - diff --git a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/login/LoginStrategyImpl.java b/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/login/LoginStrategyImpl.java deleted file mode 100644 index 3b38f1d8e..000000000 --- a/ONAP-SDK-APP/src/main/java/org/openecomp/portalapp/login/LoginStrategyImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -/*- - * ================================================================================ - * ONAP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ================================================================================ - */ -package org.openecomp.portalapp.login; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.onap.policy.common.logging.flexlogger.FlexLogger; -import org.onap.policy.common.logging.flexlogger.Logger; -import org.openecomp.portalsdk.core.auth.LoginStrategy; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException; -import org.openecomp.portalsdk.core.onboarding.util.CipherUtil; -import org.openecomp.portalsdk.core.util.SystemProperties; -import org.springframework.web.servlet.ModelAndView; - -public class LoginStrategyImpl extends LoginStrategy { - - private static final Logger LOGGER = FlexLogger.getLogger(LoginStrategyImpl.class); - - @Override - public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception { - // 'login' for opensource is same as 'external' login. - return doExternalLogin(request, response); - } - - @Override - public String getUserId(HttpServletRequest request) throws PortalAPIException { - // Check ONAP Portal cookie - if (!isLoginCookieExist(request)) - return null; - - String userid = null; - try { - userid = getUserIdFromCookie(request); - } catch (Exception e) { - LOGGER.error("Exception Occured" + e); - } - return userid; - } - - private static String getUserIdFromCookie(HttpServletRequest request) throws PortalAPIException { - String userId = ""; - Cookie userIdCookie = getCookie(request, USER_ID); - if (userIdCookie != null) { - final String cookieValue = userIdCookie.getValue(); - if (!SystemProperties.containsProperty(SystemProperties.Decryption_Key)) - throw new IllegalStateException("Failed to find property " + SystemProperties.Decryption_Key); - final String decryptionKey = SystemProperties.getProperty(SystemProperties.Decryption_Key); - try { - userId = CipherUtil.decrypt(cookieValue, decryptionKey); - LOGGER.debug("getUserIdFromCookie: decrypted as {}" +userId); - } catch (Exception e) { - LOGGER.error("Exception Occured in getUserIdFromCookie" + e); - } - } - return userId; - } - - private static boolean isLoginCookieExist(HttpServletRequest request) { - Cookie ep = getCookie(request, EP_SERVICE); - return (ep != null); - } - - private static Cookie getCookie(HttpServletRequest request, String cookieName) { - Cookie[] cookies = request.getCookies(); - if (cookies != null) - for (Cookie cookie : cookies) - if (cookie.getName().equals(cookieName)) - return cookie; - - return null; - } - -} diff --git a/ONAP-SDK-APP/src/main/resources/key.properties b/ONAP-SDK-APP/src/main/resources/key.properties new file mode 100644 index 000000000..134227d20 --- /dev/null +++ b/ONAP-SDK-APP/src/main/resources/key.properties @@ -0,0 +1,23 @@ +### +# ================================================================================ +# onap 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. +# ================================================================================ +### + +# Properties read by the ONAP Framework library (epsdk-fw) + +cipher.enc.key = AGLDdG4D04BKm2IxIWEr8o==! \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/resources/logback.xml b/ONAP-SDK-APP/src/main/resources/logback.xml index fe4aac919..42535510b 100644 --- a/ONAP-SDK-APP/src/main/resources/logback.xml +++ b/ONAP-SDK-APP/src/main/resources/logback.xml @@ -99,7 +99,7 @@ ${applicationLoggerPattern} - + @@ -324,47 +324,30 @@ - - - - + + + - - - - + + - - + + - - - + + + - - - - - + + + + - \ No newline at end of file + diff --git a/ONAP-SDK-APP/src/main/resources/portal.properties b/ONAP-SDK-APP/src/main/resources/portal.properties index 1f2336d7b..04d39c14f 100644 --- a/ONAP-SDK-APP/src/main/resources/portal.properties +++ b/ONAP-SDK-APP/src/main/resources/portal.properties @@ -17,7 +17,7 @@ # limitations under the License. # ================================================================================ ### -# Properties read by ONAP Framework library, onapFW.jar +# Properties read by ONAP Framework library, ecompFW.jar ########################################################################## # The following properties should NOT be changed by partner applications. @@ -35,30 +35,18 @@ use_rest_for_functional_menu=true ########################################################################## # Name of java class that implements the OnBoardingApiService interface. -portal.api.impl.class = org.openecomp.portalapp.service.OnBoardingApiServiceImpl +portal.api.impl.class = org.onap.portalapp.service.OnBoardingApiServiceImpl -# CSP Global Log On for single sign on -ecomp_redirect_url = todo_csp_global_logon +# URL of the Portal where this app is onboarded +ecomp_redirect_url = https://portal.onap.org/onapportal/process_csp # URL of the ONAP Portal REST API -ecomp_rest_url = todo_Onap_rest_url +ecomp_rest_url = http://portal.onap.org:50580/onapportal/auxapi -# Applications do not need to run a UEB listener in 1610. +# Applications do not need to run a UEB listener after 1607. ueb_listeners_enable = false # UEB Configuration -# In release 1607, all 6 entries below were required. -# In release 1610, if key ueb_listeners_enable is set to false, +# If key ueb_listeners_enable is set to false, # then only the ueb_app_key is required. -# UEB servers -ueb_url_list = todo_ueb_list -# ONAP Portal listens on this UEB topic -ecomp_portal_inbox_name = ONAP-PORTAL-INBOX-TEST-DEMETER -# Replace these 3 default values with the ones for your specific App, -# as shown on the on-boarding page on the ONAP Portal web application. -ueb_app_key = ZOicEniw7BWDL1pM -ueb_app_secret = PJIsBErHfo2RGKzuu03CZKgV -ueb_app_mailbox_name = ONAP-PORTAL-OUTBOX-TEST-32756 -# Consumer group name for UEB topic. -# Use the special tag '{UUID}' to generate a unique one for each sdk-app server. -ueb_app_consumer_group_name = {UUID} +ueb_app_key = REPLACE-ME-UEB-APP-KEY-EPSDK-APP-OS diff --git a/ONAP-SDK-APP/src/main/webapp/WEB-INF/conf/system.properties b/ONAP-SDK-APP/src/main/webapp/WEB-INF/conf/system.properties index aa8ee1476..64f9f65c6 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/conf/system.properties +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/conf/system.properties @@ -1,4 +1,4 @@ -# Properties read by ONAP Core library, onapSDK-core.jar +# Properties read by ONAP Core library, epsdk-core.jar ########################################################################## # The following properties should NOT be changed by partner applications. @@ -20,53 +20,53 @@ user_name = fullName decryption_key = AGLDdG4D04BKm2IxIWEr8o== ########################################################################## -# The following properties MAY require changes by partner applications. +# The following properties REQUIRE changes by partner applications. ########################################################################## + + #Mysql -db.driver = org.mariadb.jdbc.Driver +db.driver = org.mariadb.jdbc.Driver db.connectionURL = jdbc:mariadb://localhost:3306/onap_sdk db.userName = policy_user db.password = policy_user +db.encrypt_flag = false db.hib.dialect = org.hibernate.dialect.MySQLDialect db.min_pool_size = 5 db.max_pool_size = 10 +#db.test_connection_on_checkout = false +#db.preferred_test_query = SELECT 1 from FN_USER + 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 +app_display_name = ONAP Policy +# license file area files_path = /tmp #element map files -element_map_file_path = /tmp +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 * * * ?; -mylogins_feed_cron = 0 0/60 * * * ?; #sessiontimeout_feed_cron = 0 * * * * ? * -my_login_feed_output_dir = /tmp/MyLogins - -# ONAP Portal Shared Context REST API URL -ecomp_shared_context_rest_url= todo_shared_context_url # Link shown in Help menu -contact_us_link = todo_Contact_link +contact_us_link = https://wiki.onap.org/display/DW/Portal -# Camunda cockpit link -camunda_cockpit_link = todo_camunda_link # 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 ONAP SDK at the time of its deployment. # Online Unique UUID generator - https://www.uuidgenerator.net/ -instance_uuid=8da691c9-987d-43ed-a358-00ac2f35685d - -# R Cloud feature -guard_notebook_url=todo_guard_url +instance_uuid=8a3a3721-bca6-4140-92a3-5b1ad1b0df83 # Application base URL has the host and app context only; a proper prefix of the on-boarded URL. -# Only required for applications using WebJunction or FE/BE separation. For example: -# app_base_url = todo_App_base_url +# Only required for applications using FE/BE separation. For example: +# app_base_url = https://www.onap.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/ONAP-SDK-APP/src/main/webapp/WEB-INF/defs/definitions.xml b/ONAP-SDK-APP/src/main/webapp/WEB-INF/defs/definitions.xml index b2391b562..2f4a91408 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/defs/definitions.xml +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/defs/definitions.xml @@ -3,12 +3,16 @@ "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"> - + + diff --git a/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/conf/fusion.properties b/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/conf/fusion.properties index 7140d35fb..8ce8cc95a 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/conf/fusion.properties +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/conf/fusion.properties @@ -1,7 +1,11 @@ # login settings login_method_backdoor = backdoor login_method_attribute_name = login_method -login_method_csp = csp + +# These properties will be removed after SingleSignOnController is cleaned +authentication_mechanism = BOTH +login_method_csp = csp +login_method_web_junction = web_junction #login message login.error.hrid.empty = Login failed, please contact system administrator. @@ -11,9 +15,8 @@ login.error.user.inactive = Account is disabled, please contact system administr # User Session settings user_attribute_name = user roles_attribute_name = roles -role_functions_attribute_name = role_functions -authentication_mechanism = BOTH role_function_list = role_function_list +role_functions_attribute_name = role_functions # Import-user LDAP settings post_initial_context_factory = com.sun.jndi.ldap.LdapCtxFactory diff --git a/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp b/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp index edb040504..0d62c7865 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/jsp/ds2/left-menu.jsp @@ -20,35 +20,15 @@ <%@ 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"%> +<%@ page import="org.onap.portalsdk.core.util.SystemProperties"%> +<%@ page import="org.onap.portalsdk.core.onboarding.util.PortalApiProperties"%> +<%@ page import="org.onap.portalsdk.core.onboarding.util.PortalApiConstants"%> +<%@ page import="org.onap.portalsdk.core.domain.MenuData"%> - - - @@ -57,7 +37,7 @@ <% String contactUsLink = SystemProperties.getProperty(SystemProperties.CONTACT_US_LINK); - String redirectUrl = PortalApiProperties.getProperty(PortalApiConstants.ONAP_REDIRECT_URL); + 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"; %> @@ -83,8 +63,7 @@
  • - - ONAP Portal +
  • diff --git a/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml b/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml index 984e2369b..3d9a5e455 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/fusion/orm/RNoteBookIntegration.hbm.xml @@ -23,7 +23,7 @@ "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> - + diff --git a/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login.jsp b/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login.jsp index 2d6c95115..0ecb69609 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login.jsp +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login.jsp @@ -17,7 +17,7 @@ limitations under the License. ================================================================================ --%> -<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%> +<%@ page import="org.onap.portalsdk.core.util.SystemProperties"%> <% // Name is defined by app; do not throw if missing diff --git a/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login_external.jsp b/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login_external.jsp index cb980c625..3671d2969 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login_external.jsp +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/jsp/login_external.jsp @@ -17,7 +17,7 @@ limitations under the License. ================================================================================ --%> -<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%> +<%@ page import="org.onap.portalsdk.core.util.SystemProperties"%> <% // Name is defined by app; do not throw if missing diff --git a/ONAP-SDK-APP/src/main/webapp/WEB-INF/web.xml b/ONAP-SDK-APP/src/main/webapp/WEB-INF/web.xml index 31b096049..a576f61f5 100644 --- a/ONAP-SDK-APP/src/main/webapp/WEB-INF/web.xml +++ b/ONAP-SDK-APP/src/main/webapp/WEB-INF/web.xml @@ -10,8 +10,16 @@ - 7 + 30 COOKIE + + SecurityXssFilter + org.onap.portalapp.filter.SecurityXssFilter + + + SecurityXssFilter + /* + \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css b/ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css new file mode 100644 index 000000000..597b466d5 --- /dev/null +++ b/ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ecomp-ionicons.css @@ -0,0 +1,193 @@ +@charset "UTF-8"; + +@font-face { font-family: "Ionicons"; src: url("../fonts/ionicons.eot?v=2.0.0"); src: url("../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"), url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"), url("../fonts/ionicons.woff?v=2.0.0") format("woff"), url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg"); font-weight: normal; font-style: normal; } +.ionicons, +.icon-controls-upPRIMARY, +.icon-arrows-download:before, +.icon-securityalerts-alertL:before, +.icon-controls-add-maximize:before, +.icon-controls-add-maximize-circle:before, +.icon-misc-time:before, +.icoSecurityalerts:before, +.icon-apps-marketplace:before, +.icon-content-grid:before, +.icon-documents-archive:before, +.icon-arrows-vertical-arrow-down:before, +.icoArrows-download:before, +.icoArrows-incoming-call:before, +.icon-arrows-outgoing-call:before, +.icon-arrows-upload:before, +.icon-arrows-straight-arrow:before, +.icoArrows-vertical-arrow:before, +.icon-people-userbookmark:before, +.icon-controls-check:before, +.icon-chevron-down:before, +.icon-controls-down:before, +.icon-controls-left:before, +.icon-controls-right:before, +.icon-chevron-up:before, +.icoDocuments-report:before, +.icon-edit:before, +.icon-controls-up:before, +.icon-overview:before, +.icon-settings:before, +.icon-building-home:before, +.icon-documents-book:before, +.icoDocuments-book-outline:before, +.icoDocuments-bookmarks:before, +.icoDocuments-bookmarks-outline:before, +.icon-add-widget:before, +.icon-documents-copy:before, +.icon-content-flag:before, +.icon-primary-accordion-minus:before, +.icon-misc-piechart:before, +.icon-misc-piechart-outline:before, +.icon-primary-accordion-plus:before, +.icon-star:before, +.icon-building-door:before, +.icon-content-gridguide:before, +.icon-user:before, +.icon-people-oneperson:before, +.icon-people-oneperson-add:before, +.icon-people-oneperson-stalker:before, +.icon-controls-pointer:before, +.icon-arrows-replay-restart:before, +.icon-content-star:before, +.icon-misc-trash:before, +.icon-misc-pen:before, +.ion-navicon:before, +.icon-primary-close:before, .close:before, .reset-field:before, +.icon-datanetwork-softwareasaservice:before, +.icon-datanetwork-messaging2:before, +.icon-controls-settingsconnectedactivity:before, +.icon-arrows-upload:before { + display: inline-block; + font-family: "Ionicons"; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + text-rendering: auto; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + + +.icoSecurityalerts-alert:before { content: "\f100"; } + +.icon-arrows-download:before { content: "\f41f"; } + +.icon-controls-add-maximize:before { content: "\f2c7"; } + +.icon-controls-add-maximize-circle:before { content: "\f359"; } + +.icon-misc-time:before { content: "\f35a"; } + +.icoSecurityalerts:before { content: "\f35b"; } + +.icon-content-grid:before { content: "\f35c"; } + +.icon-documents-archive:before { content: "\f2c9"; } + +.icon-arrows-vertical-arrow-down:before { content: "\f35d"; } + +.icon-arrows-download:before { content: "\f35e"; } + +.icon-arrows-incoming-call:before { content: "\f360"; } + +.icoArrows-outgoing-call:before { content: "\f362"; } + +.icoArrows-upload:before { content: "\f364"; } + +.icoArrows-straight-arrow:before { content: "\f30f"; } + +.icon-arrows-vertical-arrow:before { content: "\f366"; } + +.icon-people-userbookmark:before { content: "\f39f"; } + +.icon-controls-check:before { content: "\f121"; } + +.icon-chevron-down:before { content: "\f123"; } + +.icon-controls-left:before { content: "\f124"; } + +.icon-controls-right:before { content: "\f125"; } + +.icon-chevron-up:before { content: "\f126"; } + +.icoDocuments-report:before { content: "\f274"; } + +.icon-overview:before { content: "\f133"; } + +.icon-controls-down:before { content: "\f3d0"; } + +.icon-controls-up:before { content: "\f3d8"; } + +.icon-documents-book:before { content: "\f3e8"; } + +.icoDocuments-book-outline:before { content: "\f3e7"; } + +.icoDocuments-bookmarks:before { content: "\f3ea"; } + +.icoDocuments-bookmarks-outline:before { content: "\f3e9"; } + +.icon-documents-copy:before { content: "\f41c"; } + +.icon-content-flag:before { content: "\f42d"; } + +.icon-primary-accordion-minus:before { content: "\f463"; } + +.icon-misc-piechart:before { content: "\f484"; } + +.icon-misc-piechart-outline:before { content: "\f483"; } + +.icon-primary-accordion-plus:before { content: "\f48a"; } + +.icon-building-door:before { content: "\f29f"; } + +.icon-content-gridguide:before { content: "\f20d"; } + +.icon-people-oneperson:before { content: "\f213"; } + +.icon-people-oneperson-add:before { content: "\f211"; } + +.icon-people-oneperson-stalker:before { content: "\f212"; } + +.icon-arrows-replay-restart:before { content: "\f21c"; } + +.icon-misc-trash:before { content: "\f252"; } + +.icon-arrows-upload:before { content: "\f255"; } + +.icon-user:before { content: "\f213"; } + +.icon-star:before { content: "\f4b3"; } + +.icon-edit:before { content: "\f2bf"; } + +.icon-settings:before { content: "\f13d"; } + +.icon-apps-marketplace:before { content: "\f35c"; } + +.icon-add-widget:before { content: "\f3f0"; } + +.icon-controls-upPRIMARY:before { content: "\f3d8"; } + +.icon-misc-pen:before { content: "\f2bf"; } + +.ion-navicon:before { content: "\f20e"; } + +.icon-building-home:before { content: "\f144"; } + +.icon-content-star:before { content: "\f24e"; } + +.icon-primary-close:before, .close:before, .reset-field:before { content: "\f129"; } + +.icon-datanetwork-softwareasaservice:before { content: "\f40c"; } + +.icon-datanetwork-messaging2:before { content: "\f132"; } + +.icon-controls-settingsconnectedactivity:before { content: "\f411"; } \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ionicons.css b/ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ionicons.css index 3f7fef611..885aa6bd7 100644 --- a/ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ionicons.css +++ b/ONAP-SDK-APP/src/main/webapp/app/fusion/external/ds2/css/digital-ng-library/ionicons.css @@ -11,47 +11,47 @@ Modified icons to fit ionicon’s grid from original. */ @font-face { font-family: "Ionicons"; src: url("../fonts/ionicons.eot?v=2.0.0"); src: url("../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"), url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"), url("../fonts/ionicons.woff?v=2.0.0") format("woff"), url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg"); font-weight: normal; font-style: normal; } -.ion, .ionicons, .ion-alert:before, .icon-securityalerts-alertL:before, .icon-controls-add-maximize:before, .icon-controls-add-maximize-circle:before, .icon-misc-time:before, .icoSecurityalerts:before,.icon-apps-marketplace:before ,.icon-content-grid:before, .icon-documents-archive:before, .ion-android-arrow-back:before, .icon-arrows-vertical-arrow-down:before, .ion-android-arrow-dropdown:before, .icoArrows-download:before, .ion-android-arrow-dropleft:before, .icoArrows-incoming-call:before, .ion-android-arrow-dropright:before, .icon-arrows-outgoing-call:before, .ion-android-arrow-dropup:before, .icon-arrows-upload:before, .icon-arrows-straight-arrow:before, .icoArrows-vertical-arrow:before, .ion-android-attach:before, .ion-android-bar:before, .ion-android-bicycle:before, .ion-android-boat:before, .ion-android-bookmark:before, .ion-android-bulb:before, .ion-android-bus:before, .ion-android-calendar:before, .ion-android-call:before, .ion-android-camera:before, .ion-android-cancel:before, .ion-android-car:before, .ion-android-cart:before, .ion-android-chat:before, .ion-android-checkbox:before, .ion-android-checkbox-blank:before, .ion-android-checkbox-outline:before, .ion-android-checkbox-outline-blank:before, .ion-android-checkmark-circle:before, .ion-android-clipboard:before, .ion-android-close:before, .ion-android-cloud:before, .ion-android-cloud-circle:before, .ion-android-cloud-done:before, .ion-android-cloud-outline:before, .ion-android-color-palette:before, .ion-android-compass:before, .ion-android-contact:before, .ion-android-contacts:before, .ion-android-contract:before, .ion-android-create:before, .ion-android-delete:before, .ion-android-desktop:before, .ion-android-document:before, .ion-android-done:before, .ion-android-done-all:before, .ion-android-download:before, .ion-android-drafts:before, .ion-android-exit:before, .ion-android-expand:before, .ion-android-favorite:before, .ion-android-favorite-outline:before, .ion-android-film:before, .ion-android-folder:before, .ion-android-folder-open:before, .ion-android-funnel:before, .ion-android-globe:before, .ion-android-hand:before, .ion-android-hangout:before, .ion-android-happy:before, .ion-android-home:before, .ion-android-image:before, .ion-android-laptop:before, .ion-android-list:before, .ion-android-locate:before, .ion-android-lock:before, .ion-android-mail:before, .ion-android-map:before, .ion-android-menu:before, .ion-android-microphone:before, .ion-android-microphone-off:before, .ion-android-more-horizontal:before, .ion-android-more-vertical:before, .ion-android-navigate:before, .ion-android-notifications:before, .ion-android-notifications-none:before, .ion-android-notifications-off:before, .ion-android-open:before, .ion-android-options:before, .ion-android-people:before, .ion-android-person:before, .icon-people-userbookmark:before, .ion-android-phone-landscape:before, .ion-android-phone-portrait:before, .ion-android-pin:before, .ion-android-plane:before, .ion-android-playstore:before, .ion-android-print:before, .ion-android-radio-button-off:before, .ion-android-radio-button-on:before, .ion-android-refresh:before, .ion-android-remove:before, .ion-android-remove-circle:before, .ion-android-restaurant:before, .ion-android-sad:before, .ion-android-search:before, .ion-android-send:before, .ion-android-settings:before, .ion-android-share:before, .ion-android-share-alt:before, .ion-android-star:before, .ion-android-star-half:before, .ion-android-star-outline:before, .ion-android-stopwatch:before, .ion-android-subway:before, .ion-android-sunny:before, .ion-android-sync:before, .ion-android-textsms:before, .ion-android-time:before, .ion-android-train:before, .ion-android-unlock:before, .ion-android-upload:before, .ion-android-volume-down:before, .ion-android-volume-mute:before, .ion-android-volume-off:before, .ion-android-volume-up:before, .ion-android-walk:before, .ion-android-warning:before, .ion-android-watch:before, .ion-android-wifi:before, .ion-aperture:before, .ion-archive:before, .ion-arrow-down-a:before, .ion-arrow-down-b:before, .ion-arrow-down-c:before, .ion-arrow-expand:before, .ion-arrow-graph-down-left:before, .ion-arrow-graph-down-right:before, .ion-arrow-graph-up-left:before, .ion-arrow-graph-up-right:before, .ion-arrow-left-a:before, .ion-arrow-left-b:before, .ion-arrow-left-c:before, .ion-arrow-move:before, .ion-arrow-resize:before, .ion-arrow-return-left:before, .ion-arrow-return-right:before, .ion-arrow-right-a:before, .ion-arrow-right-b:before, .ion-arrow-right-c:before, .ion-arrow-shrink:before, .ion-arrow-swap:before, .ion-arrow-up-a:before, .ion-arrow-up-b:before, .ion-arrow-up-c:before, .ion-asterisk:before, .ion-at:before, .ion-backspace:before, .ion-backspace-outline:before, .ion-bag:before, .ion-battery-charging:before, .ion-battery-empty:before, .ion-battery-full:before, .ion-battery-half:before, .ion-battery-low:before, .ion-beaker:before, .ion-beer:before, .ion-bluetooth:before, .ion-bonfire:before, .ion-bookmark:before, .ion-bowtie:before, .ion-briefcase:before, .ion-bug:before, .ion-calculator:before, .ion-calendar:before, .ion-camera:before, .ion-card:before, .ion-cash:before, .ion-chatbox:before, .ion-chatbox-working:before, .ion-chatboxes:before, .ion-chatbubble:before, .ion-chatbubble-working:before, .ion-chatbubbles:before, .ion-checkmark:before, .ion-checkmark-circled:before, .ion-checkmark-round:before, .icon-chevron-down:before, .icon-controls-left:before, .icon-controls-right:before, .icon-chevron-up:before, .ion-clipboard:before, .ion-clock:before, .ion-close:before, .ion-close-circled:before, .ion-close-round:before, .ion-closed-captioning:before, .ion-cloud:before, .ion-code:before, .ion-code-download:before, .ion-code-working:before, .ion-coffee:before, .ion-compass:before, .ion-compose:before, .icoDocuments-report:before, .ion-contrast:before, .ion-crop:before, .ion-cube:before, .ion-disc:before, .ion-document:before, .ion-document-text:before, .ion-drag:before, .ion-earth:before, .ion-easel:before, .icon-edit:before,.icon-misc-pen:before, .ion-egg:before, .ion-eject:before, .ion-email:before, .ion-email-unread:before, .ion-erlenmeyer-flask:before, .ion-erlenmeyer-flask-bubbles:before, .icon-overview:before, .ion-eye-disabled:before, .ion-female:before, .ion-filing:before, .ion-film-marker:before, .ion-fireball:before, .ion-flag:before, .ion-flame:before, .ion-flash:before, .ion-flash-off:before, .ion-folder:before, .ion-fork:before, .ion-fork-repo:before, .ion-forward:before, .ion-funnel:before, .icon-settings:before,.ion-gear-a:before, .ion-gear-b:before, .ion-grid:before, .ion-hammer:before, .ion-happy:before, .ion-happy-outline:before, .ion-headphone:before, .ion-heart:before, .ion-heart-broken:before, .ion-help:before, .ion-help-buoy:before, .ion-help-circled:before, .icon-building-home:before, .ion-icecream:before, .ion-image:before, .ion-images:before, .ion-information:before, .ion-information-circled:before, .ion-ionic:before, .ion-ios-alarm:before, .ion-ios-alarm-outline:before, .ion-ios-albums:before, .ion-ios-albums-outline:before, .ion-ios-americanfootball:before, .ion-ios-americanfootball-outline:before, .ion-ios-analytics:before, .ion-ios-analytics-outline:before, .ion-ios-arrow-back:before, .icon-controls-down:before, .ion-ios-arrow-forward:before, .ion-ios-arrow-left:before, .ion-ios-arrow-right:before, .ion-ios-arrow-thin-down:before, .ion-ios-arrow-thin-left:before, .ion-ios-arrow-thin-right:before, .ion-ios-arrow-thin-up:before, .icon-controls-up:before, .ion-ios-at:before, .ion-ios-at-outline:before, .ion-ios-barcode:before, .ion-ios-barcode-outline:before, .ion-ios-baseball:before, .ion-ios-baseball-outline:before, .ion-ios-basketball:before, .ion-ios-basketball-outline:before, .ion-ios-bell:before, .ion-ios-bell-outline:before, .ion-ios-body:before, .ion-ios-body-outline:before, .ion-ios-bolt:before, .ion-ios-bolt-outline:before, .icon-documents-book:before, .icoDocuments-book-outline:before, .icoDocuments-bookmarks:before, .icoDocuments-bookmarks-outline:before, .ion-ios-box:before, .ion-ios-box-outline:before, .ion-ios-briefcase:before, .ion-ios-briefcase-outline:before,.icon-add-widget:before , .ion-ios-browsers:before, .ion-ios-browsers-outline:before, .ion-ios-calculator:before, .ion-ios-calculator-outline:before, .ion-ios-calendar:before, .ion-ios-calendar-outline:before, .ion-ios-camera:before, .ion-ios-camera-outline:before, .ion-ios-cart:before, .ion-ios-cart-outline:before, .ion-ios-chatboxes:before, .ion-ios-chatboxes-outline:before, .ion-ios-chatbubble:before, .ion-ios-chatbubble-outline:before, .ion-ios-checkmark:before, .ion-ios-checkmark-empty:before, .ion-ios-checkmark-outline:before, .ion-ios-circle-filled:before, .ion-ios-circle-outline:before, .ion-ios-clock:before, .ion-ios-clock-outline:before, .ion-ios-close:before, .ion-ios-close-empty:before, .ion-ios-close-outline:before, .ion-ios-cloud:before, .ion-ios-cloud-download:before, .ion-ios-cloud-download-outline:before, .ion-ios-cloud-outline:before, .ion-ios-cloud-upload:before, .ion-ios-cloud-upload-outline:before, .ion-ios-cloudy:before, .ion-ios-cloudy-night:before, .ion-ios-cloudy-night-outline:before, .ion-ios-cloudy-outline:before, .ion-ios-cog:before, .ion-ios-cog-outline:before, .ion-ios-color-filter:before, .ion-ios-color-filter-outline:before, .ion-ios-color-wand:before, .ion-ios-color-wand-outline:before, .ion-ios-compose:before, .ion-ios-compose-outline:before, .ion-ios-contact:before, .ion-ios-contact-outline:before, .icon-documents-copy:before, .ion-ios-copy-outline:before, .ion-ios-crop:before, .ion-ios-crop-strong:before, .ion-ios-download:before, .ion-ios-download-outline:before, .ion-ios-drag:before, .ion-ios-email:before, .ion-ios-email-outline:before, .ion-ios-eye:before, .ion-ios-eye-outline:before, .ion-ios-fastforward:before, .ion-ios-fastforward-outline:before, .ion-ios-filing:before, .ion-ios-filing-outline:before, .ion-ios-film:before, .ion-ios-film-outline:before, .icon-content-flag:before, .ion-ios-flag-outline:before, .ion-ios-flame:before, .ion-ios-flame-outline:before, .ion-ios-flask:before, .ion-ios-flask-outline:before, .ion-ios-flower:before, .ion-ios-flower-outline:before, .ion-ios-folder:before, .ion-ios-folder-outline:before, .ion-ios-football:before, .ion-ios-football-outline:before, .ion-ios-game-controller-a:before, .ion-ios-game-controller-a-outline:before, .ion-ios-game-controller-b:before, .ion-ios-game-controller-b-outline:before, .ion-ios-gear:before, .ion-ios-gear-outline:before, .ion-ios-glasses:before, .ion-ios-glasses-outline:before, .ion-ios-grid-view:before, .ion-ios-grid-view-outline:before, .ion-ios-heart:before, .ion-ios-heart-outline:before, .ion-ios-help:before, .ion-ios-help-empty:before, .ion-ios-help-outline:before, .ion-ios-home:before, .ion-ios-home-outline:before, .ion-ios-infinite:before, .ion-ios-infinite-outline:before, .ion-ios-information:before, .ion-ios-information-empty:before, .ion-ios-information-outline:before, .ion-ios-ionic-outline:before, .ion-ios-keypad:before, .ion-ios-keypad-outline:before, .ion-ios-lightbulb:before, .ion-ios-lightbulb-outline:before, .ion-ios-list:before, .ion-ios-list-outline:before, .ion-ios-location:before, .ion-ios-location-outline:before, .ion-ios-locked:before, .ion-ios-locked-outline:before, .ion-ios-loop:before, .ion-ios-loop-strong:before, .ion-ios-medical:before, .ion-ios-medical-outline:before, .ion-ios-medkit:before, .ion-ios-medkit-outline:before, .ion-ios-mic:before, .ion-ios-mic-off:before, .ion-ios-mic-outline:before, .ion-ios-minus:before, .ion-ios-minus-empty:before, .icon-primary-accordion-minus:before, .ion-ios-monitor:before, .ion-ios-monitor-outline:before, .ion-ios-moon:before, .ion-ios-moon-outline:before, .ion-ios-more:before, .ion-ios-more-outline:before, .ion-ios-musical-note:before, .ion-ios-musical-notes:before, .ion-ios-navigate:before, .ion-ios-navigate-outline:before, .ion-ios-nutrition:before, .ion-ios-nutrition-outline:before, .ion-ios-paper:before, .ion-ios-paper-outline:before, .ion-ios-paperplane:before, .ion-ios-paperplane-outline:before, .ion-ios-partlysunny:before, .ion-ios-partlysunny-outline:before, .ion-ios-pause:before, .ion-ios-pause-outline:before, .ion-ios-paw:before, .ion-ios-paw-outline:before, .ion-ios-people:before, .ion-ios-people-outline:before, .ion-ios-person:before, .ion-ios-person-outline:before, .ion-ios-personadd:before, .ion-ios-personadd-outline:before, .ion-ios-photos:before, .ion-ios-photos-outline:before, .icon-misc-piechart:before, .icon-misc-piechart-outline:before, .ion-ios-pint:before, .ion-ios-pint-outline:before, .ion-ios-play:before, .ion-ios-play-outline:before, .ion-ios-plus:before, .ion-ios-plus-empty:before, .icon-primary-accordion-plus:before, .ion-ios-pricetag:before, .ion-ios-pricetag-outline:before, .ion-ios-pricetags:before, .ion-ios-pricetags-outline:before, .ion-ios-printer:before, .ion-ios-printer-outline:before, .ion-ios-pulse:before, .ion-ios-pulse-strong:before, .ion-ios-rainy:before, .ion-ios-rainy-outline:before, .ion-ios-recording:before, .ion-ios-recording-outline:before, .ion-ios-redo:before, .ion-ios-redo-outline:before, .ion-ios-refresh:before, .ion-ios-refresh-empty:before, .ion-ios-refresh-outline:before, .ion-ios-reload:before, .ion-ios-reverse-camera:before, .ion-ios-reverse-camera-outline:before, .ion-ios-rewind:before, .ion-ios-rewind-outline:before, .ion-ios-rose:before, .ion-ios-rose-outline:before, .ion-ios-search:before, .ion-ios-search-strong:before, .ion-ios-settings:before, .ion-ios-settings-strong:before, .ion-ios-shuffle:before, .ion-ios-shuffle-strong:before, .ion-ios-skipbackward:before, .ion-ios-skipbackward-outline:before, .ion-ios-skipforward:before, .ion-ios-skipforward-outline:before, .ion-ios-snowy:before, .ion-ios-speedometer:before, .ion-ios-speedometer-outline:before, .icon-star:before,.ion-ios-star:before, .ion-ios-star-half:before, .ion-ios-star-outline:before, .ion-ios-stopwatch:before, .ion-ios-stopwatch-outline:before, .ion-ios-sunny:before, .ion-ios-sunny-outline:before, .ion-ios-telephone:before, .ion-ios-telephone-outline:before, .ion-ios-tennisball:before, .ion-ios-tennisball-outline:before, .ion-ios-thunderstorm:before, .ion-ios-thunderstorm-outline:before, .ion-ios-time:before, .ion-ios-time-outline:before, .ion-ios-timer:before, .ion-ios-timer-outline:before, .ion-ios-toggle:before, .ion-ios-toggle-outline:before, .ion-ios-trash:before, .ion-ios-trash-outline:before, .ion-ios-undo:before, .ion-ios-undo-outline:before, .ion-ios-unlocked:before, .ion-ios-unlocked-outline:before, .ion-ios-upload:before, .ion-ios-upload-outline:before, .ion-ios-videocam:before, .ion-ios-videocam-outline:before, .ion-ios-volume-high:before, .ion-ios-volume-low:before, .ion-ios-wineglass:before, .ion-ios-wineglass-outline:before, .ion-ios-world:before, .ion-ios-world-outline:before, .ion-ipad:before, .ion-iphone:before, .ion-ipod:before, .ion-jet:before, .ion-key:before, .ion-knife:before, .ion-laptop:before, .ion-leaf:before, .ion-levels:before, .ion-lightbulb:before, .ion-link:before, .ion-load-a:before, .ion-load-b:before, .ion-load-c:before, .ion-load-d:before, .ion-location:before, .ion-lock-combination:before, .ion-locked:before, .ion-log-in:before, .icon-building-door:before, .ion-loop:before, .ion-magnet:before, .ion-male:before, .ion-man:before, .ion-map:before, .ion-medkit:before, .ion-merge:before, .ion-mic-a:before, .ion-mic-b:before, .ion-mic-c:before, .ion-minus:before, .ion-minus-circled:before, .ion-minus-round:before, .ion-model-s:before, .ion-monitor:before, .ion-more:before, .ion-mouse:before, .ion-music-note:before, .ion-navicon:before, .icon-content-gridguide:before, .ion-navigate:before, .ion-network:before, .ion-no-smoking:before, .ion-nuclear:before, .ion-outlet:before, .ion-paintbrush:before, .ion-paintbucket:before, .ion-paper-airplane:before, .ion-paperclip:before, .ion-pause:before, .icon-user:before, .icon-people-oneperson:before, .icon-people-oneperson-add:before, .icon-people-oneperson-stalker:before, .ion-pie-graph:before, .ion-pin:before, .ion-pinpoint:before, .ion-pizza:before, .ion-plane:before, .ion-planet:before, .icon-controls-pointer:before, .ion-playstation:before, .ion-plus:before, .ion-plus-circled:before, .ion-plus-round:before, .ion-podium:before, .ion-pound:before, .ion-power:before, .ion-pricetag:before, .ion-pricetags:before, .ion-printer:before, .ion-pull-request:before, .ion-qr-scanner:before, .ion-quote:before, .ion-radio-waves:before, .ion-record:before, .icon-arrows-replay-restart:before, .ion-reply:before, .ion-reply-all:before, .ion-ribbon-a:before, .ion-ribbon-b:before, .ion-sad:before, .ion-sad-outline:before, .ion-scissors:before, .ion-search:before, .ion-settings:before, .ion-share:before, .ion-shuffle:before, .ion-skip-backward:before, .ion-skip-forward:before, .ion-social-android:before, .ion-social-android-outline:before, .ion-social-angular:before, .ion-social-angular-outline:before, .ion-social-apple:before, .ion-social-apple-outline:before, .ion-social-bitcoin:before, .ion-social-bitcoin-outline:before, .ion-social-buffer:before, .ion-social-buffer-outline:before, .ion-social-chrome:before, .ion-social-chrome-outline:before, .ion-social-codepen:before, .ion-social-codepen-outline:before, .ion-social-css3:before, .ion-social-css3-outline:before, .ion-social-designernews:before, .ion-social-designernews-outline:before, .ion-social-dribbble:before, .ion-social-dribbble-outline:before, .ion-social-dropbox:before, .ion-social-dropbox-outline:before, .ion-social-euro:before, .ion-social-euro-outline:before, .ion-social-facebook:before, .ion-social-facebook-outline:before, .ion-social-foursquare:before, .ion-social-foursquare-outline:before, .ion-social-freebsd-devil:before, .ion-social-github:before, .ion-social-github-outline:before, .ion-social-google:before, .ion-social-google-outline:before, .ion-social-googleplus:before, .ion-social-googleplus-outline:before, .ion-social-hackernews:before, .ion-social-hackernews-outline:before, .ion-social-html5:before, .ion-social-html5-outline:before, .ion-social-instagram:before, .ion-social-instagram-outline:before, .ion-social-javascript:before, .ion-social-javascript-outline:before, .ion-social-linkedin:before, .ion-social-linkedin-outline:before, .ion-social-markdown:before, .ion-social-nodejs:before, .ion-social-octocat:before, .ion-social-pinterest:before, .ion-social-pinterest-outline:before, .ion-social-python:before, .ion-social-reddit:before, .ion-social-reddit-outline:before, .ion-social-rss:before, .ion-social-rss-outline:before, .ion-social-sass:before, .ion-social-skype:before, .ion-social-skype-outline:before, .ion-social-snapchat:before, .ion-social-snapchat-outline:before, .ion-social-tumblr:before, .ion-social-tumblr-outline:before, .ion-social-tux:before, .ion-social-twitch:before, .ion-social-twitch-outline:before, .ion-social-twitter:before, .ion-social-twitter-outline:before, .ion-social-usd:before, .ion-social-usd-outline:before, .ion-social-vimeo:before, .ion-social-vimeo-outline:before, .ion-social-whatsapp:before, .ion-social-whatsapp-outline:before, .ion-social-windows:before, .ion-social-windows-outline:before, .ion-social-wordpress:before, .ion-social-wordpress-outline:before, .ion-social-yahoo:before, .ion-social-yahoo-outline:before, .ion-social-yen:before, .ion-social-yen-outline:before, .ion-social-youtube:before, .ion-social-youtube-outline:before, .ion-soup-can:before, .ion-soup-can-outline:before, .ion-speakerphone:before, .ion-speedometer:before, .ion-spoon:before, .icon-content-star:before, .ion-stats-bars:before, .ion-steam:before, .ion-stop:before, .ion-thermometer:before, .ion-thumbsdown:before, .ion-thumbsup:before, .ion-toggle:before, .ion-toggle-filled:before, .ion-transgender:before, .icon-misc-trash:before, .ion-trash-b:before, .ion-trophy:before, .ion-tshirt:before, .ion-tshirt-outline:before, .ion-umbrella:before, .ion-university:before, .ion-unlocked:before, .icon-arrows-upload:before, .ion-usb:before, .ion-videocamera:before, .ion-volume-high:before, .ion-volume-low:before, .ion-volume-medium:before, .ion-volume-mute:before, .ion-wand:before, .ion-waterdrop:before, .ion-wifi:before, .ion-wineglass:before, .ion-woman:before, .ion-wrench:before, .ion-xbox:before { display: inline-block; font-family: "Ionicons"; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; text-rendering: auto; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } +.ion, .ionicons, .ion-alert:before, .ion-alert-circled:before, .ion-android-add:before, .ion-android-add-circle:before, .ion-android-alarm-clock:before, .ion-android-alert:before, .ion-android-apps:before, .ion-android-archive:before, .ion-android-arrow-back:before, .ion-android-arrow-down:before, .ion-android-arrow-dropdown:before, .ion-android-arrow-dropdown-circle:before, .ion-android-arrow-dropleft:before, .ion-android-arrow-dropleft-circle:before, .ion-android-arrow-dropright:before, .ion-android-arrow-dropright-circle:before, .ion-android-arrow-dropup:before, .ion-android-arrow-dropup-circle:before, .ion-android-arrow-forward:before, .ion-android-arrow-up:before, .ion-android-attach:before, .ion-android-bar:before, .ion-android-bicycle:before, .ion-android-boat:before, .ion-android-bookmark:before, .ion-android-bulb:before, .ion-android-bus:before, .ion-android-calendar:before, .ion-android-call:before, .ion-android-camera:before, .ion-android-cancel:before, .ion-android-car:before, .ion-android-cart:before, .ion-android-chat:before, .ion-android-checkbox:before, .ion-android-checkbox-blank:before, .ion-android-checkbox-outline:before, .ion-android-checkbox-outline-blank:before, .ion-android-checkmark-circle:before, .ion-android-clipboard:before, .ion-android-close:before, .ion-android-cloud:before, .ion-android-cloud-circle:before, .ion-android-cloud-done:before, .ion-android-cloud-outline:before, .ion-android-color-palette:before, .ion-android-compass:before, .ion-android-contact:before, .ion-android-contacts:before, .ion-android-contract:before, .ion-android-create:before, .ion-android-delete:before, .ion-android-desktop:before, .ion-android-document:before, .ion-android-done:before, .ion-android-done-all:before, .ion-android-download:before, .ion-android-drafts:before, .ion-android-exit:before, .ion-android-expand:before, .ion-android-favorite:before, .ion-android-favorite-outline:before, .ion-android-film:before, .ion-android-folder:before, .ion-android-folder-open:before, .ion-android-funnel:before, .ion-android-globe:before, .ion-android-hand:before, .ion-android-hangout:before, .ion-android-happy:before, .ion-android-home:before, .ion-android-image:before, .ion-android-laptop:before, .ion-android-list:before, .ion-android-locate:before, .ion-android-lock:before, .ion-android-mail:before, .ion-android-map:before, .ion-android-menu:before, .ion-android-microphone:before, .ion-android-microphone-off:before, .ion-android-more-horizontal:before, .ion-android-more-vertical:before, .ion-android-navigate:before, .ion-android-notifications:before, .ion-android-notifications-none:before, .ion-android-notifications-off:before, .ion-android-open:before, .ion-android-options:before, .ion-android-people:before, .ion-android-person:before, .ion-android-person-add:before, .ion-android-phone-landscape:before, .ion-android-phone-portrait:before, .ion-android-pin:before, .ion-android-plane:before, .ion-android-playstore:before, .ion-android-print:before, .ion-android-radio-button-off:before, .ion-android-radio-button-on:before, .ion-android-refresh:before, .ion-android-remove:before, .ion-android-remove-circle:before, .ion-android-restaurant:before, .ion-android-sad:before, .ion-android-search:before, .ion-android-send:before, .ion-android-settings:before, .ion-android-share:before, .ion-android-share-alt:before, .ion-android-star:before, .ion-android-star-half:before, .ion-android-star-outline:before, .ion-android-stopwatch:before, .ion-android-subway:before, .ion-android-sunny:before, .ion-android-sync:before, .ion-android-textsms:before, .ion-android-time:before, .ion-android-train:before, .ion-android-unlock:before, .ion-android-upload:before, .ion-android-volume-down:before, .ion-android-volume-mute:before, .ion-android-volume-off:before, .ion-android-volume-up:before, .ion-android-walk:before, .ion-android-warning:before, .ion-android-watch:before, .ion-android-wifi:before, .ion-aperture:before, .ion-archive:before, .ion-arrow-down-a:before, .ion-arrow-down-b:before, .ion-arrow-down-c:before, .ion-arrow-expand:before, .ion-arrow-graph-down-left:before, .ion-arrow-graph-down-right:before, .ion-arrow-graph-up-left:before, .ion-arrow-graph-up-right:before, .ion-arrow-left-a:before, .ion-arrow-left-b:before, .ion-arrow-left-c:before, .ion-arrow-move:before, .ion-arrow-resize:before, .ion-arrow-return-left:before, .ion-arrow-return-right:before, .ion-arrow-right-a:before, .ion-arrow-right-b:before, .ion-arrow-right-c:before, .ion-arrow-shrink:before, .ion-arrow-swap:before, .ion-arrow-up-a:before, .ion-arrow-up-b:before, .ion-arrow-up-c:before, .ion-asterisk:before, .ion-at:before, .ion-backspace:before, .ion-backspace-outline:before, .ion-bag:before, .ion-battery-charging:before, .ion-battery-empty:before, .ion-battery-full:before, .ion-battery-half:before, .ion-battery-low:before, .ion-beaker:before, .ion-beer:before, .ion-bluetooth:before, .ion-bonfire:before, .ion-bookmark:before, .ion-bowtie:before, .ion-briefcase:before, .ion-bug:before, .ion-calculator:before, .ion-calendar:before, .ion-camera:before, .ion-card:before, .ion-cash:before, .ion-chatbox:before, .ion-chatbox-working:before, .ion-chatboxes:before, .ion-chatbubble:before, .ion-chatbubble-working:before, .ion-chatbubbles:before, .ion-checkmark:before, .ion-checkmark-circled:before, .ion-checkmark-round:before, .ion-chevron-down:before, .ion-chevron-left:before, .ion-chevron-right:before, .ion-chevron-up:before, .ion-clipboard:before, .ion-clock:before, .ion-close:before, .ion-close-circled:before, .ion-close-round:before, .ion-closed-captioning:before, .ion-cloud:before, .ion-code:before, .ion-code-download:before, .ion-code-working:before, .ion-coffee:before, .ion-compass:before, .ion-compose:before, .ion-connection-bars:before, .ion-contrast:before, .ion-crop:before, .ion-cube:before, .ion-disc:before, .ion-document:before, .ion-document-text:before, .ion-drag:before, .ion-earth:before, .ion-easel:before, .ion-edit:before, .ion-egg:before, .ion-eject:before, .ion-email:before, .ion-email-unread:before, .ion-erlenmeyer-flask:before, .ion-erlenmeyer-flask-bubbles:before, .ion-eye:before, .ion-eye-disabled:before, .ion-female:before, .ion-filing:before, .ion-film-marker:before, .ion-fireball:before, .ion-flag:before, .ion-flame:before, .ion-flash:before, .ion-flash-off:before, .ion-folder:before, .ion-fork:before, .ion-fork-repo:before, .ion-forward:before, .ion-funnel:before, .ion-gear-a:before, .ion-gear-b:before, .ion-grid:before, .ion-hammer:before, .ion-happy:before, .ion-happy-outline:before, .ion-headphone:before, .ion-heart:before, .ion-heart-broken:before, .ion-help:before, .ion-help-buoy:before, .ion-help-circled:before, .ion-home:before, .ion-icecream:before, .ion-image:before, .ion-images:before, .ion-information:before, .ion-information-circled:before, .ion-ionic:before, .ion-ios-alarm:before, .ion-ios-alarm-outline:before, .ion-ios-albums:before, .ion-ios-albums-outline:before, .ion-ios-americanfootball:before, .ion-ios-americanfootball-outline:before, .ion-ios-analytics:before, .ion-ios-analytics-outline:before, .ion-ios-arrow-back:before, .ion-ios-arrow-down:before, .ion-ios-arrow-forward:before, .ion-ios-arrow-left:before, .ion-ios-arrow-right:before, .ion-ios-arrow-thin-down:before, .ion-ios-arrow-thin-left:before, .ion-ios-arrow-thin-right:before, .ion-ios-arrow-thin-up:before, .ion-ios-arrow-up:before, .ion-ios-at:before, .ion-ios-at-outline:before, .ion-ios-barcode:before, .ion-ios-barcode-outline:before, .ion-ios-baseball:before, .ion-ios-baseball-outline:before, .ion-ios-basketball:before, .ion-ios-basketball-outline:before, .ion-ios-bell:before, .ion-ios-bell-outline:before, .ion-ios-body:before, .ion-ios-body-outline:before, .ion-ios-bolt:before, .ion-ios-bolt-outline:before, .ion-ios-book:before, .ion-ios-book-outline:before, .ion-ios-bookmarks:before, .ion-ios-bookmarks-outline:before, .ion-ios-box:before, .ion-ios-box-outline:before, .ion-ios-briefcase:before, .ion-ios-briefcase-outline:before, .ion-ios-browsers:before, .ion-ios-browsers-outline:before, .ion-ios-calculator:before, .ion-ios-calculator-outline:before, .ion-ios-calendar:before, .ion-ios-calendar-outline:before, .ion-ios-camera:before, .ion-ios-camera-outline:before, .ion-ios-cart:before, .ion-ios-cart-outline:before, .ion-ios-chatboxes:before, .ion-ios-chatboxes-outline:before, .ion-ios-chatbubble:before, .ion-ios-chatbubble-outline:before, .ion-ios-checkmark:before, .ion-ios-checkmark-empty:before, .ion-ios-checkmark-outline:before, .ion-ios-circle-filled:before, .ion-ios-circle-outline:before, .ion-ios-clock:before, .ion-ios-clock-outline:before, .ion-ios-close:before, .ion-ios-close-empty:before, .ion-ios-close-outline:before, .ion-ios-cloud:before, .ion-ios-cloud-download:before, .ion-ios-cloud-download-outline:before, .ion-ios-cloud-outline:before, .ion-ios-cloud-upload:before, .ion-ios-cloud-upload-outline:before, .ion-ios-cloudy:before, .ion-ios-cloudy-night:before, .ion-ios-cloudy-night-outline:before, .ion-ios-cloudy-outline:before, .ion-ios-cog:before, .ion-ios-cog-outline:before, .ion-ios-color-filter:before, .ion-ios-color-filter-outline:before, .ion-ios-color-wand:before, .ion-ios-color-wand-outline:before, .ion-ios-compose:before, .ion-ios-compose-outline:before, .ion-ios-contact:before, .ion-ios-contact-outline:before, .ion-ios-copy:before, .ion-ios-copy-outline:before, .ion-ios-crop:before, .ion-ios-crop-strong:before, .ion-ios-download:before, .ion-ios-download-outline:before, .ion-ios-drag:before, .ion-ios-email:before, .ion-ios-email-outline:before, .ion-ios-eye:before, .ion-ios-eye-outline:before, .ion-ios-fastforward:before, .ion-ios-fastforward-outline:before, .ion-ios-filing:before, .ion-ios-filing-outline:before, .ion-ios-film:before, .ion-ios-film-outline:before, .ion-ios-flag:before, .ion-ios-flag-outline:before, .ion-ios-flame:before, .ion-ios-flame-outline:before, .ion-ios-flask:before, .ion-ios-flask-outline:before, .ion-ios-flower:before, .ion-ios-flower-outline:before, .ion-ios-folder:before, .ion-ios-folder-outline:before, .ion-ios-football:before, .ion-ios-football-outline:before, .ion-ios-game-controller-a:before, .ion-ios-game-controller-a-outline:before, .ion-ios-game-controller-b:before, .ion-ios-game-controller-b-outline:before, .ion-ios-gear:before, .ion-ios-gear-outline:before, .ion-ios-glasses:before, .ion-ios-glasses-outline:before, .ion-ios-grid-view:before, .ion-ios-grid-view-outline:before, .ion-ios-heart:before, .ion-ios-heart-outline:before, .ion-ios-help:before, .ion-ios-help-empty:before, .ion-ios-help-outline:before, .ion-ios-home:before, .ion-ios-home-outline:before, .ion-ios-infinite:before, .ion-ios-infinite-outline:before, .ion-ios-information:before, .ion-ios-information-empty:before, .ion-ios-information-outline:before, .ion-ios-ionic-outline:before, .ion-ios-keypad:before, .ion-ios-keypad-outline:before, .ion-ios-lightbulb:before, .ion-ios-lightbulb-outline:before, .ion-ios-list:before, .ion-ios-list-outline:before, .ion-ios-location:before, .ion-ios-location-outline:before, .ion-ios-locked:before, .ion-ios-locked-outline:before, .ion-ios-loop:before, .ion-ios-loop-strong:before, .ion-ios-medical:before, .ion-ios-medical-outline:before, .ion-ios-medkit:before, .ion-ios-medkit-outline:before, .ion-ios-mic:before, .ion-ios-mic-off:before, .ion-ios-mic-outline:before, .ion-ios-minus:before, .ion-ios-minus-empty:before, .ion-ios-minus-outline:before, .ion-ios-monitor:before, .ion-ios-monitor-outline:before, .ion-ios-moon:before, .ion-ios-moon-outline:before, .ion-ios-more:before, .ion-ios-more-outline:before, .ion-ios-musical-note:before, .ion-ios-musical-notes:before, .ion-ios-navigate:before, .ion-ios-navigate-outline:before, .ion-ios-nutrition:before, .ion-ios-nutrition-outline:before, .ion-ios-paper:before, .ion-ios-paper-outline:before, .ion-ios-paperplane:before, .ion-ios-paperplane-outline:before, .ion-ios-partlysunny:before, .ion-ios-partlysunny-outline:before, .ion-ios-pause:before, .ion-ios-pause-outline:before, .ion-ios-paw:before, .ion-ios-paw-outline:before, .ion-ios-people:before, .ion-ios-people-outline:before, .ion-ios-person:before, .ion-ios-person-outline:before, .ion-ios-personadd:before, .ion-ios-personadd-outline:before, .ion-ios-photos:before, .ion-ios-photos-outline:before, .ion-ios-pie:before, .ion-ios-pie-outline:before, .ion-ios-pint:before, .ion-ios-pint-outline:before, .ion-ios-play:before, .ion-ios-play-outline:before, .ion-ios-plus:before, .ion-ios-plus-empty:before, .ion-ios-plus-outline:before, .ion-ios-pricetag:before, .ion-ios-pricetag-outline:before, .ion-ios-pricetags:before, .ion-ios-pricetags-outline:before, .ion-ios-printer:before, .ion-ios-printer-outline:before, .ion-ios-pulse:before, .ion-ios-pulse-strong:before, .ion-ios-rainy:before, .ion-ios-rainy-outline:before, .ion-ios-recording:before, .ion-ios-recording-outline:before, .ion-ios-redo:before, .ion-ios-redo-outline:before, .ion-ios-refresh:before, .ion-ios-refresh-empty:before, .ion-ios-refresh-outline:before, .ion-ios-reload:before, .ion-ios-reverse-camera:before, .ion-ios-reverse-camera-outline:before, .ion-ios-rewind:before, .ion-ios-rewind-outline:before, .ion-ios-rose:before, .ion-ios-rose-outline:before, .ion-ios-search:before, .ion-ios-search-strong:before, .ion-ios-settings:before, .ion-ios-settings-strong:before, .ion-ios-shuffle:before, .ion-ios-shuffle-strong:before, .ion-ios-skipbackward:before, .ion-ios-skipbackward-outline:before, .ion-ios-skipforward:before, .ion-ios-skipforward-outline:before, .ion-ios-snowy:before, .ion-ios-speedometer:before, .ion-ios-speedometer-outline:before, .ion-ios-star:before, .ion-ios-star-half:before, .ion-ios-star-outline:before, .ion-ios-stopwatch:before, .ion-ios-stopwatch-outline:before, .ion-ios-sunny:before, .ion-ios-sunny-outline:before, .ion-ios-telephone:before, .ion-ios-telephone-outline:before, .ion-ios-tennisball:before, .ion-ios-tennisball-outline:before, .ion-ios-thunderstorm:before, .ion-ios-thunderstorm-outline:before, .ion-ios-time:before, .ion-ios-time-outline:before, .ion-ios-timer:before, .ion-ios-timer-outline:before, .ion-ios-toggle:before, .ion-ios-toggle-outline:before, .ion-ios-trash:before, .ion-ios-trash-outline:before, .ion-ios-undo:before, .ion-ios-undo-outline:before, .ion-ios-unlocked:before, .ion-ios-unlocked-outline:before, .ion-ios-upload:before, .ion-ios-upload-outline:before, .ion-ios-videocam:before, .ion-ios-videocam-outline:before, .ion-ios-volume-high:before, .ion-ios-volume-low:before, .ion-ios-wineglass:before, .ion-ios-wineglass-outline:before, .ion-ios-world:before, .ion-ios-world-outline:before, .ion-ipad:before, .ion-iphone:before, .ion-ipod:before, .ion-jet:before, .ion-key:before, .ion-knife:before, .ion-laptop:before, .ion-leaf:before, .ion-levels:before, .ion-lightbulb:before, .ion-link:before, .ion-load-a:before, .ion-load-b:before, .ion-load-c:before, .ion-load-d:before, .ion-location:before, .ion-lock-combination:before, .ion-locked:before, .ion-log-in:before, .ion-log-out:before, .ion-loop:before, .ion-magnet:before, .ion-male:before, .ion-man:before, .ion-map:before, .ion-medkit:before, .ion-merge:before, .ion-mic-a:before, .ion-mic-b:before, .ion-mic-c:before, .ion-minus:before, .ion-minus-circled:before, .ion-minus-round:before, .ion-model-s:before, .ion-monitor:before, .ion-more:before, .ion-mouse:before, .ion-music-note:before, .ion-navicon:before, .ion-navicon-round:before, .ion-navigate:before, .ion-network:before, .ion-no-smoking:before, .ion-nuclear:before, .ion-outlet:before, .ion-paintbrush:before, .ion-paintbucket:before, .ion-paper-airplane:before, .ion-paperclip:before, .ion-pause:before, .ion-person:before, .ion-person-add:before, .ion-person-stalker:before, .ion-pie-graph:before, .ion-pin:before, .ion-pinpoint:before, .ion-pizza:before, .ion-plane:before, .ion-planet:before, .ion-play:before, .ion-playstation:before, .ion-plus:before, .ion-plus-circled:before, .ion-plus-round:before, .ion-podium:before, .ion-pound:before, .ion-power:before, .ion-pricetag:before, .ion-pricetags:before, .ion-printer:before, .ion-pull-request:before, .ion-qr-scanner:before, .ion-quote:before, .ion-radio-waves:before, .ion-record:before, .ion-refresh:before, .ion-reply:before, .ion-reply-all:before, .ion-ribbon-a:before, .ion-ribbon-b:before, .ion-sad:before, .ion-sad-outline:before, .ion-scissors:before, .ion-search:before, .ion-settings:before, .ion-share:before, .ion-shuffle:before, .ion-skip-backward:before, .ion-skip-forward:before, .ion-social-android:before, .ion-social-android-outline:before, .ion-social-angular:before, .ion-social-angular-outline:before, .ion-social-apple:before, .ion-social-apple-outline:before, .ion-social-bitcoin:before, .ion-social-bitcoin-outline:before, .ion-social-buffer:before, .ion-social-buffer-outline:before, .ion-social-chrome:before, .ion-social-chrome-outline:before, .ion-social-codepen:before, .ion-social-codepen-outline:before, .ion-social-css3:before, .ion-social-css3-outline:before, .ion-social-designernews:before, .ion-social-designernews-outline:before, .ion-social-dribbble:before, .ion-social-dribbble-outline:before, .ion-social-dropbox:before, .ion-social-dropbox-outline:before, .ion-social-euro:before, .ion-social-euro-outline:before, .ion-social-facebook:before, .ion-social-facebook-outline:before, .ion-social-foursquare:before, .ion-social-foursquare-outline:before, .ion-social-freebsd-devil:before, .ion-social-github:before, .ion-social-github-outline:before, .ion-social-google:before, .ion-social-google-outline:before, .ion-social-googleplus:before, .ion-social-googleplus-outline:before, .ion-social-hackernews:before, .ion-social-hackernews-outline:before, .ion-social-html5:before, .ion-social-html5-outline:before, .ion-social-instagram:before, .ion-social-instagram-outline:before, .ion-social-javascript:before, .ion-social-javascript-outline:before, .ion-social-linkedin:before, .ion-social-linkedin-outline:before, .ion-social-markdown:before, .ion-social-nodejs:before, .ion-social-octocat:before, .ion-social-pinterest:before, .ion-social-pinterest-outline:before, .ion-social-python:before, .ion-social-reddit:before, .ion-social-reddit-outline:before, .ion-social-rss:before, .ion-social-rss-outline:before, .ion-social-sass:before, .ion-social-skype:before, .ion-social-skype-outline:before, .ion-social-snapchat:before, .ion-social-snapchat-outline:before, .ion-social-tumblr:before, .ion-social-tumblr-outline:before, .ion-social-tux:before, .ion-social-twitch:before, .ion-social-twitch-outline:before, .ion-social-twitter:before, .ion-social-twitter-outline:before, .ion-social-usd:before, .ion-social-usd-outline:before, .ion-social-vimeo:before, .ion-social-vimeo-outline:before, .ion-social-whatsapp:before, .ion-social-whatsapp-outline:before, .ion-social-windows:before, .ion-social-windows-outline:before, .ion-social-wordpress:before, .ion-social-wordpress-outline:before, .ion-social-yahoo:before, .ion-social-yahoo-outline:before, .ion-social-yen:before, .ion-social-yen-outline:before, .ion-social-youtube:before, .ion-social-youtube-outline:before, .ion-soup-can:before, .ion-soup-can-outline:before, .ion-speakerphone:before, .ion-speedometer:before, .ion-spoon:before, .ion-star:before, .ion-stats-bars:before, .ion-steam:before, .ion-stop:before, .ion-thermometer:before, .ion-thumbsdown:before, .ion-thumbsup:before, .ion-toggle:before, .ion-toggle-filled:before, .ion-transgender:before, .ion-trash-a:before, .ion-trash-b:before, .ion-trophy:before, .ion-tshirt:before, .ion-tshirt-outline:before, .ion-umbrella:before, .ion-university:before, .ion-unlocked:before, .ion-upload:before, .ion-usb:before, .ion-videocamera:before, .ion-volume-high:before, .ion-volume-low:before, .ion-volume-medium:before, .ion-volume-mute:before, .ion-wand:before, .ion-waterdrop:before, .ion-wifi:before, .ion-wineglass:before, .ion-woman:before, .ion-wrench:before, .ion-xbox:before { display: inline-block; font-family: "Ionicons"; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; text-rendering: auto; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .ion-alert:before { content: "\f101"; } -.icoSecurityalerts-alert:before { content: "\f100"; } +.ion-alert-circled:before { content: "\f100"; } -.icon-controls-add-maximize:before { content: "\f2c7"; } +.ion-android-add:before { content: "\f2c7"; } -.icon-controls-add-maximize-circle:before { content: "\f359"; } +.ion-android-add-circle:before { content: "\f359"; } -.icon-misc-time:before { content: "\f35a"; } +.ion-android-alarm-clock:before { content: "\f35a"; } -.icoSecurityalerts:before { content: "\f35b"; } +.ion-android-alert:before { content: "\f35b"; } -.icon-content-grid:before { content: "\f35c"; } +.ion-android-apps:before { content: "\f35c"; } -.icon-documents-archive:before { content: "\f2c9"; } +.ion-android-archive:before { content: "\f2c9"; } .ion-android-arrow-back:before { content: "\f2ca"; } -.icon-arrows-vertical-arrow-down:before { content: "\f35d"; } +.ion-android-arrow-down:before { content: "\f35d"; } .ion-android-arrow-dropdown:before { content: "\f35f"; } -.icon-arrows-download:before { content: "\f35e"; } +.ion-android-arrow-dropdown-circle:before { content: "\f35e"; } .ion-android-arrow-dropleft:before { content: "\f361"; } -.icon-arrows-incoming-call:before { content: "\f360"; } +.ion-android-arrow-dropleft-circle:before { content: "\f360"; } .ion-android-arrow-dropright:before { content: "\f363"; } -.icoArrows-outgoing-call:before { content: "\f362"; } +.ion-android-arrow-dropright-circle:before { content: "\f362"; } .ion-android-arrow-dropup:before { content: "\f365"; } -.icoArrows-upload:before { content: "\f364"; } +.ion-android-arrow-dropup-circle:before { content: "\f364"; } -.icoArrows-straight-arrow:before { content: "\f30f"; } +.ion-android-arrow-forward:before { content: "\f30f"; } -.icon-arrows-vertical-arrow:before { content: "\f366"; } +.ion-android-arrow-up:before { content: "\f366"; } .ion-android-attach:before { content: "\f367"; } @@ -195,7 +195,7 @@ .ion-android-person:before { content: "\f3a0"; } -.icon-people-userbookmark:before { content: "\f39f"; } +.ion-android-person-add:before { content: "\f39f"; } .ion-android-phone-landscape:before { content: "\f3a1"; } @@ -387,14 +387,13 @@ .ion-checkmark-round:before { content: "\f121"; } -.icon-chevron-down:before { content: "\f123"; } +.ion-chevron-down:before { content: "\f123"; } +.ion-chevron-left:before { content: "\f124"; } -.icon-controls-left:before { content: "\f124"; } +.ion-chevron-right:before { content: "\f125"; } -.icon-controls-right:before { content: "\f125"; } - -.icon-chevron-up:before { content: "\f126"; } +.ion-chevron-up:before { content: "\f126"; } .ion-clipboard:before { content: "\f127"; } @@ -422,7 +421,7 @@ .ion-compose:before { content: "\f12c"; } -.icoDocuments-report:before { content: "\f274"; } +.ion-connection-bars:before { content: "\f274"; } .ion-contrast:before { content: "\f275"; } @@ -442,7 +441,7 @@ .ion-easel:before { content: "\f3c2"; } -.icon-misc-pen:before { content: "\f2bf"; } +.ion-edit:before { content: "\f2bf"; } .ion-egg:before { content: "\f277"; } @@ -456,7 +455,7 @@ .ion-erlenmeyer-flask-bubbles:before { content: "\f3c4"; } -.icon-overview:before { content: "\f133"; } +.ion-eye:before { content: "\f133"; } .ion-eye-disabled:before { content: "\f306"; } @@ -510,7 +509,7 @@ .ion-help-circled:before { content: "\f142"; } -.icon-building-home:before { content: "\f144"; } +.ion-home:before { content: "\f144"; } .ion-icecream:before { content: "\f27d"; } @@ -542,7 +541,7 @@ .ion-ios-arrow-back:before { content: "\f3cf"; } -.icon-controls-down:before { content: "\f3d0"; } +.ion-ios-arrow-down:before { content: "\f3d0"; } .ion-ios-arrow-forward:before { content: "\f3d1"; } @@ -558,7 +557,7 @@ .ion-ios-arrow-thin-up:before { content: "\f3d7"; } -.icon-controls-up:before { content: "\f3d8"; } +.ion-ios-arrow-up:before { content: "\f3d8"; } .ion-ios-at:before { content: "\f3da"; } @@ -588,13 +587,13 @@ .ion-ios-bolt-outline:before { content: "\f3e5"; } -.icon-documents-book:before { content: "\f3e8"; } +.ion-ios-book:before { content: "\f3e8"; } -.icoDocuments-book-outline:before { content: "\f3e7"; } +.ion-ios-book-outline:before { content: "\f3e7"; } -.icoDocuments-bookmarks:before { content: "\f3ea"; } +.ion-ios-bookmarks:before { content: "\f3ea"; } -.icoDocuments-bookmarks-outline:before { content: "\f3e9"; } +.ion-ios-bookmarks-outline:before { content: "\f3e9"; } .ion-ios-box:before { content: "\f3ec"; } @@ -692,7 +691,7 @@ .ion-ios-contact-outline:before { content: "\f419"; } -.icon-documents-copy:before { content: "\f41c"; } +.ion-ios-copy:before { content: "\f41c"; } .ion-ios-copy-outline:before { content: "\f41b"; } @@ -726,7 +725,7 @@ .ion-ios-film-outline:before { content: "\f42a"; } -.icon-content-flag:before { content: "\f42d"; } +.ion-ios-flag:before { content: "\f42d"; } .ion-ios-flag-outline:before { content: "\f42c"; } @@ -838,7 +837,7 @@ .ion-ios-minus-empty:before { content: "\f462"; } -.icon-primary-accordion-minus:before { content: "\f463"; } +.ion-ios-minus-outline:before { content: "\f463"; } .ion-ios-monitor:before { content: "\f466"; } @@ -900,9 +899,9 @@ .ion-ios-photos-outline:before { content: "\f481"; } -.icon-misc-piechart:before { content: "\f484"; } +.ion-ios-pie:before { content: "\f484"; } -.icon-misc-piechart-outline:before { content: "\f483"; } +.ion-ios-pie-outline:before { content: "\f483"; } .ion-ios-pint:before { content: "\f486"; } @@ -916,7 +915,7 @@ .ion-ios-plus-empty:before { content: "\f489"; } -.icon-primary-accordion-plus:before { content: "\f48a"; } +.ion-ios-plus-outline:before { content: "\f48a"; } .ion-ios-pricetag:before { content: "\f48d"; } @@ -1100,7 +1099,7 @@ .ion-log-in:before { content: "\f29e"; } -.icon-building-door:before { content: "\f29f"; } +.ion-log-out:before { content: "\f29f"; } .ion-loop:before { content: "\f201"; } @@ -1140,7 +1139,7 @@ .ion-navicon:before { content: "\f20e"; } -.icon-content-gridguide:before { content: "\f20d"; } +.ion-navicon-round:before { content: "\f20d"; } .ion-navigate:before { content: "\f2a3"; } @@ -1162,11 +1161,11 @@ .ion-pause:before { content: "\f210"; } -.icon-people-oneperson:before { content: "\f213"; } +.ion-person:before { content: "\f213"; } -.icon-people-oneperson-add:before { content: "\f211"; } +.ion-person-add:before { content: "\f211"; } -.icon-people-oneperson-stalker:before { content: "\f212"; } +.ion-person-stalker:before { content: "\f212"; } .ion-pie-graph:before { content: "\f2a5"; } @@ -1180,7 +1179,7 @@ .ion-planet:before { content: "\f343"; } -.icon-controls-pointer:before { content: "\f215"; } +.ion-play:before { content: "\f215"; } .ion-playstation:before { content: "\f30a"; } @@ -1212,7 +1211,7 @@ .ion-record:before { content: "\f21b"; } -.icon-arrows-replay-restart:before { content: "\f21c"; } +.ion-refresh:before { content: "\f21c"; } .ion-reply:before { content: "\f21e"; } @@ -1416,7 +1415,7 @@ .ion-spoon:before { content: "\f2b4"; } -.icon-content-star:before { content: "\f24e"; } +.ion-star:before { content: "\f24e"; } .ion-stats-bars:before { content: "\f2b5"; } @@ -1436,7 +1435,7 @@ .ion-transgender:before { content: "\f4f5"; } -.icon-misc-trash:before { content: "\f252"; } +.ion-trash-a:before { content: "\f252"; } .ion-trash-b:before { content: "\f253"; } @@ -1452,7 +1451,7 @@ .ion-unlocked:before { content: "\f254"; } -.icon-arrows-upload:before { content: "\f255"; } +.ion-upload:before { content: "\f255"; } .ion-usb:before { content: "\f2b8"; } @@ -1479,15 +1478,3 @@ .ion-wrench:before { content: "\f2ba"; } .ion-xbox:before { content: "\f30c"; } - -.icon-user:before { content: "\f213"; } - -.icon-star:before { content: "\f4b3"; } - -.icon-edit:before { content: "\f2bf"; } - -.icon-settings:before { content: "\f13d"; } - -.icon-apps-marketplace:before { content: "\f35c"; } - -.icon-add-widget:before { content: "\f3f0"; } \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/profile_searchDS2.html b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/profile_searchDS2.html index 36b8c2a42..25c081a9c 100644 --- a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/profile_searchDS2.html +++ b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/profile_searchDS2.html @@ -17,7 +17,7 @@ User ID Manager User ID Edit - Active? + Active? @@ -31,11 +31,12 @@ - +
    diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/self_profile.html b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/self_profile.html index 3b5ef525a..ca317616f 100644 --- a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/self_profile.html +++ b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-profile/self_profile.html @@ -4,14 +4,15 @@
    -
    -

    Please edit the profile details below:

    +
    +

    Please use Portal for access management

    +

    Please edit the profile details below:

    - +
    @@ -19,7 +20,7 @@
    - +
    @@ -62,7 +63,7 @@
    - +
    @@ -70,7 +71,7 @@
    - +
    @@ -81,7 +82,7 @@
    - +
    @@ -89,7 +90,7 @@
    - +
    @@ -97,7 +98,7 @@
    - +
    @@ -105,7 +106,7 @@
    - +
    @@ -116,14 +117,14 @@
    - +
    -
    @@ -132,14 +133,14 @@
    - +
    -
    @@ -148,17 +149,17 @@
    -
    -
    - +
    +

    -
    +
    Role
    @@ -168,14 +169,14 @@ Name - Delete + Delete - +
    diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-samplePages/samplePage.html b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-samplePages/samplePage.html deleted file mode 100644 index 523bfe71e..000000000 --- a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2-samplePages/samplePage.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - Sample Page - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2Header.html b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2Header.html deleted file mode 100644 index 444514939..000000000 --- a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/ds2Header.html +++ /dev/null @@ -1,68 +0,0 @@ -
    -
    - -
    -
    diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html new file mode 100644 index 000000000..2eec0cfbb --- /dev/null +++ b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html @@ -0,0 +1,2 @@ + +ONAP Portal \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/utils/page-resource-ds2.js b/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/utils/page-resource-ds2.js deleted file mode 100644 index 21b6b0dc1..000000000 --- a/ONAP-SDK-APP/src/main/webapp/app/fusion/scripts/utils/page-resource-ds2.js +++ /dev/null @@ -1,97 +0,0 @@ -function loadjscssfile(filename, filetype){ - if (filetype=="js"){ //if filename is a external JavaScript file - var done = false; - var script = document.createElement('script'); - script.src = filename; - script.async = false; - document.head.appendChild(script); - }else if (filetype=="css"){ //if filename is an external CSS file - var fileref=document.createElement("link") - fileref.setAttribute("rel", "stylesheet") - fileref.setAttribute("type", "text/css") - fileref.setAttribute("async", false) - fileref.setAttribute("href", filename) - document.head.appendChild(fileref); - } -} - -function loadResource(){ - /*********************AngularJs***************************/ - loadjscssfile("./app/fusion/external/angular-1.5/angular.min.js", "js"); - loadjscssfile("./app/fusion/external/angular-1.5/angular-messages.js", "js"); - loadjscssfile("./app/fusion/external/angular-1.5/angular-touch.js", "js"); - loadjscssfile("./app/fusion/external/angular-1.5/angular-sanitize.min.js", "js"); - loadjscssfile("./app/fusion/external/angular-1.5/angular-route.min.js", "js"); - loadjscssfile("./app/fusion/external/angular-1.5/angular-cookies.min.js", "js"); - - loadjscssfile("./app/fusion/external/ds2/js/b2b-angular/b2b-library.min.js", "js"); -/* loadjscssfile("./app/fusion/external/ds2/js/digital-ng-library/digital.ng.library.min.js", "js"); -*/ - loadjscssfile("./app/fusion/external/jquery/dist/jquery.min.js", "js"); - - /*********************Angular Gridster***************************/ - loadjscssfile("./app/fusion/external/angular-gridster/dist/angular-gridster.min.css", "css"); - loadjscssfile("./app/fusion/external/angular-bootstrap/ui-bootstrap-csp.css", "css"); - loadjscssfile("./app/fusion/external/javascript-detect-element-resize/jquery.resize.js", "js"); - loadjscssfile("./app/fusion/external/angular-bootstrap/ui-bootstrap-tpls.min.js", "js"); - loadjscssfile("./app/fusion/external/angular-gridster/dist/angular-gridster.min.js", "js"); - - /*********************Angular UI grid***************************/ - loadjscssfile("./app/fusion/external/angular-ui-grid/ui-grid.js", "js"); - loadjscssfile("./app/fusion/external/angular-ui-grid/ui-grid.css", "css"); - - loadjscssfile("./app/fusion/external/ds2/js/appDS2.js", "js"); - - loadjscssfile("./app/fusion/scripts/DS2-services/headerServiceDS2.js", "js"); - loadjscssfile("./app/fusion/scripts/DS2-services/leftMenuServiceDS2.js", "js"); - loadjscssfile("./app/fusion/scripts/DS2-services/manifestService.js", "js"); - loadjscssfile("./app/fusion/scripts/DS2-directives/footer.js", "js"); - loadjscssfile("./app/fusion/scripts/DS2-directives/ds2Header.js", "js"); - loadjscssfile("./app/fusion/scripts/DS2-directives/ds2LeftMenu.js", "js"); - loadjscssfile("./app/fusion/external/ds2/js/digital-ng-library/digital-design-library.js", "js"); - - /*******DS2 styles*******/ - loadjscssfile("./app/fusion/external/ds2/css/b2b-angular/b2b-angular.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/extras/ds2-accordion.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/extras/ds2-bootstrap-datepicker.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/extras/ds2-cc-input-field.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/extras/ds2-tooltip.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/extras/x-tabs-pills.css", "css"); - - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-accordion.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-bootstrap-datepicker.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-c2c.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-cc-input-field.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-filmstrip.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-filters.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-legacynav-fix.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-marquee.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-pagination.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-popover.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-progressbar.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ds2-tooltip.css", "css"); - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/global.css", "css"); - - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/digital-design-library.css", "css"); - /*******DS2 ICONS*******/ - - loadjscssfile("./app/fusion/external/ds2/css/digital-ng-library/ionicons.css", "css"); - loadjscssfile("./app/fusion/styles/onap.css", "css"); - loadjscssfile("./app/fusion/external/angular-gridster/dist/angular-gridster.min.css", "css"); - -} - -window.onload = loadResource(); -/*window.onload = function(){ - var appLoadingInterval = setInterval(function(){ loadApp() }, 10000); - var count=0; - function loadApp(){ - count++ - if(typeof angular !== 'undefined') { - angular.bootstrap(document, ['abs']); - clearInterval(appLoadingInterval); - }else if(count>10){ - clearInterval(appLoadingInterval); - } - } -}*/ \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/html/data/worddata.csv b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/html/data/worddata.csv index f9a8669ba..3a1a42fe6 100644 --- a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/html/data/worddata.csv +++ b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/html/data/worddata.csv @@ -1 +1 @@ -text,frequency service,98 portal,70 management,70 virtual,56 design,56 VNF,56 studio,42 operations,42 inventory,42 POLO,42 D2.0,42 ASDC,42 router,28 restart,28 process,28 platform,28 manage,28 loop,28 licensing,28 license,28 integrated,28 flow-through,28 enable,28 data,28 controller,28 control,28 configure,28 component,28 common,28 asset,28 application,28 ONAP,28 workflow,14 waterfall,14 visual,14 view,14 vCTS,14 utilization,14 user,14 usage,14 troubleshoot,14 transformation,14 track,14 topolgies,14 topics,14 time,14 tickets,14 thresholds,14 templates,14 structures,14 standards-based,14 software,14 reuse,14 repository,14 reports,14 release,14 recipes,14 real-time,14 provisioning,14 properties,14 project-based,14 processes,14 physical,14 oversight,14 openl-loop,14 network,14 monitor,14 modeling,14 model-driven,14 model,14 message,14 maximize,14 manually,14 machine,14 layer,14 interact,14 instances,14 initiate,14 increase,14 imported,14 impacts,14 host,14 function,14 feeds,14 features,14 faults,14 extended,14 engines,14 engine,14 dynamic,14 document-driven,14 determine,14 dashboard,14 current,14 creation,14 created,14 create,14 configuration,14 composer,14 components,14 collective,14 certification,14 bus,14 basis,14 available,14 automation,14 automated,14 associated,14 assignment,14 appropriate,14 against,14 aervice,14 adminstrators,14 activation,14 action,14 VMs,14 VM,14 VLAN,14 SDN,14 SDK,14 SBG,14 SAM,14 RUBY,14 Policy,14 PODS,14 Ops,14 GFP,14 F5FW,14 DMaaP,14 DCAE,14 DBC,14 CPADS,14 AT&T,14 APP-C,14 AOTS-TM,14 ALTS,14 A&AI,14 +text,frequency service,98 portal,70 management,70 virtual,56 design,56 VNF,56 studio,42 operations,42 inventory,42 POLO,42 D2.0,42 ASDC,42 router,28 restart,28 process,28 platform,28 manage,28 loop,28 licensing,28 license,28 integrated,28 flow-through,28 enable,28 data,28 controller,28 control,28 configure,28 component,28 common,28 asset,28 application,28 ONAP,28 workflow,14 waterfall,14 visual,14 view,14 vCTS,14 utilization,14 user,14 usage,14 troubleshoot,14 transformation,14 track,14 topolgies,14 topics,14 time,14 tickets,14 thresholds,14 templates,14 structures,14 standards-based,14 software,14 reuse,14 repository,14 reports,14 release,14 recipes,14 real-time,14 provisioning,14 properties,14 project-based,14 processes,14 physical,14 oversight,14 openl-loop,14 network,14 monitor,14 modeling,14 model-driven,14 model,14 message,14 maximize,14 manually,14 machine,14 layer,14 interact,14 instances,14 initiate,14 increase,14 imported,14 impacts,14 host,14 function,14 feeds,14 features,14 faults,14 extended,14 engines,14 engine,14 dynamic,14 document-driven,14 determine,14 dashboard,14 current,14 creation,14 created,14 create,14 configuration,14 composer,14 components,14 collective,14 certification,14 bus,14 basis,14 available,14 automation,14 automated,14 associated,14 assignment,14 appropriate,14 against,14 aervice,14 adminstrators,14 activation,14 action,14 VMs,14 VM,14 VLAN,14 SDN,14 SDK,14 SBG,14 SAM,14 RUBY,14 Policy,14 PODS,14 Ops,14 GFP,14 F5FW,14 DMaaP,14 DCAE,14 DBC,14 CPADS,14 AT&T,14 APP-C,14 AOTS-TM,14 ALTS,14 A&AI,14 diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/Calendar-16x16.png b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/Calendar-16x16.png deleted file mode 100644 index ac970bda5aef01cd511c0e7057a2908c35684fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 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 Hu0mjfDDUGo diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/copyicon.png b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/copyicon.png deleted file mode 100644 index 6c1c3c155f6d2dbaf649a4f5094ff679b95960c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!3HGX7W?Z1DaPU;cPEB*=VV?2Ic!PZ?k)`C z3>^$7)npGG1d4DLctjR6FmMZlFeAgPITAoY_7YEDSN1!MTw=l^GqS((0)?_YT^vI+ z&flH1oA-bLhf9A)V!q0;B$;wQVb_0}$I8UDRQM|9Oqe3%=fv2M(q}efW(o7WLtAD( zneo8;f}Td^S)US>S#tt(Z!1<5mmfDf*vWo%g1kV?>h-sSvRLY0IsUw_Qv77fLiW`r b3zF%z`1D?`s3%jufI0#KBi$}ACsD|ZRYsk#YasOhpTs=O`N;x z;Mtoyj-20r>Pkdn_PnKQb{x5|>*$4vbC=Irw6d_et$pI`MXR@InL5;WOuts z!{ReH9XR*l^OrfxHWk*i$ED>L)phmETzdTC&4XvIH}*`w^W=3_aZP4XT~1k3YF>q! zk==&f$751*tJ@~Nc>neI`Rjet=g(NQZpwnyvsY~S@%R7YRH%<=E7`yz-`< zM=rSeMLd4>Au+4i(L40~m0LRwpSy7D$@%LKrp{TqVehH3#_rw6uUx(T=;r-rx)#nU zc@@9_VW1aK{K>+|z!1Zr1F{elCk*Th8e*E78Cn^dJ31J6czJo+J7d}=PibMCK4T_h zzyt<9Gs$3MSuPt*7b&B;hFWg&${~)brW$H?6Jqok9R%(5BEy}9xxzXu8QEAkS=l+5 znF3WhEKZy{bB;;It0VgA>9gm#%scq+U4LlRA^PkAleb@o+?yNj1|8ar9=g6x5eiC7 mPG1~Y9tH_=iZ97Y2yAtmDOAtqh!89ZDp4AuZRknPU^ diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/example-frame.png b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/images/example-frame.png deleted file mode 100644 index 31f2fe1cc66141a21c93cc3b9fdc53e09fd4a742..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33699 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 z 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 Li@*OP`t$q`mG8q8 diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/js/slides.min.jquery.js b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/js/slides.min.jquery.js deleted file mode 100644 index 1a1fcdd8d..000000000 --- a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/js/slides.min.jquery.js +++ /dev/null @@ -1,20 +0,0 @@ -/* -* Slides, A Slideshow Plugin for jQuery -* Intructions: http://slidesjs.com -* By: Nathan Searles, http://nathansearles.com -* Version: 1.1.9 -* Updated: September 5th, 2011 -* -* 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. -*/ -(function(a){a.fn.slides=function(b){return b=a.extend({},a.fn.slides.option,b),this.each(function(){function w(g,h,i){if(!p&&o){p=!0,b.animationStart(n+1);switch(g){case"next":l=n,k=n+1,k=e===k?0:k,r=f*2,g=-f*2,n=k;break;case"prev":l=n,k=n-1,k=k===-1?e-1:k,r=0,g=0,n=k;break;case"pagination":k=parseInt(i,10),l=a("."+b.paginationClass+" li."+b.currentClass+" a",c).attr("href").match("[^#/]+$"),k>l?(r=f*2,g=-f*2):(r=0,g=0),n=k}h==="fade"?b.crossfade?d.children(":eq("+k+")",c).css({zIndex:10}).fadeIn(b.fadeSpeed,b.fadeEasing,function(){b.autoHeight?d.animate({height:d.children(":eq("+k+")",c).outerHeight()},b.autoHeightSpeed,function(){d.children(":eq("+l+")",c).css({display:"none",zIndex:0}),d.children(":eq("+k+")",c).css({zIndex:0}),b.animationComplete(k+1),p=!1}):(d.children(":eq("+l+")",c).css({display:"none",zIndex:0}),d.children(":eq("+k+")",c).css({zIndex:0}),b.animationComplete(k+1),p=!1)}):d.children(":eq("+l+")",c).fadeOut(b.fadeSpeed,b.fadeEasing,function(){b.autoHeight?d.animate({height:d.children(":eq("+k+")",c).outerHeight()},b.autoHeightSpeed,function(){d.children(":eq("+k+")",c).fadeIn(b.fadeSpeed,b.fadeEasing)}):d.children(":eq("+k+")",c).fadeIn(b.fadeSpeed,b.fadeEasing,function(){a.browser.msie&&a(this).get(0).style.removeAttribute("filter")}),b.animationComplete(k+1),p=!1}):(d.children(":eq("+k+")").css({left:r,display:"block"}),b.autoHeight?d.animate({left:g,height:d.children(":eq("+k+")").outerHeight()},b.slideSpeed,b.slideEasing,function(){d.css({left:-f}),d.children(":eq("+k+")").css({left:f,zIndex:5}),d.children(":eq("+l+")").css({left:f,display:"none",zIndex:0}),b.animationComplete(k+1),p=!1}):d.animate({left:g},b.slideSpeed,b.slideEasing,function(){d.css({left:-f}),d.children(":eq("+k+")").css({left:f,zIndex:5}),d.children(":eq("+l+")").css({left:f,display:"none",zIndex:0}),b.animationComplete(k+1),p=!1})),b.pagination&&(a("."+b.paginationClass+" li."+b.currentClass,c).removeClass(b.currentClass),a("."+b.paginationClass+" li:eq("+k+")",c).addClass(b.currentClass))}}function x(){clearInterval(c.data("interval"))}function y(){b.pause?(clearTimeout(c.data("pause")),clearInterval(c.data("interval")),u=setTimeout(function(){clearTimeout(c.data("pause")),v=setInterval(function(){w("next",i)},b.play),c.data("interval",v)},b.pause),c.data("pause",u)):x()}a("."+b.container,a(this)).children().wrapAll('

    ');var c=a(this),d=a(".slides_control",c),e=d.children().size(),f=d.children().outerWidth(),g=d.children().outerHeight(),h=b.start-1,i=b.effect.indexOf(",")<0?b.effect:b.effect.replace(" ","").split(",")[0],j=b.effect.indexOf(",")<0?i:b.effect.replace(" ","").split(",")[1],k=0,l=0,m=0,n=0,o,p,q,r,s,t,u,v;if(e<2)return a("."+b.container,a(this)).fadeIn(b.fadeSpeed,b.fadeEasing,function(){o=!0,b.slidesLoaded()}),a("."+b.next+", ."+b.prev).fadeOut(0),!1;if(e<2)return;h<0&&(h=0),h>e&&(h=e-1),b.start&&(n=h),b.randomize&&d.randomize(),a("."+b.container,c).css({overflow:"hidden",position:"relative"}),d.children().css({position:"absolute",top:0,left:d.children().outerWidth(),zIndex:0,display:"none"}),d.css({position:"relative",width:f*3,height:g,left:-f}),a("."+b.container,c).css({display:"block"}),b.autoHeight&&(d.children().css({height:"auto"}),d.animate({height:d.children(":eq("+h+")").outerHeight()},b.autoHeightSpeed));if(b.preload&&d.find("img:eq("+h+")").length){a("."+b.container,c).css({background:"url("+b.preloadImage+") no-repeat 50% 50%"});var z=d.find("img:eq("+h+")").attr("src")+"?"+(new Date).getTime();a("img",c).parent().attr("class")!="slides_control"?t=d.children(":eq(0)")[0].tagName.toLowerCase():t=d.find("img:eq("+h+")"),d.find("img:eq("+h+")").attr("src",z).load(function(){d.find(t+":eq("+h+")").fadeIn(b.fadeSpeed,b.fadeEasing,function(){a(this).css({zIndex:5}),a("."+b.container,c).css({background:""}),o=!0,b.slidesLoaded()})})}else d.children(":eq("+h+")").fadeIn(b.fadeSpeed,b.fadeEasing,function(){o=!0,b.slidesLoaded()});b.bigTarget&&(d.children().css({cursor:"pointer"}),d.children().click(function(){return w("next",i),!1})),b.hoverPause&&b.play&&(d.bind("mouseover",function(){x()}),d.bind("mouseleave",function(){y()})),b.generateNextPrev&&(a("."+b.container,c).after('Prev'),a("."+b.prev,c).after('Next')),a("."+b.next,c).click(function(a){a.preventDefault(),b.play&&y(),w("next",i)}),a("."+b.prev,c).click(function(a){a.preventDefault(),b.play&&y(),w("prev",i)}),b.generatePagination?(b.prependPagination?c.prepend("
      "):c.append("
        "),d.children().each(function(){a("."+b.paginationClass,c).append('
      • '+(m+1)+"
      • "),m++})):a("."+b.paginationClass+" li a",c).each(function(){a(this).attr("href","#"+m),m++}),a("."+b.paginationClass+" li:eq("+h+")",c).addClass(b.currentClass),a("."+b.paginationClass+" li a",c).click(function(){return b.play&&y(),q=a(this).attr("href").match("[^#/]+$"),n!=q&&w("pagination",j,q),!1}),a("a.link",c).click(function(){return b.play&&y(),q=a(this).attr("href").match("[^#/]+$")-1,n!=q&&w("pagination",j,q),!1}),b.play&&(v=setInterval(function(){w("next",i)},b.play),c.data("interval",v))})},a.fn.slides.option={preload:!1,preloadImage:"/img/loading.gif",container:"slides_container",generateNextPrev:!1,next:"next",prev:"prev",pagination:!0,generatePagination:!0,prependPagination:!1,paginationClass:"pagination",currentClass:"current",fadeSpeed:350,fadeEasing:"",slideSpeed:350,slideEasing:"",start:1,effect:"slide",crossfade:!1,randomize:!1,play:0,pause:0,hoverPause:!1,autoHeight:!1,autoHeightSpeed:350,bigTarget:!1,animationStart:function(){},animationComplete:function(){},slidesLoaded:function(){}},a.fn.randomize=function(b){function c(){return Math.round(Math.random())-.5}return a(this).each(function(){var d=a(this),e=d.children(),f=e.length;if(f>1){e.hide();var g=[];for(i=0;i') - .appendTo(this) - .addClass(opt.loadingClass) - .bind('click', EYE.spacegallery.next); - el.spacegalleryCfg = opt; - el.spacegalleryCfg.images = el.getElementsByTagName('img').length; - el.spacegalleryCfg.loaded = 0; - el.spacegalleryCfg.asin = Math.asin(1); - el.spacegalleryCfg.asins = {}; - el.spacegalleryCfg.tops = {}; - el.spacegalleryCfg.increment = parseInt(el.spacegalleryCfg.perspective/el.spacegalleryCfg.images, 10); - var top = 0; - $('img', el) - .each(function(nr){ - var imgEl = new Image(); - var elImg = this; - el.spacegalleryCfg.asins[nr] = 1 - Math.asin((nr+1)/el.spacegalleryCfg.images)/el.spacegalleryCfg.asin; - top += el.spacegalleryCfg.increment - el.spacegalleryCfg.increment * el.spacegalleryCfg.asins[nr]; - el.spacegalleryCfg.tops[nr] = top; - elImg.spacegallery = {}; - imgEl.src = this.src; - if (imgEl.complete) { - el.spacegalleryCfg.loaded ++; - elImg.spacegallery.origWidth = imgEl.width; - elImg.spacegallery.origHeight = imgEl.height - } else { - imgEl.onload = function() { - el.spacegalleryCfg.loaded ++; - elImg.spacegallery.origWidth = imgEl.width; - elImg.spacegallery.origHeight = imgEl.height - if (el.spacegalleryCfg.loaded == el.spacegalleryCfg.images) { - - EYE.spacegallery.positionImages(el); - } - }; - } - }); - el.spacegalleryCfg.asins[el.spacegalleryCfg.images] = el.spacegalleryCfg.asins[el.spacegalleryCfg.images - 1] * 1.3; - el.spacegalleryCfg.tops[el.spacegalleryCfg.images] = el.spacegalleryCfg.tops[el.spacegalleryCfg.images - 1] * 1.3; - if (el.spacegalleryCfg.loaded == el.spacegalleryCfg.images) { - EYE.spacegallery.positionImages(el); - setInterval(function() { EYE.spacegallery.autoNext(el); }, 4000); - } - } - }); - } - } - }); - - $.fn.extend({ - - /** - * Create a space gallery - * @name spacegallery - * @description create a space gallery - * @option int border Images' border. Default: 6 - * @option int perspective Perpective height. Default: 140 - * @option float minScale Minimum scale for the image in the back. Default: 0.2 - * @option int duration Animation duration. Default: 800 - * @option string loadingClass CSS class applied to the element while looading images. Default: null - * @option function before Callback function triggered before going to the next image - * @option function after Callback function triggered after going to the next image - */ - spacegallery: EYE.spacegallery.init - }); - $.extend($.easing,{ - easeOut:function (x, t, b, c, d) { - return -c *(t/=d)*(t-2) + b; - } - }); -})(jQuery); \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/css/jquery.jOrgChart.css b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/css/jquery.jOrgChart.css deleted file mode 100644 index ffabe2740..000000000 --- a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/css/jquery.jOrgChart.css +++ /dev/null @@ -1,51 +0,0 @@ -/* Basic styling */ -/* Draw the lines */ -.jOrgChart .line { - height : 20px; - width : 4px; -} - -.jOrgChart .down { - background-color : black; - margin : 0px auto; -} - -.jOrgChart .top { - border-top : 3px solid black; -} - -.jOrgChart .left { - border-right : 2px solid black; -} - -.jOrgChart .right { - border-left : 2px solid black; -} - -/* node cell */ -.jOrgChart td { - text-align : center; - vertical-align : top; - padding : 0; -} - -/* The node */ -.jOrgChart .node { - background-color : #35363B; - display : inline-block; - width : 120px; - height : 60px; - z-index : 10; - margin : 0 2px; -} - -/* jQuery drag 'n drop */ - -.drag-active { - border-style : dashed !important; -} - -.drop-hover { - border-style : solid !important; - border-color : #E05E00 !important; -} diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example.html b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example.html deleted file mode 100644 index 543b0f924..000000000 --- a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example.html +++ /dev/null @@ -1,85 +0,0 @@ - - - jOrgChart - A jQuery OrgChart Plugin - - - - - - - - - - - - - - - - - - - -
        - - - - \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example_vsp.html b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example_vsp.html deleted file mode 100644 index a2e3703d2..000000000 --- a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/example_vsp.html +++ /dev/null @@ -1,88 +0,0 @@ - - - jOrgChart - A jQuery OrgChart Plugin - - - - - - - - - - - - - - - - - - - -
        - - - - \ No newline at end of file diff --git a/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/images/bkgd.png b/ONAP-SDK-APP/src/main/webapp/static/fusion/sample/org_chart/images/bkgd.png deleted file mode 100644 index 3bbaf5eeea64914a5d5698b6c9fa0f03030bff7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^i-4Gog&9b03XHe_r1%4TLR?p#Ik))8vAO#WE9G^tcBkTjQih%`jv*CsSNjigGB9v3$to^ny|v))^3`fDlKUSB$QLOz@uWZB@V%Cy hc?NUxs-GWrF~|iAeeYSivQ^1_c11m$k>^-ROh>z_}9%CI&h}<`(CL7~cUpzz0|WKVY#(d*QWD zojM61qj72Xf3=kX0A&K8Px{}-|CRlZCl*I9G!6h5699BejuPlWI#8YXP{Z_=>C7S7r9o0{lCoEivkN8<@J{!0ieqn+&?A)N>aOI`Sj8 zxp_l%H;n@tSuyTs&p`M6P*1@auVcS3EY#6n4+Z%TLH*7;V)TwdSPH^9PFQ^;gbzU1 zh!a8o>=uSeV2Mc6ElhXL-OcFaFU;%iU}OwoC_fB=C+e8|!l7P1XJ|P${Vw(=PC=L- z;+VL4plF<3P(McloK4NPFw8B$S=ZOLS9-N19`E)3%LGUrW-i*dzKr-FaR^qoSDrzp1>QL zP0N1{=oo=esoxodWCvvzWcy_w$Y#pUUFY{c@Fx;Vu*IT#;>l26T4h={w7gqA((==K z+RBfHy48lFZr}ps#X;AWCa>Ro>A$;ka=*_1J0e7@fr&I)`Aa3{uS(Lu0m?^HO;hg! zVK?Xrvsv#ytNmB22XWg1Yk2?E>PJ*s^|7`E{@o4K`#)7}tu#&5-z$&)i}&|hV-Ny} z!w4io8KDA%5L$?%2u*|@^rVJ3`FqA$Xsxio7wVe;b#D)8a0mWS^v|3Av$kMsuR&i7 zw2urh?id0VEkxV@rwATSSU1dOU~Bjv!hbRUJ4icMw&Lf#0m%0PfJgq1Z`ow?41w+H z`QsxR0-&)7od>V}_zpn(f%_f+m5OL@g3qsdFjyA=M2sJ_=K;|5!21)h7o3SgM`UG{ zgtVa}3nPSdM<0?BvUhV6+6;LK5injDf)B>=5b$!6JF=Mv#;OCI6Ju2BGPM5~69M>< zK&7rfq*8xmKs}5A(BMX$0GE#WVVwXlGz1dREG9q?+X>(hg34uD83pq)h!8$jpVra@=(=JVE_?mpdbhTVPmZ>&z^Qip*qpraXVbEKn#!x<28 z$QbGA5e!U>OiZ+kc^exGGc)TpCMFhk7FM?HkTJ9D;9%d*LBq5pwCT_+1_Xj(J2MkA zjq!goY6IY40_wmH4ig4+956TsjM@wYAtm(CKMw6r=a<3g;0SsKMyMwih)}iz(81tv zIs_c*7g`8d5EKUp4*H$@4r?=Tp0;Nc_T)NpIpG15h)(fyZj)ZJsGI{KlzH1O9$r3v zvHju)4ob)?C@LwdsOst+(>FMdJaNYK>^U>&6G1y-oGv(HUA&0iKE8hb0by6dBOW@af%%U`~(tge0gPSXVg@GV)tmHk5(2c(M*fq)|zX}Vx^zR(5dK+x|y%&=4Y zG^4#Ir|^->Ok6q%4~m~Ni^!Rfxg7|-+jfb{Pl!=y(l(X-?}UZ^zm)wJ_D9zcV1>h= zmj~wnT7beb&TFfOJ~H~U;&j*)N;In@_I;~?_RzEXNGjMlXj;sp#N#%Yyvl&Y#O+Wz zlFHCX_IuAcW20Rdh*;~9-bj|6Q9U`O6i#x9I-3(3%Yd#Zyd38wD0y{K*b(d^8IV%1$AJc*2E8i|p z?F`@?jB}kbju?}t7{>)3CEBtc9VT7>kvBbi7Il$0WURH|D|nB4QDnlnoq%c z?!lw12kQ!D506-N2PEy>6Z>SZS6`g!AOoB+Hc9VMsddPEK?Pgpq*wPUvd{f6vHlUF z+wS(0DbQq~wDOQ(vyEWydBX_ zAN4JBFQg4*>?sI1+MXzN2~HGBU1g}M6`b62E@6L~k2skyTpbzi7T9uCp9 zy(_+dYG}qiy`pbAaJT@gxt~%W?e6V*(7L8_;I(K9;i(?wu!@A4oyz-zq%bRkFydUu z_CUio3gf(QksgZo4n}vOF&vR@KQ}H!%*v(1W`^n_C_FKxcTsb9D-TJBJRK8HalO58 zTFhzviox!{t~i!`aKw~%p*V8QYx0_bl@?doFwB2qSXsMIYP8ecW1^A?zb*CxT$D2v zFUi+uBy;ON`Rk7?7o$8R^074cIC@5qey(m`|NMf&HDQ+a`4mEo@8h?^jqSbR*B>!? zg({N}smm7iyy`0XfjVo--xcd8ig5+c_uWI*hn{Rvk6P95?cPS#R_C-4$=*N>lu<#H zFCM9CITOQ)@>EZBkaXg0uKKh)7S?L~x~{Bu1L^7gurtFij_sW54LbP}1BGY9$a~eV zs_hm(;r)9ij2V?3upI|$HA&e~B^&zIHVS+8`4-&hmudVN*&@KVCPEROaHzU*@|Irt z&QOb$c88BxG=FL$qk~siPgcO*?51lWx`WLtnlcq{#7mbA-X408IA(!{@2eobOJ8dt zmaH||lH(WDg0e?kcm|Vk;%NwNM2O3^t5P~u4I)Cx>W-B3vEj*16kAAR#Q0f@bMrba z?(eG%5@6q=)uY}#nXOgM&v~7pTxVHcU$8yZ2OHZ|ZL*Tvm(tr}J801FJ@1zvvLhqx zgr(Y2b#V5!_Q@aC**tnAH{(PkDecEqQdZzHcNS#6vurLetEZ#r3KXMeYQ zs`&lRjJ)ec+I*i}W=wMio(UWZvSpkfl|YRp$8@Ye`|>kC=sCG(V(iBK4aui{3yY-{ zSf8r;H1!y4p#i5J0eP+!&ld1yOajN#SlhYegD{ilT)Ey+2uWGBwrU zq);l#%%V;4a_&sQ_hj6YW(0Wq?^jcZK1Vdevn{2BnJ$ziDi?h4Yc+lRqUE|I8dhKGW^B=m_x7%ZG*weUWJCSa z*x7TZSz=tn*ptL>7j#a=-{$Ut3w`9C4lrxMF)UB8YO+(DZaseCEIzhmK6^x;BBHia zR+VU#Gnevdck_y`COn;3724`ddYho}IPc%fQZTvu z5{b7ZFa$$FebLk}$Z}C7wu{Jcy-MB1)@_<2y1F4}ePhFw92uF9sjaCT&pRI2Ub=?j zb9CDyDL#5ul;9^&R>n+>YDt|gB?$y{k9qhGwPkH!Lq~%Tu4%QHRo{%Fk4U#$;;ulc zY4S4kkb$b;iN(?ozQbg7#+Ri#40zg|uIjGfM?5RSp7)4fmt5Xh8*Uksp)9oK=DCEj z#N0X!?_m%w4_D%buj%B7!ebL%XL}ed3k%5Aq?2{^m8F#f_m{34vl!#t34ysugQ1S3 zeU$)q*<3^7MH?#Z9md>&@X6%E>(v0)A`dk|20xpF3a(UeXz7FaMU~?gqAEQqykCnR zx(^zak=a_Z(=^j0^=G6c_c&%6Mwkc|q6qI68VcDbsGw11M<=oR*|^wEr5%UOQ#A7D zo;eE%>I8Tf9i@acvh!lgc@CS8Yy22Yk|JdG)?m_ru$V^4cAqCRHrLE}r1`#;BO{wl z8auqPO0Mr#)$gI!E>Efzarb08lMM?xS;BS)WqZbykG2gWq8Ge-BI`5<1G$y1dPptE zFQ_XcaY^iV-AUIo)A9aax$lxgj#a!a@R;`|25Fs+c3R$7d6n7pE8w23YL#`JW63SZ z!tU}^H}uDLj@rmysXWEpKzjB5ef0EW3D4Y4?q!XQFj!REhuLz8jKIOwkXt2nRN%jC z-1Iq$;HT8omE}_SaHMT2#HFG;-E54bBO_gvPK*D`U1PqrZ8Kl3-MfvMhi4P_zA`F| z5HrzW{+u49T*TZLyk{-B>G@ETYYFOt<5Sd%QiEoo-n~@LRQNmNE?cD@v~zXZLdNck zkx}gyZ|T_UYkf^Jj2F^JNxfJo8n@yu7i|KO2{dzz7(^LR@ z#@bH86KvB$SiRScSp%&?4fT1a`WA1zsAOH&2@N)TF%xE+lWen>Oa*Nrq2+a4Z#=%# z3NO7#G(57ROgb$|Py^eN+Qrp>D#VE}dgBDunA!gLq|;{wpeQVi5#uuO+EqhwHAC(U=^ZhLmN8#alwtwD{`n_4{PJ zEBmBY6mjnba{<=A@Vi4p=U)U#6<;fnJkVg6cbtSG>ahr35xton|Tk)f3C3By;{IJ!`f1pKL3blB1$YXA;u3) z|E690941(Ml`+<{%g0M5a^4O10e52YnaCRj+-Dm>QdCH}mW$O$3oF{FI(p!(-X)NbB%;!dlpAjudTo#X5t(f7Av||QLc(V&!=kHSJ=oWx`%q6RN3%yJ z`1ykEF3};a(1=xqdE~+8g4d"); - if($this.is("ul")) { - buildNode($this.find("li:first"), $container, 0, opts); - } - else if($this.is("li")) { - buildNode($this, $container, 0, opts); - } - $appendTo.append($container); - - // add drag and drop if enabled - if(opts.dragAndDrop){ - $('div.node').draggable({ - cursor : 'move', - distance : 40, - helper : 'clone', - opacity : 0.8, - revert : true, - revertDuration : 100, - snap : 'div.node.expanded', - snapMode : 'inner', - stack : 'div.node' - }); - - $('div.node').droppable({ - accept : '.node', - activeClass : 'drag-active', - hoverClass : 'drop-hover' - }); - - // Drag start event handler for nodes - $('div.node').bind("dragstart", function handleDragStart( event, ui ){ - - var sourceNode = $(this); - sourceNode.parentsUntil('.node-container') - .find('*') - .filter('.node') - .droppable('disable'); - }); - - // Drag stop event handler for nodes - $('div.node').bind("dragstop", function handleDragStop( event, ui ){ - - /* reload the plugin */ - $(opts.chartElement).children().remove(); - $this.jOrgChart(opts); - }); - - // Drop event handler for nodes - $('div.node').bind("drop", function handleDropEvent( event, ui ) { - var sourceNode = ui.draggable; - var targetNode = $(this); - - // finding nodes based on plaintext and html - // content is hard! - var targetLi = $('li').filter(function(){ - - li = $(this).clone() - .children("ul,li") - .remove() - .end(); - var attr = li.attr('id'); - if (typeof attr !== 'undefined' && attr !== false) { - return li.attr("id") == targetNode.attr("id"); - } - else { - return li.html() == targetNode.html(); - } - - }); - - var sourceLi = $('li').filter(function(){ - - li = $(this).clone() - .children("ul,li") - .remove() - .end(); - var attr = li.attr('id'); - if (typeof attr !== 'undefined' && attr !== false) { - return li.attr("id") == sourceNode.attr("id"); - } - else { - return li.html() == sourceNode.html(); - } - - }); - - var sourceliClone = sourceLi.clone(); - var sourceUl = sourceLi.parent('ul'); - - if(sourceUl.children('li').size() > 1){ - sourceLi.remove(); - }else{ - sourceUl.remove(); - } - - var id = sourceLi.attr("id"); - - if(targetLi.children('ul').size() >0){ - if (typeof id !== 'undefined' && id !== false) { - targetLi.children('ul').append('
      • '+sourceliClone.html()+'
      • '); - }else{ - targetLi.children('ul').append('
      • '+sourceliClone.html()+'
      • '); - } - }else{ - if (typeof id !== 'undefined' && id !== false) { - targetLi.append('
        • '+sourceliClone.html()+'
        '); - }else{ - targetLi.append('
        • '+sourceliClone.html()+'
        '); - } - } - - }); // handleDropEvent - - } // Drag and drop - }; - - // Option defaults - $.fn.jOrgChart.defaults = { - chartElement : 'body', - depth : -1, - chartClass : "jOrgChart", - dragAndDrop: false - }; - - // Method that recursively builds the tree - function buildNode($node, $appendTo, level, opts) { - var $table = $(""); - var $tbody = $(""); - - // Construct the node container(s) - var $nodeRow = $("").addClass("node-cells"); - var $nodeCell = $(""); - var $downLineCell = $(""); - $childNodes.each(function() { - var $left = $("").addClass("line left top"); - var $right = $("").addClass("line right top"); - $linesRow.append($left).append($right); - }); - - // horizontal line shouldn't extend beyond the first and last child branches - $linesRow.find("td:first") - .removeClass("top") - .end() - .find("td:last") - .removeClass("top"); - - $tbody.append($linesRow); - var $childNodesRow = $(""); - $childNodes.each(function() { - var $td = $("
        ").addClass("node-cell").attr("colspan", 2); - var $childNodes = $node.children("ul:first").children("li"); - var $nodeDiv; - - if($childNodes.length > 1) { - $nodeCell.attr("colspan", $childNodes.length * 2); - } - // Draw the node - // Get the contents - any markup except li and ul allowed - var $nodeContent = $node.clone() - .children("ul,li") - .remove() - .end() - .html(); - - var new_node_id = $node.attr("id"); - if (typeof new_node_id !== 'undefined' && new_node_id !== false) { - $nodeDiv = $("
        ").addClass("node").attr("id", $node.attr("id")).append($nodeContent); - }else{ - $nodeDiv = $("
        ").addClass("node").append($nodeContent); - } - - // Expand and contract nodes - if ($childNodes.length > 0) { - $nodeDiv.click(function() { - var $this = $(this); - var $tr = $this.closest("tr"); - - if($tr.hasClass('contracted')){ - $this.css('cursor','n-resize'); - $tr.removeClass('contracted').addClass('expanded'); - $tr.nextAll("tr").css('visibility', ''); - }else{ - $this.css('cursor','s-resize'); - $tr.removeClass('expanded').addClass('contracted'); - $tr.nextAll("tr").css('visibility', 'hidden'); - } - }); - } - - $nodeCell.append($nodeDiv); - $nodeRow.append($nodeCell); - $tbody.append($nodeRow); - - if($childNodes.length > 0) { - // if it can be expanded then change the cursor - $nodeDiv.css('cursor','n-resize').addClass('expanded'); - - // recurse until leaves found (-1) or to the level specified - if(opts.depth == -1 || (level+1 < opts.depth)) { - var $downLineRow = $("
        ").attr("colspan", $childNodes.length*2); - $downLineRow.append($downLineCell); - - // draw the connecting line from the parent node to the horizontal line - $downLine = $("
        ").addClass("line down"); - $downLineCell.append($downLine); - $tbody.append($downLineRow); - - // Draw the horizontal lines - var $linesRow = $("
          
        "); - $td.attr("colspan", 2); - // recurse through children lists and items - buildNode($(this), $td, level+1, opts); - $childNodesRow.append($td); - }); - - } - $tbody.append($childNodesRow); - } - - // any classes on the LI element get copied to the relevant node in the tree - // apart from the special 'collapsed' class, which collapses the sub-tree at this point - if ($node.attr('class') != undefined) { - var classList = $node.attr('class').split(/\s+/); - $.each(classList, function(index,item) { - if (item == 'collapsed') { - $nodeRow.nextAll('tr').css('display', 'none'); - $nodeRow.removeClass('expanded'); - $nodeRow.addClass('contracted'); - $nodeDiv.css('cursor','s-resize'); - } else { - $nodeDiv.addClass(item); - } - }); - } - - $table.append($tbody); - $appendTo.append($table); - - /* Prevent trees collapsing if a link inside a node is clicked */ - $nodeDiv.children('a').click(function(e){ - console.log(e); - e.stopPropagation(); - }); - }; - -})(jQuery); diff --git a/POLICY-SDK-APP/pom.xml b/POLICY-SDK-APP/pom.xml index 5cd0429d3..60bc1c12d 100644 --- a/POLICY-SDK-APP/pom.xml +++ b/POLICY-SDK-APP/pom.xml @@ -49,7 +49,7 @@ UTF-8 - 1.3.1 + 2.1.0-SNAPSHOT 4.2.0.RELEASE 4.3.11.Final true diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyManagerServlet.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyManagerServlet.java index d65d1da8a..cb373a1bd 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyManagerServlet.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyManagerServlet.java @@ -33,9 +33,11 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -67,6 +69,7 @@ import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.components.HumanPolicyComponent; import org.onap.policy.controller.PolicyController; import org.onap.policy.controller.PolicyExportAndImportController; +import org.onap.policy.model.Roles; import org.onap.policy.rest.XACMLRest; import org.onap.policy.rest.XACMLRestProperties; import org.onap.policy.rest.adapter.PolicyRestAdapter; @@ -79,8 +82,7 @@ import org.onap.policy.rest.jpa.UserInfo; import org.onap.policy.utils.PolicyUtils; import org.onap.policy.xacml.api.XACMLErrorConstants; import org.onap.policy.xacml.util.XACMLPolicyScanner; -import org.openecomp.policy.model.Roles; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.web.support.UserUtils; import com.att.research.xacml.util.XACMLProperties; import com.fasterxml.jackson.databind.JsonNode; @@ -272,6 +274,12 @@ public class PolicyManagerServlet extends HttpServlet { JSONObject jObj = new JSONObject(sb.toString()); JSONObject params = jObj.getJSONObject("params"); Mode mode = Mode.valueOf(params.getString("mode")); + + String userId = UserUtils.getUserSession(request).getOrgUserId(); + LOGGER.info("****************************************Logging UserID while doing actions on Editor tab*******************************************"); + LOGGER.info("UserId: " + userId + "Action Mode: "+ mode.toString() + "Action Params: "+params.toString()); + LOGGER.info("***********************************************************************************************************************************"); + switch (mode) { case ADDFOLDER: case ADDSUBSCOPE: @@ -623,7 +631,7 @@ public class PolicyManagerServlet extends HttpServlet { if(!(scope.getScopeName().contains(File.separator))){ JSONObject el = new JSONObject(); el.put("name", scope.getScopeName()); - el.put("date", scope.getCreatedDate()); + el.put("date", scope.getModifiedDate()); el.put("size", ""); el.put("type", "dir"); el.put("createdBy", scope.getUserCreatedBy().getUserName()); @@ -638,7 +646,7 @@ public class PolicyManagerServlet extends HttpServlet { if(!scopesList.isEmpty()){ PolicyEditorScopes scopeById = (PolicyEditorScopes) scopesList.get(0); el.put("name", scopeById.getScopeName()); - el.put("date", scopeById.getCreatedDate()); + el.put("date", scopeById.getModifiedDate()); el.put("size", ""); el.put("type", "dir"); el.put("createdBy", scopeById.getUserCreatedBy().getUserName()); @@ -1149,6 +1157,7 @@ public class PolicyManagerServlet extends HttpServlet { entityItem.setPolicyName(policyName); entityItem.setCreatedBy(userId); entityItem.setModifiedBy(userId); + entityItem.setModifiedDate(new Date()); controller.saveData(entityItem); } @@ -1212,9 +1221,9 @@ public class PolicyManagerServlet extends HttpServlet { if(!policyEntityobjects.isEmpty()){ for(Object object : policyEntityobjects){ policyEntity = (PolicyEntity) object; - String groupEntityquery = "from PolicyGroupEntity where policyid = :policyId"; + String groupEntityquery = "from PolicyGroupEntity where policyid ='"+policyEntity.getPolicyId()+"'"; SimpleBindings pgeParams = new SimpleBindings(); - pgeParams.put("policyId", policyEntity.getPolicyId()); + //pgeParams.put("policyIdValue", policyEntity.getPolicyId()); List groupobject = controller.getDataByQuery(groupEntityquery, pgeParams); if(!groupobject.isEmpty()){ pdpCheck = true; @@ -1226,8 +1235,10 @@ public class PolicyManagerServlet extends HttpServlet { //Delete the entity from Policy Entity table controller.deleteData(policyEntity); if(policyNamewithoutExtension.contains("Config_")){ + Files.deleteIfExists(Paths.get(PolicyController.getConfigHome() + File.separator + policyEntity.getConfigurationData().getConfigurationName())); controller.deleteData(policyEntity.getConfigurationData()); }else if(policyNamewithoutExtension.contains("Action_")){ + Files.deleteIfExists(Paths.get(PolicyController.getActionHome() + File.separator + policyEntity.getActionBodyEntity().getActionBodyName())); controller.deleteData(policyEntity.getActionBodyEntity()); } } @@ -1279,8 +1290,10 @@ public class PolicyManagerServlet extends HttpServlet { //Delete the entity from Policy Entity table controller.deleteData(policyEntity); if(policyNamewithoutExtension.contains("Config_")){ + Files.deleteIfExists(Paths.get(PolicyController.getConfigHome() + File.separator + policyEntity.getConfigurationData().getConfigurationName())); controller.deleteData(policyEntity.getConfigurationData()); }else if(policyNamewithoutExtension.contains("Action_")){ + Files.deleteIfExists(Paths.get(PolicyController.getActionHome() + File.separator + policyEntity.getActionBodyEntity().getActionBodyName())); controller.deleteData(policyEntity.getActionBodyEntity()); } @@ -1337,8 +1350,10 @@ public class PolicyManagerServlet extends HttpServlet { controller.deleteData(policyEntity); policyNamewithoutExtension = policyEntity.getPolicyName(); if(policyNamewithoutExtension.contains("Config_")){ + Files.deleteIfExists(Paths.get(PolicyController.getConfigHome() + File.separator + policyEntity.getConfigurationData().getConfigurationName())); controller.deleteData(policyEntity.getConfigurationData()); }else if(policyNamewithoutExtension.contains("Action_")){ + Files.deleteIfExists(Paths.get(PolicyController.getActionHome() + File.separator + policyEntity.getActionBodyEntity().getActionBodyName())); controller.deleteData(policyEntity.getActionBodyEntity()); } } diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyNotificationMail.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyNotificationMail.java index 2326a9fb7..67d9c8813 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyNotificationMail.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyNotificationMail.java @@ -108,6 +108,9 @@ public class PolicyNotificationMail{ } String policyFileName = entityItem.getPolicyName(); String checkPolicyName = policyName; + if(checkPolicyName.endsWith(".xml") || checkPolicyName.contains(".")){ + checkPolicyName = checkPolicyName.substring(0, checkPolicyName.indexOf(".")); + } if(policyFileName.contains("/")){ policyFileName = policyFileName.substring(0, policyFileName.indexOf("/")); policyFileName = policyFileName.replace("/", File.separator); diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java index 08f80304c..f38f3e266 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyRestController.java @@ -52,8 +52,8 @@ import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.PolicyVersion; import org.onap.policy.utils.PolicyUtils; import org.onap.policy.xacml.api.XACMLErrorConstants; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -108,7 +108,11 @@ public class PolicyRestController extends RestrictedBaseController{ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); try{ JsonNode root = mapper.readTree(request.getReader()); - + + policyLogger.info("****************************************Logging UserID while Create/Update Policy**************************************************"); + policyLogger.info("UserId: " + userId + "Policy Data Object: "+ root.get(PolicyController.getPolicydata()).get("policy").toString()); + policyLogger.info("***********************************************************************************************************************************"); + PolicyRestAdapter policyData = mapper.readValue(root.get(PolicyController.getPolicydata()).get("policy").toString(), PolicyRestAdapter.class); if("file".equals(root.get(PolicyController.getPolicydata()).get(modal).get("type").toString().replace("\"", ""))){ @@ -204,9 +208,13 @@ public class PolicyRestController extends RestrictedBaseController{ HttpEntity requestEntity = new HttpEntity<>(body, headers); ResponseEntity result = null; HttpClientErrorException exception = null; - + String uri = requestURI; + if(uri.startsWith("/")){ + uri = uri.substring(uri.indexOf('/')+1); + } + uri = "onap" + uri.substring(uri.indexOf('/')); try{ - result = restTemplate.exchange(papUrl + requestURI, method, requestEntity, String.class); + result = restTemplate.exchange(papUrl + uri, method, requestEntity, String.class); }catch(Exception e){ policyLogger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + "Error while connecting to " + papUrl, e); exception = new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage()); @@ -378,11 +386,21 @@ public class PolicyRestController extends RestrictedBaseController{ @RequestMapping(value={"/saveDictionary/*/*"}, method={RequestMethod.POST}) public ModelAndView saveDictionaryController(HttpServletRequest request, HttpServletResponse response) throws IOException{ + String userId = ""; String uri = request.getRequestURI().replace("/saveDictionary", ""); + if(uri.startsWith("/")){ + uri = uri.substring(uri.indexOf('/')+1); + } + uri = "/onap" + uri.substring(uri.indexOf('/')); if(uri.contains(importDictionary)){ - String userId = UserUtils.getUserSession(request).getOrgUserId(); + userId = UserUtils.getUserSession(request).getOrgUserId(); uri = uri+ "?userId=" +userId; } + + policyLogger.info("****************************************Logging UserID while Saving Dictionary*****************************************************"); + policyLogger.info("UserId: " + userId); + policyLogger.info("***********************************************************************************************************************************"); + String body = callPAP(request, "POST", uri.replaceFirst("/", "").trim()); response.getWriter().write(body); return null; @@ -391,6 +409,16 @@ public class PolicyRestController extends RestrictedBaseController{ @RequestMapping(value={"/deleteDictionary/*/*"}, method={RequestMethod.POST}) public ModelAndView deletetDictionaryController(HttpServletRequest request, HttpServletResponse response) throws IOException { String uri = request.getRequestURI().replace("/deleteDictionary", ""); + if(uri.startsWith("/")){ + uri = uri.substring(uri.indexOf('/')+1); + } + uri = "/onap" + uri.substring(uri.indexOf('/')); + + String userId = UserUtils.getUserSession(request).getOrgUserId(); + policyLogger.info("****************************************Logging UserID while Deleting Dictionary*****************************************************"); + policyLogger.info("UserId: " + userId); + policyLogger.info("*************************************************************************************************************************************"); + String body = callPAP(request, "POST", uri.replaceFirst("/", "").trim()); response.getWriter().write(body); return null; @@ -400,6 +428,10 @@ public class PolicyRestController extends RestrictedBaseController{ public ModelAndView searchDictionaryController(HttpServletRequest request, HttpServletResponse response) throws IOException { Object resultList = null; String uri = request.getRequestURI(); + if(uri.startsWith("/")){ + uri = uri.substring(uri.indexOf('/')+1); + } + uri = "/onap" + uri.substring(uri.indexOf('/')); try{ String body = callPAP(request, "POST", uri.replaceFirst("/", "").trim()); if(body.contains("CouldNotConnectException")){ @@ -429,6 +461,10 @@ public class PolicyRestController extends RestrictedBaseController{ public ModelAndView searchPolicy(HttpServletRequest request, HttpServletResponse response) throws IOException{ Object resultList = null; String uri = request.getRequestURI()+"?action=search"; + if(uri.startsWith("/")){ + uri = uri.substring(uri.indexOf('/')+1); + } + uri = "/onap" + uri.substring(uri.indexOf('/')); String body = callPAP(request, "POST", uri.replaceFirst("/", "").trim()); JSONObject json = new JSONObject(body); diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyUserInfoController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyUserInfoController.java index 5020662c8..96205c5b1 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyUserInfoController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/admin/PolicyUserInfoController.java @@ -28,9 +28,9 @@ import javax.servlet.http.HttpServletResponse; import org.json.JSONObject; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/ActionPolicyController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/ActionPolicyController.java index c8b7a9630..0f66a45e6 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/ActionPolicyController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/ActionPolicyController.java @@ -29,9 +29,11 @@ import java.util.Map; import javax.xml.bind.JAXBElement; +import org.onap.policy.common.logging.flexlogger.FlexLogger; +import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.adapter.PolicyRestAdapter; import org.onap.policy.rest.jpa.PolicyEntity; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.controller.RestrictedBaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -48,8 +50,6 @@ import oasis.names.tc.xacml._3_0.core.schema.wd_17.ObligationExpressionsType; import oasis.names.tc.xacml._3_0.core.schema.wd_17.PolicyType; import oasis.names.tc.xacml._3_0.core.schema.wd_17.RuleType; import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType; -import org.onap.policy.common.logging.flexlogger.FlexLogger; -import org.onap.policy.common.logging.flexlogger.Logger; @Controller @RequestMapping({ "/" }) diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AdminTabController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AdminTabController.java index 3b88f8472..1a43c7646 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AdminTabController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AdminTabController.java @@ -34,8 +34,9 @@ import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.GlobalRoleSettings; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; @@ -91,6 +92,10 @@ public class AdminTabController extends RestrictedBaseController{ try { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + String userId = UserUtils.getUserSession(request).getOrgUserId(); + LOGGER.info("****************************************Logging UserID for Application Lockdown Function*****************************************"); + LOGGER.info("UserId: " + userId); + LOGGER.info("*********************************************************************************************************************************"); JsonNode root = mapper.readTree(request.getReader()); GlobalRoleSettings globalRole = mapper.readValue(root.get("lockdowndata").toString(), GlobalRoleSettings.class); globalRole.setRole("super-admin"); diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java index c1468e365..d308e7eda 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/AutoPushController.java @@ -47,6 +47,7 @@ import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.model.PDPGroupContainer; import org.onap.policy.model.PDPPolicyContainer; +import org.onap.policy.model.Roles; import org.onap.policy.rest.adapter.AutoPushTabAdapter; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.PolicyEntity; @@ -55,10 +56,9 @@ import org.onap.policy.xacml.api.XACMLErrorConstants; import org.onap.policy.xacml.api.pap.OnapPDPGroup; import org.onap.policy.xacml.std.pap.StdPDPGroup; import org.onap.policy.xacml.std.pap.StdPDPPolicy; -import org.openecomp.policy.model.Roles; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; @@ -187,6 +187,12 @@ public class AutoPushController extends RestrictedBaseController{ this.container = new PDPGroupContainer(controller.getPapEngine()); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JsonNode root = mapper.readTree(request.getReader()); + + String userId = UserUtils.getUserSession(request).getOrgUserId(); + logger.info("****************************************Logging UserID while Pushing Policy to PDP Group*****************************************"); + logger.info("UserId: " + userId + "Push Policy Data: "+ root.get("pushTabData").toString()); + logger.info("***********************************************************************************************************************************"); + AutoPushTabAdapter adapter = mapper.readValue(root.get("pushTabData").toString(), AutoPushTabAdapter.class); for (Object pdpGroupId : adapter.getPdpDatas()) { LinkedHashMap selectedPDP = (LinkedHashMap)pdpGroupId; @@ -344,6 +350,12 @@ public class AutoPushController extends RestrictedBaseController{ JsonNode root = mapper.readTree(request.getReader()); StdPDPGroup group = (StdPDPGroup)mapper.readValue(root.get("activePdpGroup").toString(), StdPDPGroup.class); JsonNode removePolicyData = root.get("data"); + + String userId = UserUtils.getUserSession(request).getOrgUserId(); + logger.info("****************************************Logging UserID while Removing Policy from PDP Group*****************************************"); + logger.info("UserId: " + userId + "PDP Group Data: "+ root.get("activePdpGroup").toString() + "Remove Policy Data: "+root.get("data")); + logger.info("***********************************************************************************************************************************"); + policyContainer = new PDPPolicyContainer(group); if(removePolicyData.size() > 0){ for(int i = 0 ; i < removePolicyData.size(); i++){ diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateBRMSParamController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateBRMSParamController.java index 4dc45425a..33c58837e 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateBRMSParamController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateBRMSParamController.java @@ -44,7 +44,7 @@ import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.BRMSParamTemplate; import org.onap.policy.rest.jpa.PolicyEntity; import org.onap.policy.xacml.api.XACMLErrorConstants; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.controller.RestrictedBaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateClosedLoopFaultController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateClosedLoopFaultController.java index 7a8212c7e..839a79f29 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateClosedLoopFaultController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateClosedLoopFaultController.java @@ -39,7 +39,7 @@ import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.OnapName; import org.onap.policy.rest.jpa.PolicyEntity; import org.onap.policy.rest.jpa.VarbindDictionary; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.controller.RestrictedBaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java index 43b62b0c0..7d2fe23c6 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateDcaeMicroServiceController.java @@ -73,7 +73,6 @@ import org.json.JSONArray; import org.json.JSONObject; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; -import org.onap.policy.controller.PolicyController; import org.onap.policy.rest.XACMLRestProperties; import org.onap.policy.rest.adapter.PolicyRestAdapter; import org.onap.policy.rest.dao.CommonClassDao; @@ -83,8 +82,8 @@ import org.onap.policy.rest.jpa.PolicyEntity; import org.onap.policy.rest.util.MSAttributeObject; import org.onap.policy.rest.util.MSModelUtils; import org.onap.policy.rest.util.MSModelUtils.MODEL_TYPE; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; @@ -141,6 +140,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { Set uniqueDataKeys= new HashSet<>(); StringBuilder dataListBuffer=new StringBuilder(); List dataConstraints= new ArrayList <>(); + Set allManyTrueKeys= new HashSet <>(); public static final String DATATYPE = "data_types.policy.data."; public static final String PROPERTIES=".properties."; @@ -991,11 +991,13 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { MicroServiceModels returnModel = getAttributeObject(servicename, version); - //get all keys with "MANY-true" defined in their value from subAttribute + //Get all keys with "MANY-true" defined in their value from subAttribute Set allkeys = null; if(returnModel.getSub_attributes() != null && !returnModel.getSub_attributes().isEmpty()){ - JSONObject json = new JSONObject(returnModel.getSub_attributes()); - allkeys = getAllKeys(json); + JSONObject json = new JSONObject(returnModel.getSub_attributes()); + getAllKeys(json); + allkeys = allManyTrueKeys; + allManyTrueKeys = new HashSet <>(); LOGGER.info("allkeys : " + allkeys); } @@ -1044,7 +1046,12 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { List list = new ArrayList<>(); PrintWriter out = response.getWriter(); String responseString = mapper.writeValueAsString(returnModel); - JSONObject j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: " + allManyTrueKeys+ "}"); + JSONObject j = null; + if("".equals(allManyTrueKeys)){ + j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + "}"); + }else{ + j = new JSONObject("{dcaeModelData: " + responseString + ",jsonValue: " + jsonModel + ",allManyTrueKeys: " + allManyTrueKeys+ "}"); + } list.add(j); out.write(list.toString()); return null; @@ -1153,19 +1160,6 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { return object; } - //call this method to check if the key is in the many-true key set - private boolean isKeyFound(Set allManyTruekeys, String key){ - - if(allManyTruekeys != null && key != null){ - Iterator iter = allManyTruekeys.iterator(); - while(iter.hasNext()){ - if(key.equals(iter.next())){ - return true; - } - } - } - return false; - } public static JSONObject convertToArrayElement(JSONObject json, String keyValue) { return convertToArrayElement(json, new HashSet<>(), keyValue); @@ -1239,7 +1233,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { if(obj instanceof String && ((String) obj).contains("MANY-true")){ LOGGER.info("key : " + key); LOGGER.info("obj : " + obj); - keys.addAll(json.keySet()); + allManyTrueKeys.add(key); } if (obj instanceof JSONObject) keys.addAll(getAllKeys(json.getJSONObject(key))); if (obj instanceof JSONArray) keys.addAll(getAllKeys(json.getJSONArray(key))); @@ -1579,23 +1573,7 @@ public class CreateDcaeMicroServiceController extends RestrictedBaseController { } } - - if(!errorMsg.isEmpty()){ - - PrintWriter out = response.getWriter(); - - response.setCharacterEncoding("UTF-8"); - response.setContentType("application / json"); - request.setCharacterEncoding("UTF-8"); - - ObjectMapper mapper = new ObjectMapper(); - JSONObject j = new JSONObject(); - j.put("errorMsg", errorMsg); - out.write(j.toString()); - return; - } - - List fileList = new ArrayList<>();; + List fileList = new ArrayList<>(); this.directory = "model"; if (zip){ extractFolder(this.newFile); diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateFirewallController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateFirewallController.java index 9832f5803..a4b758924 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateFirewallController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreateFirewallController.java @@ -39,6 +39,7 @@ import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.adapter.AddressGroupJson; import org.onap.policy.rest.adapter.AddressJson; import org.onap.policy.rest.adapter.AddressMembers; +import org.onap.policy.rest.adapter.AddressMembersJson; import org.onap.policy.rest.adapter.DeployNowJson; import org.onap.policy.rest.adapter.IdMap; import org.onap.policy.rest.adapter.PolicyRestAdapter; @@ -62,12 +63,15 @@ import org.onap.policy.rest.jpa.SecurityZone; import org.onap.policy.rest.jpa.ServiceList; import org.onap.policy.rest.jpa.TermList; import org.onap.policy.xacml.api.XACMLErrorConstants; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.controller.RestrictedBaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; +import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; @@ -84,6 +88,8 @@ import oasis.names.tc.xacml._3_0.core.schema.wd_17.TargetType; @RequestMapping("/") public class CreateFirewallController extends RestrictedBaseController { private static Logger policyLogger = FlexLogger.getLogger(CreateFirewallController.class); + private static final String ANY="ANY"; + private static final String GROUP="Group_"; @Autowired SessionFactory sessionFactory; @@ -99,7 +105,7 @@ public class CreateFirewallController extends RestrictedBaseController { } private List tagCollectorList; - private String jsonBody; + List expandablePrefixIPList = new ArrayList<>(); List expandableServicesList= new ArrayList<>(); @Autowired @@ -109,14 +115,14 @@ public class CreateFirewallController extends RestrictedBaseController { public CreateFirewallController(){} private List termCollectorList; - private ArrayList attributeList; + public PolicyRestAdapter setDataToPolicyRestAdapter(PolicyRestAdapter policyData){ - - termCollectorList = new ArrayList<>(); - tagCollectorList = new ArrayList<>(); - if(!policyData.getAttributes().isEmpty()){ + String jsonBody=""; + termCollectorList = new ArrayList <>(); + tagCollectorList = new ArrayList <>(); + if(policyData.getAttributes().size() > 0){ for(Object attribute : policyData.getAttributes()){ if(attribute instanceof LinkedHashMap){ String key = ((LinkedHashMap) attribute).get("key").toString(); @@ -139,14 +145,16 @@ public class CreateFirewallController extends RestrictedBaseController { } private List mapping(String expandableList) { + String value = null; + String desc = null; List valueDesc= new ArrayList<>(); List prefixListData = commonClassDao.getData(PrefixList.class); for (int i = 0; i< prefixListData.size(); i++) { PrefixList prefixList = (PrefixList) prefixListData.get(i); if (prefixList.getPrefixListName().equals(expandableList)) { - String value = prefixList.getPrefixListValue(); + value = prefixList.getPrefixListValue(); valueDesc.add(value); - String desc= prefixList.getDescription(); + desc= prefixList.getDescription(); valueDesc.add(desc); break; } @@ -193,6 +201,7 @@ public class CreateFirewallController extends RestrictedBaseController { } public void prePopulateFWPolicyData(PolicyRestAdapter policyAdapter, PolicyEntity entity) { + ArrayList attributeList; attributeList = new ArrayList<>(); if (policyAdapter.getPolicyData() instanceof PolicyType) { Object policyData = policyAdapter.getPolicyData(); @@ -221,7 +230,7 @@ public class CreateFirewallController extends RestrictedBaseController { String data=null; SecurityZone jpaSecurityZone; data = entity.getConfigurationData().getConfigBody(); - tc1 = (TermCollector)mapper.readValue(data, TermCollector.class); + tc1 = mapper.readValue(data, TermCollector.class); List securityZoneData = commonClassDao.getData(SecurityZone.class); for (int i = 0; i < securityZoneData.size() ; i++) { jpaSecurityZone = (SecurityZone) securityZoneData.get(i); @@ -238,7 +247,7 @@ public class CreateFirewallController extends RestrictedBaseController { Map termTagMap=null; if(tc1 != null){ for(int i=0;i(); + termTagMap = new HashMap <>(); String ruleName= tc1.getFirewallRuleList().get(i).getRuleName(); String tagPickerName=tc1.getRuleToTag().get(i).getTagPickerName(); termTagMap.put("key", ruleName); @@ -277,16 +286,16 @@ public class CreateFirewallController extends RestrictedBaseController { String value = (String) attributeValue.getContent().get(0); AttributeDesignatorType designator = match.getAttributeDesignator(); String attributeId = designator.getAttributeId(); - if (attributeId.equals("ConfigName")) { + if (("ConfigName").equals(attributeId)) { policyAdapter.setConfigName(value); } - if (attributeId.equals("RiskType")){ + if (("RiskType").equals(attributeId)){ policyAdapter.setRiskType(value); } - if (attributeId.equals("RiskLevel")){ + if (("RiskLevel").equals(attributeId)){ policyAdapter.setRiskLevel(value); } - if (attributeId.equals("guard")){ + if (("guard").equals(attributeId)){ policyAdapter.setGuard(value); } if (attributeId.equals("TTLDate") && !value.contains("NA")){ @@ -305,14 +314,14 @@ public class CreateFirewallController extends RestrictedBaseController { } @RequestMapping(value={"/policyController/ViewFWPolicyRule.htm"}, method={org.springframework.web.bind.annotation.RequestMethod.POST}) - public void setFWViewRule(HttpServletRequest request, HttpServletResponse response){ + public ModelAndView setFWViewRule(HttpServletRequest request, HttpServletResponse response){ try { termCollectorList = new ArrayList<>(); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JsonNode root = mapper.readTree(request.getReader()); - PolicyRestAdapter policyData = (PolicyRestAdapter)mapper.readValue(root.get("policyData").toString(), PolicyRestAdapter.class); - if(!policyData.getAttributes().isEmpty()){ + PolicyRestAdapter policyData = mapper.readValue(root.get("policyData").toString(), PolicyRestAdapter.class); + if(policyData.getAttributes().size() > 0){ for(Object attribute : policyData.getAttributes()){ if(attribute instanceof LinkedHashMap){ String key = ((LinkedHashMap) attribute).get("key").toString(); @@ -332,13 +341,13 @@ public class CreateFirewallController extends RestrictedBaseController { List tmList = commonClassDao.getDataById(TermList.class, "termName", id); jpaTermList = (TermList) tmList.get(0); if (jpaTermList != null){ - ruleSrcList= ((TermList) jpaTermList).getSrcIPList(); + ruleSrcList= jpaTermList.getSrcIPList(); if ((ruleSrcList!= null) && (!ruleSrcList.isEmpty()) && !ruleSrcList.equals("null")){ - displayString.append("Source IP List: " + ((TermList) jpaTermList).getSrcIPList()); + displayString.append("Source IP List: " + jpaTermList.getSrcIPList()); displayString.append(" ; \t\n"); for(String srcList:ruleSrcList.split(",")){ - if(srcList.startsWith("Group_")){ - AddressGroup ag= new AddressGroup(); + if(srcList.startsWith(GROUP)){ + AddressGroup ag; ag= mappingAddressGroup(srcList); displayString.append("\n\t"+"Group has :"+ag.getPrefixList()+"\n"); for(String groupItems:ag.getPrefixList().split(",")){ @@ -351,7 +360,7 @@ public class CreateFirewallController extends RestrictedBaseController { displayString.append("\n"); } }else{ - if(!srcList.equals("ANY")){ + if(!srcList.equals(ANY)){ valueDesc=mapping(srcList); displayString.append("\n\t"+"Name: "+srcList); displayString.append("\n\t"+"Description: "+valueDesc.get(1)); @@ -362,13 +371,13 @@ public class CreateFirewallController extends RestrictedBaseController { } displayString.append("\n"); } - ruleDestList= ((TermList) jpaTermList).getDestIPList(); + ruleDestList= jpaTermList.getDestIPList(); if ( ruleDestList!= null && (!ruleDestList.isEmpty())&& !ruleDestList.equals("null")){ - displayString.append("Destination IP List: " + ((TermList) jpaTermList).getDestIPList()); + displayString.append("Destination IP List: " + jpaTermList.getDestIPList()); displayString.append(" ; \t\n"); for(String destList:ruleDestList.split(",")){ - if(destList.startsWith("Group_")){ - AddressGroup ag= new AddressGroup(); + if(destList.startsWith(GROUP)){ + AddressGroup ag; ag= mappingAddressGroup(destList); displayString.append("\n\t"+"Group has :"+ag.getPrefixList()+"\n"); for(String groupItems:ag.getPrefixList().split(",")){ @@ -379,7 +388,7 @@ public class CreateFirewallController extends RestrictedBaseController { displayString.append("\n\t"); } }else{ - if(!destList.equals("ANY")){ + if(!destList.equals(ANY)){ valueDesc=mapping(destList); displayString.append("\n\t"+"Name: "+destList); displayString.append("\n\t"+"Description: "+valueDesc.get(1)); @@ -391,25 +400,25 @@ public class CreateFirewallController extends RestrictedBaseController { displayString.append("\n"); } - ruleSrcPort=((TermList) jpaTermList).getSrcPortList(); + ruleSrcPort=jpaTermList.getSrcPortList(); if ( ruleSrcPort!= null && (!ruleSrcPort.isEmpty())&& !ruleSrcPort.equals("null")) { displayString.append("\n"+"Source Port List:" + ruleSrcPort); displayString.append(" ; \t\n"); } - ruleDestPort= ((TermList) jpaTermList).getDestPortList(); + ruleDestPort= jpaTermList.getDestPortList(); if (ruleDestPort != null && (!ruleDestPort.isEmpty())&& !ruleDestPort.equals("null")) { displayString.append("\n"+"Destination Port List:" + ruleDestPort); displayString.append(" ; \t\n"); for(String destServices:ruleDestPort.split(",")){ - if(destServices.startsWith("Group_")){ - GroupServiceList sg= new GroupServiceList(); + if(destServices.startsWith(GROUP)){ + GroupServiceList sg; sg= mappingServiceGroup(destServices); displayString.append("\n\t"+"Service Group has :"+sg.getServiceList()+"\n"); for(String groupItems:sg.getServiceList().split(",")){ - ServiceList sl= new ServiceList(); + ServiceList sl; sl= mappingServiceList(groupItems); displayString.append("\n\t"+"Name: "+ sl.getServiceName()); @@ -423,8 +432,8 @@ public class CreateFirewallController extends RestrictedBaseController { } } else{ - if(!destServices.equals("ANY")){ - ServiceList sl= new ServiceList(); + if(!destServices.equals(ANY)){ + ServiceList sl; sl= mappingServiceList(destServices); displayString.append("\n\t"+"Name: "+ sl.getServiceName()); @@ -438,7 +447,7 @@ public class CreateFirewallController extends RestrictedBaseController { } } } - displayString.append("\n"); + displayString.append("\n"); } ruleAction=(jpaTermList).getAction(); @@ -457,9 +466,11 @@ public class CreateFirewallController extends RestrictedBaseController { String responseString = mapper.writeValueAsString(displayString); JSONObject j = new JSONObject("{policyData: " + responseString + "}"); out.write(j.toString()); + return null; } catch (Exception e) { policyLogger.error(XACMLErrorConstants.ERROR_PROCESS_FLOW + e); } + return null; } private String constructJson(PolicyRestAdapter policyData) { @@ -497,6 +508,7 @@ public class CreateFirewallController extends RestrictedBaseController { TagDefines tagDefine= new TagDefines(); List tagList=null; ServiceListJson targetSl=null; + AddressMembers addressMembersJson=null; int i=0; try{ String networkRole=""; @@ -509,7 +521,7 @@ public class CreateFirewallController extends RestrictedBaseController { String tagValues=jpaTagPickerList.getTagValues(); tagList= new ArrayList<>(); for(String val:tagValues.split("#")) { - int index=val.indexOf(":"); + int index=val.indexOf(':'); String keyToStore=val.substring(0,index); String valueToStore=val.substring(index+1,val.length()); @@ -626,12 +638,12 @@ public class CreateFirewallController extends RestrictedBaseController { for(String destServices:destPort_map.get(tl).split(",") ){ ServicesJson destServicesJson= new ServicesJson(); destServicesJson.setType("REFERENCE"); - if(destServices.equals("ANY")){ + if(destServices.equals(ANY)){ destServicesJson.setName("any"); destServicesJsonList.add(destServicesJson); break; }else{ - if(destServices.startsWith("Group_")){ + if(destServices.startsWith(GROUP)){ destServicesJson.setName(destServices.substring(6,destServices.length())); } else{ destServicesJson.setName(destServices); @@ -656,13 +668,13 @@ public class CreateFirewallController extends RestrictedBaseController { List sourceListArrayJson= new ArrayList<>(); for(String srcList:srcIP_map.get(tl).split(",") ){ AddressJson srcListJson= new AddressJson(); - if(srcList.equals("ANY")){ + if(srcList.equals(ANY)){ srcListJson.setType("any"); sourceListArrayJson.add(srcListJson); break; }else{ srcListJson.setType("REFERENCE"); - if(srcList.startsWith("Group_")){ + if(srcList.startsWith(GROUP)){ srcListJson.setName(srcList.substring(6,srcList.length())); }else{ srcListJson.setName(srcList); @@ -677,13 +689,13 @@ public class CreateFirewallController extends RestrictedBaseController { List destListArrayJson= new ArrayList<>(); for(String destList:destIP_map.get(tl).split(",")){ AddressJson destListJson= new AddressJson(); - if(destList.equals("ANY")){ + if(destList.equals(ANY)){ destListJson.setType("any"); destListArrayJson.add(destListJson); break; }else{ destListJson.setType("REFERENCE"); - if(destList.startsWith("Group_")){ + if(destList.startsWith(GROUP)){ destListJson.setName(destList.substring(6,destList.length())); }else{ destListJson.setName(destList); @@ -707,7 +719,7 @@ public class CreateFirewallController extends RestrictedBaseController { expandablePrefixIPList.add(destIP_map.get(tl)); } termList.add(targetTerm); - targetTerm.setPosition("" + (ruleCount++)); + targetTerm.setPosition(Integer.toString (ruleCount++)); } List securityZoneData = commonClassDao.getData(SecurityZone.class); @@ -719,7 +731,7 @@ public class CreateFirewallController extends RestrictedBaseController { idMapInstance.setAstraId(jpaSecurityZone.getZoneValue()); idMapInstance.setVendorId("deviceGroup:dev"); - List idMap = new ArrayList(); + List idMap = new ArrayList <>(); idMap.add(idMapInstance); VendorSpecificData vendorStructure= new VendorSpecificData(); @@ -741,6 +753,7 @@ public class CreateFirewallController extends RestrictedBaseController { Set servListArray = new HashSet<>(); Set servGroupArray= new HashSet<>(); Set addrGroupArray= new HashSet<>(); + Set addrArray= new HashSet<> (); ServiceGroupJson targetSg= null; AddressGroupJson addressSg=null; @@ -750,9 +763,9 @@ public class CreateFirewallController extends RestrictedBaseController { for(String serviceList:expandableServicesList){ for(String t: serviceList.split(",")){ - if((!t.startsWith("Group_"))){ - if(!t.equals("ANY")){ - ServiceList sl = new ServiceList(); + if((!t.startsWith(GROUP))){ + if(!t.equals(ANY)){ + ServiceList sl; targetSl= new ServiceListJson(); sl= mappingServiceList(t); targetSl.setName(sl.getServiceName()); @@ -789,7 +802,7 @@ public class CreateFirewallController extends RestrictedBaseController { servListArray.add(targetAnyUdp); } }else{//This is a group - GroupServiceList sg= new GroupServiceList(); + GroupServiceList sg; targetSg= new ServiceGroupJson(); sg= mappingServiceGroup(t); @@ -804,7 +817,7 @@ public class CreateFirewallController extends RestrictedBaseController { serviceMembers.setName(groupString); servMembersList.add(serviceMembers); //Expand the group Name - ServiceList expandGroupSl = new ServiceList(); + ServiceList expandGroupSl ; targetSl= new ServiceListJson(); expandGroupSl= mappingServiceList(groupString); @@ -826,10 +839,10 @@ public class CreateFirewallController extends RestrictedBaseController { Set prefixIPList = new HashSet<>(); for(String prefixList:expandablePrefixIPList){ for(String prefixIP: prefixList.split(",")){ - if((!prefixIP.startsWith("Group_"))){ - if(!prefixIP.equals("ANY")){ + if((!prefixIP.startsWith(GROUP))){ + if(!prefixIP.equals(ANY)){ List addMembersList= new ArrayList<>(); - List valueDesc= new ArrayList<>(); + List valueDesc; PrefixIPList targetAddressList = new PrefixIPList(); AddressMembers addressMembers= new AddressMembers(); targetAddressList.setName(prefixIP); @@ -853,31 +866,37 @@ public class CreateFirewallController extends RestrictedBaseController { } } else{//This is a group - AddressGroup ag= new AddressGroup(); + AddressGroup ag; addressSg= new AddressGroupJson(); ag= mappingAddressGroup(prefixIP); String name=ag.getGroupName(); //Removing the "Group_" prepending string before packing the JSON addressSg.setName(name.substring(6,name.length())); - - List addrMembersList= new ArrayList<>(); + + List addrMembersList= new ArrayList<>(); for(String groupString: ag.getPrefixList().split(",")){ - List valueDesc= new ArrayList<>(); - AddressMembers addressMembers= new AddressMembers(); - valueDesc= mapping (groupString); - if(valueDesc.size() > 0){ - addressMembers.setValue(valueDesc.get(0)); - } - addressMembers.setType("SUBNET"); + List valueDesc; + AddressMembersJson addressMembers= new AddressMembersJson(); + addressMembers.setType("REFERENCES"); + addressMembers.setName(groupString); addrMembersList.add(addressMembers); //Expand the group Name + PrefixIPList expandGroupPrefix; + addressMembersJson= new AddressMembers(); + valueDesc= mapping (groupString); + + addressMembersJson.setName(groupString); + addressMembersJson.setType("SUBNET"); + addressMembersJson.setValue(valueDesc.get(0)); + + addrArray.add(addressMembersJson); + } addressSg.setMembers(addrMembersList); addrGroupArray.add(addressSg); } - } } @@ -900,6 +919,11 @@ public class CreateFirewallController extends RestrictedBaseController { for(Object addObj1:addrGroupArray){ addressGroup.add(addObj1); } + + for(Object addObj2:addrArray){ + addressGroup.add(addObj2); + } + tc.setServiceGroups(serviceGroup); tc.setAddressGroups(addressGroup); @@ -908,8 +932,10 @@ public class CreateFirewallController extends RestrictedBaseController { ObjectWriter om = new ObjectMapper().writer(); try { json = om.writeValueAsString(tc); - } catch (Exception e) { - policyLogger.error("Exception Occured"+e); + } catch (JsonGenerationException e) { + policyLogger.error("JsonGenerationException Ocured",e); + } catch (JsonMappingException e) { + policyLogger.error("IOException Occured",e); } }catch (Exception e) { diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreatePolicyController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreatePolicyController.java index 71d0b3d03..af4f9ffaf 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreatePolicyController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/CreatePolicyController.java @@ -31,7 +31,7 @@ import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.adapter.PolicyRestAdapter; import org.onap.policy.rest.jpa.PolicyEntity; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.controller.RestrictedBaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java index aedb94301..dba79e1bb 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DashboardController.java @@ -45,29 +45,28 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.json.JSONObject; +import org.onap.policy.common.logging.flexlogger.FlexLogger; +import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.dao.SystemLogDbDao; import org.onap.policy.model.PDPGroupContainer; import org.onap.policy.rest.XACMLRestProperties; import org.onap.policy.rest.dao.CommonClassDao; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; +import org.onap.policy.xacml.api.XACMLErrorConstants; +import org.onap.policy.xacml.api.pap.OnapPDP; +import org.onap.policy.xacml.api.pap.OnapPDPGroup; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -import org.onap.policy.common.logging.flexlogger.FlexLogger; -import org.onap.policy.common.logging.flexlogger.Logger; -import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; -import org.onap.policy.xacml.api.XACMLErrorConstants; -import org.onap.policy.xacml.api.pap.OnapPDP; -import org.onap.policy.xacml.api.pap.OnapPDPGroup; - import com.att.research.xacml.api.pap.PAPException; import com.att.research.xacml.api.pap.PDP; import com.att.research.xacml.api.pap.PDPGroup; import com.att.research.xacml.api.pap.PDPPolicy; import com.att.research.xacml.util.XACMLProperties; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DecisionPolicyController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DecisionPolicyController.java index fc77c9316..8427797e8 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DecisionPolicyController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/DecisionPolicyController.java @@ -36,7 +36,7 @@ import org.onap.policy.rest.adapter.PolicyRestAdapter; import org.onap.policy.rest.adapter.RainyDayParams; import org.onap.policy.rest.adapter.YAMLParams; import org.onap.policy.rest.jpa.PolicyEntity; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.controller.RestrictedBaseController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -82,7 +82,7 @@ public class DecisionPolicyController extends RestrictedBaseController { Object policyData = policyAdapter.getPolicyData(); PolicyType policy = (PolicyType) policyData; policyAdapter.setOldPolicyFileName(policyAdapter.getPolicyName()); - String policyNameValue = policyAdapter.getPolicyName().substring(policyAdapter.getPolicyName().indexOf("_") + 1); + String policyNameValue = policyAdapter.getPolicyName().substring(policyAdapter.getPolicyName().indexOf('_') + 1); policyAdapter.setPolicyName(policyNameValue); String description = ""; try{ diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PDPController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PDPController.java index bb06cb3fe..c0344d337 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PDPController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PDPController.java @@ -38,15 +38,15 @@ import org.onap.policy.admin.RESTfulPAPEngine; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.model.PDPGroupContainer; +import org.onap.policy.model.Roles; import org.onap.policy.xacml.api.XACMLErrorConstants; import org.onap.policy.xacml.api.pap.OnapPDPGroup; import org.onap.policy.xacml.api.pap.PAPPolicyEngine; import org.onap.policy.xacml.std.pap.StdPDP; import org.onap.policy.xacml.std.pap.StdPDPGroup; -import org.openecomp.policy.model.Roles; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -195,6 +195,12 @@ public class PDPController extends RestrictedBaseController { mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); JsonNode root = mapper.readTree(request.getReader()); this.container = new PDPGroupContainer(controller.getPapEngine()); + + String userId = UserUtils.getUserSession(request).getOrgUserId(); + policyLogger.info("****************************************Logging UserID for Save PDP Group Function*****************************************"); + policyLogger.info("UserId: " + userId + "PDP Group Data: "+ root.get("pdpGroupData").toString()); + policyLogger.info("***************************************************************************************************************************"); + StdPDPGroup pdpGroupData = mapper.readValue(root.get("pdpGroupData").toString().replace("groupName", "name"), StdPDPGroup.class); try { if(pdpGroupData.getId() == null){ @@ -241,6 +247,12 @@ public class PDPController extends RestrictedBaseController { JsonNode root = mapper.readTree(request.getReader()); PolicyController controller = getPolicyControllerInstance(); this.container = new PDPGroupContainer(controller.getPapEngine()); + + String userId = UserUtils.getUserSession(request).getOrgUserId(); + policyLogger.info("****************************************Logging UserID for Remove PDP Group Function*****************************************"); + policyLogger.info("UserId: " + userId + "PDP Group Data: "+ root.get("pdpGroupData").toString()); + policyLogger.info("*****************************************************************************************************************************"); + StdPDPGroup pdpGroupData = mapper.readValue(root.get("pdpGroupData").toString(), StdPDPGroup.class); if(pdpGroupData.getName().equals("Default")) { throw new UnsupportedOperationException("You can't remove the Default Group."); @@ -284,6 +296,12 @@ public class PDPController extends RestrictedBaseController { String update = root.get("update").toString(); PdpData pdpGroupData = (PdpData)mapper.readValue(root.get("pdpInGroup").toString(), PdpData.class); StdPDPGroup activeGroupData = mapper.readValue(root.get("activePDP").toString(), StdPDPGroup.class); + + String userId = UserUtils.getUserSession(request).getOrgUserId(); + policyLogger.info("****************************************Logging UserID while Saving pdp in PDP Group*****************************************"); + policyLogger.info("UserId: " + userId + "PDP Group Data: "+ root.get("pdpInGroup").toString() + "Active Group Data: "+ root.get("activePDP").toString()); + policyLogger.info("*******************************************************************************************************************************"); + try { if(update.contains("false")){ @@ -332,6 +350,11 @@ public class PDPController extends RestrictedBaseController { StdPDP deletePdp = mapper.readValue(root.get("data").toString(), StdPDP.class); StdPDPGroup activeGroupData = mapper.readValue(root.get("activePDP").toString(), StdPDPGroup.class); + String userId = UserUtils.getUserSession(request).getOrgUserId(); + policyLogger.info("****************************************Logging UserID while Removing pdp from PDP Group*****************************************"); + policyLogger.info("UserId: " + userId + "Delete PDP Group Data: "+ root.get("data").toString() + "Active Group Data: "+ root.get("activePDP").toString()); + policyLogger.info("***********************************************************************************************************************************"); + this.container.removePDP(deletePdp, activeGroupData); response.setCharacterEncoding("UTF-8"); response.setContentType("application / json"); diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyController.java index 321dc72d2..d244cf528 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyController.java @@ -43,6 +43,7 @@ import org.onap.policy.admin.RESTfulPAPEngine; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.model.PDPGroupContainer; +import org.onap.policy.model.Roles; import org.onap.policy.rest.XACMLRestProperties; import org.onap.policy.rest.XacmlAdminAuthorization; import org.onap.policy.rest.dao.CommonClassDao; @@ -53,10 +54,9 @@ import org.onap.policy.rest.jpa.PolicyVersion; import org.onap.policy.rest.jpa.UserInfo; import org.onap.policy.xacml.api.XACMLErrorConstants; import org.onap.policy.xacml.api.pap.PAPPolicyEngine; -import org.openecomp.policy.model.Roles; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; @@ -203,7 +203,12 @@ public class PolicyController extends RestrictedBaseController { setAutoPushPDPGroup(prop.getProperty("xacml.autopush.pdpGroup")); //Micro Service Properties setMsOnapName(prop.getProperty("xacml.policy.msOnapName")); + if(getMsOnapName() == null){ + setMsOnapName(prop.getProperty("xacml.policy.msEcompName")); + } + policyLogger.info("getMsOnapName => " + getMsOnapName()); setMsPolicyName(prop.getProperty("xacml.policy.msPolicyName")); + policyLogger.info("setMsPolicyName => " + getMsPolicyName()); //WebApp directories setConfigHome(prop.getProperty("xacml.rest.config.webapps") + "Config"); setActionHome(prop.getProperty("xacml.rest.config.webapps") + "Action"); diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyExportAndImportController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyExportAndImportController.java index 856d825bd..78a8c5ad1 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyExportAndImportController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyExportAndImportController.java @@ -49,6 +49,7 @@ import org.apache.poi.ss.usermodel.Workbook; import org.json.JSONObject; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; +import org.onap.policy.model.Roles; import org.onap.policy.rest.adapter.PolicyExportAdapter; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.ActionBodyEntity; @@ -58,9 +59,8 @@ import org.onap.policy.rest.jpa.PolicyEntity; import org.onap.policy.rest.jpa.PolicyVersion; import org.onap.policy.rest.jpa.UserInfo; import org.onap.policy.xacml.api.XACMLErrorConstants; -import org.openecomp.policy.model.Roles; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyNotificationController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyNotificationController.java index f987f906d..845b5f5a7 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyNotificationController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyNotificationController.java @@ -38,8 +38,8 @@ import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.WatchPolicyNotificationTable; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.UserUtils; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java index 6f8b3de8e..798a39d4d 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyRolesController.java @@ -37,8 +37,9 @@ import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.PolicyEditorScopes; import org.onap.policy.rest.jpa.PolicyRoles; import org.onap.policy.rest.jpa.UserInfo; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.web.support.UserUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; @@ -83,6 +84,7 @@ public class PolicyRolesController extends RestrictedBaseController{ String scopeName = null; ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + String userId = UserUtils.getUserSession(request).getOrgUserId(); JsonNode root = mapper.readTree(request.getReader()); ReadScopes adapter = mapper.readValue(root.get("editRoleData").toString(), ReadScopes.class); for(int i = 0; i < adapter.getScope().size(); i++){ @@ -92,6 +94,9 @@ public class PolicyRolesController extends RestrictedBaseController{ scopeName = scopeName + "," + adapter.getScope().get(i); } } + LOGGER.info("****************************************Logging UserID for Roles Function********************************************************"); + LOGGER.info("UserId: " + userId + "Updating the Scope for following user" + adapter.getLoginId() + "ScopeNames" + adapter.getScope()); + LOGGER.info("*********************************************************************************************************************************"); PolicyRoles roles = new PolicyRoles(); roles.setId(adapter.getId()); roles.setLoginId(adapter.getLoginId()); diff --git a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyValidationController.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyValidationController.java index a82fac27a..9a1aac1b5 100644 --- a/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyValidationController.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/controller/PolicyValidationController.java @@ -33,8 +33,8 @@ import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.adapter.PolicyRestAdapter; import org.onap.policy.rest.util.PolicyValidation; import org.onap.policy.rest.util.PolicyValidationRequestWrapper; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.web.support.JsonMessage; +import org.onap.portalsdk.core.controller.RestrictedBaseController; +import org.onap.portalsdk.core.web.support.JsonMessage; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @@ -63,7 +63,7 @@ public class PolicyValidationController extends RestrictedBaseController { PolicyValidationRequestWrapper wrapper = new PolicyValidationRequestWrapper(); StringBuilder responseString; ObjectMapper mapper = new ObjectMapper(); - + PolicyRestAdapter policyData = wrapper.populateRequestParameters(request); responseString = validation.validatePolicy(policyData); diff --git a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/model/Roles.java b/POLICY-SDK-APP/src/main/java/org/onap/policy/model/Roles.java similarity index 98% rename from POLICY-SDK-APP/src/main/java/org/openecomp/policy/model/Roles.java rename to POLICY-SDK-APP/src/main/java/org/onap/policy/model/Roles.java index 31a41ca7b..51e78d0e5 100644 --- a/POLICY-SDK-APP/src/main/java/org/openecomp/policy/model/Roles.java +++ b/POLICY-SDK-APP/src/main/java/org/onap/policy/model/Roles.java @@ -18,7 +18,7 @@ * ============LICENSE_END========================================================= */ -package org.openecomp.policy.model; +package org.onap.policy.model; import java.io.Serializable; diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyManagerServletTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyManagerServletTest.java index 22cc82a23..dc2159bc1 100644 --- a/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyManagerServletTest.java +++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyManagerServletTest.java @@ -40,6 +40,7 @@ import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.controller.CreateDcaeMicroServiceController; import org.onap.policy.controller.PolicyController; +import org.onap.policy.model.Roles; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.ActionBodyEntity; import org.onap.policy.rest.jpa.ConfigurationDataEntity; @@ -48,7 +49,6 @@ import org.onap.policy.rest.jpa.PolicyEditorScopes; import org.onap.policy.rest.jpa.PolicyEntity; import org.onap.policy.rest.jpa.PolicyVersion; import org.onap.policy.rest.jpa.UserInfo; -import org.openecomp.policy.model.Roles; public class PolicyManagerServletTest extends Mockito{ diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyRestControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyRestControllerTest.java index 1bda7cd41..16cefd854 100644 --- a/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyRestControllerTest.java +++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyRestControllerTest.java @@ -45,8 +45,8 @@ import org.onap.policy.rest.jpa.PrefixList; import org.onap.policy.rest.jpa.SecurityZone; import org.onap.policy.rest.jpa.ServiceList; import org.onap.policy.rest.jpa.TermList; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.util.SystemProperties; +import org.onap.portalsdk.core.domain.User; +import org.onap.portalsdk.core.util.SystemProperties; import org.springframework.mock.web.MockHttpServletResponse; public class PolicyRestControllerTest { diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyUserInfoControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyUserInfoControllerTest.java index f4acaeb9a..7a3401568 100644 --- a/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyUserInfoControllerTest.java +++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/admin/PolicyUserInfoControllerTest.java @@ -29,8 +29,8 @@ import javax.servlet.http.HttpSession; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.util.SystemProperties; +import org.onap.portalsdk.core.domain.User; +import org.onap.portalsdk.core.util.SystemProperties; import org.springframework.mock.web.MockHttpServletResponse; public class PolicyUserInfoControllerTest { diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/AdminTabControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/AdminTabControllerTest.java index 0109cb503..17ad56457 100644 --- a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/AdminTabControllerTest.java +++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/AdminTabControllerTest.java @@ -19,7 +19,8 @@ */ package org.onap.policy.controller; -import static org.junit.Assert.*; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -30,13 +31,17 @@ import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; import org.onap.policy.rest.dao.CommonClassDao; import org.onap.policy.rest.jpa.GlobalRoleSettings; +import org.onap.portalsdk.core.domain.User; +import org.onap.portalsdk.core.util.SystemProperties; import org.springframework.mock.web.MockHttpServletResponse; public class AdminTabControllerTest { @@ -55,6 +60,12 @@ public class AdminTabControllerTest { request = mock(HttpServletRequest.class); response = new MockHttpServletResponse(); + HttpSession mockSession = mock(HttpSession.class); + User user = new User(); + user.setOrgUserId("Test"); + Mockito.when(mockSession.getAttribute(SystemProperties.getProperty("user_attribute_name"))).thenReturn(user); + Mockito.when(request.getSession(false)).thenReturn(mockSession); + AdminTabController.setCommonClassDao(commonClassDao); GlobalRoleSettings globalRole = new GlobalRoleSettings(); diff --git a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/PDPControllerTest.java b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/PDPControllerTest.java index 8433c4740..55a2288c7 100644 --- a/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/PDPControllerTest.java +++ b/POLICY-SDK-APP/src/test/java/org/onap/policy/controller/PDPControllerTest.java @@ -34,10 +34,10 @@ import org.junit.Test; import org.mockito.Mockito; import org.onap.policy.common.logging.flexlogger.FlexLogger; import org.onap.policy.common.logging.flexlogger.Logger; +import org.onap.policy.model.Roles; import org.onap.policy.xacml.api.pap.OnapPDPGroup; import org.onap.policy.xacml.std.pap.StdPDPGroup; import org.onap.policy.xacml.std.pap.StdPDPGroupStatus; -import org.openecomp.policy.model.Roles; import org.springframework.mock.web.MockHttpServletResponse; -- 2.16.6