aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorabatos <adrian.batos-parac@amdocs.com>2017-05-12 14:11:30 -0400
committerabatos <adrian.batos-parac@amdocs.com>2017-05-12 14:20:46 -0400
commit60f7f5e11d7d0d7870a4650956921bd1afa309fd (patch)
tree5ce86d00dbf3a57dd9076060967ae355d4454c03
parentb0478eb10db68313fcf5d0a989c5eff25716052a (diff)
Initial ONAP Synapse commit
Change-Id: I3a0ed659dbb8f8faeeb54093b5d6f10414cd886e Signed-off-by: abatos <adrian.batos-parac@amdocs.com>
-rw-r--r--.gitignore7
-rw-r--r--.gitreview4
-rw-r--r--License.txt24
-rw-r--r--ajsc-shared-config/README.txt6
-rw-r--r--ajsc-shared-config/etc/PartnerProfile.xml2408
-rw-r--r--ajsc-shared-config/etc/basic-logback_root_logger_level_off.xml87
-rw-r--r--ajsc-shared-config/etc/csm-config-app.properties185
-rw-r--r--ajsc-shared-config/etc/csm-framework-app.properties11
-rw-r--r--ajsc-shared-config/etc/logback.xml210
-rw-r--r--ajsc-shared-config/etc/spm2.jksbin0 -> 62008 bytes
-rw-r--r--antBuild/build.xml231
-rw-r--r--bundleconfig-local/etc/appprops/AAFUserRoles.properties13
-rw-r--r--bundleconfig-local/etc/appprops/PostProcessorInterceptors.properties3
-rw-r--r--bundleconfig-local/etc/appprops/PreProcessorInterceptors.properties4
-rw-r--r--bundleconfig-local/etc/appprops/app-intercepts.properties8
-rw-r--r--bundleconfig-local/etc/appprops/methodMapper.properties46
-rw-r--r--bundleconfig-local/etc/logback.xml210
-rw-r--r--bundleconfig-local/etc/sysprops/sys-props.properties115
-rw-r--r--pom.xml327
-rw-r--r--src/main/ajsc/data-router_v1/data-router/v1/conf/echoService.groovy12
-rw-r--r--src/main/ajsc/data-router_v1/data-router/v1/docs/README.txt1
-rw-r--r--src/main/ajsc/data-router_v1/data-router/v1/lib/README.txt1
-rw-r--r--src/main/ajsc/data-router_v1/data-router/v1/props/module.props1
-rw-r--r--src/main/ajsc/data-router_v1/data-router/v1/routes/echoService.route5
-rw-r--r--src/main/assemble/ajsc_module_assembly.xml66
-rw-r--r--src/main/assemble/ajsc_props_assembly.xml23
-rw-r--r--src/main/assemble/ajsc_runtime_assembly.xml44
-rw-r--r--src/main/config/ajsc-chef.jksbin0 -> 5256 bytes
-rw-r--r--src/main/config/ajsc-jetty.xml114
-rw-r--r--src/main/config/ajsc-override-web.xml39
-rw-r--r--src/main/config/ajscJetty.jksbin0 -> 3736 bytes
-rw-r--r--src/main/config/cadi.properties36
-rw-r--r--src/main/config/jul-redirect.properties13
-rw-r--r--src/main/config/keyfile27
-rw-r--r--src/main/config/runner-web.xml97
-rw-r--r--src/main/docker/Dockerfile26
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/AaiEventEntity.java315
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/AggregationEntity.java124
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/DocumentStoreDataEntity.java35
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/OxmEntityDescriptor.java126
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/PolicyResponse.java72
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/SuggestionSearchEntity.java281
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/TopographicalEntity.java191
-rw-r--r--src/main/java/org/openecomp/datarouter/entity/UebEventHeader.java169
-rw-r--r--src/main/java/org/openecomp/datarouter/exception/BaseDataRouterException.java89
-rw-r--r--src/main/java/org/openecomp/datarouter/exception/DataRouterError.java106
-rw-r--r--src/main/java/org/openecomp/datarouter/logging/DataRouterMsgs.java161
-rw-r--r--src/main/java/org/openecomp/datarouter/logging/EntityEventPolicyMsgs.java218
-rw-r--r--src/main/java/org/openecomp/datarouter/policy/EntityEventPolicy.java1162
-rw-r--r--src/main/java/org/openecomp/datarouter/policy/EntityEventPolicyConfig.java129
-rw-r--r--src/main/java/org/openecomp/datarouter/service/EchoService.java97
-rw-r--r--src/main/java/org/openecomp/datarouter/util/CrossEntityReference.java97
-rw-r--r--src/main/java/org/openecomp/datarouter/util/DataRouterConstants.java57
-rw-r--r--src/main/java/org/openecomp/datarouter/util/DataRouterProperties.java53
-rw-r--r--src/main/java/org/openecomp/datarouter/util/EntityOxmReferenceHelper.java62
-rw-r--r--src/main/java/org/openecomp/datarouter/util/ExternalOxmModelProcessor.java37
-rw-r--r--src/main/java/org/openecomp/datarouter/util/FileWatcher.java49
-rw-r--r--src/main/java/org/openecomp/datarouter/util/NodeUtils.java46
-rw-r--r--src/main/java/org/openecomp/datarouter/util/OxmModelLoader.java166
-rw-r--r--src/main/java/org/openecomp/datarouter/util/RouterServiceUtil.java226
-rw-r--r--src/main/java/org/openecomp/datarouter/util/SearchSuggestionPermutation.java89
-rw-r--r--src/main/java/org/openecomp/datarouter/util/Version.java29
-rw-r--r--src/main/java/org/openecomp/datarouter/util/VersionedOxmEntities.java352
-rw-r--r--src/main/resources/entitysearch_schema.json35
-rw-r--r--src/main/resources/logging/DataRouterMsgs.properties135
-rw-r--r--src/main/resources/logging/EntityEventPolicyMsgs.properties122
-rw-r--r--src/main/resources/topographysearch_schema.json8
-rw-r--r--src/main/runtime/context/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.context1
-rw-r--r--src/main/runtime/context/default#0.context1
-rw-r--r--src/main/runtime/deploymentPackage/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.json1
-rw-r--r--src/main/runtime/shiroRole/ajscadmin.json1
-rw-r--r--src/main/runtime/shiroRole/contextadmin#__module.ajsc.namespace.name__.json1
-rw-r--r--src/main/runtime/shiroRole/contextadmin#default.json1
-rw-r--r--src/main/runtime/shiroUser/ajsc.json1
-rw-r--r--src/main/runtime/shiroUserRole/ajsc#ajscadmin.json1
-rw-r--r--src/main/runtime/shiroUserRole/ajsc#contextadmin#__module.ajsc.namespace.name__.json1
-rw-r--r--src/main/runtime/shiroUserRole/ajsc#contextadmin#default.json1
77 files changed, 9252 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8487231
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+.classpath
+.project
+.settings/
+target/
+logs/
+debug-logs/
+bin/
diff --git a/.gitreview b/.gitreview
new file mode 100644
index 0000000..4a042d3
--- /dev/null
+++ b/.gitreview
@@ -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
index 0000000..2557972
--- /dev/null
+++ b/License.txt
@@ -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
index 0000000..a82eb64
--- /dev/null
+++ b/ajsc-shared-config/README.txt
@@ -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
index 0000000..de9ca07
--- /dev/null
+++ b/ajsc-shared-config/etc/PartnerProfile.xml
@@ -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
index 0000000..4ebe2db
--- /dev/null
+++ b/ajsc-shared-config/etc/basic-logback_root_logger_level_off.xml
@@ -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
index 0000000..d80cf1c
--- /dev/null
+++ b/ajsc-shared-config/etc/csm-config-app.properties
@@ -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
index 0000000..140fde3
--- /dev/null
+++ b/ajsc-shared-config/etc/csm-framework-app.properties
@@ -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
index 0000000..228872e
--- /dev/null
+++ b/ajsc-shared-config/etc/logback.xml
@@ -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
index 0000000..8ff2a00
--- /dev/null
+++ b/ajsc-shared-config/etc/spm2.jks
Binary files differ
diff --git a/antBuild/build.xml b/antBuild/build.xml
new file mode 100644
index 0000000..ab0f890
--- /dev/null
+++ b/antBuild/build.xml
@@ -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
index 0000000..adb7a10
--- /dev/null
+++ b/bundleconfig-local/etc/appprops/AAFUserRoles.properties
@@ -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
index 0000000..08ffefa
--- /dev/null
+++ b/bundleconfig-local/etc/appprops/PostProcessorInterceptors.properties
@@ -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
index 0000000..1383071
--- /dev/null
+++ b/bundleconfig-local/etc/appprops/PreProcessorInterceptors.properties
@@ -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
index 0000000..0d35b59
--- /dev/null
+++ b/bundleconfig-local/etc/appprops/app-intercepts.properties
@@ -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
index 0000000..1825bd6
--- /dev/null
+++ b/bundleconfig-local/etc/appprops/methodMapper.properties
@@ -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
index 0000000..228872e
--- /dev/null
+++ b/bundleconfig-local/etc/logback.xml
@@ -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
index 0000000..39f4175
--- /dev/null
+++ b/bundleconfig-local/etc/sysprops/sys-props.properties
@@ -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
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
index 0000000..ad7670e
--- /dev/null
+++ b/src/main/ajsc/data-router_v1/data-router/v1/conf/echoService.groovy
@@ -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
index 0000000..3707179
--- /dev/null
+++ b/src/main/ajsc/data-router_v1/data-router/v1/docs/README.txt
@@ -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
index 0000000..639e21b
--- /dev/null
+++ b/src/main/ajsc/data-router_v1/data-router/v1/lib/README.txt
@@ -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
index 0000000..17ebc08
--- /dev/null
+++ b/src/main/ajsc/data-router_v1/data-router/v1/props/module.props
@@ -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
index 0000000..b81cbbd
--- /dev/null
+++ b/src/main/ajsc/data-router_v1/data-router/v1/routes/echoService.route
@@ -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
index 0000000..4ec4e28
--- /dev/null
+++ b/src/main/assemble/ajsc_module_assembly.xml
@@ -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
index 0000000..5b8a6fa
--- /dev/null
+++ b/src/main/assemble/ajsc_props_assembly.xml
@@ -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
index 0000000..e37d366
--- /dev/null
+++ b/src/main/assemble/ajsc_runtime_assembly.xml
@@ -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
index 0000000..aeca770
--- /dev/null
+++ b/src/main/config/ajsc-chef.jks
Binary files differ
diff --git a/src/main/config/ajsc-jetty.xml b/src/main/config/ajsc-jetty.xml
new file mode 100644
index 0000000..9d597f0
--- /dev/null
+++ b/src/main/config/ajsc-jetty.xml
@@ -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
index 0000000..f6d69ea
--- /dev/null
+++ b/src/main/config/ajsc-override-web.xml
@@ -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
index 0000000..48cdbff
--- /dev/null
+++ b/src/main/config/ajscJetty.jks
Binary files differ
diff --git a/src/main/config/cadi.properties b/src/main/config/cadi.properties
new file mode 100644
index 0000000..a1d56d6
--- /dev/null
+++ b/src/main/config/cadi.properties
@@ -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
index 0000000..8b6624d
--- /dev/null
+++ b/src/main/config/jul-redirect.properties
@@ -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
index 0000000..882e86a
--- /dev/null
+++ b/src/main/config/keyfile
@@ -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
index 0000000..b51aff4
--- /dev/null
+++ b/src/main/config/runner-web.xml
@@ -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
index 0000000..f53850d
--- /dev/null
+++ b/src/main/docker/Dockerfile
@@ -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
index 0000000..418c0d3
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/AaiEventEntity.java
@@ -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
index 0000000..4830d67
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/AggregationEntity.java
@@ -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
index 0000000..61df316
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/DocumentStoreDataEntity.java
@@ -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
index 0000000..9f486e4
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/OxmEntityDescriptor.java
@@ -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
index 0000000..fd577fa
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/PolicyResponse.java
@@ -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
index 0000000..ae2711b
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/SuggestionSearchEntity.java
@@ -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
index 0000000..79cdfcd
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/TopographicalEntity.java
@@ -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
index 0000000..5eab97f
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/entity/UebEventHeader.java
@@ -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
index 0000000..0cd0381
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/exception/BaseDataRouterException.java
@@ -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
index 0000000..4920591
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/exception/DataRouterError.java
@@ -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
index 0000000..8304c96
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/logging/DataRouterMsgs.java
@@ -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
index 0000000..09be3a0
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/logging/EntityEventPolicyMsgs.java
@@ -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
index 0000000..170c646
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/policy/EntityEventPolicy.java
@@ -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
index 0000000..8e14be1
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/policy/EntityEventPolicyConfig.java
@@ -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
index 0000000..e7f6368
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/service/EchoService.java
@@ -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
index 0000000..48f3c27
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/CrossEntityReference.java
@@ -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
index 0000000..f9f5df3
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/DataRouterConstants.java
@@ -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
index 0000000..7e18363
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/DataRouterProperties.java
@@ -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
index 0000000..c9e1746
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/EntityOxmReferenceHelper.java
@@ -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
index 0000000..9fcef6f
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/ExternalOxmModelProcessor.java
@@ -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
index 0000000..e382c21
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/FileWatcher.java
@@ -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
index 0000000..f957247
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/NodeUtils.java
@@ -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
index 0000000..2919ba2
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/OxmModelLoader.java
@@ -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
index 0000000..b30c9f9
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/RouterServiceUtil.java
@@ -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
index 0000000..91f5910
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/SearchSuggestionPermutation.java
@@ -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
index 0000000..a0b3e5f
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/Version.java
@@ -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
index 0000000..46c4a76
--- /dev/null
+++ b/src/main/java/org/openecomp/datarouter/util/VersionedOxmEntities.java
@@ -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
index 0000000..5ff7625
--- /dev/null
+++ b/src/main/resources/entitysearch_schema.json
@@ -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
index 0000000..352f239
--- /dev/null
+++ b/src/main/resources/logging/DataRouterMsgs.properties
@@ -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
index 0000000..3fac391
--- /dev/null
+++ b/src/main/resources/logging/EntityEventPolicyMsgs.properties
@@ -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
index 0000000..d542631
--- /dev/null
+++ b/src/main/resources/topographysearch_schema.json
@@ -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
index 0000000..8514196
--- /dev/null
+++ b/src/main/runtime/context/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.context
@@ -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
index 0000000..d1b5ab4
--- /dev/null
+++ b/src/main/runtime/context/default#0.context
@@ -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
index 0000000..d0954cf
--- /dev/null
+++ b/src/main/runtime/deploymentPackage/__module.ajsc.namespace.name__#__module.ajsc.namespace.version__.json
@@ -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
index 0000000..f5e981e
--- /dev/null
+++ b/src/main/runtime/shiroRole/ajscadmin.json
@@ -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
index 0000000..2dae9f5
--- /dev/null
+++ b/src/main/runtime/shiroRole/contextadmin#__module.ajsc.namespace.name__.json
@@ -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
index 0000000..5de814e
--- /dev/null
+++ b/src/main/runtime/shiroRole/contextadmin#default.json
@@ -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
index 0000000..f4c7855
--- /dev/null
+++ b/src/main/runtime/shiroUser/ajsc.json
@@ -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
index 0000000..cb8d483
--- /dev/null
+++ b/src/main/runtime/shiroUserRole/ajsc#ajscadmin.json
@@ -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
index 0000000..95d2361
--- /dev/null
+++ b/src/main/runtime/shiroUserRole/ajsc#contextadmin#__module.ajsc.namespace.name__.json
@@ -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
index 0000000..2bd5063
--- /dev/null
+++ b/src/main/runtime/shiroUserRole/ajsc#contextadmin#default.json
@@ -0,0 +1 @@
+{"shiroUserRoleClass":"ajsc.auth.ShiroUserRole","shiroUserRoleId":"ajsc:contextadmin:default","roleId":"contextadmin:default","userId":"ajsc"} \ No newline at end of file