Initial ONAP Synapse commit 81/4181/1
authorabatos <adrian.batos-parac@amdocs.com>
Fri, 12 May 2017 18:11:30 +0000 (14:11 -0400)
committerabatos <adrian.batos-parac@amdocs.com>
Fri, 12 May 2017 18:20:46 +0000 (14:20 -0400)
Change-Id: I3a0ed659dbb8f8faeeb54093b5d6f10414cd886e
Signed-off-by: abatos <adrian.batos-parac@amdocs.com>
77 files changed:
.gitignore [new file with mode: 0644]
.gitreview [new file with mode: 0644]
License.txt [new file with mode: 0644]
ajsc-shared-config/README.txt [new file with mode: 0644]
ajsc-shared-config/etc/PartnerProfile.xml [new file with mode: 0644]
ajsc-shared-config/etc/basic-logback_root_logger_level_off.xml [new file with mode: 0644]
ajsc-shared-config/etc/csm-config-app.properties [new file with mode: 0644]
ajsc-shared-config/etc/csm-framework-app.properties [new file with mode: 0644]
ajsc-shared-config/etc/logback.xml [new file with mode: 0644]
ajsc-shared-config/etc/spm2.jks [new file with mode: 0644]
antBuild/build.xml [new file with mode: 0644]
bundleconfig-local/etc/appprops/AAFUserRoles.properties [new file with mode: 0644]
bundleconfig-local/etc/appprops/PostProcessorInterceptors.properties [new file with mode: 0644]
bundleconfig-local/etc/appprops/PreProcessorInterceptors.properties [new file with mode: 0644]
bundleconfig-local/etc/appprops/app-intercepts.properties [new file with mode: 0644]
bundleconfig-local/etc/appprops/methodMapper.properties [new file with mode: 0644]
bundleconfig-local/etc/logback.xml [new file with mode: 0644]
bundleconfig-local/etc/sysprops/sys-props.properties [new file with mode: 0644]
pom.xml [new file with mode: 0644]
src/main/ajsc/data-router_v1/data-router/v1/conf/echoService.groovy [new file with mode: 0644]
src/main/ajsc/data-router_v1/data-router/v1/docs/README.txt [new file with mode: 0644]
src/main/ajsc/data-router_v1/data-router/v1/lib/README.txt [new file with mode: 0644]
src/main/ajsc/data-router_v1/data-router/v1/props/module.props [new file with mode: 0644]
src/main/ajsc/data-router_v1/data-router/v1/routes/echoService.route [new file with mode: 0644]
src/main/assemble/ajsc_module_assembly.xml [new file with mode: 0644]
src/main/assemble/ajsc_props_assembly.xml [new file with mode: 0644]
src/main/assemble/ajsc_runtime_assembly.xml [new file with mode: 0644]
src/main/config/ajsc-chef.jks [new file with mode: 0644]
src/main/config/ajsc-jetty.xml [new file with mode: 0644]
src/main/config/ajsc-override-web.xml [new file with mode: 0644]
src/main/config/ajscJetty.jks [new file with mode: 0644]
src/main/config/cadi.properties [new file with mode: 0644]
src/main/config/jul-redirect.properties [new file with mode: 0644]
src/main/config/keyfile [new file with mode: 0644]
src/main/config/runner-web.xml [new file with mode: 0644]
src/main/docker/Dockerfile [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/AaiEventEntity.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/AggregationEntity.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/DocumentStoreDataEntity.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/OxmEntityDescriptor.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/PolicyResponse.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/SuggestionSearchEntity.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/TopographicalEntity.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/entity/UebEventHeader.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/exception/BaseDataRouterException.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/exception/DataRouterError.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/logging/DataRouterMsgs.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/logging/EntityEventPolicyMsgs.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/policy/EntityEventPolicy.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/policy/EntityEventPolicyConfig.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/service/EchoService.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/CrossEntityReference.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/DataRouterConstants.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/DataRouterProperties.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/EntityOxmReferenceHelper.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/ExternalOxmModelProcessor.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/FileWatcher.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/NodeUtils.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/OxmModelLoader.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/RouterServiceUtil.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/SearchSuggestionPermutation.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/Version.java [new file with mode: 0644]
src/main/java/org/openecomp/datarouter/util/VersionedOxmEntities.java [new file with mode: 0644]
src/main/resources/entitysearch_schema.json [new file with mode: 0644]
src/main/resources/logging/DataRouterMsgs.properties [new file with mode: 0644]
src/main/resources/logging/EntityEventPolicyMsgs.properties [new file with mode: 0644]
src/main/resources/topographysearch_schema.json [new file with mode: 0644]
src/main/runtime/context/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.context [new file with mode: 0644]
src/main/runtime/context/default#0.context [new file with mode: 0644]
src/main/runtime/deploymentPackage/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.json [new file with mode: 0644]
src/main/runtime/shiroRole/ajscadmin.json [new file with mode: 0644]
src/main/runtime/shiroRole/contextadmin#__module.ajsc.namespace.name__.json [new file with mode: 0644]
src/main/runtime/shiroRole/contextadmin#default.json [new file with mode: 0644]
src/main/runtime/shiroUser/ajsc.json [new file with mode: 0644]
src/main/runtime/shiroUserRole/ajsc#ajscadmin.json [new file with mode: 0644]
src/main/runtime/shiroUserRole/ajsc#contextadmin#__module.ajsc.namespace.name__.json [new file with mode: 0644]
src/main/runtime/shiroUserRole/ajsc#contextadmin#default.json [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..8487231
--- /dev/null
@@ -0,0 +1,7 @@
+.classpath
+.project
+.settings/
+target/
+logs/
+debug-logs/
+bin/
diff --git a/.gitreview b/.gitreview
new file mode 100644 (file)
index 0000000..4a042d3
--- /dev/null
@@ -0,0 +1,4 @@
+[gerrit]
+host=gerrit.onap.org
+port=29418
+project=aai/data-router
diff --git a/License.txt b/License.txt
new file mode 100644 (file)
index 0000000..2557972
--- /dev/null
@@ -0,0 +1,24 @@
+============LICENSE_START=======================================================
+DataRouter
+================================================================================
+Copyright © 2017 AT&T Intellectual Property.
+Copyright © 2017 Amdocs
+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=========================================================
+
+ECOMP and OpenECOMP are trademarks
+and service marks of AT&T Intellectual Property.
+
+
diff --git a/ajsc-shared-config/README.txt b/ajsc-shared-config/README.txt
new file mode 100644 (file)
index 0000000..a82eb64
--- /dev/null
@@ -0,0 +1,6 @@
+The ajsc-shared-config folder is included in the service project to provide the functionality of the AJSC_SHARED_CONFIG 
+location that will exist in CSI envs. This includes the logback.xml for logging configurations, and some csm related 
+artifacts necessary for proper functionality of the csm framework within the CSI env. Within the 2 profiles that can 
+be utilized to run the AJSC locally, "runLocal" and "runAjsc", the system propery, "AJSC_SHARED_CONFIG", has been set
+to point to this directory. The files in this folder will NOT be copied/moved anywhere within the AJSC SWM package. These 
+files will already be in existence within the CSI env.
\ No newline at end of file
diff --git a/ajsc-shared-config/etc/PartnerProfile.xml b/ajsc-shared-config/etc/PartnerProfile.xml
new file mode 100644 (file)
index 0000000..de9ca07
--- /dev/null
@@ -0,0 +1,2408 @@
+<!-- edited with XMLSpy v2008 (http://www.altova.com) by AT&T (AT&T) -->
+<!-- Edited with XMLSpy v2008 (http://www.altova.com) by Binh Quach (CINGULAR WIRELESS) -->
+<!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Durshetti (AT&T Wireless Services) -->
+<!--Sample XML file generated by XMLSPY v2004 rel. 3 U (http://www.xmlspy.com)-->
+<PartnerProfile xmlns="http://csi.cingular.com/CSI/Namespaces/Configuration/PartnerProfile.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://csi.cingular.com/CSI/Namespaces/Configuration/PartnerProfile.xsd C:\csi_projects\CommonServices\Schemas\v36\CSI\Partner\PartnerProfile.xsd">
+       <!--
+       Each partner will be listed in a unique block below along with a description of the
+       authorized interfaces, and any parameters describing or required by the interface.
+        This is valid for Dev & ST, but IST will need to identify the partners expecting to
+       test the environment and add blocks to authorize them. 
+   -->
+       <ModifierATTID>sg7477</ModifierATTID>
+       <UpdateTimeStamp>2013-06-30T00:06:07+05:30</UpdateTimeStamp>
+       <GlobalConnectionBlocking>
+               <ClientBlocking/>
+               <InterfaceBlocking/>
+       </GlobalConnectionBlocking>
+       <GlobalConnectionLimitsConfiguration>
+               <GlobalConnectionLimits>
+                       <alertThreshold>100</alertThreshold>
+                       <maxConnections>110</maxConnections>
+               </GlobalConnectionLimits>
+               <GlobalInterfaceConnectionLimits>
+                       <interfaceName>AddAccount</interfaceName>
+                       <InterfaceConnectionLimits>
+                               <maxConnections>10</maxConnections>
+                       </InterfaceConnectionLimits>
+               </GlobalInterfaceConnectionLimits>
+               <GlobalInterfaceConnectionLimits>
+                       <interfaceName>AddNote</interfaceName>
+                       <InterfaceConnectionLimits>
+                               <alertThreshold>90</alertThreshold>
+                               <maxConnections>110</maxConnections>
+                       </InterfaceConnectionLimits>
+               </GlobalInterfaceConnectionLimits>
+       </GlobalConnectionLimitsConfiguration>
+       <GlobalTimeoutConfiguration>
+               <GlobalTimeout>
+                       <minTimeout>5000</minTimeout>
+                       <defaultTimeout>300000</defaultTimeout>
+                       <maxTimeout>600000</maxTimeout>
+               </GlobalTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>AddNote</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>5000</minTimeout>
+                               <defaultTimeout>250000</defaultTimeout>
+                               <maxTimeout>300000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>CreateFiberServiceVOIPNumber</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>120000</minTimeout>
+                               <defaultTimeout>300000</defaultTimeout>
+                               <maxTimeout>300000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>InquireAccountProfile</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>5000</minTimeout>
+                               <defaultTimeout>100000</defaultTimeout>
+                               <maxTimeout>250000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>InquireUnbilledUsageDetail</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>5000</minTimeout>
+                               <defaultTimeout>250000</defaultTimeout>
+                               <maxTimeout>300000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>InquireWirelinePortEligibility</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>5000</minTimeout>
+                               <defaultTimeout>330000</defaultTimeout>
+                               <maxTimeout>600000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>QualifyAndQuoteFiberServiceProducts</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>120000</minTimeout>
+                               <defaultTimeout>300000</defaultTimeout>
+                               <maxTimeout>300000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>SendSms</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>5000</minTimeout>
+                               <defaultTimeout>150000</defaultTimeout>
+                               <maxTimeout>180000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>ValidateFiberServiceFacility</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>120000</minTimeout>
+                               <defaultTimeout>1200000</defaultTimeout>
+                               <maxTimeout>1200000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>ValidateFiberServiceFacilityResponse</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>120000</minTimeout>
+                               <defaultTimeout>1200000</defaultTimeout>
+                               <maxTimeout>1200000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>ExecuteWirelineMechanizedLoopTest</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>120000</minTimeout>
+                               <defaultTimeout>1200000</defaultTimeout>
+                               <maxTimeout>1200000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>ExecuteWirelineMechanizedLoopTestResponse</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>120000</minTimeout>
+                               <defaultTimeout>1200000</defaultTimeout>
+                               <maxTimeout>1200000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+               <GlobalInterfaceTimeout>
+                       <interfaceName>AppDev_NetworkPerformance</interfaceName>
+                       <InterfaceTimeout>
+                               <minTimeout>60000</minTimeout>
+                               <defaultTimeout>100000</defaultTimeout>
+                               <maxTimeout>250000</maxTimeout>
+                       </InterfaceTimeout>
+               </GlobalInterfaceTimeout>
+       </GlobalTimeoutConfiguration>
+       <GlobalRuntimeEngineConfiguration>
+               <runtimeEngine>BW</runtimeEngine>
+       </GlobalRuntimeEngineConfiguration>
+       <GlobalIAPMaxAllowedCtns>25</GlobalIAPMaxAllowedCtns>
+       <GlobalIUCSPMaxAllowedCtns>10</GlobalIUCSPMaxAllowedCtns>
+       <GlobalACTFSTNPMaxAllowedCtns>10</GlobalACTFSTNPMaxAllowedCtns>
+       <GlobalADDFSTNPMaxAllowedCtns>10</GlobalADDFSTNPMaxAllowedCtns>
+       <GlobalIFSTNPSMaxAllowedCtns>10</GlobalIFSTNPSMaxAllowedCtns>
+       <Partner>
+               <userName>csitest</userName>
+               <userPassword>testingcsi</userPassword> 
+               <originatorId>csitest</originatorId> 
+               <isReseller>false</isReseller>
+               <isBusinessAllianceChannel>false</isBusinessAllianceChannel>
+               <salesChannelId>WALMART</salesChannelId>
+               <isBroker>false</isBroker>
+               <PartnerTimeoutConfiguration>
+                       <minTimeout>500</minTimeout>
+                       <defaultTimeout>300000</defaultTimeout>
+                       <maxTimeout>600000</maxTimeout>
+               </PartnerTimeoutConfiguration>
+               <AuthorizedInterface>
+                       <name>accountdetails</name>
+                       <resource>v1</resource>
+                       <allowedMethods>get</allowedMethods>
+               </AuthorizedInterface>          
+               <AuthorizedInterface>
+                       <name>AddContentProviderSponsor</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddEmployeeDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEmployeeDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireVoiceUsageDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateContentProviderSponsor</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireContentProviderSponsor</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCircuitTestResults</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAccountProfileV78</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberProfileV78</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ScheduleCircuitTest</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelScheduledCircuitTest</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableCircuitTestList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitCircuitTest</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerTroubleTicketDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCustomerTroubleTicketDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddCustomerTroubleTicket</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ManageBusinessServices</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireMobileUsageDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateEnterpriseEndUserPermissions</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SwapCrossUpgradeEquipment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ManageMobilePaymentProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerAlarmList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerAlarmCount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCustomerAlarmAcknowledgment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireRatingModel</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerPurchaseEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerTroubleTicketList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerTroubleTicketCount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireResellerAccountProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitResellerContractInformation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireInternationalOfferings</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAccessCircuitSummary</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEnterpriseOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEnterpriseOrderList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEnterpriseOrderStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEthernetDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerDigitalLifeInstallationProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireDirectoryListingHeadings</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ManageDigitalLifeDevice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendDigitalLifeDeviceNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteWirelineMechanizedLoopTest</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteWirelineMechanizedLoopTestResponse</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNetworkAssetDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireVOIPProbeDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireVOIPAssetDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireManagedAssetDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteExternalIdVerificationQA</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireIPNetworkServiceLocationDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCreditCheckResult</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProcessDeviceUnlock</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelessDashboard</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineServiceAppointmentReservations</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateWirelineServiceAppointmentReservation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireTechnicianDispatchStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateIDDBAutoGroup</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateIDDBDailyRules</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateIDDBGeography</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateIDDBMasterTemplate</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateOpenDeviceEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateOpenDeviceEmailAddressAvailability</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveAvailableOpenDeviceProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveOpenDeviceDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateAndQualifyOpenDeviceAddress</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveOpenDeviceTax</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateOpenDeviceCustomer</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateOpenDeviceCustomerOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddRetailStoreAppointment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateAddressServiceAvailability</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableRetailStoreAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireRetailStoreAppointmentReferenceDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFanProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireRetailStoreAppointmentList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireKeyValueStore</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateKeyValueStore</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AppDev_NetworkPerformance</name>
+                       <resource>wireless</resource>
+                       <allowedMethods>get</allowedMethods>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCustomerIdentifiers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNetworkLatency</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNetworkTrafficDensity</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireReferenceCodeList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireBillList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberBilledCallDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberCharges</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSwitchCircuitDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSwitchCircuitList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddBillAccounts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddUCOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>OrderDeviceProtectionPlan</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ResetEwalletSecurityProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCustomerSalesSupportDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdatePartnerServicesProductStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateSubscriberParentalControls</name>
+                       <voltageEnabledIndicator>false</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCPEDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNonSBSInventory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateUCCustomerProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUCCustomerProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateUCCustomerNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AuthorizeLOAUpdate</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReleaseInquiredTelephoneNumbers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateTelephoneNumbers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateLOADetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBVOIPSiteProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUpsellEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireIncompatibleOfferings</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBVOIPSubscriberAssociation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendBVOIPSubscriberAssociationNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateWirelineServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineDirectoryAvailability</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableCustomerSparePairsSummary</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateUnifiedCustomerLoginProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEnterpriseDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePaymentProductApplicationResult</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireTroubleTicketStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireTroubleReferenceDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireTroubleTicketHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateTroubleTicketDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddEnterpriseTroubleTicket</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireContractTerminationDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdatePaymentPreferences</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReserveWirelineServiceAppointment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelinePendingOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitWirelineFacilityAssignmentOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelinePendingOrderDetailsResponse</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddTroubleTicket</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFemtocellDevice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFemtocellDevice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendTroubleTicketStatusNotice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineTechnicianAssignments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableFiberServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitMechanizedLoopTest</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePortedTNList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelinePortDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireHostRoutingDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireBundledOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireBundledAccountServices</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBundledAccountServices</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateWirelineWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberCallList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateSubscriberCallList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateCreditPolicy</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddPaymentProfile</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateSwitchFeatures</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddTechnicianTroubleNote</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdatePaymentProfile</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSBSBundledDiscountSubscriberList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExchangePerformanceMetrics</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireBundledOrderStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableBundlePackages</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireBundledOrderList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>DeletePaymentProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBillingPreferences</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendBillingPreferencesNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePaymentProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireServiceAvailabilityForLocation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateCustomer</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateDevice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateFemtocellService</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateFiberServiceResidentialGateway</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateFiberServiceTNPort</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivatePendingEquipmentUpgrade</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateSubscriber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateSubscriberReseller</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateSubscriberResellerResponse</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ActivateSubscriberResponse</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>Add3PPOrderNotes</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>Add3PPOrderShipment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddAccount</name>
+                       <InterfaceConnectionConfiguration>
+                               <maxConnections>25</maxConnections>
+                       </InterfaceConnectionConfiguration>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddAffiliateDiscount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddATTConnectAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddCombinedBilling</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddCreditPolicyProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddCustomerDeviceSalesData</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddBundledOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBundledOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddFemtocellAddress</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddFemtocellCALEALocation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddFemtocellProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddFiberServiceAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddFiberServiceCreditPolicy</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddFiberServiceTNPort</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddInsuranceClaimOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddNetworkElementTroubleReport</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddNote</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddOrderEmail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddOtherChargesCredits</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddPayment</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddPort</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddPrepaidFeature</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddPrepaidPayment</name>
+                       <InterfaceTimeoutConfiguration>
+                               <minTimeout>5000</minTimeout>
+                               <defaultTimeout>300000</defaultTimeout>
+                               <maxTimeout>300000</maxTimeout>
+                       </InterfaceTimeoutConfiguration>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddPromiseToPay</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddRemoveProductCodeIndicator</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddSbcCombinedBilling</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddSbcSaleInformation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddSmsPayment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddWirelineNote</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddWirelineOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddWirelinePayment</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddWirelinePaymentPlan</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ApplyDataTreatment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ApplyFiberServiceCreditPolicy</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ApplyPrepaidPayment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ApplyPrepaidVoucher</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AuthenticateFanPassword</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AuthenticateFanPin</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AuthorizeCreditCard</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CalculateSatelliteServiceTaxes</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CalculateTaxes</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>Cancel3PPOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelCombinedBilling</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelCopay</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelFemtocellE911Service</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelFemtocellNetwork</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelFemtocellService</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelFiberServiceWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelHLRRegistration</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelInsuranceClaimOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelPendingEquipmentUpgrade</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelPort</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelReservedFiberServiceVOIPNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelWirelinePayment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ChangeSubscriberNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CheckEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ConfirmHLRRegistration</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ConfirmWirelineTNReservation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateFiberServiceAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateFiberServiceVOIPNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateFiberServiceWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateSatelliteServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>DeleteFemtocellAddress</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>DeleteFemtocellProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>DetermineFiberServiceAccountHistoryList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>DetermineFiberServiceDuplicateApplicationList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>Echo</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteAffiliateCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteFiberServiceCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteNBIMigration</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteSalesOpportunityCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteWirelineCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteWirelineTroubleReportFunction</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>Generic</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InitiateFiberServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InitiateUnifiedCreditPolicyRetrieval</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAccessoryPricing</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAccountList</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAccountPaymentHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAccountProfile</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAccountSubscribers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireActivationCommissionCodes</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAdditionalOfferings</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAddressMatch</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateAccountPaymentBalance</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateAccountProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateCustomerAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateGeneralMessages</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateOrderStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateProductCatalog</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateProductConfiguration</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateProductDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateProductOfferingEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateServiceQualification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAffiliateServiceScheduling</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireARRemittance</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireATTCreditCardOffer</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireATTCreditCardOfferList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAutomaticPayment</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableAccessory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableFiberServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableCircuitSparePairs</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableDevice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableFees</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableFiberServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableFiberServiceCustomers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableFiberServiceVOIPNumbers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableItemQuantity</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableOfferDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableOffers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailablePortInSubscriber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableSatelliteServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableSubscriberNumbers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCollectionData</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCombinedBillingEligibility</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireContractedConversionFee</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCopayEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCopaySubscriber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCopaySubscriberHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCPNIContactInformation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCpniPreferenceHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCreditCheckResult</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCreditPolicyProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerDeviceSalesData</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireDataAccessEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireDataTreatmentHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireDepositPaymentStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireDeviceDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireDeviceShippingInformation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireDuplicateOfferings</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEquipmentOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEquipmentOrderInvoice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEquipmentPricing</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEstimatedFulfillmentTime</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireExistingCustomer</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFanProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFemtocellAddressList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFemtocellDeviceList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFemtocellEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFemtocellProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceAccountDetails</name>
+                       <!-- indicator should be set based on client voltage status-->
+                       <voltageEnabledIndicator>false</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceAssignedProductDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceCircuitDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceCreditVerificationQuestions</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceCrossProductPackages</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceEquipmentDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceOfferEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceOrderDetail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceOrderList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceOrderStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceProductDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceQualification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceQuotation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceSubscriptionAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServicePendingAdjustments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceTNPortStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceUsageDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireFiberServiceVOIPPortEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireInsuranceClaimOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireInsuranceClaimReplacementProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireInternationalRoamingMinutes</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireInternationalRoamingUsageParameters</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireLandLinePaymentServiceFee</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireLastSuccessfulPayment</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireMarketByZip</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireMarketServiceAreas</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireMaximumDryLoopFTNAllowed</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireMessagingCapabilities</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNBIMigrationEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireOfferHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireOfferingEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireOTAHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireOTAProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePaymentLocationDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePendingPricePlan</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePort</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePortActivationStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePortEligibilityByRange</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePortEligibilityBySubscriberNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePrepaidBalance</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePrepaidFeatures</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePrepaidFeaturesHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePrepaidPaymentEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePrepaidPricePlans</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePrepaidPINDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePrepaidSubscriberProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePricePlanList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePricePlans</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquirePurchaseOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSatelliteServiceOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSatelliteServiceProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSatelliteServiceQualification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSatelliteServiceQuotation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSbcCombinedBillingEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireServiceAreaByZip</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireServiceOrderActivationStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSharedGroupUpdateStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireShippingZipBySubscriberNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSIMStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberParentalControls</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberPin</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberProfile</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberServiceStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberTransactionData</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriptionAccountIdentifiers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineSwitchProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSwitchTransactionStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnbilledUsageDetail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCustomerProfileByServiceLocation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCustomerServiceProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUpgradeEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWiFiEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineAccountProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineAccountAssociations</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireInternetSubscriptionAccounts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineBillingAccountList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineCreditApplicationList</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineCreditVerificationQuestions</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineCustomerAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineDSLandConnectTechOrderDetail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineDTVOrderDetail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineFiberServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineGeneralMessages</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineNetworkChannelDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineNonRecurringCharges</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineOpenTroubleReports</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineOrderStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelinePaymentHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelinePaymentPlan</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelinePortEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableTelephoneNumbers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReserveTelephoneNumbers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineProductCatalog</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineProductConfiguration</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineProductCount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineProductDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineProductsForResource</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineRegion</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineServiceQualification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineServiceScheduling</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineQualifiedProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineServiceOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineTelcoOrderDetail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineTransportDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineUsageDetail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineWholesaleProductFamilies</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>MaintainAffiliateAccountAssociation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ManageAutomaticPayments</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ManageCopay</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ManageSubscriberPin</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ModifySatelliteServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelSatelliteServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>MoveSubscriber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>NotifyFemtocellAction</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>OrderEquipment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>OrderEquipmentWithValidation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>OrderFiberService</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ParseUnfieldedWirelineAddress</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>PortFiberServiceTelephoneNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProcessEcho</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProcessEchoBackOffice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProcessEchoFrontOffice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProcessWirelineCPNIElection</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProvisionAddressBookService</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProvisionFemtocellE911Service</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProvisionFemtocellNetwork</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProvisionFemtocellRegistration</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>PublishUnifiedCreditPolicy</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>QualifyAndQuoteFiberServiceProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>QualifyProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RegisterFemtocellService</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReleaseAvailableFiberServiceVOIPNumbers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReleaseDryLoopFTN</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReleaseSubscriberNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RemoveCustomerDeviceSalesData</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ResendOTAProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReserveFiberServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReserveFiberServiceVOIPNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ReserveSubscriberNumber</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ResetVoiceMailPassword</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveAbandonedFiberServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveFiberServiceAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveFiberServiceAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveFiberServiceOrderStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveFiberServiceProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveOrderDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveQuotation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>RetrieveUnifiedCreditPolicy</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ScheduleAppointments</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ScheduleSatelliteServiceInstallation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendAccountNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendCPNINotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendEmail</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendFanProfileNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendFiberServiceTNPortNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendFiberServiceWorkOrderNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendFiberServiceWorkOrderNotificationAsync</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendSms</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendSmsResponse</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendTreatmentNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitATTCreditCard</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitFiberServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitFiberServiceTNAssignmentOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitWalmartProxy</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SwapEquipment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SwapFemtocellDevice</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateAccountDisputeDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateAccountManager</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateAccountProfile</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateAccountStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateAffiliateProductOffering</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBillMedia</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCpniPreference</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCreditPolicyProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateDepositPaymentStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateDeviceInventory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateDeviceProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateEwalletStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEwalletEventHistory</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEwalletSubscriberProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerSnapshot</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFemtocellCALEALocation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFemtocellProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFiberServiceAccount</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFiberServiceAccountDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFiberServiceCreditApplication</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateInternationalRoamingUsageParameters</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateOfferDisposition</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdatePort</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdatePrepaidFeature</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdatePrepaidSubscriberProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateSalesOpportunityCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateSatelliteServiceAccountAssociation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateSubscriberAddressBookIdentifier</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateSubscriberProfile</name>
+                       <InterfaceTimeoutConfiguration>
+                               <minTimeout>5000</minTimeout>
+                               <defaultTimeout>100000</defaultTimeout>
+                               <maxTimeout>120000</maxTimeout>
+                       </InterfaceTimeoutConfiguration>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateSubscriberStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateVoiceMailProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateWirelineAccountProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateWirelineCPNIPreference</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateWirelineCreditApplication</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateWirelineTroubleReport</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpgradeEquipment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpqueryAffiliateOfferingEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateAddress</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateAffiliateCustomer</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateAffiliateOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateCreditCard</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFemtocellCoverageArea</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFemtocellE911Coverage</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFemtocellEquipmentIdentifier</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFemtocellWhitelist</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFiberServiceCreditPolicy</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFiberServiceCreditVerificationAnswers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFiberServiceFacility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFiberServiceFacilityResponse</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFiberServiceFacilityNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateFiberServiceProductDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateSatelliteServiceProducts</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateShippingPriority</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateWirelineCreditVerificationAnswers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateWirelineCustomer</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateWirelineOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineFutureAvailability</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateWirelinePostalAddress</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelMobileContent</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireMobileContentDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFiberServiceOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteUnifiedCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendPaymentProductApplicationResultNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ConfirmUnifiedCreditAccountDebtPayment</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCreditAccountDebtDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCreditVerificationQuestions</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitUnifiedCreditApplication</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateUnifiedCreditApplication</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateUnifiedCreditVerificationAnswers</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCreditAdverseActionLetter</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCreditPolicyDecision</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>NotifyUnifiedCreditOrderSubmission</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AssignAvailableWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendNetworkPathWorkOrderStatusNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ProcessNetworkPathWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateCentralOfficeWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCentralOfficeWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateFiberServiceRepairWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CreateFiberServiceRepairWorkOrderAsnyc</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendRepairWorkOrderNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelFiberServiceRepairWorkOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>CancelFiberServiceRepairWorkOrderAsnyc</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedCustomerLoginProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCustomerSubscriptionDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendCancelWorkOrderNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineAccountLevelCSR</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireWirelineServiceLevelCSR</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireUnifiedPaymentProfile</name>
+                       <voltageEnabledIndicator>true</voltageEnabledIndicator>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCloudServiceDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNote</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateSubscriberOfferings</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>AddBundledOrderV48</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBundledAccountServicesV48</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateBundledOrderV48</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateBundledOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireBundledAccountProfile</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireRecommendationDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireEnterpriseEndUserPermissions</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNCIMigrationEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteNCIMigration</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateCommonOrder</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireBillCycleDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireCommonOrderListDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ValidateWirelineTroubleReportCompletion</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberContractDetails</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>ExecuteExternalCreditCheck</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireExternalApplicantKey</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateExternalCreditApplication</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SendExternalCreditResultNotification</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireAvailableRetailStoresByLocation</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateEnterpriseEndUserPermissions</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSubscriberServiceEligibility</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>UpdateFemtocellWhiteLists</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNetworkProductCatalog</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireNetworkProductPriceQuote</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>SubmitSLACreditClaim</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface>
+                       <name>InquireSLACreditClaimStatus</name>
+               </AuthorizedInterface>
+               <AuthorizedInterface> 
+                       <name>InquireSLANetworkCreditClaimStatus</name>
+               </AuthorizedInterface>
+               <ServicePolicy>
+                                       <name>WHOLESALE-CUSTOMER-IDDELETE</name>
+                                       <value>walmartID</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                                       <name>WHOLESALE-CUSTOMER-NAME</name>
+                                       <value>walmart</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                                       <name>WHOLESALE-CUSTOMER-RESTRICTED-STATES</name>
+                                       <value>alaska</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>BID_ID</name>
+                       <value>PlatinumSP</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>EBM_ORGID</name>
+                       <value>o3hevdtz</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>REMOTE-CALL</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>CALL_NUMERITRACK</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>HEARTBEAT-INTERVAL</name>
+                       <value>20</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>AP-CALL-RSN-FOR-WLNP-TLG</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>AS-PROCESS-DISCOUNTS</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>AS-RETRY-ON-TRANSIENT-ERROR</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>AS-STORE-MARKET</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>CATALOG_TYPE</name>
+                       <value>WALMART Catalog</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <!-- Should be true only for ACME -->
+                       <name>CHECK-FOR-MARKETLOOKUP-SOFTERROR</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>EQUIPMENT-UPGRADE-MAX-RETRY-INTERVAL</name>
+                       <value>0</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>EQUIPMENT-UPGRADE-TRACKING-REQUIRED</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IAL-AV-REQUIRED</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IAP-ALLOWED-MASK-VALUES</name>
+                       <value>CR:TD:SL:SN:SC:DC:UD:VU:VU+PT:VU+PR:VU+PT+PR:DU:DU+PR:UE</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IAP-AV-REQUIRED</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>INFO-RESTRICT-LEVEL</name>
+                       <value>Unrestricted</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>ISP-ALLOWED-MASK-VALUES</name>
+                       <value>DI:DC:UD:VU:VU+PT:VU+PR:VU+PT+PR:DU:DU+PR:UE</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IUCSP-MAX-ALLOWED-CTNS</name>
+                       <value>10</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IUCSP-NEW-KIT-WARRANTY-DAYS</name>
+                       <value>366</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IUCSP-REFURBISHED-KIT-WARRANTY-DAYS</name>
+                       <value>90</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IUCSP-SEED-KIT-WARRANTY-DAYS</name>
+                       <value>366</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IUUD-ALLOWED-MASK-VALUES</name>
+                       <value>VU:VU+HO:VU+RO:VU+TO:VU+AL:VU+PT:VU+PT+HO:VU+PT+RO:VU+PT+TO:VU+PT+AL:VU+PR:VU+PR+HO:VU+PR+RO:VU+PR+TO:VU+PR+AL:VU+PT+PR:VU+PT+PR+HO:VU+PT+PR+RO:VU+PT+PR+TO:VU+PT+PR+AL:DU:DU+PR</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IWPE-LSR11-ACCESS-DENIED</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>TN-REQUEST-CATEGORY</name>
+                       <value>MCSICVOIP</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>MARKET-STATUS-LOOKUP</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>MEMO-NOTE-USER</name>
+                       <value>WEB</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>NBI-ACCESS-DECLINED</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>PREAUTHORIZED-CREDIT-CHECK</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <!-- Should always be true for IST and almost always false for prod -->
+                       <name>RESTRICTED-TO-TEST-CALLS</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>RESELLER-TEST-DEALER-CODE</name>
+                       <value>IJX57</value>
+               </ServicePolicy>                
+               <ServicePolicy>
+                       <name>UPGRADE-EQUIPMENT-NEW-SALES-CHANNEL</name>
+                       <value>U2</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>UPGRADE-EQUIPMENT-UPGRADE-SECURITY-CODE</name>
+                       <value>III</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>USE-GENERIC-ASYNC-RESPONSE</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>USOC-INFO-DATA-SOURCE</name>
+                       <value>CURRENT</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>VFSF-OAT-REQUIRED-MSG-LOOKUP</name>
+                       <value>false</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>VFSF-CLIENT-REQ-TYPE</name>
+                       <value>Negotiation</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>VFSF-CLIENT-ID</name>
+                       <value>BBNMS</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>SMS-DESTINATION-PORT</name>
+                       <value>-1</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>CTVCODE-SERVICE-MAINTENANCE</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>XI-APPLICATION-CONTEXT</name>
+                       <value>OPSS</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IN-MAX-BILLING-NOTE-QUANTITY</name>
+                       <value>300</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>ITTH-TL-MAX-RECORDS-TO-FETCH</name>
+                       <value>50</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>ITTH-ITH-MAX-RECORDS-TO-FETCH</name>
+                       <value>30</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>IEEUP-SYSTEM-ID</name>
+                       <value>premier</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                               <name>SUBSCRIPTION_CLASS</name>
+                               <value>S</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                        <name>MOBILE_PAYMENTS_PARTNER_ID</name>
+                        <value>S</value>
+                </ServicePolicy>
+
+               <ServicePolicy>
+                       <name>IUCPBYSL-GRID-CLIENT</name>
+                       <value>true</value>
+               </ServicePolicy>
+               <ServicePolicy>
+                       <name>APPLICATION_ID</name>
+                       <value>ONSTAR</value>
+               </ServicePolicy>
+               <ServiceProviderCredentials>
+                       <system>AES</system>
+                       <userName>NRETLTEL</userName>
+                       <userPassword>NRETLTEL</userPassword>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>BOSS</system>
+                       <userName>testcsi</userName>
+                       <userPassword/>
+                       <CredentialPolicy>
+                               <name>RACFID</name>
+                               <value>pb1975</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>RACFPASSWORD</name>
+                               <value>Light@1</value>
+                       </CredentialPolicy>
+                       <!--CredentialPolicy>
+                                <name>BOSSTYPISTID</name>
+                                <value>1K34</value>
+                        </CredentialPolicy-->
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>BSTECSC</system>
+                       <userName>CSI</userName>
+                       <userPassword>a2p2!!b1</userPassword>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>CAM</system>
+                       <userName>CSIQC</userName>
+                       <userPassword>CSIQC</userPassword>
+                       <CredentialPolicy>
+                               <name>AccountType</name>
+                               <value>S</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>SubAccountType</name>
+                               <value>T</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>WaiveActivationFee</name>
+                               <value>true</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>WaiveUpgradeFee</name>
+                               <value>true</value>
+                       </CredentialPolicy>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>CBS</system>
+                       <userName>ZCINGP1</userName>
+                       <userPassword/>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>CPSOS</system>
+                       <userName>c48794</userName>
+                       <userPassword>7941!c48</userPassword>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>DLC</system>
+                       <userName>CSIQC</userName>
+                       <userPassword/>
+                       <CredentialPolicy>
+                               <name>DLC_APP_ID</name>
+                               <value>ASURION</value>
+                       </CredentialPolicy>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>GCS</system>
+                       <userName>CSIQC</userName>
+                       <userPassword/>
+                       <CredentialPolicy>
+                               <name>GCS_MERCHANT_ID</name>
+                               <value>001342</value>
+                       </CredentialPolicy>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>InterconnectRC</system>
+                       <userName>csitest</userName>
+                       <userPassword/>
+                       <CredentialPolicy>
+                               <name>interconnectUSERID</name>
+                               <value>SBC001T</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>interconnectPASSWORD</name>
+                               <value>GC@\u0011W4\#""6/\u001172OK</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>interconnectLightSpeedUSERID</name>
+                               <value>SBC002T</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>interconnectLightSpeedPASSWORD</name>
+                               <value>GAN\u0016T4\#""6/\u001072OK</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>interconnectConsumerUSERID</name>
+                               <value>SBC003T</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>interconnectConsumerPASSWORD</name>
+                               <value>GCC\u0017P4\#""6/\u001372OK</value>
+                       </CredentialPolicy>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>LNPSOA</system>
+                       <userName/>
+                       <userPassword/>
+                       <CredentialPolicy>
+                               <name>LNPSOA_APP_ID</name>
+                               <value>QC</value>
+                       </CredentialPolicy>
+                       <!--CredentialPolicy>
+        <name>LNPSOA_USER_ID</name>
+        <value>RMBISQC</value>
+         </CredentialPolicy-->
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>MRE</system>
+                       <userName>OPUS</userName>
+                       <userPassword>OPUS</userPassword>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>NSM</system>
+                       <userName>ACME</userName>
+                       <userPassword/>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>OrderTrack</system>
+                       <userName>csitest</userName>
+                       <userPassword/>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>PDC</system>
+                       <userName>RS</userName>
+                       <userPassword/>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>QPAY</system>
+                       <userName>CSI_FDC</userName>
+                       <userPassword>CSI_FDC</userPassword>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>SWOT-LITE</system>
+                       <userName>cingultest</userName>
+                       <userPassword>j9WWuopev9</userPassword>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>TLGAPI</system>
+                       <userName>rimprov1</userName>
+                       <userPassword>unix11</userPassword>
+                       <CredentialPolicy>
+                               <name>APP_ID</name>
+                               <value>TLGAPI</value>
+                       </CredentialPolicy>
+                       <CredentialPolicy>
+                               <name>CALLER_IND</name>
+                               <value>FR</value>
+                       </CredentialPolicy>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>YODA</system>
+                       <userName>WTS</userName>
+                       <userPassword>CSITest</userPassword>
+               </ServiceProviderCredentials>
+               <ServiceProviderCredentials>
+                       <system>EDGE</system>
+                       <userName>WMS</userName>
+                       <userPassword>WMS</userPassword>
+               </ServiceProviderCredentials>
+               <AsyncCallbackConfig>
+                       <allowHttp>true</allowHttp>
+                       <RetryPolicy>
+                               <timeout>30000</timeout>
+                               <numRetries>3</numRetries>
+                               <delay>3000</delay>
+                       </RetryPolicy>
+                       <SSLConfig>
+                               <enableHostNameVerification>false</enableHostNameVerification>
+                               <enableTwoWaySSL>false</enableTwoWaySSL>
+                               <ServerCertificateDetails>
+                                       <trustStoreLocation>/opt/app/sg_q7/tibco/jre/lib/security/cacerts</trustStoreLocation>
+                                       <trustStorePassword>changeit</trustStorePassword>
+                               </ServerCertificateDetails>
+                               <ClientCertificateDetails>
+                                       <keyStoreLocation>/opt/app/sg_q7/gateway_a/config/ActingAsClient.keystore</keyStoreLocation>
+                                       <keyStorePassword>client</keyStorePassword>
+                               </ClientCertificateDetails>
+                       </SSLConfig>
+               </AsyncCallbackConfig>
+               <performPrepaidDeviceCheck>true</performPrepaidDeviceCheck>
+       </Partner>
+</PartnerProfile>
diff --git a/ajsc-shared-config/etc/basic-logback_root_logger_level_off.xml b/ajsc-shared-config/etc/basic-logback_root_logger_level_off.xml
new file mode 100644 (file)
index 0000000..4ebe2db
--- /dev/null
@@ -0,0 +1,87 @@
+<!-- 
+ Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+-->
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+       <property name="logDirectory" value="${AJSC_HOME}/log" />
+       <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+               <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+                       <level>ERROR</level>
+               </filter>
+               <encoder>
+                       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n
+                       </pattern>
+               </encoder>
+       </appender>
+
+       <appender name="INFO"
+               class="ch.qos.logback.core.rolling.RollingFileAppender">
+               <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+                       <level>DEBUG</level>
+               </filter>
+               <file>${logDirectory}/info_ajsc.log</file>
+               <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+                       <fileNamePattern>${logDirectory}/info_ajsc.%i.log.zip
+                       </fileNamePattern>
+                       <minIndex>1</minIndex>
+                       <maxIndex>9</maxIndex>
+               </rollingPolicy>
+               <triggeringPolicy
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+                       <maxFileSize>5MB</maxFileSize>
+               </triggeringPolicy>
+               <encoder>
+                       <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+               </encoder>
+       </appender>
+       <appender name="ERROR"
+               class="ch.qos.logback.core.rolling.RollingFileAppender">
+               <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+                       <level>ERROR</level>
+               </filter>
+               <file>${logDirectory}/error_ajsc.log</file>
+               <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+                       <fileNamePattern>${logDirectory}/error_ajsc.%i.log.zip
+                       </fileNamePattern>
+                       <minIndex>1</minIndex>
+                       <maxIndex>9</maxIndex>
+               </rollingPolicy>
+               <triggeringPolicy
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+                       <maxFileSize>5MB</maxFileSize>
+               </triggeringPolicy>
+               <encoder>
+                       <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n"</pattern> -->
+                       <pattern>"%d [%thread] %-5level %logger{1024} - %msg%n"</pattern>
+               </encoder>
+       </appender>
+
+       <appender name="AJSC-AUDIT" class="ch.qos.logback.classic.net.SyslogAppender">
+               <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+                       <level>INFO</level>
+               </filter>
+               <syslogHost>localhost</syslogHost>
+               <facility>USER</facility>
+               <!-- Note the colon character below - it is important part of "TAG" message 
+                       format You need a colon to determine where the TAG field ends and the CONTENT 
+                       begins -->
+               <suffixPattern>AJSC_AUDIT: [%thread] [%logger] %msg</suffixPattern>
+       </appender>
+       <appender name="CONTROLLER-AUDIT" class="ch.qos.logback.classic.net.SyslogAppender">
+               <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+                       <level>INFO</level>
+               </filter>
+               <syslogHost>localhost</syslogHost>
+               <facility>USER</facility>
+               <!-- Note the colon character below - it is important part of "TAG" message 
+                       format You need a colon to determine where the TAG field ends and the CONTENT 
+                       begins -->
+               <suffixPattern>AJSC_AUDIT: [%thread] [%logger] mdc:[%mdc] %msg
+               </suffixPattern>
+       </appender>
+
+       <root level="off">
+               <appender-ref ref="ERROR" />
+               <appender-ref ref="INFO" />
+               <appender-ref ref="STDOUT" />
+       </root>
+</configuration>
diff --git a/ajsc-shared-config/etc/csm-config-app.properties b/ajsc-shared-config/etc/csm-config-app.properties
new file mode 100644 (file)
index 0000000..d80cf1c
--- /dev/null
@@ -0,0 +1,185 @@
+Global.ExtendedProperty.AuthoritativeServers=${ChangeMe_csm.acfshost}:${ChangeMe_csm.acfsport}
+
+#Possible working server for troubleshooting csm related items (used when testing/using invokeService or invokeAdapter components)
+#Global.ExtendedProperty.AuthoritativeServers=q399csi1a1.vci.att.com:27550
+#
+# The settings in this file control the behavior of the CSM Framework. 
+# The majority of the settings in this file adhere to the following
+# pattern:
+# 
+#  [EntityType].[EntityId].[PropertyName]=[PropertyValue]
+# 
+# Where:
+# 
+#  [EntityType]    Identifies the type of entity (service or
+#                  service group) that's being configured.
+#  [EntityId]      Identifies the individual entity.
+#  [PropertyName]  Identifies the property that is being set.
+#  [PropertyValue] Is the actual property value.
+# 
+# In the formatting sample above, the EntityType can be setto one of the
+# following values:
+# 
+#  * 'Service' if an individual service is being configured.
+#  * 'Group 'if a service group is being configured.
+# 
+# The reference to 'entity' in the above description is intentionally
+# generic.  The CSM Framework supports the configuration of individual
+# services as well as groups of services.  The type of entity that is
+# actually being configured is determined by the value of the
+# [EntityType] portion of the property.
+# 
+# There are two values for [EntityId] that have a special meaning within
+# the CSM Framework:
+# 
+# 
+# DefaultService - Identifies the default configuration for any service
+#     that is not explicitly configured elsewhere in this file.
+# 
+# DefaultServiceGroup - This identifies the entity that provides the
+#     default configuration for any service group that is not explicitly
+#     configured elsewhere in this file.
+# 
+# DO NOT use either of these as the identifier for any of your
+# application-specific services or service groups.
+# 
+# The CSM Framework treats all entity identifiers in a case-insensitive
+# manner.  The entity ids 'Service1' and 'SERVICE1' are equivalant.  All
+# properties with the same [EntityId] will be applied to the same
+# configuration.  The CSM Framework framework also treats property names
+# in a case-insensitive manner.  'MaxRequestCount' and 'MAXREQUESTCOUNT'
+# are considered equivalent within the CSM framework.
+# 
+# The following properties are supported by the CSM Framework.  Any
+# properties that are entity-specific will include the '[EntityId].'
+# prefix.
+# 
+# [EntityType].[EntityId].Enabled - Indicates if the entity is enabled
+#     or disabled by default.  The value of this property must be either
+#     'true' or 'false'.
+# 
+# [EntityType].[EntityId].MaxRequestCount - The maximum number of
+#     requests that can be running at any point in time.  Once this limit is
+#     reached, the service is considered  to be 'flooded', and subsequent
+#     requests are refused until the request count drops to the level
+#     specified by the RestartThreshold property.  Once the restart
+#     threshold is reached, the service will be 'restarted' based on the
+#     values of the 'RestartFrequency' and 'RestartIncrement' properties.
+#     The value of this property must be a numeric value.
+#     The default value for this property is 20.
+# 
+# [EntityType].[EntityId].MaxStalledRequestCount - the maximum number of
+#     'stalled' requests that are allowed before subsequent requests are
+#     refused
+#     The value of this property must be a numeric value.
+#     The default value for this property is 10.
+# 
+# [EntityType].[EntityId].RestartThreshold - the process count level at
+#     which requests will be allowed to proceed whenever a service becomes
+#     'flooded'.  This property is only used if the total process count
+#     reaches the level set by the 'MaxRequestCount' property.  Once that
+#     occurs, subsequent requests will be refused until the active request
+#     count drops to the level specified by this property.  Once the active
+#     request count drops to the level specified by this property, the
+#     service will be 'restarted' based on the values of the
+#     'RestartFrequency' and 'RestartIncrement' properties.  To cause the
+#     CSM framework to allow subsequent requests to proceed as soon as the
+#     active request count drops below level level set by the
+#     'MaxRequestCount' property, just set this property to either -1 or 1
+#     less than the value of the 'MaxRequestCount' property.
+#     The value of this property must be a numeric value.
+#     The default value for this property is -1.
+# 
+# [EntityType].[EntityId].RestartIncrement - This property, along with
+#     the 'RestartFrequency' property helps determine how quickly the active
+#     request count will rise to the 'maximum request count' whenever a
+#     service is 'restarted' after becoming 'flooded'. The
+#     'RestartFrequency' property determines how frequenty the permissable
+#     number of active requests will be increased.  This property determines
+#     how much the permissible number of active requests will increase by
+#     whenever it is raised.  If this property is set to a positive value,
+#     then the 'RestartFrequency' property must also be set to a positive
+#     value.  If this property is set to 0, then the 'RestartFrequency'
+#     property must also be set to 0.  In other words, either both
+#     properties are 0 or both properties are greater than 0.  When both
+#     properties are set to 0, then the permissable number of active
+#     requests immediately rises back up to the maximum request count once
+#     it has droppedback down to the 'restart threshold'.  When both
+#     properties are greater than 0, then the permissable number of active
+#     requests gradually rises to the maximum request count.
+#     The value of this property must be a numeric value greater than or equal to 0.
+#     The default value for this property is 0.
+# 
+# [EntityType].[EntityId].RestartFrequency - This property, along with
+#     the 'RestartIncrement' property helps determine how quickly the active
+#     request count will rise to the 'maximum request count' whenever a
+#     service is 'restarted' after becoming 'flooded'. The
+#     'RestartIncrement' property determines how quickly the permissable
+#     number of active requests will be increased.  This property determines
+#     how frequently  that increase will occur.  If this property is set to
+#     a positive value, then the 'RestartIncrement' property must also be
+#     set to a positive value.  If this property is set to 0, then the
+#     'RestartIncrement' property must also be set to 0.  In other words,
+#     either both properties are 0 or both properties are greater than 0. 
+#     When both properties are set to 0, then the permissable number of
+#     active requests immediately rises back up to the maximum request count
+#     once it has droppedback down to the 'restart threshold'.  When both
+#     properties are greater than 0, then the permissable number of active
+#     requests gradually rises to the maximum request count.
+#     The value of this property must be a numeric value greater than or equal to 0.
+#     The default value for this property is 0.
+# 
+# [EntityType].[EntityId].ServiceGroupId - This property is only
+#     relevant for entities that are configured as services (i.e. the
+#     [EntityType] portion of the property is set to 'Service').  When the
+#     'ServiceGroupId' property is set to a non-blank value, the behavior of
+#     the service is controled by the configuration of the corresponding
+#     service group.  There is no default value for this property.
+# 
+# [EntityType].[EntityId].Timeout - the timeout, in milliseconds, for
+#     each process that is controlled by this configuration.  Once the
+#     duration of a process exceeds this value, the process will be
+#     considered to have entered a 'stalled' state.  The default value for
+#     this property is 10000.
+# 
+# FrameworkEnabled: - This is the one property that is not specific to a
+#     single entity.  This property determines whether the entire CSM
+#     Framework is enabled or disabled.  When disabled, the CSM Framework
+#     does not track any process counts.  All requests to access a service
+#     are allowed, regardless of the current level of activity.  The value
+#     of this property must be either 'true' or 'false'.
+# 
+
+#
+# Enables the CSM Framework so that it can manage interactions with external
+# services and/or resources.  To disable the CSM Framework, simply set
+# this property to false.
+#
+FrameworkEnabled=true
+
+#
+# These are the default settings for any service that is no explicitly configured
+# below.  A few things to note about this configuration:
+#  1) The "Enabled" property is not explicitly set.  Instead, we are relying
+#     on the default value of 'true'.
+#  2) The Timeout and Type properties are also not explicitly set.  Again, we
+#     are relying on the default values for these properties.
+#  
+Service.DefaultService.Enabled=true
+Service.DefaultService.MaxRequestCount=30
+Service.DefaultService.MaxStalledRequestCount=20
+Service.DefaultService.Timeout=30000
+Service.DefaultService.RestartThreshold=-1
+Service.DefaultService.AutoPurgeAfter=150000
+
+
+#
+# These are the default settings for any service group that is referenced in 
+# a service configuration but not configured below.
+# 
+# Currently CSI does not use any service group configurations!
+#
+#Group.DefaultGroup.MaxRequestCount=-1
+#Group.DefaultGroup.MaxStalledRequestCount=-1
+#Group.DefaultGroup.RestartThreshold=-1
+#Group.DefaultGroup.Timeout=-1
diff --git a/ajsc-shared-config/etc/csm-framework-app.properties b/ajsc-shared-config/etc/csm-framework-app.properties
new file mode 100644 (file)
index 0000000..140fde3
--- /dev/null
@@ -0,0 +1,11 @@
+# The csm-persist-to property identifies the file that the CSM Framework
+# will write the current configuration to whenever it is told to save it's
+# configuration.
+#
+#csm-persist-to=/opt/app/myapplication/csm.properties.persisted
+
+#Important . Please specify absolute path starting from the root directory for Property csm-persist-to 
+#(Giving relative path may result in undesired results in case the applcation is restarted from a different directory than the original start directory  )
+#In the following example , relative path is specfied since the directory structure varies on diff env 
+
+csm-persist-to=/opt/app/q103csi1m8/DATA/${ChangeMe_RELEASE}/${ChangeMe_CLUSTER}_ACFS_csm.properties.persisted
diff --git a/ajsc-shared-config/etc/logback.xml b/ajsc-shared-config/etc/logback.xml
new file mode 100644 (file)
index 0000000..228872e
--- /dev/null
@@ -0,0 +1,210 @@
+<configuration scan="true" scanPeriod="3 seconds" debug="false">
+  <!--<jmxConfigurator /> -->
+  <!-- directory path for all other type logs -->
+  
+  <property name="logDir"  value="${AJSC_HOME}/logs" />
+  
+  
+  <!--  specify the component name 
+       <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC"  -->
+  <property name="componentName" value="AAI-DR" />
+  
+  <!--  default eelf log file names -->
+  <property name="generalLogName" value="error" />
+  <property name="metricsLogName" value="metrics" />
+  <property name="auditLogName" value="audit" />
+  <property name="debugLogName" value="debug" />
+  
+  <property name="errorLogPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%mdc{RequestId}|%thread|DataRouter|%mdc{PartnerName}|%logger||%.-5level|%msg%n" />
+  <property name="auditMetricPattern" value="%m%n" />
+
+  <property name="logDirectory" value="${logDir}/${componentName}" />
+  
+  <!-- Example evaluator filter applied against console appender -->
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>${errorLogPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <!-- ============================================================================ -->
+  <!-- EELF Appenders -->
+  <!-- ============================================================================ -->
+  
+  <!-- The EELFAppender is used to record events to the general application 
+       log -->
+  
+  <appender name="EELF"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${generalLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${errorLogPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+    <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+      <level>INFO</level>
+    </filter>
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELF" />
+  </appender>
+
+  
+  <!-- EELF Audit Appender. This appender is used to record audit engine 
+       related logging events. The audit logger and appender are specializations 
+       of the EELF application root logger and appender. This can be used to segregate 
+       Policy engine events from other components, or it can be eliminated to record 
+       these events as part of the application root log. -->
+  
+  <appender name="EELFAudit"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${auditLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${auditMetricPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFAudit" />
+  </appender>
+  
+  <appender name="EELFMetrics"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${metricsLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - 
+           %msg%n"</pattern> -->
+      <pattern>${auditMetricPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  
+  <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFMetrics"/>
+  </appender>
+  
+  <appender name="EELFDebug"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${debugLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${errorLogPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFDebug" />
+    <includeCallerData>false</includeCallerData>
+  </appender>
+  
+  
+  <!-- ============================================================================ -->
+  <!--  EELF loggers -->
+  <!-- ============================================================================ -->
+  <logger name="com.att.eelf" level="info" additivity="false">
+    <appender-ref ref="asyncEELF" />
+    <appender-ref ref="asyncEELFDebug" />
+  </logger>
+
+  <logger name="com.att.eelf.security" level="info" additivity="false">
+    <appender-ref ref="asyncEELFSecurity" /> 
+  </logger>
+  <logger name="com.att.eelf.perf" level="info" additivity="false">
+    <appender-ref ref="asyncEELFPerformance" />
+  </logger>
+  <logger name="com.att.eelf.server" level="info" additivity="false">
+    <appender-ref ref="asyncEELFServer" />
+  </logger>
+  <logger name="com.att.eelf.policy" level="info" additivity="false">
+    <appender-ref ref="asyncEELFPolicy" />
+  </logger>
+  <logger name="com.att.eelf.audit" level="info" additivity="false">
+    <appender-ref ref="asyncEELFAudit" />
+  </logger>
+  <logger name="com.att.eelf.metrics" level="info" additivity="false">
+    <appender-ref ref="asyncEELFMetrics" />
+  </logger>
+  
+  <!-- Spring related loggers -->
+  <logger name="org.springframework" level="WARN" />
+  <logger name="org.springframework.beans" level="WARN" />
+  <logger name="org.springframework.web" level="WARN" />
+  <logger name="com.blog.spring.jms" level="WARN" />
+
+  <!-- AJSC Services (bootstrap services) -->
+  <logger name="ajsc" level="WARN" />
+  <logger name="ajsc.RouteMgmtService" level="WARN" />
+  <logger name="ajsc.ComputeService" level="WARN" />
+  <logger name="ajsc.VandelayService" level="WARN" />
+  <logger name="ajsc.FilePersistenceService" level="WARN" />
+  <logger name="ajsc.UserDefinedJarService" level="WARN" />
+  <logger name="ajsc.UserDefinedBeansDefService" level="WARN" />
+  <logger name="ajsc.LoggingConfigurationService" level="WARN" />
+  
+  <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet 
+       logging) -->
+  <logger name="ajsc.utils" level="WARN" />
+  <logger name="ajsc.utils.DME2Helper" level="WARN" />
+  <logger name="ajsc.filters" level="WARN" />
+  <logger name="ajsc.beans.interceptors" level="WARN" />
+  <logger name="ajsc.restlet" level="WARN" />
+  <logger name="ajsc.servlet" level="WARN" />
+  <logger name="com.att" level="INFO" />
+  <logger name="com.att.ajsc.csi.logging" level="WARN" />
+  <logger name="com.att.ajsc.filemonitor" level="WARN" />
+
+  <logger name="org.openecomp.datarouter" level="INFO" />
+
+  <!-- Other Loggers that may help troubleshoot -->
+  <logger name="net.sf" level="WARN" />
+  <logger name="org.apache.commons.httpclient" level="WARN" />
+  <logger name="org.apache.commons" level="WARN" />
+  <logger name="org.apache.coyote" level="WARN" />
+  <logger name="org.apache.jasper" level="WARN" />
+
+  <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging. 
+       May aid in troubleshooting) -->
+  <logger name="org.apache.camel" level="WARN" />
+  <logger name="org.apache.cxf" level="WARN" />
+  <logger name="org.apache.camel.processor.interceptor" level="WARN" />
+  <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" />
+  <logger name="org.apache.cxf.service" level="WARN" />
+  <logger name="org.restlet" level="WARN" />
+  <logger name="org.apache.camel.component.restlet" level="WARN" />
+
+  <!-- logback internals logging -->
+  <logger name="ch.qos.logback.classic" level="WARN" />
+  <logger name="ch.qos.logback.core" level="WARN" />
+
+  <root>
+    <appender-ref ref="asyncEELF" /> 
+    <!-- <appender-ref ref="asyncEELFDebug" /> -->
+  </root>
+  
+</configuration>
diff --git a/ajsc-shared-config/etc/spm2.jks b/ajsc-shared-config/etc/spm2.jks
new file mode 100644 (file)
index 0000000..8ff2a00
Binary files /dev/null and b/ajsc-shared-config/etc/spm2.jks differ
diff --git a/antBuild/build.xml b/antBuild/build.xml
new file mode 100644 (file)
index 0000000..ab0f890
--- /dev/null
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+ Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+-->
+<project>
+       <target name="runLocal">
+               <java dir="${basedir}" fork="yes" newenvironment="true"
+                       failonerror="true" classname="com.att.ajsc.runner.Runner">
+                       <classpath
+                               path="${classpath}:${basedir}/ajsc-shared-config/etc:${runAjscHome}/lib/ajsc-runner-${ajscRuntimeVersion}.jar" />
+
+                       <!-- Windows Users may need to add a jvmarg arg to create a temp directory 
+                               properly. -->
+                       <!-- <jvmarg value="-Djava.io.tmpdir=C:/yourTempDirectory"/> -->
+
+                       <!-- Uncomment the following 2 jvmarg values to enable Remote Debugging. 
+                        -->
+                       <!-- <jvmarg value="-Xdebug" /> -->
+                       <!-- <jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5432" 
+                               /> -->
+
+                       <jvmarg value="-XX:MaxPermSize=512m" />
+                       <jvmarg value="-Xmx1024m" />
+
+                       <!-- Main ajsc Variables below (Variables necessary for proper startup 
+                               of AJSC) -->
+                       <env key="AJSC_HOME" value="${runAjscHome}" />
+                       <sysproperty key="AJSC_HOME" value="${runAjscHome}" />
+                       <!-- you may specify any external location for AJSC_CONF_HOME where etc 
+                               folder & all other configs can be found under it. If not specified, it will 
+                               default to AJSC_HOME -->
+                       <sysproperty key="AJSC_CONF_HOME" value="${basedir}/bundleconfig-local" />
+                       <sysproperty key="AJSC_SHARED_CONFIG" value="${basedir}/ajsc-shared-config" />
+
+                       <!-- Location of logback.xml file used for logging configurations. Please, 
+                               note, when deploying a service to either CSI or NON-CSI environment, this 
+                               system property will be set in sys-props.properties file. We are setting 
+                               it here for running locally due to the ease of use of maven variable for 
+                               basedir. -->
+                       <sysproperty key="logback.configurationFile"
+                               value="${basedir}/ajsc-shared-config/etc/logback.xml" />
+
+                       <!-- Setting system properties for the AJSC external libs and properties 
+                               folders below. When deploying to a node, these properties will be set within 
+                               the bundleconfig/etc/sysprops/sys-props.properties file. However, when running 
+                               locally, the ${basedir} substitution works more efficiently in this manner. -->
+                       <sysproperty key="AJSC_EXTERNAL_LIB_FOLDERS" value="${basedir}/target/commonLibs" />
+                       <sysproperty key="AJSC_EXTERNAL_PROPERTIES_FOLDERS"
+                               value="${basedir}/ajsc-shared-config/etc" />
+
+                       <!-- End of Main ajsc Variables below (Variables necessary for proper 
+                               startup of AJSC) -->
+
+                       <!-- Uncomment the following line to add oauthentication to your Service -->
+                       <!-- <sysproperty key="spring.profiles.active" value="oauth" /> -->
+
+                       <!-- If using Cassandra as Database, Enter the ip/host and port below 
+                               based on your known configuration -->
+                       <!-- <sysproperty key="cassandra.ip" value="hostname" /> -->
+                       <!-- <sysproperty key="cassandra.port" value="9042" /> -->
+
+                       <!-- The APP_SERVLET_URL_PATTERN variable is defaulted to "/services" 
+                               within the initial configuration of the AJSC. If you are changing the CamelServlet 
+                               Filter within the ajsc-override-web.xml, you should use that url-pattern 
+                               here. This is necessary to properly register your service with dme2. An empty 
+                               value, "", is used when NO value is wanted (url-pattern would be /* for CamelServlet 
+                               Filter) -->
+                       <!-- As of 4.5.1, this property is no longer needed -->
+                       <!-- <sysproperty key="APP_SERVLET_URL_PATTERN" value="/services" /> -->
+
+                       <!-- GRM/DME2 System Properties below -->
+                       <sysproperty key="AJSC_SERVICE_NAMESPACE" value="${module.ajsc.namespace.name}" />
+                       <sysproperty key="AJSC_SERVICE_VERSION" value="${module.ajsc.namespace.version}" />
+                       <sysproperty key="SOACLOUD_SERVICE_VERSION" value="${project.version}" />
+                       <!-- End of GRM/DME2 System Property Variables -->
+
+                       <!-- The following server.port variable was necessary for the proper registration 
+                               of the AJSC to dme2. This value may still need to be used if the Developer 
+                               is hardcoding their port (example: 8080). Then, the server.port value="8080". 
+                               The default functionality for the AJSC is to use EPHEMERAL ports. In this 
+                               case, you do NOT need to set the server.port value. The AJSC will find the 
+                               proper port value and register to dme2 correctly -->
+                       <!-- <sysproperty key="server.port" value="${serverPort}" /> -->
+
+                       <!-- Command Line Arguments to add to the java command. Here, you can 
+                               specify the port as well as the Context you want your service to run in. 
+                               Use context=/ to run in an unnamed Context (Root Context). The default configuration 
+                               of the AJSC is to run under the /ajsc Context. Setting the port here can 
+                               aid during the development phase of your service. However, you can leave 
+                               this argument out entirely, and the AJSC will default to using an Ephemeral 
+                               port. -->
+                       <arg line="context=/ port=${serverPort} sslport=${sslport}" />
+               </java>
+       </target>
+       <target name="prep_home_directory_for_swm_pkgcreate">
+
+<!-- ********* GENERATE CADI KEY AND ENCRYPTED PASSWORD ***********
+     
+            Uncomment the following if your cadi key get corrupted , It would 
+                       generate the Cadi key and password in the package phase and keep the key 
+                       in the 'src/main/config/ajscKey' and password in the bottom of cadi.properties(you 
+                       need to modify the 'aaf_pass' variable with this value . Plese modify the 
+                       template.cadi.properties as well before uploading to SOA node 
+-->
+
+<!-- 
+               <java jar="${basedir}/target/userjars/cadi-core-1.2.5.jar" fork="true"> 
+               <arg value="keygen" /> <arg value="src/main/config/ajscKey" /> 
+               </java> 
+               
+               <echo>***Cadi Key file generated ****</echo> 
+               
+               <java jar="${basedir}/target/userjars/cadi-core-1.2.5.jar" 
+               fork="true" append="true" output="${basedir}/src/main/config/cadi.properties"> 
+               <arg value="digest" /> <arg value="ajscRocks!" /> <arg value="src/main/config/ajscKey" 
+               /> 
+               </java> 
+               
+-->
+
+
+
+               <!-- These tasks are copying contents from the installHomeDirectory into 
+                       the eventual $AJSC_HOME directory for running locally and soa cloud installation -->
+               <echo message="ENTERING 'prep_home_directory_for_swm_pkgcreate' ant tasks" />
+
+               <!-- Please, NOTE: The ajsc-archetype is setup for a default CSI Env deployment. 
+                       If you are deploying to a CSI Env, you should NOT have to change anything 
+                       within this build file. However, if you are NOT deploying to a CSI Env, you 
+                       should comment OUT the CSI related portion of this build.xml. -->
+
+               <!-- The following code snippet is copying the bundleconfig-csi directory 
+                       to the proper installation/bundleconfig directory used in CSI envs. If you 
+                       are NOT installing to a CSI node, you should comment out (or delete) the 
+                       following snippet, and uncomment the NON-CSI copy task to copy EVERYTHING 
+                       to the installation/bundleconfig directory. -->
+
+               <!-- CSI related bundleconfig copy task. If you are NOT deploying to a 
+                       CSI Env, please COMMENT OUT or delete the following copy task code snippet. -->
+               <!--<copy toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/bundleconfig" 
+                       failonerror="true"> <fileset dir="${basedir}/bundleconfig-csi" /> </copy> -->
+               <!-- End of CSI related bundleconfig copy task -->
+
+               <!-- NOTE: If you are NOT deploying to CSI environment, and you are NOT 
+                       using an AJSC_SHARED_CONFIG location on a node, you should go ahead and copy 
+                       EVERYTHING from bundleconfig and ajsc-shared-config (logback.xml) directory 
+                       to utilize proper logging from logback.xml. Simply, uncomment the following 
+                       code snippet below to copy EVERYTHING and comment out the CSI related build 
+                       script above. -->
+               <!-- NON-CSI related build copy task. Please, uncomment the following code 
+                       snippet to deploy the proper artifacts to a NON-CSI Env. -->
+               <copy
+                       toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/bundleconfig"
+                       failonerror="true">
+                       <fileset dir="${basedir}/bundleconfig-local" includes="**/**" />
+               </copy>
+               <copy
+                       toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/bundleconfig/etc"
+                       failonerror="true">
+                       <fileset dir="${basedir}/ajsc-shared-config/etc" includes="**/**" />
+               </copy>
+               <!-- End of NON-CSI related build copy task. -->
+
+               <!-- Copying any zips (deployment packages) to $AJSC_HOME/services for 
+                       auto-deployment -->
+               <copy
+                       toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/services"
+                       failonerror="false">
+                       <fileset dir="${basedir}/services" includes="*.zip" />
+               </copy>
+
+               <!-- Copying runtimeEnvironment zip file to $AJSC_HOME/runtime and renaming 
+                       runtimeEnvironment.zip for proper auto-deployment of ajsc services. 
+               <copy
+                       tofile="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/runtime/runtimeEnvironment.zip">
+                       <fileset dir="target" includes="*-runtimeEnvironment.zip" />
+               </copy>-->
+
+               <!-- Copying dependencies from the service project (not provided by AJSC 
+                       Container) to the $AJSC_HOME/extJars folder to be accessible on the classpath -->
+               <copy
+                       toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/extJars"
+                       failonerror="false">
+                       <fileset dir="target/userjars" includes="*" />
+               </copy>
+
+               <!-- extApps directory MUST be created for ajsc-runner to run correctly, 
+                       even if empty. DO NOT REMOVE!!! -->
+               <!-- extApps directory created to deploy other war files on startup or 
+                       hot deploy War files after ajsc starts up. -->
+               <mkdir
+                       dir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/extApps" />
+
+               <!-- Copying any extra wars to $AJSC_HOME/extApps to be deployed within 
+                       AJSC -->
+               <copy
+                       toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/extApps"
+                       failonerror="false">
+                       <fileset dir="${basedir}/src/main/resources/extApps"
+                               includes="*" />
+               </copy>
+
+               <!-- staticContent folder is for serving static content within an ajsc 
+                       service. Any static content to be served will be copyied to the ultimate 
+                       $AJSC_HOME/staticContent folder and can be served with the att-static-content 
+                       camel component. -->
+               <!-- Uncomment the following snippet to copy items from staticContent folder 
+                       to ultimate $AJSC_HOME/staticConent -->
+               <!-- <copy toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/staticContent" 
+                       failonerror="false"> <fileset dir="${basedir}/staticContent" includes="**/**" 
+                       /> </copy> -->
+
+               <!-- Copying extra jar files that have been labeled as dependencies in 
+                       service project to /extJars folder to be made available on the classpath 
+                       for your service -->
+               <copy
+                       toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/extJars"
+                       failonerror="false">
+                       <fileset dir="target" includes="*.jar" />
+               </copy>
+
+               <!-- Copying deployment packages created within the project to the $AJSC_HOME/services 
+                       folder to be auto deployed. -->
+               <copy
+                       toDir="${basedir}/target/swm/package/nix/dist_files${distFilesRoot}/services">
+                       <fileset dir="target" includes="*.zip" excludes="*-runtimeEnvironment.zip" />
+               </copy>
+
+               <echo message="EXITING 'prep_assembly_output_for_swm_plugin' ant tasks" />
+       </target>
+</project>
diff --git a/bundleconfig-local/etc/appprops/AAFUserRoles.properties b/bundleconfig-local/etc/appprops/AAFUserRoles.properties
new file mode 100644 (file)
index 0000000..adb7a10
--- /dev/null
@@ -0,0 +1,13 @@
+#Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+
+#If using AAF for Role based authentication/authorization, define your routes/services which will utilize AAF. The AJSC will
+#read this file and protect the routes given with the AAF role defined.
+
+#The following example would protect the JAXRS echo example service provided with the archetype.
+#/services/${namespace}/v1/jaxrs-services/jaxrsExample/echo/*=com.att.ajsc.myper|mymachine|manage
+
+#The following example would protect ALL AJSC services running within your project.
+#/**=com.att.ajsc.myperm|mymachine|manage
+
+#The following example would protect ALL REST services utilizing the Camel restlet routes.
+#/rest/**=com.att.ajsc.myperm|mymachine|manage
diff --git a/bundleconfig-local/etc/appprops/PostProcessorInterceptors.properties b/bundleconfig-local/etc/appprops/PostProcessorInterceptors.properties
new file mode 100644 (file)
index 0000000..08ffefa
--- /dev/null
@@ -0,0 +1,3 @@
+#Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+#This properties file is for defining any PostProcessorInterceptors that have been created for your AJSC service.
+
diff --git a/bundleconfig-local/etc/appprops/PreProcessorInterceptors.properties b/bundleconfig-local/etc/appprops/PreProcessorInterceptors.properties
new file mode 100644 (file)
index 0000000..1383071
--- /dev/null
@@ -0,0 +1,4 @@
+#Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+#This properties file is for defining any PreProcessorInterceptors that have been created for your AJSC service. 
+
+/**=com.att.ajsc.csi.restmethodmap.RestMethodMapInterceptor
diff --git a/bundleconfig-local/etc/appprops/app-intercepts.properties b/bundleconfig-local/etc/appprops/app-intercepts.properties
new file mode 100644 (file)
index 0000000..0d35b59
--- /dev/null
@@ -0,0 +1,8 @@
+#Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+
+#This is where all your application intercept strategies must be configured. AJSC reads this property file and adds
+#the list of intercepts specified here to the camel context. This can be useful for accessing every exchange object transferred from/to
+#each endpoint in the request/response flow and can allow for more precise debugging and/or processing of the exchange. 
+
+#e.g. 
+#intercepts=org.openecomp.data-router.JaxrsEchoService,packagename.class1name,packagename.class2name
diff --git a/bundleconfig-local/etc/appprops/methodMapper.properties b/bundleconfig-local/etc/appprops/methodMapper.properties
new file mode 100644 (file)
index 0000000..1825bd6
--- /dev/null
@@ -0,0 +1,46 @@
+//
+//Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+//     Json object holds the method mapping.Update the JSON object with the proper route to logical mapping based 
+//     on the example provided below : 
+//     "helloWorld"  = Service Name
+//     "method"   = http method
+//     "url" = the url component from the route
+//     "logicalName"=  When a combination of method and url from the route matches the json object , 
+//     the logical name is put in the http header as "x-CSI-ServiceName" and "x-CSI-MethodName" 
+//     "dme2url"= if provided it register the endpoint to GRM, it is optional. This is useful for JAX-RS services.
+  
+{
+    "helloWorld": [
+        {
+            "method": "get",
+            "url": "/rest/data-router/v1/helloWorld",
+            "logicalName": "GetMethod(Logical)"
+        },
+        {
+            "method": "get",
+            "url": "/services/data-router/v1/jaxrsExample/jaxrs-services/echo/{input}",
+            "logicalName": "GetJaxrsExampleEcho(Logical)",
+            "dme2url": "/services/data-router/v1/jaxrsExample/jaxrs-services/echo/{input}"
+        },
+        {
+            "method": "get",
+            "url": "/services/data-router/v1/jaxrsExample/jaxrs-services/property/{fileName}/{input}",
+            "logicalName": "GetJaxrsExampleProperty(Logical)",
+            "dme2url": "/services/data-router/v1/jaxrsExample/jaxrs-services/property/{fileName}/{input}"
+        }
+    ],
+            "errormessage":
+           [
+               {
+                       "method": "get",
+                       "url": "/services/data-router/v1/jaxrsExample/errormessage/emls",
+                       "logicalName": "setCAETHeaders(Logical)"
+               },
+               {
+                       "method": "get",
+                       "url": "/services/data-router/v1/errorMessageLookupService2",
+                       "logicalName": "setCAETHeaders(Logical)"
+               }        
+           
+           ]
+}
diff --git a/bundleconfig-local/etc/logback.xml b/bundleconfig-local/etc/logback.xml
new file mode 100644 (file)
index 0000000..228872e
--- /dev/null
@@ -0,0 +1,210 @@
+<configuration scan="true" scanPeriod="3 seconds" debug="false">
+  <!--<jmxConfigurator /> -->
+  <!-- directory path for all other type logs -->
+  
+  <property name="logDir"  value="${AJSC_HOME}/logs" />
+  
+  
+  <!--  specify the component name 
+       <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC"  -->
+  <property name="componentName" value="AAI-DR" />
+  
+  <!--  default eelf log file names -->
+  <property name="generalLogName" value="error" />
+  <property name="metricsLogName" value="metrics" />
+  <property name="auditLogName" value="audit" />
+  <property name="debugLogName" value="debug" />
+  
+  <property name="errorLogPattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%mdc{RequestId}|%thread|DataRouter|%mdc{PartnerName}|%logger||%.-5level|%msg%n" />
+  <property name="auditMetricPattern" value="%m%n" />
+
+  <property name="logDirectory" value="${logDir}/${componentName}" />
+  
+  <!-- Example evaluator filter applied against console appender -->
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>${errorLogPattern}</pattern>
+    </encoder>
+  </appender>
+
+  <!-- ============================================================================ -->
+  <!-- EELF Appenders -->
+  <!-- ============================================================================ -->
+  
+  <!-- The EELFAppender is used to record events to the general application 
+       log -->
+  
+  <appender name="EELF"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${generalLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${errorLogPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+    <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+      <level>INFO</level>
+    </filter>
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELF" />
+  </appender>
+
+  
+  <!-- EELF Audit Appender. This appender is used to record audit engine 
+       related logging events. The audit logger and appender are specializations 
+       of the EELF application root logger and appender. This can be used to segregate 
+       Policy engine events from other components, or it can be eliminated to record 
+       these events as part of the application root log. -->
+  
+  <appender name="EELFAudit"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${auditLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${auditMetricPattern}</pattern>
+    </encoder>
+  </appender>
+  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFAudit" />
+  </appender>
+  
+  <appender name="EELFMetrics"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${metricsLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - 
+           %msg%n"</pattern> -->
+      <pattern>${auditMetricPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  
+  <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFMetrics"/>
+  </appender>
+  
+  <appender name="EELFDebug"
+            class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${logDirectory}/${debugLogName}.log</file>
+    <rollingPolicy
+        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip
+      </fileNamePattern>
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${errorLogPattern}</pattern>
+    </encoder>
+  </appender>
+  
+  <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+    <queueSize>256</queueSize>
+    <appender-ref ref="EELFDebug" />
+    <includeCallerData>false</includeCallerData>
+  </appender>
+  
+  
+  <!-- ============================================================================ -->
+  <!--  EELF loggers -->
+  <!-- ============================================================================ -->
+  <logger name="com.att.eelf" level="info" additivity="false">
+    <appender-ref ref="asyncEELF" />
+    <appender-ref ref="asyncEELFDebug" />
+  </logger>
+
+  <logger name="com.att.eelf.security" level="info" additivity="false">
+    <appender-ref ref="asyncEELFSecurity" /> 
+  </logger>
+  <logger name="com.att.eelf.perf" level="info" additivity="false">
+    <appender-ref ref="asyncEELFPerformance" />
+  </logger>
+  <logger name="com.att.eelf.server" level="info" additivity="false">
+    <appender-ref ref="asyncEELFServer" />
+  </logger>
+  <logger name="com.att.eelf.policy" level="info" additivity="false">
+    <appender-ref ref="asyncEELFPolicy" />
+  </logger>
+  <logger name="com.att.eelf.audit" level="info" additivity="false">
+    <appender-ref ref="asyncEELFAudit" />
+  </logger>
+  <logger name="com.att.eelf.metrics" level="info" additivity="false">
+    <appender-ref ref="asyncEELFMetrics" />
+  </logger>
+  
+  <!-- Spring related loggers -->
+  <logger name="org.springframework" level="WARN" />
+  <logger name="org.springframework.beans" level="WARN" />
+  <logger name="org.springframework.web" level="WARN" />
+  <logger name="com.blog.spring.jms" level="WARN" />
+
+  <!-- AJSC Services (bootstrap services) -->
+  <logger name="ajsc" level="WARN" />
+  <logger name="ajsc.RouteMgmtService" level="WARN" />
+  <logger name="ajsc.ComputeService" level="WARN" />
+  <logger name="ajsc.VandelayService" level="WARN" />
+  <logger name="ajsc.FilePersistenceService" level="WARN" />
+  <logger name="ajsc.UserDefinedJarService" level="WARN" />
+  <logger name="ajsc.UserDefinedBeansDefService" level="WARN" />
+  <logger name="ajsc.LoggingConfigurationService" level="WARN" />
+  
+  <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet 
+       logging) -->
+  <logger name="ajsc.utils" level="WARN" />
+  <logger name="ajsc.utils.DME2Helper" level="WARN" />
+  <logger name="ajsc.filters" level="WARN" />
+  <logger name="ajsc.beans.interceptors" level="WARN" />
+  <logger name="ajsc.restlet" level="WARN" />
+  <logger name="ajsc.servlet" level="WARN" />
+  <logger name="com.att" level="INFO" />
+  <logger name="com.att.ajsc.csi.logging" level="WARN" />
+  <logger name="com.att.ajsc.filemonitor" level="WARN" />
+
+  <logger name="org.openecomp.datarouter" level="INFO" />
+
+  <!-- Other Loggers that may help troubleshoot -->
+  <logger name="net.sf" level="WARN" />
+  <logger name="org.apache.commons.httpclient" level="WARN" />
+  <logger name="org.apache.commons" level="WARN" />
+  <logger name="org.apache.coyote" level="WARN" />
+  <logger name="org.apache.jasper" level="WARN" />
+
+  <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging. 
+       May aid in troubleshooting) -->
+  <logger name="org.apache.camel" level="WARN" />
+  <logger name="org.apache.cxf" level="WARN" />
+  <logger name="org.apache.camel.processor.interceptor" level="WARN" />
+  <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" />
+  <logger name="org.apache.cxf.service" level="WARN" />
+  <logger name="org.restlet" level="WARN" />
+  <logger name="org.apache.camel.component.restlet" level="WARN" />
+
+  <!-- logback internals logging -->
+  <logger name="ch.qos.logback.classic" level="WARN" />
+  <logger name="ch.qos.logback.core" level="WARN" />
+
+  <root>
+    <appender-ref ref="asyncEELF" /> 
+    <!-- <appender-ref ref="asyncEELFDebug" /> -->
+  </root>
+  
+</configuration>
diff --git a/bundleconfig-local/etc/sysprops/sys-props.properties b/bundleconfig-local/etc/sysprops/sys-props.properties
new file mode 100644 (file)
index 0000000..39f4175
--- /dev/null
@@ -0,0 +1,115 @@
+#Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+#This file is used for defining AJSC system properties for different configuration schemes and is necessary for the AJSC to run properly.
+#The sys-props.properties file is used for running locally. The template.sys-props.properties file will be used when deployed
+#to a SOA/CSI Cloud node. 
+
+#AJSC System Properties. The following properties are required for ALL AJSC services. If you are adding System Properties for your
+#particular service, please add them AFTER all AJSC related System Properties. 
+
+#For Cadi Authorization, use value="authentication-scheme-1
+CadiAuthN=authentication-scheme-1
+
+#For Basic Authorization, use value="authentication-scheme-1
+authN=authentication-scheme-2
+
+#Persistence used for AJSC meta-data storage. For most environments, "file" should be used.
+ajscPersistence=file
+
+#For Direct Invocation to be enabled (values=true/false)
+directInvocationEnable=false
+
+# If using hawtio for local development, these properties will allow for faster server startup and usage for local development
+
+hawtio.authenticationEnabled=false
+hawtio.config.pullOnStartup=false
+
+#Removes the extraneous restlet console output
+org.restlet.engine.loggerFacadeClass=org.restlet.ext.slf4j.Slf4jLoggerFacade
+
+#server.host property to be enabled for local DME2 related testing
+#server.host=<Your network IP address> 
+
+#Enable/disable SSL (values=true/false). This property also determines which protocol to use (https if true, http otherwise), to register services into GRM through DME2.
+enableSSL=false
+
+
+#Enable/disable EJB Container
+ENABLE_EJB=false
+
+#Enable/disable OSGI
+isOSGIEnable=false
+
+#Generate/Skip api docs
+isApiDoc=false
+
+#CSI related variables for CSM framework
+csm.hostname=servername
+
+
+#SOA_CLOUD_ENV is used to register your service with dme2 and can be turned off for local development (values=true/false).
+SOA_CLOUD_ENV=false
+
+#CONTINUE_ON_LISTENER_EXCEPTION will exit the application if there is a DME2 exception at the time of registration.
+CONTINUE_ON_LISTENER_EXCEPTION=false
+
+#Jetty Container ThreadCount Configuration Variables
+AJSC_JETTY_ThreadCount_MIN=1
+AJSC_JETTY_ThreadCount_MAX=200
+AJSC_JETTY_IDLETIME_MAX=3000
+
+#Camel Context level default threadPool Profile configuration
+CAMEL_POOL_SIZE=10
+CAMEL_MAX_POOL_SIZE=20
+CAMEL_KEEP_ALIVE_TIME=60
+CAMEL_MAX_QUEUE_SIZE=1000
+
+#GRM/DME2 System Properties
+AFT_DME2_CONN_IDLE_TIMEOUTMS=5000
+AJSC_ENV=SOACLOUD
+
+SOACLOUD_NAMESPACE=com.att.ajsc
+SOACLOUD_ENV_CONTEXT=DEV
+SOACLOUD_PROTOCOL=http
+SOACLOUD_ROUTE_OFFER=DEFAULT
+
+AFT_LATITUDE=23.4
+AFT_LONGITUDE=33.6
+AFT_ENVIRONMENT=AFTUAT
+
+#Restlet Component Default Properties
+RESTLET_COMPONENT_CONTROLLER_DAEMON=true
+RESTLET_COMPONENT_CONTROLLER_SLEEP_TIME_MS=100
+RESTLET_COMPONENT_INBOUND_BUFFER_SIZE=8192
+RESTLET_COMPONENT_MIN_THREADS=1
+RESTLET_COMPONENT_MAX_THREADS=10
+RESTLET_COMPONENT_LOW_THREADS=8
+RESTLET_COMPONENT_MAX_QUEUED=0
+RESTLET_COMPONENT_MAX_CONNECTIONS_PER_HOST=-1
+RESTLET_COMPONENT_MAX_TOTAL_CONNECTIONS=-1
+RESTLET_COMPONENT_OUTBOUND_BUFFER_SIZE=8192
+RESTLET_COMPONENT_PERSISTING_CONNECTIONS=true
+RESTLET_COMPONENT_PIPELINING_CONNECTIONS=false
+RESTLET_COMPONENT_THREAD_MAX_IDLE_TIME_MS=60000
+RESTLET_COMPONENT_USE_FORWARDED_HEADER=false
+RESTLET_COMPONENT_REUSE_ADDRESS=true
+
+#Externalized jar and properties file location. In CSI environments, there are a few libs that have been externalized to aid
+#in CSTEM maintenance of the versions of these libs. The most important to the AJSC is the DME2 lib. Not only is this lib necessary
+#for proper registration of your AJSC service on a node, but it is also necessary for running locally as well. Another framework
+#used in CSI envs is the CSM framework. These 2 framework libs are shown as "provided" dependencies within the pom.xml. These
+#dependencies will be copied into the target/commonLibs folder with the normal "mvn clean package" goal of the AJSC. They will
+#then be added to the classpath via AJSC_EXTERNAL_LIB_FOLDERS system property. Any files (mainly property files) that need
+#to be on the classpath should be added to the AJSC_EXTERNAL_PROPERTIES_FOLDERS system property. The default scenario when 
+#testing your AJSC service locally will utilize the target/commonLibs directory for DME2 and CSM related artifacts and 2 
+#default csm properties files will be used for local testing with anything CSM knorelated.
+#NOTE: we are using maven-replacer-plugin to replace "(doubleUnderscore)basedir(doubleUnderscore)" with ${basedir} within the 
+#target directory for running locally. Multiple folder locations can be separated by the pipe ("|") character.
+#Please, NOTE: for running locally, we are setting this system property in the antBuild/build.xml "runLocal" target and in the 
+#"runAjsc" profile within the pom.xml. This is to most effectively use maven variables (${basedir}, most specifically. Therefore,
+#when running locally, the following 2 properties should be set within the profile(s) themselves. 
+#Example: target/commonLibs|target/otherLibs
+#AJSC_EXTERNAL_LIB_FOLDERS=__basedir__/target/commonLibs
+#AJSC_EXTERNAL_PROPERTIES_FOLDERS=__basedir__/ajsc-shared-config/etc
+#End of AJSC System Properties
+
+#Service System Properties. Please, place any Service related System Properties below.
diff --git a/pom.xml b/pom.xml
new file mode 100644 (file)
index 0000000..09f86c3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,327 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+
+       <parent>
+               <artifactId>ajsc-archetype-parent</artifactId>
+               <groupId>com.att.ajsc</groupId>
+               <version>2.0.0</version>
+       </parent>
+       <groupId>org.openecomp.aai</groupId>
+       <artifactId>data-router</artifactId>
+       <version>1.0.0-SNAPSHOT</version>
+
+       <properties>
+               <module.ajsc.namespace.name>data-router</module.ajsc.namespace.name>
+               <module.ajsc.namespace.version>v1</module.ajsc.namespace.version>
+               <ajscRuntimeVersion>2.0.0</ajscRuntimeVersion>
+               <absoluteDistFilesRoot>/appl/${project.artifactId}</absoluteDistFilesRoot>
+
+               <!-- For NO Versioning, REMOVE the /${project.version} from the <distFilesRoot>
+                       property, below. PLEASE, NOTE: If your ${project.version} is a "-SNAPSHOT"
+                       version, THIS will be used as your directory structure. If you do NOT want
+                       this, simply remove the "-SNAPSHOT" from your <version> declaration at the
+                       top of pom.xml -->
+               <distFilesRoot>/appl/${project.artifactId}/${project.version}</distFilesRoot>
+               <runAjscHome>${basedir}/target/swm/package/nix/dist_files${distFilesRoot}</runAjscHome>
+
+               <!-- For SOA Cloud Installation -->
+               <installOwnerUser>aaiadmin</installOwnerUser>
+               <installOwnerGroup>aaiadmin</installOwnerGroup>
+               <ownerManagementGroup>com.att.csid.lab</ownerManagementGroup>
+
+               <!-- Port Selection. A value of 0 will allow for dynamic port selection.
+                       For local testing, you may choose to hardcode this value to something like
+                       8080 -->
+               <serverPort>0</serverPort>
+               <sslport>9502</sslport>
+
+               <testRouteOffer>workstation</testRouteOffer>
+               <testEnv>DEV</testEnv>
+               <checkstyle.config.location>google_checks.xml</checkstyle.config.location>
+       </properties>
+
+       <dependencies>
+
+               <dependency>
+                       <groupId>dom4j</groupId>
+                       <artifactId>dom4j</artifactId>
+                       <version>1.6.1</version>
+                       <scope>provided</scope>
+               </dependency>
+
+               <dependency>
+                       <groupId>com.att.aft</groupId>
+                       <artifactId>dme2</artifactId>
+                       <version>3.1.200</version>
+                       <scope>provided</scope>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.openecomp</groupId>
+                       <artifactId>router-core</artifactId>
+                       <version>1.0.0-SNAPSHOT</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.json</groupId>
+                       <artifactId>json</artifactId>
+               </dependency>
+
+                <dependency>
+                        <groupId>com.google.code.gson</groupId>
+                        <artifactId>gson</artifactId>
+                        <version>2.6.2</version>
+                </dependency>
+
+                <dependency>
+                       <groupId>org.eclipse.persistence</groupId>
+                       <artifactId>eclipselink</artifactId>
+                       <version>2.6.2</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.openecomp.aai.logging-service</groupId>
+                       <artifactId>common-logging</artifactId>
+                       <version>1.0.0</version>
+               </dependency>
+
+                <dependency>
+                        <groupId>org.openecomp.aai</groupId>
+                        <artifactId>rest-client</artifactId>
+                        <version>1.0.0-SNAPSHOT</version>
+                </dependency>
+
+               <dependency>
+                       <groupId>ch.qos.logback</groupId>
+                       <artifactId>logback-core</artifactId>
+                       <version>1.1.7</version>
+               </dependency>
+
+       </dependencies>
+
+       <build>
+               <plugins>
+               <!-- Checkstyle plugin - used to report on compliance with -->
+               <!-- the Google style guide. -->
+               <plugin>
+                       <groupId>org.apache.maven.plugins</groupId>
+                       <artifactId>maven-site-plugin</artifactId>
+                       <version>3.3</version>
+                       <configuration>
+                               <reportPlugins>
+                                       <plugin>
+                                               <groupId>org.apache.maven.plugins</groupId>
+                                               <artifactId>maven-checkstyle-plugin</artifactId>
+                                               <version>2.17</version>
+                                               <reportSets>
+                                                       <reportSet>
+                                                               <reports>
+                                                                  <report>checkstyle</report>
+                                                               </reports>
+                                                       </reportSet>
+                                               </reportSets>
+                                       </plugin>
+                               </reportPlugins>
+                       </configuration>
+               </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-resources-plugin</artifactId>
+                               <version>2.7</version>
+                               <executions>
+                                       <execution>
+                                               <id>copy-docker-file</id>
+                                               <phase>package</phase>
+                                               <goals>
+                                                       <goal>copy-resources</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <outputDirectory>target</outputDirectory>
+                                                       <overwrite>true</overwrite>
+                                                       <resources>
+                                                               <resource>
+                                                                       <directory>${basedir}/src/main/docker</directory>
+                                                                       <filtering>true</filtering>
+                                                                       <includes>
+                                                                               <include>**/*</include>
+                                                                       </includes>
+                                                               </resource>
+                                                               <resource>
+                                                                       <directory>${basedir}/src/main/bin/</directory>
+                                                               </resource>
+                                                       </resources>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <!-- license plugin -->
+                       <plugin>
+                               <groupId>com.mycila</groupId>
+                               <artifactId>license-maven-plugin</artifactId>
+                               <version>3.0</version>
+                               <configuration>
+                                       <header>License.txt</header>
+                                       <includes>
+                                               <include>src/main/java/**</include>
+                                       </includes>
+                               </configuration>
+                               <executions>
+                                       <execution>
+                                               <goals>
+                                                       <goal>format</goal>
+                                               </goals>
+                                               <phase>process-sources</phase>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+       </build>
+
+       <profiles>
+               <profile>
+                       <id>runAjsc</id>
+                       <build>
+                               <defaultGoal>initialize</defaultGoal>
+                               <plugins>
+                                       <plugin>
+                                               <groupId>org.codehaus.mojo</groupId>
+                                               <artifactId>exec-maven-plugin</artifactId>
+                                               <version>1.3.2</version>
+                                               <executions>
+                                                       <execution>
+                                                               <phase>initialize</phase>
+                                                               <goals>
+                                                                       <goal>java</goal>
+                                                               </goals>
+                                                               <configuration>
+                                                                       <includeProjectDependencies>false</includeProjectDependencies>
+                                                                       <includePluginDependencies>true</includePluginDependencies>
+                                                                       <executable>java</executable>
+                                                                       <mainClass>com.att.ajsc.runner.Runner</mainClass>
+                                                                       <executableDependency>
+                                                                               <groupId>com.att.ajsc</groupId>
+                                                                               <artifactId>ajsc-runner</artifactId>
+                                                                       </executableDependency>
+                                                                       <additionalClasspathElements>
+                                                                               <additionalClasspathElement>${basedir}/ajsc-shared-config/etc</additionalClasspathElement>
+                                                                       </additionalClasspathElements>
+
+                                                                       <environmentVariables>
+                                                                               <AJSC_HOME>${runAjscHome}</AJSC_HOME>
+                                                                       </environmentVariables>
+
+                                                                       <!-- Main AJSC System Properties below (necessary for proper startup) -->
+                                                                       <systemProperties>
+                                                                               <systemProperty>
+                                                                                       <key>AJSC_HOME</key>
+                                                                                       <value>${runAjscHome}</value>
+                                                                               </systemProperty>
+
+                                                                               <systemProperty>
+                                                                                       <key>CONFIG_HOME</key>
+                                                                                       <value>${basedir}/appconfig-local/</value>
+                                                                               </systemProperty>
+
+                                                                               <systemProperty>
+                                                                                       <key>AJSC_CONF_HOME</key>
+                                                                                       <value>${basedir}/bundleconfig-local</value>
+                                                                               </systemProperty>
+                                                                               <systemProperty>
+                                                                                       <key>logback.configurationFile</key>
+                                                                                       <value>${basedir}/ajsc-shared-config/etc/logback.xml</value>
+                                                                               </systemProperty>
+                                                                               <systemProperty>
+                                                                                       <key>AJSC_SHARED_CONFIG</key>
+                                                                                       <value>${basedir}/ajsc-shared-config</value>
+                                                                               </systemProperty>
+
+                                                                               <sysproperty>
+                                                                                       <key>AJSC_EXTERNAL_LIB_FOLDERS</key>
+                                                                                       <value>${basedir}/target/commonLibs</value>
+                                                                               </sysproperty>
+                                                                               <sysproperty>
+                                                                                       <key>AJSC_EXTERNAL_PROPERTIES_FOLDERS</key>
+                                                                                       <value>${basedir}/ajsc-shared-config/etc</value>
+                                                                               </sysproperty>
+
+                                                                               <systemProperty>
+                                                                                       <key>AJSC_SERVICE_NAMESPACE</key>
+                                                                                       <value>${module.ajsc.namespace.name}</value>
+                                                                               </systemProperty>
+                                                                               <systemProperty>
+                                                                                       <key>AJSC_SERVICE_VERSION</key>
+                                                                                       <value>${module.ajsc.namespace.version}</value>
+                                                                               </systemProperty>
+                                                                               <systemProperty>
+                                                                                       <key>SOACLOUD_SERVICE_VERSION</key>
+                                                                                       <value>${project.version}</value>
+                                                                               </systemProperty>
+                                                                               <systemProperty>
+                                                                                       <key>server.port</key>
+                                                                                       <value>${serverPort}</value>
+                                                                               </systemProperty>
+                                                                       </systemProperties>
+
+                                                                       <!-- Command Line Arguments to add to the java command. Here, you
+                                                                               can specify the port as well as the Context you want your service to run
+                                                                               in. Use context=/ to run in an unnamed Context (Root Context). The default
+                                                                               configuration of the AJSC is to run under the / Context. Setting the port
+                                                                               here can aid during the development phase of your service. However, you can
+                                                                               leave this argument out entirely, and the AJSC will default to using an Ephemeral
+                                                                               port. -->
+                                                                       <arguments>
+                                                                               <argument>context=/</argument>
+                                                                               <argument>port=${serverPort}</argument>
+                                                                               <argument>sslport=${sslport}</argument>
+                                                                       </arguments>
+                                                               </configuration>
+                                                       </execution>
+                                               </executions>
+                                               <configuration>
+                                                       <executable>java</executable>
+                                               </configuration>
+                                               <dependencies>
+                                                       <dependency>
+                                                               <groupId>com.att.ajsc</groupId>
+                                                               <artifactId>ajsc-runner</artifactId>
+                                                               <version>${ajscRuntimeVersion}</version>
+                                                       </dependency>
+                                               </dependencies>
+                                       </plugin>
+                               </plugins>
+                       </build>
+               </profile>
+       </profiles>
+       <dependencyManagement>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.apache.httpcomponents</groupId>
+                               <artifactId>httpclient</artifactId>
+                               <version>4.5</version>
+                       </dependency>
+                       <dependency>
+                               <groupId>org.apache.httpcomponents</groupId>
+                               <artifactId>httpcore</artifactId>
+                               <version>4.4.1</version>
+                       </dependency>
+                       <dependency>
+                               <groupId>org.json</groupId>
+                               <artifactId>json</artifactId>
+                               <version>20131018</version>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
+       <distributionManagement>
+        <repository>
+            <id>ecomp-releases</id>
+            <name>ECOMP Release Repository</name>
+            <url>${nexusproxy}/content/repositories/releases/</url>
+        </repository>
+        <snapshotRepository>
+            <id>ecomp-snapshots</id>
+            <name>ECOMP Snapshot Repository</name>
+            <url>${nexusproxy}/content/repositories/snapshots/</url>
+        </snapshotRepository>
+    </distributionManagement>
+</project>
diff --git a/src/main/ajsc/data-router_v1/data-router/v1/conf/echoService.groovy b/src/main/ajsc/data-router_v1/data-router/v1/conf/echoService.groovy
new file mode 100644 (file)
index 0000000..ad7670e
--- /dev/null
@@ -0,0 +1,12 @@
+beans{
+       xmlns cxf: "http://camel.apache.org/schema/cxf"
+       xmlns jaxrs: "http://cxf.apache.org/jaxrs"
+       xmlns util: "http://www.springframework.org/schema/util"
+       
+       echoService(org.openecomp.datarouter.service.EchoService)
+
+       
+       util.list(id: 'echoServices') { 
+               ref(bean:'echoService')
+       }
+}
diff --git a/src/main/ajsc/data-router_v1/data-router/v1/docs/README.txt b/src/main/ajsc/data-router_v1/data-router/v1/docs/README.txt
new file mode 100644 (file)
index 0000000..3707179
--- /dev/null
@@ -0,0 +1 @@
+Place any docs here that you want to access within the ajsc upon deployment of your service.
diff --git a/src/main/ajsc/data-router_v1/data-router/v1/lib/README.txt b/src/main/ajsc/data-router_v1/data-router/v1/lib/README.txt
new file mode 100644 (file)
index 0000000..639e21b
--- /dev/null
@@ -0,0 +1 @@
+3rd party JAR's needed by your jars (if any) for a ajsc deployment package go here...
\ No newline at end of file
diff --git a/src/main/ajsc/data-router_v1/data-router/v1/props/module.props b/src/main/ajsc/data-router_v1/data-router/v1/props/module.props
new file mode 100644 (file)
index 0000000..17ebc08
--- /dev/null
@@ -0,0 +1 @@
+EXAMPLE.PROPERTY=EXAMLE_VALUE
\ No newline at end of file
diff --git a/src/main/ajsc/data-router_v1/data-router/v1/routes/echoService.route b/src/main/ajsc/data-router_v1/data-router/v1/routes/echoService.route
new file mode 100644 (file)
index 0000000..b81cbbd
--- /dev/null
@@ -0,0 +1,5 @@
+<route xmlns="http://camel.apache.org/schema/spring" trace="true">
+  <from uri="att-dme2-servlet:///__module_ajsc_namespace_name__/__module_ajsc_namespace_version__/echo-service/?matchOnUriPrefix=true" />
+  <to uri="cxfbean:echoServices" />
+</route>
+
diff --git a/src/main/assemble/ajsc_module_assembly.xml b/src/main/assemble/ajsc_module_assembly.xml
new file mode 100644 (file)
index 0000000..4ec4e28
--- /dev/null
@@ -0,0 +1,66 @@
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+       <id>${version}</id>
+       <includeBaseDirectory>false</includeBaseDirectory>
+       <formats>
+               <format>zip</format>
+       </formats>
+       <fileSets>
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-ajsc/routes/</directory>
+                       <outputDirectory>${module.ajsc.namespace.name}/${module.ajsc.namespace.version}/routes/</outputDirectory>
+                       <includes>
+                               <include>*.route</include>
+                       </includes>
+
+               </fileSet>
+
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-ajsc/docs/</directory>
+                       <outputDirectory>${module.ajsc.namespace.name}/${module.ajsc.namespace.version}/docs/</outputDirectory>
+                       <includes>
+                               <include>*.*</include>
+                               <!-- <include>*.vm</include>  -->
+                       </includes>
+
+               </fileSet>
+
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-ajsc/lib/</directory>
+                       <outputDirectory>${module.ajsc.namespace.name}/${module.ajsc.namespace.version}/lib/</outputDirectory>
+                       <includes>
+                               <include>*.jar</include>
+                       </includes>
+
+               </fileSet>
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-ajsc/extJars/</directory>
+                       <outputDirectory>${module.ajsc.namespace.name}/${module.ajsc.namespace.version}/extJars/</outputDirectory>
+                       <includes>
+                               <include>*.jar</include>
+                       </includes>
+               </fileSet>
+               
+               <!-- also try to grab outputs from the "jar" plugin's package phase -->
+               <fileSet>
+                       <directory>${project.basedir}/target/</directory>
+                       <outputDirectory>${module.ajsc.namespace.name}/${module.ajsc.namespace.version}/lib/</outputDirectory>
+                       <includes>
+                               <include>*.jar</include>
+                       </includes>
+               </fileSet>
+
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-ajsc/conf/</directory>
+                       <outputDirectory>${module.ajsc.namespace.name}/${module.ajsc.namespace.version}/conf/</outputDirectory>
+                       <includes>
+                               <include>*.*</include>
+                       </includes>
+
+               </fileSet>
+       </fileSets>
+
+</assembly>
+
diff --git a/src/main/assemble/ajsc_props_assembly.xml b/src/main/assemble/ajsc_props_assembly.xml
new file mode 100644 (file)
index 0000000..5b8a6fa
--- /dev/null
@@ -0,0 +1,23 @@
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+       <id>${version}_properties</id>
+       <includeBaseDirectory>false</includeBaseDirectory>
+       <formats>
+               <format>zip</format>
+       </formats>
+       <fileSets>
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-ajsc/props</directory>
+                       <outputDirectory>${module.ajsc.namespace.name}/${module.ajsc.namespace.version}/props/</outputDirectory>
+                       <includes>
+                               <include>*.props</include>
+                       </includes>
+
+               </fileSet>
+
+       </fileSets>
+
+</assembly>
+
diff --git a/src/main/assemble/ajsc_runtime_assembly.xml b/src/main/assemble/ajsc_runtime_assembly.xml
new file mode 100644 (file)
index 0000000..e37d366
--- /dev/null
@@ -0,0 +1,44 @@
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+       <id>runtimeEnvironment</id>
+       <includeBaseDirectory>false</includeBaseDirectory>
+       <formats>
+               <format>zip</format>
+       </formats>
+       <fileSets>
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-runtime/context/</directory>
+                       <outputDirectory>runtime/context/</outputDirectory>
+                       <includes>
+                               <include>*.context</include>
+                       </includes>
+               </fileSet>
+               <fileSet>
+                       <directory>${project.basedir}/target/versioned-runtime/serviceProperties/</directory>
+                       <outputDirectory>runtime/serviceProperties/</outputDirectory>
+                       <includes>
+                               <include>*.props</include>
+                       </includes>
+               </fileSet><fileSet>
+                       <directory>${project.basedir}/target/versioned-runtime/shiroRole</directory>
+                       <outputDirectory>runtime/shiroRole/</outputDirectory>
+                       <includes>
+                               <include>*.json</include>
+                       </includes>
+               </fileSet><fileSet>
+                       <directory>${project.basedir}/target/versioned-runtime/shiroUser</directory>
+                       <outputDirectory>runtime/shiroUser/</outputDirectory>
+                       <includes>
+                               <include>*.json</include>
+                       </includes>
+               </fileSet><fileSet>
+                       <directory>${project.basedir}/target/versioned-runtime/shiroUserRole</directory>
+                       <outputDirectory>runtime/shiroUserRole</outputDirectory>
+                       <includes>
+                               <include>*.json</include>
+                       </includes>
+               </fileSet>
+       </fileSets>
+</assembly>
\ No newline at end of file
diff --git a/src/main/config/ajsc-chef.jks b/src/main/config/ajsc-chef.jks
new file mode 100644 (file)
index 0000000..aeca770
Binary files /dev/null and b/src/main/config/ajsc-chef.jks differ
diff --git a/src/main/config/ajsc-jetty.xml b/src/main/config/ajsc-jetty.xml
new file mode 100644 (file)
index 0000000..9d597f0
--- /dev/null
@@ -0,0 +1,114 @@
+<?xml version="1.0"  encoding="UTF-8"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!-- Copyright (c) 2016 AT&T Intellectual Property. All rights reserved. -->
+<Configure id="ajsc-server" class="org.eclipse.jetty.server.Server">
+       <!-- DO NOT REMOVE!!!! This is setting up the AJSC Context -->
+       <New id="ajscContext" class="org.eclipse.jetty.webapp.WebAppContext">
+               <Set name="contextPath"><SystemProperty name="AJSC_CONTEXT_PATH" /></Set>
+               <Set name="extractWAR">true</Set>
+               <Set name="tempDirectory"><SystemProperty name="AJSC_TEMP_DIR" /></Set>
+               <Set name="war"><SystemProperty name="AJSC_WAR_PATH" /></Set>
+               <Set name="descriptor"><SystemProperty name="AJSC_HOME" />/etc/runner-web.xml</Set>
+               <Set name="overrideDescriptor"><SystemProperty name="AJSC_HOME" />/etc/ajsc-override-web.xml</Set>
+               <Set name="throwUnavailableOnStartupException">true</Set>
+               <Set name="servletHandler">
+                       <New class="org.eclipse.jetty.servlet.ServletHandler">
+                               <Set name="startWithUnavailable">false</Set>
+                       </New>
+               </Set>
+               <Set name="extraClasspath"><SystemProperty name="AJSC_HOME" />/extJars/json-20131018.jar</Set>
+       </New>
+
+       <Set name="handler">
+               <New id="Contexts"
+                       class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
+                       <Set name="Handlers">
+                               <Array type="org.eclipse.jetty.webapp.WebAppContext">
+                                       <Item>
+                                               <Ref refid="ajscContext" />
+                                       </Item>
+                               </Array>
+                       </Set>
+               </New>
+       </Set>
+
+       <Call name="addBean">
+               <Arg>
+                       <New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager">
+                               <Set name="contexts">
+                                       <Ref refid="Contexts" />
+                               </Set>
+                               <Call id="extAppHotDeployProvider" name="addAppProvider">
+                                       <Arg>
+                                               <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">
+                                                       <Set name="monitoredDirName"><SystemProperty name="AJSC_HOME" />/extApps</Set>
+                                                       <Set name="scanInterval">10</Set>
+                                                       <Set name="extractWars">true</Set>
+                                               </New>
+                                       </Arg>
+                               </Call>
+                       </New>
+               </Arg>
+       </Call>
+
+       <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
+               <Set name="keyStorePath">file:<SystemProperty name="CONFIG_HOME" />/auth/tomcat_keystore</Set>
+               <Set name="KeyStorePassword">
+                       <Call class="org.eclipse.jetty.util.security.Password" name="deobfuscate">
+                               <Arg><SystemProperty name="KEY_STORE_PASSWORD" /></Arg>
+                       </Call>
+               </Set>
+               <Set name="KeyManagerPassword">
+                       <Call class="org.eclipse.jetty.util.security.Password" name="deobfuscate">
+                               <Arg><SystemProperty name="KEY_MANAGER_PASSWORD" /></Arg>
+                       </Call>
+               </Set>
+               <Set name="needClientAuth">true</Set>
+               <Set name="wantClientAuth">true</Set>
+       </New>
+
+       <Call id="sslConnector" name="addConnector">
+               <Arg>
+                       <New class="org.eclipse.jetty.server.ServerConnector">
+                               <Arg name="server">
+                                       <Ref refid="ajsc-server" />
+                               </Arg>
+                               <Arg name="factories">
+                                       <Array type="org.eclipse.jetty.server.ConnectionFactory">
+                                               <Item>
+                                                       <New class="org.eclipse.jetty.server.SslConnectionFactory">
+                                                               <Arg name="next">http/1.1</Arg>
+                                                               <Arg name="sslContextFactory">
+                                                                       <Ref refid="sslContextFactory" />
+                                                               </Arg>
+                                                       </New>
+                                               </Item>
+                                               <Item>
+                                                       <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                                                               <Arg name="config">
+                                                                       <New class="org.eclipse.jetty.server.HttpConfiguration">
+                                                                               <Call name="addCustomizer">
+                                                                                       <Arg>
+                                                                                               <New class="org.eclipse.jetty.server.SecureRequestCustomizer" />
+                                                                                       </Arg>
+                                                                               </Call>
+                                                                       </New>
+                                                               </Arg>
+                                                       </New>
+                                               </Item>
+                                       </Array>
+                               </Arg>
+                               <Set name="port"><SystemProperty name="AJSC_HTTPS_PORT" default="9502" /></Set>
+                               <Set name="idleTimeout">30000</Set>
+                       </New>
+               </Arg>
+       </Call>
+
+       <Get name="ThreadPool">
+               <Set name="minThreads"><SystemProperty name="AJSC_JETTY_ThreadCount_MIN" /></Set>
+               <Set name="maxThreads"><SystemProperty name="AJSC_JETTY_ThreadCount_MAX" /></Set>
+               <Set name="idleTimeout"><SystemProperty name="AJSC_JETTY_IDLETIME_MAX" /></Set>
+               <Set name="detailedDump">false</Set>
+       </Get>
+
+</Configure>
diff --git a/src/main/config/ajsc-override-web.xml b/src/main/config/ajsc-override-web.xml
new file mode 100644 (file)
index 0000000..f6d69ea
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- 
+ Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+       metadata-complete="false" version="3.0">
+
+       <filter-mapping>
+               <filter-name>InterceptorFilter</filter-name>
+               <url-pattern>/services/*</url-pattern>
+       </filter-mapping> 
+       <filter-mapping>
+               <filter-name>InterceptorFilter</filter-name>
+               <url-pattern>/rest/*</url-pattern>
+       </filter-mapping>  
+
+       <filter-mapping>
+               <filter-name>springSecurityFilterChain</filter-name>
+               <url-pattern>/*</url-pattern>
+       </filter-mapping>
+               
+       <servlet-mapping>
+               <servlet-name>ManagementServlet</servlet-name>
+               <url-pattern>/mgmt</url-pattern>
+       </servlet-mapping>
+        
+        <servlet-mapping>
+                       <servlet-name>RestletServlet</servlet-name>
+                       <url-pattern>/rest/*</url-pattern>
+       </servlet-mapping>
+
+       <servlet-mapping>
+               <servlet-name>CamelServlet</servlet-name>
+               <url-pattern>/*</url-pattern>
+       </servlet-mapping>
+
+       
+</web-app>
\ No newline at end of file
diff --git a/src/main/config/ajscJetty.jks b/src/main/config/ajscJetty.jks
new file mode 100644 (file)
index 0000000..48cdbff
Binary files /dev/null and b/src/main/config/ajscJetty.jks differ
diff --git a/src/main/config/cadi.properties b/src/main/config/cadi.properties
new file mode 100644 (file)
index 0000000..a1d56d6
--- /dev/null
@@ -0,0 +1,36 @@
+#This properties file is used for defining AAF properties related to the CADI framework. This file is used for running AAF framework
+
+#In order to test functionality of cadi-ajsc-plugin locally cross domain cookie. Cadi "should" find your hostname for you. 
+#However, we have seen some situations where this fails. A Local testing
+#modification can include modifying your hosts file so that you can use "mywebserver.att.com" for your localhost in order
+#to test/verify GLO functionality locally. If you are on a Windows machine, you will already have a machine name associated with 
+#it that will utilize an AT&T domain such as "sbc.com". You may need to add your  domain to this as a comma separated list depending
+#upon your particular machine domain. This property is commented out as cadi SHOULD find your machine name. With version 1.2.1 of cadi, 
+#it appears to resolve Mac machine names as well, now. But, this can be somewhat inconsistent depending on your specific working envrironment.
+hostname=mywebserver.att.com
+
+#Setting csp_domain to PROD will allow for testing using your attuid and password through GLO.
+csp_domain=PROD
+csp_devl_localhost=true
+
+basic_realm=csp.att.com
+#basic_realm=aaf.att.com
+basic_warn=TRUE
+
+cadi_loglevel=WARN
+cadi_keyfile=target/swm/package/nix/dist_files/appl/data-router/etc/keyfile
+
+# Configure AAF
+#These are dummy values add appropriate values required
+aaf_url=url
+
+#AJSC - MECHID
+#These are dummy values add appropriate values required
+aaf_id=dummyid@ajsc.att.com
+aaf_password=enc:277edqJCjT0RlUI3BtbDQa-3Ha-CQGd
+aaf_timeout=5000
+aaf_clean_interval=30000
+aaf_user_expires=5000
+aaf_high_count=1000
+
+
diff --git a/src/main/config/jul-redirect.properties b/src/main/config/jul-redirect.properties
new file mode 100644 (file)
index 0000000..8b6624d
--- /dev/null
@@ -0,0 +1,13 @@
+
+#      Bridge JUL->slf4j Logging Configuration File
+#
+# This file bridges the JUL logging infrastructure into
+# SLF4J so JUL logs go to logback implementation provided
+# in this project.  SLF4J also captures log4j and has 
+# other framework options as well providing a common
+# logging infrastructure for capturing all logs from different
+# libraries using different frameworks in one place.
+
+#      Global properties
+handlers=org.slf4j.bridge.SLF4JBridgeHandler
+.level= ALL
diff --git a/src/main/config/keyfile b/src/main/config/keyfile
new file mode 100644 (file)
index 0000000..882e86a
--- /dev/null
@@ -0,0 +1,27 @@
+ZuIwp0TkyVPDeX1Up-8JtkMWvjsCpoiu1_VKeWrtrvxunvAke8_tiFyHPPyb2nkhepFYj6tXzpfS
+rGz5XF_TH9NbsKaP8u0HV5clz2WriYQRvHS85vjY7hXxkpFuLb7zkLAPqTyIDpj7FiW61NzsRUAq
+TM8jH16jr7mBNnb56w24mNGOwznMPcIZKcjgZU1ekaPDFpWyhQElU7Y0q_94P_Gkk45r66Hj22sU
+OiOaaftmudZlswLw8-8Zaakqf2yW9HjMVfuYCwSodBHCW5rdB3Ctb5W36rnD_AQco3Ky2PgPmqvk
+QkJYuUHpbuDqVHqLOajlKSIGMTIqAIBg51fRaaONtD-Q5xzY8E5wO1YWTLKcP5tsNvUpzM8Wu3NS
+ynpGpUcvlTqWWsGzTbzOyamyKkdNdx97sSqjM25Zh1-ps48h6cddGYWpab7SUvqRCS11QBUyLTry
+2iwTEHMhHRIbo7PO99ALQfuq9gI1zKGfurJdvLBeBaFs5SCF0AiCZ3WcDO8Rv3HpxVZ2_ShbDxb0
+eMoO6SotXu51fj8Y3-WqsfZziQyEsHyqpg5uQ6yUtz01h5YHLEoVuotF1U4agmQR6kEkYk-wNOiZ
+v-8gaA9gtbLoAdKhuKFxQgQLNMf6GzVzZNujbmDzLoZAP_mXAv29aBPaf64Ugzv-Oa5GZdBgD-Xd
+_pahML-ionw99r0TnkpShYmDqMKhMdjaP3m87WIAZkIB-L-VTyKcEsJ4340VSzCOsv3waiM0S89u
+4cMcG5y-PLY8IoipIlLUPTWD3SjcQ9DV1Dt3T5KjdWLsj48D3W4K4e9PB8yxs0gtUjgVUR2_xEir
+G5eDO9Ac1eHFWGDFFP0SgG-TbHJUKlvy9mwLzmU0fC3xPjhqmIr-v0HxF7HN-tmb1LHDorno8tSN
+u7kUGcKSchIiFfvkd066crUb2mH7PnXTaWmAjyVj9VsBExFUYEdpHMAV4sAP9-RxZGDRt46UhrDK
+QZvvNhBVyOEjHPHWI4vl1r1v8HNH1_2jZu5DVJWyHWR56aCo1lhFH9_X6UAHUHbnXViDONZOVXlT
+9-WD0tk2zJGuwrhdZDAnPnAmjfwbwbpnr5Hmex1i1JiD7WVyP1kbfoej2TmdiYbxr9oBYaGQ29JI
+aHod7MQCLtvL1z5XgnDPLZ4y3_9SbqHKYbNa8UgZkTLF5EacGThYVFDLA9cbafHDtR1kMGE3vv4D
+EJ-0pAYTOGmKlVI7DwNyKsY9JTyudrxTqhOxi9jgcJNWiUaNe9yhL8Pyc2YBqUTTYhh_a2d1rvkZ
+0Gh1crviVxqBrIkRKaMRXZ4f1vDLz-3NvG_vwPOo8WRFo5nGmSdTw7CjBaigJ_cYCfDhoP11pEnw
+cndsZNcHs-v05LlxeIIMDD_f5Bvz-il_DLA4eK2HqgLdxh8ziSDl2azk14MJY4amzz6reEXUuKLV
+RsZGf_jbDGKhE2HuDQ5ovoLOi4OqE1oRuqh-dGxitrYouP2SN1l_1tCEMRth86FMV-6AQtZsvdUo
+y9MtQ7e35atjA8nHtgADlDTmJBKQiUHUsOZ77p1qp17HAFMovUkc739opfEYnKUn6Itpw5Ipm_Is
+ra6chJUfMpOFof5rb5OjqFAN27c_-mPo1lQU3ndYlKGh_n5V8ufX6v2Yri8WzOPf6hjVYotkmoMP
+NPAICDCB8W5ddBjsopzLVVEtaXDu9Qj6-zf77hT4iQ7rBd2Ner8iLqN3Kis0dvkNM3_uH8onau1G
+Y_YYw7PPSZyd2S_7Dd6G-IG4ayO6e5DD6oUwwekyiQI_3rTXNa_wldGxqW9u818010ekE4Qdlfcj
+beIn7fAeaOjReZ87hRgWyMs-EgTVHw8RL3yI_O6VvRTVRONRF1Y4C_-IYa8z-bfrwXx3BBd9TTgb
+EnS9wVOyC2OgUN6BhPLGLhxzkJ05nEjizXEc9t5EPYoSRwesajGGrrG_0-qWbuU5hKLPLkyeJLHb
+5HXOTVsrUR59Vov2M3_EswkxcImblox3k3VS2yihZMGyfqLzZIUXgd8ufkevKKU6DxwacGTb
\ No newline at end of file
diff --git a/src/main/config/runner-web.xml b/src/main/config/runner-web.xml
new file mode 100644 (file)
index 0000000..b51aff4
--- /dev/null
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- 
+ Copyright (c) 2016 AT&T Intellectual Property. All rights reserved.
+-->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+       metadata-complete="false" version="3.0">
+
+       <context-param>
+               <param-name>contextConfigLocation</param-name>
+               <param-value>/WEB-INF/spring-servlet.xml,
+                                       classpath:applicationContext.xml
+               </param-value>
+       </context-param>
+       
+       <context-param>
+        <param-name>spring.profiles.default</param-name>
+        <param-value>nooauth</param-value>
+    </context-param>
+    
+       <listener>
+               <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+       </listener>
+       
+       <servlet>
+               <servlet-name>ManagementServlet</servlet-name>
+               <servlet-class>ajsc.ManagementServlet</servlet-class>
+       </servlet>
+
+    
+       <filter> 
+               <filter-name>InterceptorFilter</filter-name>
+               <filter-class>ajsc.filters.InterceptorFilter</filter-class>
+               <init-param>
+                <param-name>preProcessor_interceptor_config_file</param-name>
+                <param-value>/etc/PreProcessorInterceptors.properties</param-value>
+        </init-param>
+        <init-param>
+                <param-name>postProcessor_interceptor_config_file</param-name>
+                <param-value>/etc/PostProcessorInterceptors.properties</param-value>
+        </init-param>
+        
+       </filter>
+
+        <servlet>
+               <servlet-name>RestletServlet</servlet-name>
+               <servlet-class>ajsc.restlet.RestletSpringServlet</servlet-class>
+               <init-param>
+                               <param-name>org.restlet.component</param-name>
+                               <param-value>restletComponent</param-value>
+               </init-param>
+       </servlet>
+       
+       <servlet>
+               <servlet-name>CamelServlet</servlet-name>
+               <servlet-class>ajsc.servlet.AjscCamelServlet</servlet-class>
+       </servlet>
+
+
+       <filter>
+               <filter-name>springSecurityFilterChain</filter-name>
+               <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+       </filter>
+
+       <servlet>
+               <servlet-name>spring</servlet-name>
+               <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+               <load-on-startup>1</load-on-startup>
+       </servlet>      
+       
+<!--   <servlet-mapping>
+               <servlet-name>spring</servlet-name>
+               <url-pattern>/</url-pattern>
+       </servlet-mapping>-->
+
+<!-- BEGIN jsp -->
+
+  <servlet id="jsp">
+    <servlet-name>jsp</servlet-name>
+    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+  </servlet>
+
+       
+       
+
+         
+       <!-- BEGIN static content -->
+       <servlet>
+          <servlet-name>default</servlet-name>
+           <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
+           <init-param>
+               <param-name>dirAllowed</param-name>
+               <param-value>true</param-value>
+           </init-param>
+       </servlet>
+       <!-- END static content -->     
+</web-app>
diff --git a/src/main/docker/Dockerfile b/src/main/docker/Dockerfile
new file mode 100644 (file)
index 0000000..f53850d
--- /dev/null
@@ -0,0 +1,26 @@
+FROM ubuntu:14.04
+
+ARG MICRO_HOME=/opt/app/data-router
+ARG BIN_HOME=$MICRO_HOME/bin
+
+RUN apt-get update
+
+# Install and setup java8
+RUN apt-get update && apt-get install -y software-properties-common
+## sudo -E is required to preserve the environment. If you remove that line, it will most like freeze at this step
+RUN sudo -E add-apt-repository ppa:openjdk-r/ppa && apt-get update && apt-get install -y openjdk-8-jdk
+## Setup JAVA_HOME, this is useful for docker commandline
+ENV JAVA_HOME usr/lib/jvm/java-8-openjdk-amd64
+RUN export JAVA_HOME
+
+# Build up the deployment folder structure
+RUN mkdir -p $MICRO_HOME
+ADD swm/package/nix/dist_files/appl/data-router/* $MICRO_HOME/
+RUN mkdir -p $BIN_HOME
+COPY *.sh $BIN_HOME
+RUN chmod 755 $BIN_HOME/*
+RUN ln -s /logs $MICRO_HOME/logs
+
+EXPOSE 9502 9502
+
+CMD /opt/app/data-router/bin/start.sh
diff --git a/src/main/java/org/openecomp/datarouter/entity/AaiEventEntity.java b/src/main/java/org/openecomp/datarouter/entity/AaiEventEntity.java
new file mode 100644 (file)
index 0000000..418c0d3
--- /dev/null
@@ -0,0 +1,315 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+/* 
+* ============LICENSE_START=======================================================
+* DataRouter
+* ================================================================================
+* Copyright © 2017 AT&T Intellectual Property.
+* Copyright © 2017 Amdocs
+* 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=========================================================
+* 
+* ECOMP and OpenECOMP are trademarks
+* and service marks of AT&T Intellectual Property.
+*/
+
+package org.openecomp.datarouter.entity;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+
+/**
+ * Note: AAIEventEntity is a port forward of IndexDocument Has been renamed here to move forward
+ * with abstraction of document store technology.
+ */
+public class AaiEventEntity implements DocumentStoreDataEntity, Serializable {
+
+  private static final long serialVersionUID = -5188479658230319058L;
+
+  protected String entityType;
+  protected String entityPrimaryKeyName;
+  protected String entityPrimaryKeyValue;
+  protected ArrayList<String> searchTagCollection = new ArrayList<String>();
+  protected ArrayList<String> searchTagIdCollection = new ArrayList<String>();
+  protected ArrayList<String> crossEntityReferenceCollection = new ArrayList<String>();
+  protected String lastmodTimestamp;
+  protected String link;
+
+  private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
+  /*
+   * Generated fields, leave the settings for junit overrides
+   */
+
+  // generated, SHA-256 digest
+  protected String id;
+
+  /*
+   * generated based on searchTagCollection values
+   */
+  protected String searchTags;
+  protected String searchTagIds;
+  protected String crossReferenceEntityValues;
+
+
+  private static String convertBytesToHexString(byte[] bytesToConvert) {
+    StringBuffer hexString = new StringBuffer();
+    for (int i = 0; i < bytesToConvert.length; i++) {
+      hexString.append(Integer.toHexString(0xFF & bytesToConvert[i]));
+    }
+    return hexString.toString();
+  }
+
+  private static String concatArray(List<String> list, char delimiter) {
+
+    if (list == null || list.size() == 0) {
+      return "";
+    }
+
+    StringBuilder result = new StringBuilder(64);
+
+    int listSize = list.size();
+    boolean firstValue = true;
+
+    for (String item : list) {
+
+      if (firstValue) {
+        result.append(item);
+        firstValue = false;
+      } else {
+        result.append(delimiter).append(item);
+      }
+
+    }
+
+    return result.toString();
+
+  }
+
+  /*
+   * We'll try and create a unique identity key that we can use for differencing the previously
+   * imported record sets as we won't have granular control of what is created/removed and when. The
+   * best we can hope for is identification of resources by generated Id until the Identity-Service
+   * UUID is tagged against all resources, then we can use that instead.
+   */
+
+  private static String generateUniqueShaDigest(String entityType, String fieldName,
+      String fieldValue) throws NoSuchAlgorithmException {
+
+    /*
+     * Basically SHA-256 will result in an identity with a guaranteed uniqueness compared to just a
+     * java hashcode value.
+     */
+    MessageDigest digest = MessageDigest.getInstance("SHA-256");
+    digest.update(String.format("%s.%s.%s", entityType, fieldName, fieldValue).getBytes());
+    return convertBytesToHexString(digest.digest());
+  }
+
+
+  public AaiEventEntity() {
+    SimpleDateFormat dateFormat = new SimpleDateFormat(TIMESTAMP_FORMAT);
+    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
+    String currentFormattedTimeStamp = dateFormat.format(timestamp);
+    this.lastmodTimestamp = currentFormattedTimeStamp;
+  }
+
+  public void deriveFields() throws NoSuchAlgorithmException {
+    this.id = generateUniqueShaDigest(entityType, entityPrimaryKeyName, entityPrimaryKeyValue);
+    this.searchTags = concatArray(searchTagCollection, ';');
+    this.searchTagIds = concatArray(searchTagIdCollection, ';');
+    this.crossReferenceEntityValues = concatArray(crossEntityReferenceCollection, ';');
+  }
+
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.openecomp.datarouter.entity.AAIEventEntity#getAsJson()
+   */
+  @Override
+  public String getAsJson() throws IOException {
+
+    JsonObject obj = Json.createObjectBuilder().add("entityType", entityType)
+        .add("entityPrimaryKeyValue", entityPrimaryKeyValue).add("searchTagIDs", searchTagIds)
+        .add("searchTags", searchTags).add("crossEntityReferenceValues", crossReferenceEntityValues)
+        .add("lastmodTimestamp", lastmodTimestamp).add("link", link).build();
+
+    return obj.toString();
+  }
+
+
+  public void addSearchTagWithKey(String searchTag, String key) {
+    searchTagIdCollection.add(key);
+    searchTagCollection.add(searchTag);
+  }
+
+  public void addCrossEntityReferenceValue(String crossEntityReferenceValue) {
+    if (!crossEntityReferenceCollection.contains(crossEntityReferenceValue)) {
+      crossEntityReferenceCollection.add(crossEntityReferenceValue);
+    }
+  }
+
+  public String getEntityType() {
+    return entityType;
+  }
+
+  public String getEntityPrimaryKeyName() {
+    return entityPrimaryKeyName;
+  }
+
+  public String getEntityPrimaryKeyValue() {
+    return entityPrimaryKeyValue;
+  }
+
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.openecomp.datarouter.entity.AAIEventEntity#getId()
+   */
+  @Override
+  public String getId() {
+    return id;
+  }
+
+  public ArrayList<String> getSearchTagCollection() {
+    return searchTagCollection;
+  }
+
+  public String getSearchTags() {
+    return searchTags;
+  }
+
+  public String getSearchTagIDs() {
+    return searchTagIds;
+  }
+
+  public void setSearchTagIDs(String searchTagIDs) {
+    this.searchTagIds = searchTagIDs;
+  }
+
+  public void setEntityType(String entityType) {
+    this.entityType = entityType;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public void setSearchTagCollection(ArrayList<String> searchTagCollection) {
+    this.searchTagCollection = searchTagCollection;
+  }
+
+  public void setSearchTags(String searchTags) {
+    this.searchTags = searchTags;
+  }
+
+  public ArrayList<String> getSearchTagIdCollection() {
+    return searchTagIdCollection;
+  }
+
+  public void setSearchTagIdCollection(ArrayList<String> searchTagIdCollection) {
+    this.searchTagIdCollection = searchTagIdCollection;
+  }
+
+  public String getLastmodTimestamp() {
+    return lastmodTimestamp;
+  }
+
+  public void setLastmodTimestamp(String lastmodTimestamp) {
+    this.lastmodTimestamp = lastmodTimestamp;
+  }
+
+  public void setEntityPrimaryKeyName(String entityPrimaryKeyName) {
+    this.entityPrimaryKeyName = entityPrimaryKeyName;
+  }
+
+  public void setEntityPrimaryKeyValue(String entityPrimaryKeyValue) {
+    this.entityPrimaryKeyValue = entityPrimaryKeyValue;
+  }
+  
+  public String getLink() {
+    return link;
+  }
+  
+  public void setLink(String link) {
+    this.link = link;
+  }
+
+  /*
+   * public void mergeEntity(AAIEventEntity entityToMergeIn) {
+   * 
+   * if ( entityToMergeIn == null ) { return; }
+   * 
+   * if ( !entityToMergeIn.getEntityType().equals( entityType )) { entityType =
+   * entityToMergeIn.getEntityType(); }
+   * 
+   * if ( !entityToMergeIn.getEntityType().equals( entityType )) { entityType =
+   * entityToMergeIn.getEntityType(); }
+   * 
+   * }
+   */
+
+  @Override
+  public String toString() {
+    return "AAIEventEntity [" + (entityType != null ? "entityType=" + entityType + ", " : "")
+        + (entityPrimaryKeyName != null ? "entityPrimaryKeyName=" + entityPrimaryKeyName + ", "
+            : "")
+        + (entityPrimaryKeyValue != null ? "entityPrimaryKeyValue=" + entityPrimaryKeyValue + ", "
+            : "")
+        + (searchTagCollection != null ? "searchTagCollection=" + searchTagCollection + ", " : "")
+        + (searchTagIdCollection != null ? "searchTagIDCollection=" + searchTagIdCollection + ", "
+            : "")
+        + (crossEntityReferenceCollection != null
+            ? "crossEntityReferenceCollection=" + crossEntityReferenceCollection + ", " : "")
+        + "lastmodTimestamp=" + lastmodTimestamp + ", " + (id != null ? "id=" + id + ", " : "")
+        + (searchTags != null ? "searchTags=" + searchTags + ", " : "")
+        + (searchTagIds != null ? "searchTagIDs=" + searchTagIds + ", " : "")
+        + (crossReferenceEntityValues != null
+            ? "crossReferenceEntityValues=" + crossReferenceEntityValues : "")
+        + "]";
+  }
+
+}
diff --git a/src/main/java/org/openecomp/datarouter/entity/AggregationEntity.java b/src/main/java/org/openecomp/datarouter/entity/AggregationEntity.java
new file mode 100644 (file)
index 0000000..4830d67
--- /dev/null
@@ -0,0 +1,124 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.entity;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.openecomp.datarouter.util.NodeUtils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+/**
+ * The Class AggregationEntity. Mimics functionality of AAIUI's AggregationEntity
+ */
+public class AggregationEntity implements DocumentStoreDataEntity, Serializable {
+  private String id;
+  private String link;
+  private String lastmodTimestamp;
+  
+  public String getLink() {
+    return link;
+  }
+  public void setLink(String link) {
+    this.link = link;
+  }
+  public String getId() {
+    // make sure that deliveFields() is called before getting the id
+    return id;
+  }
+  public void setId(String id) {
+    this.id = id;
+  }
+
+
+  public String getLastmodTimestamp() {
+    return lastmodTimestamp;
+  }
+  public void setLastmodTimestamp(String lastmodTimestamp) {
+    this.lastmodTimestamp = lastmodTimestamp;
+  }
+
+
+  Map<String, String> attributes = new HashMap<String, String>();
+  ObjectMapper mapper = new ObjectMapper();
+  
+  /**
+   * Instantiates a new aggregation entity.
+   */
+  public AggregationEntity() {  }
+
+  public void deriveFields(JsonNode uebPayload) {
+    
+    this.setId(NodeUtils.generateUniqueShaDigest(link));
+    
+    this.setLastmodTimestamp(Long.toString(System.currentTimeMillis()));
+    
+    JsonNode entityNode = uebPayload.get("entity");
+    
+    Iterator<Entry<String, JsonNode>> nodes = entityNode.fields();
+
+    while (nodes.hasNext()) {
+      Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodes.next();
+      if (!entry.getKey().equalsIgnoreCase("relationship-list")){
+        attributes.put(entry.getKey(), entry.getValue().asText());
+      }
+    }
+  }
+  
+  public void copyAttributeKeyValuePair(Map<String, Object> map){
+    for(String key: map.keySet()){
+      if (!key.equalsIgnoreCase("relationship-list")){   // ignore relationship data which is not required in aggregation
+        this.attributes.put(key, map.get(key).toString());    // not sure if entity attribute can contain an object as value
+      }
+    }
+  }
+  
+  public void addAttributeKeyValuePair(String key, String value){
+    this.attributes.put(key, value);
+  }
+
+  public String getAsJson() {
+    ObjectNode rootNode = mapper.createObjectNode();
+    rootNode.put("link", this.getLink());
+    rootNode.put("lastmodTimestamp", lastmodTimestamp);
+    for (String key: this.attributes.keySet()){
+      rootNode.put(key, this.attributes.get(key));
+    }
+    return rootNode.toString();
+  }
+  
+  @Override
+  public String toString() {
+    return "AggregationEntity [id=" + id + ", link=" + link + ", attributes=" + attributes
+        + ", mapper=" + mapper + "]";
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/entity/DocumentStoreDataEntity.java b/src/main/java/org/openecomp/datarouter/entity/DocumentStoreDataEntity.java
new file mode 100644 (file)
index 0000000..61df316
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.entity;
+
+import java.io.IOException;
+
+public interface DocumentStoreDataEntity {
+
+  public String getId();
+
+  public String getAsJson() throws IOException;
+
+}
diff --git a/src/main/java/org/openecomp/datarouter/entity/OxmEntityDescriptor.java b/src/main/java/org/openecomp/datarouter/entity/OxmEntityDescriptor.java
new file mode 100644 (file)
index 0000000..9f486e4
--- /dev/null
@@ -0,0 +1,126 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.entity;
+
+import java.util.List;
+
+import org.openecomp.datarouter.util.CrossEntityReference;
+
+
+public class OxmEntityDescriptor {
+       
+       private String entityName;
+
+       private List<String> primaryKeyAttributeName;
+       
+       private List<String> searchableAttributes;
+       
+       private CrossEntityReference crossEntityReference;
+       
+       private List<String> alias;
+       
+       private List<String> suggestableAttributes;
+    
+    boolean isSuggestableEntity;
+
+       public String getEntityName() {
+               return entityName;
+       }
+
+       public void setEntityName(String entityName) {
+               this.entityName = entityName;
+       }
+       
+       public List<String> getPrimaryKeyAttributeName() {
+               return primaryKeyAttributeName;
+       }
+
+       public void setPrimaryKeyAttributeName(List<String> primaryKeyAttributeName) {
+               this.primaryKeyAttributeName = primaryKeyAttributeName;
+       }
+
+       public List<String> getSearchableAttributes() {
+               return searchableAttributes;
+       }
+
+       public void setSearchableAttributes(List<String> searchableAttributes) {
+               this.searchableAttributes = searchableAttributes;
+       }
+       
+       public boolean hasSearchableAttributes() {
+          
+          if ( this.searchableAttributes == null) {
+             return false;
+          }
+          
+          if ( this.searchableAttributes.size() > 0 ) {
+             return true;
+          }
+          
+          return false;
+          
+       }
+
+       public CrossEntityReference getCrossEntityReference() {
+               return crossEntityReference;
+       }
+
+       public void setCrossEntityReference(CrossEntityReference crossEntityReference) {
+               this.crossEntityReference = crossEntityReference;
+       }
+
+       public List<String> getAlias() {
+    return alias;
+  }
+
+  public void setAlias(List<String> alias) {
+    this.alias = alias;
+  }
+
+  public List<String> getSuggestableAttributes() {
+    return suggestableAttributes;
+  }
+
+  public void setSuggestableAttributes(List<String> suggestableAttributes) {
+    this.suggestableAttributes = suggestableAttributes;
+  }
+
+  public boolean isSuggestableEntity() {
+    return isSuggestableEntity;
+  }
+
+  public void setSuggestableEntity(boolean isSuggestableEntity) {
+    this.isSuggestableEntity = isSuggestableEntity;
+  }
+
+  @Override
+  public String toString() {
+    return "OxmEntityDescriptor [entityName=" + entityName + ", primaryKeyAttributeName="
+        + primaryKeyAttributeName + ", searchableAttributes=" + searchableAttributes
+        + ", crossEntityReference=" + crossEntityReference + ", alias=" + alias
+        + ", suggestableAttributes=" + suggestableAttributes + ", isSuggestableEntity="
+        + isSuggestableEntity + "]";
+  }
+}
\ No newline at end of file
diff --git a/src/main/java/org/openecomp/datarouter/entity/PolicyResponse.java b/src/main/java/org/openecomp/datarouter/entity/PolicyResponse.java
new file mode 100644 (file)
index 0000000..fd577fa
--- /dev/null
@@ -0,0 +1,72 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.entity;
+
+/**
+ * Provides information about the level of success of a policy execution against a routed query.
+ */
+public class PolicyResponse {
+
+  private ResponseType responseType;
+
+  private String responseData;
+
+  private int httpResponseCode;
+
+  public PolicyResponse(ResponseType responseType, String responseData) {
+    super();
+    this.responseType = responseType;
+    this.responseData = responseData;
+  }
+
+  public ResponseType getResponseType() {
+    return responseType;
+  }
+
+  public String getResponseData() {
+    return responseData;
+  }
+
+
+  public int getHttpResponseCode() {
+    return httpResponseCode;
+  }
+
+  public void setHttpResponseCode(int httpResponseCode) {
+    this.httpResponseCode = httpResponseCode;
+  }
+
+  @Override
+  public String toString() {
+    return "PolicyResponse [responseType=" + responseType + ", responseData=" + responseData
+        + ", httpResponseCode=" + httpResponseCode + "]";
+  }
+
+
+
+  public enum ResponseType {
+    SUCCESS, PARTIAL_SUCCESS, FAILURE;
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/entity/SuggestionSearchEntity.java b/src/main/java/org/openecomp/datarouter/entity/SuggestionSearchEntity.java
new file mode 100644 (file)
index 0000000..ae2711b
--- /dev/null
@@ -0,0 +1,281 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.entity;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.openecomp.datarouter.util.NodeUtils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+public class SuggestionSearchEntity implements DocumentStoreDataEntity, Serializable {
+  private static final long serialVersionUID = -3636393943669310760L;
+
+  protected String id; // generated SHA-256 digest
+  private String entityType;
+  private List<String> entityTypeAliases;
+  private List<String> suggestionInputPermutations = new ArrayList<>();
+  private List<String> statusPermutations = new ArrayList<>();
+  private List<String> suggestableAttr = new ArrayList<>();
+  private Map<String, String> payload = new HashMap<>();
+  private JSONObject payloadJsonNode = new JSONObject();
+  private StringBuffer outputString = new StringBuffer();
+
+  public void deriveFields() throws NoSuchAlgorithmException {
+    int payloadEntryCounter = 1;
+
+    for (Map.Entry<String, String> payload : getPayload().entrySet()) {
+      if (payload.getValue() != null && payload.getValue().length() > 0) {
+        this.getPayloadJsonNode().put(payload.getKey(), payload.getValue());
+        this.outputString.append(payload.getValue());
+
+        if (payloadEntryCounter < getPayload().entrySet().size()) {
+          this.outputString.append(" and ");
+        } else {
+          this.outputString.append(" ");
+        }
+      }
+
+      payloadEntryCounter++;
+    }
+
+    this.outputString.append(getEntityTypeAliases().get(0));
+    this.id = NodeUtils.generateUniqueShaDigest(outputString.toString());
+  }
+
+  /**
+   * Launch pad for performing permutations of the entity type, aliases, prov status and orchestration status.
+   * SHA-256 will result in an ID with a guaranteed uniqueness compared to just a java hashcode value.
+   * @return
+   */
+  public List<String> generateSuggestionInputPermutations() {
+    List<String> entityNames = new ArrayList<>();
+    entityNames.add(entityType);
+
+    if ((entityTypeAliases != null) && !(entityTypeAliases.isEmpty())) {
+      for (String alias : entityTypeAliases) {
+        entityNames.add(alias);
+      }
+    }
+
+    ArrayList<String> listToPermutate = new ArrayList<>(statusPermutations);
+    ArrayList<String> listOfSearchSuggestionPermutations = new ArrayList<>();
+
+    for (String entityName : entityNames) {
+      listToPermutate.add(entityName);
+      permutateList(listToPermutate, new ArrayList<String>(), listToPermutate.size(), listOfSearchSuggestionPermutations);
+      listToPermutate.remove(entityName);
+    }
+
+    return listOfSearchSuggestionPermutations;
+  }
+
+  public boolean isSuggestableDoc() {
+    return this.getPayload().size() != 0;
+  }
+  
+  /**
+   * Generate all permutations of Entity Type and (Prov Status and/or Orchestration Status)
+   * @param list The list of unique elements to create permutations of
+   * @param permutation A list to hold the current permutation used during
+   * @param size To keep track of the original size of the number of unique elements
+   * @param listOfSearchSuggestionPermutationList The list to hold all of the different permutations
+   */
+  private void permutateList(List<String> list, List<String> permutation, int size,
+      List<String> listOfSearchSuggestionPermutationList) {
+    if (permutation.size() == size) {
+      StringBuilder newPermutation = new StringBuilder();
+
+      for (int i = 0; i < permutation.size(); i++) {
+        newPermutation.append(permutation.get(i)).append(" ");
+      }
+
+      listOfSearchSuggestionPermutationList.add(newPermutation.toString().trim());
+
+      return;
+    }
+
+    String[] availableItems = list.toArray(new String[0]);
+
+    for (String i : availableItems) {
+      permutation.add(i);
+      list.remove(i);
+      permutateList(list, permutation, size, listOfSearchSuggestionPermutationList);
+      list.add(i);
+      permutation.remove(i);
+    }
+  }
+
+  /**
+   * return Custom-built JSON representation of this class
+   */
+  @Override
+  public String getAsJson() throws IOException {
+    if (entityType == null || suggestionInputPermutations == null) {
+      return null;
+    }
+
+    JSONObject rootNode = new JSONObject();
+    JSONArray inputArray = new JSONArray();
+    JSONObject payloadNode = new JSONObject();
+    StringBuffer outputString = new StringBuffer();
+
+    int payloadEntryCounter = 1;
+
+    // Add prov and orchestration status to search suggestion string
+    for (Map.Entry<String, String> payload : getPayload().entrySet()) {
+      payloadNode.put(payload.getKey(), payload.getValue());
+      outputString.append(payload.getValue());
+
+      if (payloadEntryCounter < getPayload().entrySet().size()) {
+        // Add the word "and" between prov and orchestration statuses, if both are present
+        outputString.append(" and ");
+        payloadEntryCounter++;
+      }
+    }
+
+    // Add entity type to search suggestion string. We've decided to use the first entity type alias from the OXM
+    outputString.append(" ").append(getEntityTypeAliases().get(0));
+
+    for (String permutation : suggestionInputPermutations) {
+      inputArray.put(permutation);
+    }
+
+    // Build up the search suggestion as JSON
+    JSONObject entitySuggest = new JSONObject();
+    entitySuggest.put("input", inputArray);
+    entitySuggest.put("output", outputString);
+    entitySuggest.put("payload", payloadNode);
+    rootNode.put("entity_suggest", entitySuggest);
+
+    return rootNode.toString();
+  }
+
+  public String getEntityType() {
+    return entityType;
+  }
+
+  public void setEntityType(String entityType) {
+    this.entityType = entityType;
+  }
+
+  public List<String> getEntityTypeAliases() {
+    return entityTypeAliases;
+  }
+
+  public void setEntityTypeAliases(List<String> entityTypeAliases) {
+    this.entityTypeAliases = entityTypeAliases;
+  }
+
+  @Override
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public StringBuffer getOutputString() {
+    return outputString;
+  }
+
+  public void setOutputString(StringBuffer outputString) {
+    this.outputString = outputString;
+  }
+
+  public Map<String, String> getPayload() {
+    return payload;
+  }
+
+  public void setPayloadFromResponse(JsonNode node) {
+    Map<String, String> nodePayload = new HashMap<>();
+    JsonNode entityNode = node.get("entity");
+    if (suggestableAttr != null) {
+      for (String attribute : suggestableAttr) {
+        if (entityNode.get(attribute) != null && !entityNode.get(attribute).asText().trim().isEmpty()) {
+          nodePayload.put(attribute, entityNode.get(attribute).asText());
+          this.statusPermutations.add(entityNode.get(attribute).asText());
+        }
+      }
+      this.setPayload(nodePayload);
+    }
+  }
+
+  public void setPayload(Map<String, String> payload) {
+    this.payload = payload;
+  }
+
+  public JSONObject getPayloadJsonNode() {
+    return payloadJsonNode;
+  }
+
+  public void setPayloadJsonNode(JSONObject payloadJsonNode) {
+    this.payloadJsonNode = payloadJsonNode;
+  }
+
+  public List<String> getStatusPermutations() {
+    return statusPermutations;
+  }
+
+  public List<String> getSuggestableAttr() {
+    return suggestableAttr;
+  }
+
+  public List<String> getSuggestionInputPermutations() {
+    return this.suggestionInputPermutations;
+  }
+
+  public void setStatusPermutations(List<String> statusPermutations) {
+    this.statusPermutations = statusPermutations;
+  }
+
+  public void setSuggestableAttr(ArrayList<String> attributes) {
+    for (String attribute : attributes) {
+      this.suggestableAttr.add(attribute);
+    }
+  }
+
+  public void setSuggestionInputPermutations(List<String> permutations) {
+    this.suggestionInputPermutations = permutations;
+  }
+
+  @Override
+  public String toString() {
+    return "SuggestionSearchEntity [id=" + id + ", entityType=" + entityType
+        + ", entityTypeAliases=" + entityTypeAliases + ", suggestionInputPermutations="
+        + suggestionInputPermutations + ", statusPermutations=" + statusPermutations
+        + ", suggestableAttr=" + suggestableAttr + ", payload=" + payload + ", payloadJsonNode="
+        + payloadJsonNode + ", outputString=" + outputString + "]";
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/entity/TopographicalEntity.java b/src/main/java/org/openecomp/datarouter/entity/TopographicalEntity.java
new file mode 100644 (file)
index 0000000..79cdfcd
--- /dev/null
@@ -0,0 +1,191 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.entity;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+
+import javax.json.Json;
+import javax.json.JsonObject;
+
+public class TopographicalEntity implements DocumentStoreDataEntity, Serializable {
+
+  private static final long serialVersionUID = -5188479658230319058L;
+
+  protected String entityType;
+  protected String entityPrimaryKeyValue;
+  protected String entityPrimaryKeyName;
+  protected String latitude;
+  protected String longitude;
+  protected String selfLink;
+
+  // generated, SHA-256 digest
+  protected String id;
+
+  private static String convertBytesToHexString(byte[] bytesToConvert) {
+    StringBuffer hexString = new StringBuffer();
+    for (int i = 0; i < bytesToConvert.length; i++) {
+      hexString.append(Integer.toHexString(0xFF & bytesToConvert[i]));
+    }
+    return hexString.toString();
+  }
+
+  private static String concatArray(List<String> list, char delimiter) {
+
+    if (list == null || list.size() == 0) {
+      return "";
+    }
+
+    StringBuilder result = new StringBuilder(64);
+
+    int listSize = list.size();
+    boolean firstValue = true;
+
+    for (String item : list) {
+
+      if (firstValue) {
+        result.append(item);
+        firstValue = false;
+      } else {
+        result.append(delimiter).append(item);
+      }
+    }
+    
+    return result.toString();
+  }
+
+  /*
+   * We'll try and create a unique identity key that we can use for
+   * differencing the previously imported record sets as we won't have granular
+   * control of what is created/removed and when. The best we can hope for is
+   * identification of resources by generated Id until the Identity-Service
+   * UUID is tagged against all resources, then we can use that instead.
+   */
+  public static String generateUniqueShaDigest(String entityType, String fieldName,
+      String fieldValue) throws NoSuchAlgorithmException {
+
+    /*
+     * Basically SHA-256 will result in an identity with a guaranteed
+     * uniqueness compared to just a java hashcode value.
+     */
+    MessageDigest digest = MessageDigest.getInstance("SHA-256");
+    digest.update(String.format("%s.%s.%s", entityType, fieldName, fieldValue).getBytes());
+    return convertBytesToHexString(digest.digest());
+  }
+
+  public TopographicalEntity() {}
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.openecomp.datarouter.entity.TopographicalEntity#getAsJson()
+   */
+  public String getAsJson() throws IOException {
+
+    JsonObject obj =
+        Json.createObjectBuilder().add("entityType", entityType)
+          .add("pkey", entityPrimaryKeyValue)
+          .add("location", Json.createObjectBuilder()
+            .add("lat", latitude)
+            .add("lon", longitude))
+          .add("selfLink", selfLink).build();
+
+    return obj.toString();
+  }
+
+
+  @Override
+  public String toString() {
+    return "TopographicalEntity [" + ("entityType=" + entityType + ", ")
+        + ("entityPrimaryKeyValue=" + entityPrimaryKeyValue + ", ")
+        + ("latitude=" + latitude + ", ") + ("longitude=" + longitude + ", ") 
+        + ("ID=" + id + ", ")
+        + ("selfLink=" + selfLink) + "]";
+  }
+
+  @Override
+  public String getId() {
+    return this.id;
+  }
+
+  public String getEntityType() {
+    return entityType;
+  }
+
+  public void setEntityType(String entityType) {
+    this.entityType = entityType;
+  }
+
+  public String getEntityPrimaryKeyValue() {
+    return entityPrimaryKeyValue;
+  }
+
+  public void setEntityPrimaryKeyValue(String entityPrimaryKeyValue) {
+    this.entityPrimaryKeyValue = entityPrimaryKeyValue;
+  }
+
+  public String getEntityPrimaryKeyName() {
+    return entityPrimaryKeyName;
+  }
+
+  public void setEntityPrimaryKeyName(String entityPrimaryKeyName) {
+    this.entityPrimaryKeyName = entityPrimaryKeyName;
+  }
+
+  public String getLatitude() {
+    return latitude;
+  }
+
+  public void setLatitude(String latitude) {
+    this.latitude = latitude;
+  }
+
+  public String getLongitude() {
+    return longitude;
+  }
+
+  public void setLongitude(String longitude) {
+    this.longitude = longitude;
+  }
+
+  public String getSelfLink() {
+    return selfLink;
+  }
+
+  public void setSelfLink(String selfLink) {
+    this.selfLink = selfLink;
+  }
+
+  public static long getSerialversionuid() {
+    return serialVersionUID;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/entity/UebEventHeader.java b/src/main/java/org/openecomp/datarouter/entity/UebEventHeader.java
new file mode 100644 (file)
index 0000000..5eab97f
--- /dev/null
@@ -0,0 +1,169 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * A convenience POJO for mapping the UebEventHeader from a UEB Event.
+ * 
+ * @author davea
+ */
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class UebEventHeader {
+
+  private String timestamp;
+
+  private String id;
+
+  private String action;
+
+  private String domain;
+
+  private String sourceName;
+
+  private String entityLink;
+
+  private String entityType;
+
+  private String topEntityType;
+
+  private String sequenceNumber;
+
+  private String eventType;
+
+  private String version;
+
+  public String getTimestamp() {
+    return timestamp;
+  }
+
+  public void setTimestamp(String timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getAction() {
+    return action;
+  }
+
+  public void setAction(String action) {
+    this.action = action;
+  }
+
+  public String getDomain() {
+    return domain;
+  }
+
+  public void setDomain(String domain) {
+    this.domain = domain;
+  }
+
+  public String getSourceName() {
+    return sourceName;
+  }
+
+  @JsonProperty("source-name")
+  public void setSourceName(String sourceName) {
+    this.sourceName = sourceName;
+  }
+
+  public String getEntityLink() {
+    return entityLink;
+  }
+
+  @JsonProperty("entity-link")
+  public void setEntityLink(String entityLink) {
+    this.entityLink = entityLink;
+  }
+
+  public String getEntityType() {
+    return entityType;
+  }
+
+  @JsonProperty("entity-type")
+  public void setEntityType(String entityType) {
+    this.entityType = entityType;
+  }
+
+  public String getTopEntityType() {
+    return topEntityType;
+  }
+
+  @JsonProperty("top-entity-type")
+  public void setTopEntityType(String topEntityType) {
+    this.topEntityType = topEntityType;
+  }
+
+  public String getSequenceNumber() {
+    return sequenceNumber;
+  }
+
+  @JsonProperty("sequence-number")
+  public void setSequenceNumber(String sequenceNumber) {
+    this.sequenceNumber = sequenceNumber;
+  }
+
+  public String getEventType() {
+    return eventType;
+  }
+
+  @JsonProperty("event-type")
+  public void setEventType(String eventType) {
+    this.eventType = eventType;
+  }
+
+  public String getVersion() {
+    return version;
+  }
+
+  public void setVersion(String version) {
+    this.version = version;
+  }
+
+  @Override
+  public String toString() {
+    return "UebEventHeader [" + (timestamp != null ? "timestamp=" + timestamp + ", " : "")
+        + (id != null ? "id=" + id + ", " : "") + (action != null ? "action=" + action + ", " : "")
+        + (domain != null ? "domain=" + domain + ", " : "")
+        + (sourceName != null ? "sourceName=" + sourceName + ", " : "")
+        + (entityLink != null ? "entityLink=" + entityLink + ", " : "")
+        + (entityType != null ? "entityType=" + entityType + ", " : "")
+        + (topEntityType != null ? "topEntityType=" + topEntityType + ", " : "")
+        + (sequenceNumber != null ? "sequenceNumber=" + sequenceNumber + ", " : "")
+        + (eventType != null ? "eventType=" + eventType + ", " : "")
+        + (version != null ? "version=" + version : "") + "]";
+  }
+
+}
diff --git a/src/main/java/org/openecomp/datarouter/exception/BaseDataRouterException.java b/src/main/java/org/openecomp/datarouter/exception/BaseDataRouterException.java
new file mode 100644 (file)
index 0000000..0cd0381
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.exception;
+
+/*
+ * COPYRIGHT NOTICE: Copyright (c) 2016 Team Pacifica (Amdocs & AT&T) The contents and intellectual
+ * property contained herein, remain the property of Team Pacifica (Amdocs & AT&T).
+ */
+
+import java.util.Locale;
+
+/**
+ * Base SMAdaptor exception class.
+ */
+public class BaseDataRouterException extends Exception {
+
+  /** Force serialVersionUID. */
+  private static final long serialVersionUID = -6663403070792969748L;
+
+  /** Default locale. */
+  public static final Locale LOCALE = Locale.US;
+
+  /** Exception id. */
+  private final String id;
+
+  /**
+   * Constructor.
+   * 
+   * @param id the incoming id.
+   */
+  public BaseDataRouterException(final String id) {
+    super();
+    this.id = id;
+  }
+
+  /**
+   * Constructor.
+   * 
+   * @param id the incoming id
+   * @param message the incoming message
+   */
+  public BaseDataRouterException(final String id, final String message) {
+    super(message);
+    this.id = id;
+  }
+
+  /**
+   * Constructor.
+   * 
+   * @param id the incoming id
+   * @param message the incoming message
+   * @param cause the incoming throwable
+   */
+  public BaseDataRouterException(final String id, final String message, final Throwable cause) {
+    super(message, cause);
+    this.id = id;
+  }
+
+  /**
+   * Get the exception id.
+   * 
+   * @return the exception id
+   */
+  public String getId() {
+    return this.id;
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/exception/DataRouterError.java b/src/main/java/org/openecomp/datarouter/exception/DataRouterError.java
new file mode 100644 (file)
index 0000000..4920591
--- /dev/null
@@ -0,0 +1,106 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.exception;
+
+/*
+ * COPYRIGHT NOTICE: Copyright (c) 2016 Team Pacifica (Amdocs & AT&T) The contents and intellectual
+ * property contained herein, remain the property of Team Pacifica (Amdocs & AT&T).
+ */
+
+import java.text.MessageFormat;
+
+import javax.ws.rs.core.Response.Status;
+
+/**
+ * DL enum for error conditions.
+ */
+public enum DataRouterError {
+
+  /** Parsing exceptions - Range 100..199. */
+  DL_PARSE_100("DL-100", "Unable to find resource {0} in the model", Status.BAD_REQUEST), 
+  DL_PARSE_101("DL-101", "Unable to parse ", Status.BAD_REQUEST), 
+  DL_PARSE_102("DL-102", "Sot Filter error: {0} ", Status.INTERNAL_SERVER_ERROR), 
+  DL_PARSE_103("DL-103", "URL Parsing error: {0} ", Status.BAD_REQUEST), 
+  DL_PARSE_104("DL-104", "Missing Ids filter: {0} ", Status.BAD_REQUEST), 
+  DL_PARSE_105("DL-105", "Invalid Ids filter: {0} ", Status.BAD_REQUEST),
+
+  /** Validation exceptions - Range 200..299. */
+  DL_VALIDATION_200("DL-200", "Missing X-TransactionId in header ", Status.BAD_REQUEST),
+
+  /** Other components integration errors - Range 300..399. */
+  DL_INTEGRATION_300("DL-300", "Unable to decorate Graph ", Status.INTERNAL_SERVER_ERROR),
+
+  /** Environment related exceptions - Range 400..499. */
+  DL_ENV_400("DL-400", "Unable to find file {0} ", Status.INTERNAL_SERVER_ERROR), 
+  DL_ENV_401("DL-401", "Unable to Load OXM Models", Status.INTERNAL_SERVER_ERROR),
+
+  /** Other components integration errors - Range 500..599. */
+  DL_AUTH_500("DL-500", "Unable to authorize User ", Status.FORBIDDEN);
+
+  /** The error id. */
+  private String id;
+  /** The error message. */
+  private String message;
+  /** The error http return code. */
+  private Status status;
+
+  /**
+   * Constructor.
+   * 
+   * @param id the error id
+   * @param message the error message
+   */
+  DataRouterError(final String id, final String message, final Status status) {
+    this.id = id;
+    this.message = message;
+    this.status = status;
+  }
+
+  /**
+   * Get the id.
+   * 
+   * @return the error id
+   */
+  public String getId() {
+    return this.id;
+  }
+
+  /**
+   * Get the message.
+   * 
+   * @param args the error arguments
+   * @return the error message
+   */
+  public String getMessage(final Object... args) {
+    final MessageFormat formatter = new MessageFormat("");
+    formatter.applyPattern(this.message);
+    return formatter.format(args);
+  }
+
+  public Status getHttpStatus() {
+    return this.status;
+  }
+
+}
diff --git a/src/main/java/org/openecomp/datarouter/logging/DataRouterMsgs.java b/src/main/java/org/openecomp/datarouter/logging/DataRouterMsgs.java
new file mode 100644 (file)
index 0000000..8304c96
--- /dev/null
@@ -0,0 +1,161 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.logging;
+
+import com.att.eelf.i18n.EELFResourceManager;
+
+import org.openecomp.cl.eelf.LogMessageEnum;
+
+public enum DataRouterMsgs implements LogMessageEnum {
+
+  /** Data Layer Service started. */
+  SERVICE_STARTED,
+
+  /**
+   * Data Layer Service failed to start.
+   * Arguments: {0} = Exception message.
+   */
+  STARTUP_FAILURE,
+
+  /**
+   * File has been changed.
+   * Arguments: {0} = File name.
+   */
+  FILE_CHANGED,
+
+  /**
+   * File has been reloaded.
+   * Arguments: {0} = File name.
+   */
+  FILE_RELOADED,
+
+  /**
+   * Reports the configuration watcher interval.
+   * Arguments: {0} = Interval
+   */
+  REPORT_CONFIG_WATCHER_INT,
+
+  /**
+   * Loading properties file.
+   * Arguments: {0} = File name.
+   */
+  LOADING_PROPERTIES,
+
+  /**
+   * Properties file has been loaded.
+   * Arguments: {0} = File name.
+   */
+  PROPERTIES_LOADED,
+
+  /**
+   * UEB no events received.
+   * Arguments: {0} = Topic name
+   */
+  UEB_NO_EVENTS_RECEIVED,
+
+  /**
+   * Routing policies are being configured.
+   */
+  CONFIGURING_ROUTING_POLICIES,
+
+  /**
+   * A properties file could not be successfully loaded.
+   * Arguments: {0} = File name.
+   */
+  LOAD_PROPERTIES_FAILURE,
+
+  /**
+   * Failed to register for an event topic with UEB.
+   * Arguments: {0} = Topic {1} = Error reason
+   */
+  UEB_CONNECT_ERR,
+
+  /**
+   * An error occurred while trying to route a query.
+   * Arguments: {0} = Query {1} = Error reason
+   */
+  QUERY_ROUTING_ERR,
+
+  /**
+   * Error in file monitor block.
+   */
+  FILE_MON_BLOCK_ERR,
+
+  /**
+   * Failure to create a property map.
+   */
+  CREATE_PROPERTY_MAP_ERR,
+
+  /**
+   * An error occurred reading from a file stream.
+   */
+  FILE_STREAM_ERR,
+
+  /**
+   * An error occurred while trying to configure a routing policy.
+   * Arguments: {0} = policy name {1} = source of the routing policy {2} = action of the routing
+   * policy
+   */
+  ROUTING_POLICY_CONFIGURATION_ERROR,
+
+  /**
+   * Received request {0} {1} from {2}. Sending response: {3}
+   * Arguments: {0} = operation {1} = target URL {2} = source {3} = response code
+   */
+  PROCESS_REST_REQUEST,
+
+  /**
+   * Processed event {0}. Result: {1}
+   * Arguments: {0} = event topic {1} = result
+   */
+  PROCESS_EVENT,
+
+  /**
+   * Arguments: {0} = Error
+   */
+
+  BAD_REST_REQUEST,
+
+  /**
+   * Arguments: {0} = Search index URL {1} = Reason
+   */
+  FAIL_TO_CREATE_SEARCH_INDEX,
+
+  /**
+   * Arguments: {0} = Successfully created index at endpoint
+   */
+  SEARCH_INDEX_CREATE_SUCCESS,
+  
+  INVALID_OXM_FILE,
+  
+  INVALID_OXM_DIR;
+
+  /**
+   * Static initializer to ensure the resource bundles for this class are loaded...
+   */
+  static {
+    EELFResourceManager.loadMessageBundle("logging/DataRouterMsgs");
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/logging/EntityEventPolicyMsgs.java b/src/main/java/org/openecomp/datarouter/logging/EntityEventPolicyMsgs.java
new file mode 100644 (file)
index 0000000..09be3a0
--- /dev/null
@@ -0,0 +1,218 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.logging;
+
+import com.att.eelf.i18n.EELFResourceManager;
+
+import org.openecomp.cl.eelf.LogMessageEnum;
+
+public enum EntityEventPolicyMsgs implements LogMessageEnum {
+
+  // Error Messages
+  /**
+   * Discarding event. 
+   * Arguments:
+   *    {0} = reason
+   *    {1} = Payload:
+   */
+  DISCARD_AAI_EVENT_VERBOSE,    
+    
+  /**
+   * Discarding event. 
+   * Arguments:
+   *    {0} = Reason
+   */
+  DISCARD_AAI_EVENT_NONVERBOSE,
+  
+  /**
+   * OXM version: {0} is not supported. 
+   * Arguments:
+   *    {0} = OXM Version
+   */
+  OXM_VERSION_NOT_SUPPORTED,
+  /**
+   * Failed to parse UEB payload. 
+   * Arguments:
+   *    {0} 
+   *    {1}
+   */
+  FAILED_TO_PARSE_UEB_PAYLOAD,
+
+  /**
+   * Unable to retrieve etag at {0} for entity with id {1}
+   * Arguments:
+   *    {0} = Resource endpoint.
+   *    {1} = Entity id.
+   */
+  NO_ETAG_AVAILABLE_FAILURE,
+
+  /**
+   * Failed to update entity {0} with operation {1}.
+   * Arguments:
+   *   {0} = Entity 
+   *   {1} = Operation
+   */
+  FAILED_TO_UPDATE_ENTITY_IN_DOCSTORE,
+
+  
+  /**
+   * Action: {0} is not supported.
+   * Argument:
+   *    {0} = Operation
+   */
+  ENTITY_OPERATION_NOT_SUPPORTED,
+
+  /**
+   * Arguments:
+   * {0} = reason
+   */
+  DISCARD_UPDATING_SEARCH_SUGGESTION_DATA,
+  
+  /**
+   * Discarding topographical data. Reason: {0}. Payload: {1}  
+   * Arguments:
+   *    {0} = Reason for discarding data.
+   *    {1} = Payload
+   */
+  DISCARD_UPDATING_TOPOGRAPHY_DATA_VERBOSE,
+      
+  /**
+   * Discarding topographical data. Reason: {0}
+   * Arguments:
+   *    {0} = Reason for discarding data.
+   */
+  DISCARD_UPDATING_TOPOGRAPHY_DATA_NONVERBOSE,
+
+  /**
+   * Failed to load OXM Model.
+   */
+  PROCESS_OXM_MODEL_MISSING,
+
+  /**
+   * Failed to create Search index {0} due to: {1} 
+   * 
+   * Arguments:
+   *    {0} = Search index
+   *    {1} = Error cause
+   */
+  FAIL_TO_CREATE_SEARCH_INDEX,
+
+  /**
+   * Failed to find OXM version in UEB payload. {0}
+   * Arguments:
+   *    {0} = OXM version.
+   */
+  FAILED_TO_FIND_OXM_VERSION,
+
+  
+  // Info Messages
+  
+  /**
+   * Processing AAI Entity Event Policy: 
+   * Arguments:
+   *    {0} = Action
+   *    {1} = Entity Type
+   *    {2} = Payload
+   */
+  PROCESS_AAI_ENTITY_EVENT_POLICY_VERBOSE,
+
+  /**
+   * Processing AAI Entity Event Policy: 
+   * Arguments:
+   *     {0} = Action
+   *     {1} = Entity Type 
+   */
+  PROCESS_AAI_ENTITY_EVENT_POLICY_NONVERBOSE,
+  
+  /**
+   * Cross Entity Reference synchronization {0}
+   * Arguments:
+   *    {0} = Error string
+   * 
+   */
+  CROSS_ENTITY_REFERENCE_SYNC,
+  
+  /**
+   * Operation {0} completed in {1} ms with no errors
+   * Arguments:
+   *    {0} = Operation type
+   *    {1} = Time in ms.
+   */
+  OPERATION_RESULT_NO_ERRORS,
+  
+  /**
+   * Found OXM model: {0}
+   * Arguments:
+   *    {0} = Key pair.
+   */
+  PROCESS_OXM_MODEL_FOUND,
+  
+  /**
+   * Successfully created index at {0}
+   * 
+   * Arguments:
+   *    {0} = Index resource endpoint
+   */
+  SEARCH_INDEX_CREATE_SUCCESS,
+  
+  /**
+   * Entity Event Policy component started. 
+   */
+  ENTITY_EVENT_POLICY_REGISTERED,
+  /**
+   * Arguments:
+   *    {0} = Entity name
+   */
+  PRIMARY_KEY_NULL_FOR_ENTITY_TYPE,
+
+  /**
+   * Arguments: {0} = UEB payload
+   */
+  UEB_INVALID_PAYLOAD_JSON_FORMAT,
+  
+  /**
+   * Arguments: {0} = Event header
+   */
+  UEB_FAILED_TO_PARSE_PAYLOAD,
+  
+  /**
+   * Arguments: {0} = Exception
+   */
+  UEB_FAILED_UEBEVENTHEADER_CONVERSION,
+
+  /**
+   * Arguments: {0} = UEB event header
+   */
+  UEB_EVENT_HEADER_PARSED;
+  
+  /**
+   * Static initializer to ensure the resource bundles for this class are loaded...
+   */
+  static {
+    EELFResourceManager.loadMessageBundle("logging/EntityEventPolicyMsgs");
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/policy/EntityEventPolicy.java b/src/main/java/org/openecomp/datarouter/policy/EntityEventPolicy.java
new file mode 100644 (file)
index 0000000..170c646
--- /dev/null
@@ -0,0 +1,1162 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.policy;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.eclipse.jetty.util.security.Password;
+import org.eclipse.persistence.dynamic.DynamicType;
+import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.cl.mdc.MdcContext;
+import org.openecomp.datarouter.entity.AaiEventEntity;
+import org.openecomp.datarouter.entity.AggregationEntity;
+import org.openecomp.datarouter.entity.DocumentStoreDataEntity;
+import org.openecomp.datarouter.entity.OxmEntityDescriptor;
+import org.openecomp.datarouter.entity.SuggestionSearchEntity;
+import org.openecomp.datarouter.entity.TopographicalEntity;
+import org.openecomp.datarouter.entity.UebEventHeader;
+import org.openecomp.datarouter.logging.DataRouterMsgs;
+import org.openecomp.datarouter.logging.EntityEventPolicyMsgs;
+import org.openecomp.datarouter.util.CrossEntityReference;
+import org.openecomp.datarouter.util.DataRouterConstants;
+import org.openecomp.datarouter.util.EntityOxmReferenceHelper;
+import org.openecomp.datarouter.util.ExternalOxmModelProcessor;
+import org.openecomp.datarouter.util.OxmModelLoader;
+import org.openecomp.datarouter.util.RouterServiceUtil;
+import org.openecomp.datarouter.util.SearchSuggestionPermutation;
+import org.openecomp.datarouter.util.Version;
+import org.openecomp.datarouter.util.VersionedOxmEntities;
+import org.openecomp.restclient.client.Headers;
+import org.openecomp.restclient.client.OperationResult;
+import org.openecomp.restclient.client.RestClient;
+import org.openecomp.restclient.rest.HttpUtil;
+import org.slf4j.MDC;
+
+public class EntityEventPolicy implements Processor {
+
+  public static final String additionalInfo = "Response of AAIEntityEventPolicy";
+  private static final String entitySearchSchema = "entitysearch_schema.json";
+  private static final String topographicalSearchSchema   = "topographysearch_schema.json";
+  private Collection<ExternalOxmModelProcessor> externalOxmModelProcessors;
+  RestClient searchClient = null;
+
+  private final String EVENT_HEADER = "event-header";
+  private final String ENTITY_HEADER = "entity";
+  private final String ACTION_CREATE = "create";
+  private final String ACTION_DELETE = "delete";
+  private final String ACTION_UPDATE = "update";
+  private final String PROCESS_AAI_EVENT = "Process AAI Event";
+  private final String TOPO_LAT = "latitude";
+  private final String TOPO_LONG = "longitude";
+
+  private final List<String> SUPPORTED_ACTIONS =
+      Arrays.asList(ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE);
+
+  Map<String, DynamicJAXBContext> oxmVersionContextMap = new HashMap<>();
+  private String oxmVersion = null;
+
+  private String entityIndexTarget = null;
+  private String entitySearchTarget = null;
+  private String topographicalIndexTarget = null;
+  private String topographicalSearchTarget = null;
+  private String autoSuggestSearchTarget = null;
+  private String aggregationSearchVnfTarget = null;
+
+  private String srcDomain;
+
+  private Logger logger;
+  private Logger metricsLogger;
+  private Logger auditLogger;
+
+  public enum ResponseType {
+    SUCCESS, PARTIAL_SUCCESS, FAILURE;
+  };
+
+  public EntityEventPolicy(EntityEventPolicyConfig config) {
+    LoggerFactory loggerFactoryInstance = LoggerFactory.getInstance();
+    logger = loggerFactoryInstance.getLogger(EntityEventPolicy.class.getName());
+    metricsLogger = loggerFactoryInstance.getMetricsLogger(EntityEventPolicy.class.getName());
+    auditLogger = loggerFactoryInstance.getAuditLogger(EntityEventPolicy.class.getName());
+
+    srcDomain = config.getSourceDomain();
+
+    entityIndexTarget =
+      EntityEventPolicy.concatSubUri(config.getSearchBaseUrl(), config.getSearchEndpoint(),
+        config.getSearchEntitySearchIndex());
+
+    entitySearchTarget =
+        EntityEventPolicy.concatSubUri(config.getSearchBaseUrl(), config.getSearchEndpoint(),
+            config.getSearchEntitySearchIndex(), config.getSearchEndpointDocuments());
+
+    topographicalIndexTarget =
+      EntityEventPolicy.concatSubUri(config.getSearchBaseUrl(), config.getSearchEndpoint(),
+        config.getSearchTopographySearchIndex());
+
+    topographicalSearchTarget = EntityEventPolicy.concatSubUri(config.getSearchBaseUrl(),
+        config.getSearchEndpoint(), config.getSearchTopographySearchIndex());
+
+    // Create REST client for search service
+    searchClient = new RestClient().validateServerHostname(false).validateServerCertChain(true)
+        .clientCertFile(DataRouterConstants.DR_HOME_AUTH + config.getSearchCertName())
+        .clientCertPassword(Password.deobfuscate(config.getSearchKeystorePwd()))
+        .trustStore(DataRouterConstants.DR_HOME_AUTH + config.getSearchKeystore());
+
+    autoSuggestSearchTarget =
+        EntityEventPolicy.concatSubUri(config.getSearchBaseUrl(), config.getSearchEndpoint(),
+            config.getSearchEntityAutoSuggestIndex(), config.getSearchEndpointDocuments());
+
+    aggregationSearchVnfTarget =
+        EntityEventPolicy.concatSubUri(config.getSearchBaseUrl(), config.getSearchEndpoint(),
+            config.getSearchAggregationVnfIndex(), config.getSearchEndpointDocuments());
+
+    this.externalOxmModelProcessors = new ArrayList<ExternalOxmModelProcessor>();
+    this.externalOxmModelProcessors.add(EntityOxmReferenceHelper.getInstance());
+    OxmModelLoader.registerExternalOxmModelProcessors(externalOxmModelProcessors);
+    OxmModelLoader.loadModels();
+    oxmVersionContextMap = OxmModelLoader.getVersionContextMap();
+    parseLatestOxmVersion();
+  }
+
+  private void parseLatestOxmVersion() {
+    int latestVersion = -1;
+    if (oxmVersionContextMap != null) {
+      Iterator it = oxmVersionContextMap.entrySet().iterator();
+      while (it.hasNext()) {
+        Map.Entry pair = (Map.Entry) it.next();
+
+        String version = pair.getKey().toString();
+        int versionNum = Integer.parseInt(version.substring(1, 2));
+
+        if (versionNum > latestVersion) {
+          latestVersion = versionNum;
+          oxmVersion = pair.getKey().toString();
+        }
+
+        logger.info(EntityEventPolicyMsgs.PROCESS_OXM_MODEL_FOUND, pair.getKey().toString());
+      }
+    } else {
+      logger.error(EntityEventPolicyMsgs.PROCESS_OXM_MODEL_MISSING, "");
+    }
+  }
+
+  public void startup() {
+    
+    // Create the indexes in the search service if they do not already exist.
+    createSearchIndex(entityIndexTarget, entitySearchSchema);
+    createSearchIndex(topographicalIndexTarget, topographicalSearchSchema);
+    
+    logger.info(EntityEventPolicyMsgs.ENTITY_EVENT_POLICY_REGISTERED);
+  }
+
+  /**
+   * Creates an index through the search db abstraction
+   * 
+   * @param searchRESTClient
+   *            the REST client configured to contact the search db
+   *            abstraction
+   * @param searchTarget
+   *            the URL to attempt to create the search index
+   * @param schemaLocation
+   *            the location of the mappings file for the index
+   */
+  private void createSearchIndex(String searchTarget, String schemaLocation) {
+     
+    logger.debug("Creating search index, searchTarget = " + searchTarget + ", schemaLocation = " + schemaLocation);
+           
+    MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+    headers.put("Accept", Arrays.asList("application/json"));
+    headers.put(Headers.FROM_APP_ID, Arrays.asList("DL"));
+    headers.put(Headers.TRANSACTION_ID, Arrays.asList(UUID.randomUUID().toString()));
+      
+    try {
+
+      OperationResult result = searchClient.put(searchTarget, loadFileData(schemaLocation), headers,
+                                                MediaType.APPLICATION_JSON_TYPE, null);
+
+      if (!HttpUtil.isHttpResponseClassSuccess(result.getResultCode())) {
+        logger.error(EntityEventPolicyMsgs.FAIL_TO_CREATE_SEARCH_INDEX, searchTarget, result.getFailureCause());
+      } else {
+        logger.info(EntityEventPolicyMsgs.SEARCH_INDEX_CREATE_SUCCESS, searchTarget);
+      }
+
+    } catch (Exception e) {
+      logger.error(EntityEventPolicyMsgs.FAIL_TO_CREATE_SEARCH_INDEX, searchTarget, e.getLocalizedMessage());
+    }
+  }
+
+  /**
+   * Convenience method to load up all the data from a file into a string
+   * 
+   * @param filename the filename to read from disk
+   * @return the data contained within the file
+   * @throws Exception
+   */
+  protected String loadFileData(String filename) throws Exception {
+    StringBuilder data = new StringBuilder();
+    try {
+      BufferedReader in = new BufferedReader(new InputStreamReader(
+          EntityEventPolicy.class.getClassLoader().getResourceAsStream("/" + filename),
+          StandardCharsets.UTF_8));
+      String line;
+
+      while ((line = in.readLine()) != null) {
+        data.append(line);
+      }
+    } catch (Exception e) {
+      throw new Exception("Failed to read from file = " + filename + ".", e);
+    }
+
+    return data.toString();
+  }
+
+
+  /**
+   * Convert object to json.
+   *
+   * @param object the object
+   * @param pretty the pretty
+   * @return the string
+   * @throws JsonProcessingException the json processing exception
+   */
+  public static String convertObjectToJson(Object object, boolean pretty)
+      throws JsonProcessingException {
+    ObjectWriter ow = null;
+
+    if (pretty) {
+      ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
+
+    } else {
+      ow = new ObjectMapper().writer();
+    }
+
+    return ow.writeValueAsString(object);
+  }
+
+  public void returnWithError(Exchange exchange, String payload, String errorMsg){
+    logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE, errorMsg);
+    logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, errorMsg, payload);
+    setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+  }
+  
+  @Override
+  public void process(Exchange exchange) throws Exception {
+
+    long startTime = System.currentTimeMillis();
+
+    String uebPayload = exchange.getIn().getBody().toString();
+
+    JsonNode uebAsJson =null;
+    ObjectMapper mapper = new ObjectMapper();
+    try{
+      uebAsJson = mapper.readTree(uebPayload);
+    } catch (IOException e){
+      returnWithError(exchange, uebPayload, "Invalid Payload");
+      return;
+    }
+
+    // Load the UEB payload data, any errors will result in a failure and discard
+    JSONObject uebObjHeader = getUebHeaderAsJson(uebPayload);
+    if (uebObjHeader == null) {
+      returnWithError(exchange, uebPayload, "Payload is missing event-header");
+      return;
+    }
+
+    UebEventHeader eventHeader = null;
+    eventHeader = initializeUebEventHeader(uebObjHeader.toString());
+
+    // Get src domain from header; discard event if not originated from same domain
+    String payloadSrcDomain = eventHeader.getDomain();
+    if (payloadSrcDomain == null || !payloadSrcDomain.equalsIgnoreCase(this.srcDomain)) {
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Unrecognized source domain '" + payloadSrcDomain + "'", uebPayload);
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Unrecognized source domain '" + payloadSrcDomain + "'");
+
+      setResponse(exchange, ResponseType.SUCCESS, additionalInfo);
+      return;
+    }
+
+    DynamicJAXBContext oxmJaxbContext = loadOxmContext(oxmVersion.toLowerCase());
+    if (oxmJaxbContext == null) {
+      logger.error(EntityEventPolicyMsgs.OXM_VERSION_NOT_SUPPORTED, oxmVersion);
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE, "OXM version mismatch",
+          uebPayload);
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    String action = eventHeader.getAction();
+    if (action == null || !SUPPORTED_ACTIONS.contains(action.toLowerCase())) {
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Unrecognized action '" + action + "'", uebPayload);
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Unrecognized action '" + action + "'");
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    String entityType = eventHeader.getEntityType();
+    if (entityType == null) {
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Payload header missing entity type", uebPayload);
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Payload header missing entity type");
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    String topEntityType = eventHeader.getTopEntityType();
+    if (topEntityType == null) {
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Payload header missing top entity type", uebPayload);
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Payload header top missing entity type");
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    String entityLink = eventHeader.getEntityLink();
+    if (entityLink == null) {
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Payload header missing entity link", uebPayload);
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Payload header missing entity link");
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    // log the fact that all data are in good shape
+    logger.info(EntityEventPolicyMsgs.PROCESS_AAI_ENTITY_EVENT_POLICY_NONVERBOSE, action,
+        entityType);
+    logger.debug(EntityEventPolicyMsgs.PROCESS_AAI_ENTITY_EVENT_POLICY_VERBOSE, action, entityType,
+        uebPayload);
+
+
+    // Process for building AaiEventEntity object
+    String[] entityTypeArr = entityType.split("-");
+    String oxmEntityType = "";
+    for (String entityWord : entityTypeArr) {
+      oxmEntityType += entityWord.substring(0, 1).toUpperCase() + entityWord.substring(1);
+    }
+
+    List<String> searchableAttr =
+        getOxmAttributes(uebPayload, oxmJaxbContext, oxmEntityType, entityType, "searchable");
+    if (searchableAttr == null) {
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Searchable attribute not found for payload entity type '" + entityType + "'");
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Searchable attribute not found for payload entity type '" + entityType + "'",
+          uebPayload);
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    String entityPrimaryKeyFieldName =
+        getEntityPrimaryKeyFieldName(oxmJaxbContext, uebPayload, oxmEntityType, entityType);
+    String entityPrimaryKeyFieldValue = lookupValueUsingKey(uebPayload, entityPrimaryKeyFieldName);
+    if (entityPrimaryKeyFieldValue == null || entityPrimaryKeyFieldValue.isEmpty()) {
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Payload missing primary key attribute");
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Payload missing primary key attribute", uebPayload);
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    AaiEventEntity aaiEventEntity = new AaiEventEntity();
+
+    /*
+     * Use the OXM Model to determine the primary key field name based on the entity-type
+     */
+
+    aaiEventEntity.setEntityPrimaryKeyName(entityPrimaryKeyFieldName);
+    aaiEventEntity.setEntityPrimaryKeyValue(entityPrimaryKeyFieldValue);
+    aaiEventEntity.setEntityType(entityType);
+    aaiEventEntity.setLink(entityLink);
+
+    if (!getSearchTags(aaiEventEntity, searchableAttr, uebPayload, action)) {
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Payload missing searchable attribute for entity type '" + entityType + "'");
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Payload missing searchable attribute for entity type '" + entityType + "'", uebPayload);
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+
+    }
+
+    try {
+      aaiEventEntity.deriveFields();
+
+    } catch (NoSuchAlgorithmException e) {
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Cannot create unique SHA digest");
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Cannot create unique SHA digest", uebPayload);
+
+      setResponse(exchange, ResponseType.FAILURE, additionalInfo);
+      return;
+    }
+
+    handleSearchServiceOperation(aaiEventEntity, action, this.entitySearchTarget);
+
+    handleTopographicalData(uebPayload, action, entityType, oxmEntityType, oxmJaxbContext,
+        entityPrimaryKeyFieldName, entityPrimaryKeyFieldValue);
+
+    /*
+     * Use the versioned OXM Entity class to get access to cross-entity reference helper collections
+     */
+    VersionedOxmEntities oxmEntities =
+        EntityOxmReferenceHelper.getInstance().getVersionedOxmEntities(Version.valueOf(oxmVersion));
+
+    /**
+     * If the entity type is "customer", the below check will return true if any nested entityType
+     * in that model could contain a CER based on the OXM model version that has been loaded.
+     */
+
+    if (oxmEntities != null && oxmEntities.entityModelContainsCrossEntityReference(topEntityType)) {
+
+      // We know the model "can" contain a CER reference definition, let's process a bit more
+
+      HashMap<String, CrossEntityReference> crossEntityRefMap =
+          oxmEntities.getCrossEntityReferences();
+
+      JSONObject entityJsonObject = getUebEntity(uebPayload);
+
+      JsonNode entityJsonNode = convertToJsonNode(entityJsonObject.toString());
+
+      for (String key : crossEntityRefMap.keySet()) {
+
+        /*
+         * if we know service-subscription is in the tree, then we can pull our all instances and
+         * process from there.
+         */
+
+        CrossEntityReference cerDescriptor = crossEntityRefMap.get(key);
+
+        ArrayList<JsonNode> foundNodes = new ArrayList<JsonNode>();
+
+        RouterServiceUtil.extractObjectsByKey(entityJsonNode, key, foundNodes);
+
+        if (foundNodes.size() > 0) {
+
+          for (JsonNode n : foundNodes) {
+
+            List<String> extractedParentEntityAttributeValues = new ArrayList<String>();
+
+            RouterServiceUtil.extractFieldValuesFromObject(n, cerDescriptor.getAttributeNames(),
+                extractedParentEntityAttributeValues);
+
+            List<JsonNode> nestedTargetEntityInstances = new ArrayList<JsonNode>();
+            RouterServiceUtil.extractObjectsByKey(n, cerDescriptor.getTargetEntityType(),
+                nestedTargetEntityInstances);
+
+            for (JsonNode targetEntityInstance : nestedTargetEntityInstances) {
+              /*
+               * Now: 
+               * 1. build the AAIEntityType (IndexDocument) based on the extract entity 
+               * 2. Get data from ES
+               * 3. Extract ETAG 
+               * 4. Merge ES Doc + AAIEntityType + Extracted Parent Cross-Entity-Reference Values
+               * 5. Put data into ES with ETAG + updated doc 
+               */
+
+              OxmEntityDescriptor searchableDescriptor =
+                  oxmEntities.getSearchableEntityDescriptor(cerDescriptor.getTargetEntityType());
+
+              if (searchableDescriptor != null) {
+
+                if (!searchableDescriptor.getSearchableAttributes().isEmpty()) {
+
+                  AaiEventEntity entityToSync = null;
+
+                  try {
+
+                    entityToSync = getPopulatedEntity(targetEntityInstance, searchableDescriptor);
+
+                    /*
+                     * Ready to do some ElasticSearch ops
+                     */
+
+                    for (String parentCrossEntityReferenceAttributeValue : extractedParentEntityAttributeValues) {
+                      entityToSync
+                          .addCrossEntityReferenceValue(parentCrossEntityReferenceAttributeValue);
+                    }
+
+                    entityToSync.setEntityPrimaryKeyName(entityPrimaryKeyFieldName);
+                    entityToSync.setLink(entityLink);
+                    entityToSync.deriveFields();
+
+                    syncEntity(entityToSync);
+
+                  } catch (NoSuchAlgorithmException e) {
+                    e.printStackTrace();
+                  }
+                }
+              } else {
+                logger.debug(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC,
+                    "failure to find searchable descriptor for type "
+                        + cerDescriptor.getTargetEntityType());
+              }
+            }
+
+          }
+
+        } else {
+          logger.debug(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC,
+              "failed to find 0 instances of cross-entity-reference with entity " + key);
+        }
+
+      }
+
+    } else {
+      logger.info(EntityEventPolicyMsgs.CROSS_ENTITY_REFERENCE_SYNC, "skipped due to OXM model for "
+          + topEntityType + " does not contain a cross-entity-reference entity");
+    }
+
+    /*
+     * Process for autosuggestable entities
+     */
+    if (oxmEntities != null) {
+      Map<String, OxmEntityDescriptor> rootDescriptor =
+          oxmEntities.getSuggestableEntityDescriptors();
+      if (!rootDescriptor.isEmpty()) {
+        List<String> suggestibleAttributes = extractSuggestableAttr(oxmEntities, entityType);
+
+        if (suggestibleAttributes == null) {
+          return;
+        }
+
+        List<String> suggestionAliases = extractAliasForSuggestableEntity(oxmEntities, entityType);
+        AggregationEntity ae = new AggregationEntity();
+        ae.setLink(entityLink);
+        ae.deriveFields(uebAsJson);
+
+        handleSuggestiveSearchData(ae, action, this.aggregationSearchVnfTarget);
+
+        /*
+         * It was decided to silently ignore DELETE requests for resources we don't allow to be
+         * deleted. e.g. auto-suggestion deletion is not allowed while aggregation deletion is.
+         */
+        if (!ACTION_DELETE.equalsIgnoreCase(action)) {
+          SearchSuggestionPermutation searchSuggestionPermutation =
+              new SearchSuggestionPermutation();
+          List<ArrayList<String>> permutationsOfStatuses =
+              searchSuggestionPermutation.getSuggestionsPermutation(suggestibleAttributes);
+
+          // Now we have a list of all possible permutations for the status that are
+          // defined for this entity type. Try inserting a document for every combination.
+          for (ArrayList<String> permutation : permutationsOfStatuses) {
+            SuggestionSearchEntity suggestionSearchEntity = new SuggestionSearchEntity();
+            suggestionSearchEntity.setEntityType(entityType);
+            suggestionSearchEntity.setSuggestableAttr(permutation);
+            suggestionSearchEntity.setPayloadFromResponse(uebAsJson);
+            suggestionSearchEntity.setEntityTypeAliases(suggestionAliases);
+            suggestionSearchEntity.setSuggestionInputPermutations(
+                suggestionSearchEntity.generateSuggestionInputPermutations());
+
+            if (suggestionSearchEntity.isSuggestableDoc()) {
+              try {
+                suggestionSearchEntity.deriveFields();
+              } catch (NoSuchAlgorithmException e) {
+                logger.error(EntityEventPolicyMsgs.DISCARD_UPDATING_SEARCH_SUGGESTION_DATA,
+                    "Cannot create unique SHA digest for search suggestion data. Exception: "
+                        + e.getLocalizedMessage());
+              }
+
+              handleSuggestiveSearchData(suggestionSearchEntity, action,
+                  this.autoSuggestSearchTarget);
+            }
+          }
+        }
+      }
+    }
+
+    long stopTime = System.currentTimeMillis();
+
+    metricsLogger.info(EntityEventPolicyMsgs.OPERATION_RESULT_NO_ERRORS, PROCESS_AAI_EVENT,
+        String.valueOf(stopTime - startTime));
+
+    setResponse(exchange, ResponseType.SUCCESS, additionalInfo);
+    return;
+  }
+
+  public List<String> extractSuggestableAttr(VersionedOxmEntities oxmEntities, String entityType) {
+    // Extract suggestable attributes
+    Map<String, OxmEntityDescriptor> rootDescriptor = oxmEntities.getSuggestableEntityDescriptors();
+
+    if (rootDescriptor == null) {
+      return null;
+    }
+
+    OxmEntityDescriptor desc = rootDescriptor.get(entityType);
+    
+    if (desc == null) {
+      return null;
+    }
+
+    return desc.getSuggestableAttributes();
+  }
+
+  public List<String> extractAliasForSuggestableEntity(VersionedOxmEntities oxmEntities,
+      String entityType) {
+
+    // Extract alias
+    Map<String, OxmEntityDescriptor> rootDescriptor = oxmEntities.getEntityAliasDescriptors();
+
+    if (rootDescriptor == null) {
+      return null;
+    }
+
+    OxmEntityDescriptor desc = rootDescriptor.get(entityType);
+    return desc.getAlias();
+  }
+
+  private void setResponse(Exchange exchange, ResponseType responseType, String additionalInfo) {
+
+    exchange.getOut().setHeader("ResponseType", responseType.toString());
+    exchange.getOut().setBody(additionalInfo);
+  }
+
+  public void extractDetailsForAutosuggestion(VersionedOxmEntities oxmEntities, String entityType,
+      List<String> suggestableAttr, List<String> alias) {
+
+    // Extract suggestable attributes
+    Map<String, OxmEntityDescriptor> rootDescriptor = oxmEntities.getSuggestableEntityDescriptors();
+
+    OxmEntityDescriptor desc = rootDescriptor.get(entityType);
+    suggestableAttr = desc.getSuggestableAttributes();
+
+    // Extract alias
+    rootDescriptor = oxmEntities.getEntityAliasDescriptors();
+    desc = rootDescriptor.get(entityType);
+    alias = desc.getAlias();
+  }
+
+  /*
+   * Load the UEB JSON payload, any errors would result to a failure case response.
+   */
+  private JSONObject getUebHeaderAsJson(String payload) {
+
+    JSONObject uebJsonObj;
+    JSONObject uebObjHeader;
+
+    try {
+      uebJsonObj = new JSONObject(payload);
+    } catch (JSONException e) {
+      logger.debug(EntityEventPolicyMsgs.UEB_INVALID_PAYLOAD_JSON_FORMAT, payload);
+      logger.error(EntityEventPolicyMsgs.UEB_INVALID_PAYLOAD_JSON_FORMAT, payload);
+      return null;
+    }
+
+    if (uebJsonObj.has(EVENT_HEADER)) {
+      uebObjHeader = uebJsonObj.getJSONObject(EVENT_HEADER);
+    } else {
+      logger.debug(EntityEventPolicyMsgs.UEB_FAILED_TO_PARSE_PAYLOAD, EVENT_HEADER);
+      logger.error(EntityEventPolicyMsgs.UEB_FAILED_TO_PARSE_PAYLOAD, EVENT_HEADER);
+      return null;
+    }
+
+    return uebObjHeader;
+  }
+
+
+  private UebEventHeader initializeUebEventHeader(String payload) {
+
+    UebEventHeader eventHeader = null;
+    ObjectMapper mapper = new ObjectMapper();
+
+    // Make sure that were were actually passed in a valid string.
+    if (payload == null || payload.isEmpty()) {
+      logger.debug(EntityEventPolicyMsgs.UEB_FAILED_TO_PARSE_PAYLOAD, EVENT_HEADER);
+      logger.error(EntityEventPolicyMsgs.UEB_FAILED_TO_PARSE_PAYLOAD, EVENT_HEADER);
+
+      return eventHeader;
+    }
+
+    // Marshal the supplied string into a UebEventHeader object.
+    try {
+      eventHeader = mapper.readValue(payload, UebEventHeader.class);
+    } catch (JsonProcessingException e) {
+      logger.error(EntityEventPolicyMsgs.UEB_FAILED_UEBEVENTHEADER_CONVERSION, e.toString());
+    } catch (Exception e) {
+      logger.error(EntityEventPolicyMsgs.UEB_FAILED_UEBEVENTHEADER_CONVERSION, e.toString());
+    }
+
+    if (eventHeader != null) {
+      logger.debug(EntityEventPolicyMsgs.UEB_EVENT_HEADER_PARSED, eventHeader.toString());
+    }
+
+    return eventHeader;
+
+  }
+
+
+  private String getEntityPrimaryKeyFieldName(DynamicJAXBContext oxmJaxbContext, String payload,
+      String oxmEntityType, String entityType) {
+
+    DynamicType entity = oxmJaxbContext.getDynamicType(oxmEntityType);
+    if (entity == null) {
+      return null;
+    }
+
+    List<DatabaseField> list = entity.getDescriptor().getPrimaryKeyFields();
+    if (list != null && !list.isEmpty()) {
+      String keyName = list.get(0).getName();
+      return keyName.substring(0, keyName.indexOf('/'));
+    }
+
+    return "";
+  }
+
+  private String lookupValueUsingKey(String payload, String key) throws JSONException {
+    JsonNode jsonNode = convertToJsonNode(payload);
+    return RouterServiceUtil.recursivelyLookupJsonPayload(jsonNode, key);
+  }
+
+  private JsonNode convertToJsonNode(String payload) {
+
+    ObjectMapper mapper = new ObjectMapper();
+    JsonNode jsonNode = null;
+    try {
+      jsonNode = mapper.readTree(mapper.getJsonFactory().createJsonParser(payload));
+    } catch (IOException e) {
+      logger.debug(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, ENTITY_HEADER + " missing",
+          payload.toString());
+      logger.error(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, ENTITY_HEADER + " missing",
+          "");
+    }
+
+    return jsonNode;
+  }
+
+  private boolean getSearchTags(AaiEventEntity aaiEventEntity, List<String> searchableAttr,
+      String payload, String action) {
+
+    boolean hasSearchableAttr = false;
+    for (String searchTagField : searchableAttr) {
+      String searchTagValue = null;
+      if (searchTagField.equalsIgnoreCase(aaiEventEntity.getEntityPrimaryKeyName())) {
+        searchTagValue = aaiEventEntity.getEntityPrimaryKeyValue();
+      } else {
+        searchTagValue = this.lookupValueUsingKey(payload, searchTagField);
+      }
+
+      if (searchTagValue != null && !searchTagValue.isEmpty()) {
+        hasSearchableAttr = true;
+        aaiEventEntity.addSearchTagWithKey(searchTagValue, searchTagField);
+      }
+    }
+    return hasSearchableAttr;
+  }
+
+  /*
+   * Check if OXM version is available. If available, load it.
+   */
+  private DynamicJAXBContext loadOxmContext(String version) {
+    if (version == null) {
+      logger.error(EntityEventPolicyMsgs.FAILED_TO_FIND_OXM_VERSION, version);
+      return null;
+    }
+
+    return oxmVersionContextMap.get(version);
+  }
+
+  private List<String> getOxmAttributes(String payload, DynamicJAXBContext oxmJaxbContext,
+      String oxmEntityType, String entityType, String fieldName) {
+
+    DynamicType entity = (DynamicType) oxmJaxbContext.getDynamicType(oxmEntityType);
+    if (entity == null) {
+      return null;
+    }
+
+    /*
+     * Check for searchable XML tag
+     */
+    List<String> fieldValues = null;
+    Map<String, String> properties = entity.getDescriptor().getProperties();
+    for (Map.Entry<String, String> entry : properties.entrySet()) {
+      if (entry.getKey().equalsIgnoreCase(fieldName)) {
+        fieldValues = Arrays.asList(entry.getValue().split(","));
+        break;
+      }
+    }
+
+    return fieldValues;
+  }
+
+  private JSONObject getUebEntity(String payload) {
+    JSONObject uebJsonObj;
+
+    try {
+      uebJsonObj = new JSONObject(payload);
+    } catch (JSONException e) {
+      logger.debug(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_VERBOSE,
+          "Payload has invalid JSON Format", payload.toString());
+      logger.error(EntityEventPolicyMsgs.DISCARD_AAI_EVENT_NONVERBOSE,
+          "Payload has invalid JSON Format");
+      return null;
+    }
+
+    if (uebJsonObj.has(ENTITY_HEADER)) {
+      return uebJsonObj.getJSONObject(ENTITY_HEADER);
+    } else {
+      logger.debug(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, ENTITY_HEADER + " missing",
+          payload.toString());
+      logger.error(EntityEventPolicyMsgs.FAILED_TO_PARSE_UEB_PAYLOAD, ENTITY_HEADER + " missing");
+      return null;
+    }
+  }
+
+  protected AaiEventEntity getPopulatedEntity(JsonNode entityNode,
+      OxmEntityDescriptor resultDescriptor) {
+    AaiEventEntity d = new AaiEventEntity();
+
+    d.setEntityType(resultDescriptor.getEntityName());
+
+    List<String> primaryKeyValues = new ArrayList<String>();
+    String pkeyValue = null;
+
+    for (String keyName : resultDescriptor.getPrimaryKeyAttributeName()) {
+      pkeyValue = RouterServiceUtil.getNodeFieldAsText(entityNode, keyName);
+      if (pkeyValue != null) {
+        primaryKeyValues.add(pkeyValue);
+      } else {
+        // logger.warn("getPopulatedDocument(), pKeyValue is null for entityType = " +
+        // resultDescriptor.getEntityName());
+        logger.error(EntityEventPolicyMsgs.PRIMARY_KEY_NULL_FOR_ENTITY_TYPE,
+            resultDescriptor.getEntityName());
+      }
+    }
+
+    final String primaryCompositeKeyValue = RouterServiceUtil.concatArray(primaryKeyValues, "/");
+    d.setEntityPrimaryKeyValue(primaryCompositeKeyValue);
+
+    final List<String> searchTagFields = resultDescriptor.getSearchableAttributes();
+
+    /*
+     * Based on configuration, use the configured field names for this entity-Type to build a
+     * multi-value collection of search tags for elastic search entity search criteria.
+     */
+
+
+    for (String searchTagField : searchTagFields) {
+      String searchTagValue = RouterServiceUtil.getNodeFieldAsText(entityNode, searchTagField);
+      if (searchTagValue != null && !searchTagValue.isEmpty()) {
+        d.addSearchTagWithKey(searchTagValue, searchTagField);
+      }
+    }
+
+    return d;
+  }
+
+  private void syncEntity(AaiEventEntity aaiEventEntity) {
+    try {
+      Map<String, List<String>> headers = new HashMap<>();
+      headers.put(Headers.FROM_APP_ID, Arrays.asList("DataLayer"));
+      headers.put(Headers.TRANSACTION_ID, Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
+
+      String entityId = aaiEventEntity.getId();
+
+      // Run the GET to retrieve the ETAG from the search service
+      OperationResult storedEntity =
+          searchClient.get(entitySearchTarget + entityId, headers, MediaType.APPLICATION_JSON_TYPE);
+
+      if (HttpUtil.isHttpResponseClassSuccess(storedEntity.getResultCode())) {
+        List<String> etag = storedEntity.getHeaders().get(Headers.ETAG);
+
+        if (etag != null && etag.size() > 0) {
+          headers.put(Headers.IF_MATCH, etag);
+        } else {
+          logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE,
+              entitySearchTarget + entityId, entityId);
+        }
+
+        searchClient.put(entitySearchTarget + entityId, aaiEventEntity.getAsJson(), headers,
+            MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
+      } else {
+
+        if (storedEntity.getResultCode() == 404) {
+          // entity not found, so attempt to do a PUT
+          searchClient.put(entitySearchTarget + entityId, aaiEventEntity.getAsJson(), headers,
+              MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
+        } else {
+          logger.error(EntityEventPolicyMsgs.FAILED_TO_UPDATE_ENTITY_IN_DOCSTORE,
+              aaiEventEntity.getId(), "SYNC_ENTITY");
+        }
+      }
+    } catch (IOException e) {
+      logger.error(EntityEventPolicyMsgs.FAILED_TO_UPDATE_ENTITY_IN_DOCSTORE,
+          aaiEventEntity.getId(), "SYNC_ENTITY");
+    }
+  }
+
+  /**
+   * Perform create, read, update or delete (CRUD) operation on search engine's suggestive search
+   * index
+   * 
+   * @param eventEntity Entity/data to use in operation
+   * @param action The operation to perform
+   * @param target Resource to perform the operation on
+   * @param allowDeleteEvent Allow delete operation to be performed on resource
+   */
+  private void handleSuggestiveSearchData(DocumentStoreDataEntity eventEntity, String action,
+      String target) {
+    try {
+      Map<String, List<String>> headers = new HashMap<>();
+      headers.put(Headers.FROM_APP_ID, Arrays.asList("DataLayer"));
+      headers.put(Headers.TRANSACTION_ID, Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
+
+      String entityId = eventEntity.getId();
+
+      if ((action.equalsIgnoreCase(ACTION_CREATE) && entityId != null)
+          || action.equalsIgnoreCase(ACTION_UPDATE)) {
+        // Run the GET to retrieve the ETAG from the search service
+        OperationResult storedEntity =
+            searchClient.get(target + entityId, headers, MediaType.APPLICATION_JSON_TYPE);
+
+        if (HttpUtil.isHttpResponseClassSuccess(storedEntity.getResultCode())) {
+          List<String> etag = storedEntity.getHeaders().get(Headers.ETAG);
+
+          if (etag != null && etag.size() > 0) {
+            headers.put(Headers.IF_MATCH, etag);
+          } else {
+            logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, target + entityId,
+                entityId);
+          }
+        }
+
+        String eventEntityStr = eventEntity.getAsJson();
+
+        if (eventEntityStr != null) {
+          searchClient.put(target + entityId, eventEntity.getAsJson(), headers,
+              MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
+        }
+      } else if (action.equalsIgnoreCase(ACTION_CREATE)) {
+        String eventEntityStr = eventEntity.getAsJson();
+
+        if (eventEntityStr != null) {
+          searchClient.post(target, eventEntityStr, headers, MediaType.APPLICATION_JSON_TYPE,
+              MediaType.APPLICATION_JSON_TYPE);
+        }
+      } else if (action.equalsIgnoreCase(ACTION_DELETE)) {
+        // Run the GET to retrieve the ETAG from the search service
+        OperationResult storedEntity =
+            searchClient.get(target + entityId, headers, MediaType.APPLICATION_JSON_TYPE);
+
+        if (HttpUtil.isHttpResponseClassSuccess(storedEntity.getResultCode())) {
+          List<String> etag = storedEntity.getHeaders().get(Headers.ETAG);
+
+          if (etag != null && etag.size() > 0) {
+            headers.put(Headers.IF_MATCH, etag);
+          } else {
+            logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, target + entityId,
+                entityId);
+          }
+
+          searchClient.delete(target + eventEntity.getId(), headers, null);
+        } else {
+          logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, target + entityId,
+              entityId);
+        }
+      } else {
+        logger.error(EntityEventPolicyMsgs.ENTITY_OPERATION_NOT_SUPPORTED, action);
+      }
+    } catch (IOException e) {
+      logger.error(EntityEventPolicyMsgs.FAILED_TO_UPDATE_ENTITY_IN_DOCSTORE, eventEntity.getId(),
+          action);
+    }
+  }
+
+  private void handleSearchServiceOperation(DocumentStoreDataEntity eventEntity, String action,
+      String target) {
+    try {
+
+      Map<String, List<String>> headers = new HashMap<>();
+      headers.put(Headers.FROM_APP_ID, Arrays.asList("DataLayer"));
+      headers.put(Headers.TRANSACTION_ID, Arrays.asList(MDC.get(MdcContext.MDC_REQUEST_ID)));
+
+      String entityId = eventEntity.getId();
+
+      // System.out.println("aaiEventEntity as json = " + aaiEventEntity.getAsJson());
+
+      if ((action.equalsIgnoreCase(ACTION_CREATE) && entityId != null)
+          || action.equalsIgnoreCase(ACTION_UPDATE)) {
+
+        // Run the GET to retrieve the ETAG from the search service
+        OperationResult storedEntity =
+            searchClient.get(target + entityId, headers, MediaType.APPLICATION_JSON_TYPE);
+
+        if (HttpUtil.isHttpResponseClassSuccess(storedEntity.getResultCode())) {
+          List<String> etag = storedEntity.getHeaders().get(Headers.ETAG);
+
+          if (etag != null && etag.size() > 0) {
+            headers.put(Headers.IF_MATCH, etag);
+          } else {
+            logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, target + entityId,
+                entityId);
+          }
+        }
+
+        searchClient.put(target + entityId, eventEntity.getAsJson(), headers,
+            MediaType.APPLICATION_JSON_TYPE, MediaType.APPLICATION_JSON_TYPE);
+      } else if (action.equalsIgnoreCase(ACTION_CREATE)) {
+        searchClient.post(target, eventEntity.getAsJson(), headers, MediaType.APPLICATION_JSON_TYPE,
+            MediaType.APPLICATION_JSON_TYPE);
+      } else if (action.equalsIgnoreCase(ACTION_DELETE)) {
+        // Run the GET to retrieve the ETAG from the search service
+        OperationResult storedEntity =
+            searchClient.get(target + entityId, headers, MediaType.APPLICATION_JSON_TYPE);
+
+        if (HttpUtil.isHttpResponseClassSuccess(storedEntity.getResultCode())) {
+          List<String> etag = storedEntity.getHeaders().get(Headers.ETAG);
+
+          if (etag != null && etag.size() > 0) {
+            headers.put(Headers.IF_MATCH, etag);
+          } else {
+            logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, target + entityId,
+                entityId);
+          }
+
+          searchClient.delete(target + eventEntity.getId(), headers, null);
+        } else {
+          logger.error(EntityEventPolicyMsgs.NO_ETAG_AVAILABLE_FAILURE, target + entityId,
+              entityId);
+        }
+      } else {
+        logger.error(EntityEventPolicyMsgs.ENTITY_OPERATION_NOT_SUPPORTED, action);
+      }
+    } catch (IOException e) {
+      logger.error(EntityEventPolicyMsgs.FAILED_TO_UPDATE_ENTITY_IN_DOCSTORE, eventEntity.getId(),
+          action);
+    }
+  }
+
+  private void handleTopographicalData(String payload, String action, String entityType,
+      String oxmEntityType, DynamicJAXBContext oxmJaxbContext, String entityPrimaryKeyFieldName,
+      String entityPrimaryKeyFieldValue) {
+
+    Map<String, String> topoData = new HashMap<>();
+    String entityLink = "";
+    List<String> topographicalAttr =
+        getOxmAttributes(payload, oxmJaxbContext, oxmEntityType, entityType, "geoProps");
+    if (topographicalAttr == null) {
+      logger.error(EntityEventPolicyMsgs.DISCARD_UPDATING_TOPOGRAPHY_DATA_NONVERBOSE,
+          "Topograhical attribute not found for payload entity type '" + entityType + "'");
+      logger.debug(EntityEventPolicyMsgs.DISCARD_UPDATING_TOPOGRAPHY_DATA_VERBOSE,
+          "Topograhical attribute not found for payload entity type '" + entityType + "'",
+          payload.toString());
+    } else {
+      entityLink = lookupValueUsingKey(payload, "entity-link");
+      for (String topoAttr : topographicalAttr) {
+        topoData.put(topoAttr, lookupValueUsingKey(payload, topoAttr));
+      }
+      updateTopographicalSearchDb(topoData, entityType, action, entityPrimaryKeyFieldName,
+          entityPrimaryKeyFieldValue, entityLink);
+    }
+
+  }
+
+  private void updateTopographicalSearchDb(Map<String, String> topoData, String entityType,
+      String action, String entityPrimaryKeyName, String entityPrimaryKeyValue, String entityLink) {
+
+    TopographicalEntity topoEntity = new TopographicalEntity();
+    topoEntity.setEntityPrimaryKeyName(entityPrimaryKeyName);
+    topoEntity.setEntityPrimaryKeyValue(entityPrimaryKeyValue);
+    topoEntity.setEntityType(entityType);
+    topoEntity.setLatitude(topoData.get(TOPO_LAT));
+    topoEntity.setLongitude(topoData.get(TOPO_LONG));
+    topoEntity.setSelfLink(entityLink);
+    try {
+      topoEntity.setId(TopographicalEntity.generateUniqueShaDigest(entityType, entityPrimaryKeyName,
+          entityPrimaryKeyValue));
+    } catch (NoSuchAlgorithmException e) {
+      logger.error(EntityEventPolicyMsgs.DISCARD_UPDATING_TOPOGRAPHY_DATA_VERBOSE,
+          "Cannot create unique SHA digest for topographical data.");
+    }
+
+    this.handleSearchServiceOperation(topoEntity, action, this.topographicalSearchTarget);
+  }
+
+
+  // put this here until we find a better spot
+  /**
+   * Helper utility to concatenate substrings of a URI together to form a proper URI.
+   * 
+   * @param suburis the list of substrings to concatenate together
+   * @return the concatenated list of substrings
+   */
+  public static String concatSubUri(String... suburis) {
+    String finalUri = "";
+
+    for (String suburi : suburis) {
+
+      if (suburi != null) {
+        // Remove any leading / since we only want to append /
+        suburi = suburi.replaceFirst("^/*", "");
+
+        // Add a trailing / if one isn't already there
+        finalUri += suburi.endsWith("/") ? suburi : suburi + "/";
+      }
+    }
+
+    return finalUri;
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/policy/EntityEventPolicyConfig.java b/src/main/java/org/openecomp/datarouter/policy/EntityEventPolicyConfig.java
new file mode 100644 (file)
index 0000000..8e14be1
--- /dev/null
@@ -0,0 +1,129 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.policy;
+
+public class EntityEventPolicyConfig {
+
+  private String sourceDomain;
+  private String searchBaseUrl;
+  private String searchEndpoint;
+  private String searchEndpointDocuments;
+  private String searchEntitySearchIndex;
+  private String searchTopographySearchIndex;
+  private String searchEntityAutoSuggestIndex;
+  private String searchAggregationVnfIndex;
+  private String searchCertName;
+  private String searchKeystorePwd;
+  private String searchKeystore;
+
+  
+  public String getSourceDomain() {
+    return sourceDomain;
+  }
+  
+  public void setSourceDomain(String sourceDomain) {
+    this.sourceDomain = sourceDomain;
+  }
+  
+  public String getSearchBaseUrl() {
+    return searchBaseUrl;
+  }
+  
+  public void setSearchBaseUrl(String searchBaseUrl) {
+    this.searchBaseUrl = searchBaseUrl;
+  }
+  
+  public String getSearchEndpoint() {
+    return searchEndpoint;
+  }
+  
+  public void setSearchEndpoint(String searchEndpoint) {
+    this.searchEndpoint = searchEndpoint;
+  }
+  
+  public String getSearchEndpointDocuments() {
+    return searchEndpointDocuments;
+  }
+  
+  public void setSearchEndpointDocuments(String searchEndpointDocuments) {
+    this.searchEndpointDocuments = searchEndpointDocuments;
+  }
+  
+  public String getSearchEntitySearchIndex() {
+    return searchEntitySearchIndex;
+  }
+  
+  public void setSearchEntitySearchIndex(String searchEntitySearchIndex) {
+    this.searchEntitySearchIndex = searchEntitySearchIndex;
+  }
+  
+  public String getSearchTopographySearchIndex() {
+    return searchTopographySearchIndex;
+  }
+  
+  public void setSearchTopographySearchIndex(String searchTopographySearchIndex) {
+    this.searchTopographySearchIndex = searchTopographySearchIndex;
+  }
+
+  public String getSearchEntityAutoSuggestIndex() {
+    return searchEntityAutoSuggestIndex;
+  }
+  
+  public void setSearchEntityAutoSuggestIndex(String autoSuggestibleSearchEntitySearchIndex) {
+    this.searchEntityAutoSuggestIndex = autoSuggestibleSearchEntitySearchIndex;
+  }
+
+  public String getSearchCertName() {
+    return searchCertName;
+  }
+  
+  public void setSearchCertName(String searchCertName) {
+    this.searchCertName = searchCertName;
+  }
+  
+  public String getSearchKeystore() {
+    return searchKeystore;
+  }
+  
+  public void setSearchKeystore(String searchKeystore) {
+    this.searchKeystore = searchKeystore;
+  }
+  
+  public String getSearchKeystorePwd() {
+    return searchKeystorePwd;
+  }
+  
+  public void setSearchKeystorePwd(String searchKeystorePwd) {
+    this.searchKeystorePwd = searchKeystorePwd;
+  }
+
+public String getSearchAggregationVnfIndex() {
+    return searchAggregationVnfIndex;
+}
+
+public void setSearchAggregationVnfIndex(String searchAggregationVnfIndex) {
+    this.searchAggregationVnfIndex = searchAggregationVnfIndex;
+}
+}
diff --git a/src/main/java/org/openecomp/datarouter/service/EchoService.java b/src/main/java/org/openecomp/datarouter/service/EchoService.java
new file mode 100644 (file)
index 0000000..e7f6368
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.service;
+
+import org.openecomp.cl.api.LogFields;
+import org.openecomp.cl.api.LogLine;
+import org.openecomp.cl.api.Logger;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.cl.mdc.MdcContext;
+import org.openecomp.datarouter.logging.DataRouterMsgs;
+import org.openecomp.datarouter.util.DataRouterConstants;
+import org.slf4j.MDC;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+
+public class EchoService {
+
+  private static Logger logger = LoggerFactory.getInstance().getLogger(EchoService.class.getName());
+  private static Logger auditLogger =
+      LoggerFactory.getInstance().getAuditLogger(EchoService.class.getName());
+
+  @GET
+  @Path("echo/{input}")
+  @Produces("text/plain")
+  public String ping(@PathParam("input") String input, @Context HttpHeaders headers,
+      @Context UriInfo info, @Context HttpServletRequest req) {
+
+       String fromIp = req.getRemoteAddr();
+    String fromAppId = "";
+    String transId = null;
+
+    if (headers.getRequestHeaders().getFirst("X-FromAppId") != null) {
+      fromAppId = headers.getRequestHeaders().getFirst("X-FromAppId");
+    }
+
+    if ((headers.getRequestHeaders().getFirst("X-TransactionId") == null)
+        || headers.getRequestHeaders().getFirst("X-TransactionId").isEmpty()) {
+      transId = java.util.UUID.randomUUID().toString();
+    } else {
+      transId = headers.getRequestHeaders().getFirst("X-TransactionId");
+    }
+
+    MdcContext.initialize(transId, DataRouterConstants.DATA_ROUTER_SERVICE_NAME, "", fromAppId,
+        fromIp);
+    
+    int status = 200;
+    String respStatusString = "";
+    if (Response.Status.fromStatusCode(status) != null) {
+      respStatusString = Response.Status.fromStatusCode(status).toString();
+    }
+
+    // Generate error log
+    logger.info(DataRouterMsgs.PROCESS_REST_REQUEST, req.getMethod(),
+        req.getRequestURL().toString(), req.getRemoteHost(), Integer.toString(status));
+
+    // Generate audit log.
+    auditLogger.info(DataRouterMsgs.PROCESS_REST_REQUEST,
+        new LogFields().setField(LogLine.DefinedFields.RESPONSE_CODE, status)
+            .setField(LogLine.DefinedFields.RESPONSE_DESCRIPTION, respStatusString),
+        (req != null) ? req.getMethod() : "Unknown",
+        (req != null) ? req.getRequestURL().toString() : "Unknown",
+        (req != null) ? req.getRemoteHost() : "Unknown", Integer.toString(status));
+    MDC.clear();
+
+    return "Hello, " + input + ".";
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/CrossEntityReference.java b/src/main/java/org/openecomp/datarouter/util/CrossEntityReference.java
new file mode 100644 (file)
index 0000000..48f3c27
--- /dev/null
@@ -0,0 +1,97 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Processing and entity wrapper for property transposition logic and UEB processing
+ * 
+ * @author DAVEA
+ */
+public class CrossEntityReference {
+
+  private String targetEntityType;
+
+  private List<String> attributeNames;
+
+  public CrossEntityReference() {
+    this.targetEntityType = null;
+    this.attributeNames = new ArrayList<String>();
+  }
+
+  public String getTargetEntityType() {
+    return targetEntityType;
+  }
+
+  public void setTargetEntityType(String targetEntityType) {
+    this.targetEntityType = targetEntityType;
+  }
+
+  public List<String> getAttributeNames() {
+    return attributeNames;
+  }
+
+  public void setAttributeNames(List<String> attributeNames) {
+    this.attributeNames = attributeNames;
+  }
+
+  public void addAttributeName(String attributeName) {
+    if (!this.attributeNames.contains(attributeName)) {
+      this.attributeNames.add(attributeName);
+    }
+  }
+
+  public void initialize(String crossEntityReferenceValueFromModel) {
+
+    if (crossEntityReferenceValueFromModel == null
+        || crossEntityReferenceValueFromModel.length() == 0) {
+      // or throw an exception due to failure to initialize
+      return;
+    }
+
+    String[] tokens = crossEntityReferenceValueFromModel.split(",");
+
+    if (tokens.length >= 2) {
+      this.targetEntityType = tokens[0];
+
+      for (int x = 1; x < tokens.length; x++) {
+        this.attributeNames.add(tokens[x]);
+      }
+    } else {
+      // throw a CrossEntityReferenceInitializationException??
+    }
+
+  }
+
+  @Override
+  public String toString() {
+    return "CrossEntityReference ["
+        + (targetEntityType != null ? "entityType=" + targetEntityType + ", " : "")
+        + (attributeNames != null ? "attributeNames=" + attributeNames : "") + "]";
+  }
+
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/DataRouterConstants.java b/src/main/java/org/openecomp/datarouter/util/DataRouterConstants.java
new file mode 100644 (file)
index 0000000..f9f5df3
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+public class DataRouterConstants {
+  public static final String DR_FILESEP = (System.getProperty("file.separator") == null) ? "/"
+      : System.getProperty("file.separator");
+
+  public static final String DR_SPECIFIC_CONFIG = System.getProperty("CONFIG_HOME") + DR_FILESEP;
+  
+  public static final String DR_BUNDLECONFIG_NAME = (System.getProperty("BUNDLECONFIG_DIR") == null)
+      ? "bundleconfig" : System.getProperty("BUNDLECONFIG_DIR");
+
+  public static final String DR_HOME_BUNDLECONFIG = (System.getProperty("AJSC_HOME") == null)
+      ? DR_FILESEP + "opt" + DR_FILESEP + "app" + DR_FILESEP 
+          + "datalayer" + DR_FILESEP + DR_BUNDLECONFIG_NAME
+      : System.getProperty("AJSC_HOME") + DR_FILESEP + DR_BUNDLECONFIG_NAME;
+
+  /** This is the etc directory, relative to AAI_HOME. */
+  public static final String DR_HOME_ETC = DR_HOME_BUNDLECONFIG + DR_FILESEP + "etc" + DR_FILESEP;
+
+  public static final String DR_HOME_MODEL = DR_SPECIFIC_CONFIG + "model" + DR_FILESEP;
+  public static final String DR_HOME_AUTH = DR_SPECIFIC_CONFIG + "auth" + DR_FILESEP;
+
+  public static final String DR_CONFIG_FILE = DR_SPECIFIC_CONFIG + "data-router.properties";
+
+  public static final String DR_HOME_ETC_OXM = DR_HOME_ETC + "oxm" + DR_FILESEP;
+  
+
+  // AAI Related
+  public static final String AAI_ECHO_SERVICE = "/util/echo";
+
+  // Logging related
+  public static final String DATA_ROUTER_SERVICE_NAME = "DataRouter";
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/DataRouterProperties.java b/src/main/java/org/openecomp/datarouter/util/DataRouterProperties.java
new file mode 100644 (file)
index 0000000..7e18363
--- /dev/null
@@ -0,0 +1,53 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Properties;
+
+public class DataRouterProperties {
+
+  private static Properties properties;
+
+  static {
+    properties = new Properties();
+    File file = new File(DataRouterConstants.DR_CONFIG_FILE);
+    try {
+      properties.load(new FileInputStream(file));
+    } catch (FileNotFoundException e) {
+      e.printStackTrace();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+
+  public static String get(String key) {
+    return properties.getProperty(key);
+  }
+
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/EntityOxmReferenceHelper.java b/src/main/java/org/openecomp/datarouter/util/EntityOxmReferenceHelper.java
new file mode 100644 (file)
index 0000000..c9e1746
--- /dev/null
@@ -0,0 +1,62 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.util.HashMap;
+
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+
+public class EntityOxmReferenceHelper implements ExternalOxmModelProcessor {
+
+   private static EntityOxmReferenceHelper _instance = null;
+   
+   private HashMap<Version, VersionedOxmEntities> versionedModels;
+   
+   protected EntityOxmReferenceHelper() {
+      this.versionedModels = new HashMap<Version,VersionedOxmEntities>();
+   }
+   
+   public static EntityOxmReferenceHelper getInstance() {
+      if ( _instance == null ) {
+         _instance = new EntityOxmReferenceHelper();
+      }
+      
+      return _instance;
+   }
+   
+   
+   @Override
+   public void onOxmVersionChange(Version version, DynamicJAXBContext context) {
+      VersionedOxmEntities oxmEntities = new VersionedOxmEntities();
+      oxmEntities.initialize(context);
+      this.versionedModels.put(version, oxmEntities);
+      
+   }
+   
+   public VersionedOxmEntities getVersionedOxmEntities(Version version){ 
+      return this.versionedModels.get(version);
+   }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/openecomp/datarouter/util/ExternalOxmModelProcessor.java b/src/main/java/org/openecomp/datarouter/util/ExternalOxmModelProcessor.java
new file mode 100644 (file)
index 0000000..9fcef6f
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+
+/**
+ * Exposes a registration and processing contract so that any load/change of an oxm version will
+ * inform registered model processors.
+ * 
+ * @author davea
+ */
+public interface ExternalOxmModelProcessor {
+  public void onOxmVersionChange(Version version, DynamicJAXBContext context);
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/FileWatcher.java b/src/main/java/org/openecomp/datarouter/util/FileWatcher.java
new file mode 100644 (file)
index 0000000..e382c21
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.io.File;
+import java.util.TimerTask;
+
+public abstract class FileWatcher extends TimerTask {
+  private long timeStamp;
+  private File file;
+
+  public FileWatcher(File file) {
+    this.file = file;
+    this.timeStamp = file.lastModified();
+  }
+
+  public final void run() {
+    long timeStamp = file.lastModified();
+
+    if ((timeStamp - this.timeStamp) > 500) {
+      this.timeStamp = timeStamp;
+      onChange(file);
+    }
+  }
+  
+  protected abstract void onChange(File file);
+}
\ No newline at end of file
diff --git a/src/main/java/org/openecomp/datarouter/util/NodeUtils.java b/src/main/java/org/openecomp/datarouter/util/NodeUtils.java
new file mode 100644 (file)
index 0000000..f957247
--- /dev/null
@@ -0,0 +1,46 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.util.Arrays;
+
+public class NodeUtils {
+  /**
+  * Generate unique sha digest. This method is copy over from NodeUtils class in AAIUI
+  *
+  * @param keys the keys
+  * @return the string
+  */
+  public static String generateUniqueShaDigest(String... keys) {
+    if ((keys == null) || keys.length == 0) {
+      return null;
+    }
+  
+    final String keysStr = Arrays.asList(keys).toString();
+    final String hashedId = org.apache.commons.codec.digest.DigestUtils.sha256Hex(keysStr);
+  
+    return hashedId;
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/OxmModelLoader.java b/src/main/java/org/openecomp/datarouter/util/OxmModelLoader.java
new file mode 100644 (file)
index 0000000..2919ba2
--- /dev/null
@@ -0,0 +1,166 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.ws.rs.core.Response.Status;
+import javax.xml.bind.JAXBException;
+
+import org.eclipse.persistence.jaxb.JAXBContextProperties;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
+import org.openecomp.cl.eelf.LoggerFactory;
+import org.openecomp.datarouter.logging.DataRouterMsgs;
+
+import org.openecomp.datarouter.util.ExternalOxmModelProcessor;
+
+public class OxmModelLoader {
+
+       private static Map<String, DynamicJAXBContext> versionContextMap = new ConcurrentHashMap<String, DynamicJAXBContext>();
+       private static Map<String, Timer> timers = new ConcurrentHashMap<String, Timer>();
+       private static List<ExternalOxmModelProcessor> oxmModelProcessorRegistry = new ArrayList<ExternalOxmModelProcessor>();
+       final static Pattern p = Pattern.compile("aai_oxm_(.*).xml");
+       
+       
+
+       private static org.openecomp.cl.api.Logger logger = LoggerFactory.getInstance()
+                       .getLogger(OxmModelLoader.class.getName());
+
+       public synchronized static void loadModels() {
+               
+               File[] listOfFiles = new File(DataRouterConstants.DR_HOME_MODEL).listFiles();
+
+               if (listOfFiles != null) {
+                       for (File file : listOfFiles) {
+                               if (file.isFile()) {
+                                       Matcher m = p.matcher(file.getName());
+                                       if (m.matches()) {
+                                               try {
+                                                       OxmModelLoader.loadModel(m.group(1), file);
+                                               } catch (Exception e) {
+                                                       logger.error(DataRouterMsgs.INVALID_OXM_FILE, file.getName(), e.getMessage());
+                                               }
+                                       }
+
+                               }
+                       }
+               } else {
+                       logger.error(DataRouterMsgs.INVALID_OXM_DIR, DataRouterConstants.DR_HOME_MODEL);
+               }
+
+
+       }
+       
+       private static void addtimer(String version,File file){
+               TimerTask task = null;
+               task = new FileWatcher(
+                               file) {
+                       protected void onChange(File file) {
+                               // here we implement the onChange
+                               logger.info(DataRouterMsgs.FILE_CHANGED, file.getName());
+
+                               try {
+                                       OxmModelLoader.loadModel(version,file);
+                               } catch (Exception e) {
+                                       e.printStackTrace();
+                               }
+
+                       }
+               };
+
+               if (!timers.containsKey(version)) {
+                       Timer timer = new Timer("oxm-"+version);
+                       timer.schedule(task, new Date(), 10000);
+                       timers.put(version, timer);
+
+               }
+       }
+
+       private synchronized static void loadModel(String version,File file) throws JAXBException, FileNotFoundException {
+
+               
+               InputStream iStream = new FileInputStream(file);
+               Map<String, Object> properties = new HashMap<String, Object>();
+               properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, iStream);
+               final DynamicJAXBContext jaxbContext = DynamicJAXBContextFactory
+                               .createContextFromOXM(Thread.currentThread().getContextClassLoader(), properties);
+               versionContextMap.put(version, jaxbContext);
+               if ( oxmModelProcessorRegistry != null) {
+          for ( ExternalOxmModelProcessor processor : oxmModelProcessorRegistry ) {
+             processor.onOxmVersionChange(Version.valueOf(version),  jaxbContext );
+          }
+         }
+               addtimer(version,file);
+
+       }
+
+       public static DynamicJAXBContext getContextForVersion(String version) throws Exception {
+               if (versionContextMap == null || versionContextMap.isEmpty()) {
+                       loadModels();
+               } else if (!versionContextMap.containsKey(version)) {
+                       try {
+                               loadModel(version,new File (DataRouterConstants.DR_HOME_MODEL + "aai_oxm_" + version + ".xml"));
+                       } catch (Exception e) {
+                               throw new Exception(Status.NOT_FOUND.toString());
+                       }
+               }
+
+               return versionContextMap.get(version);
+       }
+
+       public static Map<String, DynamicJAXBContext> getVersionContextMap() {
+               return versionContextMap;
+       }
+
+       public static void setVersionContextMap(Map<String, DynamicJAXBContext> versionContextMap) {
+               OxmModelLoader.versionContextMap = versionContextMap;
+       }
+       
+       public synchronized static void registerExternalOxmModelProcessors(Collection<ExternalOxmModelProcessor> processors) {
+      if(processors != null) {
+         for(ExternalOxmModelProcessor processor : processors) {
+            if(!oxmModelProcessorRegistry.contains(processor)) {
+               oxmModelProcessorRegistry.add(processor);
+            }
+         }
+      }
+   }
+
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/RouterServiceUtil.java b/src/main/java/org/openecomp/datarouter/util/RouterServiceUtil.java
new file mode 100644 (file)
index 0000000..b30c9f9
--- /dev/null
@@ -0,0 +1,226 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class RouterServiceUtil {
+
+  public static Map<String, String> parseJsonPayloadIntoMap(String jsonPayload) {
+
+    JSONObject jsonObject = new JSONObject(jsonPayload);
+    Map<String, String> map = new HashMap<String, String>();
+    Iterator iter = jsonObject.keys();
+    while (iter.hasNext()) {
+      String key = (String) iter.next();
+      String value = jsonObject.getString(key);
+      map.put(key, value);
+    }
+    return map;
+  }
+
+  public static String getNodeFieldAsText(JsonNode node, String fieldName) {
+
+    String fieldValue = null;
+
+    JsonNode valueNode = node.get(fieldName);
+
+    if (valueNode != null) {
+      fieldValue = valueNode.asText();
+    }
+
+    return fieldValue;
+  }
+
+  public static String concatArray(List<String> list) {
+    return concatArray(list, " ");
+  }
+
+  public static String concatArray(List<String> list, String delimiter) {
+
+    if (list == null || list.size() == 0) {
+      return "";
+    }
+
+    StringBuilder result = new StringBuilder(64);
+
+    boolean firstValue = true;
+
+    for (String item : list) {
+
+      if (firstValue) {
+        result.append(item);
+        firstValue = false;
+      } else {
+        result.append(delimiter).append(item);
+      }
+    }
+
+    return result.toString();
+
+  }
+
+  public static String concatArray(String[] values) {
+
+    if (values == null || values.length == 0) {
+      return "";
+    }
+
+    StringBuilder result = new StringBuilder(64);
+
+    boolean firstValue = true;
+
+    for (String item : values) {
+
+      if (firstValue) {
+        result.append(item);
+        firstValue = false;
+      } else {
+        result.append(".").append(item);
+      }
+
+    }
+
+    return result.toString();
+
+  }
+
+  public static String recursivelyLookupJsonPayload(JsonNode node, String key) {
+    String value = null;
+    if (node.isObject()) {
+      Iterator<Map.Entry<String, JsonNode>> nodeIterator = node.fields();
+
+      while (nodeIterator.hasNext()) {
+        Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodeIterator.next();
+        if (!entry.getValue().isValueNode()) {
+          value = recursivelyLookupJsonPayload(entry.getValue(), key);
+          if (value != null) {
+            return value;
+          }
+        }
+
+        String name = entry.getKey();
+        if (name.equalsIgnoreCase(key)) {
+          return entry.getValue().asText();
+        }
+      }
+    } else if (node.isArray()) {
+      Iterator<JsonNode> arrayItemsIterator = node.elements();
+      while (arrayItemsIterator.hasNext()) {
+        value = recursivelyLookupJsonPayload(arrayItemsIterator.next(), key);
+        if (value != null) {
+          return value;
+        }
+      }
+    }
+    return value;
+  }
+
+  public static void extractObjectsByKey(JsonNode node, String searchKey,
+      Collection<JsonNode> foundObjects) {
+
+    if (node.isObject()) {
+      Iterator<Map.Entry<String, JsonNode>> nodeIterator = node.fields();
+
+      while (nodeIterator.hasNext()) {
+        Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodeIterator.next();
+        if (!entry.getValue().isValueNode()) {
+          extractObjectsByKey(entry.getValue(), searchKey, foundObjects);
+        }
+
+        String name = entry.getKey();
+        if (name.equalsIgnoreCase(searchKey)) {
+
+          JsonNode entryValue = entry.getValue();
+
+          if (entryValue.isArray()) {
+
+            Iterator<JsonNode> arrayItemsIterator = entryValue.elements();
+            while (arrayItemsIterator.hasNext()) {
+              foundObjects.add(arrayItemsIterator.next());
+            }
+
+          } else {
+            foundObjects.add(entry.getValue());
+          }
+        }
+      }
+    } else if (node.isArray()) {
+      Iterator<JsonNode> arrayItemsIterator = node.elements();
+      while (arrayItemsIterator.hasNext()) {
+        extractObjectsByKey(arrayItemsIterator.next(), searchKey, foundObjects);
+      }
+    }
+  }
+
+  public static void convertArrayIntoList(JsonNode node, Collection<JsonNode> instances) {
+
+    if (node.isArray()) {
+      Iterator<JsonNode> arrayItemsIterator = node.elements();
+      while (arrayItemsIterator.hasNext()) {
+        instances.add(arrayItemsIterator.next());
+      }
+    } else {
+      instances.add(node);
+    }
+  }
+
+  public static void extractFieldValuesFromObject(JsonNode node,
+      Collection<String> attributesToExtract, Collection<String> fieldValues) {
+
+    if (node.isObject()) {
+
+      JsonNode valueNode = null;
+
+      for (String attrToExtract : attributesToExtract) {
+
+        valueNode = node.get(attrToExtract);
+
+        if (valueNode != null) {
+
+          if (valueNode.isValueNode()) {
+            fieldValues.add(valueNode.asText());
+          }
+        }
+      }
+    }
+  }
+
+
+  public static String objToJson(Object obj) {
+    JSONObject jsonObject = new JSONObject(obj);
+    String json = jsonObject.toString();
+    return json;
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/SearchSuggestionPermutation.java b/src/main/java/org/openecomp/datarouter/util/SearchSuggestionPermutation.java
new file mode 100644 (file)
index 0000000..91f5910
--- /dev/null
@@ -0,0 +1,89 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SearchSuggestionPermutation {
+  /*
+   * Will return all the unique combinations of the suggestions provided.
+   * The order of the permutation is not taken into account when computing
+   * the uniqueness.
+   * e.g.: A list of A,B,C,D will return
+   * [[A], [A, B, C, D], [A, C, D], [A, D], [B], [B, C, D], [B, D], [C], [C, D], [D]]
+   * 
+   * @param list The list of statuses to create permutations of
+   * @return     A list which contains a array list of all possible combinations
+   */
+  @SuppressWarnings("serial")
+  public List<ArrayList<String>> getSuggestionsPermutation(List<String> list) {
+    List<String> statusList = new ArrayList<>(list);
+    List<String> dupStatusList;
+    ArrayList<ArrayList<String>> uniqueList = new ArrayList<>();
+    int mainLoopIndexCounter = 0;
+
+    for (String status : statusList) {
+      // Add the single entity subset
+      //This will add the unique single values eg [A],[B],[C],[D]
+      uniqueList.add(new ArrayList<String>() {
+        {
+          add(status);
+        }
+      });
+
+      // Remove all the elements to left till the current index
+      dupStatusList = truncateListUntill(statusList, mainLoopIndexCounter);
+
+      while (!dupStatusList.isEmpty()) {
+        ArrayList<String> suggListInIterate= new ArrayList<>();
+        suggListInIterate.add(status);
+
+        for (String dupStatus : dupStatusList) {
+          suggListInIterate.add(dupStatus);
+        }
+
+        uniqueList.add(suggListInIterate);
+        dupStatusList.remove(0);
+      }
+
+      mainLoopIndexCounter++;
+    }
+
+    return uniqueList;
+  }
+
+  private List<String> truncateListUntill(List<String> lists, int index) {
+    List<String> truncatedList = new ArrayList<>(lists);
+    int counter = 0;
+
+    while (counter <= index) {
+      truncatedList.remove(0);
+      counter++;
+    }
+
+    return truncatedList;
+  }
+}
diff --git a/src/main/java/org/openecomp/datarouter/util/Version.java b/src/main/java/org/openecomp/datarouter/util/Version.java
new file mode 100644 (file)
index 0000000..a0b3e5f
--- /dev/null
@@ -0,0 +1,29 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+public enum Version {
+  v2, v3, v4, v5, v6, v7, v8, v9, v10;
+}
\ No newline at end of file
diff --git a/src/main/java/org/openecomp/datarouter/util/VersionedOxmEntities.java b/src/main/java/org/openecomp/datarouter/util/VersionedOxmEntities.java
new file mode 100644 (file)
index 0000000..46c4a76
--- /dev/null
@@ -0,0 +1,352 @@
+/**
+ * ============LICENSE_START=======================================================
+ * DataRouter
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property.
+ * Copyright © 2017 Amdocs
+ * 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=========================================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ */
+package org.openecomp.datarouter.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import org.eclipse.persistence.dynamic.DynamicType;
+import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.internal.oxm.XPathFragment;
+import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+import org.eclipse.persistence.mappings.DatabaseMapping;
+import org.eclipse.persistence.oxm.XMLField;
+import org.openecomp.datarouter.entity.OxmEntityDescriptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Builds up a representation of the versioned entities in a way that they can be cross referenced
+ * in a data-driven way
+ * @author DAVEA
+ */
+public class VersionedOxmEntities {
+
+   private static final Logger logger = LoggerFactory.getLogger(VersionedOxmEntities.class);
+   private static final String REST_ROOT_ENTITY = "inventory";
+
+   private HashMap<String,Boolean> crossEntityReferenceContainerLookup = new HashMap<String,Boolean>();
+   private HashMap<String,CrossEntityReference> crossEntityReferenceLookup = new HashMap<String,CrossEntityReference>();
+   private Map<String,DynamicType> entityTypeLookup = new LinkedHashMap<String,DynamicType>();
+   private Map<String, OxmEntityDescriptor> searchableEntityDescriptors = new HashMap<String, OxmEntityDescriptor>();
+   private Map<String, OxmEntityDescriptor> suggestableEntityDescriptors = new HashMap<String, OxmEntityDescriptor>();
+   private Map<String, OxmEntityDescriptor> entityAliasDescriptors = new HashMap<String, OxmEntityDescriptor>();
+
+   
+   public void initialize(DynamicJAXBContext context) {
+      parseOxmContext(context);
+      buildCrossEntityReferenceCollections(REST_ROOT_ENTITY, new HashSet<String>());
+      populateSearchableDescriptors(context);
+   }
+   
+   /**
+    * The big goal for these methods is to make the processing as generic and model driven as possible.  There are only two 
+    * exceptions to this rule, at the moment.  I needed to hard-coded the top level REST data model entity type, which is
+    * "inventory" for now.   And as this class is heavily focused and coupled towards building a version specific set of 
+    * lookup structures for the "crossEntityReference" model attribute, it possesses knowledge of that attribute whether it 
+    * exists or not in the DynamicJAXBContext we are currently analyzing.
+    * 
+    * This method will build two collections:
+    * 
+    * 1)  A list of entity types that can have nested entities containing cross entity reference definitions.  The purpose
+    *     of this collection is a fail-fast test when processing UEB events so we can quickly determine if it is necessary
+    *     to deeply parse the event looking for cross entity reference attributes which not exist.
+    *     
+    *     For example, looking at a service-instance <=> inventory path:
+    *     
+    *     inventory (true)
+    *     -> business (true)
+    *        -> customers  (true)
+    *           -> customer  (true)
+    *              -> service-subscriptions (true)
+    *                 -> service-subscription (CER defined here in the model)   (true)
+    *                    -> service-instances    (false)
+    *                       -> service-instance   (false)
+    *     
+    *     Because service-subscription contains a model definition of CER, in the first collection all the types in the tree will
+    *     indicate that it possesses one or more contained entity types with a cross-entity-reference definition.
+    *     
+    * 2)  A lookup for { entityType => CrossEntityReference } so we can quickly access the model definition of a CER for
+    *     a specific entity type when we begin extracting parent attributes for transposition into nested child entity types.
+    * 
+    * 
+    * @param entityType
+    * @param checked
+    * @return
+    */
+   protected boolean buildCrossEntityReferenceCollections(String entityType, HashSet<String> checked) {
+
+      /*
+       * To short-circuit infinite loops, make sure this entityType hasn't
+       * already been checked
+       */
+
+      if(checked.contains(entityType)) {
+         return false;
+      }
+      else {
+         checked.add(entityType);
+      }
+
+      DynamicType parentType = entityTypeLookup.get(entityType);
+      DynamicType childType = null;
+      boolean returnValue = false;
+
+      if(parentType == null) {
+         return returnValue;
+      }
+
+      /*
+       * Check if current descriptor contains the cross-entity-reference
+       * attribute. If it does not walk the entity model looking for nested
+       * entity types that may contain the reference.
+       */
+
+      Map<String, String> properties = parentType.getDescriptor().getProperties();
+      if(properties != null) {
+         for(Map.Entry<String, String> entry : properties.entrySet()) {
+            if(entry.getKey().equalsIgnoreCase("crossEntityReference")) {
+               returnValue = true;
+               CrossEntityReference cer = new CrossEntityReference();
+               cer.initialize(entry.getValue());
+               crossEntityReferenceLookup.put( entityType, cer);
+               //System.out.println("entityType = " + entityType + " contains a CER instance = " + returnValue);
+              // return true;
+            }
+         }
+      }
+
+      Vector<DatabaseField> fields = parentType.getDescriptor().getAllFields();
+
+      if(fields != null) {
+
+         XMLField xmlField = null;
+         for(DatabaseField f : fields) {
+
+            if(f instanceof XMLField) {
+               xmlField = (XMLField)f;
+               XPathFragment xpathFragment = xmlField.getXPathFragment();
+               String entityShortName = xpathFragment.getLocalName();
+
+               childType = entityTypeLookup.get(entityShortName);
+
+               if(childType != null) {
+
+                  if(!checked.contains(entityShortName)) {
+
+                     if(buildCrossEntityReferenceCollections(entityShortName,checked)) {
+                        returnValue = true;
+                     }
+
+                  }
+
+                  checked.add(entityShortName);
+
+               }
+
+            }
+
+         }
+
+      }
+
+      crossEntityReferenceContainerLookup.put(entityType, Boolean.valueOf(returnValue));
+      return returnValue;
+   }
+   
+   private void populateSearchableDescriptors(DynamicJAXBContext oxmContext) {
+      List<Descriptor> descriptorsList = oxmContext.getXMLContext().getDescriptors();
+      OxmEntityDescriptor newOxmEntity = null;
+      
+      for (Descriptor desc: descriptorsList) {
+         
+         DynamicType entity = (DynamicType) oxmContext.getDynamicType(desc.getAlias());
+         
+         //LinkedHashMap<String, String> oxmProperties = new LinkedHashMap<String, String>();
+         String primaryKeyAttributeNames = null;
+         
+         //Not all fields have key attributes
+         if (desc.getPrimaryKeyFields() != null) {
+            primaryKeyAttributeNames = desc.getPrimaryKeyFields().toString().replaceAll("/text\\(\\)", "").replaceAll("\\[", "").replaceAll("\\]", "");
+         }
+         
+         String entityName = desc.getDefaultRootElement();
+         
+         Map<String, String> properties = entity.getDescriptor().getProperties();
+         if (properties != null) {
+            for (Map.Entry<String, String> entry : properties.entrySet()) {
+               if (entry.getKey().equalsIgnoreCase("searchable")) {
+                  
+                  /*
+                   * we can do all the work here, we don't have a create additional collections for 
+                   * subsequent passes
+                   */
+                  newOxmEntity = new OxmEntityDescriptor();
+                  newOxmEntity.setEntityName(entityName);
+                  newOxmEntity.setPrimaryKeyAttributeName(Arrays.asList(primaryKeyAttributeNames.split(",")));
+                  newOxmEntity.setSearchableAttributes(Arrays.asList(entry.getValue().split(",")));
+                  searchableEntityDescriptors.put(entityName, newOxmEntity);
+               } else if (entry.getKey().equalsIgnoreCase("containsSuggestibleProps")) {
+                 newOxmEntity = new OxmEntityDescriptor();
+                 newOxmEntity.setEntityName(entityName);
+                 newOxmEntity.setSuggestableEntity(true);
+                 Vector<DatabaseMapping> descriptorMaps = entity.getDescriptor().getMappings();
+                 List<String> listOfSuggestableAttributes = new ArrayList<String>();
+                 
+                 for (DatabaseMapping descMap : descriptorMaps) {
+                   if (descMap.isAbstractDirectMapping()) {
+                     
+                     if (descMap.getProperties().get("suggestibleOnSearch") != null) {
+                       String suggestableOnSearchString = String.valueOf(
+                           descMap.getProperties().get("suggestibleOnSearch"));
+                       
+                       boolean isSuggestibleOnSearch = Boolean.valueOf(suggestableOnSearchString);
+
+                       if (isSuggestibleOnSearch) {
+                         /* Grab attribute types for suggestion */
+                         String attributeName = descMap.getField().getName()
+                             .replaceAll("/text\\(\\)", "");
+                         listOfSuggestableAttributes.add(attributeName);
+                       }
+                     }
+                   }
+                 }
+                 newOxmEntity.setSuggestableAttributes(listOfSuggestableAttributes);
+                 suggestableEntityDescriptors.put(entityName, newOxmEntity);
+               } else if (entry.getKey().equalsIgnoreCase("suggestionAliases")) {
+                 newOxmEntity = new OxmEntityDescriptor();
+                 newOxmEntity.setEntityName(entityName);
+                 newOxmEntity.setAlias(Arrays.asList(entry.getValue().split(",")));
+                 entityAliasDescriptors.put(entityName, newOxmEntity);
+               }
+            }
+         }
+         
+      }
+      
+   }
+   
+   public Map<String, OxmEntityDescriptor> getSearchableEntityDescriptors() {
+      return searchableEntityDescriptors;
+   }
+   
+   public OxmEntityDescriptor getSearchableEntityDescriptor(String entityType) {
+      return searchableEntityDescriptors.get(entityType);
+   }
+
+
+   public HashMap<String,Boolean> getCrossEntityReferenceContainers() {
+      return crossEntityReferenceContainerLookup;
+   }
+   
+   public HashMap<String,CrossEntityReference> getCrossEntityReferences() {
+      return crossEntityReferenceLookup;
+   }
+   
+
+   private void parseOxmContext(DynamicJAXBContext oxmContext) {
+      List<Descriptor> descriptorsList = oxmContext.getXMLContext().getDescriptors();
+
+      for(Descriptor desc : descriptorsList) {
+
+         DynamicType entity = (DynamicType)oxmContext.getDynamicType(desc.getAlias());
+
+         String entityName = desc.getDefaultRootElement();
+
+         entityTypeLookup.put(entityName, entity);
+
+      }
+
+   }
+
+   public boolean entityModelContainsCrossEntityReference(String containerEntityType) {
+      Boolean v = crossEntityReferenceContainerLookup.get(containerEntityType);
+
+      if(v == null) {
+         return false;
+      }
+
+      return v;
+   }
+   
+   public boolean entityContainsCrossEntityReference(String entityType) {
+      return (crossEntityReferenceLookup.get(entityType) != null);
+   }   
+
+   public CrossEntityReference getCrossEntityReference(String entityType) {
+      return crossEntityReferenceLookup.get(entityType);
+   }   
+   
+   public Map<String, OxmEntityDescriptor> getSuggestableEntityDescriptors() {
+    return suggestableEntityDescriptors;
+  }
+
+  public void setSuggestableEntityDescriptors(
+      Map<String, OxmEntityDescriptor> suggestableEntityDescriptors) {
+    this.suggestableEntityDescriptors = suggestableEntityDescriptors;
+  }
+
+  public Map<String, OxmEntityDescriptor> getEntityAliasDescriptors() {
+    return entityAliasDescriptors;
+  }
+
+  public void setEntityAliasDescriptors(Map<String, OxmEntityDescriptor> entityAliasDescriptors) {
+    this.entityAliasDescriptors = entityAliasDescriptors;
+  }
+
+  public void extractEntities(String entityType, DynamicJAXBContext context, Collection<DynamicType> entities) {
+      
+      
+      
+      
+   }
+   
+   public String dumpCrossEntityReferenceContainers() {
+      
+      Set<String> keys = crossEntityReferenceContainerLookup.keySet();
+      StringBuilder sb = new StringBuilder(128);
+      
+      for ( String key : keys ) {
+
+         if ( crossEntityReferenceContainerLookup.get(key) ) {
+            sb.append("\n").append("Entity-Type = '" + key + "' contains a Cross-Entity-Reference.");   
+         }
+      }
+      
+      
+      return sb.toString();
+      
+   }
+   
+}
\ No newline at end of file
diff --git a/src/main/resources/entitysearch_schema.json b/src/main/resources/entitysearch_schema.json
new file mode 100644 (file)
index 0000000..5ff7625
--- /dev/null
@@ -0,0 +1,35 @@
+{ 
+   "fields": [
+      {    
+           "name": "entityType", 
+           "data-type": "string",
+           "searchable": "true",
+           "index-analyzer": "ngram_analyzer"
+      },
+      {    
+           "name": "entityPrimaryKeyValue", 
+           "data-type": "string", 
+           "searchable": "false"
+      },
+      {
+           "name": "searchTagIDs", 
+           "data-type": "string", 
+           "searchable": "true"
+      },
+      {
+           "name": "searchTags", 
+           "data-type": "string", 
+           "index-analyzer": "ngram_analyzer"
+      },
+      {
+           "name": "crossEntityReferenceValues", 
+           "data-type": "string", 
+           "index-analyzer": "ngram_analyzer"
+      },
+      {
+           "name": "lastmodTimestamp", 
+           "data-type": "date", 
+           "format": "MMM d y HH:m:s||dd-MM-yyyy HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss.SSSZZ||yyyy-MM-dd HH:mm:ss||MM\/dd\/yyyy||yyyyMMdd'T'HHmmssZ"
+      }
+   ]
+}
diff --git a/src/main/resources/logging/DataRouterMsgs.properties b/src/main/resources/logging/DataRouterMsgs.properties
new file mode 100644 (file)
index 0000000..352f239
--- /dev/null
@@ -0,0 +1,135 @@
+#Resource key=Error Code|Message text|Resolution text |Description text
+#######
+#Newlines can be utilized to add some clarity ensuring continuing line
+#has atleast one leading space
+#ResourceKey=\
+#             ERR0000E\
+#             Sample error msg txt\
+#             Sample resolution msg\
+#             Sample description txt
+#
+######
+#Error code classification category
+#000  Info/Debug
+#100  Permission errors
+#200  Availability errors/Timeouts
+#300  Data errors
+#400  Schema Interface type/validation errors
+#500  Business process errors
+#900  Unknown errors
+#
+########################################################################
+
+#Resource key=Error Code|Message text|Resolution text |Description text
+#######
+#Newlines can be utilized to add some clarity ensuring continuing line
+#has atleast one leading space
+#ResourceKey=\
+#             ERR0000E\
+#             Sample error msg txt\
+#             Sample resolution msg\
+#             Sample description txt
+#
+######
+#Error code classification category
+#000  Info/Debug
+#100  Permission errors
+#200  Availability errors/Timeouts
+#300  Data errors
+#400  Schema Interface type/validation errors
+#500  Business process errors
+#900  Unknown errors
+#
+########################################################################
+
+SERVICE_STARTED=\
+            DataRouter service started
+            
+FILE_CHANGED=\
+            DR0002I|\
+            File {0} has been changed!
+            
+FILE_RELOADED=\
+            DR0003I|\
+            File {0} has been reloaded!
+          
+REPORT_CONFIG_WATCHER_INT=\
+            DR0004I|\
+            Config Watcher Interval = {0}   
+                  
+LOADING_PROPERTIES=\
+            DR0005I|\
+            Loading properties - {0}
+                
+PROPERTIES_LOADED=\
+            DR0006I|\
+            File {0} is loaded into the map and the corresponding system properties have been refreshed     
+            
+UEB_NO_EVENTS_RECEIVED=\
+            DR0007I|\
+            Received no events on topic: {0}     
+
+CONFIGURING_ROUTING_POLICIES=\
+            DR0008I|\
+            Configuring routing policies on Data Layer              
+            
+PROCESS_REST_REQUEST=\
+            DR0009I|\
+            Received request {0} {1} from {2}.  Sending response: {3}
+            
+PROCESS_EVENT=\
+            DR0010I|\
+            Processed event {0}.  Result: {1}
+            
+STARTUP_FAILURE=\
+            DR2001E|\
+            DecoratorService failed to start up. Reason: {0}
+            
+UEB_CONNECT_ERR=\
+            DR2002E|\
+            Failed to query UEB for event topic {0}: {1}
+            
+QUERY_ROUTING_ERR=\
+            DR2003E|\
+            Failed to route query for event topic {0}: {1} 
+            
+LOAD_PROPERTIES_FAILURE=\
+            DR3001E|\
+            File {0} cannot be loaded into the map.                        
+
+FILE_MON_BLOCK_ERR=\
+            DR3002E|\
+            Error in the file monitor block.            
+            
+CREATE_PROPERTY_MAP_ERR=\
+            DR3003E|\
+            Error creating property map.
+            
+FILE_STREAM_ERR=\
+            DR3004E|\
+            Error reading the file stream.    
+                     
+ROUTING_POLICY_CONFIGURATION_ERROR=\
+            DR3005E|\
+            Could not configure routing policy {0} for source {1} and action {2}
+                     
+BAD_REST_REQUEST=\
+            DR3006E|\
+            Bad Rest Request {0}  
+            
+FAIL_TO_CREATE_SEARCH_INDEX=\
+         DR3008E|\
+         Failed to create Search index {0} due to: {1}      
+         
+INVALID_OXM_FILE=\
+            DR3009E|\
+            Unable to parse schema file: {0} due to error : {1}\
+            
+INVALID_OXM_DIR=\
+            DR3010E|\
+            Invalid OXM dir: {0}\       
+             
+SYSTEM_ERROR=\
+            DR3011E|\
+            System Error: {0}\ 
+            
diff --git a/src/main/resources/logging/EntityEventPolicyMsgs.properties b/src/main/resources/logging/EntityEventPolicyMsgs.properties
new file mode 100644 (file)
index 0000000..3fac391
--- /dev/null
@@ -0,0 +1,122 @@
+#Resource key=Error Code|Message text|Resolution text |Description text
+#######
+#Newlines can be utilized to add some clarity ensuring continuing line
+#has atleast one leading space
+#ResourceKey=\
+#             ERR0000E\
+#             Sample error msg txt\
+#             Sample resolution msg\
+#             Sample description txt
+#
+######
+#Error code classification category
+#000  Info/Debug
+#100  Permission errors
+#200  Availability errors/Timeouts
+#300  Data errors
+#400  Schema Interface type/validation errors
+#500  Business process errors
+#900  Unknown errors
+#
+########################################################################
+
+
+DISCARD_AAI_EVENT_VERBOSE=\
+         EEP0001E|\
+         Discarding event. Reason: {0}. Payload: {1}
+       
+DISCARD_AAI_EVENT_NONVERBOSE=\
+         EEP0002E|\
+         Discarding event. Reason: {0}
+
+OXM_VERSION_NOT_SUPPORTED=\
+         EEP0003E|\
+         OXM version: {0} is not supported.
+
+FAILED_TO_PARSE_UEB_PAYLOAD=\
+         EEP0004E|\
+         Failed to parse UEB payload. {0}. {1}
+
+NO_ETAG_AVAILABLE_FAILURE=\
+         EEP0005E|\
+         Unable to retrieve etag at {0} for entity with id {1}
+
+ENTITY_OPERATION_NOT_SUPPORTED=\
+         EEP0006E|\
+         Action: {0} is not supported.
+
+FAILED_TO_UPDATE_ENTITY_IN_DOCSTORE=\
+         EEP007E|\
+         Failed to update entity {0} with operation {1} 
+
+DISCARD_UPDATING_SEARCH_SUGGESTION_DATA=\
+         EEP010E|\
+         Discarding search suggestion data. Reason: {0}
+
+DISCARD_UPDATING_TOPOGRAPHY_DATA_VERBOSE=\
+         EEP008E|\
+         Discarding topographical data. Reason: {0}. Payload: {1}
+       
+DISCARD_UPDATING_TOPOGRAPHY_DATA_NONVERBOSE=\
+         EEP009E|\
+         Discarding topographical data. Reason: {0}.
+
+PROCESS_OXM_MODEL_MISSING=\
+         EEP010E|\
+         Failed to load OXM Model.
+
+FAILED_TO_FIND_OXM_VERSION=\
+         EEP011E|\
+         Failed to find OXM version in UEB payload. {0}
+
+FAIL_TO_CREATE_SEARCH_INDEX=\
+         EEP012E|\
+         Failed to create Search index {0} due to: {1}   
+
+PROCESS_AAI_ENTITY_EVENT_POLICY_VERBOSE=\
+         EEP0001I|\
+         Processing AAI Entity Event Policy: [Action: {0} Entity Type: {1}]. Payload: {2}
+
+PROCESS_AAI_ENTITY_EVENT_POLICY_NONVERBOSE=\
+         EEP0002I|\
+         Processing AAI Entity Event Policy: [Action: {0} Entity Type: {1}].
+
+CROSS_ENTITY_REFERENCE_SYNC=\
+            EEP0003I|\
+            Cross Entity Reference synchronization {0}
+            
+OPERATION_RESULT_NO_ERRORS=\
+         EEP0004I|\
+         Operation {0} completed in {1} ms with no errors
+
+PROCESS_OXM_MODEL_FOUND=\
+         EEP0005I|\
+         Found OXM model: {0}
+         
+SEARCH_INDEX_CREATE_SUCCESS=\
+         EEP0006I|\
+         Successfully created index at {0}
+
+ENTITY_EVENT_POLICY_REGISTERED=\
+            EEP0007I|\
+            Entity Event Policy component started.
+
+UEB_EVENT_HEADER_PARSED=\
+                       EE0008I|\
+                       Parsed UEB event header {0}
+
+PRIMARY_KEY_NULL_FOR_ENTITY_TYPE=\
+                       EEP0301E|\
+                       Primary key value is null for entity type: {0}
+
+UEB_INVALID_PAYLOAD_JSON_FORMAT=\
+                       EE0302E|\
+                       Payload has invalid JSON format: {0} 
+            
+UEB_FAILED_TO_PARSE_PAYLOAD=\
+                       EE0303E|\
+                       {0} missing
+
+UEB_FAILED_UEBEVENTHEADER_CONVERSION=\
+                       EE0304E|\
+                       {0}
\ No newline at end of file
diff --git a/src/main/resources/topographysearch_schema.json b/src/main/resources/topographysearch_schema.json
new file mode 100644 (file)
index 0000000..d542631
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "fields": [
+              {"name": "pkey", "data-type": "string", "searchable": "false"},
+              {"name": "entityType", "data-type": "string", "searchable": "false"},
+              {"name": "location", "data-type": "geo_point", "searchable": "false"},
+              {"name": "selfLink", "data-type": "string", "searchable": "false"}
+       ]
+}
\ No newline at end of file
diff --git a/src/main/runtime/context/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.context b/src/main/runtime/context/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.context
new file mode 100644 (file)
index 0000000..8514196
--- /dev/null
@@ -0,0 +1 @@
+{"context":{"contextClass":"ajsc.Context","contextId":"__module_ajsc_namespace_name__:__module_ajsc_namespace_version__","contextName":"__module_ajsc_namespace_name__","contextVersion":"__module_ajsc_namespace_version__","description":"__module_ajsc_namespace_name__ Context"}}
\ No newline at end of file
diff --git a/src/main/runtime/context/default#0.context b/src/main/runtime/context/default#0.context
new file mode 100644 (file)
index 0000000..d1b5ab4
--- /dev/null
@@ -0,0 +1 @@
+{"context":{"contextClass":"ajsc.Context","contextId":"default:0","contextName":"default","contextVersion":"0","description":"Default Context"}}
\ No newline at end of file
diff --git a/src/main/runtime/deploymentPackage/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.json b/src/main/runtime/deploymentPackage/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.json
new file mode 100644 (file)
index 0000000..d0954cf
--- /dev/null
@@ -0,0 +1 @@
+{"deploymentPackage":{"Class":"ajsc.DeploymentPackage","Id":"__module.ajsc.namespace.name__:__module_ajsc_namespace_version__","namespace":"__module_ajsc_namespace_name__","namespaceVersion":"__module_ajsc_namespace_version__","description":"__module_ajsc_namespace_name__ __module_ajsc_namespace_version__ - default description","userId":"ajsc"}}
\ No newline at end of file
diff --git a/src/main/runtime/shiroRole/ajscadmin.json b/src/main/runtime/shiroRole/ajscadmin.json
new file mode 100644 (file)
index 0000000..f5e981e
--- /dev/null
@@ -0,0 +1 @@
+{"shiroRoleClass":"ajsc.auth.ShiroRole","shiroRoleId":"ajscadmin","name":"ajscadmin","permissions":"[ajscadmin:*, ajsc:*]"}
\ No newline at end of file
diff --git a/src/main/runtime/shiroRole/contextadmin#__module.ajsc.namespace.name__.json b/src/main/runtime/shiroRole/contextadmin#__module.ajsc.namespace.name__.json
new file mode 100644 (file)
index 0000000..2dae9f5
--- /dev/null
@@ -0,0 +1 @@
+{"shiroRoleClass":"ajsc.auth.ShiroRole","shiroRoleId":"contextadmin:__module_ajsc_namespace_name__","name":"contextadmin:__module_ajsc_namespace_name__","permissions":"[]"}
\ No newline at end of file
diff --git a/src/main/runtime/shiroRole/contextadmin#default.json b/src/main/runtime/shiroRole/contextadmin#default.json
new file mode 100644 (file)
index 0000000..5de814e
--- /dev/null
@@ -0,0 +1 @@
+{"shiroRoleClass":"ajsc.auth.ShiroRole","shiroRoleId":"contextadmin:default","name":"contextadmin:default","permissions":"[]"}
\ No newline at end of file
diff --git a/src/main/runtime/shiroUser/ajsc.json b/src/main/runtime/shiroUser/ajsc.json
new file mode 100644 (file)
index 0000000..f4c7855
--- /dev/null
@@ -0,0 +1 @@
+{"shiroUserClass":"ajsc.auth.ShiroUser","shiroUserId":"ajsc","passwordHash":"9471697417008c880720ba54c6038791ad7e98f3b88136fe34f4d31a462dd27a","permissions":"[*:*]","username":"ajsc"}
\ No newline at end of file
diff --git a/src/main/runtime/shiroUserRole/ajsc#ajscadmin.json b/src/main/runtime/shiroUserRole/ajsc#ajscadmin.json
new file mode 100644 (file)
index 0000000..cb8d483
--- /dev/null
@@ -0,0 +1 @@
+{"shiroUserRoleClass":"ajsc.auth.ShiroUserRole","shiroUserRoleId":"ajsc:ajscadmin","roleId":"ajscadmin","userId":"ajsc"}
\ No newline at end of file
diff --git a/src/main/runtime/shiroUserRole/ajsc#contextadmin#__module.ajsc.namespace.name__.json b/src/main/runtime/shiroUserRole/ajsc#contextadmin#__module.ajsc.namespace.name__.json
new file mode 100644 (file)
index 0000000..95d2361
--- /dev/null
@@ -0,0 +1 @@
+{"shiroUserRoleClass":"ajsc.auth.ShiroUserRole","shiroUserRoleId":"ajsc:contextadmin:__module_ajsc_namespace_name__","roleId":"contextadmin:__module_ajsc_namespace_name__","userId":"ajsc"}
\ No newline at end of file
diff --git a/src/main/runtime/shiroUserRole/ajsc#contextadmin#default.json b/src/main/runtime/shiroUserRole/ajsc#contextadmin#default.json
new file mode 100644 (file)
index 0000000..2bd5063
--- /dev/null
@@ -0,0 +1 @@
+{"shiroUserRoleClass":"ajsc.auth.ShiroUserRole","shiroUserRoleId":"ajsc:contextadmin:default","roleId":"contextadmin:default","userId":"ajsc"}
\ No newline at end of file