aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xdatarouter-node/pom.xml1000
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Delivery.java523
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueue.java720
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueueHelper.java192
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java636
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTaskHelper.java155
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DestInfo.java285
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/IsFrom.java168
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/LogManager.java357
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfig.java1521
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java1289
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeMain.java235
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeServlet.java788
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeUtils.java473
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PathFinder.java272
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/ProvData.java622
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PublishId.java106
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RateLimitedOperation.java212
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RedirManager.java245
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/StatusLog.java478
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/SubnetMatcher.java146
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Target.java125
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/TaskList.java231
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EELFFilter.java86
-rw-r--r--datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EelfMsgs.java192
-rw-r--r--datarouter-node/src/main/resources/logback.xml810
-rw-r--r--datarouter-node/src/main/resources/misc/descriptor.xml106
-rw-r--r--datarouter-node/src/main/resources/misc/doaction52
-rw-r--r--datarouter-node/src/main/resources/misc/drtrnode166
-rw-r--r--datarouter-node/src/main/resources/misc/havecert.tmpl2
-rw-r--r--datarouter-node/src/main/resources/misc/notes56
-rw-r--r--datarouter-prov/data/addFeed3.txt46
-rw-r--r--datarouter-prov/data/addSubscriber.txt30
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponse.java50
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponseSupplement.java30
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/Authorizer.java48
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespImpl.java110
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespSupplementImpl.java62
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthzResource.java100
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvAuthorizer.java356
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvDataProvider.java74
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/package.html2
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/BaseServlet.java1736
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServlet.java600
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedLogServlet.java10
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedServlet.java724
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/GroupServlet.java770
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/InternalServlet.java1012
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java702
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Main.java339
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Poker.java634
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java606
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/PublishServlet.java384
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/RouteServlet.java592
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/StatisticsServlet.java1064
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubLogServlet.java10
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscribeServlet.java576
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServlet.java814
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SynchronizerTask.java1226
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/BaseLogRecord.java280
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Deleteable.java16
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryExtraRecord.java60
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryRecord.java205
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EgressRoute.java363
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EventLogRecord.java81
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/ExpiryRecord.java205
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Feed.java1445
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedAuthorization.java122
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedEndpointID.java95
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedLinks.java145
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Group.java769
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRoute.java991
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Insertable.java18
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/JSONable.java16
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LOGJSONable.java16
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Loadable.java55
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LogRecord.java381
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NetworkRoute.java371
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NodeClass.java255
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Parameters.java427
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PubFailRecord.java103
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecord.java232
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubDelivery.java156
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubLinks.java130
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Subscription.java956
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Syncable.java31
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Updateable.java18
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/package.html2
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/EelfMsgs.java21
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/JettyFilter.java22
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/package.html246
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java403
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLI.java752
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/JSONUtilities.java83
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObject.java593
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LogfileLoader.java820
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/PurgeLogDirTask.java66
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/RLEBitSet.java803
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/ThrottleFilter.java460
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/URLUtilities.java202
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/package.html2
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/DailyLatencyReport.java252
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/FeedReport.java703
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/LatencyReport.java258
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/Report.java229
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/ReportBase.java60
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/SubscriberReport.java220
-rw-r--r--datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/VolumeReport.java165
-rw-r--r--datarouter-prov/src/main/resources/docker-compose/prov_data/addFeed3.txt88
-rw-r--r--datarouter-prov/src/main/resources/docker-compose/prov_data/addSubscriber.txt72
-rw-r--r--datarouter-prov/src/main/resources/logback.xml810
-rw-r--r--datarouter-prov/src/main/resources/misc/doaction74
-rw-r--r--datarouter-prov/src/main/resources/misc/dr-route4
-rw-r--r--datarouter-prov/src/main/resources/misc/drtrprov170
-rw-r--r--datarouter-prov/src/main/resources/misc/havecert.tmpl2
-rw-r--r--datarouter-prov/src/main/resources/misc/notes90
-rw-r--r--datarouter-prov/src/main/resources/misc/provcmd152
-rw-r--r--datarouter-prov/src/main/resources/misc/runreports12
118 files changed, 20797 insertions, 19937 deletions
diff --git a/datarouter-node/pom.xml b/datarouter-node/pom.xml
index e3298e71..abd81afa 100755
--- a/datarouter-node/pom.xml
+++ b/datarouter-node/pom.xml
@@ -1,500 +1,500 @@
-<!--
- ============LICENSE_START==================================================
- * org.onap.dmaap
- * ===========================================================================
- * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * ===========================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END====================================================
- *
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- *
--->
-<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/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.onap.dmaap.datarouter</groupId>
- <artifactId>parent</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <relativePath>../pom.xml</relativePath>
- </parent>
- <artifactId>datarouter-node</artifactId>
- <packaging>jar</packaging>
- <name>datarouter-node</name>
- <url>https://github.com/att/DMAAP_DATAROUTER</url>
- <properties>
- <sonar.skip>false</sonar.skip>
- <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
- <sitePath>/content/sites/site/${project.groupId}/${project.artifactId}/${project.version}</sitePath>
- <docker.location>${basedir}/target/${artifactId}</docker.location>
- <datarouter.node.image.name>onap/dmaap/datarouter-node</datarouter.node.image.name>
- </properties>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.json</groupId>
- <artifactId>json</artifactId>
- <version>20160810</version>
- </dependency>
- <dependency>
- <groupId>javax.mail</groupId>
- <artifactId>javax.mail-api</artifactId>
- <version>1.5.1</version>
- </dependency>
- <dependency>
- <groupId>com.att.eelf</groupId>
- <artifactId>eelf-core</artifactId>
- <version>0.0.1</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- </dependency>
- <dependency>
- <groupId>com.thoughtworks.xstream</groupId>
- <artifactId>xstream</artifactId>
- <version>1.4.7</version>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- <version>1.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-core</artifactId>
- <version>1.2.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-server</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-deploy</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-servlet</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-servlets</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-security</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- <version>7.6.14.v20131031</version>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-io</artifactId>
- <version>1.3.2</version>
- </dependency>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.4</version>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>2.1</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpcore</artifactId>
- <version>4.4</version>
- </dependency>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>1.6</version>
- </dependency>
- <dependency>
- <groupId>org.mozilla</groupId>
- <artifactId>rhino</artifactId>
- <version>1.7R3</version>
- </dependency>
- <dependency>
- <groupId>org.apache.james</groupId>
- <artifactId>apache-mime4j-core</artifactId>
- <version>0.7</version>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.3</version>
- </dependency>
- <dependency>
- <groupId>org.sonatype.http-testing-harness</groupId>
- <artifactId>junit-runner</artifactId>
- <version>0.11</version>
- <exclusions>
- <exclusion>
- <groupId>org.databene</groupId>
- <artifactId>contiperf</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- <scope>compile</scope>
- </dependency>
- </dependencies>
- <profiles>
- <profile>
- <id>docker</id>
- <properties>
- <skipDockerBuild>false</skipDockerBuild>
- <skipDockerTag>false</skipDockerTag>
- <skipTests>true</skipTests>
- </properties>
- <build>
- <plugins>
- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>1.0.0</version>
- <configuration>
- <imageName>${onap.nexus.dockerregistry.daily}/${datarouter.node.image.name}</imageName>
- <dockerDirectory>${docker.location}</dockerDirectory>
- <serverId>${onap.nexus.dockerregistry.daily}</serverId>
- <skipDockerBuild>false</skipDockerBuild>
- <imageTags>
- <imageTag>${project.version}</imageTag>
- <imageTag>latest</imageTag>
- </imageTags>
- <forceTags>true</forceTags>
- <resources>
- <resource>
- <targetPath>/</targetPath>
- <directory>${project.basedir}</directory>
- <excludes>
- <exclude>target/**/*</exclude>
- <exclude>pom.xml</exclude>
- </excludes>
- </resource>
-
- <resource>
- <targetPath>/</targetPath>
- <directory>${project.build.directory}</directory>
- <include>**/**</include>
- </resource>
- </resources>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-
- <build>
- <finalName>datarouter-node</finalName>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- <includes>
- <include>**/*.properties</include>
- </includes>
- </resource>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- <includes>
- <include>**/EelfMessages.properties</include>
- </includes>
- </resource>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- <includes>
- <include>**/log4j.properties</include>
- </includes>
- </resource>
- </resources>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- <version>3.6.0</version>
- </plugin>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <descriptorRefs>
- <descriptorRef>jar-with-dependencies</descriptorRef>
- </descriptorRefs>
- <outputDirectory>${basedir}/target/opt/app/datartr/lib</outputDirectory>
- <archive>
- <manifest>
- <addClasspath>true</addClasspath>
- <mainClass>org.onap.dmaap.datarouter.node.NodeMain</mainClass>
- </manifest>
- </archive>
- </configuration>
- <executions>
- <execution>
- <id>make-assembly</id>
- <!-- this is used for inheritance merges -->
- <phase>package</phase>
- <!-- bind to the packaging phase -->
- <goals>
- <goal>single</goal>
- </goals>
- </execution>
- </executions>
- </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>${docker.location}</outputDirectory>
- <overwrite>true</overwrite>
- <resources>
- <resource>
- <directory>${basedir}/src/main/resources/docker</directory>
- <filtering>true</filtering>
- <includes>
- <include>**/*</include>
- </includes>
- </resource>
- </resources>
- </configuration>
- </execution>
- <execution>
- <id>copy-resources</id>
- <phase>validate</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>${basedir}/target/opt/app/datartr/etc</outputDirectory>
- <resources>
- <resource>
- <directory>${basedir}/src/main/resources</directory>
- <includes>
- <include>misc/**</include>
- <include>**/**</include>
- </includes>
- </resource>
- </resources>
- </configuration>
- </execution>
- <execution>
- <id>copy-resources-1</id>
- <phase>validate</phase>
- <goals>
- <goal>copy-resources</goal>
- </goals>
- <configuration>
- <outputDirectory>${basedir}/target/opt/app/datartr/self_signed</outputDirectory>
- <resources>
- <resource>
- <directory>${basedir}/self_signed</directory>
- <includes>
- <include>misc/**</include>
- <include>**/**</include>
- </includes>
- </resource>
- </resources>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <version>2.10</version>
- <executions>
- <execution>
- <id>copy-dependencies</id>
- <phase>package</phase>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <outputDirectory>${project.build.directory}/opt/app/datartr/lib</outputDirectory>
- <overWriteReleases>false</overWriteReleases>
- <overWriteSnapshots>false</overWriteSnapshots>
- <overWriteIfNewer>true</overWriteIfNewer>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <configuration>
- <failOnError>false</failOnError>
- </configuration>
- <executions>
- <execution>
- <id>attach-javadocs</id>
- <goals>
- <goal>jar</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-source-plugin</artifactId>
- <version>2.2.1</version>
- <executions>
- <execution>
- <id>attach-sources</id>
- <goals>
- <goal>jar-no-fork</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>cobertura-maven-plugin</artifactId>
- <version>2.7</version>
- <configuration>
- <formats>
- <format>html</format>
- <format>xml</format>
- </formats>
- <check/>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.sonatype.plugins</groupId>
- <artifactId>nexus-staging-maven-plugin</artifactId>
- <version>1.6.7</version>
- <extensions>true</extensions>
- <configuration>
- <nexusUrl>${onap.nexus.url}</nexusUrl>
- <stagingProfileId>176c31dfe190a</stagingProfileId>
- <serverId>ecomp-staging</serverId>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <version>${jacoco.version}</version>
- <configuration>
- <excludes>
- <exclude>**/gen/**</exclude>
- <exclude>**/generated-sources/**</exclude>
- <exclude>**/yang-gen/**</exclude>
- <exclude>**/pax/**</exclude>
- </excludes>
- </configuration>
- <executions>
- <execution>
- <id>pre-unit-test</id>
- <goals>
- <goal>prepare-agent</goal>
- </goals>
- <configuration>
- <destFile>${project.build.directory}/code-coverage/jacoco-ut.exec</destFile>
- <propertyName>surefireArgLine</propertyName>
- </configuration>
- </execution>
- <execution>
- <id>post-unit-test</id>
- <phase>test</phase>
- <goals>
- <goal>report</goal>
- </goals>
- <configuration>
- <dataFile>${project.build.directory}/code-coverage/jacoco-ut.exec</dataFile>
- <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
- </configuration>
- </execution>
- <execution>
- <id>pre-integration-test</id>
- <phase>pre-integration-test</phase>
- <goals>
- <goal>prepare-agent</goal>
- </goals>
- <configuration>
- <destFile>${project.build.directory}/code-coverage/jacoco-it.exec</destFile>
- <propertyName>failsafeArgLine</propertyName>
- </configuration>
- </execution>
- <execution>
- <id>post-integration-test</id>
- <phase>post-integration-test</phase>
- <goals>
- <goal>report</goal>
- </goals>
- <configuration>
- <dataFile>${project.build.directory}/code-coverage/jacoco-it.exec</dataFile>
- <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-</project>
+<!--
+ ============LICENSE_START==================================================
+ * org.onap.dmaap
+ * ===========================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ===========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END====================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *
+-->
+<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/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onap.dmaap.datarouter</groupId>
+ <artifactId>parent</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <artifactId>datarouter-node</artifactId>
+ <packaging>jar</packaging>
+ <name>datarouter-node</name>
+ <url>https://github.com/att/DMAAP_DATAROUTER</url>
+ <properties>
+ <sonar.skip>false</sonar.skip>
+ <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
+ <sitePath>/content/sites/site/${project.groupId}/${project.artifactId}/${project.version}</sitePath>
+ <docker.location>${basedir}/target/${artifactId}</docker.location>
+ <datarouter.node.image.name>onap/dmaap/datarouter-node</datarouter.node.image.name>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>20160810</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.mail</groupId>
+ <artifactId>javax.mail-api</artifactId>
+ <version>1.5.1</version>
+ </dependency>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ <version>0.0.1</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.5</version>
+ </dependency>
+ <dependency>
+ <groupId>com.thoughtworks.xstream</groupId>
+ <artifactId>xstream</artifactId>
+ <version>1.4.7</version>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>1.2.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-core</artifactId>
+ <version>1.2.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-continuation</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-deploy</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlet</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlets</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-security</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ <version>7.6.14.v20131031</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>1.3.2</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.4</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.1</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpcore</artifactId>
+ <version>4.4</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.6</version>
+ </dependency>
+ <dependency>
+ <groupId>org.mozilla</groupId>
+ <artifactId>rhino</artifactId>
+ <version>1.7R3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.james</groupId>
+ <artifactId>apache-mime4j-core</artifactId>
+ <version>0.7</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.5.3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.sonatype.http-testing-harness</groupId>
+ <artifactId>junit-runner</artifactId>
+ <version>0.11</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.databene</groupId>
+ <artifactId>contiperf</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.17</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <profiles>
+ <profile>
+ <id>docker</id>
+ <properties>
+ <skipDockerBuild>false</skipDockerBuild>
+ <skipDockerTag>false</skipDockerTag>
+ <skipTests>true</skipTests>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.spotify</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <imageName>${onap.nexus.dockerregistry.daily}/${datarouter.node.image.name}</imageName>
+ <dockerDirectory>${docker.location}</dockerDirectory>
+ <serverId>${onap.nexus.dockerregistry.daily}</serverId>
+ <skipDockerBuild>false</skipDockerBuild>
+ <imageTags>
+ <imageTag>${project.version}</imageTag>
+ <imageTag>latest</imageTag>
+ </imageTags>
+ <forceTags>true</forceTags>
+ <resources>
+ <resource>
+ <targetPath>/</targetPath>
+ <directory>${project.basedir}</directory>
+ <excludes>
+ <exclude>target/**/*</exclude>
+ <exclude>pom.xml</exclude>
+ </excludes>
+ </resource>
+
+ <resource>
+ <targetPath>/</targetPath>
+ <directory>${project.build.directory}</directory>
+ <include>**/**</include>
+ </resource>
+ </resources>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+ <build>
+ <finalName>datarouter-node</finalName>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/EelfMessages.properties</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/log4j.properties</include>
+ </includes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ <version>3.6.0</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <descriptorRefs>
+ <descriptorRef>jar-with-dependencies</descriptorRef>
+ </descriptorRefs>
+ <outputDirectory>${basedir}/target/opt/app/datartr/lib</outputDirectory>
+ <archive>
+ <manifest>
+ <addClasspath>true</addClasspath>
+ <mainClass>org.onap.dmaap.datarouter.node.NodeMain</mainClass>
+ </manifest>
+ </archive>
+ </configuration>
+ <executions>
+ <execution>
+ <id>make-assembly</id>
+ <!-- this is used for inheritance merges -->
+ <phase>package</phase>
+ <!-- bind to the packaging phase -->
+ <goals>
+ <goal>single</goal>
+ </goals>
+ </execution>
+ </executions>
+ </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>${docker.location}</outputDirectory>
+ <overwrite>true</overwrite>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/resources/docker</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ <execution>
+ <id>copy-resources</id>
+ <phase>validate</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${basedir}/target/opt/app/datartr/etc</outputDirectory>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/resources</directory>
+ <includes>
+ <include>misc/**</include>
+ <include>**/**</include>
+ </includes>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ <execution>
+ <id>copy-resources-1</id>
+ <phase>validate</phase>
+ <goals>
+ <goal>copy-resources</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${basedir}/target/opt/app/datartr/self_signed</outputDirectory>
+ <resources>
+ <resource>
+ <directory>${basedir}/self_signed</directory>
+ <includes>
+ <include>misc/**</include>
+ <include>**/**</include>
+ </includes>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.10</version>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <phase>package</phase>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${project.build.directory}/opt/app/datartr/lib</outputDirectory>
+ <overWriteReleases>false</overWriteReleases>
+ <overWriteSnapshots>false</overWriteSnapshots>
+ <overWriteIfNewer>true</overWriteIfNewer>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <failOnError>false</failOnError>
+ </configuration>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>2.2.1</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>cobertura-maven-plugin</artifactId>
+ <version>2.7</version>
+ <configuration>
+ <formats>
+ <format>html</format>
+ <format>xml</format>
+ </formats>
+ <check/>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.sonatype.plugins</groupId>
+ <artifactId>nexus-staging-maven-plugin</artifactId>
+ <version>1.6.7</version>
+ <extensions>true</extensions>
+ <configuration>
+ <nexusUrl>${onap.nexus.url}</nexusUrl>
+ <stagingProfileId>176c31dfe190a</stagingProfileId>
+ <serverId>ecomp-staging</serverId>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <version>${jacoco.version}</version>
+ <configuration>
+ <excludes>
+ <exclude>**/gen/**</exclude>
+ <exclude>**/generated-sources/**</exclude>
+ <exclude>**/yang-gen/**</exclude>
+ <exclude>**/pax/**</exclude>
+ </excludes>
+ </configuration>
+ <executions>
+ <execution>
+ <id>pre-unit-test</id>
+ <goals>
+ <goal>prepare-agent</goal>
+ </goals>
+ <configuration>
+ <destFile>${project.build.directory}/code-coverage/jacoco-ut.exec</destFile>
+ <propertyName>surefireArgLine</propertyName>
+ </configuration>
+ </execution>
+ <execution>
+ <id>post-unit-test</id>
+ <phase>test</phase>
+ <goals>
+ <goal>report</goal>
+ </goals>
+ <configuration>
+ <dataFile>${project.build.directory}/code-coverage/jacoco-ut.exec</dataFile>
+ <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
+ </configuration>
+ </execution>
+ <execution>
+ <id>pre-integration-test</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>prepare-agent</goal>
+ </goals>
+ <configuration>
+ <destFile>${project.build.directory}/code-coverage/jacoco-it.exec</destFile>
+ <propertyName>failsafeArgLine</propertyName>
+ </configuration>
+ </execution>
+ <execution>
+ <id>post-integration-test</id>
+ <phase>post-integration-test</phase>
+ <goals>
+ <goal>report</goal>
+ </goals>
+ <configuration>
+ <dataFile>${project.build.directory}/code-coverage/jacoco-it.exec</dataFile>
+ <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Delivery.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Delivery.java
index 4494024d..ae4f13bf 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Delivery.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Delivery.java
@@ -1,253 +1,270 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-import java.io.*;
-import org.apache.log4j.Logger;
-
-/**
- * Main control point for delivering files to destinations.
- * <p>
- * The Delivery class manages assignment of delivery threads to delivery
- * queues and creation and destruction of delivery queues as
- * configuration changes. DeliveryQueues are assigned threads based on a
- * modified round-robin approach giving priority to queues with more work
- * as measured by both bytes to deliver and files to deliver and lower
- * priority to queues that already have delivery threads working.
- * A delivery thread continues to work for a delivery queue as long as
- * that queue has more files to deliver.
- */
-public class Delivery {
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.Delivery");
- private static class DelItem implements Comparable<DelItem> {
- private String pubid;
- private String spool;
- public int compareTo(DelItem x) {
- int i = pubid.compareTo(x.pubid);
- if (i == 0) {
- i = spool.compareTo(x.spool);
- }
- return(i);
- }
- public String getPublishId() {
- return(pubid);
- }
- public String getSpool() {
- return(spool);
- }
- public DelItem(String pubid, String spool) {
- this.pubid = pubid;
- this.spool = spool;
- }
- }
- private double fdstart;
- private double fdstop;
- private int threads;
- private int curthreads;
- private NodeConfigManager config;
- private Hashtable<String, DeliveryQueue> dqs = new Hashtable<String, DeliveryQueue>();
- private DeliveryQueue[] queues = new DeliveryQueue[0];
- private int qpos = 0;
- private long nextcheck;
- private Runnable cmon = new Runnable() {
- public void run() {
- checkconfig();
- }
- };
- /**
- * Constructs a new Delivery system using the specified configuration manager.
- * @param config The configuration manager for this delivery system.
- */
- public Delivery(NodeConfigManager config) {
- this.config = config;
- config.registerConfigTask(cmon);
- checkconfig();
- }
- private void cleardir(String dir) {
- if (dqs.get(dir) != null) {
- return;
- }
- File fdir = new File(dir);
- for (File junk: fdir.listFiles()) {
- if (junk.isFile()) {
- junk.delete();
- }
- }
- fdir.delete();
- }
- private void freeDiskCheck() {
- File spoolfile = new File(config.getSpoolBase());
- long tspace = spoolfile.getTotalSpace();
- long start = (long)(tspace * fdstart);
- long stop = (long)(tspace * fdstop);
- long cur = spoolfile.getUsableSpace();
- if (cur >= start) {
- return;
- }
- Vector<DelItem> cv = new Vector<DelItem>();
- for (String sdir: dqs.keySet()) {
- for (String meta: (new File(sdir)).list()) {
- if (!meta.endsWith(".M") || meta.charAt(0) == '.') {
- continue;
- }
- cv.add(new DelItem(meta.substring(0, meta.length() - 2), sdir));
- }
- }
- DelItem[] items = cv.toArray(new DelItem[cv.size()]);
- Arrays.sort(items);
- logger.info("NODE0501 Free disk space below red threshold. current=" + cur + " red=" + start + " total=" + tspace);
- for (DelItem item: items) {
- long amount = dqs.get(item.getSpool()).cancelTask(item.getPublishId());
- logger.info("NODE0502 Attempting to discard " + item.getSpool() + "/" + item.getPublishId() + " to free up disk");
- if (amount > 0) {
- cur += amount;
- if (cur >= stop) {
- cur = spoolfile.getUsableSpace();
- }
- if (cur >= stop) {
- logger.info("NODE0503 Free disk space at or above yellow threshold. current=" + cur + " yellow=" + stop + " total=" + tspace);
- return;
- }
- }
- }
- cur = spoolfile.getUsableSpace();
- if (cur >= stop) {
- logger.info("NODE0503 Free disk space at or above yellow threshold. current=" + cur + " yellow=" + stop + " total=" + tspace);
- return;
- }
- logger.warn("NODE0504 Unable to recover sufficient disk space to reach green status. current=" + cur + " yellow=" + stop + " total=" + tspace);
- }
- private void cleardirs() {
- String basedir = config.getSpoolBase();
- String nbase = basedir + "/n";
- for (String nodedir: (new File(nbase)).list()) {
- if (!nodedir.startsWith(".")) {
- cleardir(nbase + "/" + nodedir);
- }
- }
- String sxbase = basedir + "/s";
- for (String sxdir: (new File(sxbase)).list()) {
- if (sxdir.startsWith(".")) {
- continue;
- }
- File sxf = new File(sxbase + "/" + sxdir);
- for (String sdir: sxf.list()) {
- if (!sdir.startsWith(".")) {
- cleardir(sxbase + "/" + sxdir + "/" + sdir);
- }
- }
- sxf.delete(); // won't if anything still in it
- }
- }
- private synchronized void checkconfig() {
- if (!config.isConfigured()) {
- return;
- }
- fdstart = config.getFreeDiskStart();
- fdstop = config.getFreeDiskStop();
- threads = config.getDeliveryThreads();
- if (threads < 1) {
- threads = 1;
- }
- DestInfo[] alldis = config.getAllDests();
- DeliveryQueue[] nqs = new DeliveryQueue[alldis.length];
- qpos = 0;
- Hashtable<String, DeliveryQueue> ndqs = new Hashtable<String, DeliveryQueue>();
- for (DestInfo di: alldis) {
- String spl = di.getSpool();
- DeliveryQueue dq = dqs.get(spl);
- if (dq == null) {
- dq = new DeliveryQueue(config, di);
- } else {
- dq.config(di);
- }
- ndqs.put(spl, dq);
- nqs[qpos++] = dq;
- }
- queues = nqs;
- dqs = ndqs;
- cleardirs();
- while (curthreads < threads) {
- curthreads++;
- (new Thread() {
- {
- setName("Delivery Thread");
- }
- public void run() {
- dodelivery();
- }
- }).start();
- }
- nextcheck = 0;
- notify();
- }
- private void dodelivery() {
- DeliveryQueue dq;
- while ((dq = getNextQueue()) != null) {
- dq.run();
- }
- }
- private synchronized DeliveryQueue getNextQueue() {
- while (true) {
- if (curthreads > threads) {
- curthreads--;
- return(null);
- }
- if (qpos < queues.length) {
- DeliveryQueue dq = queues[qpos++];
- if (dq.isSkipSet()) {
- continue;
- }
- nextcheck = 0;
- notify();
- return(dq);
- }
- long now = System.currentTimeMillis();
- if (now < nextcheck) {
- try {
- wait(nextcheck + 500 - now);
- } catch (Exception e) {
- }
- now = System.currentTimeMillis();
- }
- if (now >= nextcheck) {
- nextcheck = now + 5000;
- qpos = 0;
- freeDiskCheck();
- }
- }
- }
- /**
- * Reset the retry timer for a delivery queue
- */
- public synchronized void resetQueue(String spool) {
- if (spool != null) {
- DeliveryQueue dq = dqs.get(spool);
- if (dq != null) {
- dq.resetQueue();
- }
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+import java.io.*;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Main control point for delivering files to destinations.
+ * <p>
+ * The Delivery class manages assignment of delivery threads to delivery
+ * queues and creation and destruction of delivery queues as
+ * configuration changes. DeliveryQueues are assigned threads based on a
+ * modified round-robin approach giving priority to queues with more work
+ * as measured by both bytes to deliver and files to deliver and lower
+ * priority to queues that already have delivery threads working.
+ * A delivery thread continues to work for a delivery queue as long as
+ * that queue has more files to deliver.
+ */
+public class Delivery {
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.Delivery");
+
+ private static class DelItem implements Comparable<DelItem> {
+ private String pubid;
+ private String spool;
+
+ public int compareTo(DelItem x) {
+ int i = pubid.compareTo(x.pubid);
+ if (i == 0) {
+ i = spool.compareTo(x.spool);
+ }
+ return (i);
+ }
+
+ public String getPublishId() {
+ return (pubid);
+ }
+
+ public String getSpool() {
+ return (spool);
+ }
+
+ public DelItem(String pubid, String spool) {
+ this.pubid = pubid;
+ this.spool = spool;
+ }
+ }
+
+ private double fdstart;
+ private double fdstop;
+ private int threads;
+ private int curthreads;
+ private NodeConfigManager config;
+ private Hashtable<String, DeliveryQueue> dqs = new Hashtable<String, DeliveryQueue>();
+ private DeliveryQueue[] queues = new DeliveryQueue[0];
+ private int qpos = 0;
+ private long nextcheck;
+ private Runnable cmon = new Runnable() {
+ public void run() {
+ checkconfig();
+ }
+ };
+
+ /**
+ * Constructs a new Delivery system using the specified configuration manager.
+ *
+ * @param config The configuration manager for this delivery system.
+ */
+ public Delivery(NodeConfigManager config) {
+ this.config = config;
+ config.registerConfigTask(cmon);
+ checkconfig();
+ }
+
+ private void cleardir(String dir) {
+ if (dqs.get(dir) != null) {
+ return;
+ }
+ File fdir = new File(dir);
+ for (File junk : fdir.listFiles()) {
+ if (junk.isFile()) {
+ junk.delete();
+ }
+ }
+ fdir.delete();
+ }
+
+ private void freeDiskCheck() {
+ File spoolfile = new File(config.getSpoolBase());
+ long tspace = spoolfile.getTotalSpace();
+ long start = (long) (tspace * fdstart);
+ long stop = (long) (tspace * fdstop);
+ long cur = spoolfile.getUsableSpace();
+ if (cur >= start) {
+ return;
+ }
+ Vector<DelItem> cv = new Vector<DelItem>();
+ for (String sdir : dqs.keySet()) {
+ for (String meta : (new File(sdir)).list()) {
+ if (!meta.endsWith(".M") || meta.charAt(0) == '.') {
+ continue;
+ }
+ cv.add(new DelItem(meta.substring(0, meta.length() - 2), sdir));
+ }
+ }
+ DelItem[] items = cv.toArray(new DelItem[cv.size()]);
+ Arrays.sort(items);
+ logger.info("NODE0501 Free disk space below red threshold. current=" + cur + " red=" + start + " total=" + tspace);
+ for (DelItem item : items) {
+ long amount = dqs.get(item.getSpool()).cancelTask(item.getPublishId());
+ logger.info("NODE0502 Attempting to discard " + item.getSpool() + "/" + item.getPublishId() + " to free up disk");
+ if (amount > 0) {
+ cur += amount;
+ if (cur >= stop) {
+ cur = spoolfile.getUsableSpace();
+ }
+ if (cur >= stop) {
+ logger.info("NODE0503 Free disk space at or above yellow threshold. current=" + cur + " yellow=" + stop + " total=" + tspace);
+ return;
+ }
+ }
+ }
+ cur = spoolfile.getUsableSpace();
+ if (cur >= stop) {
+ logger.info("NODE0503 Free disk space at or above yellow threshold. current=" + cur + " yellow=" + stop + " total=" + tspace);
+ return;
+ }
+ logger.warn("NODE0504 Unable to recover sufficient disk space to reach green status. current=" + cur + " yellow=" + stop + " total=" + tspace);
+ }
+
+ private void cleardirs() {
+ String basedir = config.getSpoolBase();
+ String nbase = basedir + "/n";
+ for (String nodedir : (new File(nbase)).list()) {
+ if (!nodedir.startsWith(".")) {
+ cleardir(nbase + "/" + nodedir);
+ }
+ }
+ String sxbase = basedir + "/s";
+ for (String sxdir : (new File(sxbase)).list()) {
+ if (sxdir.startsWith(".")) {
+ continue;
+ }
+ File sxf = new File(sxbase + "/" + sxdir);
+ for (String sdir : sxf.list()) {
+ if (!sdir.startsWith(".")) {
+ cleardir(sxbase + "/" + sxdir + "/" + sdir);
+ }
+ }
+ sxf.delete(); // won't if anything still in it
+ }
+ }
+
+ private synchronized void checkconfig() {
+ if (!config.isConfigured()) {
+ return;
+ }
+ fdstart = config.getFreeDiskStart();
+ fdstop = config.getFreeDiskStop();
+ threads = config.getDeliveryThreads();
+ if (threads < 1) {
+ threads = 1;
+ }
+ DestInfo[] alldis = config.getAllDests();
+ DeliveryQueue[] nqs = new DeliveryQueue[alldis.length];
+ qpos = 0;
+ Hashtable<String, DeliveryQueue> ndqs = new Hashtable<String, DeliveryQueue>();
+ for (DestInfo di : alldis) {
+ String spl = di.getSpool();
+ DeliveryQueue dq = dqs.get(spl);
+ if (dq == null) {
+ dq = new DeliveryQueue(config, di);
+ } else {
+ dq.config(di);
+ }
+ ndqs.put(spl, dq);
+ nqs[qpos++] = dq;
+ }
+ queues = nqs;
+ dqs = ndqs;
+ cleardirs();
+ while (curthreads < threads) {
+ curthreads++;
+ (new Thread() {
+ {
+ setName("Delivery Thread");
+ }
+
+ public void run() {
+ dodelivery();
+ }
+ }).start();
+ }
+ nextcheck = 0;
+ notify();
+ }
+
+ private void dodelivery() {
+ DeliveryQueue dq;
+ while ((dq = getNextQueue()) != null) {
+ dq.run();
+ }
+ }
+
+ private synchronized DeliveryQueue getNextQueue() {
+ while (true) {
+ if (curthreads > threads) {
+ curthreads--;
+ return (null);
+ }
+ if (qpos < queues.length) {
+ DeliveryQueue dq = queues[qpos++];
+ if (dq.isSkipSet()) {
+ continue;
+ }
+ nextcheck = 0;
+ notify();
+ return (dq);
+ }
+ long now = System.currentTimeMillis();
+ if (now < nextcheck) {
+ try {
+ wait(nextcheck + 500 - now);
+ } catch (Exception e) {
+ }
+ now = System.currentTimeMillis();
+ }
+ if (now >= nextcheck) {
+ nextcheck = now + 5000;
+ qpos = 0;
+ freeDiskCheck();
+ }
+ }
+ }
+
+ /**
+ * Reset the retry timer for a delivery queue
+ */
+ public synchronized void resetQueue(String spool) {
+ if (spool != null) {
+ DeliveryQueue dq = dqs.get(spool);
+ if (dq != null) {
+ dq.resetQueue();
+ }
+ }
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueue.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueue.java
index b2596a4d..ad746255 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueue.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueue.java
@@ -1,348 +1,372 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.io.*;
-import java.util.*;
-
-/**
- * Mechanism for monitoring and controlling delivery of files to a destination.
- * <p>
- * The DeliveryQueue class maintains lists of DeliveryTasks for a single
- * destination (a subscription or another data router node) and assigns
- * delivery threads to try to deliver them. It also maintains a delivery
- * status that causes it to back off on delivery attempts after a failure.
- * <p>
- * If the most recent delivery result was a failure, then no more attempts
- * will be made for a period of time. Initially, and on the first failure
- * following a success, this delay will be DeliveryQueueHelper.getInitFailureTimer() (milliseconds).
- * If, after this delay, additional failures occur, each failure will
- * multiply the delay by DeliveryQueueHelper.getFailureBackoff() up to a
- * maximum delay specified by DeliveryQueueHelper.getMaxFailureTimer().
- * Note that this behavior applies to the delivery queue as a whole and not
- * to individual files in the queue. If multiple files are being
- * delivered and one fails, the delay will be started. If a second
- * delivery fails while the delay was active, it will not change the delay
- * or change the duration of any subsequent delay.
- * If, however, it succeeds, it will cancel the delay.
- * <p>
- * The queue maintains 3 collections of files to deliver: A todo list of
- * files that will be attempted, a working set of files that are being
- * attempted, and a retry set of files that were attempted and failed.
- * Whenever the todo list is empty and needs to be refilled, a scan of the
- * spool directory is made and the file names sorted. Any files in the working set are ignored.
- * If a DeliveryTask for the file is in the retry set, then that delivery
- * task is placed on the todo list. Otherwise, a new DeliveryTask for the
- * file is created and placed on the todo list.
- * If, when a DeliveryTask is about to be removed from the todo list, its
- * age exceeds DeliveryQueueHelper.getExpirationTimer(), then it is instead
- * marked as expired.
- * <p>
- * A delivery queue also maintains a skip flag. This flag is true if the
- * failure timer is active or if no files are found in a directory scan.
- */
-public class DeliveryQueue implements Runnable, DeliveryTaskHelper {
- private DeliveryQueueHelper dqh;
- private DestInfo di;
- private Hashtable<String, DeliveryTask> working = new Hashtable<String, DeliveryTask>();
- private Hashtable<String, DeliveryTask> retry = new Hashtable<String, DeliveryTask>();
- private int todoindex;
- private boolean failed;
- private long failduration;
- private long resumetime;
- File dir;
- private Vector<DeliveryTask> todo = new Vector<DeliveryTask>();
- /**
- * Try to cancel a delivery task.
- * @return The length of the task in bytes or 0 if the task cannot be cancelled.
- */
- public synchronized long cancelTask(String pubid) {
- if (working.get(pubid) != null) {
- return(0);
- }
- DeliveryTask dt = retry.get(pubid);
- if (dt == null) {
- for (int i = todoindex; i < todo.size(); i++) {
- DeliveryTask xdt = todo.get(i);
- if (xdt.getPublishId().equals(pubid)) {
- dt = xdt;
- break;
- }
- }
- }
- if (dt == null) {
- dt = new DeliveryTask(this, pubid);
- if (dt.getFileId() == null) {
- return(0);
- }
- }
- if (dt.isCleaned()) {
- return(0);
- }
- StatusLog.logExp(dt.getPublishId(), dt.getFeedId(), dt.getSubId(), dt.getURL(), dt.getMethod(), dt.getCType(), dt.getLength(), "diskFull", dt.getAttempts());
- dt.clean();
- return(dt.getLength());
- }
- /**
- * Mark that a delivery task has succeeded.
- */
- public synchronized void markSuccess(DeliveryTask task) {
- working.remove(task.getPublishId());
- task.clean();
- failed = false;
- failduration = 0;
- }
- /**
- * Mark that a delivery task has expired.
- */
- public synchronized void markExpired(DeliveryTask task) {
- task.clean();
- }
- /**
- * Mark that a delivery task has failed permanently.
- */
- public synchronized void markFailNoRetry(DeliveryTask task) {
- working.remove(task.getPublishId());
- task.clean();
- failed = false;
- failduration = 0;
- }
- private void fdupdate() {
- if (!failed) {
- failed = true;
- if (failduration == 0) {
- failduration = dqh.getInitFailureTimer();
- }
- resumetime = System.currentTimeMillis() + failduration;
- long maxdur = dqh.getMaxFailureTimer();
- failduration = (long)(failduration * dqh.getFailureBackoff());
- if (failduration > maxdur) {
- failduration = maxdur;
- }
- }
- }
- /**
- * Mark that a delivery task has been redirected.
- */
- public synchronized void markRedirect(DeliveryTask task) {
- working.remove(task.getPublishId());
- retry.put(task.getPublishId(), task);
- }
- /**
- * Mark that a delivery task has temporarily failed.
- */
- public synchronized void markFailWithRetry(DeliveryTask task) {
- working.remove(task.getPublishId());
- retry.put(task.getPublishId(), task);
- fdupdate();
- }
- /**
- * Get the next task.
- */
- public synchronized DeliveryTask getNext() {
- DeliveryTask ret = peekNext();
- if (ret != null) {
- todoindex++;
- working.put(ret.getPublishId(), ret);
- }
- return(ret);
- }
- /**
- * Peek at the next task.
- */
- public synchronized DeliveryTask peekNext() {
- long now = System.currentTimeMillis();
- long mindate = now - dqh.getExpirationTimer();
- if (failed) {
- if (now > resumetime) {
- failed = false;
- } else {
- return(null);
- }
- }
- while (true) {
- if (todoindex >= todo.size()) {
- todoindex = 0;
- todo = new Vector<DeliveryTask>();
- String[] files = dir.list();
- Arrays.sort(files);
- for (String fname: files) {
- if (!fname.endsWith(".M")) {
- continue;
- }
- String fname2 = fname.substring(0, fname.length() - 2);
- long pidtime = 0;
- int dot = fname2.indexOf('.');
- if (dot < 1) {
- continue;
- }
- try {
- pidtime = Long.parseLong(fname2.substring(0, dot));
- } catch (Exception e) {
- }
- if (pidtime < 1000000000000L) {
- continue;
- }
- if (working.get(fname2) != null) {
- continue;
- }
- DeliveryTask dt = retry.get(fname2);
- if (dt == null) {
- dt = new DeliveryTask(this, fname2);
- }
- todo.add(dt);
- }
- retry = new Hashtable<String, DeliveryTask>();
- }
- if (todoindex < todo.size()) {
- DeliveryTask dt = todo.get(todoindex);
- if (dt.isCleaned()) {
- todoindex++;
- continue;
- }
- if (dt.getDate() >= mindate) {
- return(dt);
- }
- todoindex++;
- reportExpiry(dt);
- continue;
- }
- return(null);
- }
- }
- /**
- * Create a delivery queue for a given destination info
- */
- public DeliveryQueue(DeliveryQueueHelper dqh, DestInfo di) {
- this.dqh = dqh;
- this.di = di;
- dir = new File(di.getSpool());
- dir.mkdirs();
- }
- /**
- * Update the destination info for this delivery queue
- */
- public void config(DestInfo di) {
- this.di = di;
- }
- /**
- * Get the dest info
- */
- public DestInfo getDestInfo() {
- return(di);
- }
- /**
- * Get the config manager
- */
- public DeliveryQueueHelper getConfig() {
- return(dqh);
- }
- /**
- * Exceptional condition occurred during delivery
- */
- public void reportDeliveryExtra(DeliveryTask task, long sent) {
- StatusLog.logDelExtra(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getLength(), sent);
- }
- /**
- * Message too old to deliver
- */
- public void reportExpiry(DeliveryTask task) {
- StatusLog.logExp(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), "retriesExhausted", task.getAttempts());
- markExpired(task);
- }
- /**
- * Completed a delivery attempt
- */
- public void reportStatus(DeliveryTask task, int status, String xpubid, String location) {
- if (status < 300) {
- StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, xpubid);
- markSuccess(task);
- } else if (status < 400 && dqh.isFollowRedirects()) {
- StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, location);
- if (dqh.handleRedirection(di, location, task.getFileId())) {
- markRedirect(task);
- } else {
- StatusLog.logExp(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), "notRetryable", task.getAttempts());
- markFailNoRetry(task);
- }
- } else if (status < 500) {
- StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, location);
- StatusLog.logExp(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), "notRetryable", task.getAttempts());
- markFailNoRetry(task);
- } else {
- StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, location);
- markFailWithRetry(task);
- }
- }
- /**
- * Delivery failed by reason of an exception
- */
- public void reportException(DeliveryTask task, Exception exception) {
- StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), -1, exception.toString());
- dqh.handleUnreachable(di);
- markFailWithRetry(task);
- }
- /**
- * Get the feed ID for a subscription
- * @param subid The subscription ID
- * @return The feed ID
- */
- public String getFeedId(String subid) {
- return(dqh.getFeedId(subid));
- }
- /**
- * Get the URL to deliver a message to given the file ID
- */
- public String getDestURL(String fileid) {
- return(dqh.getDestURL(di, fileid));
- }
- /**
- * Deliver files until there's a failure or there are no more
- * files to deliver
- */
- public void run() {
- DeliveryTask t;
- long endtime = System.currentTimeMillis() + dqh.getFairTimeLimit();
- int filestogo = dqh.getFairFileLimit();
- while ((t = getNext()) != null) {
- t.run();
- if (--filestogo <= 0 || System.currentTimeMillis() > endtime) {
- break;
- }
- }
- }
- /**
- * Is there no work to do for this queue right now?
- */
- public synchronized boolean isSkipSet() {
- return(peekNext() == null);
- }
- /**
- * Reset the retry timer
- */
- public void resetQueue() {
- resumetime = System.currentTimeMillis();
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Mechanism for monitoring and controlling delivery of files to a destination.
+ * <p>
+ * The DeliveryQueue class maintains lists of DeliveryTasks for a single
+ * destination (a subscription or another data router node) and assigns
+ * delivery threads to try to deliver them. It also maintains a delivery
+ * status that causes it to back off on delivery attempts after a failure.
+ * <p>
+ * If the most recent delivery result was a failure, then no more attempts
+ * will be made for a period of time. Initially, and on the first failure
+ * following a success, this delay will be DeliveryQueueHelper.getInitFailureTimer() (milliseconds).
+ * If, after this delay, additional failures occur, each failure will
+ * multiply the delay by DeliveryQueueHelper.getFailureBackoff() up to a
+ * maximum delay specified by DeliveryQueueHelper.getMaxFailureTimer().
+ * Note that this behavior applies to the delivery queue as a whole and not
+ * to individual files in the queue. If multiple files are being
+ * delivered and one fails, the delay will be started. If a second
+ * delivery fails while the delay was active, it will not change the delay
+ * or change the duration of any subsequent delay.
+ * If, however, it succeeds, it will cancel the delay.
+ * <p>
+ * The queue maintains 3 collections of files to deliver: A todo list of
+ * files that will be attempted, a working set of files that are being
+ * attempted, and a retry set of files that were attempted and failed.
+ * Whenever the todo list is empty and needs to be refilled, a scan of the
+ * spool directory is made and the file names sorted. Any files in the working set are ignored.
+ * If a DeliveryTask for the file is in the retry set, then that delivery
+ * task is placed on the todo list. Otherwise, a new DeliveryTask for the
+ * file is created and placed on the todo list.
+ * If, when a DeliveryTask is about to be removed from the todo list, its
+ * age exceeds DeliveryQueueHelper.getExpirationTimer(), then it is instead
+ * marked as expired.
+ * <p>
+ * A delivery queue also maintains a skip flag. This flag is true if the
+ * failure timer is active or if no files are found in a directory scan.
+ */
+public class DeliveryQueue implements Runnable, DeliveryTaskHelper {
+ private DeliveryQueueHelper dqh;
+ private DestInfo di;
+ private Hashtable<String, DeliveryTask> working = new Hashtable<String, DeliveryTask>();
+ private Hashtable<String, DeliveryTask> retry = new Hashtable<String, DeliveryTask>();
+ private int todoindex;
+ private boolean failed;
+ private long failduration;
+ private long resumetime;
+ File dir;
+ private Vector<DeliveryTask> todo = new Vector<DeliveryTask>();
+
+ /**
+ * Try to cancel a delivery task.
+ *
+ * @return The length of the task in bytes or 0 if the task cannot be cancelled.
+ */
+ public synchronized long cancelTask(String pubid) {
+ if (working.get(pubid) != null) {
+ return (0);
+ }
+ DeliveryTask dt = retry.get(pubid);
+ if (dt == null) {
+ for (int i = todoindex; i < todo.size(); i++) {
+ DeliveryTask xdt = todo.get(i);
+ if (xdt.getPublishId().equals(pubid)) {
+ dt = xdt;
+ break;
+ }
+ }
+ }
+ if (dt == null) {
+ dt = new DeliveryTask(this, pubid);
+ if (dt.getFileId() == null) {
+ return (0);
+ }
+ }
+ if (dt.isCleaned()) {
+ return (0);
+ }
+ StatusLog.logExp(dt.getPublishId(), dt.getFeedId(), dt.getSubId(), dt.getURL(), dt.getMethod(), dt.getCType(), dt.getLength(), "diskFull", dt.getAttempts());
+ dt.clean();
+ return (dt.getLength());
+ }
+
+ /**
+ * Mark that a delivery task has succeeded.
+ */
+ public synchronized void markSuccess(DeliveryTask task) {
+ working.remove(task.getPublishId());
+ task.clean();
+ failed = false;
+ failduration = 0;
+ }
+
+ /**
+ * Mark that a delivery task has expired.
+ */
+ public synchronized void markExpired(DeliveryTask task) {
+ task.clean();
+ }
+
+ /**
+ * Mark that a delivery task has failed permanently.
+ */
+ public synchronized void markFailNoRetry(DeliveryTask task) {
+ working.remove(task.getPublishId());
+ task.clean();
+ failed = false;
+ failduration = 0;
+ }
+
+ private void fdupdate() {
+ if (!failed) {
+ failed = true;
+ if (failduration == 0) {
+ failduration = dqh.getInitFailureTimer();
+ }
+ resumetime = System.currentTimeMillis() + failduration;
+ long maxdur = dqh.getMaxFailureTimer();
+ failduration = (long) (failduration * dqh.getFailureBackoff());
+ if (failduration > maxdur) {
+ failduration = maxdur;
+ }
+ }
+ }
+
+ /**
+ * Mark that a delivery task has been redirected.
+ */
+ public synchronized void markRedirect(DeliveryTask task) {
+ working.remove(task.getPublishId());
+ retry.put(task.getPublishId(), task);
+ }
+
+ /**
+ * Mark that a delivery task has temporarily failed.
+ */
+ public synchronized void markFailWithRetry(DeliveryTask task) {
+ working.remove(task.getPublishId());
+ retry.put(task.getPublishId(), task);
+ fdupdate();
+ }
+
+ /**
+ * Get the next task.
+ */
+ public synchronized DeliveryTask getNext() {
+ DeliveryTask ret = peekNext();
+ if (ret != null) {
+ todoindex++;
+ working.put(ret.getPublishId(), ret);
+ }
+ return (ret);
+ }
+
+ /**
+ * Peek at the next task.
+ */
+ public synchronized DeliveryTask peekNext() {
+ long now = System.currentTimeMillis();
+ long mindate = now - dqh.getExpirationTimer();
+ if (failed) {
+ if (now > resumetime) {
+ failed = false;
+ } else {
+ return (null);
+ }
+ }
+ while (true) {
+ if (todoindex >= todo.size()) {
+ todoindex = 0;
+ todo = new Vector<DeliveryTask>();
+ String[] files = dir.list();
+ Arrays.sort(files);
+ for (String fname : files) {
+ if (!fname.endsWith(".M")) {
+ continue;
+ }
+ String fname2 = fname.substring(0, fname.length() - 2);
+ long pidtime = 0;
+ int dot = fname2.indexOf('.');
+ if (dot < 1) {
+ continue;
+ }
+ try {
+ pidtime = Long.parseLong(fname2.substring(0, dot));
+ } catch (Exception e) {
+ }
+ if (pidtime < 1000000000000L) {
+ continue;
+ }
+ if (working.get(fname2) != null) {
+ continue;
+ }
+ DeliveryTask dt = retry.get(fname2);
+ if (dt == null) {
+ dt = new DeliveryTask(this, fname2);
+ }
+ todo.add(dt);
+ }
+ retry = new Hashtable<String, DeliveryTask>();
+ }
+ if (todoindex < todo.size()) {
+ DeliveryTask dt = todo.get(todoindex);
+ if (dt.isCleaned()) {
+ todoindex++;
+ continue;
+ }
+ if (dt.getDate() >= mindate) {
+ return (dt);
+ }
+ todoindex++;
+ reportExpiry(dt);
+ continue;
+ }
+ return (null);
+ }
+ }
+
+ /**
+ * Create a delivery queue for a given destination info
+ */
+ public DeliveryQueue(DeliveryQueueHelper dqh, DestInfo di) {
+ this.dqh = dqh;
+ this.di = di;
+ dir = new File(di.getSpool());
+ dir.mkdirs();
+ }
+
+ /**
+ * Update the destination info for this delivery queue
+ */
+ public void config(DestInfo di) {
+ this.di = di;
+ }
+
+ /**
+ * Get the dest info
+ */
+ public DestInfo getDestInfo() {
+ return (di);
+ }
+
+ /**
+ * Get the config manager
+ */
+ public DeliveryQueueHelper getConfig() {
+ return (dqh);
+ }
+
+ /**
+ * Exceptional condition occurred during delivery
+ */
+ public void reportDeliveryExtra(DeliveryTask task, long sent) {
+ StatusLog.logDelExtra(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getLength(), sent);
+ }
+
+ /**
+ * Message too old to deliver
+ */
+ public void reportExpiry(DeliveryTask task) {
+ StatusLog.logExp(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), "retriesExhausted", task.getAttempts());
+ markExpired(task);
+ }
+
+ /**
+ * Completed a delivery attempt
+ */
+ public void reportStatus(DeliveryTask task, int status, String xpubid, String location) {
+ if (status < 300) {
+ StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, xpubid);
+ markSuccess(task);
+ } else if (status < 400 && dqh.isFollowRedirects()) {
+ StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, location);
+ if (dqh.handleRedirection(di, location, task.getFileId())) {
+ markRedirect(task);
+ } else {
+ StatusLog.logExp(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), "notRetryable", task.getAttempts());
+ markFailNoRetry(task);
+ }
+ } else if (status < 500) {
+ StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, location);
+ StatusLog.logExp(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), "notRetryable", task.getAttempts());
+ markFailNoRetry(task);
+ } else {
+ StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), status, location);
+ markFailWithRetry(task);
+ }
+ }
+
+ /**
+ * Delivery failed by reason of an exception
+ */
+ public void reportException(DeliveryTask task, Exception exception) {
+ StatusLog.logDel(task.getPublishId(), task.getFeedId(), task.getSubId(), task.getURL(), task.getMethod(), task.getCType(), task.getLength(), di.getAuthUser(), -1, exception.toString());
+ dqh.handleUnreachable(di);
+ markFailWithRetry(task);
+ }
+
+ /**
+ * Get the feed ID for a subscription
+ *
+ * @param subid The subscription ID
+ * @return The feed ID
+ */
+ public String getFeedId(String subid) {
+ return (dqh.getFeedId(subid));
+ }
+
+ /**
+ * Get the URL to deliver a message to given the file ID
+ */
+ public String getDestURL(String fileid) {
+ return (dqh.getDestURL(di, fileid));
+ }
+
+ /**
+ * Deliver files until there's a failure or there are no more
+ * files to deliver
+ */
+ public void run() {
+ DeliveryTask t;
+ long endtime = System.currentTimeMillis() + dqh.getFairTimeLimit();
+ int filestogo = dqh.getFairFileLimit();
+ while ((t = getNext()) != null) {
+ t.run();
+ if (--filestogo <= 0 || System.currentTimeMillis() > endtime) {
+ break;
+ }
+ }
+ }
+
+ /**
+ * Is there no work to do for this queue right now?
+ */
+ public synchronized boolean isSkipSet() {
+ return (peekNext() == null);
+ }
+
+ /**
+ * Reset the retry timer
+ */
+ public void resetQueue() {
+ resumetime = System.currentTimeMillis();
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueueHelper.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueueHelper.java
index 172678bd..b1734cd4 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueueHelper.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryQueueHelper.java
@@ -1,89 +1,103 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-/**
- * Interface to allow independent testing of the DeliveryQueue code
- * <p>
- * This interface represents all of the configuration information and
- * feedback mechanisms that a delivery queue needs.
- */
-public interface DeliveryQueueHelper {
- /**
- * Get the timeout (milliseconds) before retrying after an initial delivery failure
- */
- public long getInitFailureTimer();
- /**
- * Get the ratio between timeouts on consecutive delivery attempts
- */
- public double getFailureBackoff();
- /**
- * Get the maximum timeout (milliseconds) between delivery attempts
- */
- public long getMaxFailureTimer();
- /**
- * Get the expiration timer (milliseconds) for deliveries
- */
- public long getExpirationTimer();
- /**
- * Get the maximum number of file delivery attempts before checking
- * if another queue has work to be performed.
- */
- public int getFairFileLimit();
- /**
- * Get the maximum amount of time spent delivering files before checking if another queue has work to be performed.
- */
- public long getFairTimeLimit();
- /**
- * Get the URL for delivering a file
- * @param dest The destination information for the file to be delivered.
- * @param fileid The file id for the file to be delivered.
- * @return The URL for delivering the file (typically, dest.getURL() + "/" + fileid).
- */
- public String getDestURL(DestInfo dest, String fileid);
- /**
- * Forget redirections associated with a subscriber
- * @param dest Destination information to forget
- */
- public void handleUnreachable(DestInfo dest);
- /**
- * Post redirection for a subscriber
- * @param dest Destination information to update
- * @param location Location given by subscriber
- * @param fileid File ID of request
- * @return true if this 3xx response is retryable, otherwise, false.
- */
- public boolean handleRedirection(DestInfo dest, String location, String fileid);
- /**
- * Should I handle 3xx responses differently than 4xx responses?
- */
- public boolean isFollowRedirects();
- /**
- * Get the feed ID for a subscription
- * @param subid The subscription ID
- * @return The feed ID
- */
- public String getFeedId(String subid);
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+/**
+ * Interface to allow independent testing of the DeliveryQueue code
+ * <p>
+ * This interface represents all of the configuration information and
+ * feedback mechanisms that a delivery queue needs.
+ */
+public interface DeliveryQueueHelper {
+ /**
+ * Get the timeout (milliseconds) before retrying after an initial delivery failure
+ */
+ public long getInitFailureTimer();
+
+ /**
+ * Get the ratio between timeouts on consecutive delivery attempts
+ */
+ public double getFailureBackoff();
+
+ /**
+ * Get the maximum timeout (milliseconds) between delivery attempts
+ */
+ public long getMaxFailureTimer();
+
+ /**
+ * Get the expiration timer (milliseconds) for deliveries
+ */
+ public long getExpirationTimer();
+
+ /**
+ * Get the maximum number of file delivery attempts before checking
+ * if another queue has work to be performed.
+ */
+ public int getFairFileLimit();
+
+ /**
+ * Get the maximum amount of time spent delivering files before checking if another queue has work to be performed.
+ */
+ public long getFairTimeLimit();
+
+ /**
+ * Get the URL for delivering a file
+ *
+ * @param dest The destination information for the file to be delivered.
+ * @param fileid The file id for the file to be delivered.
+ * @return The URL for delivering the file (typically, dest.getURL() + "/" + fileid).
+ */
+ public String getDestURL(DestInfo dest, String fileid);
+
+ /**
+ * Forget redirections associated with a subscriber
+ *
+ * @param dest Destination information to forget
+ */
+ public void handleUnreachable(DestInfo dest);
+
+ /**
+ * Post redirection for a subscriber
+ *
+ * @param dest Destination information to update
+ * @param location Location given by subscriber
+ * @param fileid File ID of request
+ * @return true if this 3xx response is retryable, otherwise, false.
+ */
+ public boolean handleRedirection(DestInfo dest, String location, String fileid);
+
+ /**
+ * Should I handle 3xx responses differently than 4xx responses?
+ */
+ public boolean isFollowRedirects();
+
+ /**
+ * Get the feed ID for a subscription
+ *
+ * @param subid The subscription ID
+ * @return The feed ID
+ */
+ public String getFeedId(String subid);
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java
index c07822d2..76bf04e2 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTask.java
@@ -1,308 +1,328 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import org.apache.log4j.Logger;
-
-/**
- * A file to be delivered to a destination.
- * <p>
- * A Delivery task represents a work item for the data router - a file that
- * needs to be delivered and provides mechanisms to get information about
- * the file and its delivery data as well as to attempt delivery.
- */
-public class DeliveryTask implements Runnable, Comparable<DeliveryTask> {
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.DeliveryTask");
- private DeliveryTaskHelper dth;
- private String pubid;
- private DestInfo di;
- private String spool;
- private File datafile;
- private File metafile;
- private long length;
- private long date;
- private String method;
- private String fileid;
- private String ctype;
- private String url;
- private String feedid;
- private String subid;
- private int attempts;
- private String[][] hdrs;
- /**
- * Is the object a DeliveryTask with the same publication ID?
- */
- public boolean equals(Object o) {
- if (!(o instanceof DeliveryTask)) {
- return(false);
- }
- return(pubid.equals(((DeliveryTask)o).pubid));
- }
- /**
- * Compare the publication IDs.
- */
- public int compareTo(DeliveryTask o) {
- return(pubid.compareTo(o.pubid));
- }
- /**
- * Get the hash code of the publication ID.
- */
- public int hashCode() {
- return(pubid.hashCode());
- }
- /**
- * Return the publication ID.
- */
- public String toString() {
- return(pubid);
- }
- /**
- * Create a delivery task for a given delivery queue and pub ID
- * @param dth The delivery task helper for the queue this task is in.
- * @param pubid The publish ID for this file. This is used as
- * the base for the file name in the spool directory and is of
- * the form <milliseconds since 1970>.<fqdn of initial data router node>
- */
- public DeliveryTask(DeliveryTaskHelper dth, String pubid) {
- this.dth = dth;
- this.pubid = pubid;
- di = dth.getDestInfo();
- subid = di.getSubId();
- feedid = di.getLogData();
- spool = di.getSpool();
- String dfn = spool + "/" + pubid;
- String mfn = dfn + ".M";
- datafile = new File(spool + "/" + pubid);
- metafile = new File(mfn);
- boolean monly = di.isMetaDataOnly();
- date = Long.parseLong(pubid.substring(0, pubid.indexOf('.')));
- Vector<String[]> hdrv = new Vector<String[]>();
- try {
- BufferedReader br = new BufferedReader(new FileReader(metafile));
- String s = br.readLine();
- int i = s.indexOf('\t');
- method = s.substring(0, i);
- if (!"DELETE".equals(method) && !monly) {
- length = datafile.length();
- }
- fileid = s.substring(i + 1);
- while ((s = br.readLine()) != null) {
- i = s.indexOf('\t');
- String h = s.substring(0, i);
- String v = s.substring(i + 1);
- if ("x-att-dr-routing".equalsIgnoreCase(h)) {
- subid = v.replaceAll("[^ ]*/", "");
- feedid = dth.getFeedId(subid.replaceAll(" .*", ""));
- }
- if (length == 0 && h.toLowerCase().startsWith("content-")) {
- continue;
- }
- if (h.equalsIgnoreCase("content-type")) {
- ctype = v;
- }
- hdrv.add(new String[] {h, v});
- }
- br.close();
- } catch (Exception e) {
- }
- hdrs = hdrv.toArray(new String[hdrv.size()][]);
- url = dth.getDestURL(fileid);
- }
- /**
- * Get the publish ID
- */
- public String getPublishId() {
- return(pubid);
- }
- /**
- * Attempt delivery
- */
- public void run() {
- attempts++;
- try {
- di = dth.getDestInfo();
- boolean expect100 = di.isUsing100();
- boolean monly = di.isMetaDataOnly();
- length = 0;
- if (!"DELETE".equals(method) && !monly) {
- length = datafile.length();
- }
- url = dth.getDestURL(fileid);
- URL u = new URL(url);
- HttpURLConnection uc = (HttpURLConnection)u.openConnection();
- uc.setConnectTimeout(60000);
- uc.setReadTimeout(60000);
- uc.setInstanceFollowRedirects(false);
- uc.setRequestMethod(method);
- uc.setRequestProperty("Content-Length", Long.toString(length));
- uc.setRequestProperty("Authorization", di.getAuth());
- uc.setRequestProperty("X-ATT-DR-PUBLISH-ID", pubid);
- for (String[] nv: hdrs) {
- uc.addRequestProperty(nv[0], nv[1]);
- }
- if (length > 0) {
- if (expect100) {
- uc.setRequestProperty("Expect", "100-continue");
- }
- uc.setFixedLengthStreamingMode(length);
- uc.setDoOutput(true);
- OutputStream os = null;
- try {
- os = uc.getOutputStream();
- } catch (ProtocolException pe) {
- dth.reportDeliveryExtra(this, -1L);
- // Rcvd error instead of 100-continue
- }
- if (os != null) {
- long sofar = 0;
- try {
- byte[] buf = new byte[1024 * 1024];
- InputStream is = new FileInputStream(datafile);
- while (sofar < length) {
- int i = buf.length;
- if (sofar + i > length) {
- i = (int)(length - sofar);
- }
- i = is.read(buf, 0, i);
- if (i <= 0) {
- throw new IOException("Unexpected problem reading data file " + datafile);
- }
- sofar += i;
- os.write(buf, 0, i);
- }
- is.close();
- os.close();
- } catch (IOException ioe) {
- dth.reportDeliveryExtra(this, sofar);
- throw ioe;
- }
- }
- }
- int rc = uc.getResponseCode();
- String rmsg = uc.getResponseMessage();
- if (rmsg == null) {
- String h0 = uc.getHeaderField(0);
- if (h0 != null) {
- int i = h0.indexOf(' ');
- int j = h0.indexOf(' ', i + 1);
- if (i != -1 && j != -1) {
- rmsg = h0.substring(j + 1);
- }
- }
- }
- String xpubid = null;
- InputStream is;
- if (rc >= 200 && rc <= 299) {
- is = uc.getInputStream();
- xpubid = uc.getHeaderField("X-ATT-DR-PUBLISH-ID");
- } else {
- if (rc >= 300 && rc <= 399) {
- rmsg = uc.getHeaderField("Location");
- }
- is = uc.getErrorStream();
- }
- byte[] buf = new byte[4096];
- if (is != null) {
- while (is.read(buf) > 0) {
- }
- is.close();
- }
- dth.reportStatus(this, rc, xpubid, rmsg);
- } catch (Exception e) {
- dth.reportException(this, e);
- }
- }
- /**
- * Remove meta and data files
- */
- public void clean() {
- datafile.delete();
- metafile.delete();
- hdrs = null;
- }
- /**
- * Has this delivery task been cleaned?
- */
- public boolean isCleaned() {
- return(hdrs == null);
- }
- /**
- * Get length of body
- */
- public long getLength() {
- return(length);
- }
- /**
- * Get creation date as encoded in the publish ID.
- */
- public long getDate() {
- return(date);
- }
- /**
- * Get the most recent delivery attempt URL
- */
- public String getURL() {
- return(url);
- }
- /**
- * Get the content type
- */
- public String getCType() {
- return(ctype);
- }
- /**
- * Get the method
- */
- public String getMethod() {
- return(method);
- }
- /**
- * Get the file ID
- */
- public String getFileId() {
- return(fileid);
- }
- /**
- * Get the number of delivery attempts
- */
- public int getAttempts() {
- return(attempts);
- }
- /**
- * Get the (space delimited list of) subscription ID for this delivery task
- */
- public String getSubId() {
- return(subid);
- }
- /**
- * Get the feed ID for this delivery task
- */
- public String getFeedId() {
- return(feedid);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+import org.apache.log4j.Logger;
+
+/**
+ * A file to be delivered to a destination.
+ * <p>
+ * A Delivery task represents a work item for the data router - a file that
+ * needs to be delivered and provides mechanisms to get information about
+ * the file and its delivery data as well as to attempt delivery.
+ */
+public class DeliveryTask implements Runnable, Comparable<DeliveryTask> {
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.DeliveryTask");
+ private DeliveryTaskHelper dth;
+ private String pubid;
+ private DestInfo di;
+ private String spool;
+ private File datafile;
+ private File metafile;
+ private long length;
+ private long date;
+ private String method;
+ private String fileid;
+ private String ctype;
+ private String url;
+ private String feedid;
+ private String subid;
+ private int attempts;
+ private String[][] hdrs;
+
+ /**
+ * Is the object a DeliveryTask with the same publication ID?
+ */
+ public boolean equals(Object o) {
+ if (!(o instanceof DeliveryTask)) {
+ return (false);
+ }
+ return (pubid.equals(((DeliveryTask) o).pubid));
+ }
+
+ /**
+ * Compare the publication IDs.
+ */
+ public int compareTo(DeliveryTask o) {
+ return (pubid.compareTo(o.pubid));
+ }
+
+ /**
+ * Get the hash code of the publication ID.
+ */
+ public int hashCode() {
+ return (pubid.hashCode());
+ }
+
+ /**
+ * Return the publication ID.
+ */
+ public String toString() {
+ return (pubid);
+ }
+
+ /**
+ * Create a delivery task for a given delivery queue and pub ID
+ *
+ * @param dth The delivery task helper for the queue this task is in.
+ * @param pubid The publish ID for this file. This is used as
+ * the base for the file name in the spool directory and is of
+ * the form <milliseconds since 1970>.<fqdn of initial data router node>
+ */
+ public DeliveryTask(DeliveryTaskHelper dth, String pubid) {
+ this.dth = dth;
+ this.pubid = pubid;
+ di = dth.getDestInfo();
+ subid = di.getSubId();
+ feedid = di.getLogData();
+ spool = di.getSpool();
+ String dfn = spool + "/" + pubid;
+ String mfn = dfn + ".M";
+ datafile = new File(spool + "/" + pubid);
+ metafile = new File(mfn);
+ boolean monly = di.isMetaDataOnly();
+ date = Long.parseLong(pubid.substring(0, pubid.indexOf('.')));
+ Vector<String[]> hdrv = new Vector<String[]>();
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(metafile));
+ String s = br.readLine();
+ int i = s.indexOf('\t');
+ method = s.substring(0, i);
+ if (!"DELETE".equals(method) && !monly) {
+ length = datafile.length();
+ }
+ fileid = s.substring(i + 1);
+ while ((s = br.readLine()) != null) {
+ i = s.indexOf('\t');
+ String h = s.substring(0, i);
+ String v = s.substring(i + 1);
+ if ("x-att-dr-routing".equalsIgnoreCase(h)) {
+ subid = v.replaceAll("[^ ]*/", "");
+ feedid = dth.getFeedId(subid.replaceAll(" .*", ""));
+ }
+ if (length == 0 && h.toLowerCase().startsWith("content-")) {
+ continue;
+ }
+ if (h.equalsIgnoreCase("content-type")) {
+ ctype = v;
+ }
+ hdrv.add(new String[]{h, v});
+ }
+ br.close();
+ } catch (Exception e) {
+ }
+ hdrs = hdrv.toArray(new String[hdrv.size()][]);
+ url = dth.getDestURL(fileid);
+ }
+
+ /**
+ * Get the publish ID
+ */
+ public String getPublishId() {
+ return (pubid);
+ }
+
+ /**
+ * Attempt delivery
+ */
+ public void run() {
+ attempts++;
+ try {
+ di = dth.getDestInfo();
+ boolean expect100 = di.isUsing100();
+ boolean monly = di.isMetaDataOnly();
+ length = 0;
+ if (!"DELETE".equals(method) && !monly) {
+ length = datafile.length();
+ }
+ url = dth.getDestURL(fileid);
+ URL u = new URL(url);
+ HttpURLConnection uc = (HttpURLConnection) u.openConnection();
+ uc.setConnectTimeout(60000);
+ uc.setReadTimeout(60000);
+ uc.setInstanceFollowRedirects(false);
+ uc.setRequestMethod(method);
+ uc.setRequestProperty("Content-Length", Long.toString(length));
+ uc.setRequestProperty("Authorization", di.getAuth());
+ uc.setRequestProperty("X-ATT-DR-PUBLISH-ID", pubid);
+ for (String[] nv : hdrs) {
+ uc.addRequestProperty(nv[0], nv[1]);
+ }
+ if (length > 0) {
+ if (expect100) {
+ uc.setRequestProperty("Expect", "100-continue");
+ }
+ uc.setFixedLengthStreamingMode(length);
+ uc.setDoOutput(true);
+ OutputStream os = null;
+ try {
+ os = uc.getOutputStream();
+ } catch (ProtocolException pe) {
+ dth.reportDeliveryExtra(this, -1L);
+ // Rcvd error instead of 100-continue
+ }
+ if (os != null) {
+ long sofar = 0;
+ try {
+ byte[] buf = new byte[1024 * 1024];
+ InputStream is = new FileInputStream(datafile);
+ while (sofar < length) {
+ int i = buf.length;
+ if (sofar + i > length) {
+ i = (int) (length - sofar);
+ }
+ i = is.read(buf, 0, i);
+ if (i <= 0) {
+ throw new IOException("Unexpected problem reading data file " + datafile);
+ }
+ sofar += i;
+ os.write(buf, 0, i);
+ }
+ is.close();
+ os.close();
+ } catch (IOException ioe) {
+ dth.reportDeliveryExtra(this, sofar);
+ throw ioe;
+ }
+ }
+ }
+ int rc = uc.getResponseCode();
+ String rmsg = uc.getResponseMessage();
+ if (rmsg == null) {
+ String h0 = uc.getHeaderField(0);
+ if (h0 != null) {
+ int i = h0.indexOf(' ');
+ int j = h0.indexOf(' ', i + 1);
+ if (i != -1 && j != -1) {
+ rmsg = h0.substring(j + 1);
+ }
+ }
+ }
+ String xpubid = null;
+ InputStream is;
+ if (rc >= 200 && rc <= 299) {
+ is = uc.getInputStream();
+ xpubid = uc.getHeaderField("X-ATT-DR-PUBLISH-ID");
+ } else {
+ if (rc >= 300 && rc <= 399) {
+ rmsg = uc.getHeaderField("Location");
+ }
+ is = uc.getErrorStream();
+ }
+ byte[] buf = new byte[4096];
+ if (is != null) {
+ while (is.read(buf) > 0) {
+ }
+ is.close();
+ }
+ dth.reportStatus(this, rc, xpubid, rmsg);
+ } catch (Exception e) {
+ dth.reportException(this, e);
+ }
+ }
+
+ /**
+ * Remove meta and data files
+ */
+ public void clean() {
+ datafile.delete();
+ metafile.delete();
+ hdrs = null;
+ }
+
+ /**
+ * Has this delivery task been cleaned?
+ */
+ public boolean isCleaned() {
+ return (hdrs == null);
+ }
+
+ /**
+ * Get length of body
+ */
+ public long getLength() {
+ return (length);
+ }
+
+ /**
+ * Get creation date as encoded in the publish ID.
+ */
+ public long getDate() {
+ return (date);
+ }
+
+ /**
+ * Get the most recent delivery attempt URL
+ */
+ public String getURL() {
+ return (url);
+ }
+
+ /**
+ * Get the content type
+ */
+ public String getCType() {
+ return (ctype);
+ }
+
+ /**
+ * Get the method
+ */
+ public String getMethod() {
+ return (method);
+ }
+
+ /**
+ * Get the file ID
+ */
+ public String getFileId() {
+ return (fileid);
+ }
+
+ /**
+ * Get the number of delivery attempts
+ */
+ public int getAttempts() {
+ return (attempts);
+ }
+
+ /**
+ * Get the (space delimited list of) subscription ID for this delivery task
+ */
+ public String getSubId() {
+ return (subid);
+ }
+
+ /**
+ * Get the feed ID for this delivery task
+ */
+ public String getFeedId() {
+ return (feedid);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTaskHelper.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTaskHelper.java
index c9f1ef84..932b792a 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTaskHelper.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DeliveryTaskHelper.java
@@ -1,72 +1,83 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-/**
- * Interface to allow independent testing of the DeliveryTask code.
- * <p>
- * This interface represents all the configuraiton information and
- * feedback mechanisms that a delivery task needs.
- */
-
-public interface DeliveryTaskHelper {
- /**
- * Report that a delivery attempt failed due to an exception (like can't connect to remote host)
- * @param task The task that failed
- * @param exception The exception that occurred
- */
- public void reportException(DeliveryTask task, Exception exception);
- /**
- * Report that a delivery attempt completed (successfully or unsuccessfully)
- * @param task The task that failed
- * @param status The HTTP status
- * @param xpubid The publish ID from the far end (if any)
- * @param location The redirection location for a 3XX response
- */
- public void reportStatus(DeliveryTask task, int status, String xpubid, String location);
- /**
- * Report that a delivery attempt either failed while sending data or that an error was returned instead of a 100 Continue.
- * @param task The task that failed
- * @param sent The number of bytes sent or -1 if an error was returned instead of 100 Continue.
- */
- public void reportDeliveryExtra(DeliveryTask task, long sent);
- /**
- * Get the destination information for the delivery queue
- * @return The destination information
- */
- public DestInfo getDestInfo();
- /**
- * Given a file ID, get the URL to deliver to
- * @param fileid The file id
- * @return The URL to deliver to
- */
- public String getDestURL(String fileid);
- /**
- * Get the feed ID for a subscription
- * @param subid The subscription ID
- * @return The feed iD
- */
- public String getFeedId(String subid);
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+/**
+ * Interface to allow independent testing of the DeliveryTask code.
+ * <p>
+ * This interface represents all the configuraiton information and
+ * feedback mechanisms that a delivery task needs.
+ */
+
+public interface DeliveryTaskHelper {
+ /**
+ * Report that a delivery attempt failed due to an exception (like can't connect to remote host)
+ *
+ * @param task The task that failed
+ * @param exception The exception that occurred
+ */
+ public void reportException(DeliveryTask task, Exception exception);
+
+ /**
+ * Report that a delivery attempt completed (successfully or unsuccessfully)
+ *
+ * @param task The task that failed
+ * @param status The HTTP status
+ * @param xpubid The publish ID from the far end (if any)
+ * @param location The redirection location for a 3XX response
+ */
+ public void reportStatus(DeliveryTask task, int status, String xpubid, String location);
+
+ /**
+ * Report that a delivery attempt either failed while sending data or that an error was returned instead of a 100 Continue.
+ *
+ * @param task The task that failed
+ * @param sent The number of bytes sent or -1 if an error was returned instead of 100 Continue.
+ */
+ public void reportDeliveryExtra(DeliveryTask task, long sent);
+
+ /**
+ * Get the destination information for the delivery queue
+ *
+ * @return The destination information
+ */
+ public DestInfo getDestInfo();
+
+ /**
+ * Given a file ID, get the URL to deliver to
+ *
+ * @param fileid The file id
+ * @return The URL to deliver to
+ */
+ public String getDestURL(String fileid);
+
+ /**
+ * Get the feed ID for a subscription
+ *
+ * @param subid The subscription ID
+ * @return The feed iD
+ */
+ public String getFeedId(String subid);
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DestInfo.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DestInfo.java
index 2b54f70a..12253314 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DestInfo.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/DestInfo.java
@@ -1,132 +1,153 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-/**
- * Information for a delivery destination that doesn't change from message to message
- */
-public class DestInfo {
- private String name;
- private String spool;
- private String subid;
- private String logdata;
- private String url;
- private String authuser;
- private String authentication;
- private boolean metaonly;
- private boolean use100;
- /**
- * Create a destination information object.
- * @param name n:fqdn or s:subid
- * @param spool The directory where files are spooled.
- * @param subid The subscription ID (if applicable).
- * @param logdata Text to be included in log messages
- * @param url The URL to deliver to.
- * @param authuser The auth user for logging.
- * @param authentication The credentials.
- * @param metaonly Is this a metadata only delivery?
- * @param use100 Should I use expect 100-continue?
- */
- public DestInfo(String name, String spool, String subid, String logdata, String url, String authuser, String authentication, boolean metaonly, boolean use100) {
- this.name = name;
- this.spool = spool;
- this.subid = subid;
- this.logdata = logdata;
- this.url = url;
- this.authuser = authuser;
- this.authentication = authentication;
- this.metaonly = metaonly;
- this.use100 = use100;
- }
- public boolean equals(Object o) {
- return((o instanceof DestInfo) && ((DestInfo)o).spool.equals(spool));
- }
- public int hashCode() {
- return(spool.hashCode());
- }
- /**
- * Get the name of this destination
- */
- public String getName() {
- return(name);
- }
- /**
- * Get the spool directory for this destination.
- * @return The spool directory
- */
- public String getSpool() {
- return(spool);
- }
- /**
- * Get the subscription ID.
- * @return Subscription ID or null if this is a node to node delivery.
- */
- public String getSubId() {
- return(subid);
- }
- /**
- * Get the log data.
- * @return Text to be included in a log message about delivery attempts.
- */
- public String getLogData() {
- return(logdata);
- }
- /**
- * Get the delivery URL.
- * @return The URL to deliver to (the primary URL).
- */
- public String getURL() {
- return(url);
-
- }
- /**
- * Get the user for authentication
- * @return The name of the user for logging
- */
- public String getAuthUser() {
- return(authuser);
- }
- /**
- * Get the authentication header
- * @return The string to use to authenticate to the recipient.
- */
- public String getAuth() {
- return(authentication);
- }
- /**
- * Is this a metadata only delivery?
- * @return True if this is a metadata only delivery
- */
- public boolean isMetaDataOnly() {
- return(metaonly);
- }
- /**
- * Should I send expect 100-continue header?
- * @return True if I should.
- */
- public boolean isUsing100() {
- return(use100);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+/**
+ * Information for a delivery destination that doesn't change from message to message
+ */
+public class DestInfo {
+ private String name;
+ private String spool;
+ private String subid;
+ private String logdata;
+ private String url;
+ private String authuser;
+ private String authentication;
+ private boolean metaonly;
+ private boolean use100;
+
+ /**
+ * Create a destination information object.
+ *
+ * @param name n:fqdn or s:subid
+ * @param spool The directory where files are spooled.
+ * @param subid The subscription ID (if applicable).
+ * @param logdata Text to be included in log messages
+ * @param url The URL to deliver to.
+ * @param authuser The auth user for logging.
+ * @param authentication The credentials.
+ * @param metaonly Is this a metadata only delivery?
+ * @param use100 Should I use expect 100-continue?
+ */
+ public DestInfo(String name, String spool, String subid, String logdata, String url, String authuser, String authentication, boolean metaonly, boolean use100) {
+ this.name = name;
+ this.spool = spool;
+ this.subid = subid;
+ this.logdata = logdata;
+ this.url = url;
+ this.authuser = authuser;
+ this.authentication = authentication;
+ this.metaonly = metaonly;
+ this.use100 = use100;
+ }
+
+ public boolean equals(Object o) {
+ return ((o instanceof DestInfo) && ((DestInfo) o).spool.equals(spool));
+ }
+
+ public int hashCode() {
+ return (spool.hashCode());
+ }
+
+ /**
+ * Get the name of this destination
+ */
+ public String getName() {
+ return (name);
+ }
+
+ /**
+ * Get the spool directory for this destination.
+ *
+ * @return The spool directory
+ */
+ public String getSpool() {
+ return (spool);
+ }
+
+ /**
+ * Get the subscription ID.
+ *
+ * @return Subscription ID or null if this is a node to node delivery.
+ */
+ public String getSubId() {
+ return (subid);
+ }
+
+ /**
+ * Get the log data.
+ *
+ * @return Text to be included in a log message about delivery attempts.
+ */
+ public String getLogData() {
+ return (logdata);
+ }
+
+ /**
+ * Get the delivery URL.
+ *
+ * @return The URL to deliver to (the primary URL).
+ */
+ public String getURL() {
+ return (url);
+
+ }
+
+ /**
+ * Get the user for authentication
+ *
+ * @return The name of the user for logging
+ */
+ public String getAuthUser() {
+ return (authuser);
+ }
+
+ /**
+ * Get the authentication header
+ *
+ * @return The string to use to authenticate to the recipient.
+ */
+ public String getAuth() {
+ return (authentication);
+ }
+
+ /**
+ * Is this a metadata only delivery?
+ *
+ * @return True if this is a metadata only delivery
+ */
+ public boolean isMetaDataOnly() {
+ return (metaonly);
+ }
+
+ /**
+ * Should I send expect 100-continue header?
+ *
+ * @return True if I should.
+ */
+ public boolean isUsing100() {
+ return (use100);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/IsFrom.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/IsFrom.java
index 36dbc235..7e3b4bff 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/IsFrom.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/IsFrom.java
@@ -1,82 +1,86 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-import java.net.*;
-
-/**
- * Determine if an IP address is from a machine
- */
-public class IsFrom {
- private long nextcheck;
- private String[] ips;
- private String fqdn;
- /**
- * Configure the JVM DNS cache to have a 10 second TTL. This needs to be called very very early or it won't have any effect.
- */
- public static void setDNSCache() {
- java.security.Security.setProperty("networkaddress.cache.ttl", "10");
- }
- /**
- * Create an IsFrom for the specified fully qualified domain name.
- */
- public IsFrom(String fqdn) {
- this.fqdn = fqdn;
- }
- /**
- * Check if an IP address matches. If it has been more than
- * 10 seconds since DNS was last checked for changes to the
- * IP address(es) of this FQDN, check again. Then check
- * if the specified IP address belongs to the FQDN.
- */
- public synchronized boolean isFrom(String ip) {
- long now = System.currentTimeMillis();
- if (now > nextcheck) {
- nextcheck = now + 10000;
- Vector<String> v = new Vector<String>();
- try {
- InetAddress[] addrs = InetAddress.getAllByName(fqdn);
- for (InetAddress a: addrs) {
- v.add(a.getHostAddress());
- }
- } catch (Exception e) {
- }
- ips = v.toArray(new String[v.size()]);
- }
- for (String s: ips) {
- if (s.equals(ip)) {
- return(true);
- }
- }
- return(false);
- }
- /**
- * Return the fully qualified domain name
- */
- public String toString() {
- return(fqdn);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+import java.net.*;
+
+/**
+ * Determine if an IP address is from a machine
+ */
+public class IsFrom {
+ private long nextcheck;
+ private String[] ips;
+ private String fqdn;
+
+ /**
+ * Configure the JVM DNS cache to have a 10 second TTL. This needs to be called very very early or it won't have any effect.
+ */
+ public static void setDNSCache() {
+ java.security.Security.setProperty("networkaddress.cache.ttl", "10");
+ }
+
+ /**
+ * Create an IsFrom for the specified fully qualified domain name.
+ */
+ public IsFrom(String fqdn) {
+ this.fqdn = fqdn;
+ }
+
+ /**
+ * Check if an IP address matches. If it has been more than
+ * 10 seconds since DNS was last checked for changes to the
+ * IP address(es) of this FQDN, check again. Then check
+ * if the specified IP address belongs to the FQDN.
+ */
+ public synchronized boolean isFrom(String ip) {
+ long now = System.currentTimeMillis();
+ if (now > nextcheck) {
+ nextcheck = now + 10000;
+ Vector<String> v = new Vector<String>();
+ try {
+ InetAddress[] addrs = InetAddress.getAllByName(fqdn);
+ for (InetAddress a : addrs) {
+ v.add(a.getHostAddress());
+ }
+ } catch (Exception e) {
+ }
+ ips = v.toArray(new String[v.size()]);
+ }
+ for (String s : ips) {
+ if (s.equals(ip)) {
+ return (true);
+ }
+ }
+ return (false);
+ }
+
+ /**
+ * Return the fully qualified domain name
+ */
+ public String toString() {
+ return (fqdn);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/LogManager.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/LogManager.java
index 0e89f417..ade47730 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/LogManager.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/LogManager.java
@@ -1,159 +1,198 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-import java.util.regex.*;
-import java.io.*;
-import java.nio.file.*;
-import java.text.*;
-
-/**
- * Cleanup of old log files.
- * <p>
- * Periodically scan the log directory for log files that are older than
- * the log file retention interval, and delete them. In a future release,
- * This class will also be responsible for uploading events logs to the
- * log server to support the log query APIs.
- */
-
-public class LogManager extends TimerTask {
- private NodeConfigManager config;
- private Matcher isnodelog;
- private Matcher iseventlog;
- private Uploader worker;
- private String uploaddir;
- private String logdir;
- private class Uploader extends Thread implements DeliveryQueueHelper {
- public long getInitFailureTimer() { return(10000L); }
- public double getFailureBackoff() { return(2.0); }
- public long getMaxFailureTimer() { return(150000L); }
- public long getExpirationTimer() { return(604800000L); }
- public int getFairFileLimit() { return(10000); }
- public long getFairTimeLimit() { return(86400000); }
- public String getDestURL(DestInfo dest, String fileid) {
- return(config.getEventLogUrl());
- }
- public void handleUnreachable(DestInfo dest) {}
- public boolean handleRedirection(DestInfo dest, String location, String fileid) { return(false); }
- public boolean isFollowRedirects() { return(false); }
- public String getFeedId(String subid) { return(null); }
- private DeliveryQueue dq;
- public Uploader() {
- dq = new DeliveryQueue(this, new DestInfo("LogUpload", uploaddir, null, null, null, config.getMyName(), config.getMyAuth(), false, false));
- setDaemon(true);
- setName("Log Uploader");
- start();
- }
- private synchronized void snooze() {
- try {
- wait(10000);
- } catch (Exception e) {
- }
- }
- private synchronized void poke() {
- notify();
- }
- public void run() {
- while (true) {
- scan();
- dq.run();
- snooze();
- }
- }
- private void scan() {
- long threshold = System.currentTimeMillis() - config.getLogRetention();
- File dir = new File(logdir);
- String[] fns = dir.list();
- Arrays.sort(fns);
- String lastqueued = "events-000000000000.log";
- String curlog = StatusLog.getCurLogFile();
- curlog = curlog.substring(curlog.lastIndexOf('/') + 1);
- try {
- Writer w = new FileWriter(uploaddir + "/.meta");
- w.write("POST\tlogdata\nContent-Type\ttext/plain\n");
- w.close();
- BufferedReader br = new BufferedReader(new FileReader(uploaddir + "/.lastqueued"));
- lastqueued = br.readLine();
- br.close();
- } catch (Exception e) {
- }
- for (String fn: fns) {
- if (!isnodelog.reset(fn).matches()) {
- if (!iseventlog.reset(fn).matches()) {
- continue;
- }
- if (lastqueued.compareTo(fn) < 0 && curlog.compareTo(fn) > 0) {
- lastqueued = fn;
- try {
- String pid = config.getPublishId();
- Files.createLink(Paths.get(uploaddir + "/" + pid), Paths.get(logdir + "/" + fn));
- Files.createLink(Paths.get(uploaddir + "/" + pid + ".M"), Paths.get(uploaddir + "/.meta"));
- } catch (Exception e) {
- }
- }
- }
- File f = new File(dir, fn);
- if (f.lastModified() < threshold) {
- f.delete();
- }
- }
- try {
- (new File(uploaddir + "/.meta")).delete();
- Writer w = new FileWriter(uploaddir + "/.lastqueued");
- w.write(lastqueued + "\n");
- w.close();
- } catch (Exception e) {
- }
- }
- }
- /**
- * Construct a log manager
- * <p>
- * The log manager will check for expired log files every 5 minutes
- * at 20 seconds after the 5 minute boundary. (Actually, the
- * interval is the event log rollover interval, which
- * defaults to 5 minutes).
- */
- public LogManager(NodeConfigManager config) {
- this.config = config;
- try {
- isnodelog = Pattern.compile("node\\.log\\.\\d{8}").matcher("");
- iseventlog = Pattern.compile("events-\\d{12}\\.log").matcher("");
- } catch (Exception e) {}
- logdir = config.getLogDir();
- uploaddir = logdir + "/.spool";
- (new File(uploaddir)).mkdirs();
- long now = System.currentTimeMillis();
- long intvl = StatusLog.parseInterval(config.getEventLogInterval(), 300000);
- long when = now - now % intvl + intvl + 20000L;
- config.getTimer().scheduleAtFixedRate(this, when - now, intvl);
- worker = new Uploader();
- }
- /**
- * Trigger check for expired log files and log files to upload
- */
- public void run() {
- worker.poke();
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+import java.util.regex.*;
+import java.io.*;
+import java.nio.file.*;
+import java.text.*;
+
+/**
+ * Cleanup of old log files.
+ * <p>
+ * Periodically scan the log directory for log files that are older than
+ * the log file retention interval, and delete them. In a future release,
+ * This class will also be responsible for uploading events logs to the
+ * log server to support the log query APIs.
+ */
+
+public class LogManager extends TimerTask {
+ private NodeConfigManager config;
+ private Matcher isnodelog;
+ private Matcher iseventlog;
+ private Uploader worker;
+ private String uploaddir;
+ private String logdir;
+
+ private class Uploader extends Thread implements DeliveryQueueHelper {
+ public long getInitFailureTimer() {
+ return (10000L);
+ }
+
+ public double getFailureBackoff() {
+ return (2.0);
+ }
+
+ public long getMaxFailureTimer() {
+ return (150000L);
+ }
+
+ public long getExpirationTimer() {
+ return (604800000L);
+ }
+
+ public int getFairFileLimit() {
+ return (10000);
+ }
+
+ public long getFairTimeLimit() {
+ return (86400000);
+ }
+
+ public String getDestURL(DestInfo dest, String fileid) {
+ return (config.getEventLogUrl());
+ }
+
+ public void handleUnreachable(DestInfo dest) {
+ }
+
+ public boolean handleRedirection(DestInfo dest, String location, String fileid) {
+ return (false);
+ }
+
+ public boolean isFollowRedirects() {
+ return (false);
+ }
+
+ public String getFeedId(String subid) {
+ return (null);
+ }
+
+ private DeliveryQueue dq;
+
+ public Uploader() {
+ dq = new DeliveryQueue(this, new DestInfo("LogUpload", uploaddir, null, null, null, config.getMyName(), config.getMyAuth(), false, false));
+ setDaemon(true);
+ setName("Log Uploader");
+ start();
+ }
+
+ private synchronized void snooze() {
+ try {
+ wait(10000);
+ } catch (Exception e) {
+ }
+ }
+
+ private synchronized void poke() {
+ notify();
+ }
+
+ public void run() {
+ while (true) {
+ scan();
+ dq.run();
+ snooze();
+ }
+ }
+
+ private void scan() {
+ long threshold = System.currentTimeMillis() - config.getLogRetention();
+ File dir = new File(logdir);
+ String[] fns = dir.list();
+ Arrays.sort(fns);
+ String lastqueued = "events-000000000000.log";
+ String curlog = StatusLog.getCurLogFile();
+ curlog = curlog.substring(curlog.lastIndexOf('/') + 1);
+ try {
+ Writer w = new FileWriter(uploaddir + "/.meta");
+ w.write("POST\tlogdata\nContent-Type\ttext/plain\n");
+ w.close();
+ BufferedReader br = new BufferedReader(new FileReader(uploaddir + "/.lastqueued"));
+ lastqueued = br.readLine();
+ br.close();
+ } catch (Exception e) {
+ }
+ for (String fn : fns) {
+ if (!isnodelog.reset(fn).matches()) {
+ if (!iseventlog.reset(fn).matches()) {
+ continue;
+ }
+ if (lastqueued.compareTo(fn) < 0 && curlog.compareTo(fn) > 0) {
+ lastqueued = fn;
+ try {
+ String pid = config.getPublishId();
+ Files.createLink(Paths.get(uploaddir + "/" + pid), Paths.get(logdir + "/" + fn));
+ Files.createLink(Paths.get(uploaddir + "/" + pid + ".M"), Paths.get(uploaddir + "/.meta"));
+ } catch (Exception e) {
+ }
+ }
+ }
+ File f = new File(dir, fn);
+ if (f.lastModified() < threshold) {
+ f.delete();
+ }
+ }
+ try {
+ (new File(uploaddir + "/.meta")).delete();
+ Writer w = new FileWriter(uploaddir + "/.lastqueued");
+ w.write(lastqueued + "\n");
+ w.close();
+ } catch (Exception e) {
+ }
+ }
+ }
+
+ /**
+ * Construct a log manager
+ * <p>
+ * The log manager will check for expired log files every 5 minutes
+ * at 20 seconds after the 5 minute boundary. (Actually, the
+ * interval is the event log rollover interval, which
+ * defaults to 5 minutes).
+ */
+ public LogManager(NodeConfigManager config) {
+ this.config = config;
+ try {
+ isnodelog = Pattern.compile("node\\.log\\.\\d{8}").matcher("");
+ iseventlog = Pattern.compile("events-\\d{12}\\.log").matcher("");
+ } catch (Exception e) {
+ }
+ logdir = config.getLogDir();
+ uploaddir = logdir + "/.spool";
+ (new File(uploaddir)).mkdirs();
+ long now = System.currentTimeMillis();
+ long intvl = StatusLog.parseInterval(config.getEventLogInterval(), 300000);
+ long when = now - now % intvl + intvl + 20000L;
+ config.getTimer().scheduleAtFixedRate(this, when - now, intvl);
+ worker = new Uploader();
+ }
+
+ /**
+ * Trigger check for expired log files and log files to upload
+ */
+ public void run() {
+ worker.poke();
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfig.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfig.java
index c196d46c..91b90657 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfig.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfig.java
@@ -1,722 +1,799 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-import java.io.*;
-
-/**
- * Processed configuration for this node.
- * <p>
- * The NodeConfig represents a processed configuration from the Data Router
- * provisioning server. Each time configuration data is received from the
- * provisioning server, a new NodeConfig is created and the previous one
- * discarded.
- */
-public class NodeConfig {
- /**
- * Raw configuration entry for a data router node
- */
- public static class ProvNode {
- private String cname;
- /**
- * Construct a node configuration entry.
- * @param cname The cname of the node.
- */
- public ProvNode(String cname) {
- this.cname = cname;
- }
- /**
- * Get the cname of the node
- */
- public String getCName() {
- return(cname);
- }
- }
- /**
- * Raw configuration entry for a provisioning parameter
- */
- public static class ProvParam {
- private String name;
- private String value;
- /**
- * Construct a provisioning parameter configuration entry.
- * @param name The name of the parameter.
- * @param value The value of the parameter.
- */
- public ProvParam(String name, String value) {
- this.name = name;
- this.value = value;
- }
- /**
- * Get the name of the parameter.
- */
- public String getName() {
- return(name);
- }
- /**
- * Get the value of the parameter.
- */
- public String getValue() {
- return(value);
- }
- }
- /**
- * Raw configuration entry for a data feed.
- */
- public static class ProvFeed {
- private String id;
- private String logdata;
- private String status;
- /**
- * Construct a feed configuration entry.
- * @param id The feed ID of the entry.
- * @param logdata String for log entries about the entry.
- * @param status The reason why this feed cannot be used (Feed has been deleted, Feed has been suspended) or null if it is valid.
- */
- public ProvFeed(String id, String logdata, String status) {
- this.id = id;
- this.logdata = logdata;
- this.status = status;
- }
- /**
- * Get the feed id of the data feed.
- */
- public String getId() {
- return(id);
- }
- /**
- * Get the log data of the data feed.
- */
- public String getLogData() {
- return(logdata);
- }
- /**
- * Get the status of the data feed.
- */
- public String getStatus() {
- return(status);
- }
- }
- /**
- * Raw configuration entry for a feed user.
- */
- public static class ProvFeedUser {
- private String feedid;
- private String user;
- private String credentials;
- /**
- * Construct a feed user configuration entry
- * @param feedid The feed id.
- * @param user The user that will publish to the feed.
- * @param credentials The Authorization header the user will use to publish.
- */
- public ProvFeedUser(String feedid, String user, String credentials) {
- this.feedid = feedid;
- this.user = user;
- this.credentials = credentials;
- }
- /**
- * Get the feed id of the feed user.
- */
- public String getFeedId() {
- return(feedid);
- }
- /**
- * Get the user for the feed user.
- */
- public String getUser() {
- return(user);
- }
- /**
- * Get the credentials for the feed user.
- */
- public String getCredentials() {
- return(credentials);
- }
- }
- /**
- * Raw configuration entry for a feed subnet
- */
- public static class ProvFeedSubnet {
- private String feedid;
- private String cidr;
- /**
- * Construct a feed subnet configuration entry
- * @param feedid The feed ID
- * @param cidr The CIDR allowed to publish to the feed.
- */
- public ProvFeedSubnet(String feedid, String cidr) {
- this.feedid = feedid;
- this.cidr = cidr;
- }
- /**
- * Get the feed id of the feed subnet.
- */
- public String getFeedId() {
- return(feedid);
- }
- /**
- * Get the CIDR of the feed subnet.
- */
- public String getCidr() {
- return(cidr);
- }
- }
- /**
- * Raw configuration entry for a subscription
- */
- public static class ProvSubscription {
- private String subid;
- private String feedid;
- private String url;
- private String authuser;
- private String credentials;
- private boolean metaonly;
- private boolean use100;
- /**
- * Construct a subscription configuration entry
- * @param subid The subscription ID
- * @param feedid The feed ID
- * @param url The base delivery URL (not including the fileid)
- * @param authuser The user in the credentials used to deliver
- * @param credentials The credentials used to authenticate to the delivery URL exactly as they go in the Authorization header.
- * @param metaonly Is this a meta data only subscription?
- * @param use100 Should we send Expect: 100-continue?
- */
- public ProvSubscription(String subid, String feedid, String url, String authuser, String credentials, boolean metaonly, boolean use100) {
- this.subid = subid;
- this.feedid = feedid;
- this.url = url;
- this.authuser = authuser;
- this.credentials = credentials;
- this.metaonly = metaonly;
- this.use100 = use100;
- }
- /**
- * Get the subscription ID
- */
- public String getSubId() {
- return(subid);
- }
- /**
- * Get the feed ID
- */
- public String getFeedId() {
- return(feedid);
- }
- /**
- * Get the delivery URL
- */
- public String getURL() {
- return(url);
- }
- /**
- * Get the user
- */
- public String getAuthUser() {
- return(authuser);
- }
- /**
- * Get the delivery credentials
- */
- public String getCredentials() {
- return(credentials);
- }
- /**
- * Is this a meta data only subscription?
- */
- public boolean isMetaDataOnly() {
- return(metaonly);
- }
- /**
- * Should we send Expect: 100-continue?
- */
- public boolean isUsing100() {
- return(use100);
- }
- }
- /**
- * Raw configuration entry for controlled ingress to the data router node
- */
- public static class ProvForceIngress {
- private String feedid;
- private String subnet;
- private String user;
- private String[] nodes;
- /**
- * Construct a forced ingress configuration entry
- * @param feedid The feed ID that this entry applies to
- * @param subnet The CIDR for which publisher IP addresses this entry applies to or "" if it applies to all publisher IP addresses
- * @param user The publishing user this entry applies to or "" if it applies to all publishing users.
- * @param nodes The array of FQDNs of the data router nodes to redirect publication attempts to.
- */
- public ProvForceIngress(String feedid, String subnet, String user, String[] nodes) {
- this.feedid = feedid;
- this.subnet = subnet;
- this.user = user;
- this.nodes = nodes;
- }
- /**
- * Get the feed ID
- */
- public String getFeedId() {
- return(feedid);
- }
- /**
- * Get the subnet
- */
- public String getSubnet() {
- return(subnet);
- }
- /**
- * Get the user
- */
- public String getUser() {
- return(user);
- }
- /**
- * Get the node
- */
- public String[] getNodes() {
- return(nodes);
- }
- }
- /**
- * Raw configuration entry for controlled egress from the data router
- */
- public static class ProvForceEgress {
- private String subid;
- private String node;
- /**
- * Construct a forced egress configuration entry
- * @param subid The subscription ID the subscription with forced egress
- * @param node The node handling deliveries for this subscription
- */
- public ProvForceEgress(String subid, String node) {
- this.subid = subid;
- this.node = node;
- }
- /**
- * Get the subscription ID
- */
- public String getSubId() {
- return(subid);
- }
- /**
- * Get the node
- */
- public String getNode() {
- return(node);
- }
- }
- /**
- * Raw configuration entry for routing within the data router network
- */
- public static class ProvHop {
- private String from;
- private String to;
- private String via;
- /**
- * A human readable description of this entry
- */
- public String toString() {
- return("Hop " + from + "->" + to + " via " + via);
- }
- /**
- * Construct a hop entry
- * @param from The FQDN of the node with the data to be delivered
- * @param to The FQDN of the node that will deliver to the subscriber
- * @param via The FQDN of the node where the from node should send the data
- */
- public ProvHop(String from, String to, String via) {
- this.from = from;
- this.to = to;
- this.via = via;
- }
- /**
- * Get the from node
- */
- public String getFrom() {
- return(from);
- }
- /**
- * Get the to node
- */
- public String getTo() {
- return(to);
- }
- /**
- * Get the next intermediate node
- */
- public String getVia() {
- return(via);
- }
- }
- private static class Redirection {
- public SubnetMatcher snm;
- public String user;
- public String[] nodes;
- }
- private static class Feed {
- public String loginfo;
- public String status;
- public SubnetMatcher[] subnets;
- public Hashtable<String, String> authusers = new Hashtable<String, String>();
- public Redirection[] redirections;
- public Target[] targets;
- }
- private Hashtable<String, String> params = new Hashtable<String, String>();
- private Hashtable<String, Feed> feeds = new Hashtable<String, Feed>();
- private Hashtable<String, DestInfo> nodeinfo = new Hashtable<String, DestInfo>();
- private Hashtable<String, DestInfo> subinfo = new Hashtable<String, DestInfo>();
- private Hashtable<String, IsFrom> nodes = new Hashtable<String, IsFrom>();
- private String myname;
- private String myauth;
- private DestInfo[] alldests;
- private int rrcntr;
- /**
- * Process the raw provisioning data to configure this node
- * @param pd The parsed provisioning data
- * @param myname My name as seen by external systems
- * @param spooldir The directory where temporary files live
- * @param port The port number for URLs
- * @param nodeauthkey The keying string used to generate node authentication credentials
- */
- public NodeConfig(ProvData pd, String myname, String spooldir, int port, String nodeauthkey) {
- this.myname = myname;
- for (ProvParam p: pd.getParams()) {
- params.put(p.getName(), p.getValue());
- }
- Vector<DestInfo> div = new Vector<DestInfo>();
- myauth = NodeUtils.getNodeAuthHdr(myname, nodeauthkey);
- for (ProvNode pn: pd.getNodes()) {
- String cn = pn.getCName();
- if (nodeinfo.get(cn) != null) {
- continue;
- }
- String auth = NodeUtils.getNodeAuthHdr(cn, nodeauthkey);
- DestInfo di = new DestInfo("n:" + cn, spooldir + "/n/" + cn, null, "n2n-" + cn, "https://" + cn + ":" + port + "/internal/publish", cn, myauth, false, true);
- (new File(di.getSpool())).mkdirs();
- div.add(di);
- nodeinfo.put(cn, di);
- nodes.put(auth, new IsFrom(cn));
- }
- PathFinder pf = new PathFinder(myname, nodeinfo.keySet().toArray(new String[nodeinfo.size()]), pd.getHops());
- Hashtable<String, Vector<Redirection>> rdtab = new Hashtable<String, Vector<Redirection>>();
- for (ProvForceIngress pfi: pd.getForceIngress()) {
- Vector<Redirection> v = rdtab.get(pfi.getFeedId());
- if (v == null) {
- v = new Vector<Redirection>();
- rdtab.put(pfi.getFeedId(), v);
- }
- Redirection r = new Redirection();
- if (pfi.getSubnet() != null) {
- r.snm = new SubnetMatcher(pfi.getSubnet());
- }
- r.user = pfi.getUser();
- r.nodes = pfi.getNodes();
- v.add(r);
- }
- Hashtable<String, Hashtable<String, String>> pfutab = new Hashtable<String, Hashtable<String, String>>();
- for (ProvFeedUser pfu: pd.getFeedUsers()) {
- Hashtable<String, String> t = pfutab.get(pfu.getFeedId());
- if (t == null) {
- t = new Hashtable<String, String>();
- pfutab.put(pfu.getFeedId(), t);
- }
- t.put(pfu.getCredentials(), pfu.getUser());
- }
- Hashtable<String, String> egrtab = new Hashtable<String, String>();
- for (ProvForceEgress pfe: pd.getForceEgress()) {
- if (pfe.getNode().equals(myname) || nodeinfo.get(pfe.getNode()) == null) {
- continue;
- }
- egrtab.put(pfe.getSubId(), pfe.getNode());
- }
- Hashtable<String, Vector<SubnetMatcher>> pfstab = new Hashtable<String, Vector<SubnetMatcher>>();
- for (ProvFeedSubnet pfs: pd.getFeedSubnets()) {
- Vector<SubnetMatcher> v = pfstab.get(pfs.getFeedId());
- if (v == null) {
- v = new Vector<SubnetMatcher>();
- pfstab.put(pfs.getFeedId(), v);
- }
- v.add(new SubnetMatcher(pfs.getCidr()));
- }
- Hashtable<String, StringBuffer> ttab = new Hashtable<String, StringBuffer>();
- HashSet<String> allfeeds = new HashSet<String>();
- for (ProvFeed pfx: pd.getFeeds()) {
- if (pfx.getStatus() == null) {
- allfeeds.add(pfx.getId());
- }
- }
- for (ProvSubscription ps: pd.getSubscriptions()) {
- String sid = ps.getSubId();
- String fid = ps.getFeedId();
- if (!allfeeds.contains(fid)) {
- continue;
- }
- if (subinfo.get(sid) != null) {
- continue;
- }
- int sididx = 999;
- try {
- sididx = Integer.parseInt(sid);
- sididx -= sididx % 100;
- } catch (Exception e) {
- }
- String siddir = sididx + "/" + sid;
- DestInfo di = new DestInfo("s:" + sid, spooldir + "/s/" + siddir, sid, fid, ps.getURL(), ps.getAuthUser(), ps.getCredentials(), ps.isMetaDataOnly(), ps.isUsing100());
- (new File(di.getSpool())).mkdirs();
- div.add(di);
- subinfo.put(sid, di);
- String egr = egrtab.get(sid);
- if (egr != null) {
- sid = pf.getPath(egr) + sid;
- }
- StringBuffer sb = ttab.get(fid);
- if (sb == null) {
- sb = new StringBuffer();
- ttab.put(fid, sb);
- }
- sb.append(' ').append(sid);
- }
- alldests = div.toArray(new DestInfo[div.size()]);
- for (ProvFeed pfx: pd.getFeeds()) {
- String fid = pfx.getId();
- Feed f = feeds.get(fid);
- if (f != null) {
- continue;
- }
- f = new Feed();
- feeds.put(fid, f);
- f.loginfo = pfx.getLogData();
- f.status = pfx.getStatus();
- Vector<SubnetMatcher> v1 = pfstab.get(fid);
- if (v1 == null) {
- f.subnets = new SubnetMatcher[0];
- } else {
- f.subnets = v1.toArray(new SubnetMatcher[v1.size()]);
- }
- Hashtable<String, String> h1 = pfutab.get(fid);
- if (h1 == null) {
- h1 = new Hashtable<String, String>();
- }
- f.authusers = h1;
- Vector<Redirection> v2 = rdtab.get(fid);
- if (v2 == null) {
- f.redirections = new Redirection[0];
- } else {
- f.redirections = v2.toArray(new Redirection[v2.size()]);
- }
- StringBuffer sb = ttab.get(fid);
- if (sb == null) {
- f.targets = new Target[0];
- } else {
- f.targets = parseRouting(sb.toString());
- }
- }
- }
- /**
- * Parse a target string into an array of targets
- * @param routing Target string
- * @return Array of targets.
- */
- public Target[] parseRouting(String routing) {
- routing = routing.trim();
- if ("".equals(routing)) {
- return(new Target[0]);
- }
- String[] xx = routing.split("\\s+");
- Hashtable<String, Target> tmap = new Hashtable<String, Target>();
- HashSet<String> subset = new HashSet<String>();
- Vector<Target> tv = new Vector<Target>();
- Target[] ret = new Target[xx.length];
- for (int i = 0; i < xx.length; i++) {
- String t = xx[i];
- int j = t.indexOf('/');
- if (j == -1) {
- DestInfo di = subinfo.get(t);
- if (di == null) {
- tv.add(new Target(null, t));
- } else {
- if (!subset.contains(t)) {
- subset.add(t);
- tv.add(new Target(di, null));
- }
- }
- } else {
- String node = t.substring(0, j);
- String rtg = t.substring(j + 1);
- DestInfo di = nodeinfo.get(node);
- if (di == null) {
- tv.add(new Target(null, t));
- } else {
- Target tt = tmap.get(node);
- if (tt == null) {
- tt = new Target(di, rtg);
- tmap.put(node, tt);
- tv.add(tt);
- } else {
- tt.addRouting(rtg);
- }
- }
- }
- }
- return(tv.toArray(new Target[tv.size()]));
- }
- /**
- * Check whether this is a valid node-to-node transfer
- * @param credentials Credentials offered by the supposed node
- * @param ip IP address the request came from
- */
- public boolean isAnotherNode(String credentials, String ip) {
- IsFrom n = nodes.get(credentials);
- return (n != null && n.isFrom(ip));
- }
- /**
- * Check whether publication is allowed.
- * @param feedid The ID of the feed being requested.
- * @param credentials The offered credentials
- * @param ip The requesting IP address
- */
- public String isPublishPermitted(String feedid, String credentials, String ip) {
- Feed f = feeds.get(feedid);
- String nf = "Feed does not exist";
- if (f != null) {
- nf = f.status;
- }
- if (nf != null) {
- return(nf);
- }
- String user = f.authusers.get(credentials);
- if (user == null) {
- return("Publisher not permitted for this feed");
- }
- if (f.subnets.length == 0) {
- return(null);
- }
- byte[] addr = NodeUtils.getInetAddress(ip);
- for (SubnetMatcher snm: f.subnets) {
- if (snm.matches(addr)) {
- return(null);
- }
- }
- return("Publisher not permitted for this feed");
- }
- /**
- * Get authenticated user
- */
- public String getAuthUser(String feedid, String credentials) {
- return(feeds.get(feedid).authusers.get(credentials));
- }
- /**
- * Check if the request should be redirected to a different ingress node
- */
- public String getIngressNode(String feedid, String user, String ip) {
- Feed f = feeds.get(feedid);
- if (f.redirections.length == 0) {
- return(null);
- }
- byte[] addr = NodeUtils.getInetAddress(ip);
- for (Redirection r: f.redirections) {
- if (r.user != null && !user.equals(r.user)) {
- continue;
- }
- if (r.snm != null && !r.snm.matches(addr)) {
- continue;
- }
- for (String n: r.nodes) {
- if (myname.equals(n)) {
- return(null);
- }
- }
- if (r.nodes.length == 0) {
- return(null);
- }
- return(r.nodes[rrcntr++ % r.nodes.length]);
- }
- return(null);
- }
- /**
- * Get a provisioned configuration parameter
- */
- public String getProvParam(String name) {
- return(params.get(name));
- }
- /**
- * Get all the DestInfos
- */
- public DestInfo[] getAllDests() {
- return(alldests);
- }
- /**
- * Get the targets for a feed
- * @param feedid The feed ID
- * @return The targets this feed should be delivered to
- */
- public Target[] getTargets(String feedid) {
- if (feedid == null) {
- return(new Target[0]);
- }
- Feed f = feeds.get(feedid);
- if (f == null) {
- return(new Target[0]);
- }
- return(f.targets);
- }
- /**
- * Get the feed ID for a subscription
- * @param subid The subscription ID
- * @return The feed ID
- */
- public String getFeedId(String subid) {
- DestInfo di = subinfo.get(subid);
- if (di == null) {
- return(null);
- }
- return(di.getLogData());
- }
- /**
- * Get the spool directory for a subscription
- * @param subid The subscription ID
- * @return The spool directory
- */
- public String getSpoolDir(String subid) {
- DestInfo di = subinfo.get(subid);
- if (di == null) {
- return(null);
- }
- return(di.getSpool());
- }
- /**
- * Get the Authorization value this node uses
- * @return The Authorization header value for this node
- */
- public String getMyAuth() {
- return(myauth);
- }
-
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+import java.io.*;
+
+/**
+ * Processed configuration for this node.
+ * <p>
+ * The NodeConfig represents a processed configuration from the Data Router
+ * provisioning server. Each time configuration data is received from the
+ * provisioning server, a new NodeConfig is created and the previous one
+ * discarded.
+ */
+public class NodeConfig {
+ /**
+ * Raw configuration entry for a data router node
+ */
+ public static class ProvNode {
+ private String cname;
+
+ /**
+ * Construct a node configuration entry.
+ *
+ * @param cname The cname of the node.
+ */
+ public ProvNode(String cname) {
+ this.cname = cname;
+ }
+
+ /**
+ * Get the cname of the node
+ */
+ public String getCName() {
+ return (cname);
+ }
+ }
+
+ /**
+ * Raw configuration entry for a provisioning parameter
+ */
+ public static class ProvParam {
+ private String name;
+ private String value;
+
+ /**
+ * Construct a provisioning parameter configuration entry.
+ *
+ * @param name The name of the parameter.
+ * @param value The value of the parameter.
+ */
+ public ProvParam(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ /**
+ * Get the name of the parameter.
+ */
+ public String getName() {
+ return (name);
+ }
+
+ /**
+ * Get the value of the parameter.
+ */
+ public String getValue() {
+ return (value);
+ }
+ }
+
+ /**
+ * Raw configuration entry for a data feed.
+ */
+ public static class ProvFeed {
+ private String id;
+ private String logdata;
+ private String status;
+
+ /**
+ * Construct a feed configuration entry.
+ *
+ * @param id The feed ID of the entry.
+ * @param logdata String for log entries about the entry.
+ * @param status The reason why this feed cannot be used (Feed has been deleted, Feed has been suspended) or null if it is valid.
+ */
+ public ProvFeed(String id, String logdata, String status) {
+ this.id = id;
+ this.logdata = logdata;
+ this.status = status;
+ }
+
+ /**
+ * Get the feed id of the data feed.
+ */
+ public String getId() {
+ return (id);
+ }
+
+ /**
+ * Get the log data of the data feed.
+ */
+ public String getLogData() {
+ return (logdata);
+ }
+
+ /**
+ * Get the status of the data feed.
+ */
+ public String getStatus() {
+ return (status);
+ }
+ }
+
+ /**
+ * Raw configuration entry for a feed user.
+ */
+ public static class ProvFeedUser {
+ private String feedid;
+ private String user;
+ private String credentials;
+
+ /**
+ * Construct a feed user configuration entry
+ *
+ * @param feedid The feed id.
+ * @param user The user that will publish to the feed.
+ * @param credentials The Authorization header the user will use to publish.
+ */
+ public ProvFeedUser(String feedid, String user, String credentials) {
+ this.feedid = feedid;
+ this.user = user;
+ this.credentials = credentials;
+ }
+
+ /**
+ * Get the feed id of the feed user.
+ */
+ public String getFeedId() {
+ return (feedid);
+ }
+
+ /**
+ * Get the user for the feed user.
+ */
+ public String getUser() {
+ return (user);
+ }
+
+ /**
+ * Get the credentials for the feed user.
+ */
+ public String getCredentials() {
+ return (credentials);
+ }
+ }
+
+ /**
+ * Raw configuration entry for a feed subnet
+ */
+ public static class ProvFeedSubnet {
+ private String feedid;
+ private String cidr;
+
+ /**
+ * Construct a feed subnet configuration entry
+ *
+ * @param feedid The feed ID
+ * @param cidr The CIDR allowed to publish to the feed.
+ */
+ public ProvFeedSubnet(String feedid, String cidr) {
+ this.feedid = feedid;
+ this.cidr = cidr;
+ }
+
+ /**
+ * Get the feed id of the feed subnet.
+ */
+ public String getFeedId() {
+ return (feedid);
+ }
+
+ /**
+ * Get the CIDR of the feed subnet.
+ */
+ public String getCidr() {
+ return (cidr);
+ }
+ }
+
+ /**
+ * Raw configuration entry for a subscription
+ */
+ public static class ProvSubscription {
+ private String subid;
+ private String feedid;
+ private String url;
+ private String authuser;
+ private String credentials;
+ private boolean metaonly;
+ private boolean use100;
+
+ /**
+ * Construct a subscription configuration entry
+ *
+ * @param subid The subscription ID
+ * @param feedid The feed ID
+ * @param url The base delivery URL (not including the fileid)
+ * @param authuser The user in the credentials used to deliver
+ * @param credentials The credentials used to authenticate to the delivery URL exactly as they go in the Authorization header.
+ * @param metaonly Is this a meta data only subscription?
+ * @param use100 Should we send Expect: 100-continue?
+ */
+ public ProvSubscription(String subid, String feedid, String url, String authuser, String credentials, boolean metaonly, boolean use100) {
+ this.subid = subid;
+ this.feedid = feedid;
+ this.url = url;
+ this.authuser = authuser;
+ this.credentials = credentials;
+ this.metaonly = metaonly;
+ this.use100 = use100;
+ }
+
+ /**
+ * Get the subscription ID
+ */
+ public String getSubId() {
+ return (subid);
+ }
+
+ /**
+ * Get the feed ID
+ */
+ public String getFeedId() {
+ return (feedid);
+ }
+
+ /**
+ * Get the delivery URL
+ */
+ public String getURL() {
+ return (url);
+ }
+
+ /**
+ * Get the user
+ */
+ public String getAuthUser() {
+ return (authuser);
+ }
+
+ /**
+ * Get the delivery credentials
+ */
+ public String getCredentials() {
+ return (credentials);
+ }
+
+ /**
+ * Is this a meta data only subscription?
+ */
+ public boolean isMetaDataOnly() {
+ return (metaonly);
+ }
+
+ /**
+ * Should we send Expect: 100-continue?
+ */
+ public boolean isUsing100() {
+ return (use100);
+ }
+ }
+
+ /**
+ * Raw configuration entry for controlled ingress to the data router node
+ */
+ public static class ProvForceIngress {
+ private String feedid;
+ private String subnet;
+ private String user;
+ private String[] nodes;
+
+ /**
+ * Construct a forced ingress configuration entry
+ *
+ * @param feedid The feed ID that this entry applies to
+ * @param subnet The CIDR for which publisher IP addresses this entry applies to or "" if it applies to all publisher IP addresses
+ * @param user The publishing user this entry applies to or "" if it applies to all publishing users.
+ * @param nodes The array of FQDNs of the data router nodes to redirect publication attempts to.
+ */
+ public ProvForceIngress(String feedid, String subnet, String user, String[] nodes) {
+ this.feedid = feedid;
+ this.subnet = subnet;
+ this.user = user;
+ this.nodes = nodes;
+ }
+
+ /**
+ * Get the feed ID
+ */
+ public String getFeedId() {
+ return (feedid);
+ }
+
+ /**
+ * Get the subnet
+ */
+ public String getSubnet() {
+ return (subnet);
+ }
+
+ /**
+ * Get the user
+ */
+ public String getUser() {
+ return (user);
+ }
+
+ /**
+ * Get the node
+ */
+ public String[] getNodes() {
+ return (nodes);
+ }
+ }
+
+ /**
+ * Raw configuration entry for controlled egress from the data router
+ */
+ public static class ProvForceEgress {
+ private String subid;
+ private String node;
+
+ /**
+ * Construct a forced egress configuration entry
+ *
+ * @param subid The subscription ID the subscription with forced egress
+ * @param node The node handling deliveries for this subscription
+ */
+ public ProvForceEgress(String subid, String node) {
+ this.subid = subid;
+ this.node = node;
+ }
+
+ /**
+ * Get the subscription ID
+ */
+ public String getSubId() {
+ return (subid);
+ }
+
+ /**
+ * Get the node
+ */
+ public String getNode() {
+ return (node);
+ }
+ }
+
+ /**
+ * Raw configuration entry for routing within the data router network
+ */
+ public static class ProvHop {
+ private String from;
+ private String to;
+ private String via;
+
+ /**
+ * A human readable description of this entry
+ */
+ public String toString() {
+ return ("Hop " + from + "->" + to + " via " + via);
+ }
+
+ /**
+ * Construct a hop entry
+ *
+ * @param from The FQDN of the node with the data to be delivered
+ * @param to The FQDN of the node that will deliver to the subscriber
+ * @param via The FQDN of the node where the from node should send the data
+ */
+ public ProvHop(String from, String to, String via) {
+ this.from = from;
+ this.to = to;
+ this.via = via;
+ }
+
+ /**
+ * Get the from node
+ */
+ public String getFrom() {
+ return (from);
+ }
+
+ /**
+ * Get the to node
+ */
+ public String getTo() {
+ return (to);
+ }
+
+ /**
+ * Get the next intermediate node
+ */
+ public String getVia() {
+ return (via);
+ }
+ }
+
+ private static class Redirection {
+ public SubnetMatcher snm;
+ public String user;
+ public String[] nodes;
+ }
+
+ private static class Feed {
+ public String loginfo;
+ public String status;
+ public SubnetMatcher[] subnets;
+ public Hashtable<String, String> authusers = new Hashtable<String, String>();
+ public Redirection[] redirections;
+ public Target[] targets;
+ }
+
+ private Hashtable<String, String> params = new Hashtable<String, String>();
+ private Hashtable<String, Feed> feeds = new Hashtable<String, Feed>();
+ private Hashtable<String, DestInfo> nodeinfo = new Hashtable<String, DestInfo>();
+ private Hashtable<String, DestInfo> subinfo = new Hashtable<String, DestInfo>();
+ private Hashtable<String, IsFrom> nodes = new Hashtable<String, IsFrom>();
+ private String myname;
+ private String myauth;
+ private DestInfo[] alldests;
+ private int rrcntr;
+
+ /**
+ * Process the raw provisioning data to configure this node
+ *
+ * @param pd The parsed provisioning data
+ * @param myname My name as seen by external systems
+ * @param spooldir The directory where temporary files live
+ * @param port The port number for URLs
+ * @param nodeauthkey The keying string used to generate node authentication credentials
+ */
+ public NodeConfig(ProvData pd, String myname, String spooldir, int port, String nodeauthkey) {
+ this.myname = myname;
+ for (ProvParam p : pd.getParams()) {
+ params.put(p.getName(), p.getValue());
+ }
+ Vector<DestInfo> div = new Vector<DestInfo>();
+ myauth = NodeUtils.getNodeAuthHdr(myname, nodeauthkey);
+ for (ProvNode pn : pd.getNodes()) {
+ String cn = pn.getCName();
+ if (nodeinfo.get(cn) != null) {
+ continue;
+ }
+ String auth = NodeUtils.getNodeAuthHdr(cn, nodeauthkey);
+ DestInfo di = new DestInfo("n:" + cn, spooldir + "/n/" + cn, null, "n2n-" + cn, "https://" + cn + ":" + port + "/internal/publish", cn, myauth, false, true);
+ (new File(di.getSpool())).mkdirs();
+ div.add(di);
+ nodeinfo.put(cn, di);
+ nodes.put(auth, new IsFrom(cn));
+ }
+ PathFinder pf = new PathFinder(myname, nodeinfo.keySet().toArray(new String[nodeinfo.size()]), pd.getHops());
+ Hashtable<String, Vector<Redirection>> rdtab = new Hashtable<String, Vector<Redirection>>();
+ for (ProvForceIngress pfi : pd.getForceIngress()) {
+ Vector<Redirection> v = rdtab.get(pfi.getFeedId());
+ if (v == null) {
+ v = new Vector<Redirection>();
+ rdtab.put(pfi.getFeedId(), v);
+ }
+ Redirection r = new Redirection();
+ if (pfi.getSubnet() != null) {
+ r.snm = new SubnetMatcher(pfi.getSubnet());
+ }
+ r.user = pfi.getUser();
+ r.nodes = pfi.getNodes();
+ v.add(r);
+ }
+ Hashtable<String, Hashtable<String, String>> pfutab = new Hashtable<String, Hashtable<String, String>>();
+ for (ProvFeedUser pfu : pd.getFeedUsers()) {
+ Hashtable<String, String> t = pfutab.get(pfu.getFeedId());
+ if (t == null) {
+ t = new Hashtable<String, String>();
+ pfutab.put(pfu.getFeedId(), t);
+ }
+ t.put(pfu.getCredentials(), pfu.getUser());
+ }
+ Hashtable<String, String> egrtab = new Hashtable<String, String>();
+ for (ProvForceEgress pfe : pd.getForceEgress()) {
+ if (pfe.getNode().equals(myname) || nodeinfo.get(pfe.getNode()) == null) {
+ continue;
+ }
+ egrtab.put(pfe.getSubId(), pfe.getNode());
+ }
+ Hashtable<String, Vector<SubnetMatcher>> pfstab = new Hashtable<String, Vector<SubnetMatcher>>();
+ for (ProvFeedSubnet pfs : pd.getFeedSubnets()) {
+ Vector<SubnetMatcher> v = pfstab.get(pfs.getFeedId());
+ if (v == null) {
+ v = new Vector<SubnetMatcher>();
+ pfstab.put(pfs.getFeedId(), v);
+ }
+ v.add(new SubnetMatcher(pfs.getCidr()));
+ }
+ Hashtable<String, StringBuffer> ttab = new Hashtable<String, StringBuffer>();
+ HashSet<String> allfeeds = new HashSet<String>();
+ for (ProvFeed pfx : pd.getFeeds()) {
+ if (pfx.getStatus() == null) {
+ allfeeds.add(pfx.getId());
+ }
+ }
+ for (ProvSubscription ps : pd.getSubscriptions()) {
+ String sid = ps.getSubId();
+ String fid = ps.getFeedId();
+ if (!allfeeds.contains(fid)) {
+ continue;
+ }
+ if (subinfo.get(sid) != null) {
+ continue;
+ }
+ int sididx = 999;
+ try {
+ sididx = Integer.parseInt(sid);
+ sididx -= sididx % 100;
+ } catch (Exception e) {
+ }
+ String siddir = sididx + "/" + sid;
+ DestInfo di = new DestInfo("s:" + sid, spooldir + "/s/" + siddir, sid, fid, ps.getURL(), ps.getAuthUser(), ps.getCredentials(), ps.isMetaDataOnly(), ps.isUsing100());
+ (new File(di.getSpool())).mkdirs();
+ div.add(di);
+ subinfo.put(sid, di);
+ String egr = egrtab.get(sid);
+ if (egr != null) {
+ sid = pf.getPath(egr) + sid;
+ }
+ StringBuffer sb = ttab.get(fid);
+ if (sb == null) {
+ sb = new StringBuffer();
+ ttab.put(fid, sb);
+ }
+ sb.append(' ').append(sid);
+ }
+ alldests = div.toArray(new DestInfo[div.size()]);
+ for (ProvFeed pfx : pd.getFeeds()) {
+ String fid = pfx.getId();
+ Feed f = feeds.get(fid);
+ if (f != null) {
+ continue;
+ }
+ f = new Feed();
+ feeds.put(fid, f);
+ f.loginfo = pfx.getLogData();
+ f.status = pfx.getStatus();
+ Vector<SubnetMatcher> v1 = pfstab.get(fid);
+ if (v1 == null) {
+ f.subnets = new SubnetMatcher[0];
+ } else {
+ f.subnets = v1.toArray(new SubnetMatcher[v1.size()]);
+ }
+ Hashtable<String, String> h1 = pfutab.get(fid);
+ if (h1 == null) {
+ h1 = new Hashtable<String, String>();
+ }
+ f.authusers = h1;
+ Vector<Redirection> v2 = rdtab.get(fid);
+ if (v2 == null) {
+ f.redirections = new Redirection[0];
+ } else {
+ f.redirections = v2.toArray(new Redirection[v2.size()]);
+ }
+ StringBuffer sb = ttab.get(fid);
+ if (sb == null) {
+ f.targets = new Target[0];
+ } else {
+ f.targets = parseRouting(sb.toString());
+ }
+ }
+ }
+
+ /**
+ * Parse a target string into an array of targets
+ *
+ * @param routing Target string
+ * @return Array of targets.
+ */
+ public Target[] parseRouting(String routing) {
+ routing = routing.trim();
+ if ("".equals(routing)) {
+ return (new Target[0]);
+ }
+ String[] xx = routing.split("\\s+");
+ Hashtable<String, Target> tmap = new Hashtable<String, Target>();
+ HashSet<String> subset = new HashSet<String>();
+ Vector<Target> tv = new Vector<Target>();
+ Target[] ret = new Target[xx.length];
+ for (int i = 0; i < xx.length; i++) {
+ String t = xx[i];
+ int j = t.indexOf('/');
+ if (j == -1) {
+ DestInfo di = subinfo.get(t);
+ if (di == null) {
+ tv.add(new Target(null, t));
+ } else {
+ if (!subset.contains(t)) {
+ subset.add(t);
+ tv.add(new Target(di, null));
+ }
+ }
+ } else {
+ String node = t.substring(0, j);
+ String rtg = t.substring(j + 1);
+ DestInfo di = nodeinfo.get(node);
+ if (di == null) {
+ tv.add(new Target(null, t));
+ } else {
+ Target tt = tmap.get(node);
+ if (tt == null) {
+ tt = new Target(di, rtg);
+ tmap.put(node, tt);
+ tv.add(tt);
+ } else {
+ tt.addRouting(rtg);
+ }
+ }
+ }
+ }
+ return (tv.toArray(new Target[tv.size()]));
+ }
+
+ /**
+ * Check whether this is a valid node-to-node transfer
+ *
+ * @param credentials Credentials offered by the supposed node
+ * @param ip IP address the request came from
+ */
+ public boolean isAnotherNode(String credentials, String ip) {
+ IsFrom n = nodes.get(credentials);
+ return (n != null && n.isFrom(ip));
+ }
+
+ /**
+ * Check whether publication is allowed.
+ *
+ * @param feedid The ID of the feed being requested.
+ * @param credentials The offered credentials
+ * @param ip The requesting IP address
+ */
+ public String isPublishPermitted(String feedid, String credentials, String ip) {
+ Feed f = feeds.get(feedid);
+ String nf = "Feed does not exist";
+ if (f != null) {
+ nf = f.status;
+ }
+ if (nf != null) {
+ return (nf);
+ }
+ String user = f.authusers.get(credentials);
+ if (user == null) {
+ return ("Publisher not permitted for this feed");
+ }
+ if (f.subnets.length == 0) {
+ return (null);
+ }
+ byte[] addr = NodeUtils.getInetAddress(ip);
+ for (SubnetMatcher snm : f.subnets) {
+ if (snm.matches(addr)) {
+ return (null);
+ }
+ }
+ return ("Publisher not permitted for this feed");
+ }
+
+ /**
+ * Get authenticated user
+ */
+ public String getAuthUser(String feedid, String credentials) {
+ return (feeds.get(feedid).authusers.get(credentials));
+ }
+
+ /**
+ * Check if the request should be redirected to a different ingress node
+ */
+ public String getIngressNode(String feedid, String user, String ip) {
+ Feed f = feeds.get(feedid);
+ if (f.redirections.length == 0) {
+ return (null);
+ }
+ byte[] addr = NodeUtils.getInetAddress(ip);
+ for (Redirection r : f.redirections) {
+ if (r.user != null && !user.equals(r.user)) {
+ continue;
+ }
+ if (r.snm != null && !r.snm.matches(addr)) {
+ continue;
+ }
+ for (String n : r.nodes) {
+ if (myname.equals(n)) {
+ return (null);
+ }
+ }
+ if (r.nodes.length == 0) {
+ return (null);
+ }
+ return (r.nodes[rrcntr++ % r.nodes.length]);
+ }
+ return (null);
+ }
+
+ /**
+ * Get a provisioned configuration parameter
+ */
+ public String getProvParam(String name) {
+ return (params.get(name));
+ }
+
+ /**
+ * Get all the DestInfos
+ */
+ public DestInfo[] getAllDests() {
+ return (alldests);
+ }
+
+ /**
+ * Get the targets for a feed
+ *
+ * @param feedid The feed ID
+ * @return The targets this feed should be delivered to
+ */
+ public Target[] getTargets(String feedid) {
+ if (feedid == null) {
+ return (new Target[0]);
+ }
+ Feed f = feeds.get(feedid);
+ if (f == null) {
+ return (new Target[0]);
+ }
+ return (f.targets);
+ }
+
+ /**
+ * Get the feed ID for a subscription
+ *
+ * @param subid The subscription ID
+ * @return The feed ID
+ */
+ public String getFeedId(String subid) {
+ DestInfo di = subinfo.get(subid);
+ if (di == null) {
+ return (null);
+ }
+ return (di.getLogData());
+ }
+
+ /**
+ * Get the spool directory for a subscription
+ *
+ * @param subid The subscription ID
+ * @return The spool directory
+ */
+ public String getSpoolDir(String subid) {
+ DestInfo di = subinfo.get(subid);
+ if (di == null) {
+ return (null);
+ }
+ return (di.getSpool());
+ }
+
+ /**
+ * Get the Authorization value this node uses
+ *
+ * @return The Authorization header value for this node
+ */
+ public String getMyAuth() {
+ return (myauth);
+ }
+
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java
index b80babd6..a0d5f618 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeConfigManager.java
@@ -1,599 +1,690 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.net.*;
-import java.util.*;
-import java.io.*;
-import org.apache.log4j.Logger;
-import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-
-/**
- * Maintain the configuration of a Data Router node
- * <p>
- * The NodeConfigManager is the single point of contact for servlet, delivery, event logging, and log retention subsystems to access configuration information. (Log4J has its own configuration mechanism).
- * <p>
- * There are two basic sets of configuration data. The
- * static local configuration data, stored in a local configuration file (created
- * as part of installation by SWM), and the dynamic global
- * configuration data fetched from the data router provisioning server.
- */
-public class NodeConfigManager implements DeliveryQueueHelper {
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeConfigManager");
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeConfigManager");
- private static NodeConfigManager base = new NodeConfigManager();
-
- private Timer timer = new Timer("Node Configuration Timer", true);
- private long maxfailuretimer;
- private long initfailuretimer;
- private long expirationtimer;
- private double failurebackoff;
- private long fairtimelimit;
- private int fairfilelimit;
- private double fdpstart;
- private double fdpstop;
- private int deliverythreads;
- private String provurl;
- private String provhost;
- private IsFrom provcheck;
- private int gfport;
- private int svcport;
- private int port;
- private String spooldir;
- private String logdir;
- private long logretention;
- private String redirfile;
- private String kstype;
- private String ksfile;
- private String kspass;
- private String kpass;
- private String tstype;
- private String tsfile;
- private String tspass;
- private String myname;
- private RedirManager rdmgr;
- private RateLimitedOperation pfetcher;
- private NodeConfig config;
- private File quiesce;
- private PublishId pid;
- private String nak;
- private TaskList configtasks = new TaskList();
- private String eventlogurl;
- private String eventlogprefix;
- private String eventlogsuffix;
- private String eventloginterval;
- private boolean followredirects;
-
-
- /**
- * Get the default node configuration manager
- */
- public static NodeConfigManager getInstance() {
- return(base);
- }
- /**
- * Initialize the configuration of a Data Router node
- */
- private NodeConfigManager() {
- Properties p = new Properties();
- try {
- p.load(new FileInputStream(System.getProperty("org.onap.dmaap.datarouter.node.ConfigFile", "/opt/app/datartr/etc/node.properties")));
- } catch (Exception e) {
-
- NodeUtils.setIpAndFqdnForEelf("NodeConfigManager");
- eelflogger.error(EelfMsgs.MESSAGE_PROPERTIES_LOAD_ERROR);
- logger.error("NODE0301 Unable to load local configuration file " + System.getProperty("org.onap.dmaap.datarouter.node.ConfigFile", "/opt/app/datartr/etc/node.properties"), e);
- }
- provurl = p.getProperty("ProvisioningURL", "https://feeds-drtr.web.att.com/internal/prov");
- try {
- provhost = (new URL(provurl)).getHost();
- } catch (Exception e) {
- NodeUtils.setIpAndFqdnForEelf("NodeConfigManager");
- eelflogger.error(EelfMsgs.MESSAGE_BAD_PROV_URL, provurl);
- logger.error("NODE0302 Bad provisioning server URL " + provurl);
- System.exit(1);
- }
- logger.info("NODE0303 Provisioning server is " + provhost);
- eventlogurl = p.getProperty("LogUploadURL", "https://feeds-drtr.web.att.com/internal/logs");
- provcheck = new IsFrom(provhost);
- gfport = Integer.parseInt(p.getProperty("IntHttpPort", "8080"));
- svcport = Integer.parseInt(p.getProperty("IntHttpsPort", "8443"));
- port = Integer.parseInt(p.getProperty("ExtHttpsPort", "443"));
- long minpfinterval = Long.parseLong(p.getProperty("MinProvFetchInterval", "10000"));
- long minrsinterval = Long.parseLong(p.getProperty("MinRedirSaveInterval", "10000"));
- spooldir = p.getProperty("SpoolDir", "spool");
- File fdir = new File(spooldir + "/f");
- fdir.mkdirs();
- for (File junk: fdir.listFiles()) {
- if (junk.isFile()) {
- junk.delete();
- }
- }
- logdir = p.getProperty("LogDir", "logs");
- (new File(logdir)).mkdirs();
- logretention = Long.parseLong(p.getProperty("LogRetention", "30")) * 86400000L;
- eventlogprefix = logdir + "/events";
- eventlogsuffix = ".log";
- String redirfile = p.getProperty("RedirectionFile", "etc/redirections.dat");
- kstype = p.getProperty("KeyStoreType", "jks");
- ksfile = p.getProperty("KeyStoreFile", "etc/keystore");
- kspass = p.getProperty("KeyStorePassword", "changeme");
- kpass = p.getProperty("KeyPassword", "changeme");
- tstype = p.getProperty("TrustStoreType", "jks");
- tsfile = p.getProperty("TrustStoreFile");
- tspass = p.getProperty("TrustStorePassword", "changeme");
- if (tsfile != null && tsfile.length() > 0) {
- System.setProperty("javax.net.ssl.trustStoreType", tstype);
- System.setProperty("javax.net.ssl.trustStore", tsfile);
- System.setProperty("javax.net.ssl.trustStorePassword", tspass);
- }
- nak = p.getProperty("NodeAuthKey", "Node123!");
- quiesce = new File(p.getProperty("QuiesceFile", "etc/SHUTDOWN"));
- myname = NodeUtils.getCanonicalName(kstype, ksfile, kspass);
- if (myname == null) {
- NodeUtils.setIpAndFqdnForEelf("NodeConfigManager");
- eelflogger.error(EelfMsgs.MESSAGE_KEYSTORE_FETCH_ERROR, ksfile);
- logger.error("NODE0309 Unable to fetch canonical name from keystore file " + ksfile);
- System.exit(1);
- }
- logger.info("NODE0304 My certificate says my name is " + myname);
- pid = new PublishId(myname);
- rdmgr = new RedirManager(redirfile, minrsinterval, timer);
- pfetcher = new RateLimitedOperation(minpfinterval, timer) {
- public void run() {
- fetchconfig();
- }
- };
- logger.info("NODE0305 Attempting to fetch configuration at " + provurl);
- pfetcher.request();
- }
- private void localconfig() {
- followredirects = Boolean.parseBoolean(getProvParam("FOLLOW_REDIRECTS", "false"));
- eventloginterval = getProvParam("LOGROLL_INTERVAL", "5m");
- initfailuretimer = 10000;
- maxfailuretimer = 3600000;
- expirationtimer = 86400000;
- failurebackoff = 2.0;
- deliverythreads = 40;
- fairfilelimit = 100;
- fairtimelimit = 60000;
- fdpstart = 0.05;
- fdpstop = 0.2;
- try { initfailuretimer = (long)(Double.parseDouble(getProvParam("DELIVERY_INIT_RETRY_INTERVAL")) * 1000); } catch (Exception e) {}
- try { maxfailuretimer = (long)(Double.parseDouble(getProvParam("DELIVERY_MAX_RETRY_INTERVAL")) * 1000); } catch (Exception e) {}
- try { expirationtimer = (long)(Double.parseDouble(getProvParam("DELIVERY_MAX_AGE")) * 1000); } catch (Exception e) {}
- try { failurebackoff = Double.parseDouble(getProvParam("DELIVERY_RETRY_RATIO")); } catch (Exception e) {}
- try { deliverythreads = Integer.parseInt(getProvParam("DELIVERY_THREADS")); } catch (Exception e) {}
- try { fairfilelimit = Integer.parseInt(getProvParam("FAIR_FILE_LIMIT")); } catch (Exception e) {}
- try { fairtimelimit = (long)(Double.parseDouble(getProvParam("FAIR_TIME_LIMIT")) * 1000); } catch (Exception e) {}
- try { fdpstart = Double.parseDouble(getProvParam("FREE_DISK_RED_PERCENT")) / 100.0; } catch (Exception e) {}
- try { fdpstop = Double.parseDouble(getProvParam("FREE_DISK_YELLOW_PERCENT")) / 100.0; } catch (Exception e) {}
- if (fdpstart < 0.01) {
- fdpstart = 0.01;
- }
- if (fdpstart > 0.5) {
- fdpstart = 0.5;
- }
- if (fdpstop < fdpstart) {
- fdpstop = fdpstart;
- }
- if (fdpstop > 0.5) {
- fdpstop = 0.5;
- }
- }
- private void fetchconfig() {
- try {
- System.out.println("provurl:: "+provurl);
- Reader r = new InputStreamReader((new URL(provurl)).openStream());
- config = new NodeConfig(new ProvData(r), myname, spooldir, port, nak);
- localconfig();
- configtasks.startRun();
- Runnable rr;
- while ((rr = configtasks.next()) != null) {
- try {
- rr.run();
- } catch (Exception e) {
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- NodeUtils.setIpAndFqdnForEelf("fetchconfigs");
- eelflogger.error(EelfMsgs.MESSAGE_CONF_FAILED, e.toString());
- logger.error("NODE0306 Configuration failed " + e.toString() + " - try again later", e);
- pfetcher.request();
- }
- }
- /**
- * Process a gofetch request from a particular IP address. If the
- * IP address is not an IP address we would go to to fetch the
- * provisioning data, ignore the request. If the data has been
- * fetched very recently (default 10 seconds), wait a while before fetching again.
- */
- public synchronized void gofetch(String remoteaddr) {
- if (provcheck.isFrom(remoteaddr)) {
- logger.info("NODE0307 Received configuration fetch request from provisioning server " + remoteaddr);
- pfetcher.request();
- } else {
- logger.info("NODE0308 Received configuration fetch request from unexpected server " + remoteaddr);
- }
- }
- /**
- * Am I configured?
- */
- public boolean isConfigured() {
- return(config != null);
- }
- /**
- * Am I shut down?
- */
- public boolean isShutdown() {
- return(quiesce.exists());
- }
- /**
- * Given a routing string, get the targets.
- * @param routing Target string
- * @return array of targets
- */
- public Target[] parseRouting(String routing) {
- return(config.parseRouting(routing));
- }
- /**
- * Given a set of credentials and an IP address, is this request from another node?
- * @param credentials Credentials offered by the supposed node
- * @param ip IP address the request came from
- * @return If the credentials and IP address are recognized, true, otherwise false.
- */
- public boolean isAnotherNode(String credentials, String ip) {
- return(config.isAnotherNode(credentials, ip));
- }
- /**
- * Check whether publication is allowed.
- * @param feedid The ID of the feed being requested
- * @param credentials The offered credentials
- * @param ip The requesting IP address
- * @return True if the IP and credentials are valid for the specified feed.
- */
- public String isPublishPermitted(String feedid, String credentials, String ip) {
- return(config.isPublishPermitted(feedid, credentials, ip));
- }
- /**
- * Check who the user is given the feed ID and the offered credentials.
- * @param feedid The ID of the feed specified
- * @param credentials The offered credentials
- * @return Null if the credentials are invalid or the user if they are valid.
- */
- public String getAuthUser(String feedid, String credentials) {
- return(config.getAuthUser(feedid, credentials));
- }
- /**
- * Check if the publish request should be sent to another node based on the feedid, user, and source IP address.
- * @param feedid The ID of the feed specified
- * @param user The publishing user
- * @param ip The IP address of the publish endpoint
- * @return Null if the request should be accepted or the correct hostname if it should be sent to another node.
- */
- public String getIngressNode(String feedid, String user, String ip) {
- return(config.getIngressNode(feedid, user, ip));
- }
- /**
- * Get a provisioned configuration parameter (from the provisioning server configuration)
- * @param name The name of the parameter
- * @return The value of the parameter or null if it is not defined.
- */
- public String getProvParam(String name) {
- return(config.getProvParam(name));
- }
- /**
- * Get a provisioned configuration parameter (from the provisioning server configuration)
- * @param name The name of the parameter
- * @param deflt The value to use if the parameter is not defined
- * @return The value of the parameter or deflt if it is not defined.
- */
- public String getProvParam(String name, String deflt) {
- name = config.getProvParam(name);
- if (name == null) {
- name = deflt;
- }
- return(name);
- }
- /**
- * Generate a publish ID
- */
- public String getPublishId() {
- return(pid.next());
- }
- /**
- * Get all the outbound spooling destinations.
- * This will include both subscriptions and nodes.
- */
- public DestInfo[] getAllDests() {
- return(config.getAllDests());
- }
- /**
- * Register a task to run whenever the configuration changes
- */
- public void registerConfigTask(Runnable task) {
- configtasks.addTask(task);
- }
- /**
- * Deregister a task to run whenever the configuration changes
- */
- public void deregisterConfigTask(Runnable task) {
- configtasks.removeTask(task);
- }
- /**
- * Get the URL to deliver a message to.
- * @param destinfo The destination information
- * @param fileid The file ID
- * @return The URL to deliver to
- */
- public String getDestURL(DestInfo destinfo, String fileid) {
- String subid = destinfo.getSubId();
- String purl = destinfo.getURL();
- if (followredirects && subid != null) {
- purl = rdmgr.lookup(subid, purl);
- }
- return(purl + "/" + fileid);
- }
- /**
- * Is a destination redirected?
- */
- public boolean isDestRedirected(DestInfo destinfo) {
- return(followredirects && rdmgr.isRedirected(destinfo.getSubId()));
- }
- /**
- * Set up redirection on receipt of a 3XX from a target URL
- */
- public boolean handleRedirection(DestInfo destinfo, String redirto, String fileid) {
- fileid = "/" + fileid;
- String subid = destinfo.getSubId();
- String purl = destinfo.getURL();
- if (followredirects && subid != null && redirto.endsWith(fileid)) {
- redirto = redirto.substring(0, redirto.length() - fileid.length());
- if (!redirto.equals(purl)) {
- rdmgr.redirect(subid, purl, redirto);
- return(true);
- }
- }
- return(false);
- }
- /**
- * Handle unreachable target URL
- */
- public void handleUnreachable(DestInfo destinfo) {
- String subid = destinfo.getSubId();
- if (followredirects && subid != null) {
- rdmgr.forget(subid);
- }
- }
- /**
- * Get the timeout before retrying after an initial delivery failure
- */
- public long getInitFailureTimer() {
- return(initfailuretimer);
- }
- /**
- * Get the maximum timeout between delivery attempts
- */
- public long getMaxFailureTimer() {
- return(maxfailuretimer);
- }
- /**
- * Get the ratio between consecutive delivery attempts
- */
- public double getFailureBackoff() {
- return(failurebackoff);
- }
- /**
- * Get the expiration timer for deliveries
- */
- public long getExpirationTimer() {
- return(expirationtimer);
- }
- /**
- * Get the maximum number of file delivery attempts before checking
- * if another queue has work to be performed.
- */
- public int getFairFileLimit() {
- return(fairfilelimit);
- }
- /**
- * Get the maximum amount of time spent delivering files before
- * checking if another queue has work to be performed.
- */
- public long getFairTimeLimit() {
- return(fairtimelimit);
- }
- /**
- * Get the targets for a feed
- * @param feedid The feed ID
- * @return The targets this feed should be delivered to
- */
- public Target[] getTargets(String feedid) {
- return(config.getTargets(feedid));
- }
- /**
- * Get the spool directory for temporary files
- */
- public String getSpoolDir() {
- return(spooldir + "/f");
- }
- /**
- * Get the base directory for spool directories
- */
- public String getSpoolBase() {
- return(spooldir);
- }
- /**
- * Get the key store type
- */
- public String getKSType() {
- return(kstype);
- }
- /**
- * Get the key store file
- */
- public String getKSFile() {
- return(ksfile);
- }
- /**
- * Get the key store password
- */
- public String getKSPass() {
- return(kspass);
- }
- /**
- * Get the key password
- */
- public String getKPass() {
- return(kpass);
- }
- /**
- * Get the http port
- */
- public int getHttpPort() {
- return(gfport);
- }
- /**
- * Get the https port
- */
- public int getHttpsPort() {
- return(svcport);
- }
- /**
- * Get the externally visible https port
- */
- public int getExtHttpsPort() {
- return(port);
- }
- /**
- * Get the external name of this machine
- */
- public String getMyName() {
- return(myname);
- }
- /**
- * Get the number of threads to use for delivery
- */
- public int getDeliveryThreads() {
- return(deliverythreads);
- }
- /**
- * Get the URL for uploading the event log data
- */
- public String getEventLogUrl() {
- return(eventlogurl);
- }
- /**
- * Get the prefix for the names of event log files
- */
- public String getEventLogPrefix() {
- return(eventlogprefix);
- }
- /**
- * Get the suffix for the names of the event log files
- */
- public String getEventLogSuffix() {
- return(eventlogsuffix);
- }
- /**
- * Get the interval between event log file rollovers
- */
- public String getEventLogInterval() {
- return(eventloginterval);
- }
- /**
- * Should I follow redirects from subscribers?
- */
- public boolean isFollowRedirects() {
- return(followredirects);
- }
- /**
- * Get the directory where the event and node log files live
- */
- public String getLogDir() {
- return(logdir);
- }
- /**
- * How long do I keep log files (in milliseconds)
- */
- public long getLogRetention() {
- return(logretention);
- }
- /**
- * Get the timer
- */
- public Timer getTimer() {
- return(timer);
- }
- /**
- * Get the feed ID for a subscription
- * @param subid The subscription ID
- * @return The feed ID
- */
- public String getFeedId(String subid) {
- return(config.getFeedId(subid));
- }
- /**
- * Get the authorization string this node uses
- * @return The Authorization string for this node
- */
- public String getMyAuth() {
- return(config.getMyAuth());
- }
- /**
- * Get the fraction of free spool disk space where we start throwing away undelivered files. This is FREE_DISK_RED_PERCENT / 100.0. Default is 0.05. Limited by 0.01 <= FreeDiskStart <= 0.5.
- */
- public double getFreeDiskStart() {
- return(fdpstart);
- }
- /**
- * Get the fraction of free spool disk space where we stop throwing away undelivered files. This is FREE_DISK_YELLOW_PERCENT / 100.0. Default is 0.2. Limited by FreeDiskStart <= FreeDiskStop <= 0.5.
- */
- public double getFreeDiskStop() {
- return(fdpstop);
- }
- /**
- * Get the spool directory for a subscription
- */
- public String getSpoolDir(String subid, String remoteaddr) {
- if (provcheck.isFrom(remoteaddr)) {
- String sdir = config.getSpoolDir(subid);
- if (sdir != null) {
- logger.info("NODE0310 Received subscription reset request for subscription " + subid + " from provisioning server " + remoteaddr);
- } else {
- logger.info("NODE0311 Received subscription reset request for unknown subscription " + subid + " from provisioning server " + remoteaddr);
- }
- return(sdir);
- } else {
- logger.info("NODE0312 Received subscription reset request from unexpected server " + remoteaddr);
- return(null);
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.net.*;
+import java.util.*;
+import java.io.*;
+
+import org.apache.log4j.Logger;
+import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+
+/**
+ * Maintain the configuration of a Data Router node
+ * <p>
+ * The NodeConfigManager is the single point of contact for servlet, delivery, event logging, and log retention subsystems to access configuration information. (Log4J has its own configuration mechanism).
+ * <p>
+ * There are two basic sets of configuration data. The
+ * static local configuration data, stored in a local configuration file (created
+ * as part of installation by SWM), and the dynamic global
+ * configuration data fetched from the data router provisioning server.
+ */
+public class NodeConfigManager implements DeliveryQueueHelper {
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeConfigManager");
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeConfigManager");
+ private static NodeConfigManager base = new NodeConfigManager();
+
+ private Timer timer = new Timer("Node Configuration Timer", true);
+ private long maxfailuretimer;
+ private long initfailuretimer;
+ private long expirationtimer;
+ private double failurebackoff;
+ private long fairtimelimit;
+ private int fairfilelimit;
+ private double fdpstart;
+ private double fdpstop;
+ private int deliverythreads;
+ private String provurl;
+ private String provhost;
+ private IsFrom provcheck;
+ private int gfport;
+ private int svcport;
+ private int port;
+ private String spooldir;
+ private String logdir;
+ private long logretention;
+ private String redirfile;
+ private String kstype;
+ private String ksfile;
+ private String kspass;
+ private String kpass;
+ private String tstype;
+ private String tsfile;
+ private String tspass;
+ private String myname;
+ private RedirManager rdmgr;
+ private RateLimitedOperation pfetcher;
+ private NodeConfig config;
+ private File quiesce;
+ private PublishId pid;
+ private String nak;
+ private TaskList configtasks = new TaskList();
+ private String eventlogurl;
+ private String eventlogprefix;
+ private String eventlogsuffix;
+ private String eventloginterval;
+ private boolean followredirects;
+
+
+ /**
+ * Get the default node configuration manager
+ */
+ public static NodeConfigManager getInstance() {
+ return (base);
+ }
+
+ /**
+ * Initialize the configuration of a Data Router node
+ */
+ private NodeConfigManager() {
+ Properties p = new Properties();
+ try {
+ p.load(new FileInputStream(System.getProperty("org.onap.dmaap.datarouter.node.ConfigFile", "/opt/app/datartr/etc/node.properties")));
+ } catch (Exception e) {
+
+ NodeUtils.setIpAndFqdnForEelf("NodeConfigManager");
+ eelflogger.error(EelfMsgs.MESSAGE_PROPERTIES_LOAD_ERROR);
+ logger.error("NODE0301 Unable to load local configuration file " + System.getProperty("org.onap.dmaap.datarouter.node.ConfigFile", "/opt/app/datartr/etc/node.properties"), e);
+ }
+ provurl = p.getProperty("ProvisioningURL", "https://feeds-drtr.web.att.com/internal/prov");
+ try {
+ provhost = (new URL(provurl)).getHost();
+ } catch (Exception e) {
+ NodeUtils.setIpAndFqdnForEelf("NodeConfigManager");
+ eelflogger.error(EelfMsgs.MESSAGE_BAD_PROV_URL, provurl);
+ logger.error("NODE0302 Bad provisioning server URL " + provurl);
+ System.exit(1);
+ }
+ logger.info("NODE0303 Provisioning server is " + provhost);
+ eventlogurl = p.getProperty("LogUploadURL", "https://feeds-drtr.web.att.com/internal/logs");
+ provcheck = new IsFrom(provhost);
+ gfport = Integer.parseInt(p.getProperty("IntHttpPort", "8080"));
+ svcport = Integer.parseInt(p.getProperty("IntHttpsPort", "8443"));
+ port = Integer.parseInt(p.getProperty("ExtHttpsPort", "443"));
+ long minpfinterval = Long.parseLong(p.getProperty("MinProvFetchInterval", "10000"));
+ long minrsinterval = Long.parseLong(p.getProperty("MinRedirSaveInterval", "10000"));
+ spooldir = p.getProperty("SpoolDir", "spool");
+ File fdir = new File(spooldir + "/f");
+ fdir.mkdirs();
+ for (File junk : fdir.listFiles()) {
+ if (junk.isFile()) {
+ junk.delete();
+ }
+ }
+ logdir = p.getProperty("LogDir", "logs");
+ (new File(logdir)).mkdirs();
+ logretention = Long.parseLong(p.getProperty("LogRetention", "30")) * 86400000L;
+ eventlogprefix = logdir + "/events";
+ eventlogsuffix = ".log";
+ String redirfile = p.getProperty("RedirectionFile", "etc/redirections.dat");
+ kstype = p.getProperty("KeyStoreType", "jks");
+ ksfile = p.getProperty("KeyStoreFile", "etc/keystore");
+ kspass = p.getProperty("KeyStorePassword", "changeme");
+ kpass = p.getProperty("KeyPassword", "changeme");
+ tstype = p.getProperty("TrustStoreType", "jks");
+ tsfile = p.getProperty("TrustStoreFile");
+ tspass = p.getProperty("TrustStorePassword", "changeme");
+ if (tsfile != null && tsfile.length() > 0) {
+ System.setProperty("javax.net.ssl.trustStoreType", tstype);
+ System.setProperty("javax.net.ssl.trustStore", tsfile);
+ System.setProperty("javax.net.ssl.trustStorePassword", tspass);
+ }
+ nak = p.getProperty("NodeAuthKey", "Node123!");
+ quiesce = new File(p.getProperty("QuiesceFile", "etc/SHUTDOWN"));
+ myname = NodeUtils.getCanonicalName(kstype, ksfile, kspass);
+ if (myname == null) {
+ NodeUtils.setIpAndFqdnForEelf("NodeConfigManager");
+ eelflogger.error(EelfMsgs.MESSAGE_KEYSTORE_FETCH_ERROR, ksfile);
+ logger.error("NODE0309 Unable to fetch canonical name from keystore file " + ksfile);
+ System.exit(1);
+ }
+ logger.info("NODE0304 My certificate says my name is " + myname);
+ pid = new PublishId(myname);
+ rdmgr = new RedirManager(redirfile, minrsinterval, timer);
+ pfetcher = new RateLimitedOperation(minpfinterval, timer) {
+ public void run() {
+ fetchconfig();
+ }
+ };
+ logger.info("NODE0305 Attempting to fetch configuration at " + provurl);
+ pfetcher.request();
+ }
+
+ private void localconfig() {
+ followredirects = Boolean.parseBoolean(getProvParam("FOLLOW_REDIRECTS", "false"));
+ eventloginterval = getProvParam("LOGROLL_INTERVAL", "5m");
+ initfailuretimer = 10000;
+ maxfailuretimer = 3600000;
+ expirationtimer = 86400000;
+ failurebackoff = 2.0;
+ deliverythreads = 40;
+ fairfilelimit = 100;
+ fairtimelimit = 60000;
+ fdpstart = 0.05;
+ fdpstop = 0.2;
+ try {
+ initfailuretimer = (long) (Double.parseDouble(getProvParam("DELIVERY_INIT_RETRY_INTERVAL")) * 1000);
+ } catch (Exception e) {
+ }
+ try {
+ maxfailuretimer = (long) (Double.parseDouble(getProvParam("DELIVERY_MAX_RETRY_INTERVAL")) * 1000);
+ } catch (Exception e) {
+ }
+ try {
+ expirationtimer = (long) (Double.parseDouble(getProvParam("DELIVERY_MAX_AGE")) * 1000);
+ } catch (Exception e) {
+ }
+ try {
+ failurebackoff = Double.parseDouble(getProvParam("DELIVERY_RETRY_RATIO"));
+ } catch (Exception e) {
+ }
+ try {
+ deliverythreads = Integer.parseInt(getProvParam("DELIVERY_THREADS"));
+ } catch (Exception e) {
+ }
+ try {
+ fairfilelimit = Integer.parseInt(getProvParam("FAIR_FILE_LIMIT"));
+ } catch (Exception e) {
+ }
+ try {
+ fairtimelimit = (long) (Double.parseDouble(getProvParam("FAIR_TIME_LIMIT")) * 1000);
+ } catch (Exception e) {
+ }
+ try {
+ fdpstart = Double.parseDouble(getProvParam("FREE_DISK_RED_PERCENT")) / 100.0;
+ } catch (Exception e) {
+ }
+ try {
+ fdpstop = Double.parseDouble(getProvParam("FREE_DISK_YELLOW_PERCENT")) / 100.0;
+ } catch (Exception e) {
+ }
+ if (fdpstart < 0.01) {
+ fdpstart = 0.01;
+ }
+ if (fdpstart > 0.5) {
+ fdpstart = 0.5;
+ }
+ if (fdpstop < fdpstart) {
+ fdpstop = fdpstart;
+ }
+ if (fdpstop > 0.5) {
+ fdpstop = 0.5;
+ }
+ }
+
+ private void fetchconfig() {
+ try {
+ System.out.println("provurl:: " + provurl);
+ Reader r = new InputStreamReader((new URL(provurl)).openStream());
+ config = new NodeConfig(new ProvData(r), myname, spooldir, port, nak);
+ localconfig();
+ configtasks.startRun();
+ Runnable rr;
+ while ((rr = configtasks.next()) != null) {
+ try {
+ rr.run();
+ } catch (Exception e) {
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ NodeUtils.setIpAndFqdnForEelf("fetchconfigs");
+ eelflogger.error(EelfMsgs.MESSAGE_CONF_FAILED, e.toString());
+ logger.error("NODE0306 Configuration failed " + e.toString() + " - try again later", e);
+ pfetcher.request();
+ }
+ }
+
+ /**
+ * Process a gofetch request from a particular IP address. If the
+ * IP address is not an IP address we would go to to fetch the
+ * provisioning data, ignore the request. If the data has been
+ * fetched very recently (default 10 seconds), wait a while before fetching again.
+ */
+ public synchronized void gofetch(String remoteaddr) {
+ if (provcheck.isFrom(remoteaddr)) {
+ logger.info("NODE0307 Received configuration fetch request from provisioning server " + remoteaddr);
+ pfetcher.request();
+ } else {
+ logger.info("NODE0308 Received configuration fetch request from unexpected server " + remoteaddr);
+ }
+ }
+
+ /**
+ * Am I configured?
+ */
+ public boolean isConfigured() {
+ return (config != null);
+ }
+
+ /**
+ * Am I shut down?
+ */
+ public boolean isShutdown() {
+ return (quiesce.exists());
+ }
+
+ /**
+ * Given a routing string, get the targets.
+ *
+ * @param routing Target string
+ * @return array of targets
+ */
+ public Target[] parseRouting(String routing) {
+ return (config.parseRouting(routing));
+ }
+
+ /**
+ * Given a set of credentials and an IP address, is this request from another node?
+ *
+ * @param credentials Credentials offered by the supposed node
+ * @param ip IP address the request came from
+ * @return If the credentials and IP address are recognized, true, otherwise false.
+ */
+ public boolean isAnotherNode(String credentials, String ip) {
+ return (config.isAnotherNode(credentials, ip));
+ }
+
+ /**
+ * Check whether publication is allowed.
+ *
+ * @param feedid The ID of the feed being requested
+ * @param credentials The offered credentials
+ * @param ip The requesting IP address
+ * @return True if the IP and credentials are valid for the specified feed.
+ */
+ public String isPublishPermitted(String feedid, String credentials, String ip) {
+ return (config.isPublishPermitted(feedid, credentials, ip));
+ }
+
+ /**
+ * Check who the user is given the feed ID and the offered credentials.
+ *
+ * @param feedid The ID of the feed specified
+ * @param credentials The offered credentials
+ * @return Null if the credentials are invalid or the user if they are valid.
+ */
+ public String getAuthUser(String feedid, String credentials) {
+ return (config.getAuthUser(feedid, credentials));
+ }
+
+ /**
+ * Check if the publish request should be sent to another node based on the feedid, user, and source IP address.
+ *
+ * @param feedid The ID of the feed specified
+ * @param user The publishing user
+ * @param ip The IP address of the publish endpoint
+ * @return Null if the request should be accepted or the correct hostname if it should be sent to another node.
+ */
+ public String getIngressNode(String feedid, String user, String ip) {
+ return (config.getIngressNode(feedid, user, ip));
+ }
+
+ /**
+ * Get a provisioned configuration parameter (from the provisioning server configuration)
+ *
+ * @param name The name of the parameter
+ * @return The value of the parameter or null if it is not defined.
+ */
+ public String getProvParam(String name) {
+ return (config.getProvParam(name));
+ }
+
+ /**
+ * Get a provisioned configuration parameter (from the provisioning server configuration)
+ *
+ * @param name The name of the parameter
+ * @param deflt The value to use if the parameter is not defined
+ * @return The value of the parameter or deflt if it is not defined.
+ */
+ public String getProvParam(String name, String deflt) {
+ name = config.getProvParam(name);
+ if (name == null) {
+ name = deflt;
+ }
+ return (name);
+ }
+
+ /**
+ * Generate a publish ID
+ */
+ public String getPublishId() {
+ return (pid.next());
+ }
+
+ /**
+ * Get all the outbound spooling destinations.
+ * This will include both subscriptions and nodes.
+ */
+ public DestInfo[] getAllDests() {
+ return (config.getAllDests());
+ }
+
+ /**
+ * Register a task to run whenever the configuration changes
+ */
+ public void registerConfigTask(Runnable task) {
+ configtasks.addTask(task);
+ }
+
+ /**
+ * Deregister a task to run whenever the configuration changes
+ */
+ public void deregisterConfigTask(Runnable task) {
+ configtasks.removeTask(task);
+ }
+
+ /**
+ * Get the URL to deliver a message to.
+ *
+ * @param destinfo The destination information
+ * @param fileid The file ID
+ * @return The URL to deliver to
+ */
+ public String getDestURL(DestInfo destinfo, String fileid) {
+ String subid = destinfo.getSubId();
+ String purl = destinfo.getURL();
+ if (followredirects && subid != null) {
+ purl = rdmgr.lookup(subid, purl);
+ }
+ return (purl + "/" + fileid);
+ }
+
+ /**
+ * Is a destination redirected?
+ */
+ public boolean isDestRedirected(DestInfo destinfo) {
+ return (followredirects && rdmgr.isRedirected(destinfo.getSubId()));
+ }
+
+ /**
+ * Set up redirection on receipt of a 3XX from a target URL
+ */
+ public boolean handleRedirection(DestInfo destinfo, String redirto, String fileid) {
+ fileid = "/" + fileid;
+ String subid = destinfo.getSubId();
+ String purl = destinfo.getURL();
+ if (followredirects && subid != null && redirto.endsWith(fileid)) {
+ redirto = redirto.substring(0, redirto.length() - fileid.length());
+ if (!redirto.equals(purl)) {
+ rdmgr.redirect(subid, purl, redirto);
+ return (true);
+ }
+ }
+ return (false);
+ }
+
+ /**
+ * Handle unreachable target URL
+ */
+ public void handleUnreachable(DestInfo destinfo) {
+ String subid = destinfo.getSubId();
+ if (followredirects && subid != null) {
+ rdmgr.forget(subid);
+ }
+ }
+
+ /**
+ * Get the timeout before retrying after an initial delivery failure
+ */
+ public long getInitFailureTimer() {
+ return (initfailuretimer);
+ }
+
+ /**
+ * Get the maximum timeout between delivery attempts
+ */
+ public long getMaxFailureTimer() {
+ return (maxfailuretimer);
+ }
+
+ /**
+ * Get the ratio between consecutive delivery attempts
+ */
+ public double getFailureBackoff() {
+ return (failurebackoff);
+ }
+
+ /**
+ * Get the expiration timer for deliveries
+ */
+ public long getExpirationTimer() {
+ return (expirationtimer);
+ }
+
+ /**
+ * Get the maximum number of file delivery attempts before checking
+ * if another queue has work to be performed.
+ */
+ public int getFairFileLimit() {
+ return (fairfilelimit);
+ }
+
+ /**
+ * Get the maximum amount of time spent delivering files before
+ * checking if another queue has work to be performed.
+ */
+ public long getFairTimeLimit() {
+ return (fairtimelimit);
+ }
+
+ /**
+ * Get the targets for a feed
+ *
+ * @param feedid The feed ID
+ * @return The targets this feed should be delivered to
+ */
+ public Target[] getTargets(String feedid) {
+ return (config.getTargets(feedid));
+ }
+
+ /**
+ * Get the spool directory for temporary files
+ */
+ public String getSpoolDir() {
+ return (spooldir + "/f");
+ }
+
+ /**
+ * Get the base directory for spool directories
+ */
+ public String getSpoolBase() {
+ return (spooldir);
+ }
+
+ /**
+ * Get the key store type
+ */
+ public String getKSType() {
+ return (kstype);
+ }
+
+ /**
+ * Get the key store file
+ */
+ public String getKSFile() {
+ return (ksfile);
+ }
+
+ /**
+ * Get the key store password
+ */
+ public String getKSPass() {
+ return (kspass);
+ }
+
+ /**
+ * Get the key password
+ */
+ public String getKPass() {
+ return (kpass);
+ }
+
+ /**
+ * Get the http port
+ */
+ public int getHttpPort() {
+ return (gfport);
+ }
+
+ /**
+ * Get the https port
+ */
+ public int getHttpsPort() {
+ return (svcport);
+ }
+
+ /**
+ * Get the externally visible https port
+ */
+ public int getExtHttpsPort() {
+ return (port);
+ }
+
+ /**
+ * Get the external name of this machine
+ */
+ public String getMyName() {
+ return (myname);
+ }
+
+ /**
+ * Get the number of threads to use for delivery
+ */
+ public int getDeliveryThreads() {
+ return (deliverythreads);
+ }
+
+ /**
+ * Get the URL for uploading the event log data
+ */
+ public String getEventLogUrl() {
+ return (eventlogurl);
+ }
+
+ /**
+ * Get the prefix for the names of event log files
+ */
+ public String getEventLogPrefix() {
+ return (eventlogprefix);
+ }
+
+ /**
+ * Get the suffix for the names of the event log files
+ */
+ public String getEventLogSuffix() {
+ return (eventlogsuffix);
+ }
+
+ /**
+ * Get the interval between event log file rollovers
+ */
+ public String getEventLogInterval() {
+ return (eventloginterval);
+ }
+
+ /**
+ * Should I follow redirects from subscribers?
+ */
+ public boolean isFollowRedirects() {
+ return (followredirects);
+ }
+
+ /**
+ * Get the directory where the event and node log files live
+ */
+ public String getLogDir() {
+ return (logdir);
+ }
+
+ /**
+ * How long do I keep log files (in milliseconds)
+ */
+ public long getLogRetention() {
+ return (logretention);
+ }
+
+ /**
+ * Get the timer
+ */
+ public Timer getTimer() {
+ return (timer);
+ }
+
+ /**
+ * Get the feed ID for a subscription
+ *
+ * @param subid The subscription ID
+ * @return The feed ID
+ */
+ public String getFeedId(String subid) {
+ return (config.getFeedId(subid));
+ }
+
+ /**
+ * Get the authorization string this node uses
+ *
+ * @return The Authorization string for this node
+ */
+ public String getMyAuth() {
+ return (config.getMyAuth());
+ }
+
+ /**
+ * Get the fraction of free spool disk space where we start throwing away undelivered files. This is FREE_DISK_RED_PERCENT / 100.0. Default is 0.05. Limited by 0.01 <= FreeDiskStart <= 0.5.
+ */
+ public double getFreeDiskStart() {
+ return (fdpstart);
+ }
+
+ /**
+ * Get the fraction of free spool disk space where we stop throwing away undelivered files. This is FREE_DISK_YELLOW_PERCENT / 100.0. Default is 0.2. Limited by FreeDiskStart <= FreeDiskStop <= 0.5.
+ */
+ public double getFreeDiskStop() {
+ return (fdpstop);
+ }
+
+ /**
+ * Get the spool directory for a subscription
+ */
+ public String getSpoolDir(String subid, String remoteaddr) {
+ if (provcheck.isFrom(remoteaddr)) {
+ String sdir = config.getSpoolDir(subid);
+ if (sdir != null) {
+ logger.info("NODE0310 Received subscription reset request for subscription " + subid + " from provisioning server " + remoteaddr);
+ } else {
+ logger.info("NODE0311 Received subscription reset request for unknown subscription " + subid + " from provisioning server " + remoteaddr);
+ }
+ return (sdir);
+ } else {
+ logger.info("NODE0312 Received subscription reset request from unexpected server " + remoteaddr);
+ return (null);
+ }
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeMain.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeMain.java
index a34bacd0..d7650030 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeMain.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeMain.java
@@ -1,113 +1,122 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import org.eclipse.jetty.servlet.*;
-import org.eclipse.jetty.util.ssl.*;
-import org.eclipse.jetty.server.*;
-import org.eclipse.jetty.server.nio.*;
-import org.eclipse.jetty.server.ssl.*;
-import org.apache.log4j.Logger;
-
-/**
- * The main starting point for the Data Router node
- */
-public class NodeMain {
- private NodeMain() {}
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeMain");
- private static class wfconfig implements Runnable {
- private NodeConfigManager ncm;
- public wfconfig(NodeConfigManager ncm) {
- this.ncm = ncm;
- }
- public synchronized void run() {
- notify();
- }
- public synchronized void waitforconfig() {
- ncm.registerConfigTask(this);
- while (!ncm.isConfigured()) {
- logger.info("NODE0003 Waiting for Node Configuration");
- try {
- wait();
- } catch (Exception e) {
- }
- }
- ncm.deregisterConfigTask(this);
- logger.info("NODE0004 Node Configuration Data Received");
- }
- }
- private static Delivery d;
- private static NodeConfigManager ncm;
- /**
- * Reset the retry timer for a subscription
- */
- public static void resetQueue(String subid, String ip) {
- d.resetQueue(ncm.getSpoolDir(subid, ip));
- }
- /**
- * Start the data router.
- * <p>
- * The location of the node configuration file can be set using the
- * org.onap.dmaap.datarouter.node.ConfigFile system property. By
- * default, it is "etc/node.properties".
- */
- public static void main(String[] args) throws Exception {
- logger.info("NODE0001 Data Router Node Starting");
- IsFrom.setDNSCache();
- ncm = NodeConfigManager.getInstance();
- logger.info("NODE0002 I am " + ncm.getMyName());
- (new wfconfig(ncm)).waitforconfig();
- d = new Delivery(ncm);
- LogManager lm = new LogManager(ncm);
- Server server = new Server();
- SelectChannelConnector http = new SelectChannelConnector();
- http.setPort(ncm.getHttpPort());
- http.setMaxIdleTime(2000);
- http.setRequestHeaderSize(2048);
- SslSelectChannelConnector https = new SslSelectChannelConnector();
- https.setPort(ncm.getHttpsPort());
- https.setMaxIdleTime(30000);
- https.setRequestHeaderSize(8192);
- SslContextFactory cf = https.getSslContextFactory();
-
- /**Skip SSLv3 Fixes*/
- cf.addExcludeProtocols("SSLv3");
- logger.info("Excluded protocols node-"+cf.getExcludeProtocols());
- /**End of SSLv3 Fixes*/
-
- cf.setKeyStoreType(ncm.getKSType());
- cf.setKeyStorePath(ncm.getKSFile());
- cf.setKeyStorePassword(ncm.getKSPass());
- cf.setKeyManagerPassword(ncm.getKPass());
- server.setConnectors(new Connector[] { http, https });
- ServletContextHandler ctxt = new ServletContextHandler(0);
- ctxt.setContextPath("/");
- server.setHandler(ctxt);
- ctxt.addServlet(new ServletHolder(new NodeServlet()), "/*");
- logger.info("NODE0005 Data Router Node Activating Service");
- server.start();
- server.join();
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import org.eclipse.jetty.servlet.*;
+import org.eclipse.jetty.util.ssl.*;
+import org.eclipse.jetty.server.*;
+import org.eclipse.jetty.server.nio.*;
+import org.eclipse.jetty.server.ssl.*;
+import org.apache.log4j.Logger;
+
+/**
+ * The main starting point for the Data Router node
+ */
+public class NodeMain {
+ private NodeMain() {
+ }
+
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeMain");
+
+ private static class wfconfig implements Runnable {
+ private NodeConfigManager ncm;
+
+ public wfconfig(NodeConfigManager ncm) {
+ this.ncm = ncm;
+ }
+
+ public synchronized void run() {
+ notify();
+ }
+
+ public synchronized void waitforconfig() {
+ ncm.registerConfigTask(this);
+ while (!ncm.isConfigured()) {
+ logger.info("NODE0003 Waiting for Node Configuration");
+ try {
+ wait();
+ } catch (Exception e) {
+ }
+ }
+ ncm.deregisterConfigTask(this);
+ logger.info("NODE0004 Node Configuration Data Received");
+ }
+ }
+
+ private static Delivery d;
+ private static NodeConfigManager ncm;
+
+ /**
+ * Reset the retry timer for a subscription
+ */
+ public static void resetQueue(String subid, String ip) {
+ d.resetQueue(ncm.getSpoolDir(subid, ip));
+ }
+
+ /**
+ * Start the data router.
+ * <p>
+ * The location of the node configuration file can be set using the
+ * org.onap.dmaap.datarouter.node.ConfigFile system property. By
+ * default, it is "etc/node.properties".
+ */
+ public static void main(String[] args) throws Exception {
+ logger.info("NODE0001 Data Router Node Starting");
+ IsFrom.setDNSCache();
+ ncm = NodeConfigManager.getInstance();
+ logger.info("NODE0002 I am " + ncm.getMyName());
+ (new wfconfig(ncm)).waitforconfig();
+ d = new Delivery(ncm);
+ LogManager lm = new LogManager(ncm);
+ Server server = new Server();
+ SelectChannelConnector http = new SelectChannelConnector();
+ http.setPort(ncm.getHttpPort());
+ http.setMaxIdleTime(2000);
+ http.setRequestHeaderSize(2048);
+ SslSelectChannelConnector https = new SslSelectChannelConnector();
+ https.setPort(ncm.getHttpsPort());
+ https.setMaxIdleTime(30000);
+ https.setRequestHeaderSize(8192);
+ SslContextFactory cf = https.getSslContextFactory();
+
+ /**Skip SSLv3 Fixes*/
+ cf.addExcludeProtocols("SSLv3");
+ logger.info("Excluded protocols node-" + cf.getExcludeProtocols());
+ /**End of SSLv3 Fixes*/
+
+ cf.setKeyStoreType(ncm.getKSType());
+ cf.setKeyStorePath(ncm.getKSFile());
+ cf.setKeyStorePassword(ncm.getKSPass());
+ cf.setKeyManagerPassword(ncm.getKPass());
+ server.setConnectors(new Connector[]{http, https});
+ ServletContextHandler ctxt = new ServletContextHandler(0);
+ ctxt.setContextPath("/");
+ server.setHandler(ctxt);
+ ctxt.addServlet(new ServletHolder(new NodeServlet()), "/*");
+ logger.info("NODE0005 Data Router Node Activating Service");
+ server.start();
+ server.join();
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeServlet.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeServlet.java
index eae7ca06..5d11206c 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeServlet.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeServlet.java
@@ -1,380 +1,408 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-import java.util.*;
-import java.util.regex.*;
-import java.io.*;
-import java.nio.file.*;
-import org.apache.log4j.Logger;
-import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-import java.net.*;
-
-/**
- * Servlet for handling all http and https requests to the data router node
- * <p>
- * Handled requests are:
- * <br>
- * GET http://<i>node</i>/internal/fetchProv - fetch the provisioning data
- * <br>
- * PUT/DELETE https://<i>node</i>/internal/publish/<i>fileid</i> - n2n transfer
- * <br>
- * PUT/DELETE https://<i>node</i>/publish/<i>feedid</i>/<i>fileid</i> - publsh request
- */
-public class NodeServlet extends HttpServlet {
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeServlet");
- private static NodeConfigManager config;
- private static Pattern MetaDataPattern;
- private static SubnetMatcher internalsubnet = new SubnetMatcher("135.207.136.128/25");
- //Adding EELF Logger Rally:US664892
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeServlet");
-
- static {
- try {
- String ws = "\\s*";
- // assume that \\ and \" have been replaced by X
- String string = "\"[^\"]*\"";
- //String string = "\"(?:[^\"\\\\]|\\\\.)*\"";
- String number = "[+-]?(?:\\.\\d+|(?:0|[1-9]\\d*)(?:\\.\\d*)?)(?:[eE][+-]?\\d+)?";
- String value = "(?:" + string + "|" + number + "|null|true|false)";
- String item = string + ws + ":" + ws + value + ws;
- String object = ws + "\\{" + ws + "(?:" + item + "(?:" + "," + ws + item + ")*)?\\}" + ws;
- MetaDataPattern = Pattern.compile(object, Pattern.DOTALL);
- } catch (Exception e) {
- }
- }
- /**
- * Get the NodeConfigurationManager
- */
- public void init() {
- config = NodeConfigManager.getInstance();
- logger.info("NODE0101 Node Servlet Configured");
- }
- private boolean down(HttpServletResponse resp) throws IOException {
- if (config.isShutdown() || !config.isConfigured()) {
- resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
- logger.info("NODE0102 Rejecting request: Service is being quiesced");
- return(true);
- }
- return(false);
- }
- /**
- * Handle a GET for /internal/fetchProv
- */
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- NodeUtils.setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader("X-ATT-DR-ON-BEHALF-OF"),getIdFromPath(req)+"");
- if (down(resp)) {
- return;
- }
- String path = req.getPathInfo();
- String qs = req.getQueryString();
- String ip = req.getRemoteAddr();
- if (qs != null) {
- path = path + "?" + qs;
- }
- if ("/internal/fetchProv".equals(path)) {
- config.gofetch(ip);
- resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
- return;
- } else if (path.startsWith("/internal/resetSubscription/")) {
- String subid = path.substring(28);
- if (subid.length() != 0 && subid.indexOf('/') == -1) {
- NodeMain.resetQueue(subid, ip);
- resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
- return;
- }
- }
- if (internalsubnet.matches(NodeUtils.getInetAddress(ip))) {
- if (path.startsWith("/internal/logs/")) {
- String f = path.substring(15);
- File fn = new File(config.getLogDir() + "/" + f);
- if (f.indexOf('/') != -1 || !fn.isFile()) {
- logger.info("NODE0103 Rejecting invalid GET of " + path + " from " + ip);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
- byte[] buf = new byte[65536];
- resp.setContentType("text/plain");
- resp.setContentLength((int)fn.length());
- resp.setStatus(200);
- InputStream is = new FileInputStream(fn);
- OutputStream os = resp.getOutputStream();
- int i;
- while ((i = is.read(buf)) > 0) {
- os.write(buf, 0, i);
- }
- is.close();
- return;
- }
- if (path.startsWith("/internal/rtt/")) {
- String xip = path.substring(14);
- long st = System.currentTimeMillis();
- String status = " unknown";
- try {
- Socket s = new Socket(xip, 443);
- s.close();
- status = " connected";
- } catch (Exception e) {
- status = " error " + e.toString();
- }
- long dur = System.currentTimeMillis() - st;
- resp.setContentType("text/plain");
- resp.setStatus(200);
- byte[] buf = (dur + status + "\n").getBytes();
- resp.setContentLength(buf.length);
- resp.getOutputStream().write(buf);
- return;
- }
- }
- logger.info("NODE0103 Rejecting invalid GET of " + path + " from " + ip);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND);
- return;
- }
- /**
- * Handle all PUT requests
- */
- protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- NodeUtils.setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader("X-ATT-DR-ON-BEHALF-OF"),getIdFromPath(req)+"");
- common(req, resp, true);
- }
- /**
- * Handle all DELETE requests
- */
- protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- NodeUtils.setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader("X-ATT-DR-ON-BEHALF-OF"),getIdFromPath(req)+"");
- common(req, resp, false);
- }
- private void common(HttpServletRequest req, HttpServletResponse resp, boolean isput) throws ServletException, IOException {
- if (down(resp)) {
- return;
- }
- if (!req.isSecure()) {
- logger.info("NODE0104 Rejecting insecure PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "https required on publish requests");
- return;
- }
- String fileid = req.getPathInfo();
- if (fileid == null) {
- logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>.");
- return;
- }
- String feedid = null;
- String user = null;
- String credentials = req.getHeader("Authorization");
- if (credentials == null) {
- logger.info("NODE0106 Rejecting unauthenticated PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Authorization header required");
- return;
- }
- String ip = req.getRemoteAddr();
- String lip = req.getLocalAddr();
- String pubid = null;
- String xpubid = null;
- String rcvd = NodeUtils.logts(System.currentTimeMillis()) + ";from=" + ip + ";by=" + lip;
- Target[] targets = null;
- if (fileid.startsWith("/publish/")) {
- fileid = fileid.substring(9);
- int i = fileid.indexOf('/');
- if (i == -1 || i == fileid.length() - 1) {
- logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>. Possible missing fileid.");
- return;
- }
- feedid = fileid.substring(0, i);
- fileid = fileid.substring(i + 1);
- pubid = config.getPublishId();
- xpubid = req.getHeader("X-ATT-DR-PUBLISH-ID");
- targets = config.getTargets(feedid);
- } else if (fileid.startsWith("/internal/publish/")) {
- if (!config.isAnotherNode(credentials, ip)) {
- logger.info("NODE0107 Rejecting unauthorized node-to-node transfer attempt from " + ip);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN);
- return;
- }
- fileid = fileid.substring(18);
- pubid = req.getHeader("X-ATT-DR-PUBLISH-ID");
- targets = config.parseRouting(req.getHeader("X-ATT-DR-ROUTING"));
- } else {
- logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>.");
- return;
- }
- if (fileid.indexOf('/') != -1) {
- logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>.");
- return;
- }
- String qs = req.getQueryString();
- if (qs != null) {
- fileid = fileid + "?" + qs;
- }
- String hp = config.getMyName();
- int xp = config.getExtHttpsPort();
- if (xp != 443) {
- hp = hp + ":" + xp;
- }
- String logurl = "https://" + hp + "/internal/publish/" + fileid;
- if (feedid != null) {
- logurl = "https://" + hp + "/publish/" + feedid + "/" + fileid;
- String reason = config.isPublishPermitted(feedid, credentials, ip);
- if (reason != null) {
- logger.info("NODE0111 Rejecting unauthorized publish attempt to feed " + feedid + " fileid " + fileid + " from " + ip + " reason " + reason);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN,reason);
- return;
- }
- user = config.getAuthUser(feedid, credentials);
- String newnode = config.getIngressNode(feedid, user, ip);
- if (newnode != null) {
- String port = "";
- int iport = config.getExtHttpsPort();
- if (iport != 443) {
- port = ":" + iport;
- }
- String redirto = "https://" + newnode + port + "/publish/" + feedid + "/" + fileid;
- logger.info("NODE0108 Redirecting publish attempt for feed " + feedid + " user " + user + " ip " + ip + " to " + redirto);
- resp.sendRedirect(redirto);
- return;
- }
- resp.setHeader("X-ATT-DR-PUBLISH-ID", pubid);
- }
- String fbase = config.getSpoolDir() + "/" + pubid;
- File data = new File(fbase);
- File meta = new File(fbase + ".M");
- OutputStream dos = null;
- Writer mw = null;
- InputStream is = null;
- try {
- StringBuffer mx = new StringBuffer();
- mx.append(req.getMethod()).append('\t').append(fileid).append('\n');
- Enumeration hnames = req.getHeaderNames();
- String ctype = null;
- while (hnames.hasMoreElements()) {
- String hn = (String)hnames.nextElement();
- String hnlc = hn.toLowerCase();
- if ((isput && ("content-type".equals(hnlc) ||
- "content-language".equals(hnlc) ||
- "content-md5".equals(hnlc) ||
- "content-range".equals(hnlc))) ||
- "x-att-dr-meta".equals(hnlc) ||
- (feedid == null && "x-att-dr-received".equals(hnlc)) ||
- (hnlc.startsWith("x-") && !hnlc.startsWith("x-att-dr-"))) {
- Enumeration hvals = req.getHeaders(hn);
- while (hvals.hasMoreElements()) {
- String hv = (String)hvals.nextElement();
- if ("content-type".equals(hnlc)) {
- ctype = hv;
- }
- if ("x-att-dr-meta".equals(hnlc)) {
- if (hv.length() > 4096) {
- logger.info("NODE0109 Rejecting publish attempt with metadata too long for feed " + feedid + " user " + user + " ip " + ip);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Metadata too long");
- return;
- }
- if (!MetaDataPattern.matcher(hv.replaceAll("\\\\.", "X")).matches()) {
- logger.info("NODE0109 Rejecting publish attempt with malformed metadata for feed " + feedid + " user " + user + " ip " + ip);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Malformed metadata");
- return;
- }
- }
- mx.append(hn).append('\t').append(hv).append('\n');
- }
- }
- }
- mx.append("X-ATT-DR-RECEIVED\t").append(rcvd).append('\n');
- String metadata = mx.toString();
- byte[] buf = new byte[1024 * 1024];
- int i;
- try {
- is = req.getInputStream();
- dos = new FileOutputStream(data);
- while ((i = is.read(buf)) > 0) {
- dos.write(buf, 0, i);
- }
- is.close();
- is = null;
- dos.close();
- dos = null;
- } catch (IOException ioe) {
- long exlen = -1;
- try {
- exlen = Long.parseLong(req.getHeader("Content-Length"));
- } catch (Exception e) {
- }
- StatusLog.logPubFail(pubid, feedid, logurl, req.getMethod(), ctype, exlen, data.length(), ip, user, ioe.getMessage());
- throw ioe;
- }
- Path dpath = Paths.get(fbase);
- for (Target t: targets) {
- DestInfo di = t.getDestInfo();
- if (di == null) {
- // TODO: unknown destination
- continue;
- }
- String dbase = di.getSpool() + "/" + pubid;
- Files.createLink(Paths.get(dbase), dpath);
- mw = new FileWriter(meta);
- mw.write(metadata);
- if (di.getSubId() == null) {
- mw.write("X-ATT-DR-ROUTING\t" + t.getRouting() + "\n");
- }
- mw.close();
- meta.renameTo(new File(dbase + ".M"));
- }
- resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
- resp.getOutputStream().close();
- StatusLog.logPub(pubid, feedid, logurl, req.getMethod(), ctype, data.length(), ip, user, HttpServletResponse.SC_NO_CONTENT);
- } catch (IOException ioe) {
- logger.info("NODE0110 IO Exception receiving publish attempt for feed " + feedid + " user " + user + " ip " + ip + " " + ioe.toString(), ioe);
- throw ioe;
- } finally {
- if (is != null) { try { is.close(); } catch (Exception e) {}}
- if (dos != null) { try { dos.close(); } catch (Exception e) {}}
- if (mw != null) { try { mw.close(); } catch (Exception e) {}}
- try { data.delete(); } catch (Exception e) {}
- try { meta.delete(); } catch (Exception e) {}
- }
- }
-
- private int getIdFromPath(HttpServletRequest req) {
- String path = req.getPathInfo();
- if (path == null || path.length() < 2)
- return -1;
- try {
- return Integer.parseInt(path.substring(1));
- } catch (NumberFormatException e) {
- return -1;
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import javax.servlet.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.util.regex.*;
+import java.io.*;
+import java.nio.file.*;
+
+import org.apache.log4j.Logger;
+import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+import java.net.*;
+
+/**
+ * Servlet for handling all http and https requests to the data router node
+ * <p>
+ * Handled requests are:
+ * <br>
+ * GET http://<i>node</i>/internal/fetchProv - fetch the provisioning data
+ * <br>
+ * PUT/DELETE https://<i>node</i>/internal/publish/<i>fileid</i> - n2n transfer
+ * <br>
+ * PUT/DELETE https://<i>node</i>/publish/<i>feedid</i>/<i>fileid</i> - publsh request
+ */
+public class NodeServlet extends HttpServlet {
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeServlet");
+ private static NodeConfigManager config;
+ private static Pattern MetaDataPattern;
+ private static SubnetMatcher internalsubnet = new SubnetMatcher("135.207.136.128/25");
+ //Adding EELF Logger Rally:US664892
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeServlet");
+
+ static {
+ try {
+ String ws = "\\s*";
+ // assume that \\ and \" have been replaced by X
+ String string = "\"[^\"]*\"";
+ //String string = "\"(?:[^\"\\\\]|\\\\.)*\"";
+ String number = "[+-]?(?:\\.\\d+|(?:0|[1-9]\\d*)(?:\\.\\d*)?)(?:[eE][+-]?\\d+)?";
+ String value = "(?:" + string + "|" + number + "|null|true|false)";
+ String item = string + ws + ":" + ws + value + ws;
+ String object = ws + "\\{" + ws + "(?:" + item + "(?:" + "," + ws + item + ")*)?\\}" + ws;
+ MetaDataPattern = Pattern.compile(object, Pattern.DOTALL);
+ } catch (Exception e) {
+ }
+ }
+
+ /**
+ * Get the NodeConfigurationManager
+ */
+ public void init() {
+ config = NodeConfigManager.getInstance();
+ logger.info("NODE0101 Node Servlet Configured");
+ }
+
+ private boolean down(HttpServletResponse resp) throws IOException {
+ if (config.isShutdown() || !config.isConfigured()) {
+ resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+ logger.info("NODE0102 Rejecting request: Service is being quiesced");
+ return (true);
+ }
+ return (false);
+ }
+
+ /**
+ * Handle a GET for /internal/fetchProv
+ */
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ NodeUtils.setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader("X-ATT-DR-ON-BEHALF-OF"), getIdFromPath(req) + "");
+ if (down(resp)) {
+ return;
+ }
+ String path = req.getPathInfo();
+ String qs = req.getQueryString();
+ String ip = req.getRemoteAddr();
+ if (qs != null) {
+ path = path + "?" + qs;
+ }
+ if ("/internal/fetchProv".equals(path)) {
+ config.gofetch(ip);
+ resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ return;
+ } else if (path.startsWith("/internal/resetSubscription/")) {
+ String subid = path.substring(28);
+ if (subid.length() != 0 && subid.indexOf('/') == -1) {
+ NodeMain.resetQueue(subid, ip);
+ resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ return;
+ }
+ }
+ if (internalsubnet.matches(NodeUtils.getInetAddress(ip))) {
+ if (path.startsWith("/internal/logs/")) {
+ String f = path.substring(15);
+ File fn = new File(config.getLogDir() + "/" + f);
+ if (f.indexOf('/') != -1 || !fn.isFile()) {
+ logger.info("NODE0103 Rejecting invalid GET of " + path + " from " + ip);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+ byte[] buf = new byte[65536];
+ resp.setContentType("text/plain");
+ resp.setContentLength((int) fn.length());
+ resp.setStatus(200);
+ InputStream is = new FileInputStream(fn);
+ OutputStream os = resp.getOutputStream();
+ int i;
+ while ((i = is.read(buf)) > 0) {
+ os.write(buf, 0, i);
+ }
+ is.close();
+ return;
+ }
+ if (path.startsWith("/internal/rtt/")) {
+ String xip = path.substring(14);
+ long st = System.currentTimeMillis();
+ String status = " unknown";
+ try {
+ Socket s = new Socket(xip, 443);
+ s.close();
+ status = " connected";
+ } catch (Exception e) {
+ status = " error " + e.toString();
+ }
+ long dur = System.currentTimeMillis() - st;
+ resp.setContentType("text/plain");
+ resp.setStatus(200);
+ byte[] buf = (dur + status + "\n").getBytes();
+ resp.setContentLength(buf.length);
+ resp.getOutputStream().write(buf);
+ return;
+ }
+ }
+ logger.info("NODE0103 Rejecting invalid GET of " + path + " from " + ip);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return;
+ }
+
+ /**
+ * Handle all PUT requests
+ */
+ protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ NodeUtils.setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader("X-ATT-DR-ON-BEHALF-OF"), getIdFromPath(req) + "");
+ common(req, resp, true);
+ }
+
+ /**
+ * Handle all DELETE requests
+ */
+ protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ NodeUtils.setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader("X-ATT-DR-ON-BEHALF-OF"), getIdFromPath(req) + "");
+ common(req, resp, false);
+ }
+
+ private void common(HttpServletRequest req, HttpServletResponse resp, boolean isput) throws ServletException, IOException {
+ if (down(resp)) {
+ return;
+ }
+ if (!req.isSecure()) {
+ logger.info("NODE0104 Rejecting insecure PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "https required on publish requests");
+ return;
+ }
+ String fileid = req.getPathInfo();
+ if (fileid == null) {
+ logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>.");
+ return;
+ }
+ String feedid = null;
+ String user = null;
+ String credentials = req.getHeader("Authorization");
+ if (credentials == null) {
+ logger.info("NODE0106 Rejecting unauthenticated PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Authorization header required");
+ return;
+ }
+ String ip = req.getRemoteAddr();
+ String lip = req.getLocalAddr();
+ String pubid = null;
+ String xpubid = null;
+ String rcvd = NodeUtils.logts(System.currentTimeMillis()) + ";from=" + ip + ";by=" + lip;
+ Target[] targets = null;
+ if (fileid.startsWith("/publish/")) {
+ fileid = fileid.substring(9);
+ int i = fileid.indexOf('/');
+ if (i == -1 || i == fileid.length() - 1) {
+ logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>. Possible missing fileid.");
+ return;
+ }
+ feedid = fileid.substring(0, i);
+ fileid = fileid.substring(i + 1);
+ pubid = config.getPublishId();
+ xpubid = req.getHeader("X-ATT-DR-PUBLISH-ID");
+ targets = config.getTargets(feedid);
+ } else if (fileid.startsWith("/internal/publish/")) {
+ if (!config.isAnotherNode(credentials, ip)) {
+ logger.info("NODE0107 Rejecting unauthorized node-to-node transfer attempt from " + ip);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN);
+ return;
+ }
+ fileid = fileid.substring(18);
+ pubid = req.getHeader("X-ATT-DR-PUBLISH-ID");
+ targets = config.parseRouting(req.getHeader("X-ATT-DR-ROUTING"));
+ } else {
+ logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>.");
+ return;
+ }
+ if (fileid.indexOf('/') != -1) {
+ logger.info("NODE0105 Rejecting bad URI for PUT or DELETE of " + req.getPathInfo() + " from " + req.getRemoteAddr());
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid request URI. Expecting <feed-publishing-url>/<fileid>.");
+ return;
+ }
+ String qs = req.getQueryString();
+ if (qs != null) {
+ fileid = fileid + "?" + qs;
+ }
+ String hp = config.getMyName();
+ int xp = config.getExtHttpsPort();
+ if (xp != 443) {
+ hp = hp + ":" + xp;
+ }
+ String logurl = "https://" + hp + "/internal/publish/" + fileid;
+ if (feedid != null) {
+ logurl = "https://" + hp + "/publish/" + feedid + "/" + fileid;
+ String reason = config.isPublishPermitted(feedid, credentials, ip);
+ if (reason != null) {
+ logger.info("NODE0111 Rejecting unauthorized publish attempt to feed " + feedid + " fileid " + fileid + " from " + ip + " reason " + reason);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, reason);
+ return;
+ }
+ user = config.getAuthUser(feedid, credentials);
+ String newnode = config.getIngressNode(feedid, user, ip);
+ if (newnode != null) {
+ String port = "";
+ int iport = config.getExtHttpsPort();
+ if (iport != 443) {
+ port = ":" + iport;
+ }
+ String redirto = "https://" + newnode + port + "/publish/" + feedid + "/" + fileid;
+ logger.info("NODE0108 Redirecting publish attempt for feed " + feedid + " user " + user + " ip " + ip + " to " + redirto);
+ resp.sendRedirect(redirto);
+ return;
+ }
+ resp.setHeader("X-ATT-DR-PUBLISH-ID", pubid);
+ }
+ String fbase = config.getSpoolDir() + "/" + pubid;
+ File data = new File(fbase);
+ File meta = new File(fbase + ".M");
+ OutputStream dos = null;
+ Writer mw = null;
+ InputStream is = null;
+ try {
+ StringBuffer mx = new StringBuffer();
+ mx.append(req.getMethod()).append('\t').append(fileid).append('\n');
+ Enumeration hnames = req.getHeaderNames();
+ String ctype = null;
+ while (hnames.hasMoreElements()) {
+ String hn = (String) hnames.nextElement();
+ String hnlc = hn.toLowerCase();
+ if ((isput && ("content-type".equals(hnlc) ||
+ "content-language".equals(hnlc) ||
+ "content-md5".equals(hnlc) ||
+ "content-range".equals(hnlc))) ||
+ "x-att-dr-meta".equals(hnlc) ||
+ (feedid == null && "x-att-dr-received".equals(hnlc)) ||
+ (hnlc.startsWith("x-") && !hnlc.startsWith("x-att-dr-"))) {
+ Enumeration hvals = req.getHeaders(hn);
+ while (hvals.hasMoreElements()) {
+ String hv = (String) hvals.nextElement();
+ if ("content-type".equals(hnlc)) {
+ ctype = hv;
+ }
+ if ("x-att-dr-meta".equals(hnlc)) {
+ if (hv.length() > 4096) {
+ logger.info("NODE0109 Rejecting publish attempt with metadata too long for feed " + feedid + " user " + user + " ip " + ip);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Metadata too long");
+ return;
+ }
+ if (!MetaDataPattern.matcher(hv.replaceAll("\\\\.", "X")).matches()) {
+ logger.info("NODE0109 Rejecting publish attempt with malformed metadata for feed " + feedid + " user " + user + " ip " + ip);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Malformed metadata");
+ return;
+ }
+ }
+ mx.append(hn).append('\t').append(hv).append('\n');
+ }
+ }
+ }
+ mx.append("X-ATT-DR-RECEIVED\t").append(rcvd).append('\n');
+ String metadata = mx.toString();
+ byte[] buf = new byte[1024 * 1024];
+ int i;
+ try {
+ is = req.getInputStream();
+ dos = new FileOutputStream(data);
+ while ((i = is.read(buf)) > 0) {
+ dos.write(buf, 0, i);
+ }
+ is.close();
+ is = null;
+ dos.close();
+ dos = null;
+ } catch (IOException ioe) {
+ long exlen = -1;
+ try {
+ exlen = Long.parseLong(req.getHeader("Content-Length"));
+ } catch (Exception e) {
+ }
+ StatusLog.logPubFail(pubid, feedid, logurl, req.getMethod(), ctype, exlen, data.length(), ip, user, ioe.getMessage());
+ throw ioe;
+ }
+ Path dpath = Paths.get(fbase);
+ for (Target t : targets) {
+ DestInfo di = t.getDestInfo();
+ if (di == null) {
+ // TODO: unknown destination
+ continue;
+ }
+ String dbase = di.getSpool() + "/" + pubid;
+ Files.createLink(Paths.get(dbase), dpath);
+ mw = new FileWriter(meta);
+ mw.write(metadata);
+ if (di.getSubId() == null) {
+ mw.write("X-ATT-DR-ROUTING\t" + t.getRouting() + "\n");
+ }
+ mw.close();
+ meta.renameTo(new File(dbase + ".M"));
+ }
+ resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ resp.getOutputStream().close();
+ StatusLog.logPub(pubid, feedid, logurl, req.getMethod(), ctype, data.length(), ip, user, HttpServletResponse.SC_NO_CONTENT);
+ } catch (IOException ioe) {
+ logger.info("NODE0110 IO Exception receiving publish attempt for feed " + feedid + " user " + user + " ip " + ip + " " + ioe.toString(), ioe);
+ throw ioe;
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (Exception e) {
+ }
+ }
+ if (dos != null) {
+ try {
+ dos.close();
+ } catch (Exception e) {
+ }
+ }
+ if (mw != null) {
+ try {
+ mw.close();
+ } catch (Exception e) {
+ }
+ }
+ try {
+ data.delete();
+ } catch (Exception e) {
+ }
+ try {
+ meta.delete();
+ } catch (Exception e) {
+ }
+ }
+ }
+
+ private int getIdFromPath(HttpServletRequest req) {
+ String path = req.getPathInfo();
+ if (path == null || path.length() < 2)
+ return -1;
+ try {
+ return Integer.parseInt(path.substring(1));
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeUtils.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeUtils.java
index 303d7ee7..c57308b6 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeUtils.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/NodeUtils.java
@@ -1,226 +1,247 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import static com.att.eelf.configuration.Configuration.MDC_SERVER_FQDN;
-import static com.att.eelf.configuration.Configuration.MDC_SERVER_IP_ADDRESS;
-import static com.att.eelf.configuration.Configuration.MDC_SERVICE_NAME;
-
-import java.security.*;
-import java.io.*;
-import java.util.*;
-import java.security.cert.*;
-import java.net.*;
-import java.text.*;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
-import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
-import org.slf4j.MDC;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-/**
- * Utility functions for the data router node
- */
-public class NodeUtils {
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
- private static SimpleDateFormat logdate;
- static {
- logdate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
- logdate.setTimeZone(TimeZone.getTimeZone("GMT"));
- }
- private NodeUtils() {}
- /**
- * Base64 encode a byte array
- * @param raw The bytes to be encoded
- * @return The encoded string
- */
- public static String base64Encode(byte[] raw) {
- return(Base64.encodeBase64String(raw));
- }
- /**
- * Given a user and password, generate the credentials
- * @param user User name
- * @param password User password
- * @return Authorization header value
- */
- public static String getAuthHdr(String user, String password) {
- if (user == null || password == null) {
- return(null);
- }
- return("Basic " + base64Encode((user + ":" + password).getBytes()));
- }
- /**
- * Given a node name, generate the credentials
- * @param node Node name
- */
- public static String getNodeAuthHdr(String node, String key) {
- try {
- MessageDigest md = MessageDigest.getInstance("SHA");
- md.update(key.getBytes());
- md.update(node.getBytes());
- md.update(key.getBytes());
- return(getAuthHdr(node, base64Encode(md.digest())));
- } catch (Exception e) {
- return(null);
- }
- }
- /**
- * Given a keystore file and its password, return the value of the CN of the first private key entry with a certificate.
- * @param kstype The type of keystore
- * @param ksfile The file name of the keystore
- * @param kspass The password of the keystore
- * @return CN of the certificate subject or null
- */
- public static String getCanonicalName(String kstype, String ksfile, String kspass) {
- try {
- KeyStore ks = KeyStore.getInstance(kstype);
- ks.load(new FileInputStream(ksfile), kspass.toCharArray());
- return(getCanonicalName(ks));
- } catch (Exception e) {
- setIpAndFqdnForEelf("getCanonicalName");
- eelflogger.error(EelfMsgs.MESSAGE_KEYSTORE_LOAD_ERROR, ksfile, e.toString());
- logger.error("NODE0401 Error loading my keystore file + " + ksfile + " " + e.toString(), e);
- return(null);
- }
- }
- /**
- * Given a keystore, return the value of the CN of the first private key entry with a certificate.
- * @param ks The KeyStore
- * @return CN of the certificate subject or null
- */
- public static String getCanonicalName(KeyStore ks) {
- try {
- Enumeration<String> aliases = ks.aliases();
- while (aliases.hasMoreElements()) {
- String s = aliases.nextElement();
- if (ks.entryInstanceOf(s, KeyStore.PrivateKeyEntry.class)) {
- X509Certificate c = (X509Certificate)ks.getCertificate(s);
- if (c != null) {
- String subject = c.getSubjectX500Principal().getName();
- String[] parts = subject.split(",");
- if (parts.length < 1) {
- return(null);
- }
- subject = parts[0].trim();
- if (!subject.startsWith("CN=")) {
- return(null);
-
- }
- return(subject.substring(3));
- }
- }
- }
- } catch (Exception e) {
- logger.error("NODE0402 Error extracting my name from my keystore file " + e.toString(), e);
- }
- return(null);
- }
- /**
- * Given a string representation of an IP address, get the corresponding byte array
- * @param ip The IP address as a string
- * @return The IP address as a byte array or null if the address is invalid
- */
- public static byte[] getInetAddress(String ip) {
- try {
- return(InetAddress.getByName(ip).getAddress());
- } catch (Exception e) {
- }
- return(null);
- }
- /**
- * Given a uri with parameters, split out the feed ID and file ID
- */
- public static String[] getFeedAndFileID(String uriandparams) {
- int end = uriandparams.length();
- int i = uriandparams.indexOf('#');
- if (i != -1 && i < end) {
- end = i;
- }
- i = uriandparams.indexOf('?');
- if (i != -1 && i < end) {
- end = i;
- }
- end = uriandparams.lastIndexOf('/', end);
- if (end < 2) {
- return(null);
- }
- i = uriandparams.lastIndexOf('/', end - 1);
- if (i == -1) {
- return(null);
- }
- return(new String[] { uriandparams.substring(i + 1, end - 1), uriandparams.substring(end + 1) });
- }
- /**
- * Escape fields that might contain vertical bar, backslash, or newline by replacing them with backslash p, backslash e and backslash n.
- */
- public static String loge(String s) {
- if (s == null) {
- return(s);
- }
- return(s.replaceAll("\\\\", "\\\\e").replaceAll("\\|", "\\\\p").replaceAll("\n", "\\\\n"));
- }
- /**
- * Undo what loge does.
- */
- public static String unloge(String s) {
- if (s == null) {
- return(s);
- }
- return(s.replaceAll("\\\\p", "\\|").replaceAll("\\\\n", "\n").replaceAll("\\\\e", "\\\\"));
- }
- /**
- * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
- */
- public static String logts(long when) {
- return(logts(new Date(when)));
- }
- /**
- * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
- */
- public static synchronized String logts(Date when) {
- return(logdate.format(when));
- }
-
- /* Method prints method name, server FQDN and IP Address of the machine in EELF logs
- * @Method - setIpAndFqdnForEelf - Rally:US664892
- * @Params - method, prints method name in EELF log.
- */
- public static void setIpAndFqdnForEelf(String method) {
- MDC.clear();
- MDC.put(MDC_SERVICE_NAME, method);
- try {
- MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
- MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- }
-
-
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import static com.att.eelf.configuration.Configuration.MDC_SERVER_FQDN;
+import static com.att.eelf.configuration.Configuration.MDC_SERVER_IP_ADDRESS;
+import static com.att.eelf.configuration.Configuration.MDC_SERVICE_NAME;
+
+import java.security.*;
+import java.io.*;
+import java.util.*;
+import java.security.cert.*;
+import java.net.*;
+import java.text.*;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
+import org.slf4j.MDC;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+/**
+ * Utility functions for the data router node
+ */
+public class NodeUtils {
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.NodeUtils");
+ private static SimpleDateFormat logdate;
+
+ static {
+ logdate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ logdate.setTimeZone(TimeZone.getTimeZone("GMT"));
+ }
+
+ private NodeUtils() {
+ }
+
+ /**
+ * Base64 encode a byte array
+ *
+ * @param raw The bytes to be encoded
+ * @return The encoded string
+ */
+ public static String base64Encode(byte[] raw) {
+ return (Base64.encodeBase64String(raw));
+ }
+
+ /**
+ * Given a user and password, generate the credentials
+ *
+ * @param user User name
+ * @param password User password
+ * @return Authorization header value
+ */
+ public static String getAuthHdr(String user, String password) {
+ if (user == null || password == null) {
+ return (null);
+ }
+ return ("Basic " + base64Encode((user + ":" + password).getBytes()));
+ }
+
+ /**
+ * Given a node name, generate the credentials
+ *
+ * @param node Node name
+ */
+ public static String getNodeAuthHdr(String node, String key) {
+ try {
+ MessageDigest md = MessageDigest.getInstance("SHA");
+ md.update(key.getBytes());
+ md.update(node.getBytes());
+ md.update(key.getBytes());
+ return (getAuthHdr(node, base64Encode(md.digest())));
+ } catch (Exception e) {
+ return (null);
+ }
+ }
+
+ /**
+ * Given a keystore file and its password, return the value of the CN of the first private key entry with a certificate.
+ *
+ * @param kstype The type of keystore
+ * @param ksfile The file name of the keystore
+ * @param kspass The password of the keystore
+ * @return CN of the certificate subject or null
+ */
+ public static String getCanonicalName(String kstype, String ksfile, String kspass) {
+ try {
+ KeyStore ks = KeyStore.getInstance(kstype);
+ ks.load(new FileInputStream(ksfile), kspass.toCharArray());
+ return (getCanonicalName(ks));
+ } catch (Exception e) {
+ setIpAndFqdnForEelf("getCanonicalName");
+ eelflogger.error(EelfMsgs.MESSAGE_KEYSTORE_LOAD_ERROR, ksfile, e.toString());
+ logger.error("NODE0401 Error loading my keystore file + " + ksfile + " " + e.toString(), e);
+ return (null);
+ }
+ }
+
+ /**
+ * Given a keystore, return the value of the CN of the first private key entry with a certificate.
+ *
+ * @param ks The KeyStore
+ * @return CN of the certificate subject or null
+ */
+ public static String getCanonicalName(KeyStore ks) {
+ try {
+ Enumeration<String> aliases = ks.aliases();
+ while (aliases.hasMoreElements()) {
+ String s = aliases.nextElement();
+ if (ks.entryInstanceOf(s, KeyStore.PrivateKeyEntry.class)) {
+ X509Certificate c = (X509Certificate) ks.getCertificate(s);
+ if (c != null) {
+ String subject = c.getSubjectX500Principal().getName();
+ String[] parts = subject.split(",");
+ if (parts.length < 1) {
+ return (null);
+ }
+ subject = parts[0].trim();
+ if (!subject.startsWith("CN=")) {
+ return (null);
+
+ }
+ return (subject.substring(3));
+ }
+ }
+ }
+ } catch (Exception e) {
+ logger.error("NODE0402 Error extracting my name from my keystore file " + e.toString(), e);
+ }
+ return (null);
+ }
+
+ /**
+ * Given a string representation of an IP address, get the corresponding byte array
+ *
+ * @param ip The IP address as a string
+ * @return The IP address as a byte array or null if the address is invalid
+ */
+ public static byte[] getInetAddress(String ip) {
+ try {
+ return (InetAddress.getByName(ip).getAddress());
+ } catch (Exception e) {
+ }
+ return (null);
+ }
+
+ /**
+ * Given a uri with parameters, split out the feed ID and file ID
+ */
+ public static String[] getFeedAndFileID(String uriandparams) {
+ int end = uriandparams.length();
+ int i = uriandparams.indexOf('#');
+ if (i != -1 && i < end) {
+ end = i;
+ }
+ i = uriandparams.indexOf('?');
+ if (i != -1 && i < end) {
+ end = i;
+ }
+ end = uriandparams.lastIndexOf('/', end);
+ if (end < 2) {
+ return (null);
+ }
+ i = uriandparams.lastIndexOf('/', end - 1);
+ if (i == -1) {
+ return (null);
+ }
+ return (new String[]{uriandparams.substring(i + 1, end - 1), uriandparams.substring(end + 1)});
+ }
+
+ /**
+ * Escape fields that might contain vertical bar, backslash, or newline by replacing them with backslash p, backslash e and backslash n.
+ */
+ public static String loge(String s) {
+ if (s == null) {
+ return (s);
+ }
+ return (s.replaceAll("\\\\", "\\\\e").replaceAll("\\|", "\\\\p").replaceAll("\n", "\\\\n"));
+ }
+
+ /**
+ * Undo what loge does.
+ */
+ public static String unloge(String s) {
+ if (s == null) {
+ return (s);
+ }
+ return (s.replaceAll("\\\\p", "\\|").replaceAll("\\\\n", "\n").replaceAll("\\\\e", "\\\\"));
+ }
+
+ /**
+ * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
+ */
+ public static String logts(long when) {
+ return (logts(new Date(when)));
+ }
+
+ /**
+ * Format a logging timestamp as yyyy-mm-ddThh:mm:ss.mmmZ
+ */
+ public static synchronized String logts(Date when) {
+ return (logdate.format(when));
+ }
+
+ /* Method prints method name, server FQDN and IP Address of the machine in EELF logs
+ * @Method - setIpAndFqdnForEelf - Rally:US664892
+ * @Params - method, prints method name in EELF log.
+ */
+ public static void setIpAndFqdnForEelf(String method) {
+ MDC.clear();
+ MDC.put(MDC_SERVICE_NAME, method);
+ try {
+ MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
+ MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PathFinder.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PathFinder.java
index b99f1685..98beebca 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PathFinder.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PathFinder.java
@@ -1,132 +1,140 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-
-/**
- * Given a set of node names and next hops, identify and ignore any cycles and figure out the sequence of next hops to get from this node to any other node
- */
-
-public class PathFinder {
- private static class Hop {
- public boolean mark;
- public boolean bad;
- public NodeConfig.ProvHop basis;
- }
- private Vector<String> errors = new Vector<String>();
- private Hashtable<String, String> routes = new Hashtable<String, String>();
- /**
- * Get list of errors encountered while finding paths
- * @return array of error descriptions
- */
- public String[] getErrors() {
- return(errors.toArray(new String[errors.size()]));
- }
- /**
- * Get the route from this node to the specified node
- * @param destination node
- * @return list of node names separated by and ending with "/"
- */
- public String getPath(String destination) {
- String ret = routes.get(destination);
- if (ret == null) {
- return("");
- }
- return(ret);
- }
- private String plot(String from, String to, Hashtable<String, Hop> info) {
- Hop nh = info.get(from);
- if (nh == null || nh.bad) {
- return(to);
- }
- if (nh.mark) {
- // loop detected;
- while (!nh.bad) {
- nh.bad = true;
- errors.add(nh.basis + " is part of a cycle");
- nh = info.get(nh.basis.getVia());
- }
- return(to);
- }
- nh.mark = true;
- String x = plot(nh.basis.getVia(), to, info);
- nh.mark = false;
- if (nh.bad) {
- return(to);
- }
- return(nh.basis.getVia() + "/" + x);
- }
- /**
- * Find routes from a specified origin to all of the nodes given a set of specified next hops.
- * @param origin where we start
- * @param nodes where we can go
- * @param hops detours along the way
- */
- public PathFinder(String origin, String[] nodes, NodeConfig.ProvHop[] hops) {
- HashSet<String> known = new HashSet<String>();
- Hashtable<String, Hashtable<String, Hop>> ht = new Hashtable<String, Hashtable<String, Hop>>();
- for (String n: nodes) {
- known.add(n);
- ht.put(n, new Hashtable<String, Hop>());
- }
- for (NodeConfig.ProvHop ph: hops) {
- if (!known.contains(ph.getFrom())) {
- errors.add(ph + " references unknown from node");
- continue;
- }
- if (!known.contains(ph.getTo())) {
- errors.add(ph + " references unknown destination node");
- continue;
- }
- Hashtable<String, Hop> ht2 = ht.get(ph.getTo());
- Hop h = ht2.get(ph.getFrom());
- if (h != null) {
- h.bad = true;
- errors.add(ph + " gives duplicate next hop - previous via was " + h.basis.getVia());
- continue;
- }
- h = new Hop();
- h.basis = ph;
- ht2.put(ph.getFrom(), h);
- if (!known.contains(ph.getVia())) {
- errors.add(ph + " references unknown via node");
- h.bad = true;
- continue;
- }
- if (ph.getVia().equals(ph.getTo())) {
- errors.add(ph + " gives destination as via");
- h.bad = true;
- continue;
- }
- }
- for (String n: known) {
- if (n.equals(origin)) {
- routes.put(n, "");
- }
- routes.put(n, plot(origin, n, ht.get(n)) + "/");
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+
+/**
+ * Given a set of node names and next hops, identify and ignore any cycles and figure out the sequence of next hops to get from this node to any other node
+ */
+
+public class PathFinder {
+ private static class Hop {
+ public boolean mark;
+ public boolean bad;
+ public NodeConfig.ProvHop basis;
+ }
+
+ private Vector<String> errors = new Vector<String>();
+ private Hashtable<String, String> routes = new Hashtable<String, String>();
+
+ /**
+ * Get list of errors encountered while finding paths
+ *
+ * @return array of error descriptions
+ */
+ public String[] getErrors() {
+ return (errors.toArray(new String[errors.size()]));
+ }
+
+ /**
+ * Get the route from this node to the specified node
+ *
+ * @param destination node
+ * @return list of node names separated by and ending with "/"
+ */
+ public String getPath(String destination) {
+ String ret = routes.get(destination);
+ if (ret == null) {
+ return ("");
+ }
+ return (ret);
+ }
+
+ private String plot(String from, String to, Hashtable<String, Hop> info) {
+ Hop nh = info.get(from);
+ if (nh == null || nh.bad) {
+ return (to);
+ }
+ if (nh.mark) {
+ // loop detected;
+ while (!nh.bad) {
+ nh.bad = true;
+ errors.add(nh.basis + " is part of a cycle");
+ nh = info.get(nh.basis.getVia());
+ }
+ return (to);
+ }
+ nh.mark = true;
+ String x = plot(nh.basis.getVia(), to, info);
+ nh.mark = false;
+ if (nh.bad) {
+ return (to);
+ }
+ return (nh.basis.getVia() + "/" + x);
+ }
+
+ /**
+ * Find routes from a specified origin to all of the nodes given a set of specified next hops.
+ *
+ * @param origin where we start
+ * @param nodes where we can go
+ * @param hops detours along the way
+ */
+ public PathFinder(String origin, String[] nodes, NodeConfig.ProvHop[] hops) {
+ HashSet<String> known = new HashSet<String>();
+ Hashtable<String, Hashtable<String, Hop>> ht = new Hashtable<String, Hashtable<String, Hop>>();
+ for (String n : nodes) {
+ known.add(n);
+ ht.put(n, new Hashtable<String, Hop>());
+ }
+ for (NodeConfig.ProvHop ph : hops) {
+ if (!known.contains(ph.getFrom())) {
+ errors.add(ph + " references unknown from node");
+ continue;
+ }
+ if (!known.contains(ph.getTo())) {
+ errors.add(ph + " references unknown destination node");
+ continue;
+ }
+ Hashtable<String, Hop> ht2 = ht.get(ph.getTo());
+ Hop h = ht2.get(ph.getFrom());
+ if (h != null) {
+ h.bad = true;
+ errors.add(ph + " gives duplicate next hop - previous via was " + h.basis.getVia());
+ continue;
+ }
+ h = new Hop();
+ h.basis = ph;
+ ht2.put(ph.getFrom(), h);
+ if (!known.contains(ph.getVia())) {
+ errors.add(ph + " references unknown via node");
+ h.bad = true;
+ continue;
+ }
+ if (ph.getVia().equals(ph.getTo())) {
+ errors.add(ph + " gives destination as via");
+ h.bad = true;
+ continue;
+ }
+ }
+ for (String n : known) {
+ if (n.equals(origin)) {
+ routes.put(n, "");
+ }
+ routes.put(n, plot(origin, n, ht.get(n)) + "/");
+ }
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/ProvData.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/ProvData.java
index c0e46eb3..ea3a50fc 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/ProvData.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/ProvData.java
@@ -1,302 +1,320 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.io.*;
-import java.util.*;
-import org.json.*;
-import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
-import org.apache.log4j.Logger;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-/**
- * Parser for provisioning data from the provisioning server.
- * <p>
- * The ProvData class uses a Reader for the text configuration from the
- * provisioning server to construct arrays of raw configuration entries.
- */
-public class ProvData {
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.ProvData");
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.ProvData");
- private NodeConfig.ProvNode[] pn;
- private NodeConfig.ProvParam[] pp;
- private NodeConfig.ProvFeed[] pf;
- private NodeConfig.ProvFeedUser[] pfu;
- private NodeConfig.ProvFeedSubnet[] pfsn;
- private NodeConfig.ProvSubscription[] ps;
- private NodeConfig.ProvForceIngress[] pfi;
- private NodeConfig.ProvForceEgress[] pfe;
- private NodeConfig.ProvHop[] ph;
- private static String[] gvasa(JSONArray a, int index) {
- return(gvasa(a.get(index)));
- }
- private static String[] gvasa(JSONObject o, String key) {
- return(gvasa(o.opt(key)));
- }
- private static String[] gvasa(Object o) {
- if (o instanceof JSONArray) {
- JSONArray a = (JSONArray)o;
- Vector<String> v = new Vector<String>();
- for (int i = 0; i < a.length(); i++) {
- String s = gvas(a, i);
- if (s != null) {
- v.add(s);
- }
- }
- return(v.toArray(new String[v.size()]));
- } else {
- String s = gvas(o);
- if (s == null) {
- return(new String[0]);
- } else {
- return(new String[] { s });
- }
- }
- }
- private static String gvas(JSONArray a, int index) {
- return(gvas(a.get(index)));
- }
- private static String gvas(JSONObject o, String key) {
- return(gvas(o.opt(key)));
- }
- private static String gvas(Object o) {
- if (o instanceof Boolean || o instanceof Number || o instanceof String) {
- return(o.toString());
- }
- return(null);
- }
- /**
- * Construct raw provisioing data entries from the text (JSON)
- * provisioning document received from the provisioning server
- * @param r The reader for the JSON text.
- */
- public ProvData(Reader r) throws IOException {
- Vector<NodeConfig.ProvNode> pnv = new Vector<NodeConfig.ProvNode>();
- Vector<NodeConfig.ProvParam> ppv = new Vector<NodeConfig.ProvParam>();
- Vector<NodeConfig.ProvFeed> pfv = new Vector<NodeConfig.ProvFeed>();
- Vector<NodeConfig.ProvFeedUser> pfuv = new Vector<NodeConfig.ProvFeedUser>();
- Vector<NodeConfig.ProvFeedSubnet> pfsnv = new Vector<NodeConfig.ProvFeedSubnet>();
- Vector<NodeConfig.ProvSubscription> psv = new Vector<NodeConfig.ProvSubscription>();
- Vector<NodeConfig.ProvForceIngress> pfiv = new Vector<NodeConfig.ProvForceIngress>();
- Vector<NodeConfig.ProvForceEgress> pfev = new Vector<NodeConfig.ProvForceEgress>();
- Vector<NodeConfig.ProvHop> phv = new Vector<NodeConfig.ProvHop>();
- try {
- JSONTokener jtx = new JSONTokener(r);
- JSONObject jcfg = new JSONObject(jtx);
- char c = jtx.nextClean();
- if (c != '\0') {
- throw new JSONException("Spurious characters following configuration");
- }
- r.close();
- JSONArray jfeeds = jcfg.optJSONArray("feeds");
- if (jfeeds != null) {
- for (int fx = 0; fx < jfeeds.length(); fx++) {
- JSONObject jfeed = jfeeds.getJSONObject(fx);
- String stat = null;
- if (jfeed.optBoolean("suspend", false)) {
- stat = "Feed is suspended";
- }
- if (jfeed.optBoolean("deleted", false)) {
- stat = "Feed is deleted";
- }
- String fid = gvas(jfeed, "feedid");
- String fname = gvas(jfeed, "name");
- String fver = gvas(jfeed, "version");
- pfv.add(new NodeConfig.ProvFeed(fid, fname + "//" + fver, stat));
- JSONObject jauth = jfeed.optJSONObject("authorization");
- if (jauth == null) {
- continue;
- }
- JSONArray jeids = jauth.optJSONArray("endpoint_ids");
- if (jeids != null) {
- for (int ux = 0; ux < jeids.length(); ux++) {
- JSONObject ju = jeids.getJSONObject(ux);
- String login = gvas(ju, "id");
- String password = gvas(ju, "password");
- pfuv.add(new NodeConfig.ProvFeedUser(fid, login, NodeUtils.getAuthHdr(login, password)));
- }
- }
- JSONArray jeips = jauth.optJSONArray("endpoint_addrs");
- if (jeips != null) {
- for (int ix = 0; ix < jeips.length(); ix++) {
- String sn = gvas(jeips, ix);
- pfsnv.add(new NodeConfig.ProvFeedSubnet(fid, sn));
- }
- }
- }
- }
- JSONArray jsubs = jcfg.optJSONArray("subscriptions");
- if (jsubs != null) {
- for (int sx = 0; sx < jsubs.length(); sx++) {
- JSONObject jsub = jsubs.getJSONObject(sx);
- if (jsub.optBoolean("suspend", false)) {
- continue;
- }
- String sid = gvas(jsub, "subid");
- String fid = gvas(jsub, "feedid");
- JSONObject jdel = jsub.getJSONObject("delivery");
- String delurl = gvas(jdel, "url");
- String id = gvas(jdel, "user");
- String password = gvas(jdel, "password");
- boolean monly = jsub.getBoolean("metadataOnly");
- boolean use100 = jdel.getBoolean("use100");
- psv.add(new NodeConfig.ProvSubscription(sid, fid, delurl, id, NodeUtils.getAuthHdr(id, password), monly, use100));
- }
- }
- JSONObject jparams = jcfg.optJSONObject("parameters");
- if (jparams != null) {
- for (String pname: JSONObject.getNames(jparams)) {
- String pvalue = gvas(jparams, pname);
- if (pvalue != null) {
- ppv.add(new NodeConfig.ProvParam(pname, pvalue));
- }
- }
- String sfx = gvas(jparams, "PROV_DOMAIN");
- JSONArray jnodes = jparams.optJSONArray("NODES");
- if (jnodes != null) {
- for (int nx = 0; nx < jnodes.length(); nx++) {
- String nn = gvas(jnodes, nx);
- if (nn.indexOf('.') == -1) {
- nn = nn + "." + sfx;
- }
- pnv.add(new NodeConfig.ProvNode(nn));
- }
- }
- }
- JSONArray jingresses = jcfg.optJSONArray("ingress");
- if (jingresses != null) {
- for (int fx = 0; fx < jingresses.length(); fx++) {
- JSONObject jingress = jingresses.getJSONObject(fx);
- String fid = gvas(jingress, "feedid");
- String subnet = gvas(jingress, "subnet");
- String user = gvas(jingress, "user");
- String[] nodes = gvasa(jingress, "node");
- if (fid == null || "".equals(fid)) {
- continue;
- }
- if ("".equals(subnet)) {
- subnet = null;
- }
- if ("".equals(user)) {
- user = null;
- }
- pfiv.add(new NodeConfig.ProvForceIngress(fid, subnet, user, nodes));
- }
- }
- JSONObject jegresses = jcfg.optJSONObject("egress");
- if (jegresses != null && JSONObject.getNames(jegresses) != null) {
- for (String esid: JSONObject.getNames(jegresses)) {
- String enode = gvas(jegresses, esid);
- if (esid != null && enode != null && !"".equals(esid) && !"".equals(enode)) {
- pfev.add(new NodeConfig.ProvForceEgress(esid, enode));
- }
- }
- }
- JSONArray jhops = jcfg.optJSONArray("routing");
- if (jhops != null) {
- for (int fx = 0; fx < jhops.length(); fx++) {
- JSONObject jhop = jhops.getJSONObject(fx);
- String from = gvas(jhop, "from");
- String to = gvas(jhop, "to");
- String via = gvas(jhop, "via");
- if (from == null || to == null || via == null || "".equals(from) || "".equals(to) || "".equals(via)) {
- continue;
- }
- phv.add(new NodeConfig.ProvHop(from, to, via));
- }
- }
- } catch (JSONException jse) {
- NodeUtils.setIpAndFqdnForEelf("ProvData");
- eelflogger.error(EelfMsgs.MESSAGE_PARSING_ERROR, jse.toString());
- logger.error("NODE0201 Error parsing configuration data from provisioning server " + jse.toString(), jse);
- throw new IOException(jse.toString(), jse);
- }
- pn = pnv.toArray(new NodeConfig.ProvNode[pnv.size()]);
- pp = ppv.toArray(new NodeConfig.ProvParam[ppv.size()]);
- pf = pfv.toArray(new NodeConfig.ProvFeed[pfv.size()]);
- pfu = pfuv.toArray(new NodeConfig.ProvFeedUser[pfuv.size()]);
- pfsn = pfsnv.toArray(new NodeConfig.ProvFeedSubnet[pfsnv.size()]);
- ps = psv.toArray(new NodeConfig.ProvSubscription[psv.size()]);
- pfi = pfiv.toArray(new NodeConfig.ProvForceIngress[pfiv.size()]);
- pfe = pfev.toArray(new NodeConfig.ProvForceEgress[pfev.size()]);
- ph = phv.toArray(new NodeConfig.ProvHop[phv.size()]);
- }
- /**
- * Get the raw node configuration entries
- */
- public NodeConfig.ProvNode[] getNodes() {
- return(pn);
- }
- /**
- * Get the raw parameter configuration entries
- */
- public NodeConfig.ProvParam[] getParams() {
- return(pp);
- }
- /**
- * Ge the raw feed configuration entries
- */
- public NodeConfig.ProvFeed[] getFeeds() {
- return(pf);
- }
- /**
- * Get the raw feed user configuration entries
- */
- public NodeConfig.ProvFeedUser[] getFeedUsers() {
- return(pfu);
- }
- /**
- * Get the raw feed subnet configuration entries
- */
- public NodeConfig.ProvFeedSubnet[] getFeedSubnets() {
- return(pfsn);
- }
- /**
- * Get the raw subscription entries
- */
- public NodeConfig.ProvSubscription[] getSubscriptions() {
- return(ps);
- }
- /**
- * Get the raw forced ingress entries
- */
- public NodeConfig.ProvForceIngress[] getForceIngress() {
- return(pfi);
- }
- /**
- * Get the raw forced egress entries
- */
- public NodeConfig.ProvForceEgress[] getForceEgress() {
- return(pfe);
- }
- /**
- * Get the raw next hop entries
- */
- public NodeConfig.ProvHop[] getHops() {
- return(ph);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.io.*;
+import java.util.*;
+
+import org.json.*;
+import org.onap.dmaap.datarouter.node.eelf.EelfMsgs;
+import org.apache.log4j.Logger;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+/**
+ * Parser for provisioning data from the provisioning server.
+ * <p>
+ * The ProvData class uses a Reader for the text configuration from the
+ * provisioning server to construct arrays of raw configuration entries.
+ */
+public class ProvData {
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.node.ProvData");
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.node.ProvData");
+ private NodeConfig.ProvNode[] pn;
+ private NodeConfig.ProvParam[] pp;
+ private NodeConfig.ProvFeed[] pf;
+ private NodeConfig.ProvFeedUser[] pfu;
+ private NodeConfig.ProvFeedSubnet[] pfsn;
+ private NodeConfig.ProvSubscription[] ps;
+ private NodeConfig.ProvForceIngress[] pfi;
+ private NodeConfig.ProvForceEgress[] pfe;
+ private NodeConfig.ProvHop[] ph;
+
+ private static String[] gvasa(JSONArray a, int index) {
+ return (gvasa(a.get(index)));
+ }
+
+ private static String[] gvasa(JSONObject o, String key) {
+ return (gvasa(o.opt(key)));
+ }
+
+ private static String[] gvasa(Object o) {
+ if (o instanceof JSONArray) {
+ JSONArray a = (JSONArray) o;
+ Vector<String> v = new Vector<String>();
+ for (int i = 0; i < a.length(); i++) {
+ String s = gvas(a, i);
+ if (s != null) {
+ v.add(s);
+ }
+ }
+ return (v.toArray(new String[v.size()]));
+ } else {
+ String s = gvas(o);
+ if (s == null) {
+ return (new String[0]);
+ } else {
+ return (new String[]{s});
+ }
+ }
+ }
+
+ private static String gvas(JSONArray a, int index) {
+ return (gvas(a.get(index)));
+ }
+
+ private static String gvas(JSONObject o, String key) {
+ return (gvas(o.opt(key)));
+ }
+
+ private static String gvas(Object o) {
+ if (o instanceof Boolean || o instanceof Number || o instanceof String) {
+ return (o.toString());
+ }
+ return (null);
+ }
+
+ /**
+ * Construct raw provisioing data entries from the text (JSON)
+ * provisioning document received from the provisioning server
+ *
+ * @param r The reader for the JSON text.
+ */
+ public ProvData(Reader r) throws IOException {
+ Vector<NodeConfig.ProvNode> pnv = new Vector<NodeConfig.ProvNode>();
+ Vector<NodeConfig.ProvParam> ppv = new Vector<NodeConfig.ProvParam>();
+ Vector<NodeConfig.ProvFeed> pfv = new Vector<NodeConfig.ProvFeed>();
+ Vector<NodeConfig.ProvFeedUser> pfuv = new Vector<NodeConfig.ProvFeedUser>();
+ Vector<NodeConfig.ProvFeedSubnet> pfsnv = new Vector<NodeConfig.ProvFeedSubnet>();
+ Vector<NodeConfig.ProvSubscription> psv = new Vector<NodeConfig.ProvSubscription>();
+ Vector<NodeConfig.ProvForceIngress> pfiv = new Vector<NodeConfig.ProvForceIngress>();
+ Vector<NodeConfig.ProvForceEgress> pfev = new Vector<NodeConfig.ProvForceEgress>();
+ Vector<NodeConfig.ProvHop> phv = new Vector<NodeConfig.ProvHop>();
+ try {
+ JSONTokener jtx = new JSONTokener(r);
+ JSONObject jcfg = new JSONObject(jtx);
+ char c = jtx.nextClean();
+ if (c != '\0') {
+ throw new JSONException("Spurious characters following configuration");
+ }
+ r.close();
+ JSONArray jfeeds = jcfg.optJSONArray("feeds");
+ if (jfeeds != null) {
+ for (int fx = 0; fx < jfeeds.length(); fx++) {
+ JSONObject jfeed = jfeeds.getJSONObject(fx);
+ String stat = null;
+ if (jfeed.optBoolean("suspend", false)) {
+ stat = "Feed is suspended";
+ }
+ if (jfeed.optBoolean("deleted", false)) {
+ stat = "Feed is deleted";
+ }
+ String fid = gvas(jfeed, "feedid");
+ String fname = gvas(jfeed, "name");
+ String fver = gvas(jfeed, "version");
+ pfv.add(new NodeConfig.ProvFeed(fid, fname + "//" + fver, stat));
+ JSONObject jauth = jfeed.optJSONObject("authorization");
+ if (jauth == null) {
+ continue;
+ }
+ JSONArray jeids = jauth.optJSONArray("endpoint_ids");
+ if (jeids != null) {
+ for (int ux = 0; ux < jeids.length(); ux++) {
+ JSONObject ju = jeids.getJSONObject(ux);
+ String login = gvas(ju, "id");
+ String password = gvas(ju, "password");
+ pfuv.add(new NodeConfig.ProvFeedUser(fid, login, NodeUtils.getAuthHdr(login, password)));
+ }
+ }
+ JSONArray jeips = jauth.optJSONArray("endpoint_addrs");
+ if (jeips != null) {
+ for (int ix = 0; ix < jeips.length(); ix++) {
+ String sn = gvas(jeips, ix);
+ pfsnv.add(new NodeConfig.ProvFeedSubnet(fid, sn));
+ }
+ }
+ }
+ }
+ JSONArray jsubs = jcfg.optJSONArray("subscriptions");
+ if (jsubs != null) {
+ for (int sx = 0; sx < jsubs.length(); sx++) {
+ JSONObject jsub = jsubs.getJSONObject(sx);
+ if (jsub.optBoolean("suspend", false)) {
+ continue;
+ }
+ String sid = gvas(jsub, "subid");
+ String fid = gvas(jsub, "feedid");
+ JSONObject jdel = jsub.getJSONObject("delivery");
+ String delurl = gvas(jdel, "url");
+ String id = gvas(jdel, "user");
+ String password = gvas(jdel, "password");
+ boolean monly = jsub.getBoolean("metadataOnly");
+ boolean use100 = jdel.getBoolean("use100");
+ psv.add(new NodeConfig.ProvSubscription(sid, fid, delurl, id, NodeUtils.getAuthHdr(id, password), monly, use100));
+ }
+ }
+ JSONObject jparams = jcfg.optJSONObject("parameters");
+ if (jparams != null) {
+ for (String pname : JSONObject.getNames(jparams)) {
+ String pvalue = gvas(jparams, pname);
+ if (pvalue != null) {
+ ppv.add(new NodeConfig.ProvParam(pname, pvalue));
+ }
+ }
+ String sfx = gvas(jparams, "PROV_DOMAIN");
+ JSONArray jnodes = jparams.optJSONArray("NODES");
+ if (jnodes != null) {
+ for (int nx = 0; nx < jnodes.length(); nx++) {
+ String nn = gvas(jnodes, nx);
+ if (nn.indexOf('.') == -1) {
+ nn = nn + "." + sfx;
+ }
+ pnv.add(new NodeConfig.ProvNode(nn));
+ }
+ }
+ }
+ JSONArray jingresses = jcfg.optJSONArray("ingress");
+ if (jingresses != null) {
+ for (int fx = 0; fx < jingresses.length(); fx++) {
+ JSONObject jingress = jingresses.getJSONObject(fx);
+ String fid = gvas(jingress, "feedid");
+ String subnet = gvas(jingress, "subnet");
+ String user = gvas(jingress, "user");
+ String[] nodes = gvasa(jingress, "node");
+ if (fid == null || "".equals(fid)) {
+ continue;
+ }
+ if ("".equals(subnet)) {
+ subnet = null;
+ }
+ if ("".equals(user)) {
+ user = null;
+ }
+ pfiv.add(new NodeConfig.ProvForceIngress(fid, subnet, user, nodes));
+ }
+ }
+ JSONObject jegresses = jcfg.optJSONObject("egress");
+ if (jegresses != null && JSONObject.getNames(jegresses) != null) {
+ for (String esid : JSONObject.getNames(jegresses)) {
+ String enode = gvas(jegresses, esid);
+ if (esid != null && enode != null && !"".equals(esid) && !"".equals(enode)) {
+ pfev.add(new NodeConfig.ProvForceEgress(esid, enode));
+ }
+ }
+ }
+ JSONArray jhops = jcfg.optJSONArray("routing");
+ if (jhops != null) {
+ for (int fx = 0; fx < jhops.length(); fx++) {
+ JSONObject jhop = jhops.getJSONObject(fx);
+ String from = gvas(jhop, "from");
+ String to = gvas(jhop, "to");
+ String via = gvas(jhop, "via");
+ if (from == null || to == null || via == null || "".equals(from) || "".equals(to) || "".equals(via)) {
+ continue;
+ }
+ phv.add(new NodeConfig.ProvHop(from, to, via));
+ }
+ }
+ } catch (JSONException jse) {
+ NodeUtils.setIpAndFqdnForEelf("ProvData");
+ eelflogger.error(EelfMsgs.MESSAGE_PARSING_ERROR, jse.toString());
+ logger.error("NODE0201 Error parsing configuration data from provisioning server " + jse.toString(), jse);
+ throw new IOException(jse.toString(), jse);
+ }
+ pn = pnv.toArray(new NodeConfig.ProvNode[pnv.size()]);
+ pp = ppv.toArray(new NodeConfig.ProvParam[ppv.size()]);
+ pf = pfv.toArray(new NodeConfig.ProvFeed[pfv.size()]);
+ pfu = pfuv.toArray(new NodeConfig.ProvFeedUser[pfuv.size()]);
+ pfsn = pfsnv.toArray(new NodeConfig.ProvFeedSubnet[pfsnv.size()]);
+ ps = psv.toArray(new NodeConfig.ProvSubscription[psv.size()]);
+ pfi = pfiv.toArray(new NodeConfig.ProvForceIngress[pfiv.size()]);
+ pfe = pfev.toArray(new NodeConfig.ProvForceEgress[pfev.size()]);
+ ph = phv.toArray(new NodeConfig.ProvHop[phv.size()]);
+ }
+
+ /**
+ * Get the raw node configuration entries
+ */
+ public NodeConfig.ProvNode[] getNodes() {
+ return (pn);
+ }
+
+ /**
+ * Get the raw parameter configuration entries
+ */
+ public NodeConfig.ProvParam[] getParams() {
+ return (pp);
+ }
+
+ /**
+ * Ge the raw feed configuration entries
+ */
+ public NodeConfig.ProvFeed[] getFeeds() {
+ return (pf);
+ }
+
+ /**
+ * Get the raw feed user configuration entries
+ */
+ public NodeConfig.ProvFeedUser[] getFeedUsers() {
+ return (pfu);
+ }
+
+ /**
+ * Get the raw feed subnet configuration entries
+ */
+ public NodeConfig.ProvFeedSubnet[] getFeedSubnets() {
+ return (pfsn);
+ }
+
+ /**
+ * Get the raw subscription entries
+ */
+ public NodeConfig.ProvSubscription[] getSubscriptions() {
+ return (ps);
+ }
+
+ /**
+ * Get the raw forced ingress entries
+ */
+ public NodeConfig.ProvForceIngress[] getForceIngress() {
+ return (pfi);
+ }
+
+ /**
+ * Get the raw forced egress entries
+ */
+ public NodeConfig.ProvForceEgress[] getForceEgress() {
+ return (pfe);
+ }
+
+ /**
+ * Get the raw next hop entries
+ */
+ public NodeConfig.ProvHop[] getHops() {
+ return (ph);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PublishId.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PublishId.java
index fa285b27..3d4908e8 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PublishId.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/PublishId.java
@@ -1,52 +1,54 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-/**
- * Generate publish IDs
- */
-public class PublishId {
- private long nextuid;
- private String myname;
-
- /**
- * Generate publish IDs for the specified name
- * @param myname Unique identifier for this publish ID generator (usually fqdn of server)
- */
- public PublishId(String myname) {
- this.myname = myname;
- }
- /**
- * Generate a Data Router Publish ID that uniquely identifies the particular invocation of the Publish API for log correlation purposes.
- */
- public synchronized String next() {
- long now = System.currentTimeMillis();
- if (now < nextuid) {
- now = nextuid;
- }
- nextuid = now + 1;
- return(now + "." + myname);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+/**
+ * Generate publish IDs
+ */
+public class PublishId {
+ private long nextuid;
+ private String myname;
+
+ /**
+ * Generate publish IDs for the specified name
+ *
+ * @param myname Unique identifier for this publish ID generator (usually fqdn of server)
+ */
+ public PublishId(String myname) {
+ this.myname = myname;
+ }
+
+ /**
+ * Generate a Data Router Publish ID that uniquely identifies the particular invocation of the Publish API for log correlation purposes.
+ */
+ public synchronized String next() {
+ long now = System.currentTimeMillis();
+ if (now < nextuid) {
+ now = nextuid;
+ }
+ nextuid = now + 1;
+ return (now + "." + myname);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RateLimitedOperation.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RateLimitedOperation.java
index 5890e193..42af8ca0 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RateLimitedOperation.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RateLimitedOperation.java
@@ -1,102 +1,110 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-
-/**
- * Execute an operation no more frequently than a specified interval
- */
-
-public abstract class RateLimitedOperation implements Runnable {
- private boolean marked; // a timer task exists
- private boolean executing; // the operation is currently in progress
- private boolean remark; // a request was made while the operation was in progress
- private Timer timer;
- private long last; // when the last operation started
- private long mininterval;
- /**
- * Create a rate limited operation
- * @param mininterval The minimum number of milliseconds after the last execution starts before a new execution can begin
- * @param timer The timer used to perform deferred executions
- */
- public RateLimitedOperation(long mininterval, Timer timer) {
- this.timer = timer;
- this.mininterval = mininterval;
- }
- private class deferred extends TimerTask {
- public void run() {
- execute();
- }
- }
- private synchronized void unmark() {
- marked = false;
- }
- private void execute() {
- unmark();
- request();
- }
- /**
- * Request that the operation be performed by this thread or at a later time by the timer
- */
- public void request() {
- if (premark()) {
- return;
- }
- do {
- run();
- } while (demark());
- }
- private synchronized boolean premark() {
- if (executing) {
- // currently executing - wait until it finishes
- remark = true;
- return(true);
- }
- if (marked) {
- // timer currently running - will run when it expires
- return(true);
- }
- long now = System.currentTimeMillis();
- if (last + mininterval > now) {
- // too soon - schedule a timer
- marked = true;
- timer.schedule(new deferred(), last + mininterval - now);
- return(true);
- }
- last = now;
- executing = true;
- // start execution
- return(false);
- }
- private synchronized boolean demark() {
- executing = false;
- if (remark) {
- remark = false;
- return(!premark());
- }
- return(false);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+
+/**
+ * Execute an operation no more frequently than a specified interval
+ */
+
+public abstract class RateLimitedOperation implements Runnable {
+ private boolean marked; // a timer task exists
+ private boolean executing; // the operation is currently in progress
+ private boolean remark; // a request was made while the operation was in progress
+ private Timer timer;
+ private long last; // when the last operation started
+ private long mininterval;
+
+ /**
+ * Create a rate limited operation
+ *
+ * @param mininterval The minimum number of milliseconds after the last execution starts before a new execution can begin
+ * @param timer The timer used to perform deferred executions
+ */
+ public RateLimitedOperation(long mininterval, Timer timer) {
+ this.timer = timer;
+ this.mininterval = mininterval;
+ }
+
+ private class deferred extends TimerTask {
+ public void run() {
+ execute();
+ }
+ }
+
+ private synchronized void unmark() {
+ marked = false;
+ }
+
+ private void execute() {
+ unmark();
+ request();
+ }
+
+ /**
+ * Request that the operation be performed by this thread or at a later time by the timer
+ */
+ public void request() {
+ if (premark()) {
+ return;
+ }
+ do {
+ run();
+ } while (demark());
+ }
+
+ private synchronized boolean premark() {
+ if (executing) {
+ // currently executing - wait until it finishes
+ remark = true;
+ return (true);
+ }
+ if (marked) {
+ // timer currently running - will run when it expires
+ return (true);
+ }
+ long now = System.currentTimeMillis();
+ if (last + mininterval > now) {
+ // too soon - schedule a timer
+ marked = true;
+ timer.schedule(new deferred(), last + mininterval - now);
+ return (true);
+ }
+ last = now;
+ executing = true;
+ // start execution
+ return (false);
+ }
+
+ private synchronized boolean demark() {
+ executing = false;
+ if (remark) {
+ remark = false;
+ return (!premark());
+ }
+ return (false);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RedirManager.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RedirManager.java
index 336eee32..a557e7ad 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RedirManager.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/RedirManager.java
@@ -1,118 +1,127 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-import java.io.*;
-
-/**
- * Track redirections of subscriptions
- */
-public class RedirManager {
- private Hashtable<String, String> sid2primary = new Hashtable<String, String>();
- private Hashtable<String, String> sid2secondary = new Hashtable<String, String>();
- private String redirfile;
- RateLimitedOperation op;
- /**
- * Create a mechanism for maintaining subscription redirections.
- * @param redirfile The file to store the redirection information.
- * @param mininterval The minimum number of milliseconds between writes to the redirection information file.
- * @param timer The timer thread used to run delayed file writes.
- */
- public RedirManager(String redirfile, long mininterval, Timer timer) {
- this.redirfile = redirfile;
- op = new RateLimitedOperation(mininterval, timer) {
- public void run() {
- try {
- StringBuffer sb = new StringBuffer();
- for (String s: sid2primary.keySet()) {
- sb.append(s).append(' ').append(sid2primary.get(s)).append(' ').append(sid2secondary.get(s)).append('\n');
- }
- OutputStream os = new FileOutputStream(RedirManager.this.redirfile);
- os.write(sb.toString().getBytes());
- os.close();
- } catch (Exception e) {
- }
- }
- };
- try {
- String s;
- BufferedReader br = new BufferedReader(new FileReader(redirfile));
- while ((s = br.readLine()) != null) {
- s = s.trim();
- String[] sx = s.split(" ");
- if (s.startsWith("#") || sx.length != 3) {
- continue;
- }
- sid2primary.put(sx[0], sx[1]);
- sid2secondary.put(sx[0], sx[2]);
- }
- br.close();
- } catch (Exception e) {
- // missing file is normal
- }
- }
- /**
- * Set up redirection. If a request is to be sent to subscription ID sid, and that is configured to go to URL primary, instead, go to secondary.
- * @param sid The subscription ID to be redirected
- * @param primary The URL associated with that subscription ID
- * @param secondary The replacement URL to use instead
- */
- public synchronized void redirect(String sid, String primary, String secondary) {
- sid2primary.put(sid, primary);
- sid2secondary.put(sid, secondary);
- op.request();
- }
- /**
- * Cancel redirection. If a request is to be sent to subscription ID sid, send it to its primary URL.
- * @param sid The subscription ID to remove from the table.
- */
- public synchronized void forget(String sid) {
- sid2primary.remove(sid);
- sid2secondary.remove(sid);
- op.request();
- }
- /**
- * Look up where to send a subscription. If the primary has changed or there is no redirection, use the primary. Otherwise, redirect to the secondary URL.
- * @param sid The subscription ID to look up.
- * @param primary The configured primary URL.
- * @return The destination URL to really use.
- */
- public synchronized String lookup(String sid, String primary) {
- String oprim = sid2primary.get(sid);
- if (primary.equals(oprim)) {
- return(sid2secondary.get(sid));
- } else if (oprim != null) {
- forget(sid);
- }
- return(primary);
- }
- /**
- * Is a subscription redirected?
- */
- public synchronized boolean isRedirected(String sid) {
- return(sid != null && sid2secondary.get(sid) != null);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+import java.io.*;
+
+/**
+ * Track redirections of subscriptions
+ */
+public class RedirManager {
+ private Hashtable<String, String> sid2primary = new Hashtable<String, String>();
+ private Hashtable<String, String> sid2secondary = new Hashtable<String, String>();
+ private String redirfile;
+ RateLimitedOperation op;
+
+ /**
+ * Create a mechanism for maintaining subscription redirections.
+ *
+ * @param redirfile The file to store the redirection information.
+ * @param mininterval The minimum number of milliseconds between writes to the redirection information file.
+ * @param timer The timer thread used to run delayed file writes.
+ */
+ public RedirManager(String redirfile, long mininterval, Timer timer) {
+ this.redirfile = redirfile;
+ op = new RateLimitedOperation(mininterval, timer) {
+ public void run() {
+ try {
+ StringBuffer sb = new StringBuffer();
+ for (String s : sid2primary.keySet()) {
+ sb.append(s).append(' ').append(sid2primary.get(s)).append(' ').append(sid2secondary.get(s)).append('\n');
+ }
+ OutputStream os = new FileOutputStream(RedirManager.this.redirfile);
+ os.write(sb.toString().getBytes());
+ os.close();
+ } catch (Exception e) {
+ }
+ }
+ };
+ try {
+ String s;
+ BufferedReader br = new BufferedReader(new FileReader(redirfile));
+ while ((s = br.readLine()) != null) {
+ s = s.trim();
+ String[] sx = s.split(" ");
+ if (s.startsWith("#") || sx.length != 3) {
+ continue;
+ }
+ sid2primary.put(sx[0], sx[1]);
+ sid2secondary.put(sx[0], sx[2]);
+ }
+ br.close();
+ } catch (Exception e) {
+ // missing file is normal
+ }
+ }
+
+ /**
+ * Set up redirection. If a request is to be sent to subscription ID sid, and that is configured to go to URL primary, instead, go to secondary.
+ *
+ * @param sid The subscription ID to be redirected
+ * @param primary The URL associated with that subscription ID
+ * @param secondary The replacement URL to use instead
+ */
+ public synchronized void redirect(String sid, String primary, String secondary) {
+ sid2primary.put(sid, primary);
+ sid2secondary.put(sid, secondary);
+ op.request();
+ }
+
+ /**
+ * Cancel redirection. If a request is to be sent to subscription ID sid, send it to its primary URL.
+ *
+ * @param sid The subscription ID to remove from the table.
+ */
+ public synchronized void forget(String sid) {
+ sid2primary.remove(sid);
+ sid2secondary.remove(sid);
+ op.request();
+ }
+
+ /**
+ * Look up where to send a subscription. If the primary has changed or there is no redirection, use the primary. Otherwise, redirect to the secondary URL.
+ *
+ * @param sid The subscription ID to look up.
+ * @param primary The configured primary URL.
+ * @return The destination URL to really use.
+ */
+ public synchronized String lookup(String sid, String primary) {
+ String oprim = sid2primary.get(sid);
+ if (primary.equals(oprim)) {
+ return (sid2secondary.get(sid));
+ } else if (oprim != null) {
+ forget(sid);
+ }
+ return (primary);
+ }
+
+ /**
+ * Is a subscription redirected?
+ */
+ public synchronized boolean isRedirected(String sid) {
+ return (sid != null && sid2secondary.get(sid) != null);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/StatusLog.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/StatusLog.java
index 109eef27..43c4fda4 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/StatusLog.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/StatusLog.java
@@ -1,229 +1,249 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.regex.*;
-import java.util.*;
-import java.io.*;
-import java.nio.file.*;
-import java.text.*;
-
-/**
- * Logging for data router delivery events (PUB/DEL/EXP)
- */
-public class StatusLog {
- private static StatusLog instance = new StatusLog();
- private HashSet<String> toship = new HashSet<String>();
- private SimpleDateFormat filedate;
- private String prefix = "logs/events";
- private String suffix = ".log";
- private String plainfile;
- private String curfile;
- private long nexttime;
- private OutputStream os;
- private long intvl;
- private NodeConfigManager config = NodeConfigManager.getInstance();
- {
- try { filedate = new SimpleDateFormat("-yyyyMMddHHmm"); } catch (Exception e) {}
- }
- /**
- * Parse an interval of the form xxhyymzzs and round it to the nearest whole fraction of 24 hours. If no units are specified, assume seconds.
- */
- public static long parseInterval(String interval, int def) {
- try {
- Matcher m = Pattern.compile("(?:(\\d+)[Hh])?(?:(\\d+)[Mm])?(?:(\\d+)[Ss]?)?").matcher(interval);
- if (m.matches()) {
- int dur = 0;
- String x = m.group(1);
- if (x != null) {
- dur += 3600 * Integer.parseInt(x);
- }
- x = m.group(2);
- if (x != null) {
- dur += 60 * Integer.parseInt(x);
- }
- x = m.group(3);
- if (x != null) {
- dur += Integer.parseInt(x);
- }
- if (dur < 60) {
- dur = 60;
- }
- int best = 86400;
- int dist = best - dur;
- if (dur > best) {
- dist = dur - best;
- }
- int base = 1;
- for (int i = 0; i < 8; i++) {
- int base2 = base;
- base *= 2;
- for (int j = 0; j < 4; j++) {
- int base3 = base2;
- base2 *= 3;
- for (int k = 0; k < 3; k++) {
- int cur = base3;
- base3 *= 5;
- int ndist = cur - dur;
- if (dur > cur) {
- ndist = dur - cur;
- }
- if (ndist < dist) {
- best = cur;
- dist = ndist;
- }
- }
- }
- }
- def = best * 1000;
- }
- } catch (Exception e) {
- }
- return(def);
- }
- private synchronized void checkRoll(long now) throws IOException {
- if (now >= nexttime) {
- if (os != null) {
- os.close();
- os = null;
- }
- intvl = parseInterval(config.getEventLogInterval(), 300000);
- prefix = config.getEventLogPrefix();
- suffix = config.getEventLogSuffix();
- nexttime = now - now % intvl + intvl;
- curfile = prefix + filedate.format(new Date(nexttime - intvl)) + suffix;
- plainfile = prefix + suffix;
- notify();
- }
- }
- /**
- * Get the name of the current log file
- * @return The full path name of the current event log file
- */
- public static synchronized String getCurLogFile() {
- try {
- instance.checkRoll(System.currentTimeMillis());
- } catch (Exception e) {
- }
- return(instance.curfile);
- }
- private synchronized void log(String s) {
- try {
- long now = System.currentTimeMillis();
- checkRoll(now);
- if (os == null) {
- os = new FileOutputStream(curfile, true);
- (new File(plainfile)).delete();
- Files.createLink(Paths.get(plainfile), Paths.get(curfile));
- }
- os.write((NodeUtils.logts(new Date(now)) + '|' + s + '\n').getBytes());
- os.flush();
- } catch (IOException ioe) {
- }
- }
- /**
- * Log a received publication attempt.
- * @param pubid The publish ID assigned by the node
- * @param feedid The feed id given by the publisher
- * @param requrl The URL of the received request
- * @param method The method (DELETE or PUT) in the received request
- * @param ctype The content type (if method is PUT and clen > 0)
- * @param clen The content length (if method is PUT)
- * @param srcip The IP address of the publisher
- * @param user The identity of the publisher
- * @param status The status returned to the publisher
- */
- public static void logPub(String pubid, String feedid, String requrl, String method, String ctype, long clen, String srcip, String user, int status) {
- instance.log("PUB|" + pubid + "|" + feedid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + srcip + "|" + user + "|" + status);
- }
- /**
- * Log a data transfer error receiving a publication attempt
- * @param pubid The publish ID assigned by the node
- * @param feedid The feed id given by the publisher
- * @param requrl The URL of the received request
- * @param method The method (DELETE or PUT) in the received request
- * @param ctype The content type (if method is PUT and clen > 0)
- * @param clen The expected content length (if method is PUT)
- * @param rcvd The content length received
- * @param srcip The IP address of the publisher
- * @param user The identity of the publisher
- * @param error The error message from the IO exception
- */
- public static void logPubFail(String pubid, String feedid, String requrl, String method, String ctype, long clen, long rcvd, String srcip, String user, String error) {
- instance.log("PBF|" + pubid + "|" + feedid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + rcvd + "|" + srcip + "|" + user + "|" + error);
- }
- /**
- * Log a delivery attempt.
- * @param pubid The publish ID assigned by the node
- * @param feedid The feed ID
- * @param subid The (space delimited list of) subscription ID
- * @param requrl The URL used in the attempt
- * @param method The method (DELETE or PUT) in the attempt
- * @param ctype The content type (if method is PUT, not metaonly, and clen > 0)
- * @param clen The content length (if PUT and not metaonly)
- * @param user The identity given to the subscriber
- * @param status The status returned by the subscriber or -1 if an exeception occured trying to connect
- * @param xpubid The publish ID returned by the subscriber
- */
- public static void logDel(String pubid, String feedid, String subid, String requrl, String method, String ctype, long clen, String user, int status, String xpubid) {
- if (feedid == null) {
- return;
- }
- instance.log("DEL|" + pubid + "|" + feedid + "|" + subid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + user + "|" + status + "|" + xpubid);
- }
- /**
- * Log delivery attempts expired
- * @param pubid The publish ID assigned by the node
- * @param feedid The feed ID
- * @param subid The (space delimited list of) subscription ID
- * @param requrl The URL that would be delivered to
- * @param method The method (DELETE or PUT) in the request
- * @param ctype The content type (if method is PUT, not metaonly, and clen > 0)
- * @param clen The content length (if PUT and not metaonly)
- * @param reason The reason the attempts were discontinued
- * @param attempts The number of attempts made
- */
- public static void logExp(String pubid, String feedid, String subid, String requrl, String method, String ctype, long clen, String reason, int attempts) {
- if (feedid == null) {
- return;
- }
- instance.log("EXP|" + pubid + "|" + feedid + "|" + subid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + reason + "|" + attempts);
- }
- /**
- * Log extra statistics about unsuccessful delivery attempts.
- * @param pubid The publish ID assigned by the node
- * @param feedid The feed ID
- * @param subid The (space delimited list of) subscription ID
- * @param clen The content length
- * @param sent The # of bytes sent or -1 if subscriber returned an error instead of 100 Continue, otherwise, the number of bytes sent before an error occurred.
- */
- public static void logDelExtra(String pubid, String feedid, String subid, long clen, long sent) {
- if (feedid == null) {
- return;
- }
- instance.log("DLX|" + pubid + "|" + feedid + "|" + subid + "|" + clen + "|" + sent);
- }
- private StatusLog() {
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.regex.*;
+import java.util.*;
+import java.io.*;
+import java.nio.file.*;
+import java.text.*;
+
+/**
+ * Logging for data router delivery events (PUB/DEL/EXP)
+ */
+public class StatusLog {
+ private static StatusLog instance = new StatusLog();
+ private HashSet<String> toship = new HashSet<String>();
+ private SimpleDateFormat filedate;
+ private String prefix = "logs/events";
+ private String suffix = ".log";
+ private String plainfile;
+ private String curfile;
+ private long nexttime;
+ private OutputStream os;
+ private long intvl;
+ private NodeConfigManager config = NodeConfigManager.getInstance();
+
+ {
+ try {
+ filedate = new SimpleDateFormat("-yyyyMMddHHmm");
+ } catch (Exception e) {
+ }
+ }
+
+ /**
+ * Parse an interval of the form xxhyymzzs and round it to the nearest whole fraction of 24 hours. If no units are specified, assume seconds.
+ */
+ public static long parseInterval(String interval, int def) {
+ try {
+ Matcher m = Pattern.compile("(?:(\\d+)[Hh])?(?:(\\d+)[Mm])?(?:(\\d+)[Ss]?)?").matcher(interval);
+ if (m.matches()) {
+ int dur = 0;
+ String x = m.group(1);
+ if (x != null) {
+ dur += 3600 * Integer.parseInt(x);
+ }
+ x = m.group(2);
+ if (x != null) {
+ dur += 60 * Integer.parseInt(x);
+ }
+ x = m.group(3);
+ if (x != null) {
+ dur += Integer.parseInt(x);
+ }
+ if (dur < 60) {
+ dur = 60;
+ }
+ int best = 86400;
+ int dist = best - dur;
+ if (dur > best) {
+ dist = dur - best;
+ }
+ int base = 1;
+ for (int i = 0; i < 8; i++) {
+ int base2 = base;
+ base *= 2;
+ for (int j = 0; j < 4; j++) {
+ int base3 = base2;
+ base2 *= 3;
+ for (int k = 0; k < 3; k++) {
+ int cur = base3;
+ base3 *= 5;
+ int ndist = cur - dur;
+ if (dur > cur) {
+ ndist = dur - cur;
+ }
+ if (ndist < dist) {
+ best = cur;
+ dist = ndist;
+ }
+ }
+ }
+ }
+ def = best * 1000;
+ }
+ } catch (Exception e) {
+ }
+ return (def);
+ }
+
+ private synchronized void checkRoll(long now) throws IOException {
+ if (now >= nexttime) {
+ if (os != null) {
+ os.close();
+ os = null;
+ }
+ intvl = parseInterval(config.getEventLogInterval(), 300000);
+ prefix = config.getEventLogPrefix();
+ suffix = config.getEventLogSuffix();
+ nexttime = now - now % intvl + intvl;
+ curfile = prefix + filedate.format(new Date(nexttime - intvl)) + suffix;
+ plainfile = prefix + suffix;
+ notify();
+ }
+ }
+
+ /**
+ * Get the name of the current log file
+ *
+ * @return The full path name of the current event log file
+ */
+ public static synchronized String getCurLogFile() {
+ try {
+ instance.checkRoll(System.currentTimeMillis());
+ } catch (Exception e) {
+ }
+ return (instance.curfile);
+ }
+
+ private synchronized void log(String s) {
+ try {
+ long now = System.currentTimeMillis();
+ checkRoll(now);
+ if (os == null) {
+ os = new FileOutputStream(curfile, true);
+ (new File(plainfile)).delete();
+ Files.createLink(Paths.get(plainfile), Paths.get(curfile));
+ }
+ os.write((NodeUtils.logts(new Date(now)) + '|' + s + '\n').getBytes());
+ os.flush();
+ } catch (IOException ioe) {
+ }
+ }
+
+ /**
+ * Log a received publication attempt.
+ *
+ * @param pubid The publish ID assigned by the node
+ * @param feedid The feed id given by the publisher
+ * @param requrl The URL of the received request
+ * @param method The method (DELETE or PUT) in the received request
+ * @param ctype The content type (if method is PUT and clen > 0)
+ * @param clen The content length (if method is PUT)
+ * @param srcip The IP address of the publisher
+ * @param user The identity of the publisher
+ * @param status The status returned to the publisher
+ */
+ public static void logPub(String pubid, String feedid, String requrl, String method, String ctype, long clen, String srcip, String user, int status) {
+ instance.log("PUB|" + pubid + "|" + feedid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + srcip + "|" + user + "|" + status);
+ }
+
+ /**
+ * Log a data transfer error receiving a publication attempt
+ *
+ * @param pubid The publish ID assigned by the node
+ * @param feedid The feed id given by the publisher
+ * @param requrl The URL of the received request
+ * @param method The method (DELETE or PUT) in the received request
+ * @param ctype The content type (if method is PUT and clen > 0)
+ * @param clen The expected content length (if method is PUT)
+ * @param rcvd The content length received
+ * @param srcip The IP address of the publisher
+ * @param user The identity of the publisher
+ * @param error The error message from the IO exception
+ */
+ public static void logPubFail(String pubid, String feedid, String requrl, String method, String ctype, long clen, long rcvd, String srcip, String user, String error) {
+ instance.log("PBF|" + pubid + "|" + feedid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + rcvd + "|" + srcip + "|" + user + "|" + error);
+ }
+
+ /**
+ * Log a delivery attempt.
+ *
+ * @param pubid The publish ID assigned by the node
+ * @param feedid The feed ID
+ * @param subid The (space delimited list of) subscription ID
+ * @param requrl The URL used in the attempt
+ * @param method The method (DELETE or PUT) in the attempt
+ * @param ctype The content type (if method is PUT, not metaonly, and clen > 0)
+ * @param clen The content length (if PUT and not metaonly)
+ * @param user The identity given to the subscriber
+ * @param status The status returned by the subscriber or -1 if an exeception occured trying to connect
+ * @param xpubid The publish ID returned by the subscriber
+ */
+ public static void logDel(String pubid, String feedid, String subid, String requrl, String method, String ctype, long clen, String user, int status, String xpubid) {
+ if (feedid == null) {
+ return;
+ }
+ instance.log("DEL|" + pubid + "|" + feedid + "|" + subid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + user + "|" + status + "|" + xpubid);
+ }
+
+ /**
+ * Log delivery attempts expired
+ *
+ * @param pubid The publish ID assigned by the node
+ * @param feedid The feed ID
+ * @param subid The (space delimited list of) subscription ID
+ * @param requrl The URL that would be delivered to
+ * @param method The method (DELETE or PUT) in the request
+ * @param ctype The content type (if method is PUT, not metaonly, and clen > 0)
+ * @param clen The content length (if PUT and not metaonly)
+ * @param reason The reason the attempts were discontinued
+ * @param attempts The number of attempts made
+ */
+ public static void logExp(String pubid, String feedid, String subid, String requrl, String method, String ctype, long clen, String reason, int attempts) {
+ if (feedid == null) {
+ return;
+ }
+ instance.log("EXP|" + pubid + "|" + feedid + "|" + subid + "|" + requrl + "|" + method + "|" + ctype + "|" + clen + "|" + reason + "|" + attempts);
+ }
+
+ /**
+ * Log extra statistics about unsuccessful delivery attempts.
+ *
+ * @param pubid The publish ID assigned by the node
+ * @param feedid The feed ID
+ * @param subid The (space delimited list of) subscription ID
+ * @param clen The content length
+ * @param sent The # of bytes sent or -1 if subscriber returned an error instead of 100 Continue, otherwise, the number of bytes sent before an error occurred.
+ */
+ public static void logDelExtra(String pubid, String feedid, String subid, long clen, long sent) {
+ if (feedid == null) {
+ return;
+ }
+ instance.log("DLX|" + pubid + "|" + feedid + "|" + subid + "|" + clen + "|" + sent);
+ }
+
+ private StatusLog() {
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/SubnetMatcher.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/SubnetMatcher.java
index f353d513..2e83e222 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/SubnetMatcher.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/SubnetMatcher.java
@@ -1,71 +1,75 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.net.*;
-
-/**
- * Compare IP addresses as byte arrays to a subnet specified as a CIDR
- */
-public class SubnetMatcher {
- private byte[] sn;
- private int len;
- private int mask;
- /**
- * Construct a subnet matcher given a CIDR
- * @param subnet The CIDR to match
- */
- public SubnetMatcher(String subnet) {
- int i = subnet.lastIndexOf('/');
- if (i == -1) {
- sn = NodeUtils.getInetAddress(subnet);
- len = sn.length;
- } else {
- len = Integer.parseInt(subnet.substring(i + 1));
- sn = NodeUtils.getInetAddress(subnet.substring(0, i));
- mask = ((0xff00) >> (len % 8)) & 0xff;
- len /= 8;
- }
- }
- /**
- * Is the IP address in the CIDR?
- * @param addr the IP address as bytes in network byte order
- * @return true if the IP address matches.
- */
- public boolean matches(byte[] addr) {
- if (addr.length != sn.length) {
- return(false);
- }
- for (int i = 0; i < len; i++) {
- if (addr[i] != sn[i]) {
- return(false);
- }
- }
- if (mask != 0 && ((addr[len] ^ sn[len]) & mask) != 0) {
- return(false);
- }
- return(true);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.net.*;
+
+/**
+ * Compare IP addresses as byte arrays to a subnet specified as a CIDR
+ */
+public class SubnetMatcher {
+ private byte[] sn;
+ private int len;
+ private int mask;
+
+ /**
+ * Construct a subnet matcher given a CIDR
+ *
+ * @param subnet The CIDR to match
+ */
+ public SubnetMatcher(String subnet) {
+ int i = subnet.lastIndexOf('/');
+ if (i == -1) {
+ sn = NodeUtils.getInetAddress(subnet);
+ len = sn.length;
+ } else {
+ len = Integer.parseInt(subnet.substring(i + 1));
+ sn = NodeUtils.getInetAddress(subnet.substring(0, i));
+ mask = ((0xff00) >> (len % 8)) & 0xff;
+ len /= 8;
+ }
+ }
+
+ /**
+ * Is the IP address in the CIDR?
+ *
+ * @param addr the IP address as bytes in network byte order
+ * @return true if the IP address matches.
+ */
+ public boolean matches(byte[] addr) {
+ if (addr.length != sn.length) {
+ return (false);
+ }
+ for (int i = 0; i < len; i++) {
+ if (addr[i] != sn[i]) {
+ return (false);
+ }
+ }
+ if (mask != 0 && ((addr[len] ^ sn[len]) & mask) != 0) {
+ return (false);
+ }
+ return (true);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Target.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Target.java
index eeb18408..eb10876e 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Target.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/Target.java
@@ -1,60 +1,65 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-/**
- * A destination to deliver a message
- */
-public class Target {
- private DestInfo destinfo;
- private String routing;
- /**
- * A destination to deliver a message
- * @param destinfo Either info for a subscription ID or info for a node-to-node transfer
- * @param routing For a node-to-node transfer, what to do when it gets there.
- */
- public Target(DestInfo destinfo, String routing) {
- this.destinfo = destinfo;
- this.routing = routing;
- }
- /**
- * Add additional routing
- */
- public void addRouting(String routing) {
- this.routing = this.routing + " " + routing;
- }
- /**
- * Get the destination information for this target
- */
- public DestInfo getDestInfo() {
- return(destinfo);
- }
- /**
- * Get the next hop information for this target
- */
- public String getRouting() {
- return(routing);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+/**
+ * A destination to deliver a message
+ */
+public class Target {
+ private DestInfo destinfo;
+ private String routing;
+
+ /**
+ * A destination to deliver a message
+ *
+ * @param destinfo Either info for a subscription ID or info for a node-to-node transfer
+ * @param routing For a node-to-node transfer, what to do when it gets there.
+ */
+ public Target(DestInfo destinfo, String routing) {
+ this.destinfo = destinfo;
+ this.routing = routing;
+ }
+
+ /**
+ * Add additional routing
+ */
+ public void addRouting(String routing) {
+ this.routing = this.routing + " " + routing;
+ }
+
+ /**
+ * Get the destination information for this target
+ */
+ public DestInfo getDestInfo() {
+ return (destinfo);
+ }
+
+ /**
+ * Get the next hop information for this target
+ */
+ public String getRouting() {
+ return (routing);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/TaskList.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/TaskList.java
index c8d58e6e..33e4f801 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/TaskList.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/TaskList.java
@@ -1,113 +1,118 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.node;
-
-import java.util.*;
-
-/**
- * Manage a list of tasks to be executed when an event occurs.
- * This makes the following guarantees:
- * <ul>
- * <li>Tasks can be safely added and removed in the middle of a run.</li>
- * <li>No task will be returned more than once during a run.</li>
- * <li>No task will be returned when it is not, at that moment, in the list of tasks.</li>
- * <li>At the moment when next() returns null, all tasks on the list have been returned during the run.</li>
- * <li>Initially and once next() returns null during a run, next() will continue to return null until startRun() is called.
- * </ul>
- */
-public class TaskList {
- private Iterator<Runnable> runlist;
- private HashSet<Runnable> tasks = new HashSet<Runnable>();
- private HashSet<Runnable> togo;
- private HashSet<Runnable> sofar;
- private HashSet<Runnable> added;
- private HashSet<Runnable> removed;
- /**
- * Construct a new TaskList
- */
- public TaskList() {
- }
- /**
- * Start executing the sequence of tasks.
- */
- public synchronized void startRun() {
- sofar = new HashSet<Runnable>();
- added = new HashSet<Runnable>();
- removed = new HashSet<Runnable>();
- togo = new HashSet<Runnable>(tasks);
- runlist = togo.iterator();
- }
- /**
- * Get the next task to execute
- */
- public synchronized Runnable next() {
- while (runlist != null) {
- if (runlist.hasNext()) {
- Runnable task = runlist.next();
- if (removed.contains(task)) {
- continue;
- }
- if (sofar.contains(task)) {
- continue;
- }
- sofar.add(task);
- return(task);
- }
- if (added.size() != 0) {
- togo = added;
- added = new HashSet<Runnable>();
- removed.clear();
- runlist = togo.iterator();
- continue;
- }
- togo = null;
- added = null;
- removed = null;
- sofar = null;
- runlist = null;
- }
- return(null);
- }
- /**
- * Add a task to the list of tasks to run whenever the event occurs.
- */
- public synchronized void addTask(Runnable task) {
- if (runlist != null) {
- added.add(task);
- removed.remove(task);
- }
- tasks.add(task);
- }
- /**
- * Remove a task from the list of tasks to run whenever the event occurs.
- */
- public synchronized void removeTask(Runnable task) {
- if (runlist != null) {
- removed.add(task);
- added.remove(task);
- }
- tasks.remove(task);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.node;
+
+import java.util.*;
+
+/**
+ * Manage a list of tasks to be executed when an event occurs.
+ * This makes the following guarantees:
+ * <ul>
+ * <li>Tasks can be safely added and removed in the middle of a run.</li>
+ * <li>No task will be returned more than once during a run.</li>
+ * <li>No task will be returned when it is not, at that moment, in the list of tasks.</li>
+ * <li>At the moment when next() returns null, all tasks on the list have been returned during the run.</li>
+ * <li>Initially and once next() returns null during a run, next() will continue to return null until startRun() is called.
+ * </ul>
+ */
+public class TaskList {
+ private Iterator<Runnable> runlist;
+ private HashSet<Runnable> tasks = new HashSet<Runnable>();
+ private HashSet<Runnable> togo;
+ private HashSet<Runnable> sofar;
+ private HashSet<Runnable> added;
+ private HashSet<Runnable> removed;
+
+ /**
+ * Construct a new TaskList
+ */
+ public TaskList() {
+ }
+
+ /**
+ * Start executing the sequence of tasks.
+ */
+ public synchronized void startRun() {
+ sofar = new HashSet<Runnable>();
+ added = new HashSet<Runnable>();
+ removed = new HashSet<Runnable>();
+ togo = new HashSet<Runnable>(tasks);
+ runlist = togo.iterator();
+ }
+
+ /**
+ * Get the next task to execute
+ */
+ public synchronized Runnable next() {
+ while (runlist != null) {
+ if (runlist.hasNext()) {
+ Runnable task = runlist.next();
+ if (removed.contains(task)) {
+ continue;
+ }
+ if (sofar.contains(task)) {
+ continue;
+ }
+ sofar.add(task);
+ return (task);
+ }
+ if (added.size() != 0) {
+ togo = added;
+ added = new HashSet<Runnable>();
+ removed.clear();
+ runlist = togo.iterator();
+ continue;
+ }
+ togo = null;
+ added = null;
+ removed = null;
+ sofar = null;
+ runlist = null;
+ }
+ return (null);
+ }
+
+ /**
+ * Add a task to the list of tasks to run whenever the event occurs.
+ */
+ public synchronized void addTask(Runnable task) {
+ if (runlist != null) {
+ added.add(task);
+ removed.remove(task);
+ }
+ tasks.add(task);
+ }
+
+ /**
+ * Remove a task from the list of tasks to run whenever the event occurs.
+ */
+ public synchronized void removeTask(Runnable task) {
+ if (runlist != null) {
+ removed.add(task);
+ added.remove(task);
+ }
+ tasks.remove(task);
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EELFFilter.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EELFFilter.java
index 225205ca..b733e7e4 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EELFFilter.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EELFFilter.java
@@ -1,43 +1,43 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-package org.onap.dmaap.datarouter.node.eelf;
-
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.core.filter.Filter;
-import ch.qos.logback.core.spi.FilterReply;
-
-/*
- * When EELF functionality added it default started logging Jetty logs as well which in turn stopped existing functionality of logging jetty statements in node.log
- * added code in logback.xml to add jetty statements in node.log.
- * This class removes extran EELF statements from node.log since they are being logged in apicalls.log
- */
-public class EELFFilter extends Filter<ILoggingEvent>{
- @Override
- public FilterReply decide(ILoggingEvent event) {
- if (event.getMessage().contains("EELF")) {
- return FilterReply.DENY;
- } else {
- return FilterReply.ACCEPT;
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package org.onap.dmaap.datarouter.node.eelf;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.filter.Filter;
+import ch.qos.logback.core.spi.FilterReply;
+
+/*
+ * When EELF functionality added it default started logging Jetty logs as well which in turn stopped existing functionality of logging jetty statements in node.log
+ * added code in logback.xml to add jetty statements in node.log.
+ * This class removes extran EELF statements from node.log since they are being logged in apicalls.log
+ */
+public class EELFFilter extends Filter<ILoggingEvent> {
+ @Override
+ public FilterReply decide(ILoggingEvent event) {
+ if (event.getMessage().contains("EELF")) {
+ return FilterReply.DENY;
+ } else {
+ return FilterReply.ACCEPT;
+ }
+ }
+}
diff --git a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EelfMsgs.java b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EelfMsgs.java
index 509bceea..7ebe4b53 100644
--- a/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EelfMsgs.java
+++ b/datarouter-node/src/main/java/org/onap/dmaap/datarouter/node/eelf/EelfMsgs.java
@@ -1,96 +1,96 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-package org.onap.dmaap.datarouter.node.eelf;
-
-import com.att.eelf.i18n.EELFResolvableErrorEnum;
-import com.att.eelf.i18n.EELFResourceManager;
-
-public enum EelfMsgs implements EELFResolvableErrorEnum {
-
- /**
- * Application message prints user (accepts one argument)
- */
- MESSAGE_WITH_BEHALF,
-
- /**
- * Application message prints user and FeedID (accepts two arguments)
- */
-
- MESSAGE_WITH_BEHALF_AND_FEEDID,
-
- /**
- * Application message prints keystore file error in EELF errors log
- */
-
- MESSAGE_KEYSTORE_LOAD_ERROR,
-
- /**
- * Application message prints Error extracting my name from my keystore file
- */
-
- MESSAGE_KEYSORE_NAME_ERROR,
-
- /**
- * Application message prints Error parsing configuration data from provisioning server.
- */
-
-
- MESSAGE_PARSING_ERROR,
-
- /**
- * Application message printsConfiguration failed
- */
-
-
- MESSAGE_CONF_FAILED,
-
- /**
- * Application message prints Bad provisioning server URL
- */
-
-
- MESSAGE_BAD_PROV_URL,
-
- /**
- * Application message prints Unable to fetch canonical name from keystore file
- */
-
-
- MESSAGE_KEYSTORE_FETCH_ERROR,
-
- /**
- * Application message prints Unable to load local configuration file.
- */
-
-
- MESSAGE_PROPERTIES_LOAD_ERROR;
-
-
- /**
- * Static initializer to ensure the resource bundles for this class are loaded...
- * Here this application loads messages from three bundles
- */
- static {
- EELFResourceManager.loadMessageBundle("EelfMessages");
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package org.onap.dmaap.datarouter.node.eelf;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
+
+public enum EelfMsgs implements EELFResolvableErrorEnum {
+
+ /**
+ * Application message prints user (accepts one argument)
+ */
+ MESSAGE_WITH_BEHALF,
+
+ /**
+ * Application message prints user and FeedID (accepts two arguments)
+ */
+
+ MESSAGE_WITH_BEHALF_AND_FEEDID,
+
+ /**
+ * Application message prints keystore file error in EELF errors log
+ */
+
+ MESSAGE_KEYSTORE_LOAD_ERROR,
+
+ /**
+ * Application message prints Error extracting my name from my keystore file
+ */
+
+ MESSAGE_KEYSORE_NAME_ERROR,
+
+ /**
+ * Application message prints Error parsing configuration data from provisioning server.
+ */
+
+
+ MESSAGE_PARSING_ERROR,
+
+ /**
+ * Application message printsConfiguration failed
+ */
+
+
+ MESSAGE_CONF_FAILED,
+
+ /**
+ * Application message prints Bad provisioning server URL
+ */
+
+
+ MESSAGE_BAD_PROV_URL,
+
+ /**
+ * Application message prints Unable to fetch canonical name from keystore file
+ */
+
+
+ MESSAGE_KEYSTORE_FETCH_ERROR,
+
+ /**
+ * Application message prints Unable to load local configuration file.
+ */
+
+
+ MESSAGE_PROPERTIES_LOAD_ERROR;
+
+
+ /**
+ * Static initializer to ensure the resource bundles for this class are loaded...
+ * Here this application loads messages from three bundles
+ */
+ static {
+ EELFResourceManager.loadMessageBundle("EelfMessages");
+ }
+}
diff --git a/datarouter-node/src/main/resources/logback.xml b/datarouter-node/src/main/resources/logback.xml
index 11d22c74..b5528468 100644
--- a/datarouter-node/src/main/resources/logback.xml
+++ b/datarouter-node/src/main/resources/logback.xml
@@ -1,405 +1,405 @@
-<!--
- ============LICENSE_START==================================================
- * org.onap.dmaap
- * ===========================================================================
- * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * ===========================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END====================================================
- *
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- *
--->
-<configuration scan="true" scanPeriod="3 seconds" debug="true">
- <!--<jmxConfigurator /> -->
- <!-- directory path for all other type logs -->
- <!-- property name="logDir" value="/home/eby/dr2/logs" / -->
- <property name="logDir" value="/opt/app/datartr/logs" />
-
- <!-- directory path for debugging type logs -->
- <!-- property name="debugDir" value="/home/eby/dr2/debug-logs" /-->
-
- <!-- specify the component name
- <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC" -->
- <!-- This creates the MSO directory in in the LogDir which is not needed, mentioned last directory of the path-->
- <!-- property name="componentName" value="logs"></property -->
-
- <!-- log file names -->
- <property name="generalLogName" value="apicalls" />
- <!-- name="securityLogName" value="security" -->
- <!-- name="performanceLogName" value="performance" -->
- <!-- name="serverLogName" value="server" -->
- <!-- name="policyLogName" value="policy"-->
- <property name="errorLogName" value="errors" />
- <!-- name="metricsLogName" value="metrics" -->
- <!-- name="auditLogName" value="audit" -->
- <!-- name="debugLogName" value="debug" -->
- <property name="jettyAndNodeLogName" value="node"></property>
- <property name="defaultPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%msg%n" />
- <property name="jettyAndNodeLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%thread|%.-5level|%msg%n" />
-
- <property name="debugLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />
-
- <property name="logDirectory" value="${logDir}" />
- <!-- property name="debugLogDirectory" value="${debugDir}/${componentName}" /-->
-
-
- <!-- Example evaluator filter applied against console appender -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>${defaultPattern}</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>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>INFO</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${generalLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELF" />
- </appender>
-
- <!-- EELF Security Appender. This appender is used to record security events
- to the security log file. Security events are separate from other loggers
- in EELF so that security log records can be captured and managed in a secure
- way separate from the other logs. This appender is set to never discard any
- events. -->
- <!--appender name="EELFSecurity"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${securityLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${securityLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <discardingThreshold>0</discardingThreshold>
- <appender-ref ref="EELFSecurity" />
- </appender-->
-
- <!-- EELF Performance Appender. This appender is used to record performance
- records. -->
- <!--appender name="EELFPerformance"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${performanceLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <outputPatternAsHeader>true</outputPatternAsHeader>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPerformance" />
- </appender-->
-
- <!-- EELF Server Appender. This appender is used to record Server related
- logging events. The Server logger and appender are specializations of the
- EELF application root logger and appender. This can be used to segregate Server
- events from other components, or it can be eliminated to record these events
- as part of the application root log. -->
- <!--appender name="EELFServer"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${serverLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${serverLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFServer" />
- </appender-->
-
-
- <!-- EELF Policy Appender. This appender is used to record Policy engine
- related logging events. The Policy 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="EELFPolicy"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${policyLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${policyLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPolicy" >
- </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.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${auditLogName}.%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>${defaultPattern}</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.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${metricsLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
-
- <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFMetrics"/>
- </appender-->
-
- <appender name="EELFError"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${errorLogName}.log</file>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERROR</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${errorLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFError"/>
- </appender>
-
- <!-- ============================================================================ -->
- <appender name="jettyAndNodelog"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${jettyAndNodeLogName}.log</file>
- <filter class="org.onap.dmaap.datarouter.node.eelf.EELFFilter" />
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${jettyAndNodeLogName}.%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>${jettyAndNodeLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFjettyAndNodelog" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="jettyAndNodelog" />
- <includeCallerData>true</includeCallerData>
- </appender>
-
- <!-- ============================================================================ -->
-
-
- <!--appender name="EELFDebug"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${debugLogDirectory}/${debugLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${debugLogDirectory}/${debugLogName}.%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>${debugLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFDebug" />
- <includeCallerData>true</includeCallerData>
- </appender-->
-
-
- <!-- ============================================================================ -->
- <!-- EELF loggers -->
- <!-- ============================================================================ -->
- <logger name="com.att.eelf" level="info" additivity="false">
- <appender-ref ref="asyncEELF" />
- </logger>
-
- <logger name="com.att.eelf.error" level="error" additivity="false">
- <appender-ref ref="asyncEELFError" />
- </logger>
-
- <logger name="log4j.logger.org.eclipse.jetty" additivity="false" level="info">
- <appender-ref ref="asyncEELFjettyAndNodelog"/>
- </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>
-
- <logger name="com.att.eelf.debug" level="debug" additivity="false">
- <appender-ref ref="asyncEELFDebug" />
- </logger-->
-
-
-
-
- <root level="INFO">
- <appender-ref ref="asyncEELF" />
- <appender-ref ref="asyncEELFError" />
- <appender-ref ref="asyncEELFjettyAndNodelog" />
- </root>
-
-</configuration>
+<!--
+ ============LICENSE_START==================================================
+ * org.onap.dmaap
+ * ===========================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ===========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END====================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *
+-->
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+ <!--<jmxConfigurator /> -->
+ <!-- directory path for all other type logs -->
+ <!-- property name="logDir" value="/home/eby/dr2/logs" / -->
+ <property name="logDir" value="/opt/app/datartr/logs" />
+
+ <!-- directory path for debugging type logs -->
+ <!-- property name="debugDir" value="/home/eby/dr2/debug-logs" /-->
+
+ <!-- specify the component name
+ <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC" -->
+ <!-- This creates the MSO directory in in the LogDir which is not needed, mentioned last directory of the path-->
+ <!-- property name="componentName" value="logs"></property -->
+
+ <!-- log file names -->
+ <property name="generalLogName" value="apicalls" />
+ <!-- name="securityLogName" value="security" -->
+ <!-- name="performanceLogName" value="performance" -->
+ <!-- name="serverLogName" value="server" -->
+ <!-- name="policyLogName" value="policy"-->
+ <property name="errorLogName" value="errors" />
+ <!-- name="metricsLogName" value="metrics" -->
+ <!-- name="auditLogName" value="audit" -->
+ <!-- name="debugLogName" value="debug" -->
+ <property name="jettyAndNodeLogName" value="node"></property>
+ <property name="defaultPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%msg%n" />
+ <property name="jettyAndNodeLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%thread|%.-5level|%msg%n" />
+
+ <property name="debugLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />
+
+ <property name="logDirectory" value="${logDir}" />
+ <!-- property name="debugLogDirectory" value="${debugDir}/${componentName}" /-->
+
+
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${defaultPattern}</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>
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${generalLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <!--appender name="EELFSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender-->
+
+ <!-- EELF Performance Appender. This appender is used to record performance
+ records. -->
+ <!--appender name="EELFPerformance"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${performanceLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <outputPatternAsHeader>true</outputPatternAsHeader>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPerformance" />
+ </appender-->
+
+ <!-- EELF Server Appender. This appender is used to record Server related
+ logging events. The Server logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate Server
+ events from other components, or it can be eliminated to record these events
+ as part of the application root log. -->
+ <!--appender name="EELFServer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${serverLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${serverLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFServer" />
+ </appender-->
+
+
+ <!-- EELF Policy Appender. This appender is used to record Policy engine
+ related logging events. The Policy 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="EELFPolicy"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${policyLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${policyLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPolicy" >
+ </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.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%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>${defaultPattern}</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.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics"/>
+ </appender-->
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>ERROR</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError"/>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <appender name="jettyAndNodelog"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${jettyAndNodeLogName}.log</file>
+ <filter class="org.onap.dmaap.datarouter.node.eelf.EELFFilter" />
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${jettyAndNodeLogName}.%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>${jettyAndNodeLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFjettyAndNodelog" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="jettyAndNodelog" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+ <!-- ============================================================================ -->
+
+
+ <!--appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%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>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender-->
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="info" additivity="false">
+ <appender-ref ref="asyncEELF" />
+ </logger>
+
+ <logger name="com.att.eelf.error" level="error" additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="log4j.logger.org.eclipse.jetty" additivity="false" level="info">
+ <appender-ref ref="asyncEELFjettyAndNodelog"/>
+ </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>
+
+ <logger name="com.att.eelf.debug" level="debug" additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+ </logger-->
+
+
+
+
+ <root level="INFO">
+ <appender-ref ref="asyncEELF" />
+ <appender-ref ref="asyncEELFError" />
+ <appender-ref ref="asyncEELFjettyAndNodelog" />
+ </root>
+
+</configuration>
diff --git a/datarouter-node/src/main/resources/misc/descriptor.xml b/datarouter-node/src/main/resources/misc/descriptor.xml
index 88fccc19..6ddcad23 100644
--- a/datarouter-node/src/main/resources/misc/descriptor.xml
+++ b/datarouter-node/src/main/resources/misc/descriptor.xml
@@ -1,53 +1,53 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ============LICENSE_START==================================================
- * org.onap.dmaap
- * ===========================================================================
- * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * ===========================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END====================================================
- *
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- *
--->
-<descriptor version="1" xmlns="http://aft.att.com/swm/descriptor">
- <platforms>
- <platform os="Linux" osVersions="*" architecture="*"/>
- </platforms>
- <paths>
- <path name="/opt/app/datartr" user="datartr" group="datartr" permissions="755,644" recursive="true"/>
- <path name="/opt/app/platform/init.d/drtrnode" user="datartr" group="datartr" permissions="755"/>
- </paths>
- <actions>
- <action type="INIT">
- <proc stage="POST" user="datartr" group="datartr"/>
- </action>
- <action type="FALL">
- <proc stage="PRE" user="datartr" group="datartr"/>
- <proc stage="POST" user="datartr" group="datartr"/>
- </action>
- <action type="INST">
- <proc stage="PRE" user="datartr" group="datartr"/>
- <proc stage="POST" user="datartr" group="datartr"/>
- </action>
- <action type="DINST">
- <proc stage="PRE" user="datartr" group="datartr"/>
- </action>
- </actions>
- <dependencies>
- <dependencyFilter componentName="com.att.java:jdk8lin" versions="[1.8.0.77-02]" sequence="1"/>
- <dependencyFilter componentName="com.att.platform:initd" versions="[1.0.15,)" sequence="2"/>
- <dependencyFilter componentName="com.att.dmaap.datarouter:util" versions="[1.0.7,)" sequence="3"/>
- </dependencies>
-</descriptor>
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ============LICENSE_START==================================================
+ * org.onap.dmaap
+ * ===========================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ===========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END====================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *
+-->
+<descriptor version="1" xmlns="http://aft.att.com/swm/descriptor">
+ <platforms>
+ <platform os="Linux" osVersions="*" architecture="*"/>
+ </platforms>
+ <paths>
+ <path name="/opt/app/datartr" user="datartr" group="datartr" permissions="755,644" recursive="true"/>
+ <path name="/opt/app/platform/init.d/drtrnode" user="datartr" group="datartr" permissions="755"/>
+ </paths>
+ <actions>
+ <action type="INIT">
+ <proc stage="POST" user="datartr" group="datartr"/>
+ </action>
+ <action type="FALL">
+ <proc stage="PRE" user="datartr" group="datartr"/>
+ <proc stage="POST" user="datartr" group="datartr"/>
+ </action>
+ <action type="INST">
+ <proc stage="PRE" user="datartr" group="datartr"/>
+ <proc stage="POST" user="datartr" group="datartr"/>
+ </action>
+ <action type="DINST">
+ <proc stage="PRE" user="datartr" group="datartr"/>
+ </action>
+ </actions>
+ <dependencies>
+ <dependencyFilter componentName="com.att.java:jdk8lin" versions="[1.8.0.77-02]" sequence="1"/>
+ <dependencyFilter componentName="com.att.platform:initd" versions="[1.0.15,)" sequence="2"/>
+ <dependencyFilter componentName="com.att.dmaap.datarouter:util" versions="[1.0.7,)" sequence="3"/>
+ </dependencies>
+</descriptor>
diff --git a/datarouter-node/src/main/resources/misc/doaction b/datarouter-node/src/main/resources/misc/doaction
index 654afb62..0be002b7 100644
--- a/datarouter-node/src/main/resources/misc/doaction
+++ b/datarouter-node/src/main/resources/misc/doaction
@@ -24,38 +24,38 @@ for action in "$@"
do
case "$action" in
'backup')
- cp log4j.properties log4j.properties.save 2>/dev/null
- cp node.properties node.properties.save 2>/dev/null
- cp havecert havecert.save 2>/dev/null
- ;;
+ cp log4j.properties log4j.properties.save 2>/dev/null
+ cp node.properties node.properties.save 2>/dev/null
+ cp havecert havecert.save 2>/dev/null
+ ;;
'stop')
- /opt/app/platform/init.d/drtrnode stop
- ;;
+ /opt/app/platform/init.d/drtrnode stop
+ ;;
'start')
- /opt/app/platform/init.d/drtrnode start || exit 1
- ;;
+ /opt/app/platform/init.d/drtrnode start || exit 1
+ ;;
'config')
- /bin/bash log4j.properties.tmpl >log4j.properties
- /bin/bash node.properties.tmpl >node.properties
- /bin/bash havecert.tmpl >havecert
- echo "$AFTSWM_ACTION_NEW_VERSION" >VERSION.node
- chmod +x havecert
- rm -f /opt/app/platform/rc.d/K90drtrnode /opt/app/platform/rc.d/S10drtrnode
- ln -s ../init.d/drtrnode /opt/app/platform/rc.d/K90drtrnode
- ln -s ../init.d/drtrnode /opt/app/platform/rc.d/S10drtrnode
- ;;
+ /bin/bash log4j.properties.tmpl >log4j.properties
+ /bin/bash node.properties.tmpl >node.properties
+ /bin/bash havecert.tmpl >havecert
+ echo "$AFTSWM_ACTION_NEW_VERSION" >VERSION.node
+ chmod +x havecert
+ rm -f /opt/app/platform/rc.d/K90drtrnode /opt/app/platform/rc.d/S10drtrnode
+ ln -s ../init.d/drtrnode /opt/app/platform/rc.d/K90drtrnode
+ ln -s ../init.d/drtrnode /opt/app/platform/rc.d/S10drtrnode
+ ;;
'restore')
- cp log4j.properties.save log4j.properties 2>/dev/null
- cp node.properties.save node.properties 2>/dev/null
- cp havecert.save havecert 2>/dev/null
- ;;
+ cp log4j.properties.save log4j.properties 2>/dev/null
+ cp node.properties.save node.properties 2>/dev/null
+ cp havecert.save havecert 2>/dev/null
+ ;;
'clean')
- rm -f log4j.properties node.properties havecert log4j.properties.save node.properties.save havecert.save SHUTDOWN redirections.dat VERSION.node
- rm -f /opt/app/platform/rc.d/K90drtrnode /opt/app/platform/rc.d/S10drtrnode
- ;;
+ rm -f log4j.properties node.properties havecert log4j.properties.save node.properties.save havecert.save SHUTDOWN redirections.dat VERSION.node
+ rm -f /opt/app/platform/rc.d/K90drtrnode /opt/app/platform/rc.d/S10drtrnode
+ ;;
*)
- exit 1
- ;;
+ exit 1
+ ;;
esac
done
exit 0
diff --git a/datarouter-node/src/main/resources/misc/drtrnode b/datarouter-node/src/main/resources/misc/drtrnode
index 9bce062d..970d7d3f 100644
--- a/datarouter-node/src/main/resources/misc/drtrnode
+++ b/datarouter-node/src/main/resources/misc/drtrnode
@@ -24,110 +24,110 @@ TZ=GMT0
export TZ
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/java/jdk/jdk180/bin
export PATH
-CLASSPATH=`echo /opt/app/datartr/etc /opt/app/datartr/lib/*.jar | tr ' ' ':'`
+CLASSPATH=`echo /opt/app/datartr/etc /opt/app/datartr/lib/*.jar | tr ' ' ':'`
export CLASSPATH
pids() {
- ps -ef | grep java | grep node.NodeMain | sed -e 's/[^ ]* *//' -e 's/ .*//'
+ ps -ef | grep java | grep node.NodeMain | sed -e 's/[^ ]* *//' -e 's/ .*//'
}
start() {
- ID=`id -n -u`
- GRP=`id -n -g`
- if [ "$ID" != "root" ]
- then
- echo drtrnode must be started as user datartr not $ID
- exit 1
- fi
- if [ "$GRP" != "datartr" ]
- then
- echo drtrnode must be started as group datartr not $GRP
- exit 1
- fi
- cd /opt/app/datartr
- if etc/havecert
- then
- echo >/dev/null
- else
- echo No certificate file available. Cannot start
- exit 0
- fi
- PIDS=`pids`
- if [ "$PIDS" != "" ]
- then
- echo drtrnode already running
- exit 0
- fi
+ ID=`id -n -u`
+ GRP=`id -n -g`
+ if [ "$ID" != "root" ]
+ then
+ echo drtrnode must be started as user datartr not $ID
+ exit 1
+ fi
+ if [ "$GRP" != "datartr" ]
+ then
+ echo drtrnode must be started as group datartr not $GRP
+ exit 1
+ fi
+ cd /opt/app/datartr
+ if etc/havecert
+ then
+ echo >/dev/null
+ else
+ echo No certificate file available. Cannot start
+ exit 0
+ fi
+ PIDS=`pids`
+ if [ "$PIDS" != "" ]
+ then
+ echo drtrnode already running
+ exit 0
+ fi
- mkdir -p /opt/app/datartr/spool/s
- chmod 755 /opt/app/datartr/spool/s
+ mkdir -p /opt/app/datartr/spool/s
+ chmod 755 /opt/app/datartr/spool/s
- rm -f /opt/app/datartr/etc/SHUTDOWN
- nohup java org.onap.dmaap.datarouter.node.NodeMain </dev/null >/dev/null 2>&1 &
- sleep 5
- PIDS=`pids`
- if [ "$PIDS" = "" ]
- then
- echo drtrnode startup failed
- else
- echo drtrnode started
- fi
+ rm -f /opt/app/datartr/etc/SHUTDOWN
+ nohup java org.onap.dmaap.datarouter.node.NodeMain </dev/null >/dev/null 2>&1 &
+ sleep 5
+ PIDS=`pids`
+ if [ "$PIDS" = "" ]
+ then
+ echo drtrnode startup failed
+ else
+ echo drtrnode started
+ fi
}
stop() {
- ID=`id -n -u`
- GRP=`id -n -g`
- if [ "$ID" != "datartr" ]
- then
- echo drtrnode must be stopped as user datartr not $ID
- exit 1
- fi
- if [ "$GRP" != "datartr" ]
- then
- echo drtrnode must be stopped as group datartr not $GRP
- exit 1
- fi
- touch /opt/app/datartr/etc/SHUTDOWN
- PIDS=`pids`
- if [ "$PIDS" != "" ]
- then
- sleep 5
- kill -9 $PIDS
- sleep 5
- echo drtrnode stopped
- else
- echo drtrnode not running
- fi
+ ID=`id -n -u`
+ GRP=`id -n -g`
+ if [ "$ID" != "datartr" ]
+ then
+ echo drtrnode must be stopped as user datartr not $ID
+ exit 1
+ fi
+ if [ "$GRP" != "datartr" ]
+ then
+ echo drtrnode must be stopped as group datartr not $GRP
+ exit 1
+ fi
+ touch /opt/app/datartr/etc/SHUTDOWN
+ PIDS=`pids`
+ if [ "$PIDS" != "" ]
+ then
+ sleep 5
+ kill -9 $PIDS
+ sleep 5
+ echo drtrnode stopped
+ else
+ echo drtrnode not running
+ fi
}
status() {
- PIDS=`pids`
- if [ "$PIDS" != "" ]
- then
- echo drtrnode running
- else
- echo drtrnode not running
- fi
+ PIDS=`pids`
+ if [ "$PIDS" != "" ]
+ then
+ echo drtrnode running
+ else
+ echo drtrnode not running
+ fi
}
case "$1" in
'start')
- start
- ;;
+ start
+ ;;
'stop')
- stop
- ;;
+ stop
+ ;;
'restart')
- stop
- sleep 20
- start
- ;;
+ stop
+ sleep 20
+ start
+ ;;
'status')
- status
- ;;
+ status
+ ;;
*)
- echo "Usage: $0 { start | stop | restart }"
- exit 1
- ;;
+ echo "Usage: $0 { start | stop | restart }"
+ exit 1
+ ;;
esac
exit 0
diff --git a/datarouter-node/src/main/resources/misc/havecert.tmpl b/datarouter-node/src/main/resources/misc/havecert.tmpl
index 2e813ba3..5affefd1 100644
--- a/datarouter-node/src/main/resources/misc/havecert.tmpl
+++ b/datarouter-node/src/main/resources/misc/havecert.tmpl
@@ -4,7 +4,7 @@ TZ=GMT0
cd /opt/app/datartr;
if [ -f ${DRTR_NODE_KSTOREFILE:-etc/keystore} ]
then
- exit 0
+ exit 0
fi
echo `date '+%F %T,000'` WARN Certificate file "${DRTR_NODE_KSTOREFILE:-etc/keystore}" is missing >>${DRTR_NODE_LOGS:-logs}/node.log
exit 1
diff --git a/datarouter-node/src/main/resources/misc/notes b/datarouter-node/src/main/resources/misc/notes
index f37a8ea2..e5e9746f 100644
--- a/datarouter-node/src/main/resources/misc/notes
+++ b/datarouter-node/src/main/resources/misc/notes
@@ -3,52 +3,52 @@ package notes for com.att.dmaap.datarouter:node
This component is for the Data Router Node software.
The following pre-requisite components should already be present:
- com.att.aft.swm:swm-cli
- com.att.aft.swm:swm-node
- - SWM Variables: AFTSWM_AUTOLINK_PARENTS=/opt/app:/opt/app/workload,/opt/app/aft:/opt/app/workload/aft
- com.att.platform:uam-auto
- com.att.java:jdk8lin
- com.att.platform:initd
- com.att.platform:port-fwd
- - SWM Variables: PLATFORM_PORT_FWD=80,8080|443,8443
- com.att.dmaap.datarouter:util
+ com.att.aft.swm:swm-cli
+ com.att.aft.swm:swm-node
+ - SWM Variables: AFTSWM_AUTOLINK_PARENTS=/opt/app:/opt/app/workload,/opt/app/aft:/opt/app/workload/aft
+ com.att.platform:uam-auto
+ com.att.java:jdk8lin
+ com.att.platform:initd
+ com.att.platform:port-fwd
+ - SWM Variables: PLATFORM_PORT_FWD=80,8080|443,8443
+ com.att.dmaap.datarouter:util
In a non-production environment, the URL for fetching provisioning data from
the provisioning server must be overridden. This can be done by setting a SWM
variable prior to installing this component. The production (default) value for
this variable is:
- DRTR_PROV_INTURL=https://feeds-drtr.web.att.com/internal/prov
+ DRTR_PROV_INTURL=https://feeds-drtr.web.att.com/internal/prov
Similarly, the URL for uploading event logs to the log server must be overridden. This can also be done by setting a SWM variable. The production (default) value is:
- DRTR_LOG_URL=https://feeds-drtr.web.att.com/internal/logs
+ DRTR_LOG_URL=https://feeds-drtr.web.att.com/internal/logs
Other SWM variables that can be set are:
DRTR_NODE_INTHTTPPORT (default 8080)
- The TCP/IP port number the component should listen on for "go fetch"
- requests from the provisioning server
+ The TCP/IP port number the component should listen on for "go fetch"
+ requests from the provisioning server
DRTR_NODE_INTHTTPSPORT (default 8443)
- The TCP/IP port number the component should listen on for publish
- requests from feed publishers and other nodes
+ The TCP/IP port number the component should listen on for publish
+ requests from feed publishers and other nodes
DRTR_NODE_EXTHTTPSPORT (default 443)
- The TCP/IP port number the component should use for node-to-node
- transfers and for sending redirect requests back to publishers
+ The TCP/IP port number the component should use for node-to-node
+ transfers and for sending redirect requests back to publishers
DRTR_NODE_SPOOL (default /opt/app/datartr/spool)
- The directory where data files should be saved while in transit
+ The directory where data files should be saved while in transit
DRTR_NODE_LOGS (default /opt/app/datartr/logs)
- The directory where log files should be kept
+ The directory where log files should be kept
DRTR_NODE_LOG_RETENTION (default 30)
- How long a log file is kept before being deleted
+ How long a log file is kept before being deleted
DRTR_NODE_KSTOREFILE (default /opt/app/datartr/etc/keystore)
- The java keystore file containing the server certificate and private key
- for this server
+ The java keystore file containing the server certificate and private key
+ for this server
DRTR_NODE_KSTOREPASS (default changeit)
- The password for the keystore file
+ The password for the keystore file
DRTR_NODE_PVTKEYPASS (default changeit)
- The password for the private key in the keystore file
+ The password for the private key in the keystore file
DRTR_NODE_TSTOREFILE (by default, use the truststore from the Java JDK)
- The java keystore file containing the trusted certificate authority
- certificates
+ The java keystore file containing the trusted certificate authority
+ certificates
DRTR_NODE_TSTOREPASS (default changeit)
- The password for the trust store file. Only applies if a trust store
- file is specified.
+ The password for the trust store file. Only applies if a trust store
+ file is specified.
diff --git a/datarouter-prov/data/addFeed3.txt b/datarouter-prov/data/addFeed3.txt
index 21f58a31..422e43af 100644
--- a/datarouter-prov/data/addFeed3.txt
+++ b/datarouter-prov/data/addFeed3.txt
@@ -1,23 +1,23 @@
-
-{
- "name": "Jettydemo",
- "version": "m1.0",
- "description": "Jettydemo",
- "business_description": "Jettydemo",
- "suspend": false,
- "deleted": false,
- "changeowner": true,
- "authorization": {
- "classification": "unclassified",
- "endpoint_addrs": [
- "172.18.0.3",
- ],
- "endpoint_ids": [
- {
- "password": "rs873m",
- "id": "rs873m"
- }
- ]
- },
-}
-
+
+{
+ "name": "Jettydemo",
+ "version": "m1.0",
+ "description": "Jettydemo",
+ "business_description": "Jettydemo",
+ "suspend": false,
+ "deleted": false,
+ "changeowner": true,
+ "authorization": {
+ "classification": "unclassified",
+ "endpoint_addrs": [
+ "172.18.0.3",
+ ],
+ "endpoint_ids": [
+ {
+ "password": "rs873m",
+ "id": "rs873m"
+ }
+ ]
+ },
+}
+
diff --git a/datarouter-prov/data/addSubscriber.txt b/datarouter-prov/data/addSubscriber.txt
index a9d4156e..b066113d 100644
--- a/datarouter-prov/data/addSubscriber.txt
+++ b/datarouter-prov/data/addSubscriber.txt
@@ -1,15 +1,15 @@
-
-{
- "delivery" :
-
- {
- "url" : "http://172.18.0.3:7070/",
- "user" : "LOGIN",
- "password" : "PASSWORD",
- "use100" : true
- },
- "metadataOnly" : false,
- "suspend" : false,
- "groupid" : 29,
- "subscriber" : "sg481n"
-}
+
+{
+ "delivery" :
+
+ {
+ "url" : "http://172.18.0.3:7070/",
+ "user" : "LOGIN",
+ "password" : "PASSWORD",
+ "use100" : true
+ },
+ "metadataOnly" : false,
+ "suspend" : false,
+ "groupid" : 29,
+ "subscriber" : "sg481n"
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponse.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponse.java
index e078429c..e6e8802f 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponse.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponse.java
@@ -7,9 +7,9 @@
* * 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.
@@ -28,31 +28,31 @@ import java.util.List;
* The <code>AuthorizationResponse</code> interface gives the caller access to information about an authorization
* decision. This information includes the permit/deny decision itself, along with supplementary information in the form of
* advice and obligations. (The advice and obligations will not be used in Data Router R1.)
- *
+ *
* @author J. F. Lucas
*
*/
public interface AuthorizationResponse {
- /**
- * Indicates whether the request is authorized or not.
- *
- * @return a boolean flag that is <code>true</code> if the request is permitted, and <code>false</code> otherwise.
- */
- public boolean isAuthorized();
-
- /**
- * Returns any advice elements that were included in the authorization response.
- *
- * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
- * advice element from the authorization response.
- */
- public List<AuthorizationResponseSupplement> getAdvice();
-
- /**
- * Returns any obligation elements that were included in the authorization response.
- *
- * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
- * obligation element from the authorization response.
- */
- public List<AuthorizationResponseSupplement> getObligations();
+ /**
+ * Indicates whether the request is authorized or not.
+ *
+ * @return a boolean flag that is <code>true</code> if the request is permitted, and <code>false</code> otherwise.
+ */
+ public boolean isAuthorized();
+
+ /**
+ * Returns any advice elements that were included in the authorization response.
+ *
+ * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
+ * advice element from the authorization response.
+ */
+ public List<AuthorizationResponseSupplement> getAdvice();
+
+ /**
+ * Returns any obligation elements that were included in the authorization response.
+ *
+ * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
+ * obligation element from the authorization response.
+ */
+ public List<AuthorizationResponseSupplement> getObligations();
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponseSupplement.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponseSupplement.java
index adb44ba3..6e956334 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponseSupplement.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/AuthorizationResponseSupplement.java
@@ -7,9 +7,9 @@
* * 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.
@@ -32,21 +32,21 @@ import java.util.Map;
* obligation elements. The structure of a XACML advice element and a XACML obligation element are similar: each has an identifier and
* a set of attributes (name-value) pairs. (The difference between a XACML advice element and a XACML obligation element is in
* how the recipient of the response--the Policy Enforcement Point, in XACML terminology--handles the element.)
- *
+ *
* @author J. F. Lucas
*
*/
public interface AuthorizationResponseSupplement {
- /** Return the identifier for the supplementary information element.
- *
- * @return a <code>String</code> containing the identifier.
- */
- public String getId();
-
- /** Return the attributes for the supplementary information element, as a <code>Map</code> in which
- * keys represent attribute identifiers and values represent attribute values.
- *
- * @return attributes for the supplementary information element.
- */
- public Map<String, String> getAttributes();
+ /** Return the identifier for the supplementary information element.
+ *
+ * @return a <code>String</code> containing the identifier.
+ */
+ public String getId();
+
+ /** Return the attributes for the supplementary information element, as a <code>Map</code> in which
+ * keys represent attribute identifiers and values represent attribute values.
+ *
+ * @return attributes for the supplementary information element.
+ */
+ public Map<String, String> getAttributes();
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/Authorizer.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/Authorizer.java
index 44719e66..d6944e56 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/Authorizer.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/Authorizer.java
@@ -7,9 +7,9 @@
* * 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.
@@ -33,30 +33,30 @@ import javax.servlet.http.HttpServletRequest;
* request is permitted. In Data Router R1, the classes that implement the <code>Authorizer</code> interface will have
* local logic that makes the authorization decision. After R1, these classes will instead have logic that creates XACML
* authorization requests, sends these requests to a Policy Decision Point (PDP), and parses the XACML responses.
- *
+ *
* @author J. F. Lucas
*
*/
public interface Authorizer {
- /**
- * Determine if the API request carried in the <code>request</code> parameter is permitted.
- *
- * @param request the HTTP request for which an authorization decision is needed
- * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
- * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
- * of advice and obligations.
- */
- public AuthorizationResponse decide(HttpServletRequest request);
-
- /**
- * Determine if the API request carried in the <code>request</code> parameter, with additional attributes provided in
- * the <code>additionalAttrs</code> parameter, is permitted.
- *
- * @param request the HTTP request for which an authorization decision is needed
- * @param additionalAttrs additional attributes that the <code>Authorizer</code> can in making an authorization decision
- * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
- * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
- * of advice and obligations.
- */
- public AuthorizationResponse decide(HttpServletRequest request, Map<String,String> additionalAttrs);
+ /**
+ * Determine if the API request carried in the <code>request</code> parameter is permitted.
+ *
+ * @param request the HTTP request for which an authorization decision is needed
+ * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
+ * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
+ * of advice and obligations.
+ */
+ public AuthorizationResponse decide(HttpServletRequest request);
+
+ /**
+ * Determine if the API request carried in the <code>request</code> parameter, with additional attributes provided in
+ * the <code>additionalAttrs</code> parameter, is permitted.
+ *
+ * @param request the HTTP request for which an authorization decision is needed
+ * @param additionalAttrs additional attributes that the <code>Authorizer</code> can in making an authorization decision
+ * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
+ * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
+ * of advice and obligations.
+ */
+ public AuthorizationResponse decide(HttpServletRequest request, Map<String,String> additionalAttrs);
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespImpl.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespImpl.java
index cb608c3b..f3278332 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespImpl.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespImpl.java
@@ -7,9 +7,9 @@
* * 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.
@@ -37,61 +37,61 @@ import org.onap.dmaap.datarouter.authz.AuthorizationResponseSupplement;
*
*/
public class AuthRespImpl implements AuthorizationResponse {
- private boolean authorized;
- private List<AuthorizationResponseSupplement> advice;
- private List<AuthorizationResponseSupplement> obligations;
-
- /** Constructor. This version will not be used in Data Router R1 since we will not have advice and obligations.
- *
- * @param authorized flag indicating whether the response carried a permit response (<code>true</code>)
- * or something else (<code>false</code>).
- * @param advice list of advice elements returned in the response.
- * @param obligations list of obligation elements returned in the response.
- */
- public AuthRespImpl(boolean authorized, List<AuthorizationResponseSupplement> advice, List<AuthorizationResponseSupplement> obligations) {
- this.authorized = authorized;
- this.advice = (advice == null ? null : new ArrayList<AuthorizationResponseSupplement> (advice));
- this.obligations = (obligations == null ? null : new ArrayList<AuthorizationResponseSupplement> (obligations));
- }
-
- /** Constructor. Simple version for authorization responses that have no advice and no obligations.
- *
- * @param authorized flag indicating whether the response carried a permit (<code>true</code>) or something else (<code>false</code>).
- */
- public AuthRespImpl(boolean authorized) {
- this(authorized, null, null);
- }
+ private boolean authorized;
+ private List<AuthorizationResponseSupplement> advice;
+ private List<AuthorizationResponseSupplement> obligations;
+
+ /** Constructor. This version will not be used in Data Router R1 since we will not have advice and obligations.
+ *
+ * @param authorized flag indicating whether the response carried a permit response (<code>true</code>)
+ * or something else (<code>false</code>).
+ * @param advice list of advice elements returned in the response.
+ * @param obligations list of obligation elements returned in the response.
+ */
+ public AuthRespImpl(boolean authorized, List<AuthorizationResponseSupplement> advice, List<AuthorizationResponseSupplement> obligations) {
+ this.authorized = authorized;
+ this.advice = (advice == null ? null : new ArrayList<AuthorizationResponseSupplement> (advice));
+ this.obligations = (obligations == null ? null : new ArrayList<AuthorizationResponseSupplement> (obligations));
+ }
+
+ /** Constructor. Simple version for authorization responses that have no advice and no obligations.
+ *
+ * @param authorized flag indicating whether the response carried a permit (<code>true</code>) or something else (<code>false</code>).
+ */
+ public AuthRespImpl(boolean authorized) {
+ this(authorized, null, null);
+ }
- /**
- * Indicates whether the request is authorized or not.
- *
- * @return a boolean flag that is <code>true</code> if the request is permitted, and <code>false</code> otherwise.
- */
- @Override
- public boolean isAuthorized() {
- return authorized;
- }
+ /**
+ * Indicates whether the request is authorized or not.
+ *
+ * @return a boolean flag that is <code>true</code> if the request is permitted, and <code>false</code> otherwise.
+ */
+ @Override
+ public boolean isAuthorized() {
+ return authorized;
+ }
- /**
- * Returns any advice elements that were included in the authorization response.
- *
- * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
- * advice element from the authorization response.
- */
- @Override
- public List<AuthorizationResponseSupplement> getAdvice() {
- return advice;
- }
+ /**
+ * Returns any advice elements that were included in the authorization response.
+ *
+ * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
+ * advice element from the authorization response.
+ */
+ @Override
+ public List<AuthorizationResponseSupplement> getAdvice() {
+ return advice;
+ }
- /**
- * Returns any obligation elements that were included in the authorization response.
- *
- * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
- * obligation element from the authorization response.
- */
- @Override
- public List<AuthorizationResponseSupplement> getObligations() {
- return obligations;
- }
+ /**
+ * Returns any obligation elements that were included in the authorization response.
+ *
+ * @return A list of objects implementing the <code>AuthorizationResponseSupplement</code> interface, with each object representing an
+ * obligation element from the authorization response.
+ */
+ @Override
+ public List<AuthorizationResponseSupplement> getObligations() {
+ return obligations;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespSupplementImpl.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespSupplementImpl.java
index 1f62c274..d995270e 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespSupplementImpl.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthRespSupplementImpl.java
@@ -7,9 +7,9 @@
* * 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.
@@ -35,37 +35,37 @@ import org.onap.dmaap.datarouter.authz.AuthorizationResponseSupplement;
*
*/
public class AuthRespSupplementImpl implements AuthorizationResponseSupplement {
-
- private String id = null;
- private Map<String, String> attributes = null;
- /** Constructor, available within the package.
- *
- * @param id The identifier for the advice or obligation element
- * @param attributes The attributes (name-value pairs) for the advice or obligation element.
- */
- AuthRespSupplementImpl (String id, Map<String, String> attributes) {
- this.id = id;
- this.attributes = new HashMap<String,String>(attributes);
- }
+ private String id = null;
+ private Map<String, String> attributes = null;
+
+ /** Constructor, available within the package.
+ *
+ * @param id The identifier for the advice or obligation element
+ * @param attributes The attributes (name-value pairs) for the advice or obligation element.
+ */
+ AuthRespSupplementImpl (String id, Map<String, String> attributes) {
+ this.id = id;
+ this.attributes = new HashMap<String,String>(attributes);
+ }
- /** Return the identifier for the supplementary information element.
- *
- * @return a <code>String</code> containing the identifier.
- */
- @Override
- public String getId() {
- return id;
- }
+ /** Return the identifier for the supplementary information element.
+ *
+ * @return a <code>String</code> containing the identifier.
+ */
+ @Override
+ public String getId() {
+ return id;
+ }
- /** Return the attributes for the supplementary information element, as a <code>Map</code> in which
- * keys represent attribute identifiers and values represent attribute values.
- *
- * @return attributes for the supplementary information element.
- */
- @Override
- public Map<String, String> getAttributes() {
- return attributes;
- }
+ /** Return the attributes for the supplementary information element, as a <code>Map</code> in which
+ * keys represent attribute identifiers and values represent attribute values.
+ *
+ * @return attributes for the supplementary information element.
+ */
+ @Override
+ public Map<String, String> getAttributes() {
+ return attributes;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthzResource.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthzResource.java
index 2e957939..0357fa74 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthzResource.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/AuthzResource.java
@@ -7,9 +7,9 @@
* * 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.
@@ -44,57 +44,57 @@ import java.util.regex.Pattern;
* <li>a subscription resource, the target of GET, PUT, and DELETE requests used to manage an existing subscription.
* Each subscription has a unique subscription ID.
* </li>
- *
+ *
* @author J. F. Lucas
*
*/
public class AuthzResource {
- private ResourceType type = null;
- private String id = "";
+ private ResourceType type = null;
+ private String id = "";
+
+ /* Construct an AuthzResource by matching a request URI against the various patterns */
+ public AuthzResource(String rURI) {
+ if (rURI != null) {
+ for (ResourceType t : ResourceType.values()) {
+ Matcher m = t.getPattern().matcher(rURI);
+ if (m.find(0)) {
+ this.type = t;
+ if (m.group("id") != null) {
+ this.id = m.group("id");
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ public ResourceType getType() {
+ return this.type;
+ }
+
+ public String getId() {
+ return this.id;
+ }
+
+ /* Enumeration that helps turn a request URI into something more useful for
+ * authorization purposes by given a type name and a pattern for determining if the URI
+ * represents that resource type.
+ * Highly dependent on the URL scheme, could be parameterized.
+ */
+ public enum ResourceType {
+ FEEDS_COLLECTION("((://[^/]+/)|(^/))(?<id>)$"),
+ SUBS_COLLECTION ("((://[^/]+/)|(^/{0,1}))subscribe/(?<id>[^/]+)$"),
+ FEED("((://[^/]+/)|(^/{0,1}))feed/(?<id>[^/]+)$"),
+ SUB("((://[^/]+/)|(^/{0,1}))subs/(?<id>[^/]+)$");
+
+ private Pattern uriPattern;
+
+ private ResourceType(String patternString) {
+ this.uriPattern = Pattern.compile(patternString);
+ }
- /* Construct an AuthzResource by matching a request URI against the various patterns */
- public AuthzResource(String rURI) {
- if (rURI != null) {
- for (ResourceType t : ResourceType.values()) {
- Matcher m = t.getPattern().matcher(rURI);
- if (m.find(0)) {
- this.type = t;
- if (m.group("id") != null) {
- this.id = m.group("id");
- }
- break;
- }
- }
- }
- }
-
- public ResourceType getType() {
- return this.type;
- }
-
- public String getId() {
- return this.id;
- }
-
- /* Enumeration that helps turn a request URI into something more useful for
- * authorization purposes by given a type name and a pattern for determining if the URI
- * represents that resource type.
- * Highly dependent on the URL scheme, could be parameterized.
- */
- public enum ResourceType {
- FEEDS_COLLECTION("((://[^/]+/)|(^/))(?<id>)$"),
- SUBS_COLLECTION ("((://[^/]+/)|(^/{0,1}))subscribe/(?<id>[^/]+)$"),
- FEED("((://[^/]+/)|(^/{0,1}))feed/(?<id>[^/]+)$"),
- SUB("((://[^/]+/)|(^/{0,1}))subs/(?<id>[^/]+)$");
-
- private Pattern uriPattern;
-
- private ResourceType(String patternString) {
- this.uriPattern = Pattern.compile(patternString);
- }
-
- Pattern getPattern() {
- return this.uriPattern;
- }
- }
+ Pattern getPattern() {
+ return this.uriPattern;
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvAuthorizer.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvAuthorizer.java
index 6ab9e2ab..b7df151c 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvAuthorizer.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvAuthorizer.java
@@ -1,178 +1,178 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-package org.onap.dmaap.datarouter.authz.impl;
-
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.log4j.Logger;
-import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
-import org.onap.dmaap.datarouter.authz.Authorizer;
-import org.onap.dmaap.datarouter.authz.impl.AuthzResource.ResourceType;
-
-/** Authorizer for the provisioning API for Data Router R1
- *
- * @author J. F. Lucas
- *
- */
-public class ProvAuthorizer implements Authorizer {
-
- private Logger log;
- private ProvDataProvider provData;
-
- private static final String SUBJECT_HEADER = "X-ATT-DR-ON-BEHALF-OF"; // HTTP header carrying requester identity
- private static final String SUBJECT_HEADER_GROUP = "X-ATT-DR-ON-BEHALF-OF-GROUP"; // HTTP header carrying requester identity by group Rally : US708115
- /** Constructor. For the moment, do nothing special. Make it a singleton?
- *
- */
- public ProvAuthorizer(ProvDataProvider provData) {
- this.provData = provData;
- this.log = Logger.getLogger(this.getClass());
- }
-
- /**
- * Determine if the API request carried in the <code>request</code> parameter is permitted.
- *
- * @param request the HTTP request for which an authorization decision is needed
- * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
- * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
- * of advice and obligations.
- */
- @Override
- public AuthorizationResponse decide(HttpServletRequest request) {
- return this.decide(request, null);
- }
-
- /**
- * Determine if the API request carried in the <code>request</code> parameter, with additional attributes provided in
- * the <code>additionalAttrs</code> parameter, is permitted. <code>additionalAttrs</code> isn't used in R1.
- *
- * @param request the HTTP request for which an authorization decision is needed
- * @param additionalAttrs additional attributes that the <code>Authorizer</code> can in making an authorization decision
- * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
- * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
- * of advice and obligations.
- */
- @Override
- public AuthorizationResponse decide(HttpServletRequest request,
- Map<String, String> additionalAttrs) {
- log.trace ("Entering decide()");
-
- boolean decision = false;
-
- // Extract interesting parts of the HTTP request
- String method = request.getMethod();
- AuthzResource resource = new AuthzResource(request.getRequestURI());
- String subject = (request.getHeader(SUBJECT_HEADER)); // identity of the requester
- String subjectgroup = (request.getHeader(SUBJECT_HEADER_GROUP)); // identity of the requester by group Rally : US708115
-
- log.trace("Method: " + method + " -- Type: " + resource.getType() + " -- Id: " + resource.getId() +
- " -- Subject: " + subject);
-
- // Choose authorization method based on the resource type
- ResourceType resourceType = resource.getType();
- if (resourceType != null) {
-
- switch (resourceType) {
-
- case FEEDS_COLLECTION:
- decision = allowFeedsCollectionAccess(resource, method, subject, subjectgroup);
- break;
-
- case SUBS_COLLECTION:
- decision = allowSubsCollectionAccess(resource, method, subject, subjectgroup);
- break;
-
- case FEED:
- decision = allowFeedAccess(resource, method, subject, subjectgroup);
- break;
-
- case SUB:
- decision = allowSubAccess(resource, method, subject, subjectgroup);
- break;
-
- default:
- decision = false;
- break;
- }
- }
- log.debug("Exit decide(): " + method + "|" + resourceType + "|" + resource.getId() + "|" + subject + " ==> " + decision);
-
- return new AuthRespImpl(decision);
- }
-
- private boolean allowFeedsCollectionAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
-
- // Allow GET or POST unconditionally
- return method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("POST"));
- }
-
- private boolean allowSubsCollectionAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
-
- // Allow GET or POST unconditionally
- return method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("POST"));
- }
-
- private boolean allowFeedAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
- boolean decision = false;
-
- // Allow GET, PUT, or DELETE if requester (subject) is the owner (publisher) of the feed
- if ( method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("PUT") ||
- method.equalsIgnoreCase("DELETE"))) {
-
- String owner = provData.getFeedOwner(resource.getId());
- decision = (owner != null) && owner.equals(subject);
-
- //Verifying by group Rally : US708115
- if(subjectgroup != null) {
- String feedowner = provData.getGroupByFeedGroupId(subject, resource.getId());
- decision = (feedowner != null) && feedowner.equals(subjectgroup);
- }
- }
-
- return decision;
- }
-
- private boolean allowSubAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
- boolean decision = false;
-
- // Allow GET, PUT, or DELETE if requester (subject) is the owner of the subscription (subscriber)
- if (method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("PUT") ||
- method.equalsIgnoreCase("DELETE") || method.equalsIgnoreCase("POST"))) {
-
- String owner = provData.getSubscriptionOwner(resource.getId());
- decision = (owner != null) && owner.equals(subject);
-
- //Verifying by group Rally : US708115
- if(subjectgroup != null) {
- String feedowner = provData.getGroupBySubGroupId(subject, resource.getId());
- decision = (feedowner != null) && feedowner.equals(subjectgroup);
- }
- }
-
- return decision;
- }
-
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.authz.impl;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.log4j.Logger;
+import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
+import org.onap.dmaap.datarouter.authz.Authorizer;
+import org.onap.dmaap.datarouter.authz.impl.AuthzResource.ResourceType;
+
+/** Authorizer for the provisioning API for Data Router R1
+ *
+ * @author J. F. Lucas
+ *
+ */
+public class ProvAuthorizer implements Authorizer {
+
+ private Logger log;
+ private ProvDataProvider provData;
+
+ private static final String SUBJECT_HEADER = "X-ATT-DR-ON-BEHALF-OF"; // HTTP header carrying requester identity
+ private static final String SUBJECT_HEADER_GROUP = "X-ATT-DR-ON-BEHALF-OF-GROUP"; // HTTP header carrying requester identity by group Rally : US708115
+ /** Constructor. For the moment, do nothing special. Make it a singleton?
+ *
+ */
+ public ProvAuthorizer(ProvDataProvider provData) {
+ this.provData = provData;
+ this.log = Logger.getLogger(this.getClass());
+ }
+
+ /**
+ * Determine if the API request carried in the <code>request</code> parameter is permitted.
+ *
+ * @param request the HTTP request for which an authorization decision is needed
+ * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
+ * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
+ * of advice and obligations.
+ */
+ @Override
+ public AuthorizationResponse decide(HttpServletRequest request) {
+ return this.decide(request, null);
+ }
+
+ /**
+ * Determine if the API request carried in the <code>request</code> parameter, with additional attributes provided in
+ * the <code>additionalAttrs</code> parameter, is permitted. <code>additionalAttrs</code> isn't used in R1.
+ *
+ * @param request the HTTP request for which an authorization decision is needed
+ * @param additionalAttrs additional attributes that the <code>Authorizer</code> can in making an authorization decision
+ * @return an object implementing the <code>AuthorizationResponse</code> interface. This object includes the
+ * permit/deny decision for the request and (after R1) supplemental information related to the response in the form
+ * of advice and obligations.
+ */
+ @Override
+ public AuthorizationResponse decide(HttpServletRequest request,
+ Map<String, String> additionalAttrs) {
+ log.trace ("Entering decide()");
+
+ boolean decision = false;
+
+ // Extract interesting parts of the HTTP request
+ String method = request.getMethod();
+ AuthzResource resource = new AuthzResource(request.getRequestURI());
+ String subject = (request.getHeader(SUBJECT_HEADER)); // identity of the requester
+ String subjectgroup = (request.getHeader(SUBJECT_HEADER_GROUP)); // identity of the requester by group Rally : US708115
+
+ log.trace("Method: " + method + " -- Type: " + resource.getType() + " -- Id: " + resource.getId() +
+ " -- Subject: " + subject);
+
+ // Choose authorization method based on the resource type
+ ResourceType resourceType = resource.getType();
+ if (resourceType != null) {
+
+ switch (resourceType) {
+
+ case FEEDS_COLLECTION:
+ decision = allowFeedsCollectionAccess(resource, method, subject, subjectgroup);
+ break;
+
+ case SUBS_COLLECTION:
+ decision = allowSubsCollectionAccess(resource, method, subject, subjectgroup);
+ break;
+
+ case FEED:
+ decision = allowFeedAccess(resource, method, subject, subjectgroup);
+ break;
+
+ case SUB:
+ decision = allowSubAccess(resource, method, subject, subjectgroup);
+ break;
+
+ default:
+ decision = false;
+ break;
+ }
+ }
+ log.debug("Exit decide(): " + method + "|" + resourceType + "|" + resource.getId() + "|" + subject + " ==> " + decision);
+
+ return new AuthRespImpl(decision);
+ }
+
+ private boolean allowFeedsCollectionAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
+
+ // Allow GET or POST unconditionally
+ return method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("POST"));
+ }
+
+ private boolean allowSubsCollectionAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
+
+ // Allow GET or POST unconditionally
+ return method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("POST"));
+ }
+
+ private boolean allowFeedAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
+ boolean decision = false;
+
+ // Allow GET, PUT, or DELETE if requester (subject) is the owner (publisher) of the feed
+ if ( method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("PUT") ||
+ method.equalsIgnoreCase("DELETE"))) {
+
+ String owner = provData.getFeedOwner(resource.getId());
+ decision = (owner != null) && owner.equals(subject);
+
+ //Verifying by group Rally : US708115
+ if(subjectgroup != null) {
+ String feedowner = provData.getGroupByFeedGroupId(subject, resource.getId());
+ decision = (feedowner != null) && feedowner.equals(subjectgroup);
+ }
+ }
+
+ return decision;
+ }
+
+ private boolean allowSubAccess(AuthzResource resource, String method, String subject, String subjectgroup) {
+ boolean decision = false;
+
+ // Allow GET, PUT, or DELETE if requester (subject) is the owner of the subscription (subscriber)
+ if (method != null && (method.equalsIgnoreCase("GET") || method.equalsIgnoreCase("PUT") ||
+ method.equalsIgnoreCase("DELETE") || method.equalsIgnoreCase("POST"))) {
+
+ String owner = provData.getSubscriptionOwner(resource.getId());
+ decision = (owner != null) && owner.equals(subject);
+
+ //Verifying by group Rally : US708115
+ if(subjectgroup != null) {
+ String feedowner = provData.getGroupBySubGroupId(subject, resource.getId());
+ decision = (feedowner != null) && feedowner.equals(subjectgroup);
+ }
+ }
+
+ return decision;
+ }
+
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvDataProvider.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvDataProvider.java
index 0357d174..dca348a0 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvDataProvider.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/impl/ProvDataProvider.java
@@ -7,9 +7,9 @@
* * 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.
@@ -22,45 +22,45 @@
******************************************************************************/
package org.onap.dmaap.datarouter.authz.impl;
-/** Interface to access data about subscriptions and feeds. A software component that
+/** Interface to access data about subscriptions and feeds. A software component that
* uses the <code>ProvAuthorizer</code> needs to supply an implementation of this interface.
* @author J. F. Lucas
*
*/
public interface ProvDataProvider {
-
- /** Get the identity of the owner of a feed.
- *
- * @param feedId the feed ID of the feed whose owner is being looked up.
- * @return the feed owner's identity
- */
- public String getFeedOwner(String feedId);
-
- /** Get the security classification of a feed.
- *
- * @param feedId the ID of the feed whose classification is being looked up.
- * @return the classification of the feed.
- */
- public String getFeedClassification(String feedId);
-
- /** Get the identity of the owner of a feed
- *
- * @param subId the ID of the subscripition whose owner is being looked up.
- * @return the subscription owner's identity.
- */
- public String getSubscriptionOwner(String subId);
- /** Get the identity of the owner of a feed by group id - Rally : US708115
- *
- * @param feedId, user the ID of the feed whose owner is being looked up.
- * @return the feed owner's identity by group.
- */
- public String getGroupByFeedGroupId(String owner, String feedId);
-
- /** Get the identity of the owner of a sub by group id Rally : US708115
- *
- * @param subId, user the ID of the feed whose owner is being looked up.
- * @return the feed owner's identity by group.
- */
- public String getGroupBySubGroupId(String owner, String subId);
+ /** Get the identity of the owner of a feed.
+ *
+ * @param feedId the feed ID of the feed whose owner is being looked up.
+ * @return the feed owner's identity
+ */
+ public String getFeedOwner(String feedId);
+
+ /** Get the security classification of a feed.
+ *
+ * @param feedId the ID of the feed whose classification is being looked up.
+ * @return the classification of the feed.
+ */
+ public String getFeedClassification(String feedId);
+
+ /** Get the identity of the owner of a feed
+ *
+ * @param subId the ID of the subscripition whose owner is being looked up.
+ * @return the subscription owner's identity.
+ */
+ public String getSubscriptionOwner(String subId);
+
+ /** Get the identity of the owner of a feed by group id - Rally : US708115
+ *
+ * @param feedId, user the ID of the feed whose owner is being looked up.
+ * @return the feed owner's identity by group.
+ */
+ public String getGroupByFeedGroupId(String owner, String feedId);
+
+ /** Get the identity of the owner of a sub by group id Rally : US708115
+ *
+ * @param subId, user the ID of the feed whose owner is being looked up.
+ * @return the feed owner's identity by group.
+ */
+ public String getGroupBySubGroupId(String owner, String subId);
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/package.html b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/package.html
index 7628ae82..3b484500 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/package.html
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/authz/package.html
@@ -2,7 +2,7 @@
# ============LICENSE_START==================================================
# * org.onap.dmaap
# * ===========================================================================
-# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
# * ===========================================================================
# * Licensed under the Apache License, Version 2.0 (the "License");
# * you may not use this file except in compliance with the License.
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/BaseServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/BaseServlet.java
index fb13f5d6..92e52fce 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/BaseServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/BaseServlet.java
@@ -1,868 +1,868 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import static com.att.eelf.configuration.Configuration.MDC_SERVER_FQDN;
-
-import static com.att.eelf.configuration.Configuration.MDC_SERVER_IP_ADDRESS;
-import static com.att.eelf.configuration.Configuration.MDC_SERVICE_NAME;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.security.cert.X509Certificate;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.List;
-import java.util.ArrayList;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.log4j.Logger;
-import org.json.JSONObject;
-import org.json.JSONTokener;
-import org.onap.dmaap.datarouter.authz.Authorizer;
-import org.onap.dmaap.datarouter.authz.impl.ProvAuthorizer;
-import org.onap.dmaap.datarouter.authz.impl.ProvDataProvider;
-import org.onap.dmaap.datarouter.provisioning.beans.Deleteable;
-import org.onap.dmaap.datarouter.provisioning.beans.Feed;
-import org.onap.dmaap.datarouter.provisioning.beans.Group;
-import org.onap.dmaap.datarouter.provisioning.beans.Insertable;
-import org.onap.dmaap.datarouter.provisioning.beans.NodeClass;
-import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
-import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
-import org.onap.dmaap.datarouter.provisioning.beans.Updateable;
-import org.onap.dmaap.datarouter.provisioning.utils.DB;
-import org.onap.dmaap.datarouter.provisioning.utils.ThrottleFilter;
-import org.json.JSONException;
-import org.slf4j.MDC;
-
-import java.util.Properties;
-import java.util.regex.Pattern;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Multipart;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.internet.AddressException;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeMultipart;
-/**
- * This is the base class for all Servlets in the provisioning code.
- * It provides standard constants and some common methods.
- *
- * @author Robert Eby
- * @version $Id: BaseServlet.java,v 1.16 2014/03/12 19:45:40 eby Exp $
- */
-@SuppressWarnings("serial")
-public class BaseServlet extends HttpServlet implements ProvDataProvider {
- public static final String BEHALF_HEADER = "X-ATT-DR-ON-BEHALF-OF";
- public static final String FEED_BASECONTENT_TYPE = "application/vnd.att-dr.feed";
- public static final String FEED_CONTENT_TYPE = "application/vnd.att-dr.feed; version=2.0";
- public static final String FEEDFULL_CONTENT_TYPE = "application/vnd.att-dr.feed-full; version=2.0";
- public static final String FEEDLIST_CONTENT_TYPE = "application/vnd.att-dr.feed-list; version=1.0";
- public static final String SUB_BASECONTENT_TYPE = "application/vnd.att-dr.subscription";
- public static final String SUB_CONTENT_TYPE = "application/vnd.att-dr.subscription; version=2.0";
- public static final String SUBFULL_CONTENT_TYPE = "application/vnd.att-dr.subscription-full; version=2.0";
- public static final String SUBLIST_CONTENT_TYPE = "application/vnd.att-dr.subscription-list; version=1.0";
-
-
- //Adding groups functionality, ...1610
- public static final String GROUP_BASECONTENT_TYPE = "application/vnd.att-dr.group";
- public static final String GROUP_CONTENT_TYPE = "application/vnd.att-dr.group; version=2.0";
- public static final String GROUPFULL_CONTENT_TYPE = "application/vnd.att-dr.group-full; version=2.0";
- public static final String GROUPLIST_CONTENT_TYPE = "application/vnd.att-dr.fegrouped-list; version=1.0";
-
-
- public static final String LOGLIST_CONTENT_TYPE = "application/vnd.att-dr.log-list; version=1.0";
- public static final String PROVFULL_CONTENT_TYPE1 = "application/vnd.att-dr.provfeed-full; version=1.0";
- public static final String PROVFULL_CONTENT_TYPE2 = "application/vnd.att-dr.provfeed-full; version=2.0";
- public static final String CERT_ATTRIBUTE = "javax.servlet.request.X509Certificate";
-
- public static final String DB_PROBLEM_MSG = "There has been a problem with the DB. It is suggested you try the operation again.";
-
- public static final int DEFAULT_MAX_FEEDS = 10000;
- public static final int DEFAULT_MAX_SUBS = 100000;
- public static final int DEFAULT_POKETIMER1 = 5;
- public static final int DEFAULT_POKETIMER2 = 30;
- public static final String DEFAULT_DOMAIN = "web.att.com";
- public static final String DEFAULT_PROVSRVR_NAME = "feeds-drtr.web.att.com";
- public static final String RESEARCH_SUBNET = "135.207.136.128/25";
- public static final String STATIC_ROUTING_NODES = ""; //Adding new param for static Routing - Rally:US664862-1610
-
- /** A boolean to trigger one time "provisioning changed" event on startup */
- private static boolean startmsg_flag = true;
- /** This POD should require SSL connections from clients; pulled from the DB (PROV_REQUIRE_SECURE) */
- private static boolean require_secure = true;
- /** This POD should require signed, recognized certificates from clients; pulled from the DB (PROV_REQUIRE_CERT) */
- private static boolean require_cert = true;
- /** The set of authorized addresses and networks; pulled from the DB (PROV_AUTH_ADDRESSES) */
- private static Set<String> authorizedAddressesAndNetworks = new HashSet<String>();
- /** The set of authorized names; pulled from the DB (PROV_AUTH_SUBJECTS) */
- private static Set<String> authorizedNames = new HashSet<String>();
- /** The FQDN of the initially "active" provisioning server in this Data Router ecosystem */
- private static String initial_active_pod;
- /** The FQDN of the initially "standby" provisioning server in this Data Router ecosystem */
- private static String initial_standby_pod;
- /** The FQDN of this provisioning server in this Data Router ecosystem */
- private static String this_pod;
- /** "Timer 1" - used to determine when to notify nodes of provisioning changes */
- private static long poke_timer1;
- /** "Timer 2" - used to determine when to notify nodes of provisioning changes */
- private static long poke_timer2;
- /** Array of nodes names and/or FQDNs */
- private static String[] nodes = new String[0];
- /** Array of node IP addresses */
- private static InetAddress[] nodeAddresses = new InetAddress[0];
- /** Array of POD IP addresses */
- private static InetAddress[] podAddresses = new InetAddress[0];
- /** The maximum number of feeds allowed; pulled from the DB (PROV_MAXFEED_COUNT) */
- protected static int max_feeds = 0;
- /** The maximum number of subscriptions allowed; pulled from the DB (PROV_MAXSUB_COUNT) */
- protected static int max_subs = 0;
- /** The current number of feeds in the system */
- protected static int active_feeds = 0;
- /** The current number of subscriptions in the system */
- protected static int active_subs = 0;
- /** The domain used to generate a FQDN from the "bare" node names */
- public static String prov_domain = "web.att.com";
- /** The standard FQDN of the provisioning server in this Data Router ecosystem */
- public static String prov_name = "feeds-drtr.web.att.com";
- /** The standard FQDN of the ACTIVE provisioning server in this Data Router ecosystem */
- public static String active_prov_name = "feeds-drtr.web.att.com";
- /** Special subnet that is allowed access to /internal */
- protected static String special_subnet = RESEARCH_SUBNET;
-
- /** Special subnet that is allowed access to /internal to Lab Machine */
- protected static String special_subnet_secondary = RESEARCH_SUBNET;
- protected static String static_routing_nodes = STATIC_ROUTING_NODES; //Adding new param for static Routing - Rally:US664862-1610
-
- /** This logger is used to log provisioning events */
- protected static Logger eventlogger;
- /** This logger is used to log internal events (errors, etc.) */
- protected static Logger intlogger;
- /** Authorizer - interface to the Policy Engine */
- protected static Authorizer authz;
- /** The Synchronizer used to sync active DB to standby one */
- protected static SynchronizerTask synctask = null;
-
- //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
- private InetAddress thishost;
- private InetAddress loopback;
- private static Boolean mailSendFlag = false;
-
- public static final String MAILCONFIG_FILE = "mail.properties";
- private static Properties mailprops;
- /**
- * Initialize data common to all the provisioning server servlets.
- */
- protected BaseServlet() {
- if (eventlogger == null)
- eventlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.events");
- if (intlogger == null)
- intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- if (authz == null)
- authz = new ProvAuthorizer(this);
- if (startmsg_flag) {
- startmsg_flag = false;
- provisioningParametersChanged();
- }
- if (synctask == null) {
- synctask = SynchronizerTask.getSynchronizer();
- }
- String name = this.getClass().getName();
- intlogger.info("PROV0002 Servlet "+name+" started.");
- }
- @Override
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- try {
- thishost = InetAddress.getLocalHost();
- loopback = InetAddress.getLoopbackAddress();
- checkHttpsRelaxation(); //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
- } catch (UnknownHostException e) {
- // ignore
- }
- }
- protected int getIdFromPath(HttpServletRequest req) {
- String path = req.getPathInfo();
- if (path == null || path.length() < 2)
- return -1;
- try {
- return Integer.parseInt(path.substring(1));
- } catch (NumberFormatException e) {
- return -1;
- }
- }
- /**
- * Read the request's input stream and return a JSONObject from it
- * @param req the HTTP request
- * @return the JSONObject, or null if the stream cannot be parsed
- */
- protected JSONObject getJSONfromInput(HttpServletRequest req) {
- JSONObject jo = null;
- try {
- jo = new JSONObject(new JSONTokener(req.getInputStream()));
- if (intlogger.isDebugEnabled())
- intlogger.debug("JSON: "+jo.toString());
- } catch (Exception e) {
- intlogger.info("Error reading JSON: "+e);
- }
- return jo;
- }
- /**
- * Check if the remote host is authorized to perform provisioning.
- * Is the request secure?
- * Is it coming from an authorized IP address or network (configured via PROV_AUTH_ADDRESSES)?
- * Does it have a valid client certificate (configured via PROV_AUTH_SUBJECTS)?
- * @param request the request
- * @return an error string, or null if all is OK
- */
- protected String isAuthorizedForProvisioning(HttpServletRequest request) {
- // Is the request https?
- if (require_secure && !request.isSecure()) {
- return "Request must be made over an HTTPS connection.";
- }
-
- // Is remote IP authorized?
- String remote = request.getRemoteAddr();
- try {
- boolean found = false;
- InetAddress ip = InetAddress.getByName(remote);
- for (String addrnet : authorizedAddressesAndNetworks) {
- found |= addressMatchesNetwork(ip, addrnet);
- }
- if (!found) {
- return "Unauthorized address: "+remote;
- }
- } catch (UnknownHostException e) {
- return "Unauthorized address: "+remote;
- }
-
- // Does remote have a valid certificate?
- if (require_cert) {
- X509Certificate certs[] = (X509Certificate[]) request.getAttribute(CERT_ATTRIBUTE);
- if (certs == null || certs.length == 0) {
- return "Client certificate is missing.";
- }
- // cert[0] is the client cert
- // see http://www.proto.research.att.com/java/java7/api/javax/net/ssl/SSLSession.html#getPeerCertificates()
- String name = certs[0].getSubjectX500Principal().getName();
- if (!authorizedNames.contains(name)) {
- return "No authorized certificate found.";
- }
- }
-
- // No problems!
- return null;
- }
- /**
- * Check if the remote IP address is authorized to see the /internal URL tree.
- * @param request the HTTP request
- * @return true iff authorized
- */
- protected boolean isAuthorizedForInternal(HttpServletRequest request) {
- try {
- InetAddress ip = InetAddress.getByName(request.getRemoteAddr());
- for (InetAddress node : getNodeAddresses()) {
- if (node != null && ip.equals(node))
- return true;
- }
- for (InetAddress pod : getPodAddresses()) {
- if (pod != null && ip.equals(pod))
- return true;
- }
- if (thishost != null && ip.equals(thishost))
- return true;
- if (loopback != null && ip.equals(loopback))
- return true;
- // Also allow the "special subnet" access
- if (addressMatchesNetwork(ip, special_subnet_secondary))
- return true;
- if (addressMatchesNetwork(ip, special_subnet))
- return true;
- } catch (UnknownHostException e) {
- // ignore
- }
- return false;
- }
- /**
- * Check if an IP address matches a network address.
- * @param ip the IP address
- * @param s the network address; a bare IP address may be matched also
- * @return true if they intersect
- */
- protected static boolean addressMatchesNetwork(InetAddress ip, String s) {
- int mlen = -1;
- int n = s.indexOf("/");
- if (n >= 0) {
- mlen = Integer.parseInt(s.substring(n+1));
- s = s.substring(0, n);
- }
- try {
- InetAddress i2 = InetAddress.getByName(s);
- byte[] b1 = ip.getAddress();
- byte[] b2 = i2.getAddress();
- if (b1.length != b2.length)
- return false;
- if (mlen > 0) {
- byte[] masks = {
- (byte)0x00, (byte)0x80, (byte)0xC0, (byte)0xE0,
- (byte)0xF0, (byte)0xF8, (byte)0xFC, (byte)0xFE
- };
- byte mask = masks[mlen%8];
- for (n = mlen/8; n < b1.length; n++) {
- b1[n] &= mask;
- b2[n] &= mask;
- mask = 0;
- }
- }
- for (n = 0; n < b1.length; n++)
- if (b1[n] != b2[n])
- return false;
- } catch (UnknownHostException e) {
- return false;
- }
- return true;
- }
- /**
- * Something has changed in the provisioning data.
- * Start the timers that will cause the pre-packaged JSON string to be regenerated,
- * and cause nodes and the other provisioning server to be notified.
- */
- public static void provisioningDataChanged() {
- long now = System.currentTimeMillis();
- Poker p = Poker.getPoker();
- p.setTimers(now + (poke_timer1 * 1000L), now + (poke_timer2 * 1000L));
- }
- /**
- * Something in the parameters has changed, reload all parameters from the DB.
- */
- public static void provisioningParametersChanged() {
- Map<String,String> map = Parameters.getParameters();
- require_secure = getBoolean(map, Parameters.PROV_REQUIRE_SECURE);
- require_cert = getBoolean(map, Parameters.PROV_REQUIRE_CERT);
- authorizedAddressesAndNetworks = getSet(map, Parameters.PROV_AUTH_ADDRESSES);
- authorizedNames = getSet (map, Parameters.PROV_AUTH_SUBJECTS);
- nodes = getSet (map, Parameters.NODES).toArray(new String[0]);
- max_feeds = getInt (map, Parameters.PROV_MAXFEED_COUNT, DEFAULT_MAX_FEEDS);
- max_subs = getInt (map, Parameters.PROV_MAXSUB_COUNT, DEFAULT_MAX_SUBS);
- poke_timer1 = getInt (map, Parameters.PROV_POKETIMER1, DEFAULT_POKETIMER1);
- poke_timer2 = getInt (map, Parameters.PROV_POKETIMER2, DEFAULT_POKETIMER2);
- prov_domain = getString (map, Parameters.PROV_DOMAIN, DEFAULT_DOMAIN);
- prov_name = getString (map, Parameters.PROV_NAME, DEFAULT_PROVSRVR_NAME);
- active_prov_name = getString (map, Parameters.PROV_ACTIVE_NAME, prov_name);
- special_subnet = getString (map, Parameters.PROV_SPECIAL_SUBNET, RESEARCH_SUBNET);
- static_routing_nodes = getString (map, Parameters.STATIC_ROUTING_NODES, ""); //Adding new param for static Routing - Rally:US664862-1610
- initial_active_pod = getString (map, Parameters.ACTIVE_POD, "");
- initial_standby_pod = getString (map, Parameters.STANDBY_POD, "");
- static_routing_nodes = getString (map, Parameters.STATIC_ROUTING_NODES, ""); //Adding new param for static Routing - Rally:US664862-1610
- active_feeds = Feed.countActiveFeeds();
- active_subs = Subscription.countActiveSubscriptions();
- try {
- this_pod = InetAddress.getLocalHost().getHostName();
- } catch (UnknownHostException e) {
- this_pod = "";
- intlogger.warn("PROV0014 Cannot determine the name of this provisioning server.");
- }
-
- // Normalize the nodes, and fill in nodeAddresses
- InetAddress[] na = new InetAddress[nodes.length];
- for (int i = 0; i < nodes.length; i++) {
- if (nodes[i].indexOf('.') < 0)
- nodes[i] += "." + prov_domain;
- try {
- na[i] = InetAddress.getByName(nodes[i]);
- intlogger.debug("PROV0003 DNS lookup: "+nodes[i]+" => "+na[i].toString());
- } catch (UnknownHostException e) {
- na[i] = null;
- intlogger.warn("PROV0004 Cannot lookup "+nodes[i]+": "+e);
- }
- }
-
- //Reset Nodes arr after - removing static routing Nodes, Rally Userstory - US664862 .
- List<String> filterNodes = new ArrayList<>();
- for (int i = 0; i < nodes.length; i++) {
- if(!static_routing_nodes.contains(nodes[i])){
- filterNodes.add(nodes[i]);
- }
- }
- String [] filteredNodes = filterNodes.toArray(new String[filterNodes.size()]);
- nodes = filteredNodes;
-
- nodeAddresses = na;
- NodeClass.setNodes(nodes); // update NODES table
-
- // Normalize the PODs, and fill in podAddresses
- String[] pods = getPods();
- na = new InetAddress[pods.length];
- for (int i = 0; i < pods.length; i++) {
- if (pods[i].indexOf('.') < 0)
- pods[i] += "." + prov_domain;
- try {
- na[i] = InetAddress.getByName(pods[i]);
- intlogger.debug("PROV0003 DNS lookup: "+pods[i]+" => "+na[i].toString());
- } catch (UnknownHostException e) {
- na[i] = null;
- intlogger.warn("PROV0004 Cannot lookup "+pods[i]+": "+e);
- }
- }
- podAddresses = na;
-
- // Update ThrottleFilter
- ThrottleFilter.configure();
-
- // Check if we are active or standby POD
- if (!isInitialActivePOD() && !isInitialStandbyPOD())
- intlogger.warn("PROV0015 This machine is neither the active nor the standby POD.");
- }
-
-
- /**Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
- * Load mail properties.
- * @author vs215k
- *
- **/
- private void loadMailProperties() {
- if (mailprops == null) {
- mailprops = new Properties();
- InputStream inStream = getClass().getClassLoader().getResourceAsStream(MAILCONFIG_FILE);
- try {
- mailprops.load(inStream);
- } catch (IOException e) {
- intlogger.fatal("PROV9003 Opening properties: "+e.getMessage());
- e.printStackTrace();
- System.exit(1);
- }
- finally {
- try {
- inStream.close();
- }
- catch (IOException e) {
- }
- }
- }
- }
-
- /**Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
- * Check if HTTPS Relexaction is enabled
- * @author vs215k
- *
- **/
- private void checkHttpsRelaxation() {
- if(mailSendFlag == false) {
- Properties p = (new DB()).getProperties();
- intlogger.info("HTTPS relaxatio: "+p.get("org.onap.dmaap.datarouter.provserver.https.relaxation"));
-
- if(p.get("org.onap.dmaap.datarouter.provserver.https.relaxation").equals("true")) {
- try {
- notifyPSTeam(p.get("org.onap.dmaap.datarouter.provserver.https.relax.notify").toString());
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- mailSendFlag = true;
- }
- }
-
- /**Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
- * @author vs215k
- * @param email - list of email ids to notify if HTTP relexcation is enabled.
- **/
- private void notifyPSTeam(String email) throws Exception {
- loadMailProperties(); //Load HTTPS Relex mail properties.
- String[] emails = email.split(Pattern.quote("|"));
-
- Properties mailproperties = new Properties();
- mailproperties.put("mail.smtp.host", mailprops.get("com.att.dmaap.datarouter.mail.server"));
- mailproperties.put("mail.transport.protocol", mailprops.get("com.att.dmaap.datarouter.mail.protocol"));
-
- Session session = Session.getDefaultInstance(mailproperties, null);
- Multipart mp = new MimeMultipart();
- MimeBodyPart htmlPart = new MimeBodyPart();
-
- try {
-
- Message msg = new MimeMessage(session);
- msg.setFrom(new InternetAddress(mailprops.get("com.att.dmaap.datarouter.mail.from").toString()));
-
- InternetAddress[] addressTo = new InternetAddress[emails.length];
- for ( int x =0 ; x < emails.length; x++) {
- addressTo[x] = new InternetAddress(emails[x]);
- }
-
- msg.addRecipients(Message.RecipientType.TO, addressTo);
- msg.setSubject(mailprops.get("com.att.dmaap.datarouter.mail.subject").toString());
- htmlPart.setContent(mailprops.get("com.att.dmaap.datarouter.mail.body").toString().replace("[SERVER]", InetAddress.getLocalHost().getHostName()), "text/html");
- mp.addBodyPart(htmlPart);
- msg.setContent(mp);
-
- System.out.println(mailprops.get("com.att.dmaap.datarouter.mail.body").toString().replace("[SERVER]", InetAddress.getLocalHost().getHostName()));
-
- Transport.send(msg);
- intlogger.info("HTTPS relaxation mail is sent to - : "+email);
-
- } catch (AddressException e) {
- intlogger.error("Invalid email address, unable to send https relaxation mail to - : "+email);
- } catch (MessagingException e) {
- intlogger.error("Invalid email address, unable to send https relaxation mail to - : "+email);
- }
- }
-
-
- /**
- * Get an array of all node names in the DR network.
- * @return an array of Strings
- */
- public static String[] getNodes() {
- return nodes;
- }
- /**
- * Get an array of all node InetAddresses in the DR network.
- * @return an array of InetAddresses
- */
- public static InetAddress[] getNodeAddresses() {
- return nodeAddresses;
- }
- /**
- * Get an array of all POD names in the DR network.
- * @return an array of Strings
- */
- public static String[] getPods() {
- return new String[] { initial_active_pod, initial_standby_pod };
- }
- /**
- * Get an array of all POD InetAddresses in the DR network.
- * @return an array of InetAddresses
- */
- public static InetAddress[] getPodAddresses() {
- return podAddresses;
- }
- /**
- * Gets the FQDN of the initially ACTIVE provisioning server (POD).
- * Note: this used to be called isActivePOD(), however, that is a misnomer, as the active status
- * could shift to the standby POD without these parameters changing. Hence, the function names
- * have been changed to more accurately reflect their purpose.
- * @return the FQDN
- */
- public static boolean isInitialActivePOD() {
- return this_pod.equals(initial_active_pod);
- }
- /**
- * Gets the FQDN of the initially STANDBY provisioning server (POD).
- * Note: this used to be called isStandbyPOD(), however, that is a misnomer, as the standby status
- * could shift to the active POD without these parameters changing. Hence, the function names
- * have been changed to more accurately reflect their purpose.
- * @return the FQDN
- */
- public static boolean isInitialStandbyPOD() {
- return this_pod.equals(initial_standby_pod);
- }
- /**
- * INSERT an {@link Insertable} bean into the database.
- * @param bean the bean representing a row to insert
- * @return true if the INSERT was successful
- */
- protected boolean doInsert(Insertable bean) {
- boolean rv = false;
- DB db = new DB();
- Connection conn = null;
- try {
- conn = db.getConnection();
- rv = bean.doInsert(conn);
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- if (conn != null)
- db.release(conn);
- }
- return rv;
- }
- /**
- * UPDATE an {@link Updateable} bean in the database.
- * @param bean the bean representing a row to update
- * @return true if the UPDATE was successful
- */
- protected boolean doUpdate(Updateable bean) {
- boolean rv = false;
- DB db = new DB();
- Connection conn = null;
- try {
- conn = db.getConnection();
- rv = bean.doUpdate(conn);
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- if (conn != null)
- db.release(conn);
- }
- return rv;
- }
- /**
- * DELETE an {@link Deleteable} bean from the database.
- * @param bean the bean representing a row to delete
- * @return true if the DELETE was successful
- */
- protected boolean doDelete(Deleteable bean) {
- boolean rv = false;
- DB db = new DB();
- Connection conn = null;
- try {
- conn = db.getConnection();
- rv = bean.doDelete(conn);
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- if (conn != null)
- db.release(conn);
- }
- return rv;
- }
- private static boolean getBoolean(Map<String,String> map, String name) {
- String s = map.get(name);
- return (s != null) && s.equalsIgnoreCase("true");
- }
- private static String getString(Map<String,String> map, String name, String dflt) {
- String s = map.get(name);
- return (s != null) ? s : dflt;
- }
- private static int getInt(Map<String,String> map, String name, int dflt) {
- try {
- String s = map.get(name);
- return Integer.parseInt(s);
- } catch (NumberFormatException e) {
- return dflt;
- }
- }
- private static Set<String> getSet(Map<String,String> map, String name) {
- Set<String> set = new HashSet<String>();
- String s = map.get(name);
- if (s != null) {
- String[] pp = s.split("\\|");
- if (pp != null) {
- for (String t : pp) {
- String t2 = t.trim();
- if (t2.length() > 0)
- set.add(t2);
- }
- }
- }
- return set;
- }
-
- /**
- * A class used to encapsulate a Content-type header, separating out the "version" attribute
- * (which defaults to "1.0" if missing).
- */
- public class ContentHeader {
- private String type = "";
- private Map<String, String> map = new HashMap<String, String>();
- public ContentHeader() {
- this("", "1.0");
- }
- public ContentHeader(String t, String v) {
- type = t.trim();
- map.put("version", v);
- }
- public String getType() {
- return type;
- }
- public String getAttribute(String key) {
- String s = map.get(key);
- if (s == null)
- s = "";
- return s;
- }
- }
-
- /**
- * Get the ContentHeader from an HTTP request.
- * @param req the request
- * @return the header, encapsulated in a ContentHeader object
- */
- public ContentHeader getContentHeader(HttpServletRequest req) {
- ContentHeader ch = new ContentHeader();
- String s = req.getHeader("Content-Type");
- if (s != null) {
- String[] pp = s.split(";");
- ch.type = pp[0].trim();
- for (int i = 1; i < pp.length; i++) {
- int ix = pp[i].indexOf('=');
- if (ix > 0) {
- String k = pp[i].substring(0, ix).trim();
- String v = pp[i].substring(ix+1).trim();
- ch.map.put(k, v);
- } else {
- ch.map.put(pp[i].trim(), "");
- }
- }
- }
- return ch;
- }
- // Methods for the Policy Engine classes - ProvDataProvider interface
- @Override
- public String getFeedOwner(String feedId) {
- try {
- int n = Integer.parseInt(feedId);
- Feed f = Feed.getFeedById(n);
- if (f != null)
- return f.getPublisher();
- } catch (NumberFormatException e) {
- // ignore
- }
- return null;
- }
- @Override
- public String getFeedClassification(String feedId) {
- try {
- int n = Integer.parseInt(feedId);
- Feed f = Feed.getFeedById(n);
- if (f != null)
- return f.getAuthorization().getClassification();
- } catch (NumberFormatException e) {
- // ignore
- }
- return null;
- }
- @Override
- public String getSubscriptionOwner(String subId) {
- try {
- int n = Integer.parseInt(subId);
- Subscription s = Subscription.getSubscriptionById(n);
- if (s != null)
- return s.getSubscriber();
- } catch (NumberFormatException e) {
- // ignore
- }
- return null;
- }
-
- /*
- * @Method - isUserMemberOfGroup - Rally:US708115
- * @Params - group object and user to check if exists in given group
- * @return - boolean value /true/false
- */
- private boolean isUserMemberOfGroup(Group group, String user) {
-
- String groupdetails = group.getMembers().replace("]", "").replace("[", "");
- String s[] = groupdetails.split("},");
-
- for(int i=0; i < s.length; i++) {
- JSONObject jsonObj = null;
- try {
- jsonObj = new JSONObject(s[i]+"}");
- if(jsonObj.get("id").equals(user))
- return true;
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- return false;
-
- }
-
- /*
- * @Method - getGroupByFeedGroupId- Rally:US708115
- * @Params - User to check in group and feedid which is assigned the group.
- * @return - string value grupid/null
- */
- @Override
- public String getGroupByFeedGroupId(String owner, String feedId) {
- try {
- int n = Integer.parseInt(feedId);
- Feed f = Feed.getFeedById(n);
- if (f != null) {
- int groupid = f.getGroupid();
- if(groupid > 0) {
- Group group = Group.getGroupById(groupid);
- if(isUserMemberOfGroup(group, owner)) {
- return group.getAuthid();
- }
- }
- }
- } catch (NumberFormatException e) {
- // ignore
- }
- return null;
- }
-
- /*
- * @Method - getGroupBySubGroupId - Rally:US708115
- * @Params - User to check in group and subid which is assigned the group.
- * @return - string value grupid/null
- */
- @Override
- public String getGroupBySubGroupId(String owner, String subId) {
- try {
- int n = Integer.parseInt(subId);
- Subscription s = Subscription.getSubscriptionById(n);
- if (s != null) {
- int groupid = s.getGroupid();
- if(groupid > 0) {
- Group group = Group.getGroupById(groupid);
- if(isUserMemberOfGroup(group, owner)) {
- return group.getAuthid();
- }
- }
- }
- } catch (NumberFormatException e) {
- // ignore
- }
- return null;
- }
-
- /*
- * @Method - setIpAndFqdnForEelf - Rally:US664892
- * @Params - method, prints method name in EELF log.
- */
- protected void setIpAndFqdnForEelf(String method) {
- MDC.clear();
- MDC.put(MDC_SERVICE_NAME, method);
- try {
- MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
- MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import static com.att.eelf.configuration.Configuration.MDC_SERVER_FQDN;
+
+import static com.att.eelf.configuration.Configuration.MDC_SERVER_IP_ADDRESS;
+import static com.att.eelf.configuration.Configuration.MDC_SERVICE_NAME;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.cert.X509Certificate;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.List;
+import java.util.ArrayList;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.log4j.Logger;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.onap.dmaap.datarouter.authz.Authorizer;
+import org.onap.dmaap.datarouter.authz.impl.ProvAuthorizer;
+import org.onap.dmaap.datarouter.authz.impl.ProvDataProvider;
+import org.onap.dmaap.datarouter.provisioning.beans.Deleteable;
+import org.onap.dmaap.datarouter.provisioning.beans.Feed;
+import org.onap.dmaap.datarouter.provisioning.beans.Group;
+import org.onap.dmaap.datarouter.provisioning.beans.Insertable;
+import org.onap.dmaap.datarouter.provisioning.beans.NodeClass;
+import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
+import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
+import org.onap.dmaap.datarouter.provisioning.beans.Updateable;
+import org.onap.dmaap.datarouter.provisioning.utils.DB;
+import org.onap.dmaap.datarouter.provisioning.utils.ThrottleFilter;
+import org.json.JSONException;
+import org.slf4j.MDC;
+
+import java.util.Properties;
+import java.util.regex.Pattern;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+/**
+ * This is the base class for all Servlets in the provisioning code.
+ * It provides standard constants and some common methods.
+ *
+ * @author Robert Eby
+ * @version $Id: BaseServlet.java,v 1.16 2014/03/12 19:45:40 eby Exp $
+ */
+@SuppressWarnings("serial")
+public class BaseServlet extends HttpServlet implements ProvDataProvider {
+ public static final String BEHALF_HEADER = "X-ATT-DR-ON-BEHALF-OF";
+ public static final String FEED_BASECONTENT_TYPE = "application/vnd.att-dr.feed";
+ public static final String FEED_CONTENT_TYPE = "application/vnd.att-dr.feed; version=2.0";
+ public static final String FEEDFULL_CONTENT_TYPE = "application/vnd.att-dr.feed-full; version=2.0";
+ public static final String FEEDLIST_CONTENT_TYPE = "application/vnd.att-dr.feed-list; version=1.0";
+ public static final String SUB_BASECONTENT_TYPE = "application/vnd.att-dr.subscription";
+ public static final String SUB_CONTENT_TYPE = "application/vnd.att-dr.subscription; version=2.0";
+ public static final String SUBFULL_CONTENT_TYPE = "application/vnd.att-dr.subscription-full; version=2.0";
+ public static final String SUBLIST_CONTENT_TYPE = "application/vnd.att-dr.subscription-list; version=1.0";
+
+
+ //Adding groups functionality, ...1610
+ public static final String GROUP_BASECONTENT_TYPE = "application/vnd.att-dr.group";
+ public static final String GROUP_CONTENT_TYPE = "application/vnd.att-dr.group; version=2.0";
+ public static final String GROUPFULL_CONTENT_TYPE = "application/vnd.att-dr.group-full; version=2.0";
+ public static final String GROUPLIST_CONTENT_TYPE = "application/vnd.att-dr.fegrouped-list; version=1.0";
+
+
+ public static final String LOGLIST_CONTENT_TYPE = "application/vnd.att-dr.log-list; version=1.0";
+ public static final String PROVFULL_CONTENT_TYPE1 = "application/vnd.att-dr.provfeed-full; version=1.0";
+ public static final String PROVFULL_CONTENT_TYPE2 = "application/vnd.att-dr.provfeed-full; version=2.0";
+ public static final String CERT_ATTRIBUTE = "javax.servlet.request.X509Certificate";
+
+ public static final String DB_PROBLEM_MSG = "There has been a problem with the DB. It is suggested you try the operation again.";
+
+ public static final int DEFAULT_MAX_FEEDS = 10000;
+ public static final int DEFAULT_MAX_SUBS = 100000;
+ public static final int DEFAULT_POKETIMER1 = 5;
+ public static final int DEFAULT_POKETIMER2 = 30;
+ public static final String DEFAULT_DOMAIN = "web.att.com";
+ public static final String DEFAULT_PROVSRVR_NAME = "feeds-drtr.web.att.com";
+ public static final String RESEARCH_SUBNET = "135.207.136.128/25";
+ public static final String STATIC_ROUTING_NODES = ""; //Adding new param for static Routing - Rally:US664862-1610
+
+ /** A boolean to trigger one time "provisioning changed" event on startup */
+ private static boolean startmsg_flag = true;
+ /** This POD should require SSL connections from clients; pulled from the DB (PROV_REQUIRE_SECURE) */
+ private static boolean require_secure = true;
+ /** This POD should require signed, recognized certificates from clients; pulled from the DB (PROV_REQUIRE_CERT) */
+ private static boolean require_cert = true;
+ /** The set of authorized addresses and networks; pulled from the DB (PROV_AUTH_ADDRESSES) */
+ private static Set<String> authorizedAddressesAndNetworks = new HashSet<String>();
+ /** The set of authorized names; pulled from the DB (PROV_AUTH_SUBJECTS) */
+ private static Set<String> authorizedNames = new HashSet<String>();
+ /** The FQDN of the initially "active" provisioning server in this Data Router ecosystem */
+ private static String initial_active_pod;
+ /** The FQDN of the initially "standby" provisioning server in this Data Router ecosystem */
+ private static String initial_standby_pod;
+ /** The FQDN of this provisioning server in this Data Router ecosystem */
+ private static String this_pod;
+ /** "Timer 1" - used to determine when to notify nodes of provisioning changes */
+ private static long poke_timer1;
+ /** "Timer 2" - used to determine when to notify nodes of provisioning changes */
+ private static long poke_timer2;
+ /** Array of nodes names and/or FQDNs */
+ private static String[] nodes = new String[0];
+ /** Array of node IP addresses */
+ private static InetAddress[] nodeAddresses = new InetAddress[0];
+ /** Array of POD IP addresses */
+ private static InetAddress[] podAddresses = new InetAddress[0];
+ /** The maximum number of feeds allowed; pulled from the DB (PROV_MAXFEED_COUNT) */
+ protected static int max_feeds = 0;
+ /** The maximum number of subscriptions allowed; pulled from the DB (PROV_MAXSUB_COUNT) */
+ protected static int max_subs = 0;
+ /** The current number of feeds in the system */
+ protected static int active_feeds = 0;
+ /** The current number of subscriptions in the system */
+ protected static int active_subs = 0;
+ /** The domain used to generate a FQDN from the "bare" node names */
+ public static String prov_domain = "web.att.com";
+ /** The standard FQDN of the provisioning server in this Data Router ecosystem */
+ public static String prov_name = "feeds-drtr.web.att.com";
+ /** The standard FQDN of the ACTIVE provisioning server in this Data Router ecosystem */
+ public static String active_prov_name = "feeds-drtr.web.att.com";
+ /** Special subnet that is allowed access to /internal */
+ protected static String special_subnet = RESEARCH_SUBNET;
+
+ /** Special subnet that is allowed access to /internal to Lab Machine */
+ protected static String special_subnet_secondary = RESEARCH_SUBNET;
+ protected static String static_routing_nodes = STATIC_ROUTING_NODES; //Adding new param for static Routing - Rally:US664862-1610
+
+ /** This logger is used to log provisioning events */
+ protected static Logger eventlogger;
+ /** This logger is used to log internal events (errors, etc.) */
+ protected static Logger intlogger;
+ /** Authorizer - interface to the Policy Engine */
+ protected static Authorizer authz;
+ /** The Synchronizer used to sync active DB to standby one */
+ protected static SynchronizerTask synctask = null;
+
+ //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
+ private InetAddress thishost;
+ private InetAddress loopback;
+ private static Boolean mailSendFlag = false;
+
+ public static final String MAILCONFIG_FILE = "mail.properties";
+ private static Properties mailprops;
+ /**
+ * Initialize data common to all the provisioning server servlets.
+ */
+ protected BaseServlet() {
+ if (eventlogger == null)
+ eventlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.events");
+ if (intlogger == null)
+ intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ if (authz == null)
+ authz = new ProvAuthorizer(this);
+ if (startmsg_flag) {
+ startmsg_flag = false;
+ provisioningParametersChanged();
+ }
+ if (synctask == null) {
+ synctask = SynchronizerTask.getSynchronizer();
+ }
+ String name = this.getClass().getName();
+ intlogger.info("PROV0002 Servlet "+name+" started.");
+ }
+ @Override
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ try {
+ thishost = InetAddress.getLocalHost();
+ loopback = InetAddress.getLoopbackAddress();
+ checkHttpsRelaxation(); //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
+ } catch (UnknownHostException e) {
+ // ignore
+ }
+ }
+ protected int getIdFromPath(HttpServletRequest req) {
+ String path = req.getPathInfo();
+ if (path == null || path.length() < 2)
+ return -1;
+ try {
+ return Integer.parseInt(path.substring(1));
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+ /**
+ * Read the request's input stream and return a JSONObject from it
+ * @param req the HTTP request
+ * @return the JSONObject, or null if the stream cannot be parsed
+ */
+ protected JSONObject getJSONfromInput(HttpServletRequest req) {
+ JSONObject jo = null;
+ try {
+ jo = new JSONObject(new JSONTokener(req.getInputStream()));
+ if (intlogger.isDebugEnabled())
+ intlogger.debug("JSON: "+jo.toString());
+ } catch (Exception e) {
+ intlogger.info("Error reading JSON: "+e);
+ }
+ return jo;
+ }
+ /**
+ * Check if the remote host is authorized to perform provisioning.
+ * Is the request secure?
+ * Is it coming from an authorized IP address or network (configured via PROV_AUTH_ADDRESSES)?
+ * Does it have a valid client certificate (configured via PROV_AUTH_SUBJECTS)?
+ * @param request the request
+ * @return an error string, or null if all is OK
+ */
+ protected String isAuthorizedForProvisioning(HttpServletRequest request) {
+ // Is the request https?
+ if (require_secure && !request.isSecure()) {
+ return "Request must be made over an HTTPS connection.";
+ }
+
+ // Is remote IP authorized?
+ String remote = request.getRemoteAddr();
+ try {
+ boolean found = false;
+ InetAddress ip = InetAddress.getByName(remote);
+ for (String addrnet : authorizedAddressesAndNetworks) {
+ found |= addressMatchesNetwork(ip, addrnet);
+ }
+ if (!found) {
+ return "Unauthorized address: "+remote;
+ }
+ } catch (UnknownHostException e) {
+ return "Unauthorized address: "+remote;
+ }
+
+ // Does remote have a valid certificate?
+ if (require_cert) {
+ X509Certificate certs[] = (X509Certificate[]) request.getAttribute(CERT_ATTRIBUTE);
+ if (certs == null || certs.length == 0) {
+ return "Client certificate is missing.";
+ }
+ // cert[0] is the client cert
+ // see http://www.proto.research.att.com/java/java7/api/javax/net/ssl/SSLSession.html#getPeerCertificates()
+ String name = certs[0].getSubjectX500Principal().getName();
+ if (!authorizedNames.contains(name)) {
+ return "No authorized certificate found.";
+ }
+ }
+
+ // No problems!
+ return null;
+ }
+ /**
+ * Check if the remote IP address is authorized to see the /internal URL tree.
+ * @param request the HTTP request
+ * @return true iff authorized
+ */
+ protected boolean isAuthorizedForInternal(HttpServletRequest request) {
+ try {
+ InetAddress ip = InetAddress.getByName(request.getRemoteAddr());
+ for (InetAddress node : getNodeAddresses()) {
+ if (node != null && ip.equals(node))
+ return true;
+ }
+ for (InetAddress pod : getPodAddresses()) {
+ if (pod != null && ip.equals(pod))
+ return true;
+ }
+ if (thishost != null && ip.equals(thishost))
+ return true;
+ if (loopback != null && ip.equals(loopback))
+ return true;
+ // Also allow the "special subnet" access
+ if (addressMatchesNetwork(ip, special_subnet_secondary))
+ return true;
+ if (addressMatchesNetwork(ip, special_subnet))
+ return true;
+ } catch (UnknownHostException e) {
+ // ignore
+ }
+ return false;
+ }
+ /**
+ * Check if an IP address matches a network address.
+ * @param ip the IP address
+ * @param s the network address; a bare IP address may be matched also
+ * @return true if they intersect
+ */
+ protected static boolean addressMatchesNetwork(InetAddress ip, String s) {
+ int mlen = -1;
+ int n = s.indexOf("/");
+ if (n >= 0) {
+ mlen = Integer.parseInt(s.substring(n+1));
+ s = s.substring(0, n);
+ }
+ try {
+ InetAddress i2 = InetAddress.getByName(s);
+ byte[] b1 = ip.getAddress();
+ byte[] b2 = i2.getAddress();
+ if (b1.length != b2.length)
+ return false;
+ if (mlen > 0) {
+ byte[] masks = {
+ (byte)0x00, (byte)0x80, (byte)0xC0, (byte)0xE0,
+ (byte)0xF0, (byte)0xF8, (byte)0xFC, (byte)0xFE
+ };
+ byte mask = masks[mlen%8];
+ for (n = mlen/8; n < b1.length; n++) {
+ b1[n] &= mask;
+ b2[n] &= mask;
+ mask = 0;
+ }
+ }
+ for (n = 0; n < b1.length; n++)
+ if (b1[n] != b2[n])
+ return false;
+ } catch (UnknownHostException e) {
+ return false;
+ }
+ return true;
+ }
+ /**
+ * Something has changed in the provisioning data.
+ * Start the timers that will cause the pre-packaged JSON string to be regenerated,
+ * and cause nodes and the other provisioning server to be notified.
+ */
+ public static void provisioningDataChanged() {
+ long now = System.currentTimeMillis();
+ Poker p = Poker.getPoker();
+ p.setTimers(now + (poke_timer1 * 1000L), now + (poke_timer2 * 1000L));
+ }
+ /**
+ * Something in the parameters has changed, reload all parameters from the DB.
+ */
+ public static void provisioningParametersChanged() {
+ Map<String,String> map = Parameters.getParameters();
+ require_secure = getBoolean(map, Parameters.PROV_REQUIRE_SECURE);
+ require_cert = getBoolean(map, Parameters.PROV_REQUIRE_CERT);
+ authorizedAddressesAndNetworks = getSet(map, Parameters.PROV_AUTH_ADDRESSES);
+ authorizedNames = getSet (map, Parameters.PROV_AUTH_SUBJECTS);
+ nodes = getSet (map, Parameters.NODES).toArray(new String[0]);
+ max_feeds = getInt (map, Parameters.PROV_MAXFEED_COUNT, DEFAULT_MAX_FEEDS);
+ max_subs = getInt (map, Parameters.PROV_MAXSUB_COUNT, DEFAULT_MAX_SUBS);
+ poke_timer1 = getInt (map, Parameters.PROV_POKETIMER1, DEFAULT_POKETIMER1);
+ poke_timer2 = getInt (map, Parameters.PROV_POKETIMER2, DEFAULT_POKETIMER2);
+ prov_domain = getString (map, Parameters.PROV_DOMAIN, DEFAULT_DOMAIN);
+ prov_name = getString (map, Parameters.PROV_NAME, DEFAULT_PROVSRVR_NAME);
+ active_prov_name = getString (map, Parameters.PROV_ACTIVE_NAME, prov_name);
+ special_subnet = getString (map, Parameters.PROV_SPECIAL_SUBNET, RESEARCH_SUBNET);
+ static_routing_nodes = getString (map, Parameters.STATIC_ROUTING_NODES, ""); //Adding new param for static Routing - Rally:US664862-1610
+ initial_active_pod = getString (map, Parameters.ACTIVE_POD, "");
+ initial_standby_pod = getString (map, Parameters.STANDBY_POD, "");
+ static_routing_nodes = getString (map, Parameters.STATIC_ROUTING_NODES, ""); //Adding new param for static Routing - Rally:US664862-1610
+ active_feeds = Feed.countActiveFeeds();
+ active_subs = Subscription.countActiveSubscriptions();
+ try {
+ this_pod = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ this_pod = "";
+ intlogger.warn("PROV0014 Cannot determine the name of this provisioning server.");
+ }
+
+ // Normalize the nodes, and fill in nodeAddresses
+ InetAddress[] na = new InetAddress[nodes.length];
+ for (int i = 0; i < nodes.length; i++) {
+ if (nodes[i].indexOf('.') < 0)
+ nodes[i] += "." + prov_domain;
+ try {
+ na[i] = InetAddress.getByName(nodes[i]);
+ intlogger.debug("PROV0003 DNS lookup: "+nodes[i]+" => "+na[i].toString());
+ } catch (UnknownHostException e) {
+ na[i] = null;
+ intlogger.warn("PROV0004 Cannot lookup "+nodes[i]+": "+e);
+ }
+ }
+
+ //Reset Nodes arr after - removing static routing Nodes, Rally Userstory - US664862 .
+ List<String> filterNodes = new ArrayList<>();
+ for (int i = 0; i < nodes.length; i++) {
+ if(!static_routing_nodes.contains(nodes[i])){
+ filterNodes.add(nodes[i]);
+ }
+ }
+ String [] filteredNodes = filterNodes.toArray(new String[filterNodes.size()]);
+ nodes = filteredNodes;
+
+ nodeAddresses = na;
+ NodeClass.setNodes(nodes); // update NODES table
+
+ // Normalize the PODs, and fill in podAddresses
+ String[] pods = getPods();
+ na = new InetAddress[pods.length];
+ for (int i = 0; i < pods.length; i++) {
+ if (pods[i].indexOf('.') < 0)
+ pods[i] += "." + prov_domain;
+ try {
+ na[i] = InetAddress.getByName(pods[i]);
+ intlogger.debug("PROV0003 DNS lookup: "+pods[i]+" => "+na[i].toString());
+ } catch (UnknownHostException e) {
+ na[i] = null;
+ intlogger.warn("PROV0004 Cannot lookup "+pods[i]+": "+e);
+ }
+ }
+ podAddresses = na;
+
+ // Update ThrottleFilter
+ ThrottleFilter.configure();
+
+ // Check if we are active or standby POD
+ if (!isInitialActivePOD() && !isInitialStandbyPOD())
+ intlogger.warn("PROV0015 This machine is neither the active nor the standby POD.");
+ }
+
+
+ /**Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
+ * Load mail properties.
+ * @author vs215k
+ *
+ **/
+ private void loadMailProperties() {
+ if (mailprops == null) {
+ mailprops = new Properties();
+ InputStream inStream = getClass().getClassLoader().getResourceAsStream(MAILCONFIG_FILE);
+ try {
+ mailprops.load(inStream);
+ } catch (IOException e) {
+ intlogger.fatal("PROV9003 Opening properties: "+e.getMessage());
+ e.printStackTrace();
+ System.exit(1);
+ }
+ finally {
+ try {
+ inStream.close();
+ }
+ catch (IOException e) {
+ }
+ }
+ }
+ }
+
+ /**Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
+ * Check if HTTPS Relexaction is enabled
+ * @author vs215k
+ *
+ **/
+ private void checkHttpsRelaxation() {
+ if(mailSendFlag == false) {
+ Properties p = (new DB()).getProperties();
+ intlogger.info("HTTPS relaxatio: "+p.get("org.onap.dmaap.datarouter.provserver.https.relaxation"));
+
+ if(p.get("org.onap.dmaap.datarouter.provserver.https.relaxation").equals("true")) {
+ try {
+ notifyPSTeam(p.get("org.onap.dmaap.datarouter.provserver.https.relax.notify").toString());
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ mailSendFlag = true;
+ }
+ }
+
+ /**Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
+ * @author vs215k
+ * @param email - list of email ids to notify if HTTP relexcation is enabled.
+ **/
+ private void notifyPSTeam(String email) throws Exception {
+ loadMailProperties(); //Load HTTPS Relex mail properties.
+ String[] emails = email.split(Pattern.quote("|"));
+
+ Properties mailproperties = new Properties();
+ mailproperties.put("mail.smtp.host", mailprops.get("com.att.dmaap.datarouter.mail.server"));
+ mailproperties.put("mail.transport.protocol", mailprops.get("com.att.dmaap.datarouter.mail.protocol"));
+
+ Session session = Session.getDefaultInstance(mailproperties, null);
+ Multipart mp = new MimeMultipart();
+ MimeBodyPart htmlPart = new MimeBodyPart();
+
+ try {
+
+ Message msg = new MimeMessage(session);
+ msg.setFrom(new InternetAddress(mailprops.get("com.att.dmaap.datarouter.mail.from").toString()));
+
+ InternetAddress[] addressTo = new InternetAddress[emails.length];
+ for ( int x =0 ; x < emails.length; x++) {
+ addressTo[x] = new InternetAddress(emails[x]);
+ }
+
+ msg.addRecipients(Message.RecipientType.TO, addressTo);
+ msg.setSubject(mailprops.get("com.att.dmaap.datarouter.mail.subject").toString());
+ htmlPart.setContent(mailprops.get("com.att.dmaap.datarouter.mail.body").toString().replace("[SERVER]", InetAddress.getLocalHost().getHostName()), "text/html");
+ mp.addBodyPart(htmlPart);
+ msg.setContent(mp);
+
+ System.out.println(mailprops.get("com.att.dmaap.datarouter.mail.body").toString().replace("[SERVER]", InetAddress.getLocalHost().getHostName()));
+
+ Transport.send(msg);
+ intlogger.info("HTTPS relaxation mail is sent to - : "+email);
+
+ } catch (AddressException e) {
+ intlogger.error("Invalid email address, unable to send https relaxation mail to - : "+email);
+ } catch (MessagingException e) {
+ intlogger.error("Invalid email address, unable to send https relaxation mail to - : "+email);
+ }
+ }
+
+
+ /**
+ * Get an array of all node names in the DR network.
+ * @return an array of Strings
+ */
+ public static String[] getNodes() {
+ return nodes;
+ }
+ /**
+ * Get an array of all node InetAddresses in the DR network.
+ * @return an array of InetAddresses
+ */
+ public static InetAddress[] getNodeAddresses() {
+ return nodeAddresses;
+ }
+ /**
+ * Get an array of all POD names in the DR network.
+ * @return an array of Strings
+ */
+ public static String[] getPods() {
+ return new String[] { initial_active_pod, initial_standby_pod };
+ }
+ /**
+ * Get an array of all POD InetAddresses in the DR network.
+ * @return an array of InetAddresses
+ */
+ public static InetAddress[] getPodAddresses() {
+ return podAddresses;
+ }
+ /**
+ * Gets the FQDN of the initially ACTIVE provisioning server (POD).
+ * Note: this used to be called isActivePOD(), however, that is a misnomer, as the active status
+ * could shift to the standby POD without these parameters changing. Hence, the function names
+ * have been changed to more accurately reflect their purpose.
+ * @return the FQDN
+ */
+ public static boolean isInitialActivePOD() {
+ return this_pod.equals(initial_active_pod);
+ }
+ /**
+ * Gets the FQDN of the initially STANDBY provisioning server (POD).
+ * Note: this used to be called isStandbyPOD(), however, that is a misnomer, as the standby status
+ * could shift to the active POD without these parameters changing. Hence, the function names
+ * have been changed to more accurately reflect their purpose.
+ * @return the FQDN
+ */
+ public static boolean isInitialStandbyPOD() {
+ return this_pod.equals(initial_standby_pod);
+ }
+ /**
+ * INSERT an {@link Insertable} bean into the database.
+ * @param bean the bean representing a row to insert
+ * @return true if the INSERT was successful
+ */
+ protected boolean doInsert(Insertable bean) {
+ boolean rv = false;
+ DB db = new DB();
+ Connection conn = null;
+ try {
+ conn = db.getConnection();
+ rv = bean.doInsert(conn);
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0005 doInsert: "+e.getMessage());
+ e.printStackTrace();
+ } finally {
+ if (conn != null)
+ db.release(conn);
+ }
+ return rv;
+ }
+ /**
+ * UPDATE an {@link Updateable} bean in the database.
+ * @param bean the bean representing a row to update
+ * @return true if the UPDATE was successful
+ */
+ protected boolean doUpdate(Updateable bean) {
+ boolean rv = false;
+ DB db = new DB();
+ Connection conn = null;
+ try {
+ conn = db.getConnection();
+ rv = bean.doUpdate(conn);
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
+ e.printStackTrace();
+ } finally {
+ if (conn != null)
+ db.release(conn);
+ }
+ return rv;
+ }
+ /**
+ * DELETE an {@link Deleteable} bean from the database.
+ * @param bean the bean representing a row to delete
+ * @return true if the DELETE was successful
+ */
+ protected boolean doDelete(Deleteable bean) {
+ boolean rv = false;
+ DB db = new DB();
+ Connection conn = null;
+ try {
+ conn = db.getConnection();
+ rv = bean.doDelete(conn);
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: "+e.getMessage());
+ e.printStackTrace();
+ } finally {
+ if (conn != null)
+ db.release(conn);
+ }
+ return rv;
+ }
+ private static boolean getBoolean(Map<String,String> map, String name) {
+ String s = map.get(name);
+ return (s != null) && s.equalsIgnoreCase("true");
+ }
+ private static String getString(Map<String,String> map, String name, String dflt) {
+ String s = map.get(name);
+ return (s != null) ? s : dflt;
+ }
+ private static int getInt(Map<String,String> map, String name, int dflt) {
+ try {
+ String s = map.get(name);
+ return Integer.parseInt(s);
+ } catch (NumberFormatException e) {
+ return dflt;
+ }
+ }
+ private static Set<String> getSet(Map<String,String> map, String name) {
+ Set<String> set = new HashSet<String>();
+ String s = map.get(name);
+ if (s != null) {
+ String[] pp = s.split("\\|");
+ if (pp != null) {
+ for (String t : pp) {
+ String t2 = t.trim();
+ if (t2.length() > 0)
+ set.add(t2);
+ }
+ }
+ }
+ return set;
+ }
+
+ /**
+ * A class used to encapsulate a Content-type header, separating out the "version" attribute
+ * (which defaults to "1.0" if missing).
+ */
+ public class ContentHeader {
+ private String type = "";
+ private Map<String, String> map = new HashMap<String, String>();
+ public ContentHeader() {
+ this("", "1.0");
+ }
+ public ContentHeader(String t, String v) {
+ type = t.trim();
+ map.put("version", v);
+ }
+ public String getType() {
+ return type;
+ }
+ public String getAttribute(String key) {
+ String s = map.get(key);
+ if (s == null)
+ s = "";
+ return s;
+ }
+ }
+
+ /**
+ * Get the ContentHeader from an HTTP request.
+ * @param req the request
+ * @return the header, encapsulated in a ContentHeader object
+ */
+ public ContentHeader getContentHeader(HttpServletRequest req) {
+ ContentHeader ch = new ContentHeader();
+ String s = req.getHeader("Content-Type");
+ if (s != null) {
+ String[] pp = s.split(";");
+ ch.type = pp[0].trim();
+ for (int i = 1; i < pp.length; i++) {
+ int ix = pp[i].indexOf('=');
+ if (ix > 0) {
+ String k = pp[i].substring(0, ix).trim();
+ String v = pp[i].substring(ix+1).trim();
+ ch.map.put(k, v);
+ } else {
+ ch.map.put(pp[i].trim(), "");
+ }
+ }
+ }
+ return ch;
+ }
+ // Methods for the Policy Engine classes - ProvDataProvider interface
+ @Override
+ public String getFeedOwner(String feedId) {
+ try {
+ int n = Integer.parseInt(feedId);
+ Feed f = Feed.getFeedById(n);
+ if (f != null)
+ return f.getPublisher();
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+ @Override
+ public String getFeedClassification(String feedId) {
+ try {
+ int n = Integer.parseInt(feedId);
+ Feed f = Feed.getFeedById(n);
+ if (f != null)
+ return f.getAuthorization().getClassification();
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+ @Override
+ public String getSubscriptionOwner(String subId) {
+ try {
+ int n = Integer.parseInt(subId);
+ Subscription s = Subscription.getSubscriptionById(n);
+ if (s != null)
+ return s.getSubscriber();
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+
+ /*
+ * @Method - isUserMemberOfGroup - Rally:US708115
+ * @Params - group object and user to check if exists in given group
+ * @return - boolean value /true/false
+ */
+ private boolean isUserMemberOfGroup(Group group, String user) {
+
+ String groupdetails = group.getMembers().replace("]", "").replace("[", "");
+ String s[] = groupdetails.split("},");
+
+ for(int i=0; i < s.length; i++) {
+ JSONObject jsonObj = null;
+ try {
+ jsonObj = new JSONObject(s[i]+"}");
+ if(jsonObj.get("id").equals(user))
+ return true;
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+
+ }
+
+ /*
+ * @Method - getGroupByFeedGroupId- Rally:US708115
+ * @Params - User to check in group and feedid which is assigned the group.
+ * @return - string value grupid/null
+ */
+ @Override
+ public String getGroupByFeedGroupId(String owner, String feedId) {
+ try {
+ int n = Integer.parseInt(feedId);
+ Feed f = Feed.getFeedById(n);
+ if (f != null) {
+ int groupid = f.getGroupid();
+ if(groupid > 0) {
+ Group group = Group.getGroupById(groupid);
+ if(isUserMemberOfGroup(group, owner)) {
+ return group.getAuthid();
+ }
+ }
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+
+ /*
+ * @Method - getGroupBySubGroupId - Rally:US708115
+ * @Params - User to check in group and subid which is assigned the group.
+ * @return - string value grupid/null
+ */
+ @Override
+ public String getGroupBySubGroupId(String owner, String subId) {
+ try {
+ int n = Integer.parseInt(subId);
+ Subscription s = Subscription.getSubscriptionById(n);
+ if (s != null) {
+ int groupid = s.getGroupid();
+ if(groupid > 0) {
+ Group group = Group.getGroupById(groupid);
+ if(isUserMemberOfGroup(group, owner)) {
+ return group.getAuthid();
+ }
+ }
+ }
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ return null;
+ }
+
+ /*
+ * @Method - setIpAndFqdnForEelf - Rally:US664892
+ * @Params - method, prints method name in EELF log.
+ */
+ protected void setIpAndFqdnForEelf(String method) {
+ MDC.clear();
+ MDC.put(MDC_SERVICE_NAME, method);
+ try {
+ MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
+ MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServlet.java
index 135d157e..dc9ec3ad 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/DRFeedsServlet.java
@@ -1,300 +1,300 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.IOException;
-import java.io.InvalidObjectException;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.json.JSONObject;
-import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
-import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
-import org.onap.dmaap.datarouter.provisioning.beans.Feed;
-import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
-import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-/**
- * This servlet handles provisioning for the &lt;drFeedsURL&gt; which is the URL on the
- * provisioning server used to create new feeds. It supports POST to create new feeds,
- * and GET to support the Feeds Collection Query function.
- *
- * @author Robert Eby
- * @version $Id$
- */
-@SuppressWarnings("serial")
-public class DRFeedsServlet extends ProxyServlet {
- //Adding EELF Logger Rally:US664892
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.DRFeedsServlet");
-
- /**
- * DELETE on the &lt;drFeedsURL&gt; -- not supported.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- String message = "DELETE not allowed for the drFeedsURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * GET on the &lt;drFeedsURL&gt; -- query the list of feeds already existing in the DB.
- * See the <i>Feeds Collection Queries</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doGet(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- String path = req.getRequestURI(); // Note: I think this should be getPathInfo(), but that doesn't work (Jetty bug?)
- if (path != null && !path.equals("/")) {
- message = "Bad URL.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
-
- String name = req.getParameter("name");
- String vers = req.getParameter("version");
- String publ = req.getParameter("publisher");
- String subs = req.getParameter("subscriber");
- if (name != null && vers != null) {
- // Display a specific feed
- Feed feed = Feed.getFeedByNameVersion(name, vers);
- if (feed == null || feed.isDeleted()) {
- message = "This feed does not exist in the database.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- } else {
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(FEEDFULL_CONTENT_TYPE);
- resp.getOutputStream().print(feed.asJSONObject(true).toString());
- }
- } else {
- // Display a list of URLs
- List<String> list = null;
- if (name != null) {
- list = Feed.getFilteredFeedUrlList("name", name);
- } else if (publ != null) {
- list = Feed.getFilteredFeedUrlList("publ", publ);
- } else if (subs != null) {
- list = Feed.getFilteredFeedUrlList("subs", subs);
- } else {
- list = Feed.getFilteredFeedUrlList("all", null);
- }
- String t = JSONUtilities.createJSONArray(list);
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(FEEDLIST_CONTENT_TYPE);
- resp.getOutputStream().print(t);
- }
- }
- /**
- * PUT on the &lt;drFeedsURL&gt; -- not supported.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- String message = "PUT not allowed for the drFeedsURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * POST on the &lt;drFeedsURL&gt; -- create a new feed.
- * See the <i>Creating a Feed</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPost");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doPost(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- String path = req.getRequestURI(); // Note: I think this should be getPathInfo(), but that doesn't work (Jetty bug?)
- if (path != null && !path.equals("/")) {
- message = "Bad URL.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // check content type is FEED_CONTENT_TYPE, version 1.0
- ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(FEED_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- JSONObject jo = getJSONfromInput(req);
- if (jo == null) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (intlogger.isDebugEnabled())
- intlogger.debug(jo.toString());
- if (++active_feeds > max_feeds) {
- active_feeds--;
- message = "Cannot create feed; the maximum number of feeds has been configured.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_CONFLICT);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_CONFLICT, message);
- return;
- }
- Feed feed = null;
- try {
- feed = new Feed(jo);
- } catch (InvalidObjectException e) {
- message = e.getMessage();
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- feed.setPublisher(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
-
- // Check if this feed already exists
- Feed feed2 = Feed.getFeedByNameVersion(feed.getName(), feed.getVersion());
- if (feed2 != null) {
- message = "This feed already exists in the database.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
-
- // Create FEED table entries
- if (doInsert(feed)) {
- // send response
- elr.setResult(HttpServletResponse.SC_CREATED);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_CREATED);
- resp.setContentType(FEEDFULL_CONTENT_TYPE);
- resp.setHeader("Location", feed.getLinks().getSelf());
- resp.getOutputStream().print(feed.asLimitedJSONObject().toString());
- provisioningDataChanged();
- } else {
- // Something went wrong with the INSERT
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.IOException;
+import java.io.InvalidObjectException;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
+import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
+import org.onap.dmaap.datarouter.provisioning.beans.Feed;
+import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
+import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+/**
+ * This servlet handles provisioning for the &lt;drFeedsURL&gt; which is the URL on the
+ * provisioning server used to create new feeds. It supports POST to create new feeds,
+ * and GET to support the Feeds Collection Query function.
+ *
+ * @author Robert Eby
+ * @version $Id$
+ */
+@SuppressWarnings("serial")
+public class DRFeedsServlet extends ProxyServlet {
+ //Adding EELF Logger Rally:US664892
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.DRFeedsServlet");
+
+ /**
+ * DELETE on the &lt;drFeedsURL&gt; -- not supported.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ String message = "DELETE not allowed for the drFeedsURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * GET on the &lt;drFeedsURL&gt; -- query the list of feeds already existing in the DB.
+ * See the <i>Feeds Collection Queries</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doGet(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ String path = req.getRequestURI(); // Note: I think this should be getPathInfo(), but that doesn't work (Jetty bug?)
+ if (path != null && !path.equals("/")) {
+ message = "Bad URL.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+
+ String name = req.getParameter("name");
+ String vers = req.getParameter("version");
+ String publ = req.getParameter("publisher");
+ String subs = req.getParameter("subscriber");
+ if (name != null && vers != null) {
+ // Display a specific feed
+ Feed feed = Feed.getFeedByNameVersion(name, vers);
+ if (feed == null || feed.isDeleted()) {
+ message = "This feed does not exist in the database.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ } else {
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(FEEDFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(feed.asJSONObject(true).toString());
+ }
+ } else {
+ // Display a list of URLs
+ List<String> list = null;
+ if (name != null) {
+ list = Feed.getFilteredFeedUrlList("name", name);
+ } else if (publ != null) {
+ list = Feed.getFilteredFeedUrlList("publ", publ);
+ } else if (subs != null) {
+ list = Feed.getFilteredFeedUrlList("subs", subs);
+ } else {
+ list = Feed.getFilteredFeedUrlList("all", null);
+ }
+ String t = JSONUtilities.createJSONArray(list);
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(FEEDLIST_CONTENT_TYPE);
+ resp.getOutputStream().print(t);
+ }
+ }
+ /**
+ * PUT on the &lt;drFeedsURL&gt; -- not supported.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ String message = "PUT not allowed for the drFeedsURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * POST on the &lt;drFeedsURL&gt; -- create a new feed.
+ * See the <i>Creating a Feed</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPost");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doPost(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ String path = req.getRequestURI(); // Note: I think this should be getPathInfo(), but that doesn't work (Jetty bug?)
+ if (path != null && !path.equals("/")) {
+ message = "Bad URL.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // check content type is FEED_CONTENT_TYPE, version 1.0
+ ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(FEED_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ JSONObject jo = getJSONfromInput(req);
+ if (jo == null) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (intlogger.isDebugEnabled())
+ intlogger.debug(jo.toString());
+ if (++active_feeds > max_feeds) {
+ active_feeds--;
+ message = "Cannot create feed; the maximum number of feeds has been configured.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_CONFLICT);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_CONFLICT, message);
+ return;
+ }
+ Feed feed = null;
+ try {
+ feed = new Feed(jo);
+ } catch (InvalidObjectException e) {
+ message = e.getMessage();
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ feed.setPublisher(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
+
+ // Check if this feed already exists
+ Feed feed2 = Feed.getFeedByNameVersion(feed.getName(), feed.getVersion());
+ if (feed2 != null) {
+ message = "This feed already exists in the database.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+
+ // Create FEED table entries
+ if (doInsert(feed)) {
+ // send response
+ elr.setResult(HttpServletResponse.SC_CREATED);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_CREATED);
+ resp.setContentType(FEEDFULL_CONTENT_TYPE);
+ resp.setHeader("Location", feed.getLinks().getSelf());
+ resp.getOutputStream().print(feed.asLimitedJSONObject().toString());
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the INSERT
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedLogServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedLogServlet.java
index f5a2f7a8..7ac4bbee 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedLogServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedLogServlet.java
@@ -7,9 +7,9 @@
* * 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.
@@ -32,7 +32,7 @@ package org.onap.dmaap.datarouter.provisioning;
*/
@SuppressWarnings("serial")
public class FeedLogServlet extends LogServlet {
- public FeedLogServlet() {
- super(true);
- }
+ public FeedLogServlet() {
+ super(true);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedServlet.java
index b9056744..d0f529c9 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/FeedServlet.java
@@ -1,362 +1,362 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.IOException;
-import java.io.InvalidObjectException;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.json.JSONObject;
-import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
-import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
-import org.onap.dmaap.datarouter.provisioning.beans.Feed;
-import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-/**
- * This servlet handles provisioning for the &lt;feedURL&gt; which is generated by the provisioning
- * server to handle a particular feed. It supports DELETE to mark the feed as deleted,
- * and GET to retrieve information about the feed, and PUT to modify the feed.
- *
- * @author Robert Eby
- * @version $Id$
- */
-@SuppressWarnings("serial")
-public class FeedServlet extends ProxyServlet {
-
- //Adding EELF Logger Rally:US664892
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.FeedServlet");
-
- /**
- * Delete the Feed at the address /feed/&lt;feednumber&gt;.
- * See the <i>Deleting a Feed</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doDelete(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int feedid = getIdFromPath(req);
- if (feedid < 0) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Feed feed = Feed.getFeedById(feedid);
- if (feed == null || feed.isDeleted()) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
-
- // Delete FEED table entry (set DELETED flag)
- feed.setDeleted(true);
- if (doUpdate(feed)) {
- active_feeds--;
- // send response
- elr.setResult(HttpServletResponse.SC_NO_CONTENT);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
- provisioningDataChanged();
- } else {
- // Something went wrong with the UPDATE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
- /**
- * Get information on the feed at the address /feed/&lt;feednumber&gt;.
- * See the <i>Retrieving Information about a Feed</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doGet(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int feedid = getIdFromPath(req);
- if (feedid < 0) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Feed feed = Feed.getFeedById(feedid);
- if (feed == null || feed.isDeleted()) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
-
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(FEEDFULL_CONTENT_TYPE);
- resp.getOutputStream().print(feed.asJSONObject(true).toString());
- }
- /**
- * PUT on the &lt;feedURL&gt; for a feed.
- * See the <i>Modifying a Feed</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doPut(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int feedid = getIdFromPath(req);
- if (feedid < 0) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Feed oldFeed = Feed.getFeedById(feedid);
- if (oldFeed == null || oldFeed.isDeleted()) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // check content type is FEED_CONTENT_TYPE, version 1.0
- ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(FEED_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }
- JSONObject jo = getJSONfromInput(req);
- if (jo == null) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (intlogger.isDebugEnabled())
- intlogger.debug(jo.toString());
- Feed feed = null;
- try {
- feed = new Feed(jo);
- } catch (InvalidObjectException e) {
- message = e.getMessage();
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- feed.setFeedid(feedid);
- feed.setPublisher(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
-
- String subjectgroup = (req.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")); //Adding for group feature:Rally US708115
- if (!oldFeed.getPublisher().equals(feed.getPublisher()) && subjectgroup == null) {
- message = "This feed must be modified by the same publisher that created it.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (!oldFeed.getName().equals(feed.getName())) {
- message = "The name of the feed may not be updated.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (!oldFeed.getVersion().equals(feed.getVersion())) {
- message = "The version of the feed may not be updated.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
-
- // Update FEEDS table entries
- if (doUpdate(feed)) {
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(FEEDFULL_CONTENT_TYPE);
- resp.getOutputStream().print(feed.asLimitedJSONObject().toString());
-
-
- /**Change Owner ship of Feed //Adding for group feature:Rally US708115*/
- if (jo.has("changeowner") && subjectgroup != null) {
- Boolean changeowner = (Boolean) jo.get("changeowner");
- if (changeowner != null && changeowner.equals(true)) {
- feed.setPublisher(req.getHeader(BEHALF_HEADER));
- feed.changeOwnerShip();
- }
- }
- /***End of change ownership*/
-
- provisioningDataChanged();
- } else {
- // Something went wrong with the UPDATE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
- /**
- * POST on the &lt;feedURL&gt; -- not supported.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPost");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
- String message = "POST not allowed for the feedURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.IOException;
+import java.io.InvalidObjectException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
+import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
+import org.onap.dmaap.datarouter.provisioning.beans.Feed;
+import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+/**
+ * This servlet handles provisioning for the &lt;feedURL&gt; which is generated by the provisioning
+ * server to handle a particular feed. It supports DELETE to mark the feed as deleted,
+ * and GET to retrieve information about the feed, and PUT to modify the feed.
+ *
+ * @author Robert Eby
+ * @version $Id$
+ */
+@SuppressWarnings("serial")
+public class FeedServlet extends ProxyServlet {
+
+ //Adding EELF Logger Rally:US664892
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.FeedServlet");
+
+ /**
+ * Delete the Feed at the address /feed/&lt;feednumber&gt;.
+ * See the <i>Deleting a Feed</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doDelete(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int feedid = getIdFromPath(req);
+ if (feedid < 0) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Feed feed = Feed.getFeedById(feedid);
+ if (feed == null || feed.isDeleted()) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+
+ // Delete FEED table entry (set DELETED flag)
+ feed.setDeleted(true);
+ if (doUpdate(feed)) {
+ active_feeds--;
+ // send response
+ elr.setResult(HttpServletResponse.SC_NO_CONTENT);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the UPDATE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+ /**
+ * Get information on the feed at the address /feed/&lt;feednumber&gt;.
+ * See the <i>Retrieving Information about a Feed</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doGet(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int feedid = getIdFromPath(req);
+ if (feedid < 0) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Feed feed = Feed.getFeedById(feedid);
+ if (feed == null || feed.isDeleted()) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(FEEDFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(feed.asJSONObject(true).toString());
+ }
+ /**
+ * PUT on the &lt;feedURL&gt; for a feed.
+ * See the <i>Modifying a Feed</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doPut(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int feedid = getIdFromPath(req);
+ if (feedid < 0) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Feed oldFeed = Feed.getFeedById(feedid);
+ if (oldFeed == null || oldFeed.isDeleted()) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // check content type is FEED_CONTENT_TYPE, version 1.0
+ ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(FEED_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }
+ JSONObject jo = getJSONfromInput(req);
+ if (jo == null) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (intlogger.isDebugEnabled())
+ intlogger.debug(jo.toString());
+ Feed feed = null;
+ try {
+ feed = new Feed(jo);
+ } catch (InvalidObjectException e) {
+ message = e.getMessage();
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ feed.setFeedid(feedid);
+ feed.setPublisher(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
+
+ String subjectgroup = (req.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")); //Adding for group feature:Rally US708115
+ if (!oldFeed.getPublisher().equals(feed.getPublisher()) && subjectgroup == null) {
+ message = "This feed must be modified by the same publisher that created it.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (!oldFeed.getName().equals(feed.getName())) {
+ message = "The name of the feed may not be updated.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (!oldFeed.getVersion().equals(feed.getVersion())) {
+ message = "The version of the feed may not be updated.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+
+ // Update FEEDS table entries
+ if (doUpdate(feed)) {
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(FEEDFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(feed.asLimitedJSONObject().toString());
+
+
+ /**Change Owner ship of Feed //Adding for group feature:Rally US708115*/
+ if (jo.has("changeowner") && subjectgroup != null) {
+ Boolean changeowner = (Boolean) jo.get("changeowner");
+ if (changeowner != null && changeowner.equals(true)) {
+ feed.setPublisher(req.getHeader(BEHALF_HEADER));
+ feed.changeOwnerShip();
+ }
+ }
+ /***End of change ownership*/
+
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the UPDATE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+ /**
+ * POST on the &lt;feedURL&gt; -- not supported.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPost");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
+ String message = "POST not allowed for the feedURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/GroupServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/GroupServlet.java
index aa89dd2f..8537ff4b 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/GroupServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/GroupServlet.java
@@ -1,385 +1,385 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.IOException;
-import java.io.InvalidObjectException;
-import java.util.Collection;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.json.JSONObject;
-import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
-import org.onap.dmaap.datarouter.provisioning.BaseServlet.ContentHeader;
-import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
-import org.onap.dmaap.datarouter.provisioning.beans.Group;
-import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
-import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;
-
-/**
- * This servlet handles provisioning for the &lt;groups&gt; which is generated by the provisioning
- * server to handle the creation and inspection of groups for FEEDS and SUBSCRIPTIONS.
- *
- * @author Vikram Singh
- * @version $Id$
- * @version $Id: Group.java,v 1.0 2016/07/19
- */
-@SuppressWarnings("serial")
-public class GroupServlet extends ProxyServlet {
- /**
- * DELETE on the &lt;GRUPS&gt; -- not supported.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- String message = "DELETE not allowed for the GROUPS.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * GET on the the list of groups to a feed/sub.
- * See the <i>Groups Collection Query</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doGet(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
-
- // Check with the Authorizer
- /*AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }*/
-
-
- /*ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(GROUPLIST_CONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
- intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }*/
-
-
- int groupid = getIdFromPath(req);
- if (groupid < 0) {
- message = "Missing or bad group number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
-
- Group gup = Group.getGroupById(groupid);
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(GROUPFULL_CONTENT_TYPE);
- resp.getOutputStream().print(gup.asJSONObject().toString());
-
- // Display a list of Groups
- /*Collection<Group> list = Group.getGroupById(groupid);
- String t = JSONUtilities.createJSONArray(list);
-
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(GROUPLIST_CONTENT_TYPE);
- resp.getOutputStream().print(t);*/
- }
- /**
- * PUT on the &lt;GROUPS&gt; -- not supported.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doPut(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int groupid = getIdFromPath(req);
- if (groupid < 0) {
- message = "Missing or bad groupid.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Group oldgup = Group.getGroupById(groupid);
- if (oldgup == null) {
- message = "Missing or bad group number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- /*AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }*/
- // check content type is SUB_CONTENT_TYPE, version 1.0
- ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }
- JSONObject jo = getJSONfromInput(req);
- if (jo == null) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (intlogger.isDebugEnabled())
- intlogger.debug(jo.toString());
- Group gup = null;
- try {
- gup = new Group(jo);
- } catch (InvalidObjectException e) {
- message = e.getMessage();
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- gup.setGroupid(oldgup.getGroupid());
-
-
- Group gb2 = Group.getGroupMatching(gup, oldgup.getGroupid());
- if (gb2 != null) {
- eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName());
- return;
- }
-
- // Update Groups table entries
- if (doUpdate(gup)) {
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(GROUPFULL_CONTENT_TYPE);
- resp.getOutputStream().print(gup.asJSONObject().toString());
- provisioningDataChanged();
- } else {
- // Something went wrong with the UPDATE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
- /**
- * POST on the &lt;groups&gt; -- create a new GROUPS to a feed.
- * See the <i>Creating a GROUPS</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doPost(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- /*int feedid = getIdFromPath(req);
- if (feedid < 0) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Feed feed = Feed.getFeedById(feedid);
- if (feed == null || feed.isDeleted()) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }*/
- // Check with the Authorizer
- /*AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }*/
-
- // check content type is SUB_CONTENT_TYPE, version 1.0
- ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
- intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }
- JSONObject jo = getJSONfromInput(req);
- if (jo == null) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (intlogger.isDebugEnabled())
- intlogger.debug(jo.toString());
-
- Group gup = null;
- try {
- gup = new Group(jo);
- } catch (InvalidObjectException e) {
- message = e.getMessage();
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- //gup.setFeedid(feedid);
- //sub.setSubscriber(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
-
- // Check if this group already exists; not an error (yet), just warn
- Group gb2 = Group.getGroupMatching(gup);
- if (gb2 != null) {
- eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName());
- return;
- }
-
-
- // Create GROUPS table entries
- if (doInsert(gup)) {
- // send response
- elr.setResult(HttpServletResponse.SC_CREATED);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_CREATED);
- resp.setContentType(GROUPFULL_CONTENT_TYPE);
- resp.getOutputStream().print(gup.asJSONObject().toString());
- provisioningDataChanged();
- } else {
- // Something went wrong with the INSERT
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.IOException;
+import java.io.InvalidObjectException;
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
+import org.onap.dmaap.datarouter.provisioning.BaseServlet.ContentHeader;
+import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
+import org.onap.dmaap.datarouter.provisioning.beans.Group;
+import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
+import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;
+
+/**
+ * This servlet handles provisioning for the &lt;groups&gt; which is generated by the provisioning
+ * server to handle the creation and inspection of groups for FEEDS and SUBSCRIPTIONS.
+ *
+ * @author Vikram Singh
+ * @version $Id$
+ * @version $Id: Group.java,v 1.0 2016/07/19
+ */
+@SuppressWarnings("serial")
+public class GroupServlet extends ProxyServlet {
+ /**
+ * DELETE on the &lt;GRUPS&gt; -- not supported.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ String message = "DELETE not allowed for the GROUPS.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * GET on the the list of groups to a feed/sub.
+ * See the <i>Groups Collection Query</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doGet(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+
+ // Check with the Authorizer
+ /*AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }*/
+
+
+ /*ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(GROUPLIST_CONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
+ intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }*/
+
+
+ int groupid = getIdFromPath(req);
+ if (groupid < 0) {
+ message = "Missing or bad group number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+
+ Group gup = Group.getGroupById(groupid);
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(GROUPFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(gup.asJSONObject().toString());
+
+ // Display a list of Groups
+ /*Collection<Group> list = Group.getGroupById(groupid);
+ String t = JSONUtilities.createJSONArray(list);
+
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(GROUPLIST_CONTENT_TYPE);
+ resp.getOutputStream().print(t);*/
+ }
+ /**
+ * PUT on the &lt;GROUPS&gt; -- not supported.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doPut(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int groupid = getIdFromPath(req);
+ if (groupid < 0) {
+ message = "Missing or bad groupid.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Group oldgup = Group.getGroupById(groupid);
+ if (oldgup == null) {
+ message = "Missing or bad group number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ /*AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }*/
+ // check content type is SUB_CONTENT_TYPE, version 1.0
+ ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }
+ JSONObject jo = getJSONfromInput(req);
+ if (jo == null) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (intlogger.isDebugEnabled())
+ intlogger.debug(jo.toString());
+ Group gup = null;
+ try {
+ gup = new Group(jo);
+ } catch (InvalidObjectException e) {
+ message = e.getMessage();
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ gup.setGroupid(oldgup.getGroupid());
+
+
+ Group gb2 = Group.getGroupMatching(gup, oldgup.getGroupid());
+ if (gb2 != null) {
+ eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName());
+ return;
+ }
+
+ // Update Groups table entries
+ if (doUpdate(gup)) {
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(GROUPFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(gup.asJSONObject().toString());
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the UPDATE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+ /**
+ * POST on the &lt;groups&gt; -- create a new GROUPS to a feed.
+ * See the <i>Creating a GROUPS</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doPost(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ /*int feedid = getIdFromPath(req);
+ if (feedid < 0) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Feed feed = Feed.getFeedById(feedid);
+ if (feed == null || feed.isDeleted()) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }*/
+ // Check with the Authorizer
+ /*AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }*/
+
+ // check content type is SUB_CONTENT_TYPE, version 1.0
+ ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(GROUP_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
+ intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }
+ JSONObject jo = getJSONfromInput(req);
+ if (jo == null) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (intlogger.isDebugEnabled())
+ intlogger.debug(jo.toString());
+
+ Group gup = null;
+ try {
+ gup = new Group(jo);
+ } catch (InvalidObjectException e) {
+ message = e.getMessage();
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ //gup.setFeedid(feedid);
+ //sub.setSubscriber(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
+
+ // Check if this group already exists; not an error (yet), just warn
+ Group gb2 = Group.getGroupMatching(gup);
+ if (gb2 != null) {
+ eventlogger.warn("PROV0011 Creating a duplicate Group: "+gup.getName());
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Duplicate Group:"+gup.getName());
+ return;
+ }
+
+
+ // Create GROUPS table entries
+ if (doInsert(gup)) {
+ // send response
+ elr.setResult(HttpServletResponse.SC_CREATED);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_CREATED);
+ resp.setContentType(GROUPFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(gup.asJSONObject().toString());
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the INSERT
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/InternalServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/InternalServlet.java
index 14c960cc..27192089 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/InternalServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/InternalServlet.java
@@ -1,506 +1,506 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.FileStore;
-import java.nio.file.FileSystem;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.Properties;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.json.JSONArray;
-import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
-import org.onap.dmaap.datarouter.provisioning.beans.LogRecord;
-import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
-import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
-import org.onap.dmaap.datarouter.provisioning.utils.DB;
-import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;
-import org.onap.dmaap.datarouter.provisioning.utils.RLEBitSet;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-/**
- * <p>
- * This servlet handles requests to URLs under /internal on the provisioning server.
- * These include:
- * </p>
- * <div class="contentContainer">
- * <table class="packageSummary" border="0" cellpadding="3" cellspacing="0">
- * <caption><span>URL Path Summary</span><span class="tabEnd">&nbsp;</span></caption>
- * <tr>
- * <th class="colFirst" width="15%">URL Path</th>
- * <th class="colOne">Method</th>
- * <th class="colLast">Purpose</th>
- * </tr>
- * <tr class="altColor">
- * <td class="colFirst">/internal/prov</td>
- * <td class="colOne">GET</td>
- * <td class="colLast">used to GET a full JSON copy of the provisioning data.</td>
- * </tr>
- * <tr class="rowColor">
- * <td class="colFirst">/internal/fetchProv</td>
- * <td class="colOne">GET</td>
- * <td class="colLast">used to signal to a standby POD that the provisioning data should be fetched from the active POD.</td>
- * </tr>
- * <tr class="altColor">
- * <td class="colFirst" rowspan="2">/internal/logs</td>
- * <td class="colOne">GET</td>
- * <td class="colLast">used to GET an index of log files and individual logs for this provisioning server.</td>
- * </tr>
- * <tr class="altColor">
- * <td class="colOne">POST</td>
- * <td class="colLast">used to POST log files from the individual nodes to this provisioning server.</td>
- * </tr>
- * <tr class="rowColor">
- * <td class="colFirst" rowspan="4">/internal/api</td>
- * <td class="colOne">GET</td>
- * <td class="colLast">used to GET an individual parameter value. The parameter name is specified by the path after /api/.</td>
- * </tr>
- * <tr class="rowColor">
- * <td class="colOne">PUT</td>
- * <td class="colLast">used to set an individual parameter value. The parameter name is specified by the path after /api/.</td>
- * </tr>
- * <tr class="rowColor">
- * <td class="colOne">DELETE</td>
- * <td class="colLast">used to remove an individual parameter value. The parameter name is specified by the path after /api/.</td>
- * </tr>
- * <tr class="rowColor">
- * <td class="colOne">POST</td>
- * <td class="colLast">used to create a new individual parameter value. The parameter name is specified by the path after /api/.</td>
- * </tr>
- * <tr class="altColor">
- * <td class="colFirst">/internal/halt</td>
- * <td class="colOne">GET</td>
- * <td class="colLast">used to halt the server (must be accessed from 127.0.0.1).</td>
- * </tr>
- * <tr class="rowColor">
- * <td class="colFirst" rowspan="2">/internal/drlogs</td>
- * <td class="colOne">GET</td>
- * <td class="colLast">used to get a list of DR log entries available for retrieval.
- * Note: these are the actual data router log entries sent to the provisioning server
- * by the nodes, not the provisioning server's internal logs (access via /internal/logs above).
- * The range is returned as a list of record sequence numbers.</td>
- * </tr>
- * <tr class="rowColor">
- * <td class="colOne">POST</td>
- * <td class="colLast">used to retrieve specific log entries.
- * The sequence numbers of the records to fetch are POST-ed; the records matching the sequence numbers are returned.</td>
- * </tr>
- * <tr class="altColor">
- * <td class="colFirst">/internal/route/*</td>
- * <td class="colOne">*</td>
- * <td class="colLast">URLs under this path are handled via the {@link org.onap.dmaap.datarouter.provisioning.RouteServlet}</td>
- * </tr>
- * </table>
- * </div>
- * <p>
- * Authorization to use these URLs is a little different than for other URLs on the provisioning server.
- * For the most part, the IP address that the request comes from should be either:
- * </p>
- * <ol>
- * <li>an IP address of a provisioning server, or</li>
- * <li>the IP address of a node (to allow access to /internal/prov), or</li>
- * <li>an IP address from the "<i>special subnet</i>" which is configured with
- * the PROV_SPECIAL_SUBNET parameter.
- * </ol>
- * <p>
- * In addition, requests to /internal/halt can ONLY come from localhost (127.0.0.1) on the HTTP port.
- * </p>
- * <p>
- * All DELETE/GET/PUT/POST requests made to /internal/api on this servlet on the standby server are
- * proxied to the active server (using the {@link ProxyServlet}) if it is up and reachable.
- * </p>
- *
- * @author Robert Eby
- * @version $Id: InternalServlet.java,v 1.23 2014/03/24 18:47:10 eby Exp $
- */
-@SuppressWarnings("serial")
-public class InternalServlet extends ProxyServlet {
- private static Integer logseq = new Integer(0); // another piece of info to make log spool file names unique
- //Adding EELF Logger Rally:US664892
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.InternalServlet");
-
- /**
- * Delete a parameter at the address /internal/api/&lt;parameter&gt;.
- * See the <b>Internal API</b> document for details on how this method should be invoked.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
-
- String path = req.getPathInfo();
- if (path.startsWith("/api/")) {
- if (isProxyOK(req) && isProxyServer()) {
- super.doDelete(req, resp);
- return;
- }
- String key = path.substring(5);
- if (key.length() > 0) {
- Parameters param = Parameters.getParameter(key);
- if (param != null) {
- if (doDelete(param)) {
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- provisioningDataChanged();
- provisioningParametersChanged();
- } else {
- // Something went wrong with the DELETE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- return;
- }
- }
- }
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- }
- /**
- * Get some information (such as a parameter) underneath the /internal/ namespace.
- * See the <b>Internal API</b> document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- String path = req.getPathInfo();
- if (path.equals("/halt") && !req.isSecure()) {
- // request to halt the server - can ONLY come from localhost
- String remote = req.getRemoteAddr();
- if (remote.equals("127.0.0.1")) {
- intlogger.info("PROV0009 Request to HALT received.");
- resp.setStatus(HttpServletResponse.SC_OK);
- Main.shutdown();
- } else {
- intlogger.info("PROV0010 Disallowed request to HALT received from "+remote);
- resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
- }
- return;
- }
-
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
- if (path.equals("/fetchProv") && !req.isSecure()) {
- // if request came from active_pod or standby_pod and it is not us, reload prov data
- SynchronizerTask s = SynchronizerTask.getSynchronizer();
- s.doFetch();
- resp.setStatus(HttpServletResponse.SC_OK);
- return;
- }
- if (path.equals("/prov")) {
- if (isProxyOK(req) && isProxyServer()) {
- if (super.doGetWithFallback(req, resp))
- return;
- // fall back to returning the local data if the remote is unreachable
- intlogger.info("Active server unavailable; falling back to local copy.");
- }
- Poker p = Poker.getPoker();
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(PROVFULL_CONTENT_TYPE2);
- resp.getOutputStream().print(p.getProvisioningString());
- return;
- }
- if (path.equals("/logs") || path.equals("/logs/")) {
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType("application/json");
- resp.getOutputStream().print(generateLogfileList().toString());
- return;
- }
- if (path.startsWith("/logs/")) {
- Properties p = (new DB()).getProperties();
- String logdir = p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
- String logfile = path.substring(6);
- if (logdir != null && logfile != null && logfile.indexOf('/') < 0) {
- File log = new File(logdir + "/" + logfile);
- if (log.exists() && log.isFile()) {
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType("text/plain");
- Path logpath = Paths.get(log.getAbsolutePath());
- Files.copy(logpath, resp.getOutputStream());
- return;
- }
- }
- resp.sendError(HttpServletResponse.SC_NO_CONTENT, "No file.");
- return;
- }
- if (path.startsWith("/api/")) {
- if (isProxyOK(req) && isProxyServer()) {
- super.doGet(req, resp);
- return;
- }
- String key = path.substring(5);
- if (key.length() > 0) {
- Parameters param = Parameters.getParameter(key);
- if (param != null) {
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType("text/plain");
- resp.getOutputStream().print(param.getValue() + "\n");
- return;
- }
- }
- }
- if (path.equals("/drlogs") || path.equals("/drlogs/")) {
- // Special POD <=> POD API to determine what log file records are loaded here
- LogfileLoader lfl = LogfileLoader.getLoader();
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType("text/plain");
- resp.getOutputStream().print(lfl.getBitSet().toString());
- return;
- }
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- }
- /**
- * Modify a parameter at the address /internal/api/&lt;parameter&gt;.
- * See the <b>Internal API</b> document for details on how this method should be invoked.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
- String path = req.getPathInfo();
- if (path.startsWith("/api/")) {
- if (isProxyOK(req) && isProxyServer()) {
- super.doPut(req, resp);
- return;
- }
- String key = path.substring(5);
- if (key.length() > 0) {
- Parameters param = Parameters.getParameter(key);
- if (param != null) {
- String t = catValues(req.getParameterValues("val"));
- param.setValue(t);
- if (doUpdate(param)) {
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- provisioningDataChanged();
- provisioningParametersChanged();
- } else {
- // Something went wrong with the UPDATE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- return;
- }
- }
- }
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- }
- /**
- * Create some new information (such as a parameter or log entries) underneath the /internal/ namespace.
- * See the <b>Internal API</b> document for details on how this method should be invoked.
- */
- @SuppressWarnings("resource")
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPost");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
-
- String path = req.getPathInfo();
- if (path.startsWith("/api/")) {
- if (isProxyOK(req) && isProxyServer()) {
- super.doPost(req, resp);
- return;
- }
- String key = path.substring(5);
- if (key.length() > 0) {
- Parameters param = Parameters.getParameter(key);
- if (param == null) {
- String t = catValues(req.getParameterValues("val"));
- param = new Parameters(key, t);
- if (doInsert(param)) {
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- provisioningDataChanged();
- provisioningParametersChanged();
- } else {
- // Something went wrong with the INSERT
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- return;
- }
- }
- }
-
- if (path.equals("/logs") || path.equals("/logs/")) {
- String ctype = req.getHeader("Content-Type");
- if (ctype == null || !ctype.equals("text/plain")) {
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- elr.setMessage("Bad media type: "+ctype);
- resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- return;
- }
- String spooldir = (new DB()).getProperties().getProperty("org.onap.dmaap.datarouter.provserver.spooldir");
- String spoolname = String.format("%d-%d-", System.currentTimeMillis(), Thread.currentThread().getId());
- synchronized (logseq) {
- // perhaps unnecessary, but it helps make the name unique
- spoolname += logseq.toString();
- logseq++;
- }
- String encoding = req.getHeader("Content-Encoding");
- if (encoding != null) {
- if (encoding.trim().equals("gzip")) {
- spoolname += ".gz";
- } else {
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- return;
- }
- }
- // Determine space available -- available space must be at least 5%
- FileSystem fs = (Paths.get(spooldir)).getFileSystem();
- long total = 0;
- long avail = 0;
- for (FileStore store: fs.getFileStores()) {
- total += store.getTotalSpace();
- avail += store.getUsableSpace();
- }
- try { fs.close(); } catch (Exception e) { }
- if (((avail * 100) / total) < 5) {
- elr.setResult(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
- resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
- eventlogger.info(elr);
- return;
- }
- Path tmppath = Paths.get(spooldir, spoolname);
- Path donepath = Paths.get(spooldir, "IN."+spoolname);
- Files.copy(req.getInputStream(), Paths.get(spooldir, spoolname), StandardCopyOption.REPLACE_EXISTING);
- Files.move(tmppath, donepath, StandardCopyOption.REPLACE_EXISTING);
- elr.setResult(HttpServletResponse.SC_CREATED);
- resp.setStatus(HttpServletResponse.SC_CREATED);
- eventlogger.info(elr);
- LogfileLoader.getLoader(); // This starts the logfile loader "task"
- return;
- }
-
- if (path.equals("/drlogs") || path.equals("/drlogs/")) {
- // Receive post request and generate log entries
- String ctype = req.getHeader("Content-Type");
- if (ctype == null || !ctype.equals("text/plain")) {
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- elr.setMessage("Bad media type: "+ctype);
- resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- return;
- }
- InputStream is = req.getInputStream();
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- int ch = 0;
- while ((ch = is.read()) >= 0)
- bos.write(ch);
- RLEBitSet bs = new RLEBitSet(bos.toString()); // The set of records to retrieve
- elr.setResult(HttpServletResponse.SC_OK);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType("text/plain");
- LogRecord.printLogRecords(resp.getOutputStream(), bs);
- eventlogger.info(elr);
- return;
- }
-
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- eventlogger.info(elr);
- }
-
- private String catValues(String[] v) {
- StringBuilder sb = new StringBuilder();
- if (v != null) {
- String pfx = "";
- for (String s : v) {
- sb.append(pfx);
- sb.append(s);
- pfx = "|";
- }
- }
- return sb.toString();
- }
- private JSONArray generateLogfileList() {
- JSONArray ja = new JSONArray();
- Properties p = (new DB()).getProperties();
- String s = p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
- if (s != null) {
- String[] dirs = s.split(",");
- for (String dir : dirs) {
- File f = new File(dir);
- String[] list = f.list();
- if (list != null) {
- for (String s2 : list) {
- if (!s2.startsWith("."))
- ja.put(s2);
- }
- }
- }
- }
- return ja;
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.FileStore;
+import java.nio.file.FileSystem;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.Properties;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONArray;
+import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
+import org.onap.dmaap.datarouter.provisioning.beans.LogRecord;
+import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
+import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
+import org.onap.dmaap.datarouter.provisioning.utils.DB;
+import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;
+import org.onap.dmaap.datarouter.provisioning.utils.RLEBitSet;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+/**
+ * <p>
+ * This servlet handles requests to URLs under /internal on the provisioning server.
+ * These include:
+ * </p>
+ * <div class="contentContainer">
+ * <table class="packageSummary" border="0" cellpadding="3" cellspacing="0">
+ * <caption><span>URL Path Summary</span><span class="tabEnd">&nbsp;</span></caption>
+ * <tr>
+ * <th class="colFirst" width="15%">URL Path</th>
+ * <th class="colOne">Method</th>
+ * <th class="colLast">Purpose</th>
+ * </tr>
+ * <tr class="altColor">
+ * <td class="colFirst">/internal/prov</td>
+ * <td class="colOne">GET</td>
+ * <td class="colLast">used to GET a full JSON copy of the provisioning data.</td>
+ * </tr>
+ * <tr class="rowColor">
+ * <td class="colFirst">/internal/fetchProv</td>
+ * <td class="colOne">GET</td>
+ * <td class="colLast">used to signal to a standby POD that the provisioning data should be fetched from the active POD.</td>
+ * </tr>
+ * <tr class="altColor">
+ * <td class="colFirst" rowspan="2">/internal/logs</td>
+ * <td class="colOne">GET</td>
+ * <td class="colLast">used to GET an index of log files and individual logs for this provisioning server.</td>
+ * </tr>
+ * <tr class="altColor">
+ * <td class="colOne">POST</td>
+ * <td class="colLast">used to POST log files from the individual nodes to this provisioning server.</td>
+ * </tr>
+ * <tr class="rowColor">
+ * <td class="colFirst" rowspan="4">/internal/api</td>
+ * <td class="colOne">GET</td>
+ * <td class="colLast">used to GET an individual parameter value. The parameter name is specified by the path after /api/.</td>
+ * </tr>
+ * <tr class="rowColor">
+ * <td class="colOne">PUT</td>
+ * <td class="colLast">used to set an individual parameter value. The parameter name is specified by the path after /api/.</td>
+ * </tr>
+ * <tr class="rowColor">
+ * <td class="colOne">DELETE</td>
+ * <td class="colLast">used to remove an individual parameter value. The parameter name is specified by the path after /api/.</td>
+ * </tr>
+ * <tr class="rowColor">
+ * <td class="colOne">POST</td>
+ * <td class="colLast">used to create a new individual parameter value. The parameter name is specified by the path after /api/.</td>
+ * </tr>
+ * <tr class="altColor">
+ * <td class="colFirst">/internal/halt</td>
+ * <td class="colOne">GET</td>
+ * <td class="colLast">used to halt the server (must be accessed from 127.0.0.1).</td>
+ * </tr>
+ * <tr class="rowColor">
+ * <td class="colFirst" rowspan="2">/internal/drlogs</td>
+ * <td class="colOne">GET</td>
+ * <td class="colLast">used to get a list of DR log entries available for retrieval.
+ * Note: these are the actual data router log entries sent to the provisioning server
+ * by the nodes, not the provisioning server's internal logs (access via /internal/logs above).
+ * The range is returned as a list of record sequence numbers.</td>
+ * </tr>
+ * <tr class="rowColor">
+ * <td class="colOne">POST</td>
+ * <td class="colLast">used to retrieve specific log entries.
+ * The sequence numbers of the records to fetch are POST-ed; the records matching the sequence numbers are returned.</td>
+ * </tr>
+ * <tr class="altColor">
+ * <td class="colFirst">/internal/route/*</td>
+ * <td class="colOne">*</td>
+ * <td class="colLast">URLs under this path are handled via the {@link org.onap.dmaap.datarouter.provisioning.RouteServlet}</td>
+ * </tr>
+ * </table>
+ * </div>
+ * <p>
+ * Authorization to use these URLs is a little different than for other URLs on the provisioning server.
+ * For the most part, the IP address that the request comes from should be either:
+ * </p>
+ * <ol>
+ * <li>an IP address of a provisioning server, or</li>
+ * <li>the IP address of a node (to allow access to /internal/prov), or</li>
+ * <li>an IP address from the "<i>special subnet</i>" which is configured with
+ * the PROV_SPECIAL_SUBNET parameter.
+ * </ol>
+ * <p>
+ * In addition, requests to /internal/halt can ONLY come from localhost (127.0.0.1) on the HTTP port.
+ * </p>
+ * <p>
+ * All DELETE/GET/PUT/POST requests made to /internal/api on this servlet on the standby server are
+ * proxied to the active server (using the {@link ProxyServlet}) if it is up and reachable.
+ * </p>
+ *
+ * @author Robert Eby
+ * @version $Id: InternalServlet.java,v 1.23 2014/03/24 18:47:10 eby Exp $
+ */
+@SuppressWarnings("serial")
+public class InternalServlet extends ProxyServlet {
+ private static Integer logseq = new Integer(0); // another piece of info to make log spool file names unique
+ //Adding EELF Logger Rally:US664892
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.InternalServlet");
+
+ /**
+ * Delete a parameter at the address /internal/api/&lt;parameter&gt;.
+ * See the <b>Internal API</b> document for details on how this method should be invoked.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+
+ String path = req.getPathInfo();
+ if (path.startsWith("/api/")) {
+ if (isProxyOK(req) && isProxyServer()) {
+ super.doDelete(req, resp);
+ return;
+ }
+ String key = path.substring(5);
+ if (key.length() > 0) {
+ Parameters param = Parameters.getParameter(key);
+ if (param != null) {
+ if (doDelete(param)) {
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ provisioningDataChanged();
+ provisioningParametersChanged();
+ } else {
+ // Something went wrong with the DELETE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ return;
+ }
+ }
+ }
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ }
+ /**
+ * Get some information (such as a parameter) underneath the /internal/ namespace.
+ * See the <b>Internal API</b> document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ String path = req.getPathInfo();
+ if (path.equals("/halt") && !req.isSecure()) {
+ // request to halt the server - can ONLY come from localhost
+ String remote = req.getRemoteAddr();
+ if (remote.equals("127.0.0.1")) {
+ intlogger.info("PROV0009 Request to HALT received.");
+ resp.setStatus(HttpServletResponse.SC_OK);
+ Main.shutdown();
+ } else {
+ intlogger.info("PROV0010 Disallowed request to HALT received from "+remote);
+ resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
+ }
+ return;
+ }
+
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+ if (path.equals("/fetchProv") && !req.isSecure()) {
+ // if request came from active_pod or standby_pod and it is not us, reload prov data
+ SynchronizerTask s = SynchronizerTask.getSynchronizer();
+ s.doFetch();
+ resp.setStatus(HttpServletResponse.SC_OK);
+ return;
+ }
+ if (path.equals("/prov")) {
+ if (isProxyOK(req) && isProxyServer()) {
+ if (super.doGetWithFallback(req, resp))
+ return;
+ // fall back to returning the local data if the remote is unreachable
+ intlogger.info("Active server unavailable; falling back to local copy.");
+ }
+ Poker p = Poker.getPoker();
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(PROVFULL_CONTENT_TYPE2);
+ resp.getOutputStream().print(p.getProvisioningString());
+ return;
+ }
+ if (path.equals("/logs") || path.equals("/logs/")) {
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("application/json");
+ resp.getOutputStream().print(generateLogfileList().toString());
+ return;
+ }
+ if (path.startsWith("/logs/")) {
+ Properties p = (new DB()).getProperties();
+ String logdir = p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
+ String logfile = path.substring(6);
+ if (logdir != null && logfile != null && logfile.indexOf('/') < 0) {
+ File log = new File(logdir + "/" + logfile);
+ if (log.exists() && log.isFile()) {
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("text/plain");
+ Path logpath = Paths.get(log.getAbsolutePath());
+ Files.copy(logpath, resp.getOutputStream());
+ return;
+ }
+ }
+ resp.sendError(HttpServletResponse.SC_NO_CONTENT, "No file.");
+ return;
+ }
+ if (path.startsWith("/api/")) {
+ if (isProxyOK(req) && isProxyServer()) {
+ super.doGet(req, resp);
+ return;
+ }
+ String key = path.substring(5);
+ if (key.length() > 0) {
+ Parameters param = Parameters.getParameter(key);
+ if (param != null) {
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("text/plain");
+ resp.getOutputStream().print(param.getValue() + "\n");
+ return;
+ }
+ }
+ }
+ if (path.equals("/drlogs") || path.equals("/drlogs/")) {
+ // Special POD <=> POD API to determine what log file records are loaded here
+ LogfileLoader lfl = LogfileLoader.getLoader();
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("text/plain");
+ resp.getOutputStream().print(lfl.getBitSet().toString());
+ return;
+ }
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ }
+ /**
+ * Modify a parameter at the address /internal/api/&lt;parameter&gt;.
+ * See the <b>Internal API</b> document for details on how this method should be invoked.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+ String path = req.getPathInfo();
+ if (path.startsWith("/api/")) {
+ if (isProxyOK(req) && isProxyServer()) {
+ super.doPut(req, resp);
+ return;
+ }
+ String key = path.substring(5);
+ if (key.length() > 0) {
+ Parameters param = Parameters.getParameter(key);
+ if (param != null) {
+ String t = catValues(req.getParameterValues("val"));
+ param.setValue(t);
+ if (doUpdate(param)) {
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ provisioningDataChanged();
+ provisioningParametersChanged();
+ } else {
+ // Something went wrong with the UPDATE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ return;
+ }
+ }
+ }
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ }
+ /**
+ * Create some new information (such as a parameter or log entries) underneath the /internal/ namespace.
+ * See the <b>Internal API</b> document for details on how this method should be invoked.
+ */
+ @SuppressWarnings("resource")
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPost");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+
+ String path = req.getPathInfo();
+ if (path.startsWith("/api/")) {
+ if (isProxyOK(req) && isProxyServer()) {
+ super.doPost(req, resp);
+ return;
+ }
+ String key = path.substring(5);
+ if (key.length() > 0) {
+ Parameters param = Parameters.getParameter(key);
+ if (param == null) {
+ String t = catValues(req.getParameterValues("val"));
+ param = new Parameters(key, t);
+ if (doInsert(param)) {
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ provisioningDataChanged();
+ provisioningParametersChanged();
+ } else {
+ // Something went wrong with the INSERT
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ return;
+ }
+ }
+ }
+
+ if (path.equals("/logs") || path.equals("/logs/")) {
+ String ctype = req.getHeader("Content-Type");
+ if (ctype == null || !ctype.equals("text/plain")) {
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ elr.setMessage("Bad media type: "+ctype);
+ resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ return;
+ }
+ String spooldir = (new DB()).getProperties().getProperty("org.onap.dmaap.datarouter.provserver.spooldir");
+ String spoolname = String.format("%d-%d-", System.currentTimeMillis(), Thread.currentThread().getId());
+ synchronized (logseq) {
+ // perhaps unnecessary, but it helps make the name unique
+ spoolname += logseq.toString();
+ logseq++;
+ }
+ String encoding = req.getHeader("Content-Encoding");
+ if (encoding != null) {
+ if (encoding.trim().equals("gzip")) {
+ spoolname += ".gz";
+ } else {
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ return;
+ }
+ }
+ // Determine space available -- available space must be at least 5%
+ FileSystem fs = (Paths.get(spooldir)).getFileSystem();
+ long total = 0;
+ long avail = 0;
+ for (FileStore store: fs.getFileStores()) {
+ total += store.getTotalSpace();
+ avail += store.getUsableSpace();
+ }
+ try { fs.close(); } catch (Exception e) { }
+ if (((avail * 100) / total) < 5) {
+ elr.setResult(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+ resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+ eventlogger.info(elr);
+ return;
+ }
+ Path tmppath = Paths.get(spooldir, spoolname);
+ Path donepath = Paths.get(spooldir, "IN."+spoolname);
+ Files.copy(req.getInputStream(), Paths.get(spooldir, spoolname), StandardCopyOption.REPLACE_EXISTING);
+ Files.move(tmppath, donepath, StandardCopyOption.REPLACE_EXISTING);
+ elr.setResult(HttpServletResponse.SC_CREATED);
+ resp.setStatus(HttpServletResponse.SC_CREATED);
+ eventlogger.info(elr);
+ LogfileLoader.getLoader(); // This starts the logfile loader "task"
+ return;
+ }
+
+ if (path.equals("/drlogs") || path.equals("/drlogs/")) {
+ // Receive post request and generate log entries
+ String ctype = req.getHeader("Content-Type");
+ if (ctype == null || !ctype.equals("text/plain")) {
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ elr.setMessage("Bad media type: "+ctype);
+ resp.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ return;
+ }
+ InputStream is = req.getInputStream();
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ int ch = 0;
+ while ((ch = is.read()) >= 0)
+ bos.write(ch);
+ RLEBitSet bs = new RLEBitSet(bos.toString()); // The set of records to retrieve
+ elr.setResult(HttpServletResponse.SC_OK);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("text/plain");
+ LogRecord.printLogRecords(resp.getOutputStream(), bs);
+ eventlogger.info(elr);
+ return;
+ }
+
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ eventlogger.info(elr);
+ }
+
+ private String catValues(String[] v) {
+ StringBuilder sb = new StringBuilder();
+ if (v != null) {
+ String pfx = "";
+ for (String s : v) {
+ sb.append(pfx);
+ sb.append(s);
+ pfx = "|";
+ }
+ }
+ return sb.toString();
+ }
+ private JSONArray generateLogfileList() {
+ JSONArray ja = new JSONArray();
+ Properties p = (new DB()).getProperties();
+ String s = p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
+ if (s != null) {
+ String[] dirs = s.split(",");
+ for (String dir : dirs) {
+ File f = new File(dir);
+ String[] list = f.list();
+ if (list != null) {
+ for (String s2 : list) {
+ if (!s2.startsWith("."))
+ ja.put(s2);
+ }
+ }
+ }
+ }
+ return ja;
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java
index 0dbb3f52..48a23921 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java
@@ -7,9 +7,9 @@
* * 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.
@@ -61,373 +61,373 @@ import com.att.eelf.configuration.EELFManager;
*/
@SuppressWarnings("serial")
public class LogServlet extends BaseServlet {
- //Adding EELF Logger Rally:US664892
+ //Adding EELF Logger Rally:US664892
private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.LogServlet");
- private static final long TWENTYFOUR_HOURS = (24 * 60 * 60 * 1000L);
- private static final String fmt1 = "yyyy-MM-dd'T'HH:mm:ss'Z'";
- private static final String fmt2 = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
+ private static final long TWENTYFOUR_HOURS = (24 * 60 * 60 * 1000L);
+ private static final String fmt1 = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+ private static final String fmt2 = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
- private boolean isfeedlog;
+ private boolean isfeedlog;
- public abstract class RowHandler {
- private final ServletOutputStream out;
- private final String[] fields;
- public boolean firstrow;
+ public abstract class RowHandler {
+ private final ServletOutputStream out;
+ private final String[] fields;
+ public boolean firstrow;
- public RowHandler(ServletOutputStream out, String fieldparam, boolean b) {
- this.out = out;
- this.firstrow = b;
- this.fields = (fieldparam != null) ? fieldparam.split(":") : null;
- }
- public void handleRow(ResultSet rs) {
- try {
- LOGJSONable js = buildJSONable(rs);
- LOGJSONObject jo = js.asJSONObject();
- if (fields != null) {
- // filter out unwanted fields
- LOGJSONObject j2 = new LOGJSONObject();
- for (String key : fields) {
- Object v = jo.opt(key);
- if (v != null)
- j2.put(key, v);
- }
- jo = j2;
- }
- String t = firstrow ? "\n" : ",\n";
- t += jo.toString();
- out.print(t);
- firstrow = false;
- } catch (Exception e) {
- // ignore
- }
- }
- public abstract LOGJSONable buildJSONable(ResultSet rs) throws SQLException;
- }
- public class PublishRecordRowHandler extends RowHandler {
- public PublishRecordRowHandler(ServletOutputStream out, String fields, boolean b) {
- super(out, fields, b);
- }
- @Override
- public LOGJSONable buildJSONable(ResultSet rs) throws SQLException {
- return new PublishRecord(rs);
- }
- }
- public class DeliveryRecordRowHandler extends RowHandler {
- public DeliveryRecordRowHandler(ServletOutputStream out, String fields, boolean b) {
- super(out, fields, b);
- }
- @Override
- public LOGJSONable buildJSONable(ResultSet rs) throws SQLException {
- return new DeliveryRecord(rs);
- }
- }
- public class ExpiryRecordRowHandler extends RowHandler {
- public ExpiryRecordRowHandler(ServletOutputStream out, String fields, boolean b) {
- super(out, fields, b);
- }
- @Override
- public LOGJSONable buildJSONable(ResultSet rs) throws SQLException {
- return new ExpiryRecord(rs);
- }
- }
+ public RowHandler(ServletOutputStream out, String fieldparam, boolean b) {
+ this.out = out;
+ this.firstrow = b;
+ this.fields = (fieldparam != null) ? fieldparam.split(":") : null;
+ }
+ public void handleRow(ResultSet rs) {
+ try {
+ LOGJSONable js = buildJSONable(rs);
+ LOGJSONObject jo = js.asJSONObject();
+ if (fields != null) {
+ // filter out unwanted fields
+ LOGJSONObject j2 = new LOGJSONObject();
+ for (String key : fields) {
+ Object v = jo.opt(key);
+ if (v != null)
+ j2.put(key, v);
+ }
+ jo = j2;
+ }
+ String t = firstrow ? "\n" : ",\n";
+ t += jo.toString();
+ out.print(t);
+ firstrow = false;
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ public abstract LOGJSONable buildJSONable(ResultSet rs) throws SQLException;
+ }
+ public class PublishRecordRowHandler extends RowHandler {
+ public PublishRecordRowHandler(ServletOutputStream out, String fields, boolean b) {
+ super(out, fields, b);
+ }
+ @Override
+ public LOGJSONable buildJSONable(ResultSet rs) throws SQLException {
+ return new PublishRecord(rs);
+ }
+ }
+ public class DeliveryRecordRowHandler extends RowHandler {
+ public DeliveryRecordRowHandler(ServletOutputStream out, String fields, boolean b) {
+ super(out, fields, b);
+ }
+ @Override
+ public LOGJSONable buildJSONable(ResultSet rs) throws SQLException {
+ return new DeliveryRecord(rs);
+ }
+ }
+ public class ExpiryRecordRowHandler extends RowHandler {
+ public ExpiryRecordRowHandler(ServletOutputStream out, String fields, boolean b) {
+ super(out, fields, b);
+ }
+ @Override
+ public LOGJSONable buildJSONable(ResultSet rs) throws SQLException {
+ return new ExpiryRecord(rs);
+ }
+ }
- /**
- * This class must be created from either a {@link FeedLogServlet} or a {@link SubLogServlet}.
- * @param isFeedLog boolean to handle those places where a feedlog request is different from
- * a sublog request
- */
- protected LogServlet(boolean isFeedLog) {
- this.isfeedlog = isFeedLog;
- }
+ /**
+ * This class must be created from either a {@link FeedLogServlet} or a {@link SubLogServlet}.
+ * @param isFeedLog boolean to handle those places where a feedlog request is different from
+ * a sublog request
+ */
+ protected LogServlet(boolean isFeedLog) {
+ this.isfeedlog = isFeedLog;
+ }
- /**
- * DELETE a logging URL -- not supported.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- String message = "DELETE not allowed for the logURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * GET a logging URL -- retrieve logging data for a feed or subscription.
- * See the <b>Logging API</b> document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- int id = getIdFromPath(req);
- if (id < 0) {
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing or bad feed/subscription number.");
- return;
- }
- Map<String, String> map = buildMapFromRequest(req);
- if (map.get("err") != null) {
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments: "+map.get("err"));
- return;
- }
- // check Accept: header??
+ /**
+ * DELETE a logging URL -- not supported.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ String message = "DELETE not allowed for the logURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * GET a logging URL -- retrieve logging data for a feed or subscription.
+ * See the <b>Logging API</b> document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ int id = getIdFromPath(req);
+ if (id < 0) {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing or bad feed/subscription number.");
+ return;
+ }
+ Map<String, String> map = buildMapFromRequest(req);
+ if (map.get("err") != null) {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments: "+map.get("err"));
+ return;
+ }
+ // check Accept: header??
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(LOGLIST_CONTENT_TYPE);
- @SuppressWarnings("resource")
- ServletOutputStream out = resp.getOutputStream();
- final String fields = req.getParameter("fields");
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(LOGLIST_CONTENT_TYPE);
+ @SuppressWarnings("resource")
+ ServletOutputStream out = resp.getOutputStream();
+ final String fields = req.getParameter("fields");
- out.print("[");
- if (isfeedlog) {
- // Handle /feedlog/feedid request
- boolean firstrow = true;
+ out.print("[");
+ if (isfeedlog) {
+ // Handle /feedlog/feedid request
+ boolean firstrow = true;
- // 1. Collect publish records for this feed
- RowHandler rh = new PublishRecordRowHandler(out, fields, firstrow);
- getPublishRecordsForFeed(id, rh, map);
- firstrow = rh.firstrow;
+ // 1. Collect publish records for this feed
+ RowHandler rh = new PublishRecordRowHandler(out, fields, firstrow);
+ getPublishRecordsForFeed(id, rh, map);
+ firstrow = rh.firstrow;
- // 2. Collect delivery records for subscriptions to this feed
- rh = new DeliveryRecordRowHandler(out, fields, firstrow);
- getDeliveryRecordsForFeed(id, rh, map);
- firstrow = rh.firstrow;
+ // 2. Collect delivery records for subscriptions to this feed
+ rh = new DeliveryRecordRowHandler(out, fields, firstrow);
+ getDeliveryRecordsForFeed(id, rh, map);
+ firstrow = rh.firstrow;
- // 3. Collect expiry records for subscriptions to this feed
- rh = new ExpiryRecordRowHandler(out, fields, firstrow);
- getExpiryRecordsForFeed(id, rh, map);
- } else {
- // Handle /sublog/subid request
- Subscription sub = Subscription.getSubscriptionById(id);
- if (sub != null) {
- // 1. Collect publish records for the feed this subscription feeds
- RowHandler rh = new PublishRecordRowHandler(out, fields, true);
- getPublishRecordsForFeed(sub.getFeedid(), rh, map);
+ // 3. Collect expiry records for subscriptions to this feed
+ rh = new ExpiryRecordRowHandler(out, fields, firstrow);
+ getExpiryRecordsForFeed(id, rh, map);
+ } else {
+ // Handle /sublog/subid request
+ Subscription sub = Subscription.getSubscriptionById(id);
+ if (sub != null) {
+ // 1. Collect publish records for the feed this subscription feeds
+ RowHandler rh = new PublishRecordRowHandler(out, fields, true);
+ getPublishRecordsForFeed(sub.getFeedid(), rh, map);
- // 2. Collect delivery records for this subscription
- rh = new DeliveryRecordRowHandler(out, fields, rh.firstrow);
- getDeliveryRecordsForSubscription(id, rh, map);
+ // 2. Collect delivery records for this subscription
+ rh = new DeliveryRecordRowHandler(out, fields, rh.firstrow);
+ getDeliveryRecordsForSubscription(id, rh, map);
- // 3. Collect expiry records for this subscription
- rh = new ExpiryRecordRowHandler(out, fields, rh.firstrow);
- getExpiryRecordsForSubscription(id, rh, map);
- }
- }
- out.print("\n]");
- }
- /**
- * PUT a logging URL -- not supported.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- String message = "PUT not allowed for the logURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * POST a logging URL -- not supported.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPost");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
- String message = "POST not allowed for the logURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
+ // 3. Collect expiry records for this subscription
+ rh = new ExpiryRecordRowHandler(out, fields, rh.firstrow);
+ getExpiryRecordsForSubscription(id, rh, map);
+ }
+ }
+ out.print("\n]");
+ }
+ /**
+ * PUT a logging URL -- not supported.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ String message = "PUT not allowed for the logURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * POST a logging URL -- not supported.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPost");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
+ String message = "POST not allowed for the logURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
- private Map<String, String> buildMapFromRequest(HttpServletRequest req) {
- Map<String, String> map = new HashMap<String, String>();
- String s = req.getParameter("type");
- if (s != null) {
- if (s.equals("pub") || s.equals("del") || s.equals("exp")) {
- map.put("type", s);
- } else {
- map.put("err", "bad type");
- return map;
- }
- } else
- map.put("type", "all");
- map.put("publishSQL", "");
- map.put("statusSQL", "");
- map.put("resultSQL", "");
- map.put("reasonSQL", "");
+ private Map<String, String> buildMapFromRequest(HttpServletRequest req) {
+ Map<String, String> map = new HashMap<String, String>();
+ String s = req.getParameter("type");
+ if (s != null) {
+ if (s.equals("pub") || s.equals("del") || s.equals("exp")) {
+ map.put("type", s);
+ } else {
+ map.put("err", "bad type");
+ return map;
+ }
+ } else
+ map.put("type", "all");
+ map.put("publishSQL", "");
+ map.put("statusSQL", "");
+ map.put("resultSQL", "");
+ map.put("reasonSQL", "");
- s = req.getParameter("publishId");
- if (s != null) {
- if (s.indexOf("'") >= 0) {
- map.put("err", "bad publishId");
- return map;
- }
- map.put("publishSQL", " AND PUBLISH_ID = '"+s+"'");
- }
+ s = req.getParameter("publishId");
+ if (s != null) {
+ if (s.indexOf("'") >= 0) {
+ map.put("err", "bad publishId");
+ return map;
+ }
+ map.put("publishSQL", " AND PUBLISH_ID = '"+s+"'");
+ }
- s = req.getParameter("statusCode");
- if (s != null) {
- String sql = null;
- if (s.equals("success")) {
- sql = " AND STATUS >= 200 AND STATUS < 300";
- } else if (s.equals("redirect")) {
- sql = " AND STATUS >= 300 AND STATUS < 400";
- } else if (s.equals("failure")) {
- sql = " AND STATUS >= 400";
- } else {
- try {
- Integer n = Integer.parseInt(s);
- if ((n >= 100 && n < 600) || (n == -1))
- sql = " AND STATUS = " + n;
- } catch (NumberFormatException e) {
- }
- }
- if (sql == null) {
- map.put("err", "bad statusCode");
- return map;
- }
- map.put("statusSQL", sql);
- map.put("resultSQL", sql.replaceAll("STATUS", "RESULT"));
- }
+ s = req.getParameter("statusCode");
+ if (s != null) {
+ String sql = null;
+ if (s.equals("success")) {
+ sql = " AND STATUS >= 200 AND STATUS < 300";
+ } else if (s.equals("redirect")) {
+ sql = " AND STATUS >= 300 AND STATUS < 400";
+ } else if (s.equals("failure")) {
+ sql = " AND STATUS >= 400";
+ } else {
+ try {
+ Integer n = Integer.parseInt(s);
+ if ((n >= 100 && n < 600) || (n == -1))
+ sql = " AND STATUS = " + n;
+ } catch (NumberFormatException e) {
+ }
+ }
+ if (sql == null) {
+ map.put("err", "bad statusCode");
+ return map;
+ }
+ map.put("statusSQL", sql);
+ map.put("resultSQL", sql.replaceAll("STATUS", "RESULT"));
+ }
- s = req.getParameter("expiryReason");
- if (s != null) {
- map.put("type", "exp");
- if (s.equals("notRetryable")) {
- map.put("reasonSQL", " AND REASON = 'notRetryable'");
- } else if (s.equals("retriesExhausted")) {
- map.put("reasonSQL", " AND REASON = 'retriesExhausted'");
- } else if (s.equals("diskFull")) {
- map.put("reasonSQL", " AND REASON = 'diskFull'");
- } else if (s.equals("other")) {
- map.put("reasonSQL", " AND REASON = 'other'");
- } else {
- map.put("err", "bad expiryReason");
- return map;
- }
- }
+ s = req.getParameter("expiryReason");
+ if (s != null) {
+ map.put("type", "exp");
+ if (s.equals("notRetryable")) {
+ map.put("reasonSQL", " AND REASON = 'notRetryable'");
+ } else if (s.equals("retriesExhausted")) {
+ map.put("reasonSQL", " AND REASON = 'retriesExhausted'");
+ } else if (s.equals("diskFull")) {
+ map.put("reasonSQL", " AND REASON = 'diskFull'");
+ } else if (s.equals("other")) {
+ map.put("reasonSQL", " AND REASON = 'other'");
+ } else {
+ map.put("err", "bad expiryReason");
+ return map;
+ }
+ }
- long stime = getTimeFromParam(req.getParameter("start"));
- if (stime < 0) {
- map.put("err", "bad start");
- return map;
- }
- long etime = getTimeFromParam(req.getParameter("end"));
- if (etime < 0) {
- map.put("err", "bad end");
- return map;
- }
- if (stime == 0 && etime == 0) {
- etime = System.currentTimeMillis();
- stime = etime - TWENTYFOUR_HOURS;
- } else if (stime == 0) {
- stime = etime - TWENTYFOUR_HOURS;
- } else if (etime == 0) {
- etime = stime + TWENTYFOUR_HOURS;
- }
- map.put("timeSQL", String.format(" AND EVENT_TIME >= %d AND EVENT_TIME <= %d", stime, etime));
- return map;
- }
- private long getTimeFromParam(final String s) {
- if (s == null)
- return 0;
- try {
- // First, look for an RFC 3339 date
- String fmt = (s.indexOf('.') > 0) ? fmt2 : fmt1;
- SimpleDateFormat sdf = new SimpleDateFormat(fmt);
- Date d = sdf.parse(s);
- return d.getTime();
- } catch (ParseException e) {
- }
- try {
- // Also allow a long (in ms); useful for testing
- long n = Long.parseLong(s);
- return n;
- } catch (NumberFormatException e) {
- }
- intlogger.info("Error parsing time="+s);
- return -1;
- }
+ long stime = getTimeFromParam(req.getParameter("start"));
+ if (stime < 0) {
+ map.put("err", "bad start");
+ return map;
+ }
+ long etime = getTimeFromParam(req.getParameter("end"));
+ if (etime < 0) {
+ map.put("err", "bad end");
+ return map;
+ }
+ if (stime == 0 && etime == 0) {
+ etime = System.currentTimeMillis();
+ stime = etime - TWENTYFOUR_HOURS;
+ } else if (stime == 0) {
+ stime = etime - TWENTYFOUR_HOURS;
+ } else if (etime == 0) {
+ etime = stime + TWENTYFOUR_HOURS;
+ }
+ map.put("timeSQL", String.format(" AND EVENT_TIME >= %d AND EVENT_TIME <= %d", stime, etime));
+ return map;
+ }
+ private long getTimeFromParam(final String s) {
+ if (s == null)
+ return 0;
+ try {
+ // First, look for an RFC 3339 date
+ String fmt = (s.indexOf('.') > 0) ? fmt2 : fmt1;
+ SimpleDateFormat sdf = new SimpleDateFormat(fmt);
+ Date d = sdf.parse(s);
+ return d.getTime();
+ } catch (ParseException e) {
+ }
+ try {
+ // Also allow a long (in ms); useful for testing
+ long n = Long.parseLong(s);
+ return n;
+ } catch (NumberFormatException e) {
+ }
+ intlogger.info("Error parsing time="+s);
+ return -1;
+ }
- private void getPublishRecordsForFeed(int feedid, RowHandler rh, Map<String, String> map) {
- String type = map.get("type");
- if (type.equals("all") || type.equals("pub")) {
- String sql = "select * from LOG_RECORDS where FEEDID = "+feedid
- + " AND TYPE = 'pub'"
- + map.get("timeSQL") + map.get("publishSQL") + map.get("statusSQL");
- getRecordsForSQL(sql, rh);
- }
- }
- private void getDeliveryRecordsForFeed(int feedid, RowHandler rh, Map<String, String> map) {
- String type = map.get("type");
- if (type.equals("all") || type.equals("del")) {
- String sql = "select * from LOG_RECORDS where FEEDID = "+feedid
- + " AND TYPE = 'del'"
- + map.get("timeSQL") + map.get("publishSQL") + map.get("resultSQL");
- getRecordsForSQL(sql, rh);
- }
- }
- private void getDeliveryRecordsForSubscription(int subid, RowHandler rh, Map<String, String> map) {
- String type = map.get("type");
- if (type.equals("all") || type.equals("del")) {
- String sql = "select * from LOG_RECORDS where DELIVERY_SUBID = "+subid
- + " AND TYPE = 'del'"
- + map.get("timeSQL") + map.get("publishSQL") + map.get("resultSQL");
- getRecordsForSQL(sql, rh);
- }
- }
- private void getExpiryRecordsForFeed(int feedid, RowHandler rh, Map<String, String> map) {
- String type = map.get("type");
- if (type.equals("all") || type.equals("exp")) {
- String st = map.get("statusSQL");
- if (st == null || st.length() == 0) {
- String sql = "select * from LOG_RECORDS where FEEDID = "+feedid
- + " AND TYPE = 'exp'"
- + map.get("timeSQL") + map.get("publishSQL") + map.get("reasonSQL");
- getRecordsForSQL(sql, rh);
- }
- }
- }
- private void getExpiryRecordsForSubscription(int subid, RowHandler rh, Map<String, String> map) {
- String type = map.get("type");
- if (type.equals("all") || type.equals("exp")) {
- String st = map.get("statusSQL");
- if (st == null || st.length() == 0) {
- String sql = "select * from LOG_RECORDS where DELIVERY_SUBID = "+subid
- + " AND TYPE = 'exp'"
- + map.get("timeSQL") + map.get("publishSQL") + map.get("reasonSQL");
- getRecordsForSQL(sql, rh);
- }
- }
- }
- private void getRecordsForSQL(String sql, RowHandler rh) {
- intlogger.debug(sql);
- long start = System.currentTimeMillis();
- DB db = new DB();
- Connection conn = null;
- try {
- conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- while (rs.next()) {
- rh.handleRow(rs);
- }
- rs.close();
- stmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- if (conn != null)
- db.release(conn);
- }
- intlogger.debug("Time: " + (System.currentTimeMillis()-start) + " ms");
- }
+ private void getPublishRecordsForFeed(int feedid, RowHandler rh, Map<String, String> map) {
+ String type = map.get("type");
+ if (type.equals("all") || type.equals("pub")) {
+ String sql = "select * from LOG_RECORDS where FEEDID = "+feedid
+ + " AND TYPE = 'pub'"
+ + map.get("timeSQL") + map.get("publishSQL") + map.get("statusSQL");
+ getRecordsForSQL(sql, rh);
+ }
+ }
+ private void getDeliveryRecordsForFeed(int feedid, RowHandler rh, Map<String, String> map) {
+ String type = map.get("type");
+ if (type.equals("all") || type.equals("del")) {
+ String sql = "select * from LOG_RECORDS where FEEDID = "+feedid
+ + " AND TYPE = 'del'"
+ + map.get("timeSQL") + map.get("publishSQL") + map.get("resultSQL");
+ getRecordsForSQL(sql, rh);
+ }
+ }
+ private void getDeliveryRecordsForSubscription(int subid, RowHandler rh, Map<String, String> map) {
+ String type = map.get("type");
+ if (type.equals("all") || type.equals("del")) {
+ String sql = "select * from LOG_RECORDS where DELIVERY_SUBID = "+subid
+ + " AND TYPE = 'del'"
+ + map.get("timeSQL") + map.get("publishSQL") + map.get("resultSQL");
+ getRecordsForSQL(sql, rh);
+ }
+ }
+ private void getExpiryRecordsForFeed(int feedid, RowHandler rh, Map<String, String> map) {
+ String type = map.get("type");
+ if (type.equals("all") || type.equals("exp")) {
+ String st = map.get("statusSQL");
+ if (st == null || st.length() == 0) {
+ String sql = "select * from LOG_RECORDS where FEEDID = "+feedid
+ + " AND TYPE = 'exp'"
+ + map.get("timeSQL") + map.get("publishSQL") + map.get("reasonSQL");
+ getRecordsForSQL(sql, rh);
+ }
+ }
+ }
+ private void getExpiryRecordsForSubscription(int subid, RowHandler rh, Map<String, String> map) {
+ String type = map.get("type");
+ if (type.equals("all") || type.equals("exp")) {
+ String st = map.get("statusSQL");
+ if (st == null || st.length() == 0) {
+ String sql = "select * from LOG_RECORDS where DELIVERY_SUBID = "+subid
+ + " AND TYPE = 'exp'"
+ + map.get("timeSQL") + map.get("publishSQL") + map.get("reasonSQL");
+ getRecordsForSQL(sql, rh);
+ }
+ }
+ }
+ private void getRecordsForSQL(String sql, RowHandler rh) {
+ intlogger.debug(sql);
+ long start = System.currentTimeMillis();
+ DB db = new DB();
+ Connection conn = null;
+ try {
+ conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ rh.handleRow(rs);
+ }
+ rs.close();
+ stmt.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ if (conn != null)
+ db.release(conn);
+ }
+ intlogger.debug("Time: " + (System.currentTimeMillis()-start) + " ms");
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Main.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Main.java
index 70dbd446..abcd76cd 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Main.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Main.java
@@ -7,9 +7,9 @@
* * 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.
@@ -63,13 +63,13 @@ import org.onap.dmaap.datarouter.provisioning.utils.ThrottleFilter;
* </p>
* <ul>
* <li>One background Thread runs the {@link LogfileLoader} in order to process incoming logfiles.
- * This Thread is created as a side effect of the first successful POST to the /internal/logs/ servlet.</li>
+ * This Thread is created as a side effect of the first successful POST to the /internal/logs/ servlet.</li>
* <li>One background Thread runs the {@link SynchronizerTask} which is used to periodically
- * synchronize the database between active and standby servers.</li>
+ * synchronize the database between active and standby servers.</li>
* <li>One background Thread runs the {@link Poker} which is used to notify the nodes whenever
- * provisioning data changes.</li>
+ * provisioning data changes.</li>
* <li>One task is run once a day to run {@link PurgeLogDirTask} which purges older logs from the
- * /opt/app/datartr/logs directory.</li>
+ * /opt/app/datartr/logs directory.</li>
* </ul>
* <p>
* The provisioning server is stopped by issuing a GET to the URL http://127.0.0.1/internal/halt
@@ -80,165 +80,170 @@ import org.onap.dmaap.datarouter.provisioning.utils.ThrottleFilter;
* @version $Id: Main.java,v 1.12 2014/03/12 19:45:41 eby Exp $
*/
public class Main {
- /** The truststore to use if none is specified */
- public static final String DEFAULT_TRUSTSTORE = "/opt/java/jdk/jdk180/jre/lib/security/cacerts";
- public static final String KEYSTORE_TYPE_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.type";
- public static final String KEYSTORE_PATH_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.path";
- public static final String KEYSTORE_PASSWORD_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.password";
- public static final String TRUSTSTORE_PATH_PROPERTY = "org.onap.dmaap.datarouter.provserver.truststore.path";
- public static final String TRUSTSTORE_PASSWORD_PROPERTY = "org.onap.dmaap.datarouter.provserver.truststore.password";
-
- /** The one and only {@link Server} instance in this JVM */
- private static Server server;
-
- /**
- * Starts the Data Router Provisioning server.
- * @param args not used
- * @throws Exception if Jetty has a problem starting
- */
- public static void main(String[] args) throws Exception {
- Security.setProperty("networkaddress.cache.ttl", "4");
- Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
-
- // Check DB is accessible and contains the expected tables
- if (! checkDatabase(logger))
- System.exit(1);
-
- logger.info("PROV0000 **** AT&T Data Router Provisioning Server starting....");
-
- // Get properties
- Properties p = (new DB()).getProperties();
- int http_port = Integer.parseInt(p.getProperty("org.onap.dmaap.datarouter.provserver.http.port", "8080"));
- int https_port = Integer.parseInt(p.getProperty("org.onap.dmaap.datarouter.provserver.https.port", "8443"));
-
- // HTTP connector
- SelectChannelConnector http = new SelectChannelConnector();
- http.setPort(http_port);
- http.setMaxIdleTime(300000);
- http.setRequestHeaderSize(2048);
- http.setAcceptors(2);
- http.setConfidentialPort(https_port);
- http.setLowResourcesConnections(20000);
-
- // HTTPS connector
- SslSelectChannelConnector https = new SslSelectChannelConnector();
- https.setPort(https_port);
- https.setMaxIdleTime(30000);
- https.setRequestHeaderSize(8192);
- https.setAcceptors(2);
-
- // SSL stuff
- SslContextFactory cf = https.getSslContextFactory();
-
- /**Skip SSLv3 Fixes*/
- cf.addExcludeProtocols("SSLv3");
- logger.info("Excluded protocols prov-"+cf.getExcludeProtocols());
- /**End of SSLv3 Fixes*/
-
- cf.setKeyStoreType(p.getProperty(KEYSTORE_TYPE_PROPERTY, "jks"));
- cf.setKeyStorePath(p.getProperty(KEYSTORE_PATH_PROPERTY));
- cf.setKeyStorePassword(p.getProperty(KEYSTORE_PASSWORD_PROPERTY));
- cf.setKeyManagerPassword(p.getProperty("org.onap.dmaap.datarouter.provserver.keymanager.password"));
- String ts = p.getProperty(TRUSTSTORE_PATH_PROPERTY);
- if (ts != null && ts.length() > 0) {
- System.out.println("@@ TS -> "+ts);
- cf.setTrustStore(ts);
- cf.setTrustStorePassword(p.getProperty(TRUSTSTORE_PASSWORD_PROPERTY));
- } else {
- cf.setTrustStore(DEFAULT_TRUSTSTORE);
- cf.setTrustStorePassword("changeit");
- }
- cf.setTrustStore("/opt/app/datartr/self_signed/cacerts.jks");
- cf.setTrustStorePassword("changeit");
- cf.setWantClientAuth(true);
-
- // Servlet and Filter configuration
- ServletContextHandler ctxt = new ServletContextHandler(0);
- ctxt.setContextPath("/");
- ctxt.addServlet(new ServletHolder(new FeedServlet()), "/feed/*");
- ctxt.addServlet(new ServletHolder(new FeedLogServlet()), "/feedlog/*");
- ctxt.addServlet(new ServletHolder(new PublishServlet()), "/publish/*");
- ctxt.addServlet(new ServletHolder(new SubscribeServlet()), "/subscribe/*");
- ctxt.addServlet(new ServletHolder(new StatisticsServlet()), "/statistics/*");
- ctxt.addServlet(new ServletHolder(new SubLogServlet()), "/sublog/*");
- ctxt.addServlet(new ServletHolder(new GroupServlet()), "/group/*"); //Provision groups - Rally US708115 -1610
- ctxt.addServlet(new ServletHolder(new SubscriptionServlet()), "/subs/*");
- ctxt.addServlet(new ServletHolder(new InternalServlet()), "/internal/*");
- ctxt.addServlet(new ServletHolder(new RouteServlet()), "/internal/route/*");
- ctxt.addServlet(new ServletHolder(new DRFeedsServlet()), "/");
- ctxt.addFilter (new FilterHolder (new ThrottleFilter()), "/publish/*", FilterMapping.REQUEST);
-
- ContextHandlerCollection contexts = new ContextHandlerCollection();
- contexts.addHandler(ctxt);
-
- // Request log configuration
- NCSARequestLog nrl = new NCSARequestLog();
- nrl.setFilename(p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir") + "/request.log.yyyy_mm_dd");
- nrl.setFilenameDateFormat("yyyyMMdd");
- nrl.setRetainDays(90);
- nrl.setAppend(true);
- nrl.setExtended(false);
- nrl.setLogCookies(false);
- nrl.setLogTimeZone("GMT");
-
- RequestLogHandler reqlog = new RequestLogHandler();
- reqlog.setRequestLog(nrl);
-
- // Server's Handler collection
- HandlerCollection hc = new HandlerCollection();
- hc.setHandlers(new Handler[] { contexts, new DefaultHandler() });
- hc.addHandler(reqlog);
-
- // Server's thread pool
- QueuedThreadPool pool = new QueuedThreadPool();
- pool.setMinThreads(10);
- pool.setMaxThreads(200);
- pool.setDetailedDump(false);
-
- // Daemon to clean up the log directory on a daily basis
- Timer rolex = new Timer();
- rolex.scheduleAtFixedRate(new PurgeLogDirTask(), 0, 86400000L); // run once per day
-
- // Start LogfileLoader
- LogfileLoader.getLoader();
-
- // The server itself
- server = new Server();
- server.setThreadPool(pool);
- server.setConnectors(new Connector[] { http, https });
- server.setHandler(hc);
- server.setStopAtShutdown(true);
- server.setSendServerVersion(true);
- server.setSendDateHeader(true);
- server.setGracefulShutdown(5000); // allow 5 seconds for servlets to wrap up
- server.setDumpAfterStart(false);
- server.setDumpBeforeStop(false);
-
- server.start();
- server.join();
- logger.info("PROV0001 **** AT&T Data Router Provisioning Server halted.");
- }
-
- private static boolean checkDatabase(Logger logger) {
- DB db = new DB();
- return db.runRetroFits();
- }
-
- /**
- * Stop the Jetty server.
- */
- public static void shutdown() {
- new Thread() {
- @Override
- public void run() {
- try {
- server.stop();
- Thread.sleep(5000L);
- System.exit(0);
- } catch (Exception e) {
- // ignore
- }
- }
- }.start();
- }
+ /**
+ * The truststore to use if none is specified
+ */
+ public static final String DEFAULT_TRUSTSTORE = "/opt/java/jdk/jdk180/jre/lib/security/cacerts";
+ public static final String KEYSTORE_TYPE_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.type";
+ public static final String KEYSTORE_PATH_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.path";
+ public static final String KEYSTORE_PASSWORD_PROPERTY = "org.onap.dmaap.datarouter.provserver.keystore.password";
+ public static final String TRUSTSTORE_PATH_PROPERTY = "org.onap.dmaap.datarouter.provserver.truststore.path";
+ public static final String TRUSTSTORE_PASSWORD_PROPERTY = "org.onap.dmaap.datarouter.provserver.truststore.password";
+
+ /**
+ * The one and only {@link Server} instance in this JVM
+ */
+ private static Server server;
+
+ /**
+ * Starts the Data Router Provisioning server.
+ *
+ * @param args not used
+ * @throws Exception if Jetty has a problem starting
+ */
+ public static void main(String[] args) throws Exception {
+ Security.setProperty("networkaddress.cache.ttl", "4");
+ Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+
+ // Check DB is accessible and contains the expected tables
+ if (!checkDatabase(logger))
+ System.exit(1);
+
+ logger.info("PROV0000 **** AT&T Data Router Provisioning Server starting....");
+
+ // Get properties
+ Properties p = (new DB()).getProperties();
+ int http_port = Integer.parseInt(p.getProperty("org.onap.dmaap.datarouter.provserver.http.port", "8080"));
+ int https_port = Integer.parseInt(p.getProperty("org.onap.dmaap.datarouter.provserver.https.port", "8443"));
+
+ // HTTP connector
+ SelectChannelConnector http = new SelectChannelConnector();
+ http.setPort(http_port);
+ http.setMaxIdleTime(300000);
+ http.setRequestHeaderSize(2048);
+ http.setAcceptors(2);
+ http.setConfidentialPort(https_port);
+ http.setLowResourcesConnections(20000);
+
+ // HTTPS connector
+ SslSelectChannelConnector https = new SslSelectChannelConnector();
+ https.setPort(https_port);
+ https.setMaxIdleTime(30000);
+ https.setRequestHeaderSize(8192);
+ https.setAcceptors(2);
+
+ // SSL stuff
+ SslContextFactory cf = https.getSslContextFactory();
+
+ /**Skip SSLv3 Fixes*/
+ cf.addExcludeProtocols("SSLv3");
+ logger.info("Excluded protocols prov-" + cf.getExcludeProtocols());
+ /**End of SSLv3 Fixes*/
+
+ cf.setKeyStoreType(p.getProperty(KEYSTORE_TYPE_PROPERTY, "jks"));
+ cf.setKeyStorePath(p.getProperty(KEYSTORE_PATH_PROPERTY));
+ cf.setKeyStorePassword(p.getProperty(KEYSTORE_PASSWORD_PROPERTY));
+ cf.setKeyManagerPassword(p.getProperty("org.onap.dmaap.datarouter.provserver.keymanager.password"));
+ String ts = p.getProperty(TRUSTSTORE_PATH_PROPERTY);
+ if (ts != null && ts.length() > 0) {
+ System.out.println("@@ TS -> " + ts);
+ cf.setTrustStore(ts);
+ cf.setTrustStorePassword(p.getProperty(TRUSTSTORE_PASSWORD_PROPERTY));
+ } else {
+ cf.setTrustStore(DEFAULT_TRUSTSTORE);
+ cf.setTrustStorePassword("changeit");
+ }
+ cf.setTrustStore("/opt/app/datartr/self_signed/cacerts.jks");
+ cf.setTrustStorePassword("changeit");
+ cf.setWantClientAuth(true);
+
+ // Servlet and Filter configuration
+ ServletContextHandler ctxt = new ServletContextHandler(0);
+ ctxt.setContextPath("/");
+ ctxt.addServlet(new ServletHolder(new FeedServlet()), "/feed/*");
+ ctxt.addServlet(new ServletHolder(new FeedLogServlet()), "/feedlog/*");
+ ctxt.addServlet(new ServletHolder(new PublishServlet()), "/publish/*");
+ ctxt.addServlet(new ServletHolder(new SubscribeServlet()), "/subscribe/*");
+ ctxt.addServlet(new ServletHolder(new StatisticsServlet()), "/statistics/*");
+ ctxt.addServlet(new ServletHolder(new SubLogServlet()), "/sublog/*");
+ ctxt.addServlet(new ServletHolder(new GroupServlet()), "/group/*"); //Provision groups - Rally US708115 -1610
+ ctxt.addServlet(new ServletHolder(new SubscriptionServlet()), "/subs/*");
+ ctxt.addServlet(new ServletHolder(new InternalServlet()), "/internal/*");
+ ctxt.addServlet(new ServletHolder(new RouteServlet()), "/internal/route/*");
+ ctxt.addServlet(new ServletHolder(new DRFeedsServlet()), "/");
+ ctxt.addFilter(new FilterHolder(new ThrottleFilter()), "/publish/*", FilterMapping.REQUEST);
+
+ ContextHandlerCollection contexts = new ContextHandlerCollection();
+ contexts.addHandler(ctxt);
+
+ // Request log configuration
+ NCSARequestLog nrl = new NCSARequestLog();
+ nrl.setFilename(p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir") + "/request.log.yyyy_mm_dd");
+ nrl.setFilenameDateFormat("yyyyMMdd");
+ nrl.setRetainDays(90);
+ nrl.setAppend(true);
+ nrl.setExtended(false);
+ nrl.setLogCookies(false);
+ nrl.setLogTimeZone("GMT");
+
+ RequestLogHandler reqlog = new RequestLogHandler();
+ reqlog.setRequestLog(nrl);
+
+ // Server's Handler collection
+ HandlerCollection hc = new HandlerCollection();
+ hc.setHandlers(new Handler[]{contexts, new DefaultHandler()});
+ hc.addHandler(reqlog);
+
+ // Server's thread pool
+ QueuedThreadPool pool = new QueuedThreadPool();
+ pool.setMinThreads(10);
+ pool.setMaxThreads(200);
+ pool.setDetailedDump(false);
+
+ // Daemon to clean up the log directory on a daily basis
+ Timer rolex = new Timer();
+ rolex.scheduleAtFixedRate(new PurgeLogDirTask(), 0, 86400000L); // run once per day
+
+ // Start LogfileLoader
+ LogfileLoader.getLoader();
+
+ // The server itself
+ server = new Server();
+ server.setThreadPool(pool);
+ server.setConnectors(new Connector[]{http, https});
+ server.setHandler(hc);
+ server.setStopAtShutdown(true);
+ server.setSendServerVersion(true);
+ server.setSendDateHeader(true);
+ server.setGracefulShutdown(5000); // allow 5 seconds for servlets to wrap up
+ server.setDumpAfterStart(false);
+ server.setDumpBeforeStop(false);
+
+ server.start();
+ server.join();
+ logger.info("PROV0001 **** AT&T Data Router Provisioning Server halted.");
+ }
+
+ private static boolean checkDatabase(Logger logger) {
+ DB db = new DB();
+ return db.runRetroFits();
+ }
+
+ /**
+ * Stop the Jetty server.
+ */
+ public static void shutdown() {
+ new Thread() {
+ @Override
+ public void run() {
+ try {
+ server.stop();
+ Thread.sleep(5000L);
+ System.exit(0);
+ } catch (Exception e) {
+ // ignore
+ }
+ }
+ }.start();
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Poker.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Poker.java
index 1d9f7143..4250624b 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Poker.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/Poker.java
@@ -1,317 +1,317 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.InetAddress;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.UnknownHostException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.TreeSet;
-
-import javax.servlet.ServletException;
-
-import org.apache.log4j.Logger;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.json.JSONTokener;
-import org.onap.dmaap.datarouter.provisioning.beans.EgressRoute;
-import org.onap.dmaap.datarouter.provisioning.beans.Feed;
-import org.onap.dmaap.datarouter.provisioning.beans.Group;
-import org.onap.dmaap.datarouter.provisioning.beans.IngressRoute;
-import org.onap.dmaap.datarouter.provisioning.beans.NetworkRoute;
-import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
-import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
-import org.onap.dmaap.datarouter.provisioning.utils.*;
-
-/**
- * This class handles the two timers (described in R1 Design Notes), and takes care of issuing
- * the GET to each node of the URL to "poke".
- *
- * @author Robert Eby
- * @version $Id: Poker.java,v 1.11 2014/01/08 16:13:47 eby Exp $
- */
-public class Poker extends TimerTask {
- /** Template used to generate the URL to issue the GET against */
- public static final String POKE_URL_TEMPLATE = "http://%s/internal/fetchProv";
-
-
-
-
- /** This is a singleton -- there is only one Poker object in the server */
- private static Poker p;
-
- /**
- * Get the singleton Poker object.
- * @return the Poker
- */
- public static synchronized Poker getPoker() {
- if (p == null)
- p = new Poker();
- return p;
- }
-
- private long timer1;
- private long timer2;
- private Timer rolex;
- private String this_pod; // DNS name of this machine
- private Logger logger;
- private String provstring;
-
- private Poker() {
- timer1 = timer2 = 0;
- rolex = new Timer();
- logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- try {
- this_pod = InetAddress.getLocalHost().getHostName();
- } catch (UnknownHostException e) {
- this_pod = "*UNKNOWN*"; // not a major problem
- }
- provstring = buildProvisioningString();
-
- rolex.scheduleAtFixedRate(this, 0L, 1000L); // Run once a second to check the timers
- }
-
- /**
- * This method sets the two timers described in the design notes.
- * @param t1 the first timer controls how long to wait after a provisioning request before poking each node
- * This timer can be reset if it has not "gone off".
- * @param t2 the second timer set the outer bound on how long to wait. It cannot be reset.
- */
- public void setTimers(long t1, long t2) {
- synchronized (this_pod) {
- if (timer1 == 0 || t1 > timer1)
- timer1 = t1;
- if (timer2 == 0)
- timer2 = t2;
- }
- if (logger.isDebugEnabled())
- logger.debug("Poker timers set to " + timer1 + " and " + timer2);
-
-
- }
-
- /**
- * Return the last provisioning string built.
- * @return the last provisioning string built.
- */
- public String getProvisioningString() {
- return provstring;
- }
-
- /**
- * The method to run at the predefined interval (once per second). This method checks
- * to see if either of the two timers has expired, and if so, will rebuild the provisioning
- * string, and poke all the nodes and other PODs. The timers are then reset to 0.
- */
- @Override
- public void run() {
- try {
- if (timer1 > 0) {
- long now = System.currentTimeMillis();
- boolean fire = false;
- synchronized (this_pod) {
- if (now > timer1 || now > timer2) {
- timer1 = timer2 = 0;
- fire = true;
- }
- }
- if (fire) {
- // Rebuild the prov string
- provstring = buildProvisioningString();
-
- // Only the active POD should poke nodes, etc.
- boolean active = SynchronizerTask.getSynchronizer().isActive();
- if (active) {
- // Poke all the DR nodes
- for (String n : BaseServlet.getNodes()) {
- pokeNode(n);
- }
- // Poke the pod that is not us
- for (String n : BaseServlet.getPods()) {
- if (n.length() > 0 && !n.equals(this_pod))
- pokeNode(n);
- }
- }
- }
- }
- } catch (Exception e) {
- logger.warn("PROV0020: Caught exception in Poker: "+e);
- e.printStackTrace();
- }
- }
- private void pokeNode(final String nodename) {
- logger.debug("PROV0012 Poking node " + nodename + " ...");
- Runnable r = new Runnable() {
- @Override
- public void run() {
-
- try {
- String u = String.format(POKE_URL_TEMPLATE, nodename+":"+DB.HTTP_PORT);
- URL url = new URL(u);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setConnectTimeout(60000); //Fixes for Itrack DATARTR-3, poke timeout
- conn.connect();
- conn.getContentLength(); // Force the GET through
- conn.disconnect();
- } catch (MalformedURLException e) {
- logger.warn("PROV0013 MalformedURLException Error poking node "+nodename+": " + e.getMessage());
- } catch (IOException e) {
- logger.warn("PROV0013 IOException Error poking node "+nodename+": " + e.getMessage());
- }
- }
- };
-// Thread t = new Thread(r);
-// t.start();
- r.run();
- }
- @SuppressWarnings("unused")
- private String buildProvisioningString() {
- StringBuilder sb = new StringBuilder("{\n");
-
- // Append Feeds to the string
- String pfx = "\n";
- sb.append("\"feeds\": [");
- for (Feed f : Feed.getAllFeeds()) {
- sb.append(pfx);
- sb.append(f.asJSONObject().toString());
- pfx = ",\n";
- }
- sb.append("\n],\n");
-
- //Append groups to the string - Rally:US708115 - 1610
- pfx = "\n";
- sb.append("\"groups\": [");
- for (Group s : Group.getAllgroups()) {
- sb.append(pfx);
- sb.append(s.asJSONObject().toString());
- pfx = ",\n";
- }
- sb.append("\n],\n");
-
-
- // Append Subscriptions to the string
- pfx = "\n";
- sb.append("\"subscriptions\": [");
- for (Subscription s : Subscription.getAllSubscriptions()) {
- sb.append(pfx);
- if(s!=null)
- sb.append(s.asJSONObject().toString());
- pfx = ",\n";
- }
- sb.append("\n],\n");
-
- // Append Parameters to the string
- pfx = "\n";
- sb.append("\"parameters\": {");
- Map<String,String> props = Parameters.getParameters();
- Set<String> ivals = new HashSet<String>();
- String intv = props.get("_INT_VALUES");
- if (intv != null)
- ivals.addAll(Arrays.asList(intv.split("\\|")));
- for (String key : new TreeSet<String>(props.keySet())) {
- String v = props.get(key);
- sb.append(pfx);
- sb.append(" \"").append(key).append("\": ");
- if (ivals.contains(key)) {
- // integer value
- sb.append(v);
- } else if (key.endsWith("S")) {
- // Split and append array of strings
- String[] pp = v.split("\\|");
- String p2 = "";
- sb.append("[");
- for (String t : pp) {
- sb.append(p2).append("\"").append(quote(t)).append("\"");
- p2 = ",";
- }
- sb.append("]");
- } else {
- sb.append("\"").append(quote(v)).append("\"");
- }
- pfx = ",\n";
- }
- sb.append("\n},\n");
-
- // Append Routes to the string
- pfx = "\n";
- sb.append("\"ingress\": [");
- for (IngressRoute in : IngressRoute.getAllIngressRoutes()) {
- sb.append(pfx);
- sb.append(in.asJSONObject().toString());
- pfx = ",\n";
- }
- sb.append("\n],\n");
-
- pfx = "\n";
- sb.append("\"egress\": {");
- for (EgressRoute eg : EgressRoute.getAllEgressRoutes()) {
- sb.append(pfx);
- String t = eg.asJSONObject().toString();
- t = t.substring(1, t.length()-1);
- sb.append(t);
- pfx = ",\n";
- }
- sb.append("\n},\n");
-
- pfx = "\n";
- sb.append("\"routing\": [");
- for (NetworkRoute ne : NetworkRoute.getAllNetworkRoutes()) {
- sb.append(pfx);
- sb.append(ne.asJSONObject().toString());
- pfx = ",\n";
- }
- sb.append("\n]");
- sb.append("\n}");
-
- // Convert to string and verify it is valid JSON
- String provstring = sb.toString();
- try {
- new JSONObject(new JSONTokener(provstring));
- } catch (JSONException e) {
- logger.warn("PROV0016: Possible invalid prov string: "+e);
- }
- return provstring;
- }
- private String quote(String s) {
- StringBuilder sb = new StringBuilder();
- for (char ch : s.toCharArray()) {
- if (ch == '\\' || ch == '"') {
- sb.append('\\');
- }
- sb.append(ch);
- }
- return sb.toString();
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.InetAddress;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.TreeSet;
+
+import javax.servlet.ServletException;
+
+import org.apache.log4j.Logger;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.onap.dmaap.datarouter.provisioning.beans.EgressRoute;
+import org.onap.dmaap.datarouter.provisioning.beans.Feed;
+import org.onap.dmaap.datarouter.provisioning.beans.Group;
+import org.onap.dmaap.datarouter.provisioning.beans.IngressRoute;
+import org.onap.dmaap.datarouter.provisioning.beans.NetworkRoute;
+import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
+import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
+import org.onap.dmaap.datarouter.provisioning.utils.*;
+
+/**
+ * This class handles the two timers (described in R1 Design Notes), and takes care of issuing
+ * the GET to each node of the URL to "poke".
+ *
+ * @author Robert Eby
+ * @version $Id: Poker.java,v 1.11 2014/01/08 16:13:47 eby Exp $
+ */
+public class Poker extends TimerTask {
+ /** Template used to generate the URL to issue the GET against */
+ public static final String POKE_URL_TEMPLATE = "http://%s/internal/fetchProv";
+
+
+
+
+ /** This is a singleton -- there is only one Poker object in the server */
+ private static Poker p;
+
+ /**
+ * Get the singleton Poker object.
+ * @return the Poker
+ */
+ public static synchronized Poker getPoker() {
+ if (p == null)
+ p = new Poker();
+ return p;
+ }
+
+ private long timer1;
+ private long timer2;
+ private Timer rolex;
+ private String this_pod; // DNS name of this machine
+ private Logger logger;
+ private String provstring;
+
+ private Poker() {
+ timer1 = timer2 = 0;
+ rolex = new Timer();
+ logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ try {
+ this_pod = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ this_pod = "*UNKNOWN*"; // not a major problem
+ }
+ provstring = buildProvisioningString();
+
+ rolex.scheduleAtFixedRate(this, 0L, 1000L); // Run once a second to check the timers
+ }
+
+ /**
+ * This method sets the two timers described in the design notes.
+ * @param t1 the first timer controls how long to wait after a provisioning request before poking each node
+ * This timer can be reset if it has not "gone off".
+ * @param t2 the second timer set the outer bound on how long to wait. It cannot be reset.
+ */
+ public void setTimers(long t1, long t2) {
+ synchronized (this_pod) {
+ if (timer1 == 0 || t1 > timer1)
+ timer1 = t1;
+ if (timer2 == 0)
+ timer2 = t2;
+ }
+ if (logger.isDebugEnabled())
+ logger.debug("Poker timers set to " + timer1 + " and " + timer2);
+
+
+ }
+
+ /**
+ * Return the last provisioning string built.
+ * @return the last provisioning string built.
+ */
+ public String getProvisioningString() {
+ return provstring;
+ }
+
+ /**
+ * The method to run at the predefined interval (once per second). This method checks
+ * to see if either of the two timers has expired, and if so, will rebuild the provisioning
+ * string, and poke all the nodes and other PODs. The timers are then reset to 0.
+ */
+ @Override
+ public void run() {
+ try {
+ if (timer1 > 0) {
+ long now = System.currentTimeMillis();
+ boolean fire = false;
+ synchronized (this_pod) {
+ if (now > timer1 || now > timer2) {
+ timer1 = timer2 = 0;
+ fire = true;
+ }
+ }
+ if (fire) {
+ // Rebuild the prov string
+ provstring = buildProvisioningString();
+
+ // Only the active POD should poke nodes, etc.
+ boolean active = SynchronizerTask.getSynchronizer().isActive();
+ if (active) {
+ // Poke all the DR nodes
+ for (String n : BaseServlet.getNodes()) {
+ pokeNode(n);
+ }
+ // Poke the pod that is not us
+ for (String n : BaseServlet.getPods()) {
+ if (n.length() > 0 && !n.equals(this_pod))
+ pokeNode(n);
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ logger.warn("PROV0020: Caught exception in Poker: "+e);
+ e.printStackTrace();
+ }
+ }
+ private void pokeNode(final String nodename) {
+ logger.debug("PROV0012 Poking node " + nodename + " ...");
+ Runnable r = new Runnable() {
+ @Override
+ public void run() {
+
+ try {
+ String u = String.format(POKE_URL_TEMPLATE, nodename+":"+DB.HTTP_PORT);
+ URL url = new URL(u);
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.setConnectTimeout(60000); //Fixes for Itrack DATARTR-3, poke timeout
+ conn.connect();
+ conn.getContentLength(); // Force the GET through
+ conn.disconnect();
+ } catch (MalformedURLException e) {
+ logger.warn("PROV0013 MalformedURLException Error poking node "+nodename+": " + e.getMessage());
+ } catch (IOException e) {
+ logger.warn("PROV0013 IOException Error poking node "+nodename+": " + e.getMessage());
+ }
+ }
+ };
+// Thread t = new Thread(r);
+// t.start();
+ r.run();
+ }
+ @SuppressWarnings("unused")
+ private String buildProvisioningString() {
+ StringBuilder sb = new StringBuilder("{\n");
+
+ // Append Feeds to the string
+ String pfx = "\n";
+ sb.append("\"feeds\": [");
+ for (Feed f : Feed.getAllFeeds()) {
+ sb.append(pfx);
+ sb.append(f.asJSONObject().toString());
+ pfx = ",\n";
+ }
+ sb.append("\n],\n");
+
+ //Append groups to the string - Rally:US708115 - 1610
+ pfx = "\n";
+ sb.append("\"groups\": [");
+ for (Group s : Group.getAllgroups()) {
+ sb.append(pfx);
+ sb.append(s.asJSONObject().toString());
+ pfx = ",\n";
+ }
+ sb.append("\n],\n");
+
+
+ // Append Subscriptions to the string
+ pfx = "\n";
+ sb.append("\"subscriptions\": [");
+ for (Subscription s : Subscription.getAllSubscriptions()) {
+ sb.append(pfx);
+ if(s!=null)
+ sb.append(s.asJSONObject().toString());
+ pfx = ",\n";
+ }
+ sb.append("\n],\n");
+
+ // Append Parameters to the string
+ pfx = "\n";
+ sb.append("\"parameters\": {");
+ Map<String,String> props = Parameters.getParameters();
+ Set<String> ivals = new HashSet<String>();
+ String intv = props.get("_INT_VALUES");
+ if (intv != null)
+ ivals.addAll(Arrays.asList(intv.split("\\|")));
+ for (String key : new TreeSet<String>(props.keySet())) {
+ String v = props.get(key);
+ sb.append(pfx);
+ sb.append(" \"").append(key).append("\": ");
+ if (ivals.contains(key)) {
+ // integer value
+ sb.append(v);
+ } else if (key.endsWith("S")) {
+ // Split and append array of strings
+ String[] pp = v.split("\\|");
+ String p2 = "";
+ sb.append("[");
+ for (String t : pp) {
+ sb.append(p2).append("\"").append(quote(t)).append("\"");
+ p2 = ",";
+ }
+ sb.append("]");
+ } else {
+ sb.append("\"").append(quote(v)).append("\"");
+ }
+ pfx = ",\n";
+ }
+ sb.append("\n},\n");
+
+ // Append Routes to the string
+ pfx = "\n";
+ sb.append("\"ingress\": [");
+ for (IngressRoute in : IngressRoute.getAllIngressRoutes()) {
+ sb.append(pfx);
+ sb.append(in.asJSONObject().toString());
+ pfx = ",\n";
+ }
+ sb.append("\n],\n");
+
+ pfx = "\n";
+ sb.append("\"egress\": {");
+ for (EgressRoute eg : EgressRoute.getAllEgressRoutes()) {
+ sb.append(pfx);
+ String t = eg.asJSONObject().toString();
+ t = t.substring(1, t.length()-1);
+ sb.append(t);
+ pfx = ",\n";
+ }
+ sb.append("\n},\n");
+
+ pfx = "\n";
+ sb.append("\"routing\": [");
+ for (NetworkRoute ne : NetworkRoute.getAllNetworkRoutes()) {
+ sb.append(pfx);
+ sb.append(ne.asJSONObject().toString());
+ pfx = ",\n";
+ }
+ sb.append("\n]");
+ sb.append("\n}");
+
+ // Convert to string and verify it is valid JSON
+ String provstring = sb.toString();
+ try {
+ new JSONObject(new JSONTokener(provstring));
+ } catch (JSONException e) {
+ logger.warn("PROV0016: Possible invalid prov string: "+e);
+ }
+ return provstring;
+ }
+ private String quote(String s) {
+ StringBuilder sb = new StringBuilder();
+ for (char ch : s.toCharArray()) {
+ if (ch == '\\' || ch == '"') {
+ sb.append('\\');
+ }
+ sb.append(ch);
+ }
+ return sb.toString();
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
index 2db1ce40..6564e175 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
@@ -1,303 +1,303 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URI;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Properties;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpRequestBase;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.ssl.SSLSocketFactory;
-import org.apache.http.entity.BasicHttpEntity;
-import org.apache.http.impl.client.AbstractHttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.onap.dmaap.datarouter.provisioning.utils.DB;
-import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
-
-/**
- * This class is the base class for those servlets that need to proxy their requests from the
- * standby to active server. Its methods perform the proxy function to the active server. If the
- * active server is not reachable, a 503 (SC_SERVICE_UNAVAILABLE) is returned. Only
- * DELETE/GET/PUT/POST are supported.
- *
- * @author Robert Eby
- * @version $Id: ProxyServlet.java,v 1.3 2014/03/24 18:47:10 eby Exp $
- */
-@SuppressWarnings("serial")
-public class ProxyServlet extends BaseServlet {
- private boolean inited = false;
- private Scheme sch;
-
- /**
- * Initialize this servlet, by setting up SSL.
- */
- @SuppressWarnings("deprecation")
- @Override
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- try {
- // Set up keystore
- Properties props = (new DB()).getProperties();
- String type = props.getProperty(Main.KEYSTORE_TYPE_PROPERTY, "jks");
- String store = props.getProperty(Main.KEYSTORE_PATH_PROPERTY);
- String pass = props.getProperty(Main.KEYSTORE_PASSWORD_PROPERTY);
- KeyStore keyStore = readStore(store, pass, type);
-
- store = props.getProperty(Main.TRUSTSTORE_PATH_PROPERTY);
- pass = props.getProperty(Main.TRUSTSTORE_PASSWORD_PROPERTY);
- if (store == null || store.length() == 0) {
- store = Main.DEFAULT_TRUSTSTORE;
- pass = "changeit";
- }
- KeyStore trustStore = readStore(store, pass, KeyStore.getDefaultType());
-
- // We are connecting with the node name, but the certificate will have the CNAME
- // So we need to accept a non-matching certificate name
- SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, "changeit", trustStore);
- socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
- sch = new Scheme("https", 443, socketFactory);
- inited = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- intlogger.info("ProxyServlet: inited = "+inited);
- }
- private KeyStore readStore(String store, String pass, String type) throws KeyStoreException, FileNotFoundException {
- KeyStore ks = KeyStore.getInstance(type);
- FileInputStream instream = new FileInputStream(new File(store));
- try {
- ks.load(instream, pass.toCharArray());
- } catch (Exception x) {
- System.err.println("READING TRUSTSTORE: "+x);
- } finally {
- try { instream.close(); } catch (Exception ignore) {}
- }
- return ks;
- }
- /**
- * Return <i>true</i> if the requester has NOT set the <i>noproxy</i> CGI variable.
- * If they have, this indicates they want to forcibly turn the proxy off.
- * @param req the HTTP request
- * @return true or false
- */
- protected boolean isProxyOK(final HttpServletRequest req) {
- String t = req.getQueryString();
- if (t != null) {
- t = t.replaceAll("&amp;", "&");
- for (String s : t.split("&")) {
- if (s.equals("noproxy") || s.startsWith("noproxy="))
- return false;
- }
- }
- return true;
- }
- /**
- * Is this the standby server? If it is, the proxy functions can be used.
- * If not, the proxy functions should not be called, and will send a response of 500
- * (Internal Server Error).
- * @return true if this server is the standby (and hence a proxy server).
- */
- public boolean isProxyServer() {
- SynchronizerTask st = SynchronizerTask.getSynchronizer();
- return st.getState() == SynchronizerTask.STANDBY;
- }
- /**
- * Issue a proxy DELETE to the active provisioning server.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- doProxy(req, resp, "DELETE");
- }
- /**
- * Issue a proxy GET to the active provisioning server.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- doProxy(req, resp, "GET");
- }
- /**
- * Issue a proxy PUT to the active provisioning server.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- doProxy(req, resp, "PUT");
- }
- /**
- * Issue a proxy POST to the active provisioning server.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- doProxy(req, resp, "POST");
- }
- /**
- * Issue a proxy GET to the active provisioning server. Unlike doGet() above,
- * this method will allow the caller to fall back to other code if the remote server is unreachable.
- * @return true if the proxy succeeded
- */
- public boolean doGetWithFallback(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- boolean rv = false;
- if (inited) {
- String url = buildUrl(req);
- intlogger.info("ProxyServlet: proxying with fallback GET "+url);
- AbstractHttpClient httpclient = new DefaultHttpClient();
- HttpRequestBase proxy = new HttpGet(url);
- try {
- httpclient.getConnectionManager().getSchemeRegistry().register(sch);
-
- // Copy request headers and request body
- copyRequestHeaders(req, proxy);
-
- // Execute the request
- HttpResponse pxy_response = httpclient.execute(proxy);
-
- // Get response headers and body
- int code = pxy_response.getStatusLine().getStatusCode();
- resp.setStatus(code);
- copyResponseHeaders(pxy_response, resp);
-
- HttpEntity entity = pxy_response.getEntity();
- if (entity != null) {
- InputStream in = entity.getContent();
- IOUtils.copy(in, resp.getOutputStream());
- in.close();
- }
- rv = true;
- } catch (IOException e) {
- System.err.println("ProxyServlet: "+e);
- e.printStackTrace();
- } finally {
- proxy.releaseConnection();
- httpclient.getConnectionManager().shutdown();
- }
- } else {
- intlogger.warn("ProxyServlet: proxy disabled");
- }
- return rv;
- }
- private void doProxy(HttpServletRequest req, HttpServletResponse resp, final String method) throws IOException {
- if (inited && isProxyServer()) {
- String url = buildUrl(req);
- intlogger.info("ProxyServlet: proxying "+method + " "+url);
- AbstractHttpClient httpclient = new DefaultHttpClient();
- ProxyHttpRequest proxy = new ProxyHttpRequest(method, url);
- try {
- httpclient.getConnectionManager().getSchemeRegistry().register(sch);
-
- // Copy request headers and request body
- copyRequestHeaders(req, proxy);
- if (method.equals("POST") || method.equals("PUT")){
- BasicHttpEntity body = new BasicHttpEntity();
- body.setContent(req.getInputStream());
- body.setContentLength(-1); // -1 = unknown
- proxy.setEntity(body);
- }
-
- // Execute the request
- HttpResponse pxy_response = httpclient.execute(proxy);
-
- // Get response headers and body
- int code = pxy_response.getStatusLine().getStatusCode();
- resp.setStatus(code);
- copyResponseHeaders(pxy_response, resp);
-
- HttpEntity entity = pxy_response.getEntity();
- if (entity != null) {
- InputStream in = entity.getContent();
- IOUtils.copy(in, resp.getOutputStream());
- in.close();
- }
- } catch (IOException e) {
- intlogger.warn("ProxyServlet: "+e);
- resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
- e.printStackTrace();
- } finally {
- proxy.releaseConnection();
- httpclient.getConnectionManager().shutdown();
- }
- } else {
- intlogger.warn("ProxyServlet: proxy disabled");
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- }
- }
- private String buildUrl(HttpServletRequest req) {
- StringBuilder sb = new StringBuilder("https://");
- sb.append(URLUtilities.getPeerPodName());
- sb.append(req.getRequestURI());
- String q = req.getQueryString();
- if (q != null)
- sb.append("?").append(q);
- return sb.toString();
- }
- private void copyRequestHeaders(HttpServletRequest from, HttpRequestBase to) {
- @SuppressWarnings("unchecked")
- List<String> list = Collections.list(from.getHeaderNames());
- for (String name : list) {
- // Proxy code will add this one
- if (!name.equalsIgnoreCase("Content-Length"))
- to.addHeader(name, from.getHeader(name));
- }
- }
- private void copyResponseHeaders(HttpResponse from, HttpServletResponse to) {
- for (Header hdr : from.getAllHeaders()) {
- // Don't copy Date: our Jetty will add another Date header
- if (!hdr.getName().equals("Date"))
- to.addHeader(hdr.getName(), hdr.getValue());
- }
- }
-
- public class ProxyHttpRequest extends HttpEntityEnclosingRequestBase {
- private final String method;
-
- public ProxyHttpRequest(final String method, final String uri) {
- super();
- this.method = method;
- setURI(URI.create(uri));
- }
- @Override
- public String getMethod() {
- return method;
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.BasicHttpEntity;
+import org.apache.http.impl.client.AbstractHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.onap.dmaap.datarouter.provisioning.utils.DB;
+import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
+
+/**
+ * This class is the base class for those servlets that need to proxy their requests from the
+ * standby to active server. Its methods perform the proxy function to the active server. If the
+ * active server is not reachable, a 503 (SC_SERVICE_UNAVAILABLE) is returned. Only
+ * DELETE/GET/PUT/POST are supported.
+ *
+ * @author Robert Eby
+ * @version $Id: ProxyServlet.java,v 1.3 2014/03/24 18:47:10 eby Exp $
+ */
+@SuppressWarnings("serial")
+public class ProxyServlet extends BaseServlet {
+ private boolean inited = false;
+ private Scheme sch;
+
+ /**
+ * Initialize this servlet, by setting up SSL.
+ */
+ @SuppressWarnings("deprecation")
+ @Override
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ try {
+ // Set up keystore
+ Properties props = (new DB()).getProperties();
+ String type = props.getProperty(Main.KEYSTORE_TYPE_PROPERTY, "jks");
+ String store = props.getProperty(Main.KEYSTORE_PATH_PROPERTY);
+ String pass = props.getProperty(Main.KEYSTORE_PASSWORD_PROPERTY);
+ KeyStore keyStore = readStore(store, pass, type);
+
+ store = props.getProperty(Main.TRUSTSTORE_PATH_PROPERTY);
+ pass = props.getProperty(Main.TRUSTSTORE_PASSWORD_PROPERTY);
+ if (store == null || store.length() == 0) {
+ store = Main.DEFAULT_TRUSTSTORE;
+ pass = "changeit";
+ }
+ KeyStore trustStore = readStore(store, pass, KeyStore.getDefaultType());
+
+ // We are connecting with the node name, but the certificate will have the CNAME
+ // So we need to accept a non-matching certificate name
+ SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore, "changeit", trustStore);
+ socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+ sch = new Scheme("https", 443, socketFactory);
+ inited = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ intlogger.info("ProxyServlet: inited = "+inited);
+ }
+ private KeyStore readStore(String store, String pass, String type) throws KeyStoreException, FileNotFoundException {
+ KeyStore ks = KeyStore.getInstance(type);
+ FileInputStream instream = new FileInputStream(new File(store));
+ try {
+ ks.load(instream, pass.toCharArray());
+ } catch (Exception x) {
+ System.err.println("READING TRUSTSTORE: "+x);
+ } finally {
+ try { instream.close(); } catch (Exception ignore) {}
+ }
+ return ks;
+ }
+ /**
+ * Return <i>true</i> if the requester has NOT set the <i>noproxy</i> CGI variable.
+ * If they have, this indicates they want to forcibly turn the proxy off.
+ * @param req the HTTP request
+ * @return true or false
+ */
+ protected boolean isProxyOK(final HttpServletRequest req) {
+ String t = req.getQueryString();
+ if (t != null) {
+ t = t.replaceAll("&amp;", "&");
+ for (String s : t.split("&")) {
+ if (s.equals("noproxy") || s.startsWith("noproxy="))
+ return false;
+ }
+ }
+ return true;
+ }
+ /**
+ * Is this the standby server? If it is, the proxy functions can be used.
+ * If not, the proxy functions should not be called, and will send a response of 500
+ * (Internal Server Error).
+ * @return true if this server is the standby (and hence a proxy server).
+ */
+ public boolean isProxyServer() {
+ SynchronizerTask st = SynchronizerTask.getSynchronizer();
+ return st.getState() == SynchronizerTask.STANDBY;
+ }
+ /**
+ * Issue a proxy DELETE to the active provisioning server.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ doProxy(req, resp, "DELETE");
+ }
+ /**
+ * Issue a proxy GET to the active provisioning server.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ doProxy(req, resp, "GET");
+ }
+ /**
+ * Issue a proxy PUT to the active provisioning server.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ doProxy(req, resp, "PUT");
+ }
+ /**
+ * Issue a proxy POST to the active provisioning server.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ doProxy(req, resp, "POST");
+ }
+ /**
+ * Issue a proxy GET to the active provisioning server. Unlike doGet() above,
+ * this method will allow the caller to fall back to other code if the remote server is unreachable.
+ * @return true if the proxy succeeded
+ */
+ public boolean doGetWithFallback(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ boolean rv = false;
+ if (inited) {
+ String url = buildUrl(req);
+ intlogger.info("ProxyServlet: proxying with fallback GET "+url);
+ AbstractHttpClient httpclient = new DefaultHttpClient();
+ HttpRequestBase proxy = new HttpGet(url);
+ try {
+ httpclient.getConnectionManager().getSchemeRegistry().register(sch);
+
+ // Copy request headers and request body
+ copyRequestHeaders(req, proxy);
+
+ // Execute the request
+ HttpResponse pxy_response = httpclient.execute(proxy);
+
+ // Get response headers and body
+ int code = pxy_response.getStatusLine().getStatusCode();
+ resp.setStatus(code);
+ copyResponseHeaders(pxy_response, resp);
+
+ HttpEntity entity = pxy_response.getEntity();
+ if (entity != null) {
+ InputStream in = entity.getContent();
+ IOUtils.copy(in, resp.getOutputStream());
+ in.close();
+ }
+ rv = true;
+ } catch (IOException e) {
+ System.err.println("ProxyServlet: "+e);
+ e.printStackTrace();
+ } finally {
+ proxy.releaseConnection();
+ httpclient.getConnectionManager().shutdown();
+ }
+ } else {
+ intlogger.warn("ProxyServlet: proxy disabled");
+ }
+ return rv;
+ }
+ private void doProxy(HttpServletRequest req, HttpServletResponse resp, final String method) throws IOException {
+ if (inited && isProxyServer()) {
+ String url = buildUrl(req);
+ intlogger.info("ProxyServlet: proxying "+method + " "+url);
+ AbstractHttpClient httpclient = new DefaultHttpClient();
+ ProxyHttpRequest proxy = new ProxyHttpRequest(method, url);
+ try {
+ httpclient.getConnectionManager().getSchemeRegistry().register(sch);
+
+ // Copy request headers and request body
+ copyRequestHeaders(req, proxy);
+ if (method.equals("POST") || method.equals("PUT")){
+ BasicHttpEntity body = new BasicHttpEntity();
+ body.setContent(req.getInputStream());
+ body.setContentLength(-1); // -1 = unknown
+ proxy.setEntity(body);
+ }
+
+ // Execute the request
+ HttpResponse pxy_response = httpclient.execute(proxy);
+
+ // Get response headers and body
+ int code = pxy_response.getStatusLine().getStatusCode();
+ resp.setStatus(code);
+ copyResponseHeaders(pxy_response, resp);
+
+ HttpEntity entity = pxy_response.getEntity();
+ if (entity != null) {
+ InputStream in = entity.getContent();
+ IOUtils.copy(in, resp.getOutputStream());
+ in.close();
+ }
+ } catch (IOException e) {
+ intlogger.warn("ProxyServlet: "+e);
+ resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+ e.printStackTrace();
+ } finally {
+ proxy.releaseConnection();
+ httpclient.getConnectionManager().shutdown();
+ }
+ } else {
+ intlogger.warn("ProxyServlet: proxy disabled");
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+ }
+ private String buildUrl(HttpServletRequest req) {
+ StringBuilder sb = new StringBuilder("https://");
+ sb.append(URLUtilities.getPeerPodName());
+ sb.append(req.getRequestURI());
+ String q = req.getQueryString();
+ if (q != null)
+ sb.append("?").append(q);
+ return sb.toString();
+ }
+ private void copyRequestHeaders(HttpServletRequest from, HttpRequestBase to) {
+ @SuppressWarnings("unchecked")
+ List<String> list = Collections.list(from.getHeaderNames());
+ for (String name : list) {
+ // Proxy code will add this one
+ if (!name.equalsIgnoreCase("Content-Length"))
+ to.addHeader(name, from.getHeader(name));
+ }
+ }
+ private void copyResponseHeaders(HttpResponse from, HttpServletResponse to) {
+ for (Header hdr : from.getAllHeaders()) {
+ // Don't copy Date: our Jetty will add another Date header
+ if (!hdr.getName().equals("Date"))
+ to.addHeader(hdr.getName(), hdr.getValue());
+ }
+ }
+
+ public class ProxyHttpRequest extends HttpEntityEnclosingRequestBase {
+ private final String method;
+
+ public ProxyHttpRequest(final String method, final String uri) {
+ super();
+ this.method = method;
+ setURI(URI.create(uri));
+ }
+ @Override
+ public String getMethod() {
+ return method;
+ }
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/PublishServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/PublishServlet.java
index e736d79c..d500bb31 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/PublishServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/PublishServlet.java
@@ -1,192 +1,192 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Properties;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.json.JSONTokener;
-import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
-import org.onap.dmaap.datarouter.provisioning.beans.Feed;
-import org.onap.dmaap.datarouter.provisioning.beans.IngressRoute;
-import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
-import org.onap.dmaap.datarouter.provisioning.utils.*;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-/**
- * This servlet handles redirects for the &lt;publishURL&gt; on the provisioning server,
- * which is generated by the provisioning server to handle a particular subscriptions to a feed.
- * See the <b>File Publishing and Delivery API</b> document for details on how these methods
- * should be invoked.
- *
- * @author Robert Eby
- * @version $Id: PublishServlet.java,v 1.8 2014/03/12 19:45:41 eby Exp $
- */
-@SuppressWarnings("serial")
-public class PublishServlet extends BaseServlet {
- private int next_node;
- private String provstring;
- private List<IngressRoute> irt;
- //Adding EELF Logger Rally:US664892
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.PublishServlet");
-
-
- @Override
- public void init(ServletConfig config) throws ServletException {
- super.init(config);
- next_node = 0;
- provstring = "";
- irt = new ArrayList<IngressRoute>();
-
- }
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- redirect(req, resp);
- }
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- redirect(req, resp);
- }
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- redirect(req, resp);
- }
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPost");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
- redirect(req, resp);
- }
- private void redirect(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- String[] nodes = getNodes();
- if (nodes == null || nodes.length == 0) {
- resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "There are no nodes defined in the DR network.");
- } else {
- EventLogRecord elr = new EventLogRecord(req);
- int feedid = checkPath(req);
- if (feedid < 0) {
- String message = (feedid == -1)
- ? "Invalid request - Missing or bad feed number."
- : "Invalid request - Missing file ID.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
-
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- } else {
- // Generate new URL
- String nextnode = getRedirectNode(feedid, req);
- nextnode = nextnode+":"+DB.HTTPS_PORT;
- String newurl = "https://" + nextnode + "/publish" + req.getPathInfo();
- String qs = req.getQueryString();
- if (qs != null)
- newurl += "?" + qs;
-
- // Log redirect in event log
- String message = "Redirected to: "+newurl;
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_MOVED_PERMANENTLY);
- eventlogger.info(elr);
-
- resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
- resp.setHeader("Location", newurl);
- }
- }
- }
- private String getRedirectNode(int feedid, HttpServletRequest req) {
- // Check to see if the IRT needs to be updated
- Poker p = Poker.getPoker();
- String s = p.getProvisioningString();
- synchronized (provstring) {
- if (irt == null || (s.length() != provstring.length()) || !s.equals(provstring)) {
- // Provisioning string has changed -- update the IRT
- provstring = s;
- JSONObject jo = new JSONObject(new JSONTokener(provstring));
- JSONArray ja = jo.getJSONArray("ingress");
- List<IngressRoute> newlist = new ArrayList<IngressRoute>();
- for (int i = 0; i < ja.length(); i++) {
- IngressRoute iroute = new IngressRoute(ja.getJSONObject(i));
- newlist.add(iroute);
- }
- irt = newlist;
- }
- }
-
- // Look in IRT for next node
- for (IngressRoute route : irt) {
- if (route.matches(feedid, req)) {
- // pick a node at random from the list
- Collection<String> nodes = route.getNodes();
- String[] arr = nodes.toArray(new String[0]);
- long id = System.currentTimeMillis() % arr.length;
- String node = arr[(int) id];
- intlogger.info("Redirecting to "+node+" because of route "+route);
- return node;
- }
- }
-
- // No IRT rule matches, do round robin of all active nodes
- String[] nodes = getNodes();
- if (next_node >= nodes.length) // The list of nodes may have grown/shrunk
- next_node = 0;
- return nodes[next_node++];
- }
- private int checkPath(HttpServletRequest req) {
- String path = req.getPathInfo();
- if (path == null || path.length() < 2)
- return -1;
- path = path.substring(1);
- int ix = path.indexOf('/');
- if (ix < 0 || ix == path.length()-1)
- return -2;
- try {
- int feedid = Integer.parseInt(path.substring(0, ix));
- if (!Feed.isFeedValid(feedid))
- return -1;
- return feedid;
- } catch (NumberFormatException e) {
- return -1;
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Properties;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
+import org.onap.dmaap.datarouter.provisioning.beans.Feed;
+import org.onap.dmaap.datarouter.provisioning.beans.IngressRoute;
+import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
+import org.onap.dmaap.datarouter.provisioning.utils.*;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+/**
+ * This servlet handles redirects for the &lt;publishURL&gt; on the provisioning server,
+ * which is generated by the provisioning server to handle a particular subscriptions to a feed.
+ * See the <b>File Publishing and Delivery API</b> document for details on how these methods
+ * should be invoked.
+ *
+ * @author Robert Eby
+ * @version $Id: PublishServlet.java,v 1.8 2014/03/12 19:45:41 eby Exp $
+ */
+@SuppressWarnings("serial")
+public class PublishServlet extends BaseServlet {
+ private int next_node;
+ private String provstring;
+ private List<IngressRoute> irt;
+ //Adding EELF Logger Rally:US664892
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.PublishServlet");
+
+
+ @Override
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+ next_node = 0;
+ provstring = "";
+ irt = new ArrayList<IngressRoute>();
+
+ }
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ redirect(req, resp);
+ }
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ redirect(req, resp);
+ }
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_FEEDID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ redirect(req, resp);
+ }
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPost");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
+ redirect(req, resp);
+ }
+ private void redirect(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ String[] nodes = getNodes();
+ if (nodes == null || nodes.length == 0) {
+ resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, "There are no nodes defined in the DR network.");
+ } else {
+ EventLogRecord elr = new EventLogRecord(req);
+ int feedid = checkPath(req);
+ if (feedid < 0) {
+ String message = (feedid == -1)
+ ? "Invalid request - Missing or bad feed number."
+ : "Invalid request - Missing file ID.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ } else {
+ // Generate new URL
+ String nextnode = getRedirectNode(feedid, req);
+ nextnode = nextnode+":"+DB.HTTPS_PORT;
+ String newurl = "https://" + nextnode + "/publish" + req.getPathInfo();
+ String qs = req.getQueryString();
+ if (qs != null)
+ newurl += "?" + qs;
+
+ // Log redirect in event log
+ String message = "Redirected to: "+newurl;
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_MOVED_PERMANENTLY);
+ eventlogger.info(elr);
+
+ resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
+ resp.setHeader("Location", newurl);
+ }
+ }
+ }
+ private String getRedirectNode(int feedid, HttpServletRequest req) {
+ // Check to see if the IRT needs to be updated
+ Poker p = Poker.getPoker();
+ String s = p.getProvisioningString();
+ synchronized (provstring) {
+ if (irt == null || (s.length() != provstring.length()) || !s.equals(provstring)) {
+ // Provisioning string has changed -- update the IRT
+ provstring = s;
+ JSONObject jo = new JSONObject(new JSONTokener(provstring));
+ JSONArray ja = jo.getJSONArray("ingress");
+ List<IngressRoute> newlist = new ArrayList<IngressRoute>();
+ for (int i = 0; i < ja.length(); i++) {
+ IngressRoute iroute = new IngressRoute(ja.getJSONObject(i));
+ newlist.add(iroute);
+ }
+ irt = newlist;
+ }
+ }
+
+ // Look in IRT for next node
+ for (IngressRoute route : irt) {
+ if (route.matches(feedid, req)) {
+ // pick a node at random from the list
+ Collection<String> nodes = route.getNodes();
+ String[] arr = nodes.toArray(new String[0]);
+ long id = System.currentTimeMillis() % arr.length;
+ String node = arr[(int) id];
+ intlogger.info("Redirecting to "+node+" because of route "+route);
+ return node;
+ }
+ }
+
+ // No IRT rule matches, do round robin of all active nodes
+ String[] nodes = getNodes();
+ if (next_node >= nodes.length) // The list of nodes may have grown/shrunk
+ next_node = 0;
+ return nodes[next_node++];
+ }
+ private int checkPath(HttpServletRequest req) {
+ String path = req.getPathInfo();
+ if (path == null || path.length() < 2)
+ return -1;
+ path = path.substring(1);
+ int ix = path.indexOf('/');
+ if (ix < 0 || ix == path.length()-1)
+ return -2;
+ try {
+ int feedid = Integer.parseInt(path.substring(0, ix));
+ if (!Feed.isFeedValid(feedid))
+ return -1;
+ return feedid;
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/RouteServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/RouteServlet.java
index ab7aff8d..aa0d6f57 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/RouteServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/RouteServlet.java
@@ -7,9 +7,9 @@
* * 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.
@@ -126,303 +126,303 @@ import org.onap.dmaap.datarouter.provisioning.beans.NodeClass;
*/
@SuppressWarnings("serial")
public class RouteServlet extends ProxyServlet {
- /**
- * DELETE route table entries by deleting part of the route table tree.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
- if (isProxyOK(req) && isProxyServer()) {
- super.doDelete(req, resp);
- return;
- }
+ /**
+ * DELETE route table entries by deleting part of the route table tree.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+ if (isProxyOK(req) && isProxyServer()) {
+ super.doDelete(req, resp);
+ return;
+ }
- String path = req.getPathInfo();
- String[] parts = path.substring(1).split("/");
- Deleteable[] d = null;
- if (parts[0].equals("ingress")) {
- if (parts.length == 4) {
- // /internal/route/ingress/<feed>/<user>/<subnet>
- try {
- int feedid = Integer.parseInt(parts[1]);
- IngressRoute er = IngressRoute.getIngressRoute(feedid, parts[2], parts[3].replaceAll("!", "/"));
- if (er == null) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified ingress route does not exist.");
- return;
- }
- d = new Deleteable[] { er };
- } catch (NumberFormatException e) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid feed ID in 'delete ingress' command.");
- return;
- }
- } else if (parts.length == 2) {
- // /internal/route/ingress/<seq>
- try {
- int seq = Integer.parseInt(parts[1]);
- Set<IngressRoute> set = IngressRoute.getIngressRoutesForSeq(seq);
- d = set.toArray(new Deleteable[0]);
- } catch (NumberFormatException e) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid sequence number in 'delete ingress' command.");
- return;
- }
- } else {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete ingress' command.");
- return;
- }
- } else if (parts[0].equals("egress")) {
- if (parts.length == 2) {
- // /internal/route/egress/<sub>
- try {
- int subid = Integer.parseInt(parts[1]);
- EgressRoute er = EgressRoute.getEgressRoute(subid);
- if (er == null) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified egress route does not exist.");
- return;
- }
- d = new Deleteable[] { er };
- } catch (NumberFormatException e) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid sub ID in 'delete egress' command.");
- return;
- }
- } else {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete egress' command.");
- return;
- }
- } else if (parts[0].equals("network")) {
- if (parts.length == 3) {
- // /internal/route/network/<from>/<to>
- try {//
- NetworkRoute nr = new NetworkRoute(
- NodeClass.normalizeNodename(parts[1]),
- NodeClass.normalizeNodename(parts[2])
- );
- d = new Deleteable[] { nr };
- } catch (IllegalArgumentException e) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified network route does not exist.");
- return;
- }
- } else {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete network' command.");
- return;
- }
- }
- if (d == null) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- return;
- }
- boolean rv = true;
- for (Deleteable dd : d) {
- rv &= doDelete(dd);
- }
- if (rv) {
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- provisioningDataChanged();
- provisioningParametersChanged();
- } else {
- // Something went wrong with the DELETE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
- /**
- * GET route table entries from the route table tree specified by the URL path.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
- if (isProxyOK(req) && isProxyServer()) {
- super.doGet(req, resp);
- return;
- }
+ String path = req.getPathInfo();
+ String[] parts = path.substring(1).split("/");
+ Deleteable[] d = null;
+ if (parts[0].equals("ingress")) {
+ if (parts.length == 4) {
+ // /internal/route/ingress/<feed>/<user>/<subnet>
+ try {
+ int feedid = Integer.parseInt(parts[1]);
+ IngressRoute er = IngressRoute.getIngressRoute(feedid, parts[2], parts[3].replaceAll("!", "/"));
+ if (er == null) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified ingress route does not exist.");
+ return;
+ }
+ d = new Deleteable[] { er };
+ } catch (NumberFormatException e) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid feed ID in 'delete ingress' command.");
+ return;
+ }
+ } else if (parts.length == 2) {
+ // /internal/route/ingress/<seq>
+ try {
+ int seq = Integer.parseInt(parts[1]);
+ Set<IngressRoute> set = IngressRoute.getIngressRoutesForSeq(seq);
+ d = set.toArray(new Deleteable[0]);
+ } catch (NumberFormatException e) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid sequence number in 'delete ingress' command.");
+ return;
+ }
+ } else {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete ingress' command.");
+ return;
+ }
+ } else if (parts[0].equals("egress")) {
+ if (parts.length == 2) {
+ // /internal/route/egress/<sub>
+ try {
+ int subid = Integer.parseInt(parts[1]);
+ EgressRoute er = EgressRoute.getEgressRoute(subid);
+ if (er == null) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified egress route does not exist.");
+ return;
+ }
+ d = new Deleteable[] { er };
+ } catch (NumberFormatException e) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid sub ID in 'delete egress' command.");
+ return;
+ }
+ } else {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete egress' command.");
+ return;
+ }
+ } else if (parts[0].equals("network")) {
+ if (parts.length == 3) {
+ // /internal/route/network/<from>/<to>
+ try {//
+ NetworkRoute nr = new NetworkRoute(
+ NodeClass.normalizeNodename(parts[1]),
+ NodeClass.normalizeNodename(parts[2])
+ );
+ d = new Deleteable[] { nr };
+ } catch (IllegalArgumentException e) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "The specified network route does not exist.");
+ return;
+ }
+ } else {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Invalid number of arguments in 'delete network' command.");
+ return;
+ }
+ }
+ if (d == null) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ return;
+ }
+ boolean rv = true;
+ for (Deleteable dd : d) {
+ rv &= doDelete(dd);
+ }
+ if (rv) {
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ provisioningDataChanged();
+ provisioningParametersChanged();
+ } else {
+ // Something went wrong with the DELETE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+ /**
+ * GET route table entries from the route table tree specified by the URL path.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+ if (isProxyOK(req) && isProxyServer()) {
+ super.doGet(req, resp);
+ return;
+ }
- String path = req.getPathInfo();
- if (!path.endsWith("/"))
- path += "/";
- if (!path.equals("/") && !path.equals("/ingress/") && !path.equals("/egress/") && !path.equals("/network/")) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- return;
- }
+ String path = req.getPathInfo();
+ if (!path.endsWith("/"))
+ path += "/";
+ if (!path.equals("/") && !path.equals("/ingress/") && !path.equals("/egress/") && !path.equals("/network/")) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ return;
+ }
- StringBuilder sb = new StringBuilder("{\n");
- String px2 = "";
- if (path.equals("/") || path.equals("/ingress/")) {
- String pfx = "\n";
- sb.append("\"ingress\": [");
- for (IngressRoute in : IngressRoute.getAllIngressRoutes()) {
- sb.append(pfx);
- sb.append(in.asJSONObject().toString());
- pfx = ",\n";
- }
- sb.append("\n]");
- px2 = ",\n";
- }
+ StringBuilder sb = new StringBuilder("{\n");
+ String px2 = "";
+ if (path.equals("/") || path.equals("/ingress/")) {
+ String pfx = "\n";
+ sb.append("\"ingress\": [");
+ for (IngressRoute in : IngressRoute.getAllIngressRoutes()) {
+ sb.append(pfx);
+ sb.append(in.asJSONObject().toString());
+ pfx = ",\n";
+ }
+ sb.append("\n]");
+ px2 = ",\n";
+ }
- if (path.equals("/") || path.equals("/egress/")) {
- String pfx = "\n";
- sb.append(px2);
- sb.append("\"egress\": {");
- for (EgressRoute eg : EgressRoute.getAllEgressRoutes()) {
- JSONObject jx = eg.asJSONObject();
- for (String key : jx.keySet()) {
- sb.append(pfx);
- sb.append(" \"").append(key).append("\": ");
- sb.append("\"").append(jx.getString(key)).append("\"");
- pfx = ",\n";
- }
- }
- sb.append("\n}");
- px2 = ",\n";
- }
+ if (path.equals("/") || path.equals("/egress/")) {
+ String pfx = "\n";
+ sb.append(px2);
+ sb.append("\"egress\": {");
+ for (EgressRoute eg : EgressRoute.getAllEgressRoutes()) {
+ JSONObject jx = eg.asJSONObject();
+ for (String key : jx.keySet()) {
+ sb.append(pfx);
+ sb.append(" \"").append(key).append("\": ");
+ sb.append("\"").append(jx.getString(key)).append("\"");
+ pfx = ",\n";
+ }
+ }
+ sb.append("\n}");
+ px2 = ",\n";
+ }
- if (path.equals("/") || path.equals("/network/")) {
- String pfx = "\n";
- sb.append(px2);
- sb.append("\"routing\": [");
- for (NetworkRoute ne : NetworkRoute.getAllNetworkRoutes()) {
- sb.append(pfx);
- sb.append(ne.asJSONObject().toString());
- pfx = ",\n";
- }
- sb.append("\n]");
- }
- sb.append("}\n");
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType("application/json");
- resp.getOutputStream().print(sb.toString());
- }
- /**
- * PUT on &lt;/internal/route/*&gt; -- not supported.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- }
- /**
- * POST - modify existing route table entries in the route table tree specified by the URL path.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- EventLogRecord elr = new EventLogRecord(req);
- if (!isAuthorizedForInternal(req)) {
- elr.setMessage("Unauthorized.");
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
- return;
- }
- if (isProxyOK(req) && isProxyServer()) {
- super.doPost(req, resp);
- return;
- }
- String path = req.getPathInfo();
- Insertable[] ins = null;
- if (path.startsWith("/ingress/")) {
- // /internal/route/ingress/?feed=%s&amp;user=%s&amp;subnet=%s&amp;nodepatt=%s
- try {
- // Although it probably doesn't make sense, you can install two identical routes in the IRT
- int feedid = Integer.parseInt(req.getParameter("feed"));
- String user = req.getParameter("user");
- if (user == null)
- user = "-";
- String subnet = req.getParameter("subnet");
- if (subnet == null)
- subnet = "-";
- String nodepatt = req.getParameter("nodepatt");
- String t = req.getParameter("seq");
- int seq = (t != null) ? Integer.parseInt(t) : (IngressRoute.getMaxSequence() + 100);
- ins = new Insertable[] { new IngressRoute(seq, feedid, user, subnet, NodeClass.lookupNodeNames(nodepatt)) };
- } catch (Exception e) {
- intlogger.info(e);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add ingress' command.");
- return;
- }
- } else if (path.startsWith("/egress/")) {
- // /internal/route/egress/?sub=%s&amp;node=%s
- try {
- int subid = Integer.parseInt(req.getParameter("sub"));
- EgressRoute er = EgressRoute.getEgressRoute(subid);
- if (er != null) {
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "An egress route already exists for that subscriber.");
- return;
- }
- String node = NodeClass.normalizeNodename(req.getParameter("node"));
- ins = new Insertable[] { new EgressRoute(subid, node) };
- } catch (Exception e) {
- intlogger.info(e);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add egress' command.");
- return;
- }
- } else if (path.startsWith("/network/")) {
- // /internal/route/network/?from=%s&amp;to=%s&amp;via=%s
- try {
- String nfrom = req.getParameter("from");
- String nto = req.getParameter("to");
- String nvia = req.getParameter("via");
- if (nfrom == null || nto == null || nvia == null) {
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing arguments in 'add network' command.");
- return;
- }
- nfrom = NodeClass.normalizeNodename(nfrom);
- nto = NodeClass.normalizeNodename(nto);
- nvia = NodeClass.normalizeNodename(nvia);
- NetworkRoute nr = new NetworkRoute(nfrom, nto, nvia);
- for (NetworkRoute route : NetworkRoute.getAllNetworkRoutes()) {
- if (route.getFromnode() == nr.getFromnode() && route.getTonode() == nr.getTonode()) {
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Network route table already contains a route for "+nfrom+" and "+nto);
- return;
- }
- }
- ins = new Insertable[] { nr };
- } catch (IllegalArgumentException e) {
- intlogger.info(e);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add network' command.");
- return;
- }
- }
- if (ins == null) {
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
- return;
- }
- boolean rv = true;
- for (Insertable dd : ins) {
- rv &= doInsert(dd);
- }
- if (rv) {
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- provisioningDataChanged();
- provisioningParametersChanged();
- } else {
- // Something went wrong with the INSERT
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
+ if (path.equals("/") || path.equals("/network/")) {
+ String pfx = "\n";
+ sb.append(px2);
+ sb.append("\"routing\": [");
+ for (NetworkRoute ne : NetworkRoute.getAllNetworkRoutes()) {
+ sb.append(pfx);
+ sb.append(ne.asJSONObject().toString());
+ pfx = ",\n";
+ }
+ sb.append("\n]");
+ }
+ sb.append("}\n");
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType("application/json");
+ resp.getOutputStream().print(sb.toString());
+ }
+ /**
+ * PUT on &lt;/internal/route/*&gt; -- not supported.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ }
+ /**
+ * POST - modify existing route table entries in the route table tree specified by the URL path.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ EventLogRecord elr = new EventLogRecord(req);
+ if (!isAuthorizedForInternal(req)) {
+ elr.setMessage("Unauthorized.");
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, "Unauthorized.");
+ return;
+ }
+ if (isProxyOK(req) && isProxyServer()) {
+ super.doPost(req, resp);
+ return;
+ }
+ String path = req.getPathInfo();
+ Insertable[] ins = null;
+ if (path.startsWith("/ingress/")) {
+ // /internal/route/ingress/?feed=%s&amp;user=%s&amp;subnet=%s&amp;nodepatt=%s
+ try {
+ // Although it probably doesn't make sense, you can install two identical routes in the IRT
+ int feedid = Integer.parseInt(req.getParameter("feed"));
+ String user = req.getParameter("user");
+ if (user == null)
+ user = "-";
+ String subnet = req.getParameter("subnet");
+ if (subnet == null)
+ subnet = "-";
+ String nodepatt = req.getParameter("nodepatt");
+ String t = req.getParameter("seq");
+ int seq = (t != null) ? Integer.parseInt(t) : (IngressRoute.getMaxSequence() + 100);
+ ins = new Insertable[] { new IngressRoute(seq, feedid, user, subnet, NodeClass.lookupNodeNames(nodepatt)) };
+ } catch (Exception e) {
+ intlogger.info(e);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add ingress' command.");
+ return;
+ }
+ } else if (path.startsWith("/egress/")) {
+ // /internal/route/egress/?sub=%s&amp;node=%s
+ try {
+ int subid = Integer.parseInt(req.getParameter("sub"));
+ EgressRoute er = EgressRoute.getEgressRoute(subid);
+ if (er != null) {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "An egress route already exists for that subscriber.");
+ return;
+ }
+ String node = NodeClass.normalizeNodename(req.getParameter("node"));
+ ins = new Insertable[] { new EgressRoute(subid, node) };
+ } catch (Exception e) {
+ intlogger.info(e);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add egress' command.");
+ return;
+ }
+ } else if (path.startsWith("/network/")) {
+ // /internal/route/network/?from=%s&amp;to=%s&amp;via=%s
+ try {
+ String nfrom = req.getParameter("from");
+ String nto = req.getParameter("to");
+ String nvia = req.getParameter("via");
+ if (nfrom == null || nto == null || nvia == null) {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing arguments in 'add network' command.");
+ return;
+ }
+ nfrom = NodeClass.normalizeNodename(nfrom);
+ nto = NodeClass.normalizeNodename(nto);
+ nvia = NodeClass.normalizeNodename(nvia);
+ NetworkRoute nr = new NetworkRoute(nfrom, nto, nvia);
+ for (NetworkRoute route : NetworkRoute.getAllNetworkRoutes()) {
+ if (route.getFromnode() == nr.getFromnode() && route.getTonode() == nr.getTonode()) {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Network route table already contains a route for "+nfrom+" and "+nto);
+ return;
+ }
+ }
+ ins = new Insertable[] { nr };
+ } catch (IllegalArgumentException e) {
+ intlogger.info(e);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments in 'add network' command.");
+ return;
+ }
+ }
+ if (ins == null) {
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, "Bad URL.");
+ return;
+ }
+ boolean rv = true;
+ for (Insertable dd : ins) {
+ rv &= doInsert(dd);
+ }
+ if (rv) {
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ provisioningDataChanged();
+ provisioningParametersChanged();
+ } else {
+ // Something went wrong with the INSERT
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/StatisticsServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/StatisticsServlet.java
index b7030504..886a136f 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/StatisticsServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/StatisticsServlet.java
@@ -7,9 +7,9 @@
* * 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.
@@ -46,543 +46,543 @@ import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;
/**
* This Servlet handles requests to the &lt;Statistics API&gt; and &lt;Statistics consilidated resultset&gt;,
- * @author Manish Singh
+ * @author Manish Singh
* @version $Id: StatisticsServlet.java,v 1.11 2016/08/10 17:27:02 Manish Exp $
*/
@SuppressWarnings("serial")
public class StatisticsServlet extends BaseServlet {
- private static final long TWENTYFOUR_HOURS = (24 * 60 * 60 * 1000L);
- private static final String fmt1 = "yyyy-MM-dd'T'HH:mm:ss'Z'";
- private static final String fmt2 = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
-
-
- /**
- * DELETE a logging URL -- not supported.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- String message = "DELETE not allowed for the logURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * GET a Statistics URL -- retrieve Statistics data for a feed or subscription.
- * See the <b>Statistics API</b> document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
-
- Map<String, String> map = buildMapFromRequest(req);
- if (map.get("err") != null) {
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments: "+map.get("err"));
- return;
- }
- // check Accept: header??
-
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(LOGLIST_CONTENT_TYPE);
- ServletOutputStream out = resp.getOutputStream();
-
-
- String outputType = "json";
- String feedids = null;
-
- if(req.getParameter("feedid") ==null && req.getParameter("groupid") ==null)
- {
- out.print("Invalid request, Feedid or Group ID is required.");
- }
-
- if(req.getParameter("feedid")!=null && req.getParameter("groupid") == null) {
- map.put("feedids", req.getParameter("feedid").replace("|", ",").toString());
- }
-
- if(req.getParameter("groupid") != null && req.getParameter("feedid") ==null) {
- // String groupid1 = null;
- StringBuffer groupid1 = new StringBuffer();
-
- try {
- System.out.println("feeedidsssssssss");
- groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter("groupid")));
- System.out.println("feeedids"+req.getParameter("groupid"));
-
- map.put("feedids", groupid1.toString());
- System.out.println("groupid1" +groupid1.toString());
-
-
- } catch (NumberFormatException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- if(req.getParameter("groupid") != null && req.getParameter("feedid") !=null) {
- StringBuffer groupid1 = new StringBuffer();
-
-
- try {
- System.out.println("both r not null");
- groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter("groupid")));
- System.out.println("feeedids"+req.getParameter("groupid"));
- groupid1.append(",");
- groupid1.append(req.getParameter("feedid").replace("|", ",").toString());
-
- map.put("feedids", groupid1.toString());
-
-
- System.out.println("groupid1" +groupid1.toString());
-
-
- } catch (NumberFormatException e) {
- e.printStackTrace();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
-
-
- if(req.getParameter("subid")!=null && req.getParameter("feedid") !=null) {
- StringBuffer subidstr = new StringBuffer();
-// subidstr.append(" and e.DELIVERY_SUBID in(subid)");
-// subidstr.append(req.getParameter("subid").replace("|", ",").toString());
- subidstr.append("and e.DELIVERY_SUBID in(");
-
- subidstr.append(req.getParameter("subid").replace("|", ",").toString());
- subidstr.append(")");
- map.put("subid", subidstr.toString());
- }
- if(req.getParameter("subid")!=null && req.getParameter("groupid") !=null) {
- StringBuffer subidstr = new StringBuffer();
-// subidstr.append(" and e.DELIVERY_SUBID in(subid)");
-// subidstr.append(req.getParameter("subid").replace("|", ",").toString());
- subidstr.append("and e.DELIVERY_SUBID in(");
-
- subidstr.append(req.getParameter("subid").replace("|", ",").toString());
- subidstr.append(")");
- map.put("subid", subidstr.toString());
- }
- if(req.getParameter("type")!=null) {
- map.put("eventType", req.getParameter("type").replace("|", ",").toString());
- }
- if(req.getParameter("output_type")!=null) {
- map.put("output_type", req.getParameter("output_type").toString());
- }
- if(req.getParameter("start_time")!=null) {
- map.put("start_time", req.getParameter("start_time").toString());
- }
- if(req.getParameter("end_time")!=null) {
- map.put("end_time", req.getParameter("end_time").toString());
- }
-
- if(req.getParameter("time")!=null) {
- map.put("start_time", req.getParameter("time").toString());
- map.put("end_time", null);
- }
-
-
-
- if(req.getParameter("output_type") !=null)
- {
- outputType = req.getParameter("output_type");
- }
-
-
- try {
-
- String filterQuery = this.queryGeneretor(map);
- eventlogger.debug("SQL Query for Statistics resultset. "+filterQuery);
-
- ResultSet rs=this.getRecordsForSQL(filterQuery);
-
- if(outputType.equals("csv")) {
- resp.setContentType("application/octet-stream");
- Date date = new Date() ;
- SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-YYYY HH:mm:ss") ;
- resp.setHeader("Content-Disposition", "attachment; filename=\"result:"+dateFormat.format(date)+".csv\"");
- eventlogger.info("Generating CSV file from Statistics resultset");
-
- rsToCSV(rs, out);
- }
- else {
- eventlogger.info("Generating JSON for Statistics resultset");
- this.rsToJson(rs, out);
- }
- }
- catch (IOException e) {
- eventlogger.error("IOException - Generating JSON/CSV:"+e);
- e.printStackTrace();
- }
- catch (JSONException e) {
- eventlogger.error("JSONException - executing SQL query:"+e);
- e.printStackTrace();
- } catch (SQLException e) {
- eventlogger.error("SQLException - executing SQL query:"+e);
- e.printStackTrace();
- } catch (ParseException e) {
- eventlogger.error("ParseException - executing SQL query:"+e);
- e.printStackTrace();
- }
- }
-
-
- /**
- * rsToJson - Converting RS to JSON object
- * @exception IOException, SQLException
- * @param out ServletOutputStream, rs as ResultSet
- */
- public void rsToCSV(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {
- String header = "FEEDNAME,FEEDID,FILES_PUBLISHED,PUBLISH_LENGTH, FILES_DELIVERED, DELIVERED_LENGTH, SUBSCRIBER_URL, SUBID, PUBLISH_TIME,DELIVERY_TIME, AverageDelay\n";
-
- // String header = "FEEDNAME,FEEDID,TYPE,REMOTE_ADDR,DELIVERY_SUBID,REQURI,TOTAL CONTENT LENGTH,NO OF FILE,AVERAGE DELAY\n";
-
+ private static final long TWENTYFOUR_HOURS = (24 * 60 * 60 * 1000L);
+ private static final String fmt1 = "yyyy-MM-dd'T'HH:mm:ss'Z'";
+ private static final String fmt2 = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
+
+
+ /**
+ * DELETE a logging URL -- not supported.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ String message = "DELETE not allowed for the logURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * GET a Statistics URL -- retrieve Statistics data for a feed or subscription.
+ * See the <b>Statistics API</b> document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+
+ Map<String, String> map = buildMapFromRequest(req);
+ if (map.get("err") != null) {
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid arguments: "+map.get("err"));
+ return;
+ }
+ // check Accept: header??
+
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(LOGLIST_CONTENT_TYPE);
+ ServletOutputStream out = resp.getOutputStream();
+
+
+ String outputType = "json";
+ String feedids = null;
+
+ if(req.getParameter("feedid") ==null && req.getParameter("groupid") ==null)
+ {
+ out.print("Invalid request, Feedid or Group ID is required.");
+ }
+
+ if(req.getParameter("feedid")!=null && req.getParameter("groupid") == null) {
+ map.put("feedids", req.getParameter("feedid").replace("|", ",").toString());
+ }
+
+ if(req.getParameter("groupid") != null && req.getParameter("feedid") ==null) {
+ // String groupid1 = null;
+ StringBuffer groupid1 = new StringBuffer();
+
+ try {
+ System.out.println("feeedidsssssssss");
+ groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter("groupid")));
+ System.out.println("feeedids"+req.getParameter("groupid"));
+
+ map.put("feedids", groupid1.toString());
+ System.out.println("groupid1" +groupid1.toString());
+
+
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ if(req.getParameter("groupid") != null && req.getParameter("feedid") !=null) {
+ StringBuffer groupid1 = new StringBuffer();
+
+
+ try {
+ System.out.println("both r not null");
+ groupid1 = this.getFeedIdsByGroupId(Integer.parseInt(req.getParameter("groupid")));
+ System.out.println("feeedids"+req.getParameter("groupid"));
+ groupid1.append(",");
+ groupid1.append(req.getParameter("feedid").replace("|", ",").toString());
+
+ map.put("feedids", groupid1.toString());
+
+
+ System.out.println("groupid1" +groupid1.toString());
+
+
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+
+ if(req.getParameter("subid")!=null && req.getParameter("feedid") !=null) {
+ StringBuffer subidstr = new StringBuffer();
+// subidstr.append(" and e.DELIVERY_SUBID in(subid)");
+// subidstr.append(req.getParameter("subid").replace("|", ",").toString());
+ subidstr.append("and e.DELIVERY_SUBID in(");
+
+ subidstr.append(req.getParameter("subid").replace("|", ",").toString());
+ subidstr.append(")");
+ map.put("subid", subidstr.toString());
+ }
+ if(req.getParameter("subid")!=null && req.getParameter("groupid") !=null) {
+ StringBuffer subidstr = new StringBuffer();
+// subidstr.append(" and e.DELIVERY_SUBID in(subid)");
+// subidstr.append(req.getParameter("subid").replace("|", ",").toString());
+ subidstr.append("and e.DELIVERY_SUBID in(");
+
+ subidstr.append(req.getParameter("subid").replace("|", ",").toString());
+ subidstr.append(")");
+ map.put("subid", subidstr.toString());
+ }
+ if(req.getParameter("type")!=null) {
+ map.put("eventType", req.getParameter("type").replace("|", ",").toString());
+ }
+ if(req.getParameter("output_type")!=null) {
+ map.put("output_type", req.getParameter("output_type").toString());
+ }
+ if(req.getParameter("start_time")!=null) {
+ map.put("start_time", req.getParameter("start_time").toString());
+ }
+ if(req.getParameter("end_time")!=null) {
+ map.put("end_time", req.getParameter("end_time").toString());
+ }
+
+ if(req.getParameter("time")!=null) {
+ map.put("start_time", req.getParameter("time").toString());
+ map.put("end_time", null);
+ }
+
+
+
+ if(req.getParameter("output_type") !=null)
+ {
+ outputType = req.getParameter("output_type");
+ }
+
+
+ try {
+
+ String filterQuery = this.queryGeneretor(map);
+ eventlogger.debug("SQL Query for Statistics resultset. "+filterQuery);
+
+ ResultSet rs=this.getRecordsForSQL(filterQuery);
+
+ if(outputType.equals("csv")) {
+ resp.setContentType("application/octet-stream");
+ Date date = new Date() ;
+ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-YYYY HH:mm:ss") ;
+ resp.setHeader("Content-Disposition", "attachment; filename=\"result:"+dateFormat.format(date)+".csv\"");
+ eventlogger.info("Generating CSV file from Statistics resultset");
+
+ rsToCSV(rs, out);
+ }
+ else {
+ eventlogger.info("Generating JSON for Statistics resultset");
+ this.rsToJson(rs, out);
+ }
+ }
+ catch (IOException e) {
+ eventlogger.error("IOException - Generating JSON/CSV:"+e);
+ e.printStackTrace();
+ }
+ catch (JSONException e) {
+ eventlogger.error("JSONException - executing SQL query:"+e);
+ e.printStackTrace();
+ } catch (SQLException e) {
+ eventlogger.error("SQLException - executing SQL query:"+e);
+ e.printStackTrace();
+ } catch (ParseException e) {
+ eventlogger.error("ParseException - executing SQL query:"+e);
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * rsToJson - Converting RS to JSON object
+ * @exception IOException, SQLException
+ * @param out ServletOutputStream, rs as ResultSet
+ */
+ public void rsToCSV(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {
+ String header = "FEEDNAME,FEEDID,FILES_PUBLISHED,PUBLISH_LENGTH, FILES_DELIVERED, DELIVERED_LENGTH, SUBSCRIBER_URL, SUBID, PUBLISH_TIME,DELIVERY_TIME, AverageDelay\n";
+
+ // String header = "FEEDNAME,FEEDID,TYPE,REMOTE_ADDR,DELIVERY_SUBID,REQURI,TOTAL CONTENT LENGTH,NO OF FILE,AVERAGE DELAY\n";
+
out.write(header.getBytes());
-
+
while(rs.next()) {
- StringBuffer line = new StringBuffer();
- line.append(rs.getString("FEEDNAME"));
- line.append(",");
- line.append(rs.getString("FEEDID"));
- line.append(",");
- line.append(rs.getString("FILES_PUBLISHED"));
- line.append(",");
- line.append(rs.getString("PUBLISH_LENGTH"));
- line.append(",");
- line.append(rs.getString("FILES_DELIVERED"));
- line.append(",");
- line.append(rs.getString("DELIVERED_LENGTH"));
- line.append(",");
- line.append(rs.getString("SUBSCRIBER_URL"));
- line.append(",");
- line.append(rs.getString("SUBID"));
- line.append(",");
- line.append(rs.getString("PUBLISH_TIME"));
- line.append(",");
- line.append(rs.getString("DELIVERY_TIME"));
- line.append(",");
- line.append(rs.getString("AverageDelay"));
- line.append(",");
-
- line.append("\n");
- out.write(line.toString().getBytes());
- out.flush();
+ StringBuffer line = new StringBuffer();
+ line.append(rs.getString("FEEDNAME"));
+ line.append(",");
+ line.append(rs.getString("FEEDID"));
+ line.append(",");
+ line.append(rs.getString("FILES_PUBLISHED"));
+ line.append(",");
+ line.append(rs.getString("PUBLISH_LENGTH"));
+ line.append(",");
+ line.append(rs.getString("FILES_DELIVERED"));
+ line.append(",");
+ line.append(rs.getString("DELIVERED_LENGTH"));
+ line.append(",");
+ line.append(rs.getString("SUBSCRIBER_URL"));
+ line.append(",");
+ line.append(rs.getString("SUBID"));
+ line.append(",");
+ line.append(rs.getString("PUBLISH_TIME"));
+ line.append(",");
+ line.append(rs.getString("DELIVERY_TIME"));
+ line.append(",");
+ line.append(rs.getString("AverageDelay"));
+ line.append(",");
+
+ line.append("\n");
+ out.write(line.toString().getBytes());
+ out.flush();
}
- }
-
- /**
- * rsToJson - Converting RS to JSON object
- * @exception IOException, SQLException
- * @param out ServletOutputStream, rs as ResultSet
- */
- public void rsToJson(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {
-
- String fields[] = {"FEEDNAME","FEEDID","FILES_PUBLISHED","PUBLISH_LENGTH", "FILES_DELIVERED", "DELIVERED_LENGTH", "SUBSCRIBER_URL", "SUBID", "PUBLISH_TIME","DELIVERY_TIME", "AverageDelay"};
- StringBuffer line = new StringBuffer();
-
- line.append("[\n");
-
- while(rs.next()) {
- LOGJSONObject j2 = new LOGJSONObject();
- for (String key : fields) {
- Object v = rs.getString(key);
- if (v != null)
- j2.put(key.toLowerCase(), v);
- else
- j2.put(key.toLowerCase(), "");
- }
- line = line.append(j2.toString());;
- line.append(",\n");
- }
- line.append("]");
- out.print(line.toString());
- }
-
- /**
- * getFeedIdsByGroupId - Getting FEEDID's by GROUP ID.
- * @exception SQL Query SQLException.
- * @param groupIds
- */
- public StringBuffer getFeedIdsByGroupId(int groupIds) throws SQLException{
-
- DB db = null;
- Connection conn = null;
- PreparedStatement prepareStatement = null;
- ResultSet resultSet=null;
- String sqlGoupid = null;
- StringBuffer feedIds = new StringBuffer();
-
- try {
- db = new DB();
- conn = db.getConnection();
- sqlGoupid= " SELECT FEEDID from FEEDS WHERE GROUPID = ?";
- prepareStatement =conn.prepareStatement(sqlGoupid);
- prepareStatement.setInt(1, groupIds);
- resultSet=prepareStatement.executeQuery();
- while(resultSet.next()){
- feedIds.append(resultSet.getInt("FEEDID"));
- feedIds.append(",");
- }
- feedIds.deleteCharAt(feedIds.length()-1);
- System.out.println("feedIds"+feedIds.toString());
-
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- if(resultSet != null) {
- resultSet.close();
- resultSet = null;
- }
-
- if(prepareStatement != null) {
- prepareStatement.close();
- prepareStatement = null;
- }
-
- if(conn != null){
- db.release(conn);
- }
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- return feedIds;
- }
-
-
- /**
- * queryGeneretor - Generating sql query
- * @exception ParseException
- * @param map as key value pare of all user input fields
- */
- public String queryGeneretor(Map<String, String> map) throws ParseException{
-
- String sql = null;
- String eventType = null;
- String feedids = null;
- String start_time = null;
- String end_time = null;
- String subid=" ";
- if(map.get("eventType") != null){
- eventType=(String) map.get("eventType");
- }
- if(map.get("feedids") != null){
- feedids=(String) map.get("feedids");
- }
- if(map.get("start_time") != null){
- start_time=(String) map.get("start_time");
- }
- if(map.get("end_time") != null){
- end_time=(String) map.get("end_time");
- }
- if("all".equalsIgnoreCase(eventType)){
- eventType="PUB','DEL, EXP, PBF";
- }
- if(map.get("subid") != null){
- subid=(String) map.get("subid");
- }
-
- eventlogger.info("Generating sql query to get Statistics resultset. ");
-
- if(end_time==null && start_time==null ){
-
-
- sql="SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in("+feedids+") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED, sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME, AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("+feedids+") "+subid+" AND m.STATUS=204 AND e.RESULT=204 group by SUBID";
-
- return sql;
- }else if(start_time!=null && end_time==null ){
-
- long inputTimeInMilli=60000*Long.parseLong(start_time);
- Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
- long currentTimeInMilli=cal.getTimeInMillis();
- long compareTime=currentTimeInMilli-inputTimeInMilli;
-
- sql="SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in("+feedids+") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED, sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME, AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("+feedids+") "+subid+" AND m.STATUS=204 AND e.RESULT=204 and e.event_time>="+compareTime+" group by SUBID";
-
- return sql;
-
- }else{
- SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
- Date startDate=inFormat.parse(start_time);
- Date endDate=inFormat.parse(end_time);
-
- long startInMillis=startDate.getTime();
- long endInMillis=endDate.getTime();
-
- {
-
- sql="SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in("+feedids+") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED, sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME, AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("+feedids+") "+subid+" AND m.STATUS=204 AND e.RESULT=204 and e.event_time between "+startInMillis+" and "+endInMillis+" group by SUBID";
-
- }
- return sql;
- }
- }
-
-
- /**
- * PUT a Statistics URL -- not supported.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- String message = "PUT not allowed for the StatisticsURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * POST a Statistics URL -- not supported.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- String message = "POST not allowed for the StatisticsURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
-
- private Map<String, String> buildMapFromRequest(HttpServletRequest req) {
- Map<String, String> map = new HashMap<String, String>();
- String s = req.getParameter("type");
- if (s != null) {
- if (s.equals("pub") || s.equals("del") || s.equals("exp")) {
- map.put("type", s);
- } else {
- map.put("err", "bad type");
- return map;
- }
- } else
- map.put("type", "all");
- map.put("publishSQL", "");
- map.put("statusSQL", "");
- map.put("resultSQL", "");
- map.put("reasonSQL", "");
-
- s = req.getParameter("publishId");
- if (s != null) {
- if (s.indexOf("'") >= 0) {
- map.put("err", "bad publishId");
- return map;
- }
- map.put("publishSQL", " AND PUBLISH_ID = '"+s+"'");
- }
-
- s = req.getParameter("statusCode");
- if (s != null) {
- String sql = null;
- if (s.equals("success")) {
- sql = " AND STATUS >= 200 AND STATUS < 300";
- } else if (s.equals("redirect")) {
- sql = " AND STATUS >= 300 AND STATUS < 400";
- } else if (s.equals("failure")) {
- sql = " AND STATUS >= 400";
- } else {
- try {
- Integer n = Integer.parseInt(s);
- if ((n >= 100 && n < 600) || (n == -1))
- sql = " AND STATUS = " + n;
- } catch (NumberFormatException e) {
- }
- }
- if (sql == null) {
- map.put("err", "bad statusCode");
- return map;
- }
- map.put("statusSQL", sql);
- map.put("resultSQL", sql.replaceAll("STATUS", "RESULT"));
- }
-
- s = req.getParameter("expiryReason");
- if (s != null) {
- map.put("type", "exp");
- if (s.equals("notRetryable")) {
- map.put("reasonSQL", " AND REASON = 'notRetryable'");
- } else if (s.equals("retriesExhausted")) {
- map.put("reasonSQL", " AND REASON = 'retriesExhausted'");
- } else if (s.equals("diskFull")) {
- map.put("reasonSQL", " AND REASON = 'diskFull'");
- } else if (s.equals("other")) {
- map.put("reasonSQL", " AND REASON = 'other'");
- } else {
- map.put("err", "bad expiryReason");
- return map;
- }
- }
-
- long stime = getTimeFromParam(req.getParameter("start"));
- if (stime < 0) {
- map.put("err", "bad start");
- return map;
- }
- long etime = getTimeFromParam(req.getParameter("end"));
- if (etime < 0) {
- map.put("err", "bad end");
- return map;
- }
- if (stime == 0 && etime == 0) {
- etime = System.currentTimeMillis();
- stime = etime - TWENTYFOUR_HOURS;
- } else if (stime == 0) {
- stime = etime - TWENTYFOUR_HOURS;
- } else if (etime == 0) {
- etime = stime + TWENTYFOUR_HOURS;
- }
- map.put("timeSQL", String.format(" AND EVENT_TIME >= %d AND EVENT_TIME <= %d", stime, etime));
- return map;
- }
- private long getTimeFromParam(final String s) {
- if (s == null)
- return 0;
- try {
- // First, look for an RFC 3339 date
- String fmt = (s.indexOf('.') > 0) ? fmt2 : fmt1;
- SimpleDateFormat sdf = new SimpleDateFormat(fmt);
- Date d = sdf.parse(s);
- return d.getTime();
- } catch (ParseException e) {
- }
- try {
- // Also allow a long (in ms); useful for testing
- long n = Long.parseLong(s);
- return n;
- } catch (NumberFormatException e) {
- }
- intlogger.info("Error parsing time="+s);
- return -1;
- }
-
-
- private ResultSet getRecordsForSQL(String sql) {
- intlogger.debug(sql);
- long start = System.currentTimeMillis();
- DB db = new DB();
- Connection conn = null;
- ResultSet rs=null;
-
- try {
- conn = db.getConnection();
- Statement stmt = conn.createStatement();
- PreparedStatement pst=conn.prepareStatement(sql);
- rs=pst.executeQuery();
- //this.rsToJson(rs)
- //rs.close();
- stmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- if (conn != null)
- db.release(conn);
- }
-
- intlogger.debug("Time: " + (System.currentTimeMillis()-start) + " ms");
-
- return rs;
- }
+ }
+
+ /**
+ * rsToJson - Converting RS to JSON object
+ * @exception IOException, SQLException
+ * @param out ServletOutputStream, rs as ResultSet
+ */
+ public void rsToJson(ResultSet rs, ServletOutputStream out) throws IOException, SQLException {
+
+ String fields[] = {"FEEDNAME","FEEDID","FILES_PUBLISHED","PUBLISH_LENGTH", "FILES_DELIVERED", "DELIVERED_LENGTH", "SUBSCRIBER_URL", "SUBID", "PUBLISH_TIME","DELIVERY_TIME", "AverageDelay"};
+ StringBuffer line = new StringBuffer();
+
+ line.append("[\n");
+
+ while(rs.next()) {
+ LOGJSONObject j2 = new LOGJSONObject();
+ for (String key : fields) {
+ Object v = rs.getString(key);
+ if (v != null)
+ j2.put(key.toLowerCase(), v);
+ else
+ j2.put(key.toLowerCase(), "");
+ }
+ line = line.append(j2.toString());;
+ line.append(",\n");
+ }
+ line.append("]");
+ out.print(line.toString());
+ }
+
+ /**
+ * getFeedIdsByGroupId - Getting FEEDID's by GROUP ID.
+ * @exception SQL Query SQLException.
+ * @param groupIds
+ */
+ public StringBuffer getFeedIdsByGroupId(int groupIds) throws SQLException{
+
+ DB db = null;
+ Connection conn = null;
+ PreparedStatement prepareStatement = null;
+ ResultSet resultSet=null;
+ String sqlGoupid = null;
+ StringBuffer feedIds = new StringBuffer();
+
+ try {
+ db = new DB();
+ conn = db.getConnection();
+ sqlGoupid= " SELECT FEEDID from FEEDS WHERE GROUPID = ?";
+ prepareStatement =conn.prepareStatement(sqlGoupid);
+ prepareStatement.setInt(1, groupIds);
+ resultSet=prepareStatement.executeQuery();
+ while(resultSet.next()){
+ feedIds.append(resultSet.getInt("FEEDID"));
+ feedIds.append(",");
+ }
+ feedIds.deleteCharAt(feedIds.length()-1);
+ System.out.println("feedIds"+feedIds.toString());
+
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if(resultSet != null) {
+ resultSet.close();
+ resultSet = null;
+ }
+
+ if(prepareStatement != null) {
+ prepareStatement.close();
+ prepareStatement = null;
+ }
+
+ if(conn != null){
+ db.release(conn);
+ }
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+ return feedIds;
+ }
+
+
+ /**
+ * queryGeneretor - Generating sql query
+ * @exception ParseException
+ * @param map as key value pare of all user input fields
+ */
+ public String queryGeneretor(Map<String, String> map) throws ParseException{
+
+ String sql = null;
+ String eventType = null;
+ String feedids = null;
+ String start_time = null;
+ String end_time = null;
+ String subid=" ";
+ if(map.get("eventType") != null){
+ eventType=(String) map.get("eventType");
+ }
+ if(map.get("feedids") != null){
+ feedids=(String) map.get("feedids");
+ }
+ if(map.get("start_time") != null){
+ start_time=(String) map.get("start_time");
+ }
+ if(map.get("end_time") != null){
+ end_time=(String) map.get("end_time");
+ }
+ if("all".equalsIgnoreCase(eventType)){
+ eventType="PUB','DEL, EXP, PBF";
+ }
+ if(map.get("subid") != null){
+ subid=(String) map.get("subid");
+ }
+
+ eventlogger.info("Generating sql query to get Statistics resultset. ");
+
+ if(end_time==null && start_time==null ){
+
+
+ sql="SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in("+feedids+") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED, sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME, AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("+feedids+") "+subid+" AND m.STATUS=204 AND e.RESULT=204 group by SUBID";
+
+ return sql;
+ }else if(start_time!=null && end_time==null ){
+
+ long inputTimeInMilli=60000*Long.parseLong(start_time);
+ Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
+ long currentTimeInMilli=cal.getTimeInMillis();
+ long compareTime=currentTimeInMilli-inputTimeInMilli;
+
+ sql="SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in("+feedids+") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED, sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME, AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("+feedids+") "+subid+" AND m.STATUS=204 AND e.RESULT=204 and e.event_time>="+compareTime+" group by SUBID";
+
+ return sql;
+
+ }else{
+ SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+ Date startDate=inFormat.parse(start_time);
+ Date endDate=inFormat.parse(end_time);
+
+ long startInMillis=startDate.getTime();
+ long endInMillis=endDate.getTime();
+
+ {
+
+ sql="SELECT (SELECT NAME FROM FEEDS AS f WHERE f.FEEDID in("+feedids+") and f.FEEDID=e.FEEDID) AS FEEDNAME, e.FEEDID as FEEDID, (SELECT COUNT(*) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS FILES_PUBLISHED,(SELECT SUM(content_length) FROM LOG_RECORDS AS c WHERE c.FEEDID in("+feedids+") and c.FEEDID=e.FEEDID AND c.TYPE='PUB') AS PUBLISH_LENGTH, COUNT(e.EVENT_TIME) as FILES_DELIVERED, sum(m.content_length) as DELIVERED_LENGTH,SUBSTRING_INDEX(e.REQURI,'/',+3) as SUBSCRIBER_URL, e.DELIVERY_SUBID as SUBID, e.EVENT_TIME AS PUBLISH_TIME, m.EVENT_TIME AS DELIVERY_TIME, AVG(e.EVENT_TIME - m.EVENT_TIME)/1000 as AverageDelay FROM LOG_RECORDS e JOIN LOG_RECORDS m ON m.PUBLISH_ID = e.PUBLISH_ID AND e.FEEDID IN ("+feedids+") "+subid+" AND m.STATUS=204 AND e.RESULT=204 and e.event_time between "+startInMillis+" and "+endInMillis+" group by SUBID";
+
+ }
+ return sql;
+ }
+ }
+
+
+ /**
+ * PUT a Statistics URL -- not supported.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ String message = "PUT not allowed for the StatisticsURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * POST a Statistics URL -- not supported.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ String message = "POST not allowed for the StatisticsURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+
+ private Map<String, String> buildMapFromRequest(HttpServletRequest req) {
+ Map<String, String> map = new HashMap<String, String>();
+ String s = req.getParameter("type");
+ if (s != null) {
+ if (s.equals("pub") || s.equals("del") || s.equals("exp")) {
+ map.put("type", s);
+ } else {
+ map.put("err", "bad type");
+ return map;
+ }
+ } else
+ map.put("type", "all");
+ map.put("publishSQL", "");
+ map.put("statusSQL", "");
+ map.put("resultSQL", "");
+ map.put("reasonSQL", "");
+
+ s = req.getParameter("publishId");
+ if (s != null) {
+ if (s.indexOf("'") >= 0) {
+ map.put("err", "bad publishId");
+ return map;
+ }
+ map.put("publishSQL", " AND PUBLISH_ID = '"+s+"'");
+ }
+
+ s = req.getParameter("statusCode");
+ if (s != null) {
+ String sql = null;
+ if (s.equals("success")) {
+ sql = " AND STATUS >= 200 AND STATUS < 300";
+ } else if (s.equals("redirect")) {
+ sql = " AND STATUS >= 300 AND STATUS < 400";
+ } else if (s.equals("failure")) {
+ sql = " AND STATUS >= 400";
+ } else {
+ try {
+ Integer n = Integer.parseInt(s);
+ if ((n >= 100 && n < 600) || (n == -1))
+ sql = " AND STATUS = " + n;
+ } catch (NumberFormatException e) {
+ }
+ }
+ if (sql == null) {
+ map.put("err", "bad statusCode");
+ return map;
+ }
+ map.put("statusSQL", sql);
+ map.put("resultSQL", sql.replaceAll("STATUS", "RESULT"));
+ }
+
+ s = req.getParameter("expiryReason");
+ if (s != null) {
+ map.put("type", "exp");
+ if (s.equals("notRetryable")) {
+ map.put("reasonSQL", " AND REASON = 'notRetryable'");
+ } else if (s.equals("retriesExhausted")) {
+ map.put("reasonSQL", " AND REASON = 'retriesExhausted'");
+ } else if (s.equals("diskFull")) {
+ map.put("reasonSQL", " AND REASON = 'diskFull'");
+ } else if (s.equals("other")) {
+ map.put("reasonSQL", " AND REASON = 'other'");
+ } else {
+ map.put("err", "bad expiryReason");
+ return map;
+ }
+ }
+
+ long stime = getTimeFromParam(req.getParameter("start"));
+ if (stime < 0) {
+ map.put("err", "bad start");
+ return map;
+ }
+ long etime = getTimeFromParam(req.getParameter("end"));
+ if (etime < 0) {
+ map.put("err", "bad end");
+ return map;
+ }
+ if (stime == 0 && etime == 0) {
+ etime = System.currentTimeMillis();
+ stime = etime - TWENTYFOUR_HOURS;
+ } else if (stime == 0) {
+ stime = etime - TWENTYFOUR_HOURS;
+ } else if (etime == 0) {
+ etime = stime + TWENTYFOUR_HOURS;
+ }
+ map.put("timeSQL", String.format(" AND EVENT_TIME >= %d AND EVENT_TIME <= %d", stime, etime));
+ return map;
+ }
+ private long getTimeFromParam(final String s) {
+ if (s == null)
+ return 0;
+ try {
+ // First, look for an RFC 3339 date
+ String fmt = (s.indexOf('.') > 0) ? fmt2 : fmt1;
+ SimpleDateFormat sdf = new SimpleDateFormat(fmt);
+ Date d = sdf.parse(s);
+ return d.getTime();
+ } catch (ParseException e) {
+ }
+ try {
+ // Also allow a long (in ms); useful for testing
+ long n = Long.parseLong(s);
+ return n;
+ } catch (NumberFormatException e) {
+ }
+ intlogger.info("Error parsing time="+s);
+ return -1;
+ }
+
+
+ private ResultSet getRecordsForSQL(String sql) {
+ intlogger.debug(sql);
+ long start = System.currentTimeMillis();
+ DB db = new DB();
+ Connection conn = null;
+ ResultSet rs=null;
+
+ try {
+ conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ PreparedStatement pst=conn.prepareStatement(sql);
+ rs=pst.executeQuery();
+ //this.rsToJson(rs)
+ //rs.close();
+ stmt.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ if (conn != null)
+ db.release(conn);
+ }
+
+ intlogger.debug("Time: " + (System.currentTimeMillis()-start) + " ms");
+
+ return rs;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubLogServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubLogServlet.java
index 689efec0..da3b3b48 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubLogServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubLogServlet.java
@@ -7,9 +7,9 @@
* * 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.
@@ -33,7 +33,7 @@ package org.onap.dmaap.datarouter.provisioning;
*/
@SuppressWarnings("serial")
public class SubLogServlet extends LogServlet {
- public SubLogServlet() {
- super(false);
- }
+ public SubLogServlet() {
+ super(false);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscribeServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscribeServlet.java
index 71967803..3ad22427 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscribeServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscribeServlet.java
@@ -1,288 +1,288 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.IOException;
-import java.io.InvalidObjectException;
-import java.util.Collection;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.json.JSONObject;
-import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
-import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
-import org.onap.dmaap.datarouter.provisioning.beans.Feed;
-import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
-import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
-import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-/**
- * This servlet handles provisioning for the &lt;subscribeURL&gt; which is generated by the provisioning
- * server to handle the creation and inspection of subscriptions to a specific feed.
- *
- * @author Robert Eby
- * @version $Id$
- */
-@SuppressWarnings("serial")
-public class SubscribeServlet extends ProxyServlet {
-
- //Adding EELF Logger Rally:US664892
- private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.SubscribeServlet");
-
- /**
- * DELETE on the &lt;subscribeUrl&gt; -- not supported.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- String message = "DELETE not allowed for the subscribeURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * GET on the &lt;subscribeUrl&gt; -- get the list of subscriptions to a feed.
- * See the <i>Subscription Collection Query</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doGet(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int feedid = getIdFromPath(req);
- if (feedid < 0) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Feed feed = Feed.getFeedById(feedid);
- if (feed == null || feed.isDeleted()) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
-
- // Display a list of URLs
- Collection<String> list = Subscription.getSubscriptionUrlList(feedid);
- String t = JSONUtilities.createJSONArray(list);
-
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(SUBLIST_CONTENT_TYPE);
- resp.getOutputStream().print(t);
- }
- /**
- * PUT on the &lt;subscribeUrl&gt; -- not supported.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- String message = "PUT not allowed for the subscribeURL.";
- EventLogRecord elr = new EventLogRecord(req);
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- }
- /**
- * POST on the &lt;subscribeUrl&gt; -- create a new subscription to a feed.
- * See the <i>Creating a Subscription</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPost");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doPost(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int feedid = getIdFromPath(req);
- if (feedid < 0) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Feed feed = Feed.getFeedById(feedid);
- if (feed == null || feed.isDeleted()) {
- message = "Missing or bad feed number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
-
- // check content type is SUB_CONTENT_TYPE, version 1.0
- ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(SUB_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
- intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }
- JSONObject jo = getJSONfromInput(req);
- if (jo == null) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (intlogger.isDebugEnabled())
- intlogger.debug(jo.toString());
- if (++active_subs > max_subs) {
- active_subs--;
- message = "Cannot create subscription; the maximum number of subscriptions has been configured.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_CONFLICT);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_CONFLICT, message);
- return;
- }
- Subscription sub = null;
- try {
- sub = new Subscription(jo);
- } catch (InvalidObjectException e) {
- active_subs--;
- message = e.getMessage();
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- sub.setFeedid(feedid);
- sub.setSubscriber(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
-
- // Check if this subscription already exists; not an error (yet), just warn
- Subscription sub2 = Subscription.getSubscriptionMatching(sub);
- if (sub2 != null)
- intlogger.warn("PROV0011 Creating a duplicate subscription: new subid="+sub.getSubid()+", old subid="+sub2.getSubid());
-
- // Create SUBSCRIPTIONS table entries
- if (doInsert(sub)) {
- // send response
- elr.setResult(HttpServletResponse.SC_CREATED);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_CREATED);
- resp.setContentType(SUBFULL_CONTENT_TYPE);
- resp.setHeader("Location", sub.getLinks().getSelf());
- resp.getOutputStream().print(sub.asLimitedJSONObject().toString());
-
- provisioningDataChanged();
- } else {
- // Something went wrong with the INSERT
- active_subs--;
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.IOException;
+import java.io.InvalidObjectException;
+import java.util.Collection;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.onap.dmaap.datarouter.authz.AuthorizationResponse;
+import org.onap.dmaap.datarouter.provisioning.beans.EventLogRecord;
+import org.onap.dmaap.datarouter.provisioning.beans.Feed;
+import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
+import org.onap.dmaap.datarouter.provisioning.eelf.EelfMsgs;
+import org.onap.dmaap.datarouter.provisioning.utils.JSONUtilities;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+
+/**
+ * This servlet handles provisioning for the &lt;subscribeURL&gt; which is generated by the provisioning
+ * server to handle the creation and inspection of subscriptions to a specific feed.
+ *
+ * @author Robert Eby
+ * @version $Id$
+ */
+@SuppressWarnings("serial")
+public class SubscribeServlet extends ProxyServlet {
+
+ //Adding EELF Logger Rally:US664892
+ private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.SubscribeServlet");
+
+ /**
+ * DELETE on the &lt;subscribeUrl&gt; -- not supported.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ String message = "DELETE not allowed for the subscribeURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * GET on the &lt;subscribeUrl&gt; -- get the list of subscriptions to a feed.
+ * See the <i>Subscription Collection Query</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doGet(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int feedid = getIdFromPath(req);
+ if (feedid < 0) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Feed feed = Feed.getFeedById(feedid);
+ if (feed == null || feed.isDeleted()) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+
+ // Display a list of URLs
+ Collection<String> list = Subscription.getSubscriptionUrlList(feedid);
+ String t = JSONUtilities.createJSONArray(list);
+
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(SUBLIST_CONTENT_TYPE);
+ resp.getOutputStream().print(t);
+ }
+ /**
+ * PUT on the &lt;subscribeUrl&gt; -- not supported.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ String message = "PUT not allowed for the subscribeURL.";
+ EventLogRecord elr = new EventLogRecord(req);
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+ }
+ /**
+ * POST on the &lt;subscribeUrl&gt; -- create a new subscription to a feed.
+ * See the <i>Creating a Subscription</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPost");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doPost(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int feedid = getIdFromPath(req);
+ if (feedid < 0) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Feed feed = Feed.getFeedById(feedid);
+ if (feed == null || feed.isDeleted()) {
+ message = "Missing or bad feed number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+
+ // check content type is SUB_CONTENT_TYPE, version 1.0
+ ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(SUB_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
+ intlogger.debug("Content-type is: "+req.getHeader("Content-Type"));
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }
+ JSONObject jo = getJSONfromInput(req);
+ if (jo == null) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (intlogger.isDebugEnabled())
+ intlogger.debug(jo.toString());
+ if (++active_subs > max_subs) {
+ active_subs--;
+ message = "Cannot create subscription; the maximum number of subscriptions has been configured.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_CONFLICT);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_CONFLICT, message);
+ return;
+ }
+ Subscription sub = null;
+ try {
+ sub = new Subscription(jo);
+ } catch (InvalidObjectException e) {
+ active_subs--;
+ message = e.getMessage();
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ sub.setFeedid(feedid);
+ sub.setSubscriber(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
+
+ // Check if this subscription already exists; not an error (yet), just warn
+ Subscription sub2 = Subscription.getSubscriptionMatching(sub);
+ if (sub2 != null)
+ intlogger.warn("PROV0011 Creating a duplicate subscription: new subid="+sub.getSubid()+", old subid="+sub2.getSubid());
+
+ // Create SUBSCRIPTIONS table entries
+ if (doInsert(sub)) {
+ // send response
+ elr.setResult(HttpServletResponse.SC_CREATED);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_CREATED);
+ resp.setContentType(SUBFULL_CONTENT_TYPE);
+ resp.setHeader("Location", sub.getLinks().getSelf());
+ resp.getOutputStream().print(sub.asLimitedJSONObject().toString());
+
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the INSERT
+ active_subs--;
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServlet.java
index bbb1c6ba..8e49e304 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SubscriptionServlet.java
@@ -7,9 +7,9 @@
* * 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.
@@ -56,421 +56,421 @@ import com.att.eelf.configuration.EELFManager;
*/
@SuppressWarnings("serial")
public class SubscriptionServlet extends ProxyServlet {
- public static final String SUBCNTRL_CONTENT_TYPE = "application/vnd.att-dr.subscription-control";
- //Adding EELF Logger Rally:US664892
+ public static final String SUBCNTRL_CONTENT_TYPE = "application/vnd.att-dr.subscription-control";
+ //Adding EELF Logger Rally:US664892
private static EELFLogger eelflogger = EELFManager.getInstance().getLogger("org.onap.dmaap.datarouter.provisioning.SubscriptionServlet");
- /**
- * DELETE on the &lt;subscriptionUrl&gt; -- delete a subscription.
- * See the <i>Deleting a Subscription</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doDelete");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doDelete(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int subid = getIdFromPath(req);
- if (subid < 0) {
- message = "Missing or bad subscription number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Subscription sub = Subscription.getSubscriptionById(subid);
- if (sub == null) {
- message = "Missing or bad subscription number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
+ /**
+ * DELETE on the &lt;subscriptionUrl&gt; -- delete a subscription.
+ * See the <i>Deleting a Subscription</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doDelete");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doDelete(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int subid = getIdFromPath(req);
+ if (subid < 0) {
+ message = "Missing or bad subscription number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Subscription sub = Subscription.getSubscriptionById(subid);
+ if (sub == null) {
+ message = "Missing or bad subscription number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
- // Delete Subscription
- if (doDelete(sub)) {
- active_subs--;
- // send response
- elr.setResult(HttpServletResponse.SC_NO_CONTENT);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
- provisioningDataChanged();
- } else {
- // Something went wrong with the DELETE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
- /**
- * GET on the &lt;subscriptionUrl&gt; -- get information about a subscription.
- * See the <i>Retreiving Information about a Subscription</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doGet");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doGet(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int subid = getIdFromPath(req);
- if (subid < 0) {
- message = "Missing or bad subscription number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Subscription sub = Subscription.getSubscriptionById(subid);
- if (sub == null) {
- message = "Missing or bad subscription number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
+ // Delete Subscription
+ if (doDelete(sub)) {
+ active_subs--;
+ // send response
+ elr.setResult(HttpServletResponse.SC_NO_CONTENT);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the DELETE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+ /**
+ * GET on the &lt;subscriptionUrl&gt; -- get information about a subscription.
+ * See the <i>Retreiving Information about a Subscription</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doGet");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doGet(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int subid = getIdFromPath(req);
+ if (subid < 0) {
+ message = "Missing or bad subscription number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Subscription sub = Subscription.getSubscriptionById(subid);
+ if (sub == null) {
+ message = "Missing or bad subscription number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(SUBFULL_CONTENT_TYPE);
- resp.getOutputStream().print(sub.asJSONObject(true).toString());
- }
- /**
- * PUT on the &lt;subscriptionUrl&gt; -- modify a subscription.
- * See the <i>Modifying a Subscription</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
- setIpAndFqdnForEelf("doPut");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doPut(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- int subid = getIdFromPath(req);
- if (subid < 0) {
- message = "Missing or bad subscription number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- Subscription oldsub = Subscription.getSubscriptionById(subid);
- if (oldsub == null) {
- message = "Missing or bad subscription number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_NOT_FOUND);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- // check content type is SUB_CONTENT_TYPE, version 1.0
- ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(SUB_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }
- JSONObject jo = getJSONfromInput(req);
- if (jo == null) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- if (intlogger.isDebugEnabled())
- intlogger.debug(jo.toString());
- Subscription sub = null;
- try {
- sub = new Subscription(jo);
- } catch (InvalidObjectException e) {
- message = e.getMessage();
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- sub.setSubid(oldsub.getSubid());
- sub.setFeedid(oldsub.getFeedid());
- sub.setSubscriber(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(SUBFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(sub.asJSONObject(true).toString());
+ }
+ /**
+ * PUT on the &lt;subscriptionUrl&gt; -- modify a subscription.
+ * See the <i>Modifying a Subscription</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ setIpAndFqdnForEelf("doPut");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF_AND_SUBID, req.getHeader(BEHALF_HEADER),getIdFromPath(req)+"");
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doPut(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ int subid = getIdFromPath(req);
+ if (subid < 0) {
+ message = "Missing or bad subscription number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ Subscription oldsub = Subscription.getSubscriptionById(subid);
+ if (oldsub == null) {
+ message = "Missing or bad subscription number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_NOT_FOUND);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_NOT_FOUND, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ // check content type is SUB_CONTENT_TYPE, version 1.0
+ ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(SUB_BASECONTENT_TYPE) || !(ver.equals("1.0") || ver.equals("2.0"))) {
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }
+ JSONObject jo = getJSONfromInput(req);
+ if (jo == null) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ if (intlogger.isDebugEnabled())
+ intlogger.debug(jo.toString());
+ Subscription sub = null;
+ try {
+ sub = new Subscription(jo);
+ } catch (InvalidObjectException e) {
+ message = e.getMessage();
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ sub.setSubid(oldsub.getSubid());
+ sub.setFeedid(oldsub.getFeedid());
+ sub.setSubscriber(bhdr); // set from X-ATT-DR-ON-BEHALF-OF header
- String subjectgroup = (req.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")); //Adding for group feature:Rally US708115
- if (!oldsub.getSubscriber().equals(sub.getSubscriber()) && subjectgroup == null) {
- message = "This subscriber must be modified by the same subscriber that created it.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
+ String subjectgroup = (req.getHeader("X-ATT-DR-ON-BEHALF-OF-GROUP")); //Adding for group feature:Rally US708115
+ if (!oldsub.getSubscriber().equals(sub.getSubscriber()) && subjectgroup == null) {
+ message = "This subscriber must be modified by the same subscriber that created it.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
- // Update SUBSCRIPTIONS table entries
- if (doUpdate(sub)) {
- // send response
- elr.setResult(HttpServletResponse.SC_OK);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_OK);
- resp.setContentType(SUBFULL_CONTENT_TYPE);
- resp.getOutputStream().print(sub.asLimitedJSONObject().toString());
+ // Update SUBSCRIPTIONS table entries
+ if (doUpdate(sub)) {
+ // send response
+ elr.setResult(HttpServletResponse.SC_OK);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentType(SUBFULL_CONTENT_TYPE);
+ resp.getOutputStream().print(sub.asLimitedJSONObject().toString());
- /**Change Owner ship of Subscriber Adding for group feature:Rally US708115*/
- if (jo.has("changeowner") && subjectgroup != null) {
- Boolean changeowner = (Boolean) jo.get("changeowner");
- if (changeowner != null && changeowner.equals(true)) {
- sub.setSubscriber(req.getHeader(BEHALF_HEADER));
- sub.changeOwnerShip();
- }
- }
- /***End of change ownership*/
+ /**Change Owner ship of Subscriber Adding for group feature:Rally US708115*/
+ if (jo.has("changeowner") && subjectgroup != null) {
+ Boolean changeowner = (Boolean) jo.get("changeowner");
+ if (changeowner != null && changeowner.equals(true)) {
+ sub.setSubscriber(req.getHeader(BEHALF_HEADER));
+ sub.changeOwnerShip();
+ }
+ }
+ /***End of change ownership*/
- provisioningDataChanged();
- } else {
- // Something went wrong with the UPDATE
- elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
- }
- }
- /**
- * POST on the &lt;subscriptionUrl&gt; -- control a subscription.
- * See the <i>Resetting a Subscription's Retry Schedule</i> section in the <b>Provisioning API</b>
- * document for details on how this method should be invoked.
- */
- @Override
- public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+ provisioningDataChanged();
+ } else {
+ // Something went wrong with the UPDATE
+ elr.setResult(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, DB_PROBLEM_MSG);
+ }
+ }
+ /**
+ * POST on the &lt;subscriptionUrl&gt; -- control a subscription.
+ * See the <i>Resetting a Subscription's Retry Schedule</i> section in the <b>Provisioning API</b>
+ * document for details on how this method should be invoked.
+ */
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// OLD pre-3.0 code
-// String message = "POST not allowed for the subscriptionURL.";
-// EventLogRecord elr = new EventLogRecord(req);
-// elr.setMessage(message);
-// elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
-// eventlogger.info(elr);
-// resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
+// String message = "POST not allowed for the subscriptionURL.";
+// EventLogRecord elr = new EventLogRecord(req);
+// elr.setMessage(message);
+// elr.setResult(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+// eventlogger.info(elr);
+// resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, message);
- setIpAndFqdnForEelf("doPost");
- eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
- EventLogRecord elr = new EventLogRecord(req);
- String message = isAuthorizedForProvisioning(req);
- if (message != null) {
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- if (isProxyServer()) {
- super.doPost(req, resp);
- return;
- }
- String bhdr = req.getHeader(BEHALF_HEADER);
- if (bhdr == null) {
- message = "Missing "+BEHALF_HEADER+" header.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- final int subid = getIdFromPath(req);
- if (subid < 0 || Subscription.getSubscriptionById(subid) == null) {
- message = "Missing or bad subscription number.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- // check content type is SUBCNTRL_CONTENT_TYPE, version 1.0
- ContentHeader ch = getContentHeader(req);
- String ver = ch.getAttribute("version");
- if (!ch.getType().equals(SUBCNTRL_CONTENT_TYPE) || !ver.equals("1.0")) {
- message = "Incorrect content-type";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
- return;
- }
- // Check with the Authorizer
- AuthorizationResponse aresp = authz.decide(req);
- if (! aresp.isAuthorized()) {
- message = "Policy Engine disallows access.";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_FORBIDDEN);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
- return;
- }
- JSONObject jo = getJSONfromInput(req);
- if (jo == null) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- return;
- }
- try {
- // Only the active POD sends notifications
- boolean active = SynchronizerTask.getSynchronizer().isActive();
- boolean b = jo.getBoolean("failed");
- if (active && !b) {
- // Notify all nodes to reset the subscription
- SubscriberNotifyThread t = new SubscriberNotifyThread();
- t.resetSubscription(subid);
- t.start();
- }
- // send response
- elr.setResult(HttpServletResponse.SC_ACCEPTED);
- eventlogger.info(elr);
- resp.setStatus(HttpServletResponse.SC_ACCEPTED);
- } catch (JSONException e) {
- message = "Badly formed JSON";
- elr.setMessage(message);
- elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
- eventlogger.info(elr);
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
- }
- }
+ setIpAndFqdnForEelf("doPost");
+ eelflogger.info(EelfMsgs.MESSAGE_WITH_BEHALF, req.getHeader(BEHALF_HEADER));
+ EventLogRecord elr = new EventLogRecord(req);
+ String message = isAuthorizedForProvisioning(req);
+ if (message != null) {
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ if (isProxyServer()) {
+ super.doPost(req, resp);
+ return;
+ }
+ String bhdr = req.getHeader(BEHALF_HEADER);
+ if (bhdr == null) {
+ message = "Missing "+BEHALF_HEADER+" header.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ final int subid = getIdFromPath(req);
+ if (subid < 0 || Subscription.getSubscriptionById(subid) == null) {
+ message = "Missing or bad subscription number.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ // check content type is SUBCNTRL_CONTENT_TYPE, version 1.0
+ ContentHeader ch = getContentHeader(req);
+ String ver = ch.getAttribute("version");
+ if (!ch.getType().equals(SUBCNTRL_CONTENT_TYPE) || !ver.equals("1.0")) {
+ message = "Incorrect content-type";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, message);
+ return;
+ }
+ // Check with the Authorizer
+ AuthorizationResponse aresp = authz.decide(req);
+ if (! aresp.isAuthorized()) {
+ message = "Policy Engine disallows access.";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_FORBIDDEN);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_FORBIDDEN, message);
+ return;
+ }
+ JSONObject jo = getJSONfromInput(req);
+ if (jo == null) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ return;
+ }
+ try {
+ // Only the active POD sends notifications
+ boolean active = SynchronizerTask.getSynchronizer().isActive();
+ boolean b = jo.getBoolean("failed");
+ if (active && !b) {
+ // Notify all nodes to reset the subscription
+ SubscriberNotifyThread t = new SubscriberNotifyThread();
+ t.resetSubscription(subid);
+ t.start();
+ }
+ // send response
+ elr.setResult(HttpServletResponse.SC_ACCEPTED);
+ eventlogger.info(elr);
+ resp.setStatus(HttpServletResponse.SC_ACCEPTED);
+ } catch (JSONException e) {
+ message = "Badly formed JSON";
+ elr.setMessage(message);
+ elr.setResult(HttpServletResponse.SC_BAD_REQUEST);
+ eventlogger.info(elr);
+ resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
+ }
+ }
- /**
- * A Thread class used to serially send reset notifications to all nodes in the DR network,
- * when a POST is received for a subscription.
- */
- public class SubscriberNotifyThread extends Thread {
- public static final String URL_TEMPLATE = "http://%s/internal/resetSubscription/%d";
- private List<String> urls = new Vector<String>();
+ /**
+ * A Thread class used to serially send reset notifications to all nodes in the DR network,
+ * when a POST is received for a subscription.
+ */
+ public class SubscriberNotifyThread extends Thread {
+ public static final String URL_TEMPLATE = "http://%s/internal/resetSubscription/%d";
+ private List<String> urls = new Vector<String>();
- public SubscriberNotifyThread() {
- setName("SubscriberNotifyThread");
- }
- public void resetSubscription(int subid) {
- for (String nodename : BaseServlet.getNodes()) {
- String u = String.format(URL_TEMPLATE, nodename, subid);
- urls.add(u);
- }
- }
- public void run() {
- try {
- while (!urls.isEmpty()) {
- String u = urls.remove(0);
- try {
- URL url = new URL(u);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.connect();
- conn.getContentLength(); // Force the GET through
- conn.disconnect();
- } catch (IOException e) {
- intlogger.info("IOException Error accessing URL: "+u+": " + e.getMessage());
- }
- }
- } catch (Exception e) {
- intlogger.warn("Caught exception in SubscriberNotifyThread: "+e);
- e.printStackTrace();
- }
- }
- }
+ public SubscriberNotifyThread() {
+ setName("SubscriberNotifyThread");
+ }
+ public void resetSubscription(int subid) {
+ for (String nodename : BaseServlet.getNodes()) {
+ String u = String.format(URL_TEMPLATE, nodename, subid);
+ urls.add(u);
+ }
+ }
+ public void run() {
+ try {
+ while (!urls.isEmpty()) {
+ String u = urls.remove(0);
+ try {
+ URL url = new URL(u);
+ HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+ conn.connect();
+ conn.getContentLength(); // Force the GET through
+ conn.disconnect();
+ } catch (IOException e) {
+ intlogger.info("IOException Error accessing URL: "+u+": " + e.getMessage());
+ }
+ }
+ } catch (Exception e) {
+ intlogger.warn("Caught exception in SubscriberNotifyThread: "+e);
+ e.printStackTrace();
+ }
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SynchronizerTask.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SynchronizerTask.java
index 2e0fc21c..898a3f05 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SynchronizerTask.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/SynchronizerTask.java
@@ -1,613 +1,613 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * *
- * * http://www.apache.org/licenses/LICENSE-2.0
- * *
- * * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-package org.onap.dmaap.datarouter.provisioning;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.security.KeyStore;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.TreeSet;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.conn.scheme.Scheme;
-import org.apache.http.conn.ssl.SSLSocketFactory;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.http.impl.client.AbstractHttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.log4j.Logger;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.json.JSONTokener;
-import org.onap.dmaap.datarouter.provisioning.beans.EgressRoute;
-import org.onap.dmaap.datarouter.provisioning.beans.Feed;
-import org.onap.dmaap.datarouter.provisioning.beans.Group;
-import org.onap.dmaap.datarouter.provisioning.beans.IngressRoute;
-import org.onap.dmaap.datarouter.provisioning.beans.NetworkRoute;
-import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
-import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
-import org.onap.dmaap.datarouter.provisioning.beans.Syncable;
-import org.onap.dmaap.datarouter.provisioning.utils.DB;
-import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;
-import org.onap.dmaap.datarouter.provisioning.utils.RLEBitSet;
-import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
-
-/**
- * This class handles synchronization between provisioning servers (PODs). It has three primary functions:
- * <ol>
- * <li>Checking DNS once per minute to see which POD the DNS CNAME points to. The CNAME will point to
- * the active (master) POD.</li>
- * <li>On non-master (standby) PODs, fetches provisioning data and logs in order to keep MariaDB in sync.</li>
- * <li>Providing information to other parts of the system as to the current role (ACTIVE, STANDBY, UNKNOWN)
- * of this POD.</li>
- * </ol>
- * <p>For this to work correctly, the following code needs to be placed at the beginning of main().</p>
- * <code>
- * Security.setProperty("networkaddress.cache.ttl", "10");
- * </code>
- *
- * @author Robert Eby
- * @version $Id: SynchronizerTask.java,v 1.10 2014/03/21 13:50:10 eby Exp $
- */
-public class SynchronizerTask extends TimerTask {
- /** This is a singleton -- there is only one SynchronizerTask object in the server */
- private static SynchronizerTask synctask;
-
- /** This POD is unknown -- not on the list of PODs */
- public static final int UNKNOWN = 0;
- /** This POD is active -- on the list of PODs, and the DNS CNAME points to us */
- public static final int ACTIVE = 1;
- /** This POD is standby -- on the list of PODs, and the DNS CNAME does not point to us */
- public static final int STANDBY = 2;
- private static final String[] stnames = { "UNKNOWN", "ACTIVE", "STANDBY" };
- private static final long ONE_HOUR = 60 * 60 * 1000L;
-
- private final Logger logger;
- private final Timer rolex;
- private final String spooldir;
- private int state;
- private boolean doFetch;
- private long nextsynctime;
- private AbstractHttpClient httpclient = null;
-
- /**
- * Get the singleton SynchronizerTask object.
- * @return the SynchronizerTask
- */
- public static synchronized SynchronizerTask getSynchronizer() {
- if (synctask == null)
- synctask = new SynchronizerTask();
- return synctask;
- }
-
- @SuppressWarnings("deprecation")
- private SynchronizerTask() {
- logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- rolex = new Timer();
- spooldir = (new DB()).getProperties().getProperty("org.onap.dmaap.datarouter.provserver.spooldir");
- state = UNKNOWN;
- doFetch = true; // start off with a fetch
- nextsynctime = 0;
-
- logger.info("PROV5000: Sync task starting, server state is UNKNOWN");
- try {
- Properties props = (new DB()).getProperties();
- String type = props.getProperty(Main.KEYSTORE_TYPE_PROPERTY, "jks");
- String store = props.getProperty(Main.KEYSTORE_PATH_PROPERTY);
- String pass = props.getProperty(Main.KEYSTORE_PASSWORD_PROPERTY);
- KeyStore keyStore = KeyStore.getInstance(type);
- FileInputStream instream = new FileInputStream(new File(store));
- keyStore.load(instream, pass.toCharArray());
- instream.close();
-
- store = props.getProperty(Main.TRUSTSTORE_PATH_PROPERTY);
- pass = props.getProperty(Main.TRUSTSTORE_PASSWORD_PROPERTY);
- KeyStore trustStore = null;
- if (store != null && store.length() > 0) {
- trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
- instream = new FileInputStream(new File(store));
- trustStore.load(instream, pass.toCharArray());
- instream.close();
- }
-
- // We are connecting with the node name, but the certificate will have the CNAME
- // So we need to accept a non-matching certificate name
- String keystorepass = props.getProperty(Main.KEYSTORE_PASSWORD_PROPERTY); //itrack.web.att.com/browse/DATARTR-6 for changing hard coded passphase ref
- AbstractHttpClient hc = new DefaultHttpClient();
- SSLSocketFactory socketFactory =
- (trustStore == null)
- ? new SSLSocketFactory(keyStore, keystorepass)
- : new SSLSocketFactory(keyStore, keystorepass, trustStore);
- socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
- Scheme sch = new Scheme("https", 443, socketFactory);
- hc.getConnectionManager().getSchemeRegistry().register(sch);
- httpclient = hc;
-
- // Run once every 5 seconds to check DNS, etc.
- long interval = 0;
- try {
- String s = props.getProperty("org.onap.dmaap.datarouter.provserver.sync_interval", "5000");
- interval = Long.parseLong(s);
- } catch (NumberFormatException e) {
- interval = 5000L;
- }
- rolex.scheduleAtFixedRate(this, 0L, interval);
- } catch (Exception e) {
- logger.warn("PROV5005: Problem starting the synchronizer: "+e);
- }
- }
-
- /**
- * What is the state of this POD?
- * @return one of ACTIVE, STANDBY, UNKNOWN
- */
- public int getState() {
- return state;
- }
-
- /**
- * Is this the active POD?
- * @return true if we are active (the master), false otherwise
- */
- public boolean isActive() {
- return state == ACTIVE;
- }
-
- /**
- * This method is used to signal that another POD (the active POD) has sent us a /fetchProv request,
- * and that we should re-synchronize with the master.
- */
- public void doFetch() {
- doFetch = true;
- }
-
- /**
- * Runs once a minute in order to <ol>
- * <li>lookup DNS names,</li>
- * <li>determine the state of this POD,</li>
- * <li>if this is a standby POD, and the fetch flag is set, perform a fetch of state from the active POD.</li>
- * <li>if this is a standby POD, check if there are any new log records to be replicated.</li>
- * </ol>
- */
- @Override
- public void run() {
- try {
- state = lookupState();
- if (state == STANDBY) {
- // Only copy provisioning data FROM the active server TO the standby
- if (doFetch || (System.currentTimeMillis() >= nextsynctime)) {
- logger.debug("Initiating a sync...");
- JSONObject jo = readProvisioningJSON();
- if (jo != null) {
- doFetch = false;
- syncFeeds( jo.getJSONArray("feeds"));
- syncSubs( jo.getJSONArray("subscriptions"));
- syncGroups( jo.getJSONArray("groups")); //Rally:US708115 - 1610
- syncParams(jo.getJSONObject("parameters"));
- // The following will not be present in a version=1.0 provfeed
- JSONArray ja = jo.optJSONArray("ingress");
- if (ja != null)
- syncIngressRoutes(ja);
- JSONObject j2 = jo.optJSONObject("egress");
- if (j2 != null)
- syncEgressRoutes( j2);
- ja = jo.optJSONArray("routing");
- if (ja != null)
- syncNetworkRoutes(ja);
- }
- logger.info("PROV5013: Sync completed.");
- nextsynctime = System.currentTimeMillis() + ONE_HOUR;
- }
- } else {
- // Don't do fetches on non-standby PODs
- doFetch = false;
- }
-
- // Fetch DR logs as needed - server to server
- LogfileLoader lfl = LogfileLoader.getLoader();
- if (lfl.isIdle()) {
- // Only fetch new logs if the loader is waiting for them.
- logger.trace("Checking for logs to replicate...");
- RLEBitSet local = lfl.getBitSet();
- RLEBitSet remote = readRemoteLoglist();
- remote.andNot(local);
- if (!remote.isEmpty()) {
- logger.debug(" Replicating logs: "+remote);
- replicateDRLogs(remote);
- }
- }
- } catch (Exception e) {
- logger.warn("PROV0020: Caught exception in SynchronizerTask: "+e);
- e.printStackTrace();
- }
- }
-
- /**
- * This method is used to lookup the CNAME that points to the active server.
- * It returns 0 (UNKNOWN), 1(ACTIVE), or 2 (STANDBY) to indicate the state of this server.
- * @return the current state
- */
- private int lookupState() {
- int newstate = UNKNOWN;
- try {
- InetAddress myaddr = InetAddress.getLocalHost();
- if (logger.isTraceEnabled())
- logger.trace("My address: "+myaddr);
- String this_pod = myaddr.getHostName();
- Set<String> pods = new TreeSet<String>(Arrays.asList(BaseServlet.getPods()));
- if (pods.contains(this_pod)) {
- InetAddress pserver = InetAddress.getByName(BaseServlet.active_prov_name);
- newstate = myaddr.equals(pserver) ? ACTIVE : STANDBY;
- if (logger.isDebugEnabled() && System.currentTimeMillis() >= next_msg) {
- logger.debug("Active POD = "+pserver+", Current state is "+stnames[newstate]);
- next_msg = System.currentTimeMillis() + (5 * 60 * 1000L);
- }
- } else {
- logger.warn("PROV5003: My name ("+this_pod+") is missing from the list of provisioning servers.");
- }
- } catch (UnknownHostException e) {
- logger.warn("PROV5002: Cannot determine the name of this provisioning server.");
- }
-
- if (newstate != state)
- logger.info(String.format("PROV5001: Server state changed from %s to %s", stnames[state], stnames[newstate]));
- return newstate;
- }
- private static long next_msg = 0; // only display the "Current state" msg every 5 mins.
- /** Synchronize the Feeds in the JSONArray, with the Feeds in the DB. */
- private void syncFeeds(JSONArray ja) {
- Collection<Syncable> coll = new ArrayList<Syncable>();
- for (int n = 0; n < ja.length(); n++) {
- try {
- Feed f = new Feed(ja.getJSONObject(n));
- coll.add(f);
- } catch (Exception e) {
- logger.warn("PROV5004: Invalid object in feed: "+ja.optJSONObject(n));
- }
- }
- if (sync(coll, Feed.getAllFeeds()))
- BaseServlet.provisioningDataChanged();
- }
- /** Synchronize the Subscriptions in the JSONArray, with the Subscriptions in the DB. */
- private void syncSubs(JSONArray ja) {
- Collection<Syncable> coll = new ArrayList<Syncable>();
- for (int n = 0; n < ja.length(); n++) {
- try {
- //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
- JSONObject j = ja.getJSONObject(n);
- j.put("sync", "true");
- Subscription s = new Subscription(j);
- coll.add(s);
- } catch (Exception e) {
- logger.warn("PROV5004: Invalid object in subscription: "+ja.optJSONObject(n));
- }
- }
- if (sync(coll, Subscription.getAllSubscriptions()))
- BaseServlet.provisioningDataChanged();
- }
-
- /** Rally:US708115 - Synchronize the Groups in the JSONArray, with the Groups in the DB. */
- private void syncGroups(JSONArray ja) {
- Collection<Syncable> coll = new ArrayList<Syncable>();
- for (int n = 0; n < ja.length(); n++) {
- try {
- Group g = new Group(ja.getJSONObject(n));
- coll.add(g);
- } catch (Exception e) {
- logger.warn("PROV5004: Invalid object in subscription: "+ja.optJSONObject(n));
- }
- }
- if (sync(coll, Group.getAllgroups()))
- BaseServlet.provisioningDataChanged();
- }
-
-
- /** Synchronize the Parameters in the JSONObject, with the Parameters in the DB. */
- private void syncParams(JSONObject jo) {
- Collection<Syncable> coll = new ArrayList<Syncable>();
- for (String k : jo.keySet()) {
- String v = "";
- try {
- v = jo.getString(k);
- } catch (JSONException e) {
- try {
- v = ""+jo.getInt(k);
- } catch (JSONException e1) {
- JSONArray ja = jo.getJSONArray(k);
- for (int i = 0; i < ja.length(); i++) {
- if (i > 0)
- v += "|";
- v += ja.getString(i);
- }
- }
- }
- coll.add(new Parameters(k, v));
- }
- if (sync(coll, Parameters.getParameterCollection())) {
- BaseServlet.provisioningDataChanged();
- BaseServlet.provisioningParametersChanged();
- }
- }
- private void syncIngressRoutes(JSONArray ja) {
- Collection<Syncable> coll = new ArrayList<Syncable>();
- for (int n = 0; n < ja.length(); n++) {
- try {
- IngressRoute in = new IngressRoute(ja.getJSONObject(n));
- coll.add(in);
- } catch (NumberFormatException e) {
- logger.warn("PROV5004: Invalid object in ingress routes: "+ja.optJSONObject(n));
- }
- }
- if (sync(coll, IngressRoute.getAllIngressRoutes()))
- BaseServlet.provisioningDataChanged();
- }
- private void syncEgressRoutes(JSONObject jo) {
- Collection<Syncable> coll = new ArrayList<Syncable>();
- for (String key : jo.keySet()) {
- try {
- int sub = Integer.parseInt(key);
- String node = jo.getString(key);
- EgressRoute er = new EgressRoute(sub, node);
- coll.add(er);
- } catch (NumberFormatException e) {
- logger.warn("PROV5004: Invalid subid in egress routes: "+key);
- } catch (IllegalArgumentException e) {
- logger.warn("PROV5004: Invalid node name in egress routes: "+key);
- }
- }
- if (sync(coll, EgressRoute.getAllEgressRoutes()))
- BaseServlet.provisioningDataChanged();
- }
- private void syncNetworkRoutes(JSONArray ja) {
- Collection<Syncable> coll = new ArrayList<Syncable>();
- for (int n = 0; n < ja.length(); n++) {
- try {
- NetworkRoute nr = new NetworkRoute(ja.getJSONObject(n));
- coll.add(nr);
- } catch (JSONException e) {
- logger.warn("PROV5004: Invalid object in network routes: "+ja.optJSONObject(n));
- }
- }
- if (sync(coll, NetworkRoute.getAllNetworkRoutes()))
- BaseServlet.provisioningDataChanged();
- }
- private boolean sync(Collection<? extends Syncable> newc, Collection<? extends Syncable> oldc) {
- boolean changes = false;
- try {
- Map<String, Syncable> newmap = getMap(newc);
- Map<String, Syncable> oldmap = getMap(oldc);
- Set<String> union = new TreeSet<String>(newmap.keySet());
- union.addAll(oldmap.keySet());
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- for (String n : union) {
- Syncable newobj = newmap.get(n);
- Syncable oldobj = oldmap.get(n);
- if (oldobj == null) {
- if (logger.isDebugEnabled())
- logger.debug(" Inserting record: "+newobj);
- newobj.doInsert(conn);
- changes = true;
- } else if (newobj == null) {
- if (logger.isDebugEnabled())
- logger.debug(" Deleting record: "+oldobj);
- oldobj.doDelete(conn);
- changes = true;
- } else if (!newobj.equals(oldobj)) {
- if (logger.isDebugEnabled())
- logger.debug(" Updating record: "+newobj);
- newobj.doUpdate(conn);
-
- /**Rally US708115
- * Change Ownership of FEED - 1610, Syncronised with secondary DB.
- * */
- checkChnageOwner(newobj, oldobj);
-
- changes = true;
- }
- }
- db.release(conn);
- } catch (SQLException e) {
- logger.warn("PROV5009: problem during sync, exception: "+e);
- e.printStackTrace();
- }
- return changes;
- }
- private Map<String, Syncable> getMap(Collection<? extends Syncable> c) {
- Map<String, Syncable> map = new HashMap<String, Syncable>();
- for (Syncable v : c) {
- map.put(v.getKey(), v);
- }
- return map;
- }
-
-
- /**Change owner of FEED/SUBSCRIPTION*/
- /**Rally US708115
- * Change Ownership of FEED - 1610
- *
- * */
- private void checkChnageOwner(Syncable newobj, Syncable oldobj) {
- if(newobj instanceof Feed) {
- Feed oldfeed = (Feed) oldobj;
- Feed newfeed = (Feed) newobj;
-
- if(!oldfeed.getPublisher().equals(newfeed.getPublisher())){
- logger.info("PROV5013 - Previous publisher: "+oldfeed.getPublisher() +": New publisher-"+newfeed.getPublisher());
- oldfeed.setPublisher(newfeed.getPublisher());
- oldfeed.changeOwnerShip();
- }
- }
- else if(newobj instanceof Subscription) {
- Subscription oldsub = (Subscription) oldobj;
- Subscription newsub = (Subscription) newobj;
-
- if(!oldsub.getSubscriber().equals(newsub.getSubscriber())){
- logger.info("PROV5013 - Previous subscriber: "+oldsub.getSubscriber() +": New subscriber-"+newsub.getSubscriber());
- oldsub.setSubscriber(newsub.getSubscriber());
- oldsub.changeOwnerShip();
- }
- }
-
- }
-
- /**
- * Issue a GET on the peer POD's /internal/prov/ URL to get a copy of its provisioning data.
- * @return the provisioning data (as a JONObject)
- */
- private synchronized JSONObject readProvisioningJSON() {
- String url = URLUtilities.generatePeerProvURL();
- HttpGet get = new HttpGet(url);
- try {
- HttpResponse response = httpclient.execute(get);
- int code = response.getStatusLine().getStatusCode();
- if (code != HttpServletResponse.SC_OK) {
- logger.warn("PROV5010: readProvisioningJSON failed, bad error code: "+code);
- return null;
- }
- HttpEntity entity = response.getEntity();
- String ctype = entity.getContentType().getValue().trim();
- if (!ctype.equals(BaseServlet.PROVFULL_CONTENT_TYPE1) && !ctype.equals(BaseServlet.PROVFULL_CONTENT_TYPE2)) {
- logger.warn("PROV5011: readProvisioningJSON failed, bad content type: "+ctype);
- return null;
- }
- return new JSONObject(new JSONTokener(entity.getContent()));
- } catch (Exception e) {
- logger.warn("PROV5012: readProvisioningJSON failed, exception: "+e);
- return null;
- } finally {
- get.releaseConnection();
- }
- }
- /**
- * Issue a GET on the peer POD's /internal/drlogs/ URL to get an RELBitSet representing the
- * log records available in the remote database.
- * @return the bitset
- */
- private RLEBitSet readRemoteLoglist() {
- RLEBitSet bs = new RLEBitSet();
- String url = URLUtilities.generatePeerLogsURL();
-
- //Fixing if only one Prov is configured, not to give exception to fill logs, return empty bitset.
- if(url.equals("")) {
- return bs;
- }
- //End of fix.
-
- HttpGet get = new HttpGet(url);
- try {
- HttpResponse response = httpclient.execute(get);
- int code = response.getStatusLine().getStatusCode();
- if (code != HttpServletResponse.SC_OK) {
- logger.warn("PROV5010: readRemoteLoglist failed, bad error code: "+code);
- return bs;
- }
- HttpEntity entity = response.getEntity();
- String ctype = entity.getContentType().getValue().trim();
- if (!ctype.equals("text/plain")) {
- logger.warn("PROV5011: readRemoteLoglist failed, bad content type: "+ctype);
- return bs;
- }
- InputStream is = entity.getContent();
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- int ch = 0;
- while ((ch = is.read()) >= 0)
- bos.write(ch);
- bs.set(bos.toString());
- is.close();
- } catch (Exception e) {
- logger.warn("PROV5012: readRemoteLoglist failed, exception: "+e);
- return bs;
- } finally {
- get.releaseConnection();
- }
- return bs;
- }
- /**
- * Issue a POST on the peer POD's /internal/drlogs/ URL to fetch log records available
- * in the remote database that we wish to copy to the local database.
- * @param bs the bitset (an RELBitSet) of log records to fetch
- */
- private void replicateDRLogs(RLEBitSet bs) {
- String url = URLUtilities.generatePeerLogsURL();
- HttpPost post = new HttpPost(url);
- try {
- String t = bs.toString();
- HttpEntity body = new ByteArrayEntity(t.getBytes(), ContentType.create("text/plain"));
- post.setEntity(body);
- if (logger.isDebugEnabled())
- logger.debug("Requesting records: "+t);
-
- HttpResponse response = httpclient.execute(post);
- int code = response.getStatusLine().getStatusCode();
- if (code != HttpServletResponse.SC_OK) {
- logger.warn("PROV5010: replicateDRLogs failed, bad error code: "+code);
- return;
- }
- HttpEntity entity = response.getEntity();
- String ctype = entity.getContentType().getValue().trim();
- if (!ctype.equals("text/plain")) {
- logger.warn("PROV5011: replicateDRLogs failed, bad content type: "+ctype);
- return;
- }
-
- String spoolname = "" + System.currentTimeMillis();
- Path tmppath = Paths.get(spooldir, spoolname);
- Path donepath = Paths.get(spooldir, "IN."+spoolname);
- Files.copy(entity.getContent(), Paths.get(spooldir, spoolname), StandardCopyOption.REPLACE_EXISTING);
- Files.move(tmppath, donepath, StandardCopyOption.REPLACE_EXISTING);
- logger.info("Approximately "+bs.cardinality()+" records replicated.");
- } catch (Exception e) {
- logger.warn("PROV5012: replicateDRLogs failed, exception: "+e);
- } finally {
- post.releaseConnection();
- }
- }
-}
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+
+package org.onap.dmaap.datarouter.provisioning;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.security.KeyStore;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.TreeSet;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.http.impl.client.AbstractHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.log4j.Logger;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONTokener;
+import org.onap.dmaap.datarouter.provisioning.beans.EgressRoute;
+import org.onap.dmaap.datarouter.provisioning.beans.Feed;
+import org.onap.dmaap.datarouter.provisioning.beans.Group;
+import org.onap.dmaap.datarouter.provisioning.beans.IngressRoute;
+import org.onap.dmaap.datarouter.provisioning.beans.NetworkRoute;
+import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
+import org.onap.dmaap.datarouter.provisioning.beans.Subscription;
+import org.onap.dmaap.datarouter.provisioning.beans.Syncable;
+import org.onap.dmaap.datarouter.provisioning.utils.DB;
+import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;
+import org.onap.dmaap.datarouter.provisioning.utils.RLEBitSet;
+import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
+
+/**
+ * This class handles synchronization between provisioning servers (PODs). It has three primary functions:
+ * <ol>
+ * <li>Checking DNS once per minute to see which POD the DNS CNAME points to. The CNAME will point to
+ * the active (master) POD.</li>
+ * <li>On non-master (standby) PODs, fetches provisioning data and logs in order to keep MariaDB in sync.</li>
+ * <li>Providing information to other parts of the system as to the current role (ACTIVE, STANDBY, UNKNOWN)
+ * of this POD.</li>
+ * </ol>
+ * <p>For this to work correctly, the following code needs to be placed at the beginning of main().</p>
+ * <code>
+ * Security.setProperty("networkaddress.cache.ttl", "10");
+ * </code>
+ *
+ * @author Robert Eby
+ * @version $Id: SynchronizerTask.java,v 1.10 2014/03/21 13:50:10 eby Exp $
+ */
+public class SynchronizerTask extends TimerTask {
+ /** This is a singleton -- there is only one SynchronizerTask object in the server */
+ private static SynchronizerTask synctask;
+
+ /** This POD is unknown -- not on the list of PODs */
+ public static final int UNKNOWN = 0;
+ /** This POD is active -- on the list of PODs, and the DNS CNAME points to us */
+ public static final int ACTIVE = 1;
+ /** This POD is standby -- on the list of PODs, and the DNS CNAME does not point to us */
+ public static final int STANDBY = 2;
+ private static final String[] stnames = { "UNKNOWN", "ACTIVE", "STANDBY" };
+ private static final long ONE_HOUR = 60 * 60 * 1000L;
+
+ private final Logger logger;
+ private final Timer rolex;
+ private final String spooldir;
+ private int state;
+ private boolean doFetch;
+ private long nextsynctime;
+ private AbstractHttpClient httpclient = null;
+
+ /**
+ * Get the singleton SynchronizerTask object.
+ * @return the SynchronizerTask
+ */
+ public static synchronized SynchronizerTask getSynchronizer() {
+ if (synctask == null)
+ synctask = new SynchronizerTask();
+ return synctask;
+ }
+
+ @SuppressWarnings("deprecation")
+ private SynchronizerTask() {
+ logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ rolex = new Timer();
+ spooldir = (new DB()).getProperties().getProperty("org.onap.dmaap.datarouter.provserver.spooldir");
+ state = UNKNOWN;
+ doFetch = true; // start off with a fetch
+ nextsynctime = 0;
+
+ logger.info("PROV5000: Sync task starting, server state is UNKNOWN");
+ try {
+ Properties props = (new DB()).getProperties();
+ String type = props.getProperty(Main.KEYSTORE_TYPE_PROPERTY, "jks");
+ String store = props.getProperty(Main.KEYSTORE_PATH_PROPERTY);
+ String pass = props.getProperty(Main.KEYSTORE_PASSWORD_PROPERTY);
+ KeyStore keyStore = KeyStore.getInstance(type);
+ FileInputStream instream = new FileInputStream(new File(store));
+ keyStore.load(instream, pass.toCharArray());
+ instream.close();
+
+ store = props.getProperty(Main.TRUSTSTORE_PATH_PROPERTY);
+ pass = props.getProperty(Main.TRUSTSTORE_PASSWORD_PROPERTY);
+ KeyStore trustStore = null;
+ if (store != null && store.length() > 0) {
+ trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ instream = new FileInputStream(new File(store));
+ trustStore.load(instream, pass.toCharArray());
+ instream.close();
+ }
+
+ // We are connecting with the node name, but the certificate will have the CNAME
+ // So we need to accept a non-matching certificate name
+ String keystorepass = props.getProperty(Main.KEYSTORE_PASSWORD_PROPERTY); //itrack.web.att.com/browse/DATARTR-6 for changing hard coded passphase ref
+ AbstractHttpClient hc = new DefaultHttpClient();
+ SSLSocketFactory socketFactory =
+ (trustStore == null)
+ ? new SSLSocketFactory(keyStore, keystorepass)
+ : new SSLSocketFactory(keyStore, keystorepass, trustStore);
+ socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+ Scheme sch = new Scheme("https", 443, socketFactory);
+ hc.getConnectionManager().getSchemeRegistry().register(sch);
+ httpclient = hc;
+
+ // Run once every 5 seconds to check DNS, etc.
+ long interval = 0;
+ try {
+ String s = props.getProperty("org.onap.dmaap.datarouter.provserver.sync_interval", "5000");
+ interval = Long.parseLong(s);
+ } catch (NumberFormatException e) {
+ interval = 5000L;
+ }
+ rolex.scheduleAtFixedRate(this, 0L, interval);
+ } catch (Exception e) {
+ logger.warn("PROV5005: Problem starting the synchronizer: "+e);
+ }
+ }
+
+ /**
+ * What is the state of this POD?
+ * @return one of ACTIVE, STANDBY, UNKNOWN
+ */
+ public int getState() {
+ return state;
+ }
+
+ /**
+ * Is this the active POD?
+ * @return true if we are active (the master), false otherwise
+ */
+ public boolean isActive() {
+ return state == ACTIVE;
+ }
+
+ /**
+ * This method is used to signal that another POD (the active POD) has sent us a /fetchProv request,
+ * and that we should re-synchronize with the master.
+ */
+ public void doFetch() {
+ doFetch = true;
+ }
+
+ /**
+ * Runs once a minute in order to <ol>
+ * <li>lookup DNS names,</li>
+ * <li>determine the state of this POD,</li>
+ * <li>if this is a standby POD, and the fetch flag is set, perform a fetch of state from the active POD.</li>
+ * <li>if this is a standby POD, check if there are any new log records to be replicated.</li>
+ * </ol>
+ */
+ @Override
+ public void run() {
+ try {
+ state = lookupState();
+ if (state == STANDBY) {
+ // Only copy provisioning data FROM the active server TO the standby
+ if (doFetch || (System.currentTimeMillis() >= nextsynctime)) {
+ logger.debug("Initiating a sync...");
+ JSONObject jo = readProvisioningJSON();
+ if (jo != null) {
+ doFetch = false;
+ syncFeeds( jo.getJSONArray("feeds"));
+ syncSubs( jo.getJSONArray("subscriptions"));
+ syncGroups( jo.getJSONArray("groups")); //Rally:US708115 - 1610
+ syncParams(jo.getJSONObject("parameters"));
+ // The following will not be present in a version=1.0 provfeed
+ JSONArray ja = jo.optJSONArray("ingress");
+ if (ja != null)
+ syncIngressRoutes(ja);
+ JSONObject j2 = jo.optJSONObject("egress");
+ if (j2 != null)
+ syncEgressRoutes( j2);
+ ja = jo.optJSONArray("routing");
+ if (ja != null)
+ syncNetworkRoutes(ja);
+ }
+ logger.info("PROV5013: Sync completed.");
+ nextsynctime = System.currentTimeMillis() + ONE_HOUR;
+ }
+ } else {
+ // Don't do fetches on non-standby PODs
+ doFetch = false;
+ }
+
+ // Fetch DR logs as needed - server to server
+ LogfileLoader lfl = LogfileLoader.getLoader();
+ if (lfl.isIdle()) {
+ // Only fetch new logs if the loader is waiting for them.
+ logger.trace("Checking for logs to replicate...");
+ RLEBitSet local = lfl.getBitSet();
+ RLEBitSet remote = readRemoteLoglist();
+ remote.andNot(local);
+ if (!remote.isEmpty()) {
+ logger.debug(" Replicating logs: "+remote);
+ replicateDRLogs(remote);
+ }
+ }
+ } catch (Exception e) {
+ logger.warn("PROV0020: Caught exception in SynchronizerTask: "+e);
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This method is used to lookup the CNAME that points to the active server.
+ * It returns 0 (UNKNOWN), 1(ACTIVE), or 2 (STANDBY) to indicate the state of this server.
+ * @return the current state
+ */
+ private int lookupState() {
+ int newstate = UNKNOWN;
+ try {
+ InetAddress myaddr = InetAddress.getLocalHost();
+ if (logger.isTraceEnabled())
+ logger.trace("My address: "+myaddr);
+ String this_pod = myaddr.getHostName();
+ Set<String> pods = new TreeSet<String>(Arrays.asList(BaseServlet.getPods()));
+ if (pods.contains(this_pod)) {
+ InetAddress pserver = InetAddress.getByName(BaseServlet.active_prov_name);
+ newstate = myaddr.equals(pserver) ? ACTIVE : STANDBY;
+ if (logger.isDebugEnabled() && System.currentTimeMillis() >= next_msg) {
+ logger.debug("Active POD = "+pserver+", Current state is "+stnames[newstate]);
+ next_msg = System.currentTimeMillis() + (5 * 60 * 1000L);
+ }
+ } else {
+ logger.warn("PROV5003: My name ("+this_pod+") is missing from the list of provisioning servers.");
+ }
+ } catch (UnknownHostException e) {
+ logger.warn("PROV5002: Cannot determine the name of this provisioning server.");
+ }
+
+ if (newstate != state)
+ logger.info(String.format("PROV5001: Server state changed from %s to %s", stnames[state], stnames[newstate]));
+ return newstate;
+ }
+ private static long next_msg = 0; // only display the "Current state" msg every 5 mins.
+ /** Synchronize the Feeds in the JSONArray, with the Feeds in the DB. */
+ private void syncFeeds(JSONArray ja) {
+ Collection<Syncable> coll = new ArrayList<Syncable>();
+ for (int n = 0; n < ja.length(); n++) {
+ try {
+ Feed f = new Feed(ja.getJSONObject(n));
+ coll.add(f);
+ } catch (Exception e) {
+ logger.warn("PROV5004: Invalid object in feed: "+ja.optJSONObject(n));
+ }
+ }
+ if (sync(coll, Feed.getAllFeeds()))
+ BaseServlet.provisioningDataChanged();
+ }
+ /** Synchronize the Subscriptions in the JSONArray, with the Subscriptions in the DB. */
+ private void syncSubs(JSONArray ja) {
+ Collection<Syncable> coll = new ArrayList<Syncable>();
+ for (int n = 0; n < ja.length(); n++) {
+ try {
+ //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
+ JSONObject j = ja.getJSONObject(n);
+ j.put("sync", "true");
+ Subscription s = new Subscription(j);
+ coll.add(s);
+ } catch (Exception e) {
+ logger.warn("PROV5004: Invalid object in subscription: "+ja.optJSONObject(n));
+ }
+ }
+ if (sync(coll, Subscription.getAllSubscriptions()))
+ BaseServlet.provisioningDataChanged();
+ }
+
+ /** Rally:US708115 - Synchronize the Groups in the JSONArray, with the Groups in the DB. */
+ private void syncGroups(JSONArray ja) {
+ Collection<Syncable> coll = new ArrayList<Syncable>();
+ for (int n = 0; n < ja.length(); n++) {
+ try {
+ Group g = new Group(ja.getJSONObject(n));
+ coll.add(g);
+ } catch (Exception e) {
+ logger.warn("PROV5004: Invalid object in subscription: "+ja.optJSONObject(n));
+ }
+ }
+ if (sync(coll, Group.getAllgroups()))
+ BaseServlet.provisioningDataChanged();
+ }
+
+
+ /** Synchronize the Parameters in the JSONObject, with the Parameters in the DB. */
+ private void syncParams(JSONObject jo) {
+ Collection<Syncable> coll = new ArrayList<Syncable>();
+ for (String k : jo.keySet()) {
+ String v = "";
+ try {
+ v = jo.getString(k);
+ } catch (JSONException e) {
+ try {
+ v = ""+jo.getInt(k);
+ } catch (JSONException e1) {
+ JSONArray ja = jo.getJSONArray(k);
+ for (int i = 0; i < ja.length(); i++) {
+ if (i > 0)
+ v += "|";
+ v += ja.getString(i);
+ }
+ }
+ }
+ coll.add(new Parameters(k, v));
+ }
+ if (sync(coll, Parameters.getParameterCollection())) {
+ BaseServlet.provisioningDataChanged();
+ BaseServlet.provisioningParametersChanged();
+ }
+ }
+ private void syncIngressRoutes(JSONArray ja) {
+ Collection<Syncable> coll = new ArrayList<Syncable>();
+ for (int n = 0; n < ja.length(); n++) {
+ try {
+ IngressRoute in = new IngressRoute(ja.getJSONObject(n));
+ coll.add(in);
+ } catch (NumberFormatException e) {
+ logger.warn("PROV5004: Invalid object in ingress routes: "+ja.optJSONObject(n));
+ }
+ }
+ if (sync(coll, IngressRoute.getAllIngressRoutes()))
+ BaseServlet.provisioningDataChanged();
+ }
+ private void syncEgressRoutes(JSONObject jo) {
+ Collection<Syncable> coll = new ArrayList<Syncable>();
+ for (String key : jo.keySet()) {
+ try {
+ int sub = Integer.parseInt(key);
+ String node = jo.getString(key);
+ EgressRoute er = new EgressRoute(sub, node);
+ coll.add(er);
+ } catch (NumberFormatException e) {
+ logger.warn("PROV5004: Invalid subid in egress routes: "+key);
+ } catch (IllegalArgumentException e) {
+ logger.warn("PROV5004: Invalid node name in egress routes: "+key);
+ }
+ }
+ if (sync(coll, EgressRoute.getAllEgressRoutes()))
+ BaseServlet.provisioningDataChanged();
+ }
+ private void syncNetworkRoutes(JSONArray ja) {
+ Collection<Syncable> coll = new ArrayList<Syncable>();
+ for (int n = 0; n < ja.length(); n++) {
+ try {
+ NetworkRoute nr = new NetworkRoute(ja.getJSONObject(n));
+ coll.add(nr);
+ } catch (JSONException e) {
+ logger.warn("PROV5004: Invalid object in network routes: "+ja.optJSONObject(n));
+ }
+ }
+ if (sync(coll, NetworkRoute.getAllNetworkRoutes()))
+ BaseServlet.provisioningDataChanged();
+ }
+ private boolean sync(Collection<? extends Syncable> newc, Collection<? extends Syncable> oldc) {
+ boolean changes = false;
+ try {
+ Map<String, Syncable> newmap = getMap(newc);
+ Map<String, Syncable> oldmap = getMap(oldc);
+ Set<String> union = new TreeSet<String>(newmap.keySet());
+ union.addAll(oldmap.keySet());
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ for (String n : union) {
+ Syncable newobj = newmap.get(n);
+ Syncable oldobj = oldmap.get(n);
+ if (oldobj == null) {
+ if (logger.isDebugEnabled())
+ logger.debug(" Inserting record: "+newobj);
+ newobj.doInsert(conn);
+ changes = true;
+ } else if (newobj == null) {
+ if (logger.isDebugEnabled())
+ logger.debug(" Deleting record: "+oldobj);
+ oldobj.doDelete(conn);
+ changes = true;
+ } else if (!newobj.equals(oldobj)) {
+ if (logger.isDebugEnabled())
+ logger.debug(" Updating record: "+newobj);
+ newobj.doUpdate(conn);
+
+ /**Rally US708115
+ * Change Ownership of FEED - 1610, Syncronised with secondary DB.
+ * */
+ checkChnageOwner(newobj, oldobj);
+
+ changes = true;
+ }
+ }
+ db.release(conn);
+ } catch (SQLException e) {
+ logger.warn("PROV5009: problem during sync, exception: "+e);
+ e.printStackTrace();
+ }
+ return changes;
+ }
+ private Map<String, Syncable> getMap(Collection<? extends Syncable> c) {
+ Map<String, Syncable> map = new HashMap<String, Syncable>();
+ for (Syncable v : c) {
+ map.put(v.getKey(), v);
+ }
+ return map;
+ }
+
+
+ /**Change owner of FEED/SUBSCRIPTION*/
+ /**Rally US708115
+ * Change Ownership of FEED - 1610
+ *
+ * */
+ private void checkChnageOwner(Syncable newobj, Syncable oldobj) {
+ if(newobj instanceof Feed) {
+ Feed oldfeed = (Feed) oldobj;
+ Feed newfeed = (Feed) newobj;
+
+ if(!oldfeed.getPublisher().equals(newfeed.getPublisher())){
+ logger.info("PROV5013 - Previous publisher: "+oldfeed.getPublisher() +": New publisher-"+newfeed.getPublisher());
+ oldfeed.setPublisher(newfeed.getPublisher());
+ oldfeed.changeOwnerShip();
+ }
+ }
+ else if(newobj instanceof Subscription) {
+ Subscription oldsub = (Subscription) oldobj;
+ Subscription newsub = (Subscription) newobj;
+
+ if(!oldsub.getSubscriber().equals(newsub.getSubscriber())){
+ logger.info("PROV5013 - Previous subscriber: "+oldsub.getSubscriber() +": New subscriber-"+newsub.getSubscriber());
+ oldsub.setSubscriber(newsub.getSubscriber());
+ oldsub.changeOwnerShip();
+ }
+ }
+
+ }
+
+ /**
+ * Issue a GET on the peer POD's /internal/prov/ URL to get a copy of its provisioning data.
+ * @return the provisioning data (as a JONObject)
+ */
+ private synchronized JSONObject readProvisioningJSON() {
+ String url = URLUtilities.generatePeerProvURL();
+ HttpGet get = new HttpGet(url);
+ try {
+ HttpResponse response = httpclient.execute(get);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != HttpServletResponse.SC_OK) {
+ logger.warn("PROV5010: readProvisioningJSON failed, bad error code: "+code);
+ return null;
+ }
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ if (!ctype.equals(BaseServlet.PROVFULL_CONTENT_TYPE1) && !ctype.equals(BaseServlet.PROVFULL_CONTENT_TYPE2)) {
+ logger.warn("PROV5011: readProvisioningJSON failed, bad content type: "+ctype);
+ return null;
+ }
+ return new JSONObject(new JSONTokener(entity.getContent()));
+ } catch (Exception e) {
+ logger.warn("PROV5012: readProvisioningJSON failed, exception: "+e);
+ return null;
+ } finally {
+ get.releaseConnection();
+ }
+ }
+ /**
+ * Issue a GET on the peer POD's /internal/drlogs/ URL to get an RELBitSet representing the
+ * log records available in the remote database.
+ * @return the bitset
+ */
+ private RLEBitSet readRemoteLoglist() {
+ RLEBitSet bs = new RLEBitSet();
+ String url = URLUtilities.generatePeerLogsURL();
+
+ //Fixing if only one Prov is configured, not to give exception to fill logs, return empty bitset.
+ if(url.equals("")) {
+ return bs;
+ }
+ //End of fix.
+
+ HttpGet get = new HttpGet(url);
+ try {
+ HttpResponse response = httpclient.execute(get);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != HttpServletResponse.SC_OK) {
+ logger.warn("PROV5010: readRemoteLoglist failed, bad error code: "+code);
+ return bs;
+ }
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ if (!ctype.equals("text/plain")) {
+ logger.warn("PROV5011: readRemoteLoglist failed, bad content type: "+ctype);
+ return bs;
+ }
+ InputStream is = entity.getContent();
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ int ch = 0;
+ while ((ch = is.read()) >= 0)
+ bos.write(ch);
+ bs.set(bos.toString());
+ is.close();
+ } catch (Exception e) {
+ logger.warn("PROV5012: readRemoteLoglist failed, exception: "+e);
+ return bs;
+ } finally {
+ get.releaseConnection();
+ }
+ return bs;
+ }
+ /**
+ * Issue a POST on the peer POD's /internal/drlogs/ URL to fetch log records available
+ * in the remote database that we wish to copy to the local database.
+ * @param bs the bitset (an RELBitSet) of log records to fetch
+ */
+ private void replicateDRLogs(RLEBitSet bs) {
+ String url = URLUtilities.generatePeerLogsURL();
+ HttpPost post = new HttpPost(url);
+ try {
+ String t = bs.toString();
+ HttpEntity body = new ByteArrayEntity(t.getBytes(), ContentType.create("text/plain"));
+ post.setEntity(body);
+ if (logger.isDebugEnabled())
+ logger.debug("Requesting records: "+t);
+
+ HttpResponse response = httpclient.execute(post);
+ int code = response.getStatusLine().getStatusCode();
+ if (code != HttpServletResponse.SC_OK) {
+ logger.warn("PROV5010: replicateDRLogs failed, bad error code: "+code);
+ return;
+ }
+ HttpEntity entity = response.getEntity();
+ String ctype = entity.getContentType().getValue().trim();
+ if (!ctype.equals("text/plain")) {
+ logger.warn("PROV5011: replicateDRLogs failed, bad content type: "+ctype);
+ return;
+ }
+
+ String spoolname = "" + System.currentTimeMillis();
+ Path tmppath = Paths.get(spooldir, spoolname);
+ Path donepath = Paths.get(spooldir, "IN."+spoolname);
+ Files.copy(entity.getContent(), Paths.get(spooldir, spoolname), StandardCopyOption.REPLACE_EXISTING);
+ Files.move(tmppath, donepath, StandardCopyOption.REPLACE_EXISTING);
+ logger.info("Approximately "+bs.cardinality()+" records replicated.");
+ } catch (Exception e) {
+ logger.warn("PROV5012: replicateDRLogs failed, exception: "+e);
+ } finally {
+ post.releaseConnection();
+ }
+ }
+}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/BaseLogRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/BaseLogRecord.java
index 7a8b0db3..8534bc03 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/BaseLogRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/BaseLogRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -42,144 +42,144 @@ import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;
* @version $Id: BaseLogRecord.java,v 1.10 2013/10/29 16:57:57 eby Exp $
*/
public class BaseLogRecord implements LOGJSONable, Loadable {
- protected static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ protected static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
- private long eventTime;
- private String publishId;
- private int feedid;
- private String requestUri;
- private String method;
- private String contentType;
- private long contentLength;
+ private long eventTime;
+ private String publishId;
+ private int feedid;
+ private String requestUri;
+ private String method;
+ private String contentType;
+ private long contentLength;
- protected BaseLogRecord(String[] pp) throws ParseException {
-// This throws exceptions occasionally - don't know why.
-// Date d = null;
-// synchronized (sdf) {
-// d = sdf.parse(pp[0]);
-// }
- Date d = parseDate(pp[0]);
- this.eventTime = d.getTime();
- this.publishId = pp[2];
- this.feedid = Integer.parseInt(pp[3]);
- if (pp[1].equals("DLX")) {
- this.requestUri = "";
- this.method = "GET"; // Note: we need a valid value in this field, even though unused
- this.contentType = "";
- this.contentLength = Long.parseLong(pp[5]);
- } else if (pp[1].equals("PUB") || pp[1].equals("LOG") || pp[1].equals("PBF")) {
- this.requestUri = pp[4];
- this.method = pp[5];
- this.contentType = pp[6];
- this.contentLength = Long.parseLong(pp[7]);
- } else {
- this.requestUri = pp[5];
- this.method = pp[6];
- this.contentType = pp[7];
- this.contentLength = Long.parseLong(pp[8]);
- }
- }
- protected BaseLogRecord(ResultSet rs) throws SQLException {
- this.eventTime = rs.getLong("EVENT_TIME");
- this.publishId = rs.getString("PUBLISH_ID");
- this.feedid = rs.getInt("FEEDID");
- this.requestUri = rs.getString("REQURI");
- this.method = rs.getString("METHOD");
- this.contentType = rs.getString("CONTENT_TYPE");
- this.contentLength = rs.getLong("CONTENT_LENGTH");
- }
- protected Date parseDate(final String s) throws ParseException {
- int[] n = new int[7];
- int p = 0;
- for (int i = 0; i < s.length(); i++) {
- char c = s.charAt(i);
- if (c < '0' || c > '9') {
- p++;
- } else {
- if (p > n.length)
- throw new ParseException("parseDate()", 0);
- n[p] = (n[p] * 10) + (c - '0');
- }
- }
- if (p != 7)
- throw new ParseException("parseDate()", 1);
- Calendar cal = new GregorianCalendar();
- cal.set(Calendar.YEAR, n[0]);
- cal.set(Calendar.MONTH, n[1]-1);
- cal.set(Calendar.DAY_OF_MONTH, n[2]);
- cal.set(Calendar.HOUR_OF_DAY, n[3]);
- cal.set(Calendar.MINUTE, n[4]);
- cal.set(Calendar.SECOND, n[5]);
- cal.set(Calendar.MILLISECOND, n[6]);
- return cal.getTime();
- }
- public long getEventTime() {
- return eventTime;
- }
- public void setEventTime(long eventTime) {
- this.eventTime = eventTime;
- }
- public String getPublishId() {
- return publishId;
- }
- public void setPublishId(String publishId) {
- this.publishId = publishId;
- }
- public int getFeedid() {
- return feedid;
- }
- public void setFeedid(int feedid) {
- this.feedid = feedid;
- }
- public String getRequestUri() {
- return requestUri;
- }
- public void setRequestUri(String requestUri) {
- this.requestUri = requestUri;
- }
- public String getMethod() {
- return method;
- }
- public void setMethod(String method) {
- this.method = method;
- }
- public String getContentType() {
- return contentType;
- }
- public void setContentType(String contentType) {
- this.contentType = contentType;
- }
- public long getContentLength() {
- return contentLength;
- }
- public void setContentLength(long contentLength) {
- this.contentLength = contentLength;
- }
- @Override
- public LOGJSONObject asJSONObject() {
- LOGJSONObject jo = new LOGJSONObject();
- String t = "";
- synchronized (sdf) {
- t = sdf.format(eventTime);
- }
- jo.put("date", t);
- jo.put("publishId", publishId);
- jo.put("requestURI", requestUri);
- jo.put("method", method);
- if (method.equals("PUT")) {
- jo.put("contentType", contentType);
- jo.put("contentLength", contentLength);
- }
- return jo;
- }
- @Override
- public void load(PreparedStatement ps) throws SQLException {
- ps.setLong (2, getEventTime());
- ps.setString(3, getPublishId());
- ps.setInt (4, getFeedid());
- ps.setString(5, getRequestUri());
- ps.setString(6, getMethod());
- ps.setString(7, getContentType());
- ps.setLong (8, getContentLength());
- }
+ protected BaseLogRecord(String[] pp) throws ParseException {
+// This throws exceptions occasionally - don't know why.
+// Date d = null;
+// synchronized (sdf) {
+// d = sdf.parse(pp[0]);
+// }
+ Date d = parseDate(pp[0]);
+ this.eventTime = d.getTime();
+ this.publishId = pp[2];
+ this.feedid = Integer.parseInt(pp[3]);
+ if (pp[1].equals("DLX")) {
+ this.requestUri = "";
+ this.method = "GET"; // Note: we need a valid value in this field, even though unused
+ this.contentType = "";
+ this.contentLength = Long.parseLong(pp[5]);
+ } else if (pp[1].equals("PUB") || pp[1].equals("LOG") || pp[1].equals("PBF")) {
+ this.requestUri = pp[4];
+ this.method = pp[5];
+ this.contentType = pp[6];
+ this.contentLength = Long.parseLong(pp[7]);
+ } else {
+ this.requestUri = pp[5];
+ this.method = pp[6];
+ this.contentType = pp[7];
+ this.contentLength = Long.parseLong(pp[8]);
+ }
+ }
+ protected BaseLogRecord(ResultSet rs) throws SQLException {
+ this.eventTime = rs.getLong("EVENT_TIME");
+ this.publishId = rs.getString("PUBLISH_ID");
+ this.feedid = rs.getInt("FEEDID");
+ this.requestUri = rs.getString("REQURI");
+ this.method = rs.getString("METHOD");
+ this.contentType = rs.getString("CONTENT_TYPE");
+ this.contentLength = rs.getLong("CONTENT_LENGTH");
+ }
+ protected Date parseDate(final String s) throws ParseException {
+ int[] n = new int[7];
+ int p = 0;
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ if (c < '0' || c > '9') {
+ p++;
+ } else {
+ if (p > n.length)
+ throw new ParseException("parseDate()", 0);
+ n[p] = (n[p] * 10) + (c - '0');
+ }
+ }
+ if (p != 7)
+ throw new ParseException("parseDate()", 1);
+ Calendar cal = new GregorianCalendar();
+ cal.set(Calendar.YEAR, n[0]);
+ cal.set(Calendar.MONTH, n[1]-1);
+ cal.set(Calendar.DAY_OF_MONTH, n[2]);
+ cal.set(Calendar.HOUR_OF_DAY, n[3]);
+ cal.set(Calendar.MINUTE, n[4]);
+ cal.set(Calendar.SECOND, n[5]);
+ cal.set(Calendar.MILLISECOND, n[6]);
+ return cal.getTime();
+ }
+ public long getEventTime() {
+ return eventTime;
+ }
+ public void setEventTime(long eventTime) {
+ this.eventTime = eventTime;
+ }
+ public String getPublishId() {
+ return publishId;
+ }
+ public void setPublishId(String publishId) {
+ this.publishId = publishId;
+ }
+ public int getFeedid() {
+ return feedid;
+ }
+ public void setFeedid(int feedid) {
+ this.feedid = feedid;
+ }
+ public String getRequestUri() {
+ return requestUri;
+ }
+ public void setRequestUri(String requestUri) {
+ this.requestUri = requestUri;
+ }
+ public String getMethod() {
+ return method;
+ }
+ public void setMethod(String method) {
+ this.method = method;
+ }
+ public String getContentType() {
+ return contentType;
+ }
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+ public long getContentLength() {
+ return contentLength;
+ }
+ public void setContentLength(long contentLength) {
+ this.contentLength = contentLength;
+ }
+ @Override
+ public LOGJSONObject asJSONObject() {
+ LOGJSONObject jo = new LOGJSONObject();
+ String t = "";
+ synchronized (sdf) {
+ t = sdf.format(eventTime);
+ }
+ jo.put("date", t);
+ jo.put("publishId", publishId);
+ jo.put("requestURI", requestUri);
+ jo.put("method", method);
+ if (method.equals("PUT")) {
+ jo.put("contentType", contentType);
+ jo.put("contentLength", contentLength);
+ }
+ return jo;
+ }
+ @Override
+ public void load(PreparedStatement ps) throws SQLException {
+ ps.setLong (2, getEventTime());
+ ps.setString(3, getPublishId());
+ ps.setInt (4, getFeedid());
+ ps.setString(5, getRequestUri());
+ ps.setString(6, getMethod());
+ ps.setString(7, getContentType());
+ ps.setLong (8, getContentLength());
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Deleteable.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Deleteable.java
index bec29ac2..a485312c 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Deleteable.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Deleteable.java
@@ -7,9 +7,9 @@
* * 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.
@@ -32,10 +32,10 @@ import java.sql.Connection;
* @version $Id: Deleteable.java,v 1.2 2013/05/29 14:44:36 eby Exp $
*/
public interface Deleteable {
- /**
- * Delete this object in the DB.
- * @param c the JDBC Connection to use
- * @return true if the DELETE succeeded, false otherwise
- */
- public boolean doDelete(Connection c);
+ /**
+ * Delete this object in the DB.
+ * @param c the JDBC Connection to use
+ * @return true if the DELETE succeeded, false otherwise
+ */
+ public boolean doDelete(Connection c);
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryExtraRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryExtraRecord.java
index bf7ead66..5aa51302 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryExtraRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryExtraRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -36,33 +36,33 @@ import java.text.ParseException;
* @version $Id: DeliveryExtraRecord.java,v 1.1 2013/10/28 18:06:52 eby Exp $
*/
public class DeliveryExtraRecord extends BaseLogRecord {
- private int subid;
- private long contentLength2;
+ private int subid;
+ private long contentLength2;
- public DeliveryExtraRecord(String[] pp) throws ParseException {
- super(pp);
- this.subid = Integer.parseInt(pp[4]);
- this.contentLength2 = Long.parseLong(pp[6]);
- }
- public DeliveryExtraRecord(ResultSet rs) throws SQLException {
- super(rs);
- // Note: because this record should be "rare" these fields are mapped to unconventional fields in the DB
- this.subid = rs.getInt("DELIVERY_SUBID");
- this.contentLength2 = rs.getInt("CONTENT_LENGTH_2");
- }
- @Override
- public void load(PreparedStatement ps) throws SQLException {
- ps.setString(1, "dlx"); // field 1: type
- super.load(ps); // loads fields 2-8
- ps.setNull( 9, Types.VARCHAR);
- ps.setNull(10, Types.VARCHAR);
- ps.setNull(11, Types.VARCHAR);
- ps.setNull(12, Types.INTEGER);
- ps.setInt (13, subid);
- ps.setNull(14, Types.VARCHAR);
- ps.setNull(15, Types.INTEGER);
- ps.setNull(16, Types.INTEGER);
- ps.setNull(17, Types.VARCHAR);
- ps.setLong(19, contentLength2);
- }
+ public DeliveryExtraRecord(String[] pp) throws ParseException {
+ super(pp);
+ this.subid = Integer.parseInt(pp[4]);
+ this.contentLength2 = Long.parseLong(pp[6]);
+ }
+ public DeliveryExtraRecord(ResultSet rs) throws SQLException {
+ super(rs);
+ // Note: because this record should be "rare" these fields are mapped to unconventional fields in the DB
+ this.subid = rs.getInt("DELIVERY_SUBID");
+ this.contentLength2 = rs.getInt("CONTENT_LENGTH_2");
+ }
+ @Override
+ public void load(PreparedStatement ps) throws SQLException {
+ ps.setString(1, "dlx"); // field 1: type
+ super.load(ps); // loads fields 2-8
+ ps.setNull( 9, Types.VARCHAR);
+ ps.setNull(10, Types.VARCHAR);
+ ps.setNull(11, Types.VARCHAR);
+ ps.setNull(12, Types.INTEGER);
+ ps.setInt (13, subid);
+ ps.setNull(14, Types.VARCHAR);
+ ps.setNull(15, Types.INTEGER);
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setLong(19, contentLength2);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryRecord.java
index 000f4700..aa7f5d0b 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/DeliveryRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -36,103 +36,114 @@ import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;
/**
* The representation of a Delivery Record, as retrieved from the DB.
+ *
* @author Robert Eby
* @version $Id: DeliveryRecord.java,v 1.9 2014/03/12 19:45:41 eby Exp $
*/
public class DeliveryRecord extends BaseLogRecord {
- private int subid;
- private String fileid;
- private int result;
- private String user;
-
- public DeliveryRecord(String[] pp) throws ParseException {
- super(pp);
- String fileid = pp[5];
- if (fileid.lastIndexOf('/') >= 0)
- fileid = fileid.substring(fileid.lastIndexOf('/')+1);
- this.subid = Integer.parseInt(pp[4]);
- this.fileid = fileid;
- this.result = Integer.parseInt(pp[10]);
- this.user = pp[9];
- if (this.user != null && this.user.length() > 50)
- this.user = this.user.substring(0, 50);
- }
- public DeliveryRecord(ResultSet rs) throws SQLException {
- super(rs);
- this.subid = rs.getInt("DELIVERY_SUBID");
- this.fileid = rs.getString("DELIVERY_FILEID");
- this.result = rs.getInt("RESULT");
- this.user = rs.getString("USER");
- }
- public int getSubid() {
- return subid;
- }
- public void setSubid(int subid) {
- this.subid = subid;
- }
- public String getFileid() {
- return fileid;
- }
- public void setFileid(String fileid) {
- this.fileid = fileid;
- }
- public int getResult() {
- return result;
- }
- public void setResult(int result) {
- this.result = result;
- }
- public String getUser() {
- return user;
- }
- public void setUser(String user) {
- this.user = user;
- }
-
-
- public LOGJSONObject reOrderObject(LOGJSONObject jo) {
- LinkedHashMap<String,Object> logrecordObj = new LinkedHashMap<String,Object>();
-
- logrecordObj.put("statusCode", jo.get("statusCode"));
- logrecordObj.put("deliveryId", jo.get("deliveryId"));
- logrecordObj.put("publishId", jo.get("publishId"));
- logrecordObj.put("requestURI", jo.get("requestURI"));
- //logrecordObj.put("sourceIP", jo.get("sourceIP"));
- logrecordObj.put("method", jo.get("method"));
- logrecordObj.put("contentType", jo.get("contentType"));
- //logrecordObj.put("endpointId", jo.get("endpointId"));
- logrecordObj.put("type", jo.get("type"));
- logrecordObj.put("date", jo.get("date"));
- logrecordObj.put("contentLength", jo.get("contentLength"));
-
-
- LOGJSONObject newjo = new LOGJSONObject(logrecordObj);
- return newjo;
- }
-
- @Override
- public LOGJSONObject asJSONObject() {
- LOGJSONObject jo = super.asJSONObject();
- jo.put("type", "del");
- jo.put("deliveryId", user);
- jo.put("statusCode", result);
-
- LOGJSONObject newjo = this.reOrderObject(jo);
- return newjo;
- }
- @Override
- public void load(PreparedStatement ps) throws SQLException {
- ps.setString(1, "del"); // field 1: type
- super.load(ps); // loads fields 2-8
- ps.setNull (9, Types.VARCHAR);
- ps.setNull (10, Types.VARCHAR);
- ps.setString(11, getUser());
- ps.setNull (12, Types.INTEGER);
- ps.setInt (13, getSubid());
- ps.setString(14, getFileid());
- ps.setInt (15, getResult());
- ps.setNull (16, Types.INTEGER);
- ps.setNull (17, Types.VARCHAR);
- ps.setNull (19, Types.BIGINT);
- }
+ private int subid;
+ private String fileid;
+ private int result;
+ private String user;
+
+ public DeliveryRecord(String[] pp) throws ParseException {
+ super(pp);
+ String fileid = pp[5];
+ if (fileid.lastIndexOf('/') >= 0)
+ fileid = fileid.substring(fileid.lastIndexOf('/') + 1);
+ this.subid = Integer.parseInt(pp[4]);
+ this.fileid = fileid;
+ this.result = Integer.parseInt(pp[10]);
+ this.user = pp[9];
+ if (this.user != null && this.user.length() > 50)
+ this.user = this.user.substring(0, 50);
+ }
+
+ public DeliveryRecord(ResultSet rs) throws SQLException {
+ super(rs);
+ this.subid = rs.getInt("DELIVERY_SUBID");
+ this.fileid = rs.getString("DELIVERY_FILEID");
+ this.result = rs.getInt("RESULT");
+ this.user = rs.getString("USER");
+ }
+
+ public int getSubid() {
+ return subid;
+ }
+
+ public void setSubid(int subid) {
+ this.subid = subid;
+ }
+
+ public String getFileid() {
+ return fileid;
+ }
+
+ public void setFileid(String fileid) {
+ this.fileid = fileid;
+ }
+
+ public int getResult() {
+ return result;
+ }
+
+ public void setResult(int result) {
+ this.result = result;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+
+ public LOGJSONObject reOrderObject(LOGJSONObject jo) {
+ LinkedHashMap<String, Object> logrecordObj = new LinkedHashMap<String, Object>();
+
+ logrecordObj.put("statusCode", jo.get("statusCode"));
+ logrecordObj.put("deliveryId", jo.get("deliveryId"));
+ logrecordObj.put("publishId", jo.get("publishId"));
+ logrecordObj.put("requestURI", jo.get("requestURI"));
+ //logrecordObj.put("sourceIP", jo.get("sourceIP"));
+ logrecordObj.put("method", jo.get("method"));
+ logrecordObj.put("contentType", jo.get("contentType"));
+ //logrecordObj.put("endpointId", jo.get("endpointId"));
+ logrecordObj.put("type", jo.get("type"));
+ logrecordObj.put("date", jo.get("date"));
+ logrecordObj.put("contentLength", jo.get("contentLength"));
+
+
+ LOGJSONObject newjo = new LOGJSONObject(logrecordObj);
+ return newjo;
+ }
+
+ @Override
+ public LOGJSONObject asJSONObject() {
+ LOGJSONObject jo = super.asJSONObject();
+ jo.put("type", "del");
+ jo.put("deliveryId", user);
+ jo.put("statusCode", result);
+
+ LOGJSONObject newjo = this.reOrderObject(jo);
+ return newjo;
+ }
+
+ @Override
+ public void load(PreparedStatement ps) throws SQLException {
+ ps.setString(1, "del"); // field 1: type
+ super.load(ps); // loads fields 2-8
+ ps.setNull(9, Types.VARCHAR);
+ ps.setNull(10, Types.VARCHAR);
+ ps.setString(11, getUser());
+ ps.setNull(12, Types.INTEGER);
+ ps.setInt(13, getSubid());
+ ps.setString(14, getFileid());
+ ps.setInt(15, getResult());
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setNull(19, Types.BIGINT);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EgressRoute.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EgressRoute.java
index 8c8b715c..fa23fa1c 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EgressRoute.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EgressRoute.java
@@ -7,9 +7,9 @@
* * 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.
@@ -43,184 +43,187 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: EgressRoute.java,v 1.3 2013/12/16 20:30:23 eby Exp $
*/
public class EgressRoute extends NodeClass implements Comparable<EgressRoute> {
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private final int subid;
- private final int nodeid;
-
- /**
- * Get a set of all Egress Routes in the DB. The set is sorted according to the natural sorting order
- * of the routes (based on the subscription ID in each route).
- * @return the sorted set
- */
- public static SortedSet<EgressRoute> getAllEgressRoutes() {
- SortedSet<EgressRoute> set = new TreeSet<EgressRoute>();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select SUBID, NODEID from EGRESS_ROUTES");
- while (rs.next()) {
- int subid = rs.getInt("SUBID");
- int nodeid = rs.getInt("NODEID");
- set.add(new EgressRoute(subid, nodeid));
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return set;
- }
- /**
- * Get a single Egress Route for the subscription <i>sub</i>.
- * @param sub the subscription to lookup
- * @return an EgressRoute, or null if there is no route for this subscription
- */
- public static EgressRoute getEgressRoute(int sub) {
- EgressRoute v = null;
- PreparedStatement ps = null;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- String sql = "select NODEID from EGRESS_ROUTES where SUBID = ?";
- ps = conn.prepareStatement(sql);
- ps.setInt(1, sub);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- int node = rs.getInt("NODEID");
- v = new EgressRoute(sub, node);
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return v;
- }
-
- public EgressRoute(int subid, int nodeid) throws IllegalArgumentException {
- this.subid = subid;
- this.nodeid = nodeid;
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private final int subid;
+ private final int nodeid;
+
+ /**
+ * Get a set of all Egress Routes in the DB. The set is sorted according to the natural sorting order
+ * of the routes (based on the subscription ID in each route).
+ *
+ * @return the sorted set
+ */
+ public static SortedSet<EgressRoute> getAllEgressRoutes() {
+ SortedSet<EgressRoute> set = new TreeSet<EgressRoute>();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select SUBID, NODEID from EGRESS_ROUTES");
+ while (rs.next()) {
+ int subid = rs.getInt("SUBID");
+ int nodeid = rs.getInt("NODEID");
+ set.add(new EgressRoute(subid, nodeid));
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return set;
+ }
+
+ /**
+ * Get a single Egress Route for the subscription <i>sub</i>.
+ *
+ * @param sub the subscription to lookup
+ * @return an EgressRoute, or null if there is no route for this subscription
+ */
+ public static EgressRoute getEgressRoute(int sub) {
+ EgressRoute v = null;
+ PreparedStatement ps = null;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ String sql = "select NODEID from EGRESS_ROUTES where SUBID = ?";
+ ps = conn.prepareStatement(sql);
+ ps.setInt(1, sub);
+ ResultSet rs = ps.executeQuery();
+ if (rs.next()) {
+ int node = rs.getInt("NODEID");
+ v = new EgressRoute(sub, node);
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return v;
+ }
+
+ public EgressRoute(int subid, int nodeid) throws IllegalArgumentException {
+ this.subid = subid;
+ this.nodeid = nodeid;
// Note: unlike for Feeds, it subscriptions can be removed from the tables, so it is
// possible that an orphan ERT entry can exist if a sub is removed.
-// if (Subscription.getSubscriptionById(subid) == null)
-// throw new IllegalArgumentException("No such subscription: "+subid);
- }
-
- public EgressRoute(int subid, String node) throws IllegalArgumentException {
- this(subid, lookupNodeName(node));
- }
-
- @Override
- public boolean doDelete(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "delete from EGRESS_ROUTES where SUBID = ?";
- ps = c.prepareStatement(sql);
- ps.setInt(1, subid);
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- @Override
- public boolean doInsert(Connection c) {
- boolean rv = false;
- PreparedStatement ps = null;
- try {
- // Create the NETWORK_ROUTES row
- String sql = "insert into EGRESS_ROUTES (SUBID, NODEID) values (?, ?)";
- ps = c.prepareStatement(sql);
- ps.setInt(1, this.subid);
- ps.setInt(2, this.nodeid);
- ps.execute();
- ps.close();
- rv = true;
- } catch (SQLException e) {
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- @Override
- public boolean doUpdate(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "update EGRESS_ROUTES set NODEID = ? where SUBID = ?";
- ps = c.prepareStatement(sql);
- ps.setInt(1, nodeid);
- ps.setInt(2, subid);
- ps.executeUpdate();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put(""+subid, lookupNodeID(nodeid));
- return jo;
- }
-
- @Override
- public String getKey() {
- return ""+subid;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof EgressRoute))
- return false;
- EgressRoute on = (EgressRoute)obj;
- return (subid == on.subid) && (nodeid == on.nodeid);
- }
-
- @Override
- public int compareTo(EgressRoute o) {
- return this.subid - o.subid;
- }
-
- @Override
- public String toString() {
- return String.format("EGRESS: sub=%d, node=%d", subid, nodeid);
- }
+// if (Subscription.getSubscriptionById(subid) == null)
+// throw new IllegalArgumentException("No such subscription: "+subid);
+ }
+
+ public EgressRoute(int subid, String node) throws IllegalArgumentException {
+ this(subid, lookupNodeName(node));
+ }
+
+ @Override
+ public boolean doDelete(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "delete from EGRESS_ROUTES where SUBID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, subid);
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doInsert(Connection c) {
+ boolean rv = false;
+ PreparedStatement ps = null;
+ try {
+ // Create the NETWORK_ROUTES row
+ String sql = "insert into EGRESS_ROUTES (SUBID, NODEID) values (?, ?)";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, this.subid);
+ ps.setInt(2, this.nodeid);
+ ps.execute();
+ ps.close();
+ rv = true;
+ } catch (SQLException e) {
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doUpdate(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "update EGRESS_ROUTES set NODEID = ? where SUBID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, nodeid);
+ ps.setInt(2, subid);
+ ps.executeUpdate();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("" + subid, lookupNodeID(nodeid));
+ return jo;
+ }
+
+ @Override
+ public String getKey() {
+ return "" + subid;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof EgressRoute))
+ return false;
+ EgressRoute on = (EgressRoute) obj;
+ return (subid == on.subid) && (nodeid == on.nodeid);
+ }
+
+ @Override
+ public int compareTo(EgressRoute o) {
+ return this.subid - o.subid;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("EGRESS: sub=%d, node=%d", subid, nodeid);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EventLogRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EventLogRecord.java
index 4069c4c2..b8a3aa53 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EventLogRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/EventLogRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -41,44 +41,47 @@ import org.onap.dmaap.datarouter.provisioning.BaseServlet;
* @version $Id: EventLogRecord.java,v 1.1 2013/04/26 21:00:25 eby Exp $
*/
public class EventLogRecord {
- private final String ipaddr; // Who
- private final String behalfof;
- private final String clientSubject;
- private final String method; // What
- private final String servlet;
- private int result; // How
- private String message;
+ private final String ipaddr; // Who
+ private final String behalfof;
+ private final String clientSubject;
+ private final String method; // What
+ private final String servlet;
+ private int result; // How
+ private String message;
+
+ public EventLogRecord(HttpServletRequest request) {
+ // Who is making the request
+ this.ipaddr = request.getRemoteAddr();
+ String s = request.getHeader(BaseServlet.BEHALF_HEADER);
+ this.behalfof = (s != null) ? s : "";
+ X509Certificate certs[] = (X509Certificate[]) request.getAttribute(BaseServlet.CERT_ATTRIBUTE);
+ this.clientSubject = (certs != null && certs.length > 0)
+ ? certs[0].getSubjectX500Principal().getName() : "";
+
+ // What is the request
+ this.method = request.getMethod();
+ this.servlet = request.getServletPath();
+
+ // How was it dealt with
+ this.result = -1;
+ this.message = "";
+ }
- public EventLogRecord(HttpServletRequest request) {
- // Who is making the request
- this.ipaddr = request.getRemoteAddr();
- String s = request.getHeader(BaseServlet.BEHALF_HEADER);
- this.behalfof = (s != null) ? s : "";
- X509Certificate certs[] = (X509Certificate[]) request.getAttribute(BaseServlet.CERT_ATTRIBUTE);
- this.clientSubject = (certs != null && certs.length > 0)
- ? certs[0].getSubjectX500Principal().getName() : "";
+ public void setResult(int result) {
+ this.result = result;
+ }
- // What is the request
- this.method = request.getMethod();
- this.servlet = request.getServletPath();
+ public void setMessage(String message) {
+ this.message = message;
+ }
- // How was it dealt with
- this.result = -1;
- this.message = "";
- }
- public void setResult(int result) {
- this.result = result;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- @Override
- public String toString() {
- return String.format(
- "%s %s \"%s\" %s %s %d \"%s\"",
- ipaddr, behalfof, clientSubject,
- method, servlet,
- result, message
- );
- }
+ @Override
+ public String toString() {
+ return String.format(
+ "%s %s \"%s\" %s %s %d \"%s\"",
+ ipaddr, behalfof, clientSubject,
+ method, servlet,
+ result, message
+ );
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/ExpiryRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/ExpiryRecord.java
index bfe63e46..3f85aec6 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/ExpiryRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/ExpiryRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -36,107 +36,110 @@ import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;
/**
* The representation of a Expiry Record, as retrieved from the DB.
+ *
* @author Robert Eby
* @version $Id: ExpiryRecord.java,v 1.4 2013/10/28 18:06:52 eby Exp $
*/
public class ExpiryRecord extends BaseLogRecord {
- private int subid;
- private String fileid;
- private int attempts;
- private String reason;
-
- public ExpiryRecord(String[] pp) throws ParseException {
- super(pp);
- String fileid = pp[5];
- if (fileid.lastIndexOf('/') >= 0)
- fileid = fileid.substring(fileid.lastIndexOf('/')+1);
- this.subid = Integer.parseInt(pp[4]);
- this.fileid = fileid;
- this.attempts = Integer.parseInt(pp[10]);
- this.reason = pp[9];
- if (!reason.equals("notRetryable") && !reason.equals("retriesExhausted") && !reason.equals("diskFull"))
- this.reason = "other";
- }
- public ExpiryRecord(ResultSet rs) throws SQLException {
- super(rs);
- this.subid = rs.getInt("DELIVERY_SUBID");
- this.fileid = rs.getString("DELIVERY_FILEID");
- this.attempts = rs.getInt("ATTEMPTS");
- this.reason = rs.getString("REASON");
- }
-
- public int getSubid() {
- return subid;
- }
-
- public void setSubid(int subid) {
- this.subid = subid;
- }
-
- public String getFileid() {
- return fileid;
- }
-
- public void setFileid(String fileid) {
- this.fileid = fileid;
- }
-
- public int getAttempts() {
- return attempts;
- }
-
- public void setAttempts(int attempts) {
- this.attempts = attempts;
- }
-
- public String getReason() {
- return reason;
- }
-
- public void setReason(String reason) {
- this.reason = reason;
- }
-
- public LOGJSONObject reOrderObject(LOGJSONObject jo) {
- LinkedHashMap<String,Object> logrecordObj = new LinkedHashMap<String,Object>();
-
- logrecordObj.put("expiryReason", jo.get("expiryReason"));
- logrecordObj.put("publishId", jo.get("publishId"));
- logrecordObj.put("attempts", jo.get("attempts"));
- logrecordObj.put("requestURI", jo.get("requestURI"));
- logrecordObj.put("method", jo.get("method"));
- logrecordObj.put("contentType", jo.get("contentType"));
- logrecordObj.put("type", jo.get("type"));
- logrecordObj.put("date", jo.get("date"));
- logrecordObj.put("contentLength", jo.get("contentLength"));
-
- LOGJSONObject newjo = new LOGJSONObject(logrecordObj);
- return newjo;
- }
-
- @Override
- public LOGJSONObject asJSONObject() {
- LOGJSONObject jo = super.asJSONObject();
- jo.put("type", "exp");
- jo.put("expiryReason", reason);
- jo.put("attempts", attempts);
-
- LOGJSONObject newjo = this.reOrderObject(jo);
- return newjo;
- }
- @Override
- public void load(PreparedStatement ps) throws SQLException {
- ps.setString(1, "exp"); // field 1: type
- super.load(ps); // loads fields 2-8
- ps.setNull (9, Types.VARCHAR);
- ps.setNull (10, Types.VARCHAR);
- ps.setNull (11, Types.VARCHAR);
- ps.setNull (12, Types.INTEGER);
- ps.setInt (13, getSubid());
- ps.setString(14, getFileid());
- ps.setNull (15, Types.INTEGER);
- ps.setInt (16, getAttempts());
- ps.setString(17, getReason());
- ps.setNull (19, Types.BIGINT);
- }
+ private int subid;
+ private String fileid;
+ private int attempts;
+ private String reason;
+
+ public ExpiryRecord(String[] pp) throws ParseException {
+ super(pp);
+ String fileid = pp[5];
+ if (fileid.lastIndexOf('/') >= 0)
+ fileid = fileid.substring(fileid.lastIndexOf('/') + 1);
+ this.subid = Integer.parseInt(pp[4]);
+ this.fileid = fileid;
+ this.attempts = Integer.parseInt(pp[10]);
+ this.reason = pp[9];
+ if (!reason.equals("notRetryable") && !reason.equals("retriesExhausted") && !reason.equals("diskFull"))
+ this.reason = "other";
+ }
+
+ public ExpiryRecord(ResultSet rs) throws SQLException {
+ super(rs);
+ this.subid = rs.getInt("DELIVERY_SUBID");
+ this.fileid = rs.getString("DELIVERY_FILEID");
+ this.attempts = rs.getInt("ATTEMPTS");
+ this.reason = rs.getString("REASON");
+ }
+
+ public int getSubid() {
+ return subid;
+ }
+
+ public void setSubid(int subid) {
+ this.subid = subid;
+ }
+
+ public String getFileid() {
+ return fileid;
+ }
+
+ public void setFileid(String fileid) {
+ this.fileid = fileid;
+ }
+
+ public int getAttempts() {
+ return attempts;
+ }
+
+ public void setAttempts(int attempts) {
+ this.attempts = attempts;
+ }
+
+ public String getReason() {
+ return reason;
+ }
+
+ public void setReason(String reason) {
+ this.reason = reason;
+ }
+
+ public LOGJSONObject reOrderObject(LOGJSONObject jo) {
+ LinkedHashMap<String, Object> logrecordObj = new LinkedHashMap<String, Object>();
+
+ logrecordObj.put("expiryReason", jo.get("expiryReason"));
+ logrecordObj.put("publishId", jo.get("publishId"));
+ logrecordObj.put("attempts", jo.get("attempts"));
+ logrecordObj.put("requestURI", jo.get("requestURI"));
+ logrecordObj.put("method", jo.get("method"));
+ logrecordObj.put("contentType", jo.get("contentType"));
+ logrecordObj.put("type", jo.get("type"));
+ logrecordObj.put("date", jo.get("date"));
+ logrecordObj.put("contentLength", jo.get("contentLength"));
+
+ LOGJSONObject newjo = new LOGJSONObject(logrecordObj);
+ return newjo;
+ }
+
+ @Override
+ public LOGJSONObject asJSONObject() {
+ LOGJSONObject jo = super.asJSONObject();
+ jo.put("type", "exp");
+ jo.put("expiryReason", reason);
+ jo.put("attempts", attempts);
+
+ LOGJSONObject newjo = this.reOrderObject(jo);
+ return newjo;
+ }
+
+ @Override
+ public void load(PreparedStatement ps) throws SQLException {
+ ps.setString(1, "exp"); // field 1: type
+ super.load(ps); // loads fields 2-8
+ ps.setNull(9, Types.VARCHAR);
+ ps.setNull(10, Types.VARCHAR);
+ ps.setNull(11, Types.VARCHAR);
+ ps.setNull(12, Types.INTEGER);
+ ps.setInt(13, getSubid());
+ ps.setString(14, getFileid());
+ ps.setNull(15, Types.INTEGER);
+ ps.setInt(16, getAttempts());
+ ps.setString(17, getReason());
+ ps.setNull(19, Types.BIGINT);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Feed.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Feed.java
index 9cc2beee..852321a9 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Feed.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Feed.java
@@ -7,9 +7,9 @@
* * 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.
@@ -47,713 +47,746 @@ import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
/**
* The representation of a Feed. Feeds can be retrieved from the DB, or stored/updated in the DB.
+ *
* @author Robert Eby
* @version $Id: Feed.java,v 1.13 2013/10/28 18:06:52 eby Exp $
*/
public class Feed extends Syncable {
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private static int next_feedid = getMaxFeedID() + 1;
-
- private int feedid;
- private int groupid; //New field is added - Groups feature Rally:US708115 - 1610
- private String name;
- private String version;
- private String description;
- private String business_description; // New field is added - Groups feature Rally:US708102 - 1610
- private FeedAuthorization authorization;
- private String publisher;
- private FeedLinks links;
- private boolean deleted;
- private boolean suspended;
- private Date last_mod;
- private Date created_date;
-
- /**
- * Check if a feed ID is valid.
- * @param id the Feed ID
- * @return true if it is valid
- */
- @SuppressWarnings("resource")
- public static boolean isFeedValid(int id) {
- int count = 0;
- try {
- DB db = new DB();
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select COUNT(*) from FEEDS where FEEDID = " + id);
- if (rs.next()) {
- count = rs.getInt(1);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return count != 0;
- }
- /**
- * Get a specific feed from the DB, based upon its ID.
- * @param id the Feed ID
- * @return the Feed object, or null if it does not exist
- */
- public static Feed getFeedById(int id) {
- String sql = "select * from FEEDS where FEEDID = " + id;
- return getFeedBySQL(sql);
- }
- /**
- * Get a specific feed from the DB, based upon its name and version.
- * @param name the name of the Feed
- * @param version the version of the Feed
- * @return the Feed object, or null if it does not exist
- */
- public static Feed getFeedByNameVersion(String name, String version) {
- name = name.replaceAll("'", "''");
- version = version.replaceAll("'", "''");
- String sql = "select * from FEEDS where NAME = '" + name + "' and VERSION ='" + version + "'";
- return getFeedBySQL(sql);
- }
- /**
- * Return a count of the number of active feeds in the DB.
- * @return the count
- */
- public static int countActiveFeeds() {
- int count = 0;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select count(*) from FEEDS where DELETED = 0");
- if (rs.next()) {
- count = rs.getInt(1);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- intlogger.info("countActiveFeeds: "+e.getMessage());
- e.printStackTrace();
- }
- return count;
- }
- public static int getMaxFeedID() {
- int max = 0;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select MAX(feedid) from FEEDS");
- if (rs.next()) {
- max = rs.getInt(1);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- intlogger.info("getMaxFeedID: "+e.getMessage());
- e.printStackTrace();
- }
- return max;
- }
- public static Collection<Feed> getAllFeeds() {
- Map<Integer, Feed> map = new HashMap<Integer, Feed>();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select * from FEEDS");
- while (rs.next()) {
- Feed feed = new Feed(rs);
- map.put(feed.getFeedid(), feed);
- }
- rs.close();
-
- String sql = "select * from FEED_ENDPOINT_IDS";
- rs = stmt.executeQuery(sql);
- while (rs.next()) {
- int id = rs.getInt("FEEDID");
- Feed feed = map.get(id);
- if (feed != null) {
- FeedEndpointID epi = new FeedEndpointID(rs);
- Collection<FeedEndpointID> ecoll = feed.getAuthorization().getEndpoint_ids();
- ecoll.add(epi);
- }
- }
- rs.close();
-
- sql = "select * from FEED_ENDPOINT_ADDRS";
- rs = stmt.executeQuery(sql);
- while (rs.next()) {
- int id = rs.getInt("FEEDID");
- Feed feed = map.get(id);
- if (feed != null) {
- Collection<String> acoll = feed.getAuthorization().getEndpoint_addrs();
- acoll.add(rs.getString("ADDR"));
- }
- }
- rs.close();
-
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return map.values();
- }
- public static List<String> getFilteredFeedUrlList(final String name, final String val) {
- List<String> list = new ArrayList<String>();
- String sql = "select SELF_LINK from FEEDS where DELETED = 0";
- if (name.equals("name")) {
- sql += " and NAME = ?";
- } else if (name.equals("publ")) {
- sql += " and PUBLISHER = ?";
- } else if (name.equals("subs")) {
- sql = "select distinct FEEDS.SELF_LINK from FEEDS, SUBSCRIPTIONS " +
- "where DELETED = 0 " +
- "and FEEDS.FEEDID = SUBSCRIPTIONS.FEEDID " +
- "and SUBSCRIPTIONS.SUBSCRIBER = ?";
- }
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement(sql);
- if (sql.indexOf('?') >= 0)
- ps.setString(1, val);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- String t = rs.getString(1);
- list.add(t.trim());
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return list;
- }
- @SuppressWarnings("resource")
- private static Feed getFeedBySQL(String sql) {
- Feed feed = null;
- try {
- DB db = new DB();
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- if (rs.next()) {
- feed = new Feed(rs);
- rs.close();
-
- sql = "select * from FEED_ENDPOINT_IDS where FEEDID = " + feed.feedid;
- rs = stmt.executeQuery(sql);
- Collection<FeedEndpointID> ecoll = feed.getAuthorization().getEndpoint_ids();
- while (rs.next()) {
- FeedEndpointID epi = new FeedEndpointID(rs);
- ecoll.add(epi);
- }
- rs.close();
-
- sql = "select * from FEED_ENDPOINT_ADDRS where FEEDID = " + feed.feedid;
- rs = stmt.executeQuery(sql);
- Collection<String> acoll = feed.getAuthorization().getEndpoint_addrs();
- while (rs.next()) {
- acoll.add(rs.getString("ADDR"));
- }
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return feed;
- }
-
- public Feed() {
- this("", "", "","");
- }
-
- public Feed(String name, String version, String desc,String business_description) {
- this.feedid = -1;
- this.groupid = -1; //New field is added - Groups feature Rally:US708115 - 1610
- this.name = name;
- this.version = version;
- this.description = desc;
- this.business_description=business_description; // New field is added - Groups feature Rally:US708102 - 1610
- this.authorization = new FeedAuthorization();
- this.publisher = "";
- this.links = new FeedLinks();
- this.deleted = false;
- this.suspended = false;
- this.last_mod = new Date();
- this.created_date = new Date();
- }
- public Feed(ResultSet rs) throws SQLException {
- this.feedid = rs.getInt("FEEDID");
- this.groupid = rs.getInt("GROUPID"); //New field is added - Groups feature Rally:US708115 - 1610
- this.name = rs.getString("NAME");
- this.version = rs.getString("VERSION");
- this.description = rs.getString("DESCRIPTION");
- this.business_description=rs.getString("BUSINESS_DESCRIPTION"); // New field is added - Groups feature Rally:US708102 - 1610
- this.authorization = new FeedAuthorization();
- this.authorization.setClassification(rs.getString("AUTH_CLASS"));
- this.publisher = rs.getString("PUBLISHER");
- this.links = new FeedLinks();
- this.links.setSelf(rs.getString("SELF_LINK"));
- this.links.setPublish(rs.getString("PUBLISH_LINK"));
- this.links.setSubscribe(rs.getString("SUBSCRIBE_LINK"));
- this.links.setLog(rs.getString("LOG_LINK"));
- this.deleted = rs.getBoolean("DELETED");
- this.suspended = rs.getBoolean("SUSPENDED");
- this.last_mod = rs.getDate("LAST_MOD");
- this.created_date = rs.getTimestamp("CREATED_DATE");
- }
- public Feed(JSONObject jo) throws InvalidObjectException {
- this("", "", "","");
- try {
- // The JSONObject is assumed to contain a vnd.att-dr.feed representation
- this.feedid = jo.optInt("feedid", -1);
- this.groupid = jo.optInt("groupid"); //New field is added - Groups feature Rally:US708115 - 1610
- this.name = jo.getString("name");
- if (name.length() > 255)
- throw new InvalidObjectException("name field is too long");
- this.version = jo.getString("version");
- if (version.length() > 20)
- throw new InvalidObjectException("version field is too long");
- this.description = jo.optString("description");
- this.business_description = jo.optString("business_description"); // New field is added - Groups feature Rally:US708102 - 1610
- if (description.length() > 1000)
- throw new InvalidObjectException("technical description field is too long");
-
- if (business_description.length() > 1000) // New field is added - Groups feature Rally:US708102 - 1610
- throw new InvalidObjectException("business description field is too long");
-
- this.authorization = new FeedAuthorization();
- JSONObject jauth = jo.getJSONObject("authorization");
- this.authorization.setClassification(jauth.getString("classification"));
- if (this.authorization.getClassification().length() > 32)
- throw new InvalidObjectException("classification field is too long");
- JSONArray ja = jauth.getJSONArray("endpoint_ids");
- for (int i = 0; i < ja.length(); i++) {
- JSONObject id = ja.getJSONObject(i);
- FeedEndpointID fid = new FeedEndpointID(id.getString("id"), id.getString("password"));
- if (fid.getId().length() > 20)
- throw new InvalidObjectException("id field is too long ("+fid.getId()+")");
- if (fid.getPassword().length() > 32)
- throw new InvalidObjectException("password field is too long ("+fid.getPassword()+")");
- this.authorization.getEndpoint_ids().add(fid);
- }
- if (this.authorization.getEndpoint_ids().size() < 1)
- throw new InvalidObjectException("need to specify at least one endpoint_id");
- ja = jauth.getJSONArray("endpoint_addrs");
- for (int i = 0; i < ja.length(); i++) {
- String addr = ja.getString(i);
- if (!JSONUtilities.validIPAddrOrSubnet(addr))
- throw new InvalidObjectException("bad IP addr or subnet mask: "+addr);
- this.authorization.getEndpoint_addrs().add(addr);
- }
-
- this.publisher = jo.optString("publisher", "");
- this.deleted = jo.optBoolean("deleted", false);
- this.suspended = jo.optBoolean("suspend", false);
- JSONObject jol = jo.optJSONObject("links");
- this.links = (jol == null) ? (new FeedLinks()) : (new FeedLinks(jol));
- } catch (InvalidObjectException e) {
- throw e;
- } catch (Exception e) {
- throw new InvalidObjectException("invalid JSON: "+e.getMessage());
- }
- }
- public int getFeedid() {
- return feedid;
- }
- public void setFeedid(int feedid) {
- this.feedid = feedid;
-
- // Create link URLs
- FeedLinks fl = getLinks();
- fl.setSelf(URLUtilities.generateFeedURL(feedid));
- fl.setPublish(URLUtilities.generatePublishURL(feedid));
- fl.setSubscribe(URLUtilities.generateSubscribeURL(feedid));
- fl.setLog(URLUtilities.generateFeedLogURL(feedid));
- }
-
- //new getter setters for groups- Rally:US708115 - 1610
- public int getGroupid() {
- return groupid;
- }
-
- public void setGroupid(int groupid) {
- this.groupid = groupid;
- }
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getVersion() {
- return version;
- }
- public void setVersion(String version) {
- this.version = version;
- }
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private static int next_feedid = getMaxFeedID() + 1;
+
+ private int feedid;
+ private int groupid; //New field is added - Groups feature Rally:US708115 - 1610
+ private String name;
+ private String version;
+ private String description;
+ private String business_description; // New field is added - Groups feature Rally:US708102 - 1610
+ private FeedAuthorization authorization;
+ private String publisher;
+ private FeedLinks links;
+ private boolean deleted;
+ private boolean suspended;
+ private Date last_mod;
+ private Date created_date;
+
+ /**
+ * Check if a feed ID is valid.
+ *
+ * @param id the Feed ID
+ * @return true if it is valid
+ */
+ @SuppressWarnings("resource")
+ public static boolean isFeedValid(int id) {
+ int count = 0;
+ try {
+ DB db = new DB();
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select COUNT(*) from FEEDS where FEEDID = " + id);
+ if (rs.next()) {
+ count = rs.getInt(1);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return count != 0;
+ }
+
+ /**
+ * Get a specific feed from the DB, based upon its ID.
+ *
+ * @param id the Feed ID
+ * @return the Feed object, or null if it does not exist
+ */
+ public static Feed getFeedById(int id) {
+ String sql = "select * from FEEDS where FEEDID = " + id;
+ return getFeedBySQL(sql);
+ }
+
+ /**
+ * Get a specific feed from the DB, based upon its name and version.
+ *
+ * @param name the name of the Feed
+ * @param version the version of the Feed
+ * @return the Feed object, or null if it does not exist
+ */
+ public static Feed getFeedByNameVersion(String name, String version) {
+ name = name.replaceAll("'", "''");
+ version = version.replaceAll("'", "''");
+ String sql = "select * from FEEDS where NAME = '" + name + "' and VERSION ='" + version + "'";
+ return getFeedBySQL(sql);
+ }
+
+ /**
+ * Return a count of the number of active feeds in the DB.
+ *
+ * @return the count
+ */
+ public static int countActiveFeeds() {
+ int count = 0;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select count(*) from FEEDS where DELETED = 0");
+ if (rs.next()) {
+ count = rs.getInt(1);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ intlogger.info("countActiveFeeds: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return count;
+ }
+
+ public static int getMaxFeedID() {
+ int max = 0;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select MAX(feedid) from FEEDS");
+ if (rs.next()) {
+ max = rs.getInt(1);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ intlogger.info("getMaxFeedID: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return max;
+ }
+
+ public static Collection<Feed> getAllFeeds() {
+ Map<Integer, Feed> map = new HashMap<Integer, Feed>();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select * from FEEDS");
+ while (rs.next()) {
+ Feed feed = new Feed(rs);
+ map.put(feed.getFeedid(), feed);
+ }
+ rs.close();
+
+ String sql = "select * from FEED_ENDPOINT_IDS";
+ rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ int id = rs.getInt("FEEDID");
+ Feed feed = map.get(id);
+ if (feed != null) {
+ FeedEndpointID epi = new FeedEndpointID(rs);
+ Collection<FeedEndpointID> ecoll = feed.getAuthorization().getEndpoint_ids();
+ ecoll.add(epi);
+ }
+ }
+ rs.close();
+
+ sql = "select * from FEED_ENDPOINT_ADDRS";
+ rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ int id = rs.getInt("FEEDID");
+ Feed feed = map.get(id);
+ if (feed != null) {
+ Collection<String> acoll = feed.getAuthorization().getEndpoint_addrs();
+ acoll.add(rs.getString("ADDR"));
+ }
+ }
+ rs.close();
+
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return map.values();
+ }
+
+ public static List<String> getFilteredFeedUrlList(final String name, final String val) {
+ List<String> list = new ArrayList<String>();
+ String sql = "select SELF_LINK from FEEDS where DELETED = 0";
+ if (name.equals("name")) {
+ sql += " and NAME = ?";
+ } else if (name.equals("publ")) {
+ sql += " and PUBLISHER = ?";
+ } else if (name.equals("subs")) {
+ sql = "select distinct FEEDS.SELF_LINK from FEEDS, SUBSCRIPTIONS " +
+ "where DELETED = 0 " +
+ "and FEEDS.FEEDID = SUBSCRIPTIONS.FEEDID " +
+ "and SUBSCRIPTIONS.SUBSCRIBER = ?";
+ }
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement(sql);
+ if (sql.indexOf('?') >= 0)
+ ps.setString(1, val);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ String t = rs.getString(1);
+ list.add(t.trim());
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return list;
+ }
+
+ @SuppressWarnings("resource")
+ private static Feed getFeedBySQL(String sql) {
+ Feed feed = null;
+ try {
+ DB db = new DB();
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ if (rs.next()) {
+ feed = new Feed(rs);
+ rs.close();
+
+ sql = "select * from FEED_ENDPOINT_IDS where FEEDID = " + feed.feedid;
+ rs = stmt.executeQuery(sql);
+ Collection<FeedEndpointID> ecoll = feed.getAuthorization().getEndpoint_ids();
+ while (rs.next()) {
+ FeedEndpointID epi = new FeedEndpointID(rs);
+ ecoll.add(epi);
+ }
+ rs.close();
+
+ sql = "select * from FEED_ENDPOINT_ADDRS where FEEDID = " + feed.feedid;
+ rs = stmt.executeQuery(sql);
+ Collection<String> acoll = feed.getAuthorization().getEndpoint_addrs();
+ while (rs.next()) {
+ acoll.add(rs.getString("ADDR"));
+ }
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return feed;
+ }
+
+ public Feed() {
+ this("", "", "", "");
+ }
+
+ public Feed(String name, String version, String desc, String business_description) {
+ this.feedid = -1;
+ this.groupid = -1; //New field is added - Groups feature Rally:US708115 - 1610
+ this.name = name;
+ this.version = version;
+ this.description = desc;
+ this.business_description = business_description; // New field is added - Groups feature Rally:US708102 - 1610
+ this.authorization = new FeedAuthorization();
+ this.publisher = "";
+ this.links = new FeedLinks();
+ this.deleted = false;
+ this.suspended = false;
+ this.last_mod = new Date();
+ this.created_date = new Date();
+ }
+
+ public Feed(ResultSet rs) throws SQLException {
+ this.feedid = rs.getInt("FEEDID");
+ this.groupid = rs.getInt("GROUPID"); //New field is added - Groups feature Rally:US708115 - 1610
+ this.name = rs.getString("NAME");
+ this.version = rs.getString("VERSION");
+ this.description = rs.getString("DESCRIPTION");
+ this.business_description = rs.getString("BUSINESS_DESCRIPTION"); // New field is added - Groups feature Rally:US708102 - 1610
+ this.authorization = new FeedAuthorization();
+ this.authorization.setClassification(rs.getString("AUTH_CLASS"));
+ this.publisher = rs.getString("PUBLISHER");
+ this.links = new FeedLinks();
+ this.links.setSelf(rs.getString("SELF_LINK"));
+ this.links.setPublish(rs.getString("PUBLISH_LINK"));
+ this.links.setSubscribe(rs.getString("SUBSCRIBE_LINK"));
+ this.links.setLog(rs.getString("LOG_LINK"));
+ this.deleted = rs.getBoolean("DELETED");
+ this.suspended = rs.getBoolean("SUSPENDED");
+ this.last_mod = rs.getDate("LAST_MOD");
+ this.created_date = rs.getTimestamp("CREATED_DATE");
+ }
+
+ public Feed(JSONObject jo) throws InvalidObjectException {
+ this("", "", "", "");
+ try {
+ // The JSONObject is assumed to contain a vnd.att-dr.feed representation
+ this.feedid = jo.optInt("feedid", -1);
+ this.groupid = jo.optInt("groupid"); //New field is added - Groups feature Rally:US708115 - 1610
+ this.name = jo.getString("name");
+ if (name.length() > 255)
+ throw new InvalidObjectException("name field is too long");
+ this.version = jo.getString("version");
+ if (version.length() > 20)
+ throw new InvalidObjectException("version field is too long");
+ this.description = jo.optString("description");
+ this.business_description = jo.optString("business_description"); // New field is added - Groups feature Rally:US708102 - 1610
+ if (description.length() > 1000)
+ throw new InvalidObjectException("technical description field is too long");
+
+ if (business_description.length() > 1000) // New field is added - Groups feature Rally:US708102 - 1610
+ throw new InvalidObjectException("business description field is too long");
+
+ this.authorization = new FeedAuthorization();
+ JSONObject jauth = jo.getJSONObject("authorization");
+ this.authorization.setClassification(jauth.getString("classification"));
+ if (this.authorization.getClassification().length() > 32)
+ throw new InvalidObjectException("classification field is too long");
+ JSONArray ja = jauth.getJSONArray("endpoint_ids");
+ for (int i = 0; i < ja.length(); i++) {
+ JSONObject id = ja.getJSONObject(i);
+ FeedEndpointID fid = new FeedEndpointID(id.getString("id"), id.getString("password"));
+ if (fid.getId().length() > 20)
+ throw new InvalidObjectException("id field is too long (" + fid.getId() + ")");
+ if (fid.getPassword().length() > 32)
+ throw new InvalidObjectException("password field is too long (" + fid.getPassword() + ")");
+ this.authorization.getEndpoint_ids().add(fid);
+ }
+ if (this.authorization.getEndpoint_ids().size() < 1)
+ throw new InvalidObjectException("need to specify at least one endpoint_id");
+ ja = jauth.getJSONArray("endpoint_addrs");
+ for (int i = 0; i < ja.length(); i++) {
+ String addr = ja.getString(i);
+ if (!JSONUtilities.validIPAddrOrSubnet(addr))
+ throw new InvalidObjectException("bad IP addr or subnet mask: " + addr);
+ this.authorization.getEndpoint_addrs().add(addr);
+ }
+
+ this.publisher = jo.optString("publisher", "");
+ this.deleted = jo.optBoolean("deleted", false);
+ this.suspended = jo.optBoolean("suspend", false);
+ JSONObject jol = jo.optJSONObject("links");
+ this.links = (jol == null) ? (new FeedLinks()) : (new FeedLinks(jol));
+ } catch (InvalidObjectException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new InvalidObjectException("invalid JSON: " + e.getMessage());
+ }
+ }
+
+ public int getFeedid() {
+ return feedid;
+ }
+
+ public void setFeedid(int feedid) {
+ this.feedid = feedid;
+
+ // Create link URLs
+ FeedLinks fl = getLinks();
+ fl.setSelf(URLUtilities.generateFeedURL(feedid));
+ fl.setPublish(URLUtilities.generatePublishURL(feedid));
+ fl.setSubscribe(URLUtilities.generateSubscribeURL(feedid));
+ fl.setLog(URLUtilities.generateFeedLogURL(feedid));
+ }
+
+ //new getter setters for groups- Rally:US708115 - 1610
+ public int getGroupid() {
+ return groupid;
+ }
+
+ public void setGroupid(int groupid) {
+ this.groupid = groupid;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
// New field is added - Groups feature Rally:US708102 - 1610
- public String getBusiness_description() {
- return business_description;
- }
-
- public void setBusiness_description(String business_description) {
- this.business_description = business_description;
- }
-
- public FeedAuthorization getAuthorization() {
- return authorization;
- }
- public void setAuthorization(FeedAuthorization authorization) {
- this.authorization = authorization;
- }
- public String getPublisher() {
- return publisher;
- }
- public void setPublisher(String publisher) {
- if (publisher != null) {
- if (publisher.length() > 8)
- publisher = publisher.substring(0, 8);
- this.publisher = publisher;
- }
- }
- public FeedLinks getLinks() {
- return links;
- }
- public void setLinks(FeedLinks links) {
- this.links = links;
- }
-
- public boolean isDeleted() {
- return deleted;
- }
-
- public void setDeleted(boolean deleted) {
- this.deleted = deleted;
- }
-
- public boolean isSuspended() {
- return suspended;
- }
-
- public void setSuspended(boolean suspended) {
- this.suspended = suspended;
- }
-
- public Date getLast_mod() {
- return last_mod;
- }
-
- public Date getCreated_date() {
- return created_date;
- }
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("feedid", feedid);
- jo.put("groupid", groupid); //New field is added - Groups feature Rally:US708115 - 1610
- jo.put("name", name);
- jo.put("version", version);
- jo.put("description", description);
- jo.put("business_description", business_description); // New field is added - Groups feature Rally:US708102 - 1610
- jo.put("authorization", authorization.asJSONObject());
- jo.put("publisher", publisher);
- jo.put("links", links.asJSONObject());
- jo.put("deleted", deleted);
- jo.put("suspend", suspended);
- jo.put("last_mod", last_mod.getTime());
- jo.put("created_date", created_date.getTime());
- return jo;
- }
- public JSONObject asLimitedJSONObject() {
- JSONObject jo = asJSONObject();
- jo.remove("deleted");
- jo.remove("feedid");
- jo.remove("last_mod");
- jo.remove("created_date");
- return jo;
- }
- public JSONObject asJSONObject(boolean hidepasswords) {
- JSONObject jo = asJSONObject();
- if (hidepasswords) {
- jo.remove("feedid"); // we no longer hide passwords, however we do hide these
- jo.remove("deleted");
- jo.remove("last_mod");
- jo.remove("created_date");
- }
- return jo;
- }
- @Override
- public boolean doDelete(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "delete from FEEDS where FEEDID = ?";
- ps = c.prepareStatement(sql);
- ps.setInt(1, feedid);
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public synchronized boolean doInsert(Connection c) {
- boolean rv = true;
-// PreparedStatement ps = null;
- try {
- if (feedid == -1) {
-// // Get the next feedid
-// String sql = "insert into FEEDS_UNIQUEID (FEEDID) values (0)";
-// ps = c.prepareStatement(sql, new String[] { "FEEDID" });
-// ps.execute();
-// ResultSet rs = ps.getGeneratedKeys();
-// rs.first();
-// setFeedid(rs.getInt(1));
- // No feed ID assigned yet, so assign the next available one
- setFeedid(next_feedid++);
- }
- // In case we insert a feed from synchronization
- if (feedid > next_feedid)
- next_feedid = feedid+1;
-
- // Create FEED_ENDPOINT_IDS rows
- FeedAuthorization auth = getAuthorization();
- String sql = "insert into FEED_ENDPOINT_IDS values (?, ?, ?)";
- PreparedStatement ps2 = c.prepareStatement(sql);
- for (FeedEndpointID fid : auth.getEndpoint_ids()) {
- ps2.setInt(1, feedid);
- ps2.setString(2, fid.getId());
- ps2.setString(3, fid.getPassword());
- ps2.executeUpdate();
- }
- ps2.close();
-
- // Create FEED_ENDPOINT_ADDRS rows
- sql = "insert into FEED_ENDPOINT_ADDRS values (?, ?)";
- ps2 = c.prepareStatement(sql);
- for (String t : auth.getEndpoint_addrs()) {
- ps2.setInt(1, feedid);
- ps2.setString(2, t);
- ps2.executeUpdate();
- }
- ps2.close();
-
- // Finally, create the FEEDS row
- sql = "insert into FEEDS (FEEDID, NAME, VERSION, DESCRIPTION, AUTH_CLASS, PUBLISHER, SELF_LINK, PUBLISH_LINK, SUBSCRIBE_LINK, LOG_LINK, DELETED, SUSPENDED,BUSINESS_DESCRIPTION, GROUPID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?)";
- ps2 = c.prepareStatement(sql);
- ps2.setInt(1, feedid);
- ps2.setString(2, getName());
- ps2.setString(3, getVersion());
- ps2.setString(4, getDescription());
- ps2.setString(5, getAuthorization().getClassification());
- ps2.setString(6, getPublisher());
- ps2.setString(7, getLinks().getSelf());
- ps2.setString(8, getLinks().getPublish());
- ps2.setString(9, getLinks().getSubscribe());
- ps2.setString(10, getLinks().getLog());
- ps2.setBoolean(11, isDeleted());
- ps2.setBoolean(12, isSuspended());
- ps2.setString(13,getBusiness_description()); // New field is added - Groups feature Rally:US708102 - 1610
- ps2.setInt(14,groupid); //New field is added - Groups feature Rally:US708115 - 1610
- ps2.executeUpdate();
- ps2.close();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
-// } finally {
-// try {
-// ps.close();
-// } catch (SQLException e) {
-// e.printStackTrace();
-// }
- }
- return rv;
- }
- @Override
- public boolean doUpdate(Connection c) {
- boolean rv = true;
- Feed oldobj = getFeedById(feedid);
- PreparedStatement ps = null;
- try {
- Set<FeedEndpointID> newset = getAuthorization().getEndpoint_ids();
- Set<FeedEndpointID> oldset = oldobj.getAuthorization().getEndpoint_ids();
-
- // Insert new FEED_ENDPOINT_IDS rows
- String sql = "insert into FEED_ENDPOINT_IDS values (?, ?, ?)";
- ps = c.prepareStatement(sql);
- for (FeedEndpointID fid : newset) {
- if (!oldset.contains(fid)) {
- ps.setInt(1, feedid);
- ps.setString(2, fid.getId());
- ps.setString(3, fid.getPassword());
- ps.executeUpdate();
- }
- }
- ps.close();
-
- // Delete old FEED_ENDPOINT_IDS rows
- sql = "delete from FEED_ENDPOINT_IDS where FEEDID = ? AND USERID = ? AND PASSWORD = ?";
- ps = c.prepareStatement(sql);
- for (FeedEndpointID fid : oldset) {
- if (!newset.contains(fid)) {
- ps.setInt(1, feedid);
- ps.setString(2, fid.getId());
- ps.setString(3, fid.getPassword());
- ps.executeUpdate();
- }
- }
- ps.close();
-
- // Insert new FEED_ENDPOINT_ADDRS rows
- Set<String> newset2 = getAuthorization().getEndpoint_addrs();
- Set<String> oldset2 = oldobj.getAuthorization().getEndpoint_addrs();
- sql = "insert into FEED_ENDPOINT_ADDRS values (?, ?)";
- ps = c.prepareStatement(sql);
- for (String t : newset2) {
- if (!oldset2.contains(t)) {
- ps.setInt(1, feedid);
- ps.setString(2, t);
- ps.executeUpdate();
- }
- }
- ps.close();
-
- // Delete old FEED_ENDPOINT_ADDRS rows
- sql = "delete from FEED_ENDPOINT_ADDRS where FEEDID = ? AND ADDR = ?";
- ps = c.prepareStatement(sql);
- for (String t : oldset2) {
- if (!newset2.contains(t)) {
- ps.setInt(1, feedid);
- ps.setString(2, t);
- ps.executeUpdate();
- }
- }
- ps.close();
-
- // Finally, update the FEEDS row
- sql = "update FEEDS set DESCRIPTION = ?, AUTH_CLASS = ?, DELETED = ?, SUSPENDED = ?, BUSINESS_DESCRIPTION=?, GROUPID=? where FEEDID = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, getDescription());
- ps.setString(2, getAuthorization().getClassification());
- ps.setInt(3, deleted ? 1 : 0);
- ps.setInt(4, suspended ? 1 : 0);
- ps.setString(5, getBusiness_description()); // New field is added - Groups feature Rally:US708102 - 1610
- ps.setInt(6, groupid); //New field is added - Groups feature Rally:US708115 - 1610
- ps.setInt(7, feedid);
- ps.executeUpdate();
- ps.close();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- if (ps != null)
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- /**Rally US708115
- * Change Ownership of FEED - 1610
- * */
- public boolean changeOwnerShip() {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
-
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection c = db.getConnection();
- String sql = "update FEEDS set PUBLISHER = ? where FEEDID = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, this.publisher);
- ps.setInt(2, feedid);
- ps.execute();
- ps.close();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
-
- @Override
- public String getKey() {
- return ""+getFeedid();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Feed))
- return false;
- Feed of = (Feed) obj;
- if (feedid != of.feedid)
- return false;
- if (groupid != of.groupid) //New field is added - Groups feature Rally:US708115 - 1610
- return false;
- if (!name.equals(of.name))
- return false;
- if (!version.equals(of.version))
- return false;
- if (!description.equals(of.description))
- return false;
- if (!business_description.equals(of.business_description)) // New field is added - Groups feature Rally:US708102 - 1610
- return false;
- if (!publisher.equals(of.publisher))
- return false;
- if (!authorization.equals(of.authorization))
- return false;
- if (!links.equals(of.links))
- return false;
- if (deleted != of.deleted)
- return false;
- if (suspended != of.suspended)
- return false;
- return true;
- }
-
- @Override
- public String toString() {
- return "FEED: feedid=" + feedid + ", name=" + name + ", version=" + version;
- }
+ public String getBusiness_description() {
+ return business_description;
+ }
+
+ public void setBusiness_description(String business_description) {
+ this.business_description = business_description;
+ }
+
+ public FeedAuthorization getAuthorization() {
+ return authorization;
+ }
+
+ public void setAuthorization(FeedAuthorization authorization) {
+ this.authorization = authorization;
+ }
+
+ public String getPublisher() {
+ return publisher;
+ }
+
+ public void setPublisher(String publisher) {
+ if (publisher != null) {
+ if (publisher.length() > 8)
+ publisher = publisher.substring(0, 8);
+ this.publisher = publisher;
+ }
+ }
+
+ public FeedLinks getLinks() {
+ return links;
+ }
+
+ public void setLinks(FeedLinks links) {
+ this.links = links;
+ }
+
+ public boolean isDeleted() {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted) {
+ this.deleted = deleted;
+ }
+
+ public boolean isSuspended() {
+ return suspended;
+ }
+
+ public void setSuspended(boolean suspended) {
+ this.suspended = suspended;
+ }
+
+ public Date getLast_mod() {
+ return last_mod;
+ }
+
+ public Date getCreated_date() {
+ return created_date;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("feedid", feedid);
+ jo.put("groupid", groupid); //New field is added - Groups feature Rally:US708115 - 1610
+ jo.put("name", name);
+ jo.put("version", version);
+ jo.put("description", description);
+ jo.put("business_description", business_description); // New field is added - Groups feature Rally:US708102 - 1610
+ jo.put("authorization", authorization.asJSONObject());
+ jo.put("publisher", publisher);
+ jo.put("links", links.asJSONObject());
+ jo.put("deleted", deleted);
+ jo.put("suspend", suspended);
+ jo.put("last_mod", last_mod.getTime());
+ jo.put("created_date", created_date.getTime());
+ return jo;
+ }
+
+ public JSONObject asLimitedJSONObject() {
+ JSONObject jo = asJSONObject();
+ jo.remove("deleted");
+ jo.remove("feedid");
+ jo.remove("last_mod");
+ jo.remove("created_date");
+ return jo;
+ }
+
+ public JSONObject asJSONObject(boolean hidepasswords) {
+ JSONObject jo = asJSONObject();
+ if (hidepasswords) {
+ jo.remove("feedid"); // we no longer hide passwords, however we do hide these
+ jo.remove("deleted");
+ jo.remove("last_mod");
+ jo.remove("created_date");
+ }
+ return jo;
+ }
+
+ @Override
+ public boolean doDelete(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "delete from FEEDS where FEEDID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, feedid);
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public synchronized boolean doInsert(Connection c) {
+ boolean rv = true;
+// PreparedStatement ps = null;
+ try {
+ if (feedid == -1) {
+// // Get the next feedid
+// String sql = "insert into FEEDS_UNIQUEID (FEEDID) values (0)";
+// ps = c.prepareStatement(sql, new String[] { "FEEDID" });
+// ps.execute();
+// ResultSet rs = ps.getGeneratedKeys();
+// rs.first();
+// setFeedid(rs.getInt(1));
+ // No feed ID assigned yet, so assign the next available one
+ setFeedid(next_feedid++);
+ }
+ // In case we insert a feed from synchronization
+ if (feedid > next_feedid)
+ next_feedid = feedid + 1;
+
+ // Create FEED_ENDPOINT_IDS rows
+ FeedAuthorization auth = getAuthorization();
+ String sql = "insert into FEED_ENDPOINT_IDS values (?, ?, ?)";
+ PreparedStatement ps2 = c.prepareStatement(sql);
+ for (FeedEndpointID fid : auth.getEndpoint_ids()) {
+ ps2.setInt(1, feedid);
+ ps2.setString(2, fid.getId());
+ ps2.setString(3, fid.getPassword());
+ ps2.executeUpdate();
+ }
+ ps2.close();
+
+ // Create FEED_ENDPOINT_ADDRS rows
+ sql = "insert into FEED_ENDPOINT_ADDRS values (?, ?)";
+ ps2 = c.prepareStatement(sql);
+ for (String t : auth.getEndpoint_addrs()) {
+ ps2.setInt(1, feedid);
+ ps2.setString(2, t);
+ ps2.executeUpdate();
+ }
+ ps2.close();
+
+ // Finally, create the FEEDS row
+ sql = "insert into FEEDS (FEEDID, NAME, VERSION, DESCRIPTION, AUTH_CLASS, PUBLISHER, SELF_LINK, PUBLISH_LINK, SUBSCRIBE_LINK, LOG_LINK, DELETED, SUSPENDED,BUSINESS_DESCRIPTION, GROUPID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?, ?)";
+ ps2 = c.prepareStatement(sql);
+ ps2.setInt(1, feedid);
+ ps2.setString(2, getName());
+ ps2.setString(3, getVersion());
+ ps2.setString(4, getDescription());
+ ps2.setString(5, getAuthorization().getClassification());
+ ps2.setString(6, getPublisher());
+ ps2.setString(7, getLinks().getSelf());
+ ps2.setString(8, getLinks().getPublish());
+ ps2.setString(9, getLinks().getSubscribe());
+ ps2.setString(10, getLinks().getLog());
+ ps2.setBoolean(11, isDeleted());
+ ps2.setBoolean(12, isSuspended());
+ ps2.setString(13, getBusiness_description()); // New field is added - Groups feature Rally:US708102 - 1610
+ ps2.setInt(14, groupid); //New field is added - Groups feature Rally:US708115 - 1610
+ ps2.executeUpdate();
+ ps2.close();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+// } finally {
+// try {
+// ps.close();
+// } catch (SQLException e) {
+// e.printStackTrace();
+// }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doUpdate(Connection c) {
+ boolean rv = true;
+ Feed oldobj = getFeedById(feedid);
+ PreparedStatement ps = null;
+ try {
+ Set<FeedEndpointID> newset = getAuthorization().getEndpoint_ids();
+ Set<FeedEndpointID> oldset = oldobj.getAuthorization().getEndpoint_ids();
+
+ // Insert new FEED_ENDPOINT_IDS rows
+ String sql = "insert into FEED_ENDPOINT_IDS values (?, ?, ?)";
+ ps = c.prepareStatement(sql);
+ for (FeedEndpointID fid : newset) {
+ if (!oldset.contains(fid)) {
+ ps.setInt(1, feedid);
+ ps.setString(2, fid.getId());
+ ps.setString(3, fid.getPassword());
+ ps.executeUpdate();
+ }
+ }
+ ps.close();
+
+ // Delete old FEED_ENDPOINT_IDS rows
+ sql = "delete from FEED_ENDPOINT_IDS where FEEDID = ? AND USERID = ? AND PASSWORD = ?";
+ ps = c.prepareStatement(sql);
+ for (FeedEndpointID fid : oldset) {
+ if (!newset.contains(fid)) {
+ ps.setInt(1, feedid);
+ ps.setString(2, fid.getId());
+ ps.setString(3, fid.getPassword());
+ ps.executeUpdate();
+ }
+ }
+ ps.close();
+
+ // Insert new FEED_ENDPOINT_ADDRS rows
+ Set<String> newset2 = getAuthorization().getEndpoint_addrs();
+ Set<String> oldset2 = oldobj.getAuthorization().getEndpoint_addrs();
+ sql = "insert into FEED_ENDPOINT_ADDRS values (?, ?)";
+ ps = c.prepareStatement(sql);
+ for (String t : newset2) {
+ if (!oldset2.contains(t)) {
+ ps.setInt(1, feedid);
+ ps.setString(2, t);
+ ps.executeUpdate();
+ }
+ }
+ ps.close();
+
+ // Delete old FEED_ENDPOINT_ADDRS rows
+ sql = "delete from FEED_ENDPOINT_ADDRS where FEEDID = ? AND ADDR = ?";
+ ps = c.prepareStatement(sql);
+ for (String t : oldset2) {
+ if (!newset2.contains(t)) {
+ ps.setInt(1, feedid);
+ ps.setString(2, t);
+ ps.executeUpdate();
+ }
+ }
+ ps.close();
+
+ // Finally, update the FEEDS row
+ sql = "update FEEDS set DESCRIPTION = ?, AUTH_CLASS = ?, DELETED = ?, SUSPENDED = ?, BUSINESS_DESCRIPTION=?, GROUPID=? where FEEDID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, getDescription());
+ ps.setString(2, getAuthorization().getClassification());
+ ps.setInt(3, deleted ? 1 : 0);
+ ps.setInt(4, suspended ? 1 : 0);
+ ps.setString(5, getBusiness_description()); // New field is added - Groups feature Rally:US708102 - 1610
+ ps.setInt(6, groupid); //New field is added - Groups feature Rally:US708115 - 1610
+ ps.setInt(7, feedid);
+ ps.executeUpdate();
+ ps.close();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ if (ps != null)
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ /**
+ * Rally US708115
+ * Change Ownership of FEED - 1610
+ */
+ public boolean changeOwnerShip() {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection c = db.getConnection();
+ String sql = "update FEEDS set PUBLISHER = ? where FEEDID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, this.publisher);
+ ps.setInt(2, feedid);
+ ps.execute();
+ ps.close();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+
+ @Override
+ public String getKey() {
+ return "" + getFeedid();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Feed))
+ return false;
+ Feed of = (Feed) obj;
+ if (feedid != of.feedid)
+ return false;
+ if (groupid != of.groupid) //New field is added - Groups feature Rally:US708115 - 1610
+ return false;
+ if (!name.equals(of.name))
+ return false;
+ if (!version.equals(of.version))
+ return false;
+ if (!description.equals(of.description))
+ return false;
+ if (!business_description.equals(of.business_description)) // New field is added - Groups feature Rally:US708102 - 1610
+ return false;
+ if (!publisher.equals(of.publisher))
+ return false;
+ if (!authorization.equals(of.authorization))
+ return false;
+ if (!links.equals(of.links))
+ return false;
+ if (deleted != of.deleted)
+ return false;
+ if (suspended != of.suspended)
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "FEED: feedid=" + feedid + ", name=" + name + ", version=" + version;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedAuthorization.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedAuthorization.java
index 49578b86..16512d9f 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedAuthorization.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedAuthorization.java
@@ -7,9 +7,9 @@
* * 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.
@@ -32,65 +32,73 @@ import org.json.JSONObject;
/**
* The representation of a Feed authorization. This encapsulates the authorization information about a feed.
+ *
* @author Robert Eby
* @version $Id: FeedAuthorization.java,v 1.2 2013/06/20 14:11:05 eby Exp $
*/
public class FeedAuthorization implements JSONable {
- private String classification;
- private Set<FeedEndpointID> endpoint_ids;
- private Set<String> endpoint_addrs;
+ private String classification;
+ private Set<FeedEndpointID> endpoint_ids;
+ private Set<String> endpoint_addrs;
+
+ public FeedAuthorization() {
+ this.classification = "";
+ this.endpoint_ids = new HashSet<FeedEndpointID>();
+ this.endpoint_addrs = new HashSet<String>();
+ }
+
+ public String getClassification() {
+ return classification;
+ }
+
+ public void setClassification(String classification) {
+ this.classification = classification;
+ }
+
+ public Set<FeedEndpointID> getEndpoint_ids() {
+ return endpoint_ids;
+ }
+
+ public void setEndpoint_ids(Set<FeedEndpointID> endpoint_ids) {
+ this.endpoint_ids = endpoint_ids;
+ }
+
+ public Set<String> getEndpoint_addrs() {
+ return endpoint_addrs;
+ }
+
+ public void setEndpoint_addrs(Set<String> endpoint_addrs) {
+ this.endpoint_addrs = endpoint_addrs;
+ }
- public FeedAuthorization() {
- this.classification = "";
- this.endpoint_ids = new HashSet<FeedEndpointID>();
- this.endpoint_addrs = new HashSet<String>();
- }
- public String getClassification() {
- return classification;
- }
- public void setClassification(String classification) {
- this.classification = classification;
- }
- public Set<FeedEndpointID> getEndpoint_ids() {
- return endpoint_ids;
- }
- public void setEndpoint_ids(Set<FeedEndpointID> endpoint_ids) {
- this.endpoint_ids = endpoint_ids;
- }
- public Set<String> getEndpoint_addrs() {
- return endpoint_addrs;
- }
- public void setEndpoint_addrs(Set<String> endpoint_addrs) {
- this.endpoint_addrs = endpoint_addrs;
- }
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("classification", classification);
+ JSONArray ja = new JSONArray();
+ for (FeedEndpointID eid : endpoint_ids) {
+ ja.put(eid.asJSONObject());
+ }
+ jo.put("endpoint_ids", ja);
+ ja = new JSONArray();
+ for (String t : endpoint_addrs) {
+ ja.put(t);
+ }
+ jo.put("endpoint_addrs", ja);
+ return jo;
+ }
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("classification", classification);
- JSONArray ja = new JSONArray();
- for (FeedEndpointID eid : endpoint_ids) {
- ja.put(eid.asJSONObject());
- }
- jo.put("endpoint_ids", ja);
- ja = new JSONArray();
- for (String t : endpoint_addrs) {
- ja.put(t);
- }
- jo.put("endpoint_addrs", ja);
- return jo;
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof FeedAuthorization))
- return false;
- FeedAuthorization of = (FeedAuthorization) obj;
- if (!classification.equals(of.classification))
- return false;
- if (!endpoint_ids.equals(of.endpoint_ids))
- return false;
- if (!endpoint_addrs.equals(of.endpoint_addrs))
- return false;
- return true;
- }
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof FeedAuthorization))
+ return false;
+ FeedAuthorization of = (FeedAuthorization) obj;
+ if (!classification.equals(of.classification))
+ return false;
+ if (!endpoint_ids.equals(of.endpoint_ids))
+ return false;
+ if (!endpoint_addrs.equals(of.endpoint_addrs))
+ return false;
+ return true;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedEndpointID.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedEndpointID.java
index b9ffc400..cd482c61 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedEndpointID.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedEndpointID.java
@@ -7,9 +7,9 @@
* * 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.
@@ -31,57 +31,62 @@ import org.json.JSONObject;
/**
* The representation of a Feed endpoint. This contains a login/password pair.
+ *
* @author Robert Eby
* @version $Id: FeedEndpointID.java,v 1.1 2013/04/26 21:00:26 eby Exp $
*/
public class FeedEndpointID implements JSONable {
- private String id;
- private String password;
+ private String id;
+ private String password;
+
+ public FeedEndpointID() {
+ this("", "");
+ }
+
+ public FeedEndpointID(String id, String password) {
+ this.id = id;
+ this.password = password;
+ }
+
+ public FeedEndpointID(ResultSet rs) throws SQLException {
+ this.id = rs.getString("USERID");
+ this.password = rs.getString("PASSWORD");
+ }
+
+ public String getId() {
+ return id;
+ }
- public FeedEndpointID() {
- this("", "");
- }
- public FeedEndpointID(String id, String password) {
- this.id = id;
- this.password = password;
- }
- public FeedEndpointID(ResultSet rs) throws SQLException {
- this.id = rs.getString("USERID");
- this.password = rs.getString("PASSWORD");
- }
+ public void setId(String id) {
+ this.id = id;
+ }
- public String getId() {
- return id;
- }
+ public String getPassword() {
+ return password;
+ }
- public void setId(String id) {
- this.id = id;
- }
+ public void setPassword(String password) {
+ this.password = password;
+ }
- public String getPassword() {
- return password;
- }
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("id", id);
+ jo.put("password", password);
+ return jo;
+ }
- public void setPassword(String password) {
- this.password = password;
- }
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof FeedEndpointID))
+ return false;
+ FeedEndpointID f2 = (FeedEndpointID) obj;
+ return id.equals(f2.id) && password.equals(f2.password);
+ }
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("id", id);
- jo.put("password", password);
- return jo;
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof FeedEndpointID))
- return false;
- FeedEndpointID f2 = (FeedEndpointID) obj;
- return id.equals(f2.id) && password.equals(f2.password);
- }
- @Override
- public int hashCode() {
- return (id + ":" + password).hashCode();
- }
+ @Override
+ public int hashCode() {
+ return (id + ":" + password).hashCode();
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedLinks.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedLinks.java
index 14aa1077..261e2741 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedLinks.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/FeedLinks.java
@@ -7,9 +7,9 @@
* * 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.
@@ -30,74 +30,83 @@ import org.json.JSONObject;
/**
* The URLs associated with a Feed.
+ *
* @author Robert Eby
* @version $Id: FeedLinks.java,v 1.3 2013/07/05 13:48:05 eby Exp $
*/
public class FeedLinks implements JSONable {
- private String self;
- private String publish;
- private String subscribe;
- private String log;
-
- public FeedLinks() {
- self = publish = subscribe = log = null;
- }
-
- public FeedLinks(JSONObject jo) throws InvalidObjectException {
- this();
- self = jo.getString("self");
- publish = jo.getString("publish");
- subscribe = jo.getString("subscribe");
- log = jo.getString("log");
- }
-
- public String getSelf() {
- return self;
- }
- public void setSelf(String self) {
- this.self = self;
- }
- public String getPublish() {
- return publish;
- }
- public void setPublish(String publish) {
- this.publish = publish;
- }
- public String getSubscribe() {
- return subscribe;
- }
- public void setSubscribe(String subscribe) {
- this.subscribe = subscribe;
- }
- public String getLog() {
- return log;
- }
- public void setLog(String log) {
- this.log = log;
- }
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("self", self);
- jo.put("publish", publish);
- jo.put("subscribe", subscribe);
- jo.put("log", log);
- return jo;
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof FeedLinks))
- return false;
- FeedLinks of = (FeedLinks) obj;
- if (!self.equals(of.self))
- return false;
- if (!publish.equals(of.publish))
- return false;
- if (!subscribe.equals(of.subscribe))
- return false;
- if (!log.equals(of.log))
- return false;
- return true;
- }
+ private String self;
+ private String publish;
+ private String subscribe;
+ private String log;
+
+ public FeedLinks() {
+ self = publish = subscribe = log = null;
+ }
+
+ public FeedLinks(JSONObject jo) throws InvalidObjectException {
+ this();
+ self = jo.getString("self");
+ publish = jo.getString("publish");
+ subscribe = jo.getString("subscribe");
+ log = jo.getString("log");
+ }
+
+ public String getSelf() {
+ return self;
+ }
+
+ public void setSelf(String self) {
+ this.self = self;
+ }
+
+ public String getPublish() {
+ return publish;
+ }
+
+ public void setPublish(String publish) {
+ this.publish = publish;
+ }
+
+ public String getSubscribe() {
+ return subscribe;
+ }
+
+ public void setSubscribe(String subscribe) {
+ this.subscribe = subscribe;
+ }
+
+ public String getLog() {
+ return log;
+ }
+
+ public void setLog(String log) {
+ this.log = log;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("self", self);
+ jo.put("publish", publish);
+ jo.put("subscribe", subscribe);
+ jo.put("log", log);
+ return jo;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof FeedLinks))
+ return false;
+ FeedLinks of = (FeedLinks) obj;
+ if (!self.equals(of.self))
+ return false;
+ if (!publish.equals(of.publish))
+ return false;
+ if (!subscribe.equals(of.subscribe))
+ return false;
+ if (!log.equals(of.log))
+ return false;
+ return true;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Group.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Group.java
index 884cd2b7..2ea60d26 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Group.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Group.java
@@ -7,9 +7,9 @@
* * 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.
@@ -41,376 +41,403 @@ import org.onap.dmaap.datarouter.provisioning.utils.URLUtilities;
/**
* The representation of a Subscription. Subscriptions can be retrieved from the DB, or stored/updated in the DB.
+ *
* @author vikram
- * @version $Id: Group.java,v 1.0 2016/07/19
+ * @version $Id: Group.java,v 1.0 2016/07/19
*/
public class Group extends Syncable {
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private static int next_groupid = getMaxGroupID() + 1;
-
- private int groupid;
- private String authid;
- private String name;
- private String description;
- private String classification;
- private String members;
- private Date last_mod;
-
-
- public static Group getGroupMatching(Group gup) {
- String sql = String.format(
- "select * from GROUPS where NAME = \"%s\"",
- gup.getName()
- );
- List<Group> list = getGroupsForSQL(sql);
- return list.size() > 0 ? list.get(0) : null;
- }
-
- public static Group getGroupMatching(Group gup, int groupid) {
- String sql = String.format(
- "select * from GROUPS where NAME = \"%s\" and GROUPID != %d ",
- gup.getName(),
- gup.getGroupid()
- );
- List<Group> list = getGroupsForSQL(sql);
- return list.size() > 0 ? list.get(0) : null;
- }
-
- public static Group getGroupById(int id) {
- String sql = "select * from GROUPS where GROUPID = " + id;
- List<Group> list = getGroupsForSQL(sql);
- return list.size() > 0 ? list.get(0) : null;
- }
-
- public static Group getGroupByAuthId(String id) {
- String sql = "select * from GROUPS where AUTHID = '" + id +"'";
- List<Group> list = getGroupsForSQL(sql);
- return list.size() > 0 ? list.get(0) : null;
- }
-
- public static Collection<Group> getAllgroups() {
- return getGroupsForSQL("select * from GROUPS");
- }
- private static List<Group> getGroupsForSQL(String sql) {
- List<Group> list = new ArrayList<Group>();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- while (rs.next()) {
- Group group = new Group(rs);
- list.add(group);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return list;
- }
- public static int getMaxGroupID() {
- int max = 0;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select MAX(groupid) from GROUPS");
- if (rs.next()) {
- max = rs.getInt(1);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- intlogger.info("getMaxSubID: "+e.getMessage());
- e.printStackTrace();
- }
- return max;
- }
- public static Collection<String> getGroupsByClassfication(String classfication) {
- List<String> list = new ArrayList<String>();
- String sql = "select * from GROUPS where classification = '"+classfication+"'";
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- while (rs.next()) {
- int groupid = rs.getInt("groupid");
- //list.add(URLUtilities.generateSubscriptionURL(groupid));
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return list;
- }
- /**
- * Return a count of the number of active subscriptions in the DB.
- * @return the count
- */
- public static int countActiveSubscriptions() {
- int count = 0;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select count(*) from SUBSCRIPTIONS");
- if (rs.next()) {
- count = rs.getInt(1);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- intlogger.warn("PROV0008 countActiveSubscriptions: "+e.getMessage());
- e.printStackTrace();
- }
- return count;
- }
-
- public Group() {
- this("", "", "");
- }
- public Group(String name, String desc, String members) {
- this.groupid = -1;
- this.authid = "";
- this.name = name;
- this.description = desc;
- this.members = members;
- this.classification = "";
- this.last_mod = new Date();
- }
-
-
- public Group(ResultSet rs) throws SQLException {
- this.groupid = rs.getInt("GROUPID");
- this.authid = rs.getString("AUTHID");
- this.name = rs.getString("NAME");
- this.description = rs.getString("DESCRIPTION");
- this.classification = rs.getString("CLASSIFICATION");
- this.members = rs.getString("MEMBERS");
- this.last_mod = rs.getDate("LAST_MOD");
- }
-
-
-
- public Group(JSONObject jo) throws InvalidObjectException {
- this("", "", "");
- try {
- // The JSONObject is assumed to contain a vnd.att-dr.group representation
- this.groupid = jo.optInt("groupid", -1);
- String gname = jo.getString("name");
- String gdescription = jo.getString("description");
-
- this.authid = jo.getString("authid");
- this.name = gname;
- this.description = gdescription;
- this.classification = jo.getString("classification");
- this.members = jo.getString("members");
-
- if (gname.length() > 50)
- throw new InvalidObjectException("Group name is too long");
- if (gdescription.length() > 256)
- throw new InvalidObjectException("Group Description is too long");
- } catch (InvalidObjectException e) {
- throw e;
- } catch (Exception e) {
- throw new InvalidObjectException("invalid JSON: "+e.getMessage());
- }
- }
- public int getGroupid() {
- return groupid;
- }
-
- public static Logger getIntlogger() {
- return intlogger;
- }
- public void setGroupid(int groupid) {
- this.groupid = groupid;
- }
-
- public static void setIntlogger(Logger intlogger) {
- Group.intlogger = intlogger;
- }
- public static int getNext_groupid() {
- return next_groupid;
- }
- public static void setNext_groupid(int next_groupid) {
- Group.next_groupid = next_groupid;
- }
- public String getAuthid() {
- return authid;
- }
- public void setAuthid(String authid) {
- this.authid = authid;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- public String getClassification() {
- return classification;
- }
- public void setClassification(String classification) {
- this.classification = classification;
- }
- public String getMembers() {
- return members;
- }
- public void setMembers(String members) {
- this.members = members;
- }
- public Date getLast_mod() {
- return last_mod;
- }
- public void setLast_mod(Date last_mod) {
- this.last_mod = last_mod;
- }
-
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("groupid", groupid);
- jo.put("authid", authid);
- jo.put("name", name);
- jo.put("description", description);
- jo.put("classification", classification);
- jo.put("members", members);
- jo.put("last_mod", last_mod.getTime());
- return jo;
- }
- @Override
- public boolean doInsert(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- if (groupid == -1) {
- // No feed ID assigned yet, so assign the next available one
- setGroupid(next_groupid++);
- }
- // In case we insert a gropup from synchronization
- if (groupid > next_groupid)
- next_groupid = groupid+1;
-
-
- // Create the GROUPS row
- String sql = "insert into GROUPS (GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) values (?, ?, ?, ?, ?, ?)";
- ps = c.prepareStatement(sql, new String[] { "GROUPID" });
- ps.setInt(1, groupid);
- ps.setString(2, authid);
- ps.setString(3, name);
- ps.setString(4, description);
- ps.setString(5, classification);
- ps.setString(6, members);
- ps.execute();
- ps.close();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public boolean doUpdate(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? , MEMBERS = ? where GROUPID = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, authid);
- ps.setString(2, name);
- ps.setString(3, description);
- ps.setString(4, classification);
- ps.setString(5, members);
- ps.setInt(6, groupid);
- ps.executeUpdate();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public boolean doDelete(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "delete from GROUPS where GROUPID = ?";
- ps = c.prepareStatement(sql);
- ps.setInt(1, groupid);
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public String getKey() {
- return ""+getGroupid();
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Group))
- return false;
- Group os = (Group) obj;
- if (groupid != os.groupid)
- return false;
- if (authid != os.authid)
- return false;
- if (!name.equals(os.name))
- return false;
- if (description != os.description)
- return false;
- if (!classification.equals(os.classification))
- return false;
- if (!members.equals(os.members))
- return false;
-
- return true;
- }
-
- @Override
- public String toString() {
- return "GROUP: groupid=" + groupid;
- }
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private static int next_groupid = getMaxGroupID() + 1;
+
+ private int groupid;
+ private String authid;
+ private String name;
+ private String description;
+ private String classification;
+ private String members;
+ private Date last_mod;
+
+
+ public static Group getGroupMatching(Group gup) {
+ String sql = String.format(
+ "select * from GROUPS where NAME = \"%s\"",
+ gup.getName()
+ );
+ List<Group> list = getGroupsForSQL(sql);
+ return list.size() > 0 ? list.get(0) : null;
+ }
+
+ public static Group getGroupMatching(Group gup, int groupid) {
+ String sql = String.format(
+ "select * from GROUPS where NAME = \"%s\" and GROUPID != %d ",
+ gup.getName(),
+ gup.getGroupid()
+ );
+ List<Group> list = getGroupsForSQL(sql);
+ return list.size() > 0 ? list.get(0) : null;
+ }
+
+ public static Group getGroupById(int id) {
+ String sql = "select * from GROUPS where GROUPID = " + id;
+ List<Group> list = getGroupsForSQL(sql);
+ return list.size() > 0 ? list.get(0) : null;
+ }
+
+ public static Group getGroupByAuthId(String id) {
+ String sql = "select * from GROUPS where AUTHID = '" + id + "'";
+ List<Group> list = getGroupsForSQL(sql);
+ return list.size() > 0 ? list.get(0) : null;
+ }
+
+ public static Collection<Group> getAllgroups() {
+ return getGroupsForSQL("select * from GROUPS");
+ }
+
+ private static List<Group> getGroupsForSQL(String sql) {
+ List<Group> list = new ArrayList<Group>();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ Group group = new Group(rs);
+ list.add(group);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return list;
+ }
+
+ public static int getMaxGroupID() {
+ int max = 0;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select MAX(groupid) from GROUPS");
+ if (rs.next()) {
+ max = rs.getInt(1);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ intlogger.info("getMaxSubID: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return max;
+ }
+
+ public static Collection<String> getGroupsByClassfication(String classfication) {
+ List<String> list = new ArrayList<String>();
+ String sql = "select * from GROUPS where classification = '" + classfication + "'";
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ int groupid = rs.getInt("groupid");
+ //list.add(URLUtilities.generateSubscriptionURL(groupid));
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return list;
+ }
+
+ /**
+ * Return a count of the number of active subscriptions in the DB.
+ *
+ * @return the count
+ */
+ public static int countActiveSubscriptions() {
+ int count = 0;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select count(*) from SUBSCRIPTIONS");
+ if (rs.next()) {
+ count = rs.getInt(1);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ intlogger.warn("PROV0008 countActiveSubscriptions: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return count;
+ }
+
+ public Group() {
+ this("", "", "");
+ }
+
+ public Group(String name, String desc, String members) {
+ this.groupid = -1;
+ this.authid = "";
+ this.name = name;
+ this.description = desc;
+ this.members = members;
+ this.classification = "";
+ this.last_mod = new Date();
+ }
+
+
+ public Group(ResultSet rs) throws SQLException {
+ this.groupid = rs.getInt("GROUPID");
+ this.authid = rs.getString("AUTHID");
+ this.name = rs.getString("NAME");
+ this.description = rs.getString("DESCRIPTION");
+ this.classification = rs.getString("CLASSIFICATION");
+ this.members = rs.getString("MEMBERS");
+ this.last_mod = rs.getDate("LAST_MOD");
+ }
+
+
+ public Group(JSONObject jo) throws InvalidObjectException {
+ this("", "", "");
+ try {
+ // The JSONObject is assumed to contain a vnd.att-dr.group representation
+ this.groupid = jo.optInt("groupid", -1);
+ String gname = jo.getString("name");
+ String gdescription = jo.getString("description");
+
+ this.authid = jo.getString("authid");
+ this.name = gname;
+ this.description = gdescription;
+ this.classification = jo.getString("classification");
+ this.members = jo.getString("members");
+
+ if (gname.length() > 50)
+ throw new InvalidObjectException("Group name is too long");
+ if (gdescription.length() > 256)
+ throw new InvalidObjectException("Group Description is too long");
+ } catch (InvalidObjectException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new InvalidObjectException("invalid JSON: " + e.getMessage());
+ }
+ }
+
+ public int getGroupid() {
+ return groupid;
+ }
+
+ public static Logger getIntlogger() {
+ return intlogger;
+ }
+
+ public void setGroupid(int groupid) {
+ this.groupid = groupid;
+ }
+
+ public static void setIntlogger(Logger intlogger) {
+ Group.intlogger = intlogger;
+ }
+
+ public static int getNext_groupid() {
+ return next_groupid;
+ }
+
+ public static void setNext_groupid(int next_groupid) {
+ Group.next_groupid = next_groupid;
+ }
+
+ public String getAuthid() {
+ return authid;
+ }
+
+ public void setAuthid(String authid) {
+ this.authid = authid;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getClassification() {
+ return classification;
+ }
+
+ public void setClassification(String classification) {
+ this.classification = classification;
+ }
+
+ public String getMembers() {
+ return members;
+ }
+
+ public void setMembers(String members) {
+ this.members = members;
+ }
+
+ public Date getLast_mod() {
+ return last_mod;
+ }
+
+ public void setLast_mod(Date last_mod) {
+ this.last_mod = last_mod;
+ }
+
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("groupid", groupid);
+ jo.put("authid", authid);
+ jo.put("name", name);
+ jo.put("description", description);
+ jo.put("classification", classification);
+ jo.put("members", members);
+ jo.put("last_mod", last_mod.getTime());
+ return jo;
+ }
+
+ @Override
+ public boolean doInsert(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ if (groupid == -1) {
+ // No feed ID assigned yet, so assign the next available one
+ setGroupid(next_groupid++);
+ }
+ // In case we insert a gropup from synchronization
+ if (groupid > next_groupid)
+ next_groupid = groupid + 1;
+
+
+ // Create the GROUPS row
+ String sql = "insert into GROUPS (GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) values (?, ?, ?, ?, ?, ?)";
+ ps = c.prepareStatement(sql, new String[]{"GROUPID"});
+ ps.setInt(1, groupid);
+ ps.setString(2, authid);
+ ps.setString(3, name);
+ ps.setString(4, description);
+ ps.setString(5, classification);
+ ps.setString(6, members);
+ ps.execute();
+ ps.close();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doUpdate(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? , MEMBERS = ? where GROUPID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, authid);
+ ps.setString(2, name);
+ ps.setString(3, description);
+ ps.setString(4, classification);
+ ps.setString(5, members);
+ ps.setInt(6, groupid);
+ ps.executeUpdate();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doDelete(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "delete from GROUPS where GROUPID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, groupid);
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public String getKey() {
+ return "" + getGroupid();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Group))
+ return false;
+ Group os = (Group) obj;
+ if (groupid != os.groupid)
+ return false;
+ if (authid != os.authid)
+ return false;
+ if (!name.equals(os.name))
+ return false;
+ if (description != os.description)
+ return false;
+ if (!classification.equals(os.classification))
+ return false;
+ if (!members.equals(os.members))
+ return false;
+
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "GROUP: groupid=" + groupid;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRoute.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRoute.java
index 39d859dc..0de57df2 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRoute.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRoute.java
@@ -7,9 +7,9 @@
* * 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.
@@ -52,490 +52,505 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: IngressRoute.java,v 1.3 2013/12/16 20:30:23 eby Exp $
*/
public class IngressRoute extends NodeClass implements Comparable<IngressRoute> {
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private final int seq;
- private final int feedid;
- private final String userid;
- private final String subnet;
- private int nodelist;
- private SortedSet<String> nodes;
-
- /**
- * Get all IngressRoutes in the database, sorted in order according to their sequence field.
- * @return a sorted set of IngressRoutes
- */
- public static SortedSet<IngressRoute> getAllIngressRoutes() {
- return getAllIngressRoutesForSQL("select SEQUENCE, FEEDID, USERID, SUBNET, NODESET from INGRESS_ROUTES");
- }
- /**
- * Get all IngressRoutes in the database with a particular sequence number.
- * @param seq the sequence number
- * @return a set of IngressRoutes
- */
- public static Set<IngressRoute> getIngressRoutesForSeq(int seq) {
- return getAllIngressRoutesForSQL("select SEQUENCE, FEEDID, USERID, SUBNET, NODESET from INGRESS_ROUTES where SEQUENCE = "+seq);
- }
- private static SortedSet<IngressRoute> getAllIngressRoutesForSQL(String sql) {
- SortedSet<IngressRoute> set = new TreeSet<IngressRoute>();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- while (rs.next()) {
- int seq = rs.getInt("SEQUENCE");
- int feedid = rs.getInt("FEEDID");
- String user = rs.getString("USERID");
- String subnet = rs.getString("SUBNET");
- int nodeset = rs.getInt("NODESET");
- set.add(new IngressRoute(seq, feedid, user, subnet, nodeset));
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return set;
- }
-
- /**
- * Get the maximum node set ID in use in the DB.
- * @return the integer value of the maximum
- */
- public static int getMaxNodeSetID() {
- return getMax("select max(SETID) as MAX from NODESETS");
- }
- /**
- * Get the maximum node sequence number in use in the DB.
- * @return the integer value of the maximum
- */
- public static int getMaxSequence() {
- return getMax("select max(SEQUENCE) as MAX from INGRESS_ROUTES");
- }
- private static int getMax(String sql) {
- int rv = 0;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- if (rs.next()) {
- rv = rs.getInt("MAX");
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return rv;
- }
-
- /**
- * Get an Ingress Route for a particular feed ID, user, and subnet
- * @param feedid the Feed ID to look for
- * @param user the user name to look for
- * @param subnet the subnet to look for
- * @return the Ingress Route, or null of there is none
- */
- public static IngressRoute getIngressRoute(int feedid, String user, String subnet) {
- IngressRoute v = null;
- PreparedStatement ps = null;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- String sql = "select SEQUENCE, NODESET from INGRESS_ROUTES where FEEDID = ? AND USERID = ? and SUBNET = ?";
- ps = conn.prepareStatement(sql);
- ps.setInt(1, feedid);
- ps.setString(2, user);
- ps.setString(3, subnet);
- ResultSet rs = ps.executeQuery();
- if (rs.next()) {
- int seq = rs.getInt("SEQUENCE");
- int nodeset = rs.getInt("NODESET");
- v = new IngressRoute(seq, feedid, user, subnet, nodeset);
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return v;
- }
-
- /**
- * Get a collection of all Ingress Routes with a particular sequence number.
- * @param seq the sequence number to look for
- * @return the collection (may be empty).
- */
- public static Collection<IngressRoute> getIngressRoute(int seq) {
- Collection<IngressRoute> rv = new ArrayList<IngressRoute>();
- PreparedStatement ps = null;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- String sql = "select FEEDID, USERID, SUBNET, NODESET from INGRESS_ROUTES where SEQUENCE = ?";
- ps = conn.prepareStatement(sql);
- ps.setInt(1, seq);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- int feedid = rs.getInt("FEEDID");
- String user = rs.getString("USERID");
- String subnet = rs.getString("SUBNET");
- int nodeset = rs.getInt("NODESET");
- rv.add(new IngressRoute(seq, feedid, user, subnet, nodeset));
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- public IngressRoute(int seq, int feedid, String user, String subnet, Collection<String> nodes)
- throws IllegalArgumentException
- {
- this(seq, feedid, user, subnet);
- this.nodelist = -1;
- this.nodes = new TreeSet<String>(nodes);
- }
-
- public IngressRoute(int seq, int feedid, String user, String subnet, int nodeset)
- throws IllegalArgumentException
- {
- this(seq, feedid, user, subnet);
- this.nodelist = nodeset;
- this.nodes = new TreeSet<String>(readNodes());
- }
-
- private IngressRoute(int seq, int feedid, String user, String subnet)
- throws IllegalArgumentException
- {
- this.seq = seq;
- this.feedid = feedid;
- this.userid = (user == null) ? "-" : user;
- this.subnet = (subnet == null) ? "-" : subnet;
- this.nodelist = -1;
- this.nodes = null;
- if (Feed.getFeedById(feedid) == null)
- throw new IllegalArgumentException("No such feed: "+feedid);
- if (!this.subnet.equals("-")) {
- SubnetMatcher sm = new SubnetMatcher(subnet);
- if (!sm.isValid())
- throw new IllegalArgumentException("Invalid subnet: "+subnet);
- }
- }
-
- public IngressRoute(JSONObject jo) {
- this.seq = jo.optInt("seq");
- this.feedid = jo.optInt("feedid");
- String t = jo.optString("user");
- this.userid = t.equals("") ? "-" : t;
- t = jo.optString("subnet");
- this.subnet = t.equals("") ? "-" : t;
- this.nodelist = -1;
- this.nodes = new TreeSet<String>();
- JSONArray ja = jo.getJSONArray("node");
- for (int i = 0; i < ja.length(); i++)
- this.nodes.add(ja.getString(i));
- }
- /**
- * Does this particular IngressRoute match a request, represented by feedid and req?
- * To match, <i>feedid</i> must match the feed ID in the route, the user in the route
- * (if specified) must match the user in the request, and the subnet in the route (if specified)
- * must match the subnet from the request.
- * @param feedid the feedid for this request
- * @param req the remainder of the request
- * @return true if a match, false otherwise
- */
- public boolean matches(int feedid, HttpServletRequest req) {
- // Check feedid
- if (this.feedid != feedid)
- return false;
-
- // Get user from request and compare
- // Note: we don't check the password; the node will do that
- if (userid.length() > 0 && !userid.equals("-")) {
- String credentials = req.getHeader("Authorization");
- if (credentials == null || !credentials.startsWith("Basic "))
- return false;
- String t = new String(Base64.decodeBase64(credentials.substring(6)));
- int ix = t.indexOf(':');
- if (ix >= 0)
- t = t.substring(0, ix);
- if (!t.equals(this.userid))
- return false;
- }
-
- // If this route has a subnet, match it against the requester's IP addr
- if (subnet.length() > 0 && !subnet.equals("-")) {
- try {
- InetAddress inet = InetAddress.getByName(req.getRemoteAddr());
- SubnetMatcher sm = new SubnetMatcher(subnet);
- return sm.matches(inet.getAddress());
- } catch (UnknownHostException e) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Compare IP addresses as byte arrays to a subnet specified as a CIDR.
- * Taken from org.onap.dmaap.datarouter.node.SubnetMatcher and modified somewhat.
- */
- public class SubnetMatcher {
- private byte[] sn;
- private int len;
- private int mask;
- private boolean valid;
-
- /**
- * Construct a subnet matcher given a CIDR
- * @param subnet The CIDR to match
- */
- public SubnetMatcher(String subnet) {
- int i = subnet.lastIndexOf('/');
- if (i == -1) {
- try {
- sn = InetAddress.getByName(subnet).getAddress();
- len = sn.length;
- valid = true;
- } catch (UnknownHostException e) {
- len = 0;
- valid = false;
- }
- mask = 0;
- } else {
- int n = Integer.parseInt(subnet.substring(i + 1));
- try {
- sn = InetAddress.getByName(subnet.substring(0, i)).getAddress();
- valid = true;
- } catch (UnknownHostException e) {
- valid = false;
- }
- len = n / 8;
- mask = ((0xff00) >> (n % 8)) & 0xff;
- }
- }
- public boolean isValid() {
- return valid;
- }
- /**
- * Is the IP address in the CIDR?
- * @param addr the IP address as bytes in network byte order
- * @return true if the IP address matches.
- */
- public boolean matches(byte[] addr) {
- if (!valid || addr.length != sn.length) {
- return false;
- }
- for (int i = 0; i < len; i++) {
- if (addr[i] != sn[i]) {
- return false;
- }
- }
- if (mask != 0 && ((addr[len] ^ sn[len]) & mask) != 0) {
- return false;
- }
- return true;
- }
- }
-
- /**
- * Get the list of node names for this route.
- * @return the list
- */
- public SortedSet<String> getNodes() {
- return this.nodes;
- }
-
- private Collection<String> readNodes() {
- Collection<String> set = new TreeSet<String>();
- PreparedStatement ps = null;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- String sql = "select NODEID from NODESETS where SETID = ?";
- ps = conn.prepareStatement(sql);
- ps.setInt(1, nodelist);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- int id = rs.getInt("NODEID");
- set.add(lookupNodeID(id));
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return set;
- }
-
- /**
- * Delete the IRT route having this IngressRoutes feed ID, user ID, and subnet from the database.
- * @return true if the delete succeeded
- */
- @Override
- public boolean doDelete(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- ps = c.prepareStatement("delete from INGRESS_ROUTES where FEEDID = ? and USERID = ? and SUBNET = ?");
- ps.setInt(1, feedid);
- ps.setString(2, userid);
- ps.setString(3, subnet);
- ps.execute();
- ps.close();
-
- ps = c.prepareStatement("delete from NODESETS where SETID = ?");
- ps.setInt(1, nodelist);
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- @SuppressWarnings("resource")
- @Override
- public boolean doInsert(Connection c) {
- boolean rv = false;
- PreparedStatement ps = null;
- try {
- // Create the NODESETS rows & set nodelist
- int set = getMaxNodeSetID() + 1;
- this.nodelist = set;
- for (String node : nodes) {
- int id = lookupNodeName(node);
- ps = c.prepareStatement("insert into NODESETS (SETID, NODEID) values (?,?)");
- ps.setInt(1, this.nodelist);
- ps.setInt(2, id);
- ps.execute();
- ps.close();
- }
-
- // Create the INGRESS_ROUTES row
- ps = c.prepareStatement("insert into INGRESS_ROUTES (SEQUENCE, FEEDID, USERID, SUBNET, NODESET) values (?, ?, ?, ?, ?)");
- ps.setInt(1, this.seq);
- ps.setInt(2, this.feedid);
- ps.setString(3, this.userid);
- ps.setString(4, this.subnet);
- ps.setInt(5, this.nodelist);
- ps.execute();
- ps.close();
- rv = true;
- } catch (SQLException e) {
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- @Override
- public boolean doUpdate(Connection c) {
- return doDelete(c) && doInsert(c);
- }
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("feedid", feedid);
- // Note: for user and subnet, null, "", and "-" are equivalent
- if (userid != null && !userid.equals("-") && !userid.equals(""))
- jo.put("user", userid);
- if (subnet != null && !subnet.equals("-") && !subnet.equals(""))
- jo.put("subnet", subnet);
- jo.put("seq", seq);
- jo.put("node", nodes);
- return jo;
- }
-
- @Override
- public String getKey() {
- return String.format("%d/%s/%s/%d", feedid, (userid == null)?"":userid, (subnet == null)?"":subnet, seq);
- }
-
- @Override
- public int hashCode() {
- return toString().hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- try {
- if (!(obj instanceof IngressRoute))
- return false;
- return this.compareTo((IngressRoute) obj) == 0;
- } catch (NullPointerException e) {
- return false;
- }
- }
-
- @Override
- public int compareTo(IngressRoute in) {
- if (in == null)
- throw new NullPointerException();
- int n = this.feedid - in.feedid;
- if (n != 0)
- return n;
- n = this.seq - in.seq;
- if (n != 0)
- return n;
- n = this.userid.compareTo(in.userid);
- if (n != 0)
- return n;
- n = this.subnet.compareTo(in.subnet);
- if (n != 0)
- return n;
- return this.nodes.equals(in.nodes) ? 0 : 1;
- }
-
- @Override
- public String toString() {
- return String.format("INGRESS: feed=%d, userid=%s, subnet=%s, seq=%d", feedid, (userid == null)?"":userid, (subnet == null)?"":subnet, seq);
- }
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private final int seq;
+ private final int feedid;
+ private final String userid;
+ private final String subnet;
+ private int nodelist;
+ private SortedSet<String> nodes;
+
+ /**
+ * Get all IngressRoutes in the database, sorted in order according to their sequence field.
+ *
+ * @return a sorted set of IngressRoutes
+ */
+ public static SortedSet<IngressRoute> getAllIngressRoutes() {
+ return getAllIngressRoutesForSQL("select SEQUENCE, FEEDID, USERID, SUBNET, NODESET from INGRESS_ROUTES");
+ }
+
+ /**
+ * Get all IngressRoutes in the database with a particular sequence number.
+ *
+ * @param seq the sequence number
+ * @return a set of IngressRoutes
+ */
+ public static Set<IngressRoute> getIngressRoutesForSeq(int seq) {
+ return getAllIngressRoutesForSQL("select SEQUENCE, FEEDID, USERID, SUBNET, NODESET from INGRESS_ROUTES where SEQUENCE = " + seq);
+ }
+
+ private static SortedSet<IngressRoute> getAllIngressRoutesForSQL(String sql) {
+ SortedSet<IngressRoute> set = new TreeSet<IngressRoute>();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ int seq = rs.getInt("SEQUENCE");
+ int feedid = rs.getInt("FEEDID");
+ String user = rs.getString("USERID");
+ String subnet = rs.getString("SUBNET");
+ int nodeset = rs.getInt("NODESET");
+ set.add(new IngressRoute(seq, feedid, user, subnet, nodeset));
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return set;
+ }
+
+ /**
+ * Get the maximum node set ID in use in the DB.
+ *
+ * @return the integer value of the maximum
+ */
+ public static int getMaxNodeSetID() {
+ return getMax("select max(SETID) as MAX from NODESETS");
+ }
+
+ /**
+ * Get the maximum node sequence number in use in the DB.
+ *
+ * @return the integer value of the maximum
+ */
+ public static int getMaxSequence() {
+ return getMax("select max(SEQUENCE) as MAX from INGRESS_ROUTES");
+ }
+
+ private static int getMax(String sql) {
+ int rv = 0;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ if (rs.next()) {
+ rv = rs.getInt("MAX");
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return rv;
+ }
+
+ /**
+ * Get an Ingress Route for a particular feed ID, user, and subnet
+ *
+ * @param feedid the Feed ID to look for
+ * @param user the user name to look for
+ * @param subnet the subnet to look for
+ * @return the Ingress Route, or null of there is none
+ */
+ public static IngressRoute getIngressRoute(int feedid, String user, String subnet) {
+ IngressRoute v = null;
+ PreparedStatement ps = null;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ String sql = "select SEQUENCE, NODESET from INGRESS_ROUTES where FEEDID = ? AND USERID = ? and SUBNET = ?";
+ ps = conn.prepareStatement(sql);
+ ps.setInt(1, feedid);
+ ps.setString(2, user);
+ ps.setString(3, subnet);
+ ResultSet rs = ps.executeQuery();
+ if (rs.next()) {
+ int seq = rs.getInt("SEQUENCE");
+ int nodeset = rs.getInt("NODESET");
+ v = new IngressRoute(seq, feedid, user, subnet, nodeset);
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return v;
+ }
+
+ /**
+ * Get a collection of all Ingress Routes with a particular sequence number.
+ *
+ * @param seq the sequence number to look for
+ * @return the collection (may be empty).
+ */
+ public static Collection<IngressRoute> getIngressRoute(int seq) {
+ Collection<IngressRoute> rv = new ArrayList<IngressRoute>();
+ PreparedStatement ps = null;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ String sql = "select FEEDID, USERID, SUBNET, NODESET from INGRESS_ROUTES where SEQUENCE = ?";
+ ps = conn.prepareStatement(sql);
+ ps.setInt(1, seq);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ int feedid = rs.getInt("FEEDID");
+ String user = rs.getString("USERID");
+ String subnet = rs.getString("SUBNET");
+ int nodeset = rs.getInt("NODESET");
+ rv.add(new IngressRoute(seq, feedid, user, subnet, nodeset));
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ public IngressRoute(int seq, int feedid, String user, String subnet, Collection<String> nodes)
+ throws IllegalArgumentException {
+ this(seq, feedid, user, subnet);
+ this.nodelist = -1;
+ this.nodes = new TreeSet<String>(nodes);
+ }
+
+ public IngressRoute(int seq, int feedid, String user, String subnet, int nodeset)
+ throws IllegalArgumentException {
+ this(seq, feedid, user, subnet);
+ this.nodelist = nodeset;
+ this.nodes = new TreeSet<String>(readNodes());
+ }
+
+ private IngressRoute(int seq, int feedid, String user, String subnet)
+ throws IllegalArgumentException {
+ this.seq = seq;
+ this.feedid = feedid;
+ this.userid = (user == null) ? "-" : user;
+ this.subnet = (subnet == null) ? "-" : subnet;
+ this.nodelist = -1;
+ this.nodes = null;
+ if (Feed.getFeedById(feedid) == null)
+ throw new IllegalArgumentException("No such feed: " + feedid);
+ if (!this.subnet.equals("-")) {
+ SubnetMatcher sm = new SubnetMatcher(subnet);
+ if (!sm.isValid())
+ throw new IllegalArgumentException("Invalid subnet: " + subnet);
+ }
+ }
+
+ public IngressRoute(JSONObject jo) {
+ this.seq = jo.optInt("seq");
+ this.feedid = jo.optInt("feedid");
+ String t = jo.optString("user");
+ this.userid = t.equals("") ? "-" : t;
+ t = jo.optString("subnet");
+ this.subnet = t.equals("") ? "-" : t;
+ this.nodelist = -1;
+ this.nodes = new TreeSet<String>();
+ JSONArray ja = jo.getJSONArray("node");
+ for (int i = 0; i < ja.length(); i++)
+ this.nodes.add(ja.getString(i));
+ }
+
+ /**
+ * Does this particular IngressRoute match a request, represented by feedid and req?
+ * To match, <i>feedid</i> must match the feed ID in the route, the user in the route
+ * (if specified) must match the user in the request, and the subnet in the route (if specified)
+ * must match the subnet from the request.
+ *
+ * @param feedid the feedid for this request
+ * @param req the remainder of the request
+ * @return true if a match, false otherwise
+ */
+ public boolean matches(int feedid, HttpServletRequest req) {
+ // Check feedid
+ if (this.feedid != feedid)
+ return false;
+
+ // Get user from request and compare
+ // Note: we don't check the password; the node will do that
+ if (userid.length() > 0 && !userid.equals("-")) {
+ String credentials = req.getHeader("Authorization");
+ if (credentials == null || !credentials.startsWith("Basic "))
+ return false;
+ String t = new String(Base64.decodeBase64(credentials.substring(6)));
+ int ix = t.indexOf(':');
+ if (ix >= 0)
+ t = t.substring(0, ix);
+ if (!t.equals(this.userid))
+ return false;
+ }
+
+ // If this route has a subnet, match it against the requester's IP addr
+ if (subnet.length() > 0 && !subnet.equals("-")) {
+ try {
+ InetAddress inet = InetAddress.getByName(req.getRemoteAddr());
+ SubnetMatcher sm = new SubnetMatcher(subnet);
+ return sm.matches(inet.getAddress());
+ } catch (UnknownHostException e) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Compare IP addresses as byte arrays to a subnet specified as a CIDR.
+ * Taken from org.onap.dmaap.datarouter.node.SubnetMatcher and modified somewhat.
+ */
+ public class SubnetMatcher {
+ private byte[] sn;
+ private int len;
+ private int mask;
+ private boolean valid;
+
+ /**
+ * Construct a subnet matcher given a CIDR
+ *
+ * @param subnet The CIDR to match
+ */
+ public SubnetMatcher(String subnet) {
+ int i = subnet.lastIndexOf('/');
+ if (i == -1) {
+ try {
+ sn = InetAddress.getByName(subnet).getAddress();
+ len = sn.length;
+ valid = true;
+ } catch (UnknownHostException e) {
+ len = 0;
+ valid = false;
+ }
+ mask = 0;
+ } else {
+ int n = Integer.parseInt(subnet.substring(i + 1));
+ try {
+ sn = InetAddress.getByName(subnet.substring(0, i)).getAddress();
+ valid = true;
+ } catch (UnknownHostException e) {
+ valid = false;
+ }
+ len = n / 8;
+ mask = ((0xff00) >> (n % 8)) & 0xff;
+ }
+ }
+
+ public boolean isValid() {
+ return valid;
+ }
+
+ /**
+ * Is the IP address in the CIDR?
+ *
+ * @param addr the IP address as bytes in network byte order
+ * @return true if the IP address matches.
+ */
+ public boolean matches(byte[] addr) {
+ if (!valid || addr.length != sn.length) {
+ return false;
+ }
+ for (int i = 0; i < len; i++) {
+ if (addr[i] != sn[i]) {
+ return false;
+ }
+ }
+ if (mask != 0 && ((addr[len] ^ sn[len]) & mask) != 0) {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /**
+ * Get the list of node names for this route.
+ *
+ * @return the list
+ */
+ public SortedSet<String> getNodes() {
+ return this.nodes;
+ }
+
+ private Collection<String> readNodes() {
+ Collection<String> set = new TreeSet<String>();
+ PreparedStatement ps = null;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ String sql = "select NODEID from NODESETS where SETID = ?";
+ ps = conn.prepareStatement(sql);
+ ps.setInt(1, nodelist);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ int id = rs.getInt("NODEID");
+ set.add(lookupNodeID(id));
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return set;
+ }
+
+ /**
+ * Delete the IRT route having this IngressRoutes feed ID, user ID, and subnet from the database.
+ *
+ * @return true if the delete succeeded
+ */
+ @Override
+ public boolean doDelete(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ ps = c.prepareStatement("delete from INGRESS_ROUTES where FEEDID = ? and USERID = ? and SUBNET = ?");
+ ps.setInt(1, feedid);
+ ps.setString(2, userid);
+ ps.setString(3, subnet);
+ ps.execute();
+ ps.close();
+
+ ps = c.prepareStatement("delete from NODESETS where SETID = ?");
+ ps.setInt(1, nodelist);
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @SuppressWarnings("resource")
+ @Override
+ public boolean doInsert(Connection c) {
+ boolean rv = false;
+ PreparedStatement ps = null;
+ try {
+ // Create the NODESETS rows & set nodelist
+ int set = getMaxNodeSetID() + 1;
+ this.nodelist = set;
+ for (String node : nodes) {
+ int id = lookupNodeName(node);
+ ps = c.prepareStatement("insert into NODESETS (SETID, NODEID) values (?,?)");
+ ps.setInt(1, this.nodelist);
+ ps.setInt(2, id);
+ ps.execute();
+ ps.close();
+ }
+
+ // Create the INGRESS_ROUTES row
+ ps = c.prepareStatement("insert into INGRESS_ROUTES (SEQUENCE, FEEDID, USERID, SUBNET, NODESET) values (?, ?, ?, ?, ?)");
+ ps.setInt(1, this.seq);
+ ps.setInt(2, this.feedid);
+ ps.setString(3, this.userid);
+ ps.setString(4, this.subnet);
+ ps.setInt(5, this.nodelist);
+ ps.execute();
+ ps.close();
+ rv = true;
+ } catch (SQLException e) {
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doUpdate(Connection c) {
+ return doDelete(c) && doInsert(c);
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("feedid", feedid);
+ // Note: for user and subnet, null, "", and "-" are equivalent
+ if (userid != null && !userid.equals("-") && !userid.equals(""))
+ jo.put("user", userid);
+ if (subnet != null && !subnet.equals("-") && !subnet.equals(""))
+ jo.put("subnet", subnet);
+ jo.put("seq", seq);
+ jo.put("node", nodes);
+ return jo;
+ }
+
+ @Override
+ public String getKey() {
+ return String.format("%d/%s/%s/%d", feedid, (userid == null) ? "" : userid, (subnet == null) ? "" : subnet, seq);
+ }
+
+ @Override
+ public int hashCode() {
+ return toString().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ try {
+ if (!(obj instanceof IngressRoute))
+ return false;
+ return this.compareTo((IngressRoute) obj) == 0;
+ } catch (NullPointerException e) {
+ return false;
+ }
+ }
+
+ @Override
+ public int compareTo(IngressRoute in) {
+ if (in == null)
+ throw new NullPointerException();
+ int n = this.feedid - in.feedid;
+ if (n != 0)
+ return n;
+ n = this.seq - in.seq;
+ if (n != 0)
+ return n;
+ n = this.userid.compareTo(in.userid);
+ if (n != 0)
+ return n;
+ n = this.subnet.compareTo(in.subnet);
+ if (n != 0)
+ return n;
+ return this.nodes.equals(in.nodes) ? 0 : 1;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("INGRESS: feed=%d, userid=%s, subnet=%s, seq=%d", feedid, (userid == null) ? "" : userid, (subnet == null) ? "" : subnet, seq);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Insertable.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Insertable.java
index 62195378..6a677ce3 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Insertable.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Insertable.java
@@ -7,9 +7,9 @@
* * 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.
@@ -28,14 +28,16 @@ import java.sql.Connection;
/**
* An object that can be INSERT-ed into the database.
+ *
* @author Robert Eby
* @version $Id: Insertable.java,v 1.2 2013/05/29 14:44:36 eby Exp $
*/
public interface Insertable {
- /**
- * Insert this object into the DB.
- * @param c the JDBC Connection to use
- * @return true if the INSERT succeeded, false otherwise
- */
- public boolean doInsert(Connection c);
+ /**
+ * Insert this object into the DB.
+ *
+ * @param c the JDBC Connection to use
+ * @return true if the INSERT succeeded, false otherwise
+ */
+ public boolean doInsert(Connection c);
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/JSONable.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/JSONable.java
index f276bd3d..82313273 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/JSONable.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/JSONable.java
@@ -7,9 +7,9 @@
* * 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.
@@ -28,13 +28,15 @@ import org.json.JSONObject;
/**
* An object that can be represented as a {@link JSONObject}.
+ *
* @author Robert Eby
* @version $Id: JSONable.java,v 1.1 2013/04/26 21:00:26 eby Exp $
*/
public interface JSONable {
- /**
- * Get a JSONObject representing this object.
- * @return the JSONObject
- */
- public JSONObject asJSONObject();
+ /**
+ * Get a JSONObject representing this object.
+ *
+ * @return the JSONObject
+ */
+ public JSONObject asJSONObject();
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LOGJSONable.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LOGJSONable.java
index 53897a73..3b7add5c 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LOGJSONable.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LOGJSONable.java
@@ -7,9 +7,9 @@
* * 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.
@@ -28,13 +28,15 @@ import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;
/**
* An object that can be represented as a {@link LOGJSONObject}.
+ *
* @author Robert Eby
* @version $Id: JSONable.java,v 1.1 2013/04/26 21:00:26 eby Exp $
*/
public interface LOGJSONable {
- /**
- * Get a JSONObject representing this object.
- * @return the JSONObject
- */
- public LOGJSONObject asJSONObject();
+ /**
+ * Get a JSONObject representing this object.
+ *
+ * @return the JSONObject
+ */
+ public LOGJSONObject asJSONObject();
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Loadable.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Loadable.java
index 957d71d0..ae64e84d 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Loadable.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Loadable.java
@@ -7,9 +7,9 @@
* * 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.
@@ -37,29 +37,30 @@ import org.onap.dmaap.datarouter.provisioning.utils.LogfileLoader;
* @version $Id: Loadable.java,v 1.2 2013/08/06 13:28:33 eby Exp $
*/
public interface Loadable {
- /**
- * Load the 18 fields in the PreparedStatement <i>ps</i>. The fields are:
- * <ol>
- * <li>type (String)</li>
- * <li>event_time (long)</li>
- * <li>publish ID (String)</li>
- * <li>feed ID (int)</li>
- * <li>request URI (String)</li>
- * <li>method (String)</li>
- * <li>content type (String)</li>
- * <li>content length (long)</li>
- * <li>feed File ID (String)</li>
- * <li>remote address (String)</li>
- * <li>user (String)</li>
- * <li>status (int)</li>
- * <li>delivery subscriber id (int)</li>
- * <li>delivery File ID (String)</li>
- * <li>result (int)</li>
- * <li>attempts (int)</li>
- * <li>reason (String)</li>
- * <li>record ID (long)</li>
- * </ol>
- * @param ps the PreparedStatement to load
- */
- public void load(PreparedStatement ps) throws SQLException;
+ /**
+ * Load the 18 fields in the PreparedStatement <i>ps</i>. The fields are:
+ * <ol>
+ * <li>type (String)</li>
+ * <li>event_time (long)</li>
+ * <li>publish ID (String)</li>
+ * <li>feed ID (int)</li>
+ * <li>request URI (String)</li>
+ * <li>method (String)</li>
+ * <li>content type (String)</li>
+ * <li>content length (long)</li>
+ * <li>feed File ID (String)</li>
+ * <li>remote address (String)</li>
+ * <li>user (String)</li>
+ * <li>status (int)</li>
+ * <li>delivery subscriber id (int)</li>
+ * <li>delivery File ID (String)</li>
+ * <li>result (int)</li>
+ * <li>attempts (int)</li>
+ * <li>reason (String)</li>
+ * <li>record ID (long)</li>
+ * </ol>
+ *
+ * @param ps the PreparedStatement to load
+ */
+ public void load(PreparedStatement ps) throws SQLException;
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LogRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LogRecord.java
index dbb2133b..1853ee30 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LogRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/LogRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -41,195 +41,198 @@ import org.onap.dmaap.datarouter.provisioning.utils.RLEBitSet;
/**
* The representation of a Log Record, as retrieved from the DB. Since this record format is only used
* to replicate between provisioning servers, it is very bare-bones; e.g. there are no field setters and only 1 getter.
+ *
* @author Robert Eby
* @version $Id: LogRecord.java,v 1.7 2014/03/12 19:45:41 eby Exp $
*/
public class LogRecord extends BaseLogRecord {
- /**
- * Print all log records whose RECORD_IDs are in the bit set provided.
- * @param os the {@link OutputStream} to print the records on
- * @param bs the {@link RLEBitSet} listing the record IDs to print
- * @throws IOException
- */
- public static void printLogRecords(OutputStream os, RLEBitSet bs) throws IOException {
- final String sql = "select * from LOG_RECORDS where RECORD_ID >= ? AND RECORD_ID <= ?";
- DB db = new DB();
- Connection conn = null;
- try {
- conn = db.getConnection();
- Statement stmt = conn.createStatement();
- Iterator<Long[]> iter = bs.getRangeIterator();
- PreparedStatement ps = conn.prepareStatement(sql);
- while (iter.hasNext()) {
- Long[] n = iter.next();
- ps.setLong(1, n[0]);
- ps.setLong(2, n[1]);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- LogRecord lr = new LogRecord(rs);
- os.write(lr.toString().getBytes());
- }
- rs.close();
- ps.clearParameters();
- }
- ps.close();
- stmt.close();
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- if (conn != null)
- db.release(conn);
- }
- }
-
- private final String type;
- private final String feedFileid;
- private final String remoteAddr;
- private final String user;
- private final int status;
- private final int subid;
- private final String fileid;
- private final int result;
- private final int attempts;
- private final String reason;
- private final long record_id;
- private final long clength2;
-
- public LogRecord(ResultSet rs) throws SQLException {
- super(rs);
- this.type = rs.getString("TYPE");
- this.feedFileid = rs.getString("FEED_FILEID");
- this.remoteAddr = rs.getString("REMOTE_ADDR");
- this.user = rs.getString("USER");
- this.status = rs.getInt("STATUS");
-
- this.subid = rs.getInt("DELIVERY_SUBID");
- this.fileid = rs.getString("DELIVERY_FILEID");
- this.result = rs.getInt("RESULT");
-
- this.attempts = rs.getInt("ATTEMPTS");
- this.reason = rs.getString("REASON");
-
- this.record_id = rs.getLong("RECORD_ID");
- this.clength2 = rs.getLong("CONTENT_LENGTH_2");
- }
- public LogRecord(String[] pp) throws ParseException {
- super(pp);
- this.type = pp[8];
- this.feedFileid = pp[9];
- this.remoteAddr = pp[10];
- this.user = pp[11];
- this.status = Integer.parseInt(pp[12]);
-
- this.subid = Integer.parseInt(pp[13]);
- this.fileid = pp[14];
- this.result = Integer.parseInt(pp[15]);
-
- this.attempts = Integer.parseInt(pp[16]);
- this.reason = pp[17];
-
- this.record_id = Long.parseLong(pp[18]);
- this.clength2 = (pp.length == 20) ? Long.parseLong(pp[19]) : 0;
- }
-
- public long getRecordId() {
- return record_id;
- }
-
- @Override
- public String toString() {
- return
- sdf.format(getEventTime()) + "|"
- + "LOG|"
- + getPublishId() + "|"
- + getFeedid() + "|"
- + getRequestUri() + "|"
- + getMethod() + "|"
- + getContentType() + "|"
- + getContentLength() + "|"
- + type + "|"
- + feedFileid + "|"
- + remoteAddr + "|"
- + user + "|"
- + status + "|"
- + subid + "|"
- + fileid + "|"
- + result + "|"
- + attempts + "|"
- + reason + "|"
- + record_id + "|"
- + clength2
- + "\n";
- }
-
- @Override
- public void load(PreparedStatement ps) throws SQLException {
- ps.setString(1, type);
- super.load(ps); // loads fields 2-8
- if (type.equals("pub")) {
- ps.setString(9, feedFileid);
- ps.setString(10, remoteAddr);
- ps.setString(11, user);
- ps.setInt (12, status);
- ps.setNull (13, Types.INTEGER);
- ps.setNull (14, Types.VARCHAR);
- ps.setNull (15, Types.INTEGER);
- ps.setNull (16, Types.INTEGER);
- ps.setNull (17, Types.VARCHAR);
- ps.setLong (18, record_id);
- ps.setNull (19, Types.BIGINT);
- } else if (type.equals("del")) {
- ps.setNull (9, Types.VARCHAR);
- ps.setNull (10, Types.VARCHAR);
- ps.setString(11, user);
- ps.setNull (12, Types.INTEGER);
- ps.setInt (13, subid);
- ps.setString(14, fileid);
- ps.setInt (15, result);
- ps.setNull (16, Types.INTEGER);
- ps.setNull (17, Types.VARCHAR);
- ps.setLong (18, record_id);
- ps.setNull (19, Types.BIGINT);
- } else if (type.equals("exp")) {
- ps.setNull (9, Types.VARCHAR);
- ps.setNull (10, Types.VARCHAR);
- ps.setNull (11, Types.VARCHAR);
- ps.setNull (12, Types.INTEGER);
- ps.setInt (13, subid);
- ps.setString(14, fileid);
- ps.setNull (15, Types.INTEGER);
- ps.setInt (16, attempts);
- ps.setString(17, reason);
- ps.setLong (18, record_id);
- ps.setNull (19, Types.BIGINT);
- } else if (type.equals("pbf")) {
- ps.setString( 9, feedFileid);
- ps.setString(10, remoteAddr);
- ps.setString(11, user);
- ps.setNull (12, Types.INTEGER);
- ps.setNull (13, Types.INTEGER);
- ps.setNull (14, Types.VARCHAR);
- ps.setNull (15, Types.INTEGER);
- ps.setNull (16, Types.INTEGER);
- ps.setNull (17, Types.VARCHAR);
- ps.setLong (18, record_id);
- ps.setLong (19, clength2);
- } else if (type.equals("dlx")) {
- ps.setNull ( 9, Types.VARCHAR);
- ps.setNull (10, Types.VARCHAR);
- ps.setNull (11, Types.VARCHAR);
- ps.setNull (12, Types.INTEGER);
- ps.setInt (13, subid);
- ps.setNull (14, Types.VARCHAR);
- ps.setNull (15, Types.INTEGER);
- ps.setNull (16, Types.INTEGER);
- ps.setNull (17, Types.VARCHAR);
- ps.setLong (18, record_id);
- ps.setLong (19, clength2);
- }
- }
-
- public static void main(String[] a) throws IOException {
- LogRecord.printLogRecords(System.out, new RLEBitSet(a[0]));
- }
+ /**
+ * Print all log records whose RECORD_IDs are in the bit set provided.
+ *
+ * @param os the {@link OutputStream} to print the records on
+ * @param bs the {@link RLEBitSet} listing the record IDs to print
+ * @throws IOException
+ */
+ public static void printLogRecords(OutputStream os, RLEBitSet bs) throws IOException {
+ final String sql = "select * from LOG_RECORDS where RECORD_ID >= ? AND RECORD_ID <= ?";
+ DB db = new DB();
+ Connection conn = null;
+ try {
+ conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ Iterator<Long[]> iter = bs.getRangeIterator();
+ PreparedStatement ps = conn.prepareStatement(sql);
+ while (iter.hasNext()) {
+ Long[] n = iter.next();
+ ps.setLong(1, n[0]);
+ ps.setLong(2, n[1]);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ LogRecord lr = new LogRecord(rs);
+ os.write(lr.toString().getBytes());
+ }
+ rs.close();
+ ps.clearParameters();
+ }
+ ps.close();
+ stmt.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ if (conn != null)
+ db.release(conn);
+ }
+ }
+
+ private final String type;
+ private final String feedFileid;
+ private final String remoteAddr;
+ private final String user;
+ private final int status;
+ private final int subid;
+ private final String fileid;
+ private final int result;
+ private final int attempts;
+ private final String reason;
+ private final long record_id;
+ private final long clength2;
+
+ public LogRecord(ResultSet rs) throws SQLException {
+ super(rs);
+ this.type = rs.getString("TYPE");
+ this.feedFileid = rs.getString("FEED_FILEID");
+ this.remoteAddr = rs.getString("REMOTE_ADDR");
+ this.user = rs.getString("USER");
+ this.status = rs.getInt("STATUS");
+
+ this.subid = rs.getInt("DELIVERY_SUBID");
+ this.fileid = rs.getString("DELIVERY_FILEID");
+ this.result = rs.getInt("RESULT");
+
+ this.attempts = rs.getInt("ATTEMPTS");
+ this.reason = rs.getString("REASON");
+
+ this.record_id = rs.getLong("RECORD_ID");
+ this.clength2 = rs.getLong("CONTENT_LENGTH_2");
+ }
+
+ public LogRecord(String[] pp) throws ParseException {
+ super(pp);
+ this.type = pp[8];
+ this.feedFileid = pp[9];
+ this.remoteAddr = pp[10];
+ this.user = pp[11];
+ this.status = Integer.parseInt(pp[12]);
+
+ this.subid = Integer.parseInt(pp[13]);
+ this.fileid = pp[14];
+ this.result = Integer.parseInt(pp[15]);
+
+ this.attempts = Integer.parseInt(pp[16]);
+ this.reason = pp[17];
+
+ this.record_id = Long.parseLong(pp[18]);
+ this.clength2 = (pp.length == 20) ? Long.parseLong(pp[19]) : 0;
+ }
+
+ public long getRecordId() {
+ return record_id;
+ }
+
+ @Override
+ public String toString() {
+ return
+ sdf.format(getEventTime()) + "|"
+ + "LOG|"
+ + getPublishId() + "|"
+ + getFeedid() + "|"
+ + getRequestUri() + "|"
+ + getMethod() + "|"
+ + getContentType() + "|"
+ + getContentLength() + "|"
+ + type + "|"
+ + feedFileid + "|"
+ + remoteAddr + "|"
+ + user + "|"
+ + status + "|"
+ + subid + "|"
+ + fileid + "|"
+ + result + "|"
+ + attempts + "|"
+ + reason + "|"
+ + record_id + "|"
+ + clength2
+ + "\n";
+ }
+
+ @Override
+ public void load(PreparedStatement ps) throws SQLException {
+ ps.setString(1, type);
+ super.load(ps); // loads fields 2-8
+ if (type.equals("pub")) {
+ ps.setString(9, feedFileid);
+ ps.setString(10, remoteAddr);
+ ps.setString(11, user);
+ ps.setInt(12, status);
+ ps.setNull(13, Types.INTEGER);
+ ps.setNull(14, Types.VARCHAR);
+ ps.setNull(15, Types.INTEGER);
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setLong(18, record_id);
+ ps.setNull(19, Types.BIGINT);
+ } else if (type.equals("del")) {
+ ps.setNull(9, Types.VARCHAR);
+ ps.setNull(10, Types.VARCHAR);
+ ps.setString(11, user);
+ ps.setNull(12, Types.INTEGER);
+ ps.setInt(13, subid);
+ ps.setString(14, fileid);
+ ps.setInt(15, result);
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setLong(18, record_id);
+ ps.setNull(19, Types.BIGINT);
+ } else if (type.equals("exp")) {
+ ps.setNull(9, Types.VARCHAR);
+ ps.setNull(10, Types.VARCHAR);
+ ps.setNull(11, Types.VARCHAR);
+ ps.setNull(12, Types.INTEGER);
+ ps.setInt(13, subid);
+ ps.setString(14, fileid);
+ ps.setNull(15, Types.INTEGER);
+ ps.setInt(16, attempts);
+ ps.setString(17, reason);
+ ps.setLong(18, record_id);
+ ps.setNull(19, Types.BIGINT);
+ } else if (type.equals("pbf")) {
+ ps.setString(9, feedFileid);
+ ps.setString(10, remoteAddr);
+ ps.setString(11, user);
+ ps.setNull(12, Types.INTEGER);
+ ps.setNull(13, Types.INTEGER);
+ ps.setNull(14, Types.VARCHAR);
+ ps.setNull(15, Types.INTEGER);
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setLong(18, record_id);
+ ps.setLong(19, clength2);
+ } else if (type.equals("dlx")) {
+ ps.setNull(9, Types.VARCHAR);
+ ps.setNull(10, Types.VARCHAR);
+ ps.setNull(11, Types.VARCHAR);
+ ps.setNull(12, Types.INTEGER);
+ ps.setInt(13, subid);
+ ps.setNull(14, Types.VARCHAR);
+ ps.setNull(15, Types.INTEGER);
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setLong(18, record_id);
+ ps.setLong(19, clength2);
+ }
+ }
+
+ public static void main(String[] a) throws IOException {
+ LogRecord.printLogRecords(System.out, new RLEBitSet(a[0]));
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NetworkRoute.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NetworkRoute.java
index 74c5406c..f50043a8 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NetworkRoute.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NetworkRoute.java
@@ -7,9 +7,9 @@
* * 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.
@@ -43,187 +43,188 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: NetworkRoute.java,v 1.2 2013/12/16 20:30:23 eby Exp $
*/
public class NetworkRoute extends NodeClass implements Comparable<NetworkRoute> {
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private final int fromnode;
- private final int tonode;
- private final int vianode;
-
- /**
- * Get a set of all Network Routes in the DB. The set is sorted according to the natural sorting order
- * of the routes (based on the from and to node names in each route).
- * @return the sorted set
- */
- public static SortedSet<NetworkRoute> getAllNetworkRoutes() {
- SortedSet<NetworkRoute> set = new TreeSet<NetworkRoute>();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select FROMNODE, TONODE, VIANODE from NETWORK_ROUTES");
- while (rs.next()) {
- int fromnode = rs.getInt("FROMNODE");
- int tonode = rs.getInt("TONODE");
- int vianode = rs.getInt("VIANODE");
- set.add(new NetworkRoute(fromnode, tonode, vianode));
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return set;
- }
-
- public NetworkRoute(String fromnode, String tonode) throws IllegalArgumentException {
- this.fromnode = lookupNodeName(fromnode);
- this.tonode = lookupNodeName(tonode);
- this.vianode = -1;
- }
-
- public NetworkRoute(String fromnode, String tonode, String vianode) throws IllegalArgumentException {
- this.fromnode = lookupNodeName(fromnode);
- this.tonode = lookupNodeName(tonode);
- this.vianode = lookupNodeName(vianode);
- }
-
- public NetworkRoute(JSONObject jo) throws IllegalArgumentException {
- this.fromnode = lookupNodeName(jo.getString("from"));
- this.tonode = lookupNodeName(jo.getString("to"));
- this.vianode = lookupNodeName(jo.getString("via"));
- }
-
- public NetworkRoute(int fromnode, int tonode, int vianode) throws IllegalArgumentException {
- this.fromnode = fromnode;
- this.tonode = tonode;
- this.vianode = vianode;
- }
-
- public int getFromnode() {
- return fromnode;
- }
-
- public int getTonode() {
- return tonode;
- }
-
- public int getVianode() {
- return vianode;
- }
-
- @Override
- public boolean doDelete(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "delete from NETWORK_ROUTES where FROMNODE = ? AND TONODE = ?";
- ps = c.prepareStatement(sql);
- ps.setInt(1, fromnode);
- ps.setInt(2, tonode);
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- @Override
- public boolean doInsert(Connection c) {
- boolean rv = false;
- if (this.vianode >= 0) {
- PreparedStatement ps = null;
- try {
- // Create the NETWORK_ROUTES row
- String sql = "insert into NETWORK_ROUTES (FROMNODE, TONODE, VIANODE) values (?, ?, ?)";
- ps = c.prepareStatement(sql);
- ps.setInt(1, this.fromnode);
- ps.setInt(2, this.tonode);
- ps.setInt(3, this.vianode);
- ps.execute();
- ps.close();
- rv = true;
- } catch (SQLException e) {
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
- return rv;
- }
-
- @Override
- public boolean doUpdate(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "update NETWORK_ROUTES set VIANODE = ? where FROMNODE = ? and TONODE = ?";
- ps = c.prepareStatement(sql);
- ps.setInt(1, vianode);
- ps.setInt(2, fromnode);
- ps.setInt(3, tonode);
- ps.executeUpdate();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("from", lookupNodeID(fromnode));
- jo.put("to", lookupNodeID(tonode));
- jo.put("via", lookupNodeID(vianode));
- return jo;
- }
-
- @Override
- public String getKey() {
- return lookupNodeID(fromnode)+":"+lookupNodeID(tonode);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof NetworkRoute))
- return false;
- NetworkRoute on = (NetworkRoute)obj;
- return (fromnode == on.fromnode) && (tonode == on.tonode) && (vianode == on.vianode);
- }
-
- @Override
- public int compareTo(NetworkRoute o) {
- if (this.fromnode == o.fromnode) {
- if (this.tonode == o.tonode)
- return this.vianode - o.vianode;
- return this.tonode - o.tonode;
- }
- return this.fromnode - o.fromnode;
- }
-
- @Override
- public String toString() {
- return String.format("NETWORK: from=%d, to=%d, via=%d", fromnode, tonode, vianode);
- }
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private final int fromnode;
+ private final int tonode;
+ private final int vianode;
+
+ /**
+ * Get a set of all Network Routes in the DB. The set is sorted according to the natural sorting order
+ * of the routes (based on the from and to node names in each route).
+ *
+ * @return the sorted set
+ */
+ public static SortedSet<NetworkRoute> getAllNetworkRoutes() {
+ SortedSet<NetworkRoute> set = new TreeSet<NetworkRoute>();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select FROMNODE, TONODE, VIANODE from NETWORK_ROUTES");
+ while (rs.next()) {
+ int fromnode = rs.getInt("FROMNODE");
+ int tonode = rs.getInt("TONODE");
+ int vianode = rs.getInt("VIANODE");
+ set.add(new NetworkRoute(fromnode, tonode, vianode));
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return set;
+ }
+
+ public NetworkRoute(String fromnode, String tonode) throws IllegalArgumentException {
+ this.fromnode = lookupNodeName(fromnode);
+ this.tonode = lookupNodeName(tonode);
+ this.vianode = -1;
+ }
+
+ public NetworkRoute(String fromnode, String tonode, String vianode) throws IllegalArgumentException {
+ this.fromnode = lookupNodeName(fromnode);
+ this.tonode = lookupNodeName(tonode);
+ this.vianode = lookupNodeName(vianode);
+ }
+
+ public NetworkRoute(JSONObject jo) throws IllegalArgumentException {
+ this.fromnode = lookupNodeName(jo.getString("from"));
+ this.tonode = lookupNodeName(jo.getString("to"));
+ this.vianode = lookupNodeName(jo.getString("via"));
+ }
+
+ public NetworkRoute(int fromnode, int tonode, int vianode) throws IllegalArgumentException {
+ this.fromnode = fromnode;
+ this.tonode = tonode;
+ this.vianode = vianode;
+ }
+
+ public int getFromnode() {
+ return fromnode;
+ }
+
+ public int getTonode() {
+ return tonode;
+ }
+
+ public int getVianode() {
+ return vianode;
+ }
+
+ @Override
+ public boolean doDelete(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "delete from NETWORK_ROUTES where FROMNODE = ? AND TONODE = ?";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, fromnode);
+ ps.setInt(2, tonode);
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doInsert(Connection c) {
+ boolean rv = false;
+ if (this.vianode >= 0) {
+ PreparedStatement ps = null;
+ try {
+ // Create the NETWORK_ROUTES row
+ String sql = "insert into NETWORK_ROUTES (FROMNODE, TONODE, VIANODE) values (?, ?, ?)";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, this.fromnode);
+ ps.setInt(2, this.tonode);
+ ps.setInt(3, this.vianode);
+ ps.execute();
+ ps.close();
+ rv = true;
+ } catch (SQLException e) {
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doUpdate(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "update NETWORK_ROUTES set VIANODE = ? where FROMNODE = ? and TONODE = ?";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, vianode);
+ ps.setInt(2, fromnode);
+ ps.setInt(3, tonode);
+ ps.executeUpdate();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("from", lookupNodeID(fromnode));
+ jo.put("to", lookupNodeID(tonode));
+ jo.put("via", lookupNodeID(vianode));
+ return jo;
+ }
+
+ @Override
+ public String getKey() {
+ return lookupNodeID(fromnode) + ":" + lookupNodeID(tonode);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof NetworkRoute))
+ return false;
+ NetworkRoute on = (NetworkRoute) obj;
+ return (fromnode == on.fromnode) && (tonode == on.tonode) && (vianode == on.vianode);
+ }
+
+ @Override
+ public int compareTo(NetworkRoute o) {
+ if (this.fromnode == o.fromnode) {
+ if (this.tonode == o.tonode)
+ return this.vianode - o.vianode;
+ return this.tonode - o.tonode;
+ }
+ return this.fromnode - o.fromnode;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("NETWORK: from=%d, to=%d, via=%d", fromnode, tonode, vianode);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NodeClass.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NodeClass.java
index e3dd8524..28c3ec28 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NodeClass.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/NodeClass.java
@@ -7,9 +7,9 @@
* * 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.
@@ -43,136 +43,137 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: NodeClass.java,v 1.2 2014/01/15 16:08:43 eby Exp $
*/
public abstract class NodeClass extends Syncable {
- private static Map<String, Integer> map;
+ private static Map<String, Integer> map;
- public NodeClass() {
- // init on first use
- if (map == null) {
- reload();
- }
- }
+ public NodeClass() {
+ // init on first use
+ if (map == null) {
+ reload();
+ }
+ }
- /**
- * Add nodes to the NODES table, when the NODES parameter value is changed.
- * Nodes are only added to the table, they are never deleted. The node name is normalized
- * to contain the domain (if missing).
- * @param nodes a pipe separated list of the current nodes
- */
- public static void setNodes(String[] nodes) {
- if (map == null)
- reload();
- int nextid = 0;
- for (Integer n : map.values()) {
- if (n >= nextid)
- nextid = n+1;
- }
- // take | separated list, add domain if needed.
- Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- for (String node : nodes) {
- node = normalizeNodename(node);
- if (!map.containsKey(node)) {
- intlogger.info("..adding "+node+" to NODES with index "+nextid);
- map.put(node, nextid);
- PreparedStatement ps = null;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- ps = conn.prepareStatement("insert into NODES (NODEID, NAME, ACTIVE) values (?, ?, 1)");
- ps.setInt(1, nextid);
- ps.setString(2, node);
- ps.execute();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- nextid++;
- }
- }
- }
+ /**
+ * Add nodes to the NODES table, when the NODES parameter value is changed.
+ * Nodes are only added to the table, they are never deleted. The node name is normalized
+ * to contain the domain (if missing).
+ *
+ * @param nodes a pipe separated list of the current nodes
+ */
+ public static void setNodes(String[] nodes) {
+ if (map == null)
+ reload();
+ int nextid = 0;
+ for (Integer n : map.values()) {
+ if (n >= nextid)
+ nextid = n + 1;
+ }
+ // take | separated list, add domain if needed.
+ Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ for (String node : nodes) {
+ node = normalizeNodename(node);
+ if (!map.containsKey(node)) {
+ intlogger.info("..adding " + node + " to NODES with index " + nextid);
+ map.put(node, nextid);
+ PreparedStatement ps = null;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ ps = conn.prepareStatement("insert into NODES (NODEID, NAME, ACTIVE) values (?, ?, 1)");
+ ps.setInt(1, nextid);
+ ps.setString(2, node);
+ ps.execute();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ nextid++;
+ }
+ }
+ }
- public static void reload() {
- Map<String, Integer> m = new HashMap<String, Integer>();
- PreparedStatement ps = null;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- String sql = "select NODEID, NAME from NODES";
- ps = conn.prepareStatement(sql);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- int id = rs.getInt("NODEID");
- String name = rs.getString("NAME");
- m.put(name, id);
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- map = m;
- }
+ public static void reload() {
+ Map<String, Integer> m = new HashMap<String, Integer>();
+ PreparedStatement ps = null;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ String sql = "select NODEID, NAME from NODES";
+ ps = conn.prepareStatement(sql);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ int id = rs.getInt("NODEID");
+ String name = rs.getString("NAME");
+ m.put(name, id);
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ map = m;
+ }
- public static Integer lookupNodeName(final String name) throws IllegalArgumentException {
- Integer n = map.get(name);
- if (n == null)
- throw new IllegalArgumentException("Invalid node name: "+name);
- return n;
- }
+ public static Integer lookupNodeName(final String name) throws IllegalArgumentException {
+ Integer n = map.get(name);
+ if (n == null)
+ throw new IllegalArgumentException("Invalid node name: " + name);
+ return n;
+ }
- public static Collection<String> lookupNodeNames(String patt) throws IllegalArgumentException {
- Collection<String> coll = new TreeSet<String>();
- final Set<String> keyset = map.keySet();
- for (String s : patt.toLowerCase().split(",")) {
- if (s.endsWith("*")) {
- s = s.substring(0, s.length()-1);
- for (String s2 : keyset) {
- if (s2.startsWith(s))
- coll.add(s2);
- }
- } else if (keyset.contains(s)) {
- coll.add(s);
- } else if (keyset.contains(normalizeNodename(s))) {
- coll.add(normalizeNodename(s));
- } else {
- throw new IllegalArgumentException("Invalid node name: "+s);
- }
- }
- return coll;
- }
+ public static Collection<String> lookupNodeNames(String patt) throws IllegalArgumentException {
+ Collection<String> coll = new TreeSet<String>();
+ final Set<String> keyset = map.keySet();
+ for (String s : patt.toLowerCase().split(",")) {
+ if (s.endsWith("*")) {
+ s = s.substring(0, s.length() - 1);
+ for (String s2 : keyset) {
+ if (s2.startsWith(s))
+ coll.add(s2);
+ }
+ } else if (keyset.contains(s)) {
+ coll.add(s);
+ } else if (keyset.contains(normalizeNodename(s))) {
+ coll.add(normalizeNodename(s));
+ } else {
+ throw new IllegalArgumentException("Invalid node name: " + s);
+ }
+ }
+ return coll;
+ }
- protected String lookupNodeID(int n) {
- for (String s : map.keySet()) {
- if (map.get(s) == n)
- return s;
- }
- return null;
- }
+ protected String lookupNodeID(int n) {
+ for (String s : map.keySet()) {
+ if (map.get(s) == n)
+ return s;
+ }
+ return null;
+ }
- public static String normalizeNodename(String s) {
- if (s != null && s.indexOf('.') <= 0) {
- Parameters p = Parameters.getParameter(Parameters.PROV_DOMAIN);
- if (p != null) {
- String domain = p.getValue();
- s += "." + domain;
- }
- }
- return s.toLowerCase();
- }
+ public static String normalizeNodename(String s) {
+ if (s != null && s.indexOf('.') <= 0) {
+ Parameters p = Parameters.getParameter(Parameters.PROV_DOMAIN);
+ if (p != null) {
+ String domain = p.getValue();
+ s += "." + domain;
+ }
+ }
+ return s.toLowerCase();
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Parameters.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Parameters.java
index a47569fd..595a86db 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Parameters.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Parameters.java
@@ -7,9 +7,9 @@
* * 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.
@@ -40,217 +40,234 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
/**
* Methods to provide access to Provisioning parameters in the DB.
* This class also provides constants of the standard parameters used by the Data Router.
+ *
* @author Robert Eby
* @version $Id: Parameters.java,v 1.11 2014/03/12 19:45:41 eby Exp $
*/
public class Parameters extends Syncable {
- public static final String PROV_REQUIRE_SECURE = "PROV_REQUIRE_SECURE";
- public static final String PROV_REQUIRE_CERT = "PROV_REQUIRE_CERT";
- public static final String PROV_AUTH_ADDRESSES = "PROV_AUTH_ADDRESSES";
- public static final String PROV_AUTH_SUBJECTS = "PROV_AUTH_SUBJECTS";
- public static final String PROV_NAME = "PROV_NAME";
- public static final String PROV_ACTIVE_NAME = "PROV_ACTIVE_NAME";
- public static final String PROV_DOMAIN = "PROV_DOMAIN";
- public static final String PROV_MAXFEED_COUNT = "PROV_MAXFEED_COUNT";
- public static final String PROV_MAXSUB_COUNT = "PROV_MAXSUB_COUNT";
- public static final String PROV_POKETIMER1 = "PROV_POKETIMER1";
- public static final String PROV_POKETIMER2 = "PROV_POKETIMER2";
- public static final String PROV_SPECIAL_SUBNET = "PROV_SPECIAL_SUBNET";
- public static final String PROV_LOG_RETENTION = "PROV_LOG_RETENTION";
- public static final String NODES = "NODES";
- public static final String ACTIVE_POD = "ACTIVE_POD";
- public static final String STANDBY_POD = "STANDBY_POD";
- public static final String LOGROLL_INTERVAL = "LOGROLL_INTERVAL";
- public static final String DELIVERY_INIT_RETRY_INTERVAL = "DELIVERY_INIT_RETRY_INTERVAL";
- public static final String DELIVERY_MAX_RETRY_INTERVAL = "DELIVERY_MAX_RETRY_INTERVAL";
- public static final String DELIVERY_RETRY_RATIO = "DELIVERY_RETRY_RATIO";
- public static final String DELIVERY_MAX_AGE = "DELIVERY_MAX_AGE";
- public static final String THROTTLE_FILTER = "THROTTLE_FILTER";
- public static final String STATIC_ROUTING_NODES = "STATIC_ROUTING_NODES"; //Adding new param for static Routing - Rally:US664862-1610
+ public static final String PROV_REQUIRE_SECURE = "PROV_REQUIRE_SECURE";
+ public static final String PROV_REQUIRE_CERT = "PROV_REQUIRE_CERT";
+ public static final String PROV_AUTH_ADDRESSES = "PROV_AUTH_ADDRESSES";
+ public static final String PROV_AUTH_SUBJECTS = "PROV_AUTH_SUBJECTS";
+ public static final String PROV_NAME = "PROV_NAME";
+ public static final String PROV_ACTIVE_NAME = "PROV_ACTIVE_NAME";
+ public static final String PROV_DOMAIN = "PROV_DOMAIN";
+ public static final String PROV_MAXFEED_COUNT = "PROV_MAXFEED_COUNT";
+ public static final String PROV_MAXSUB_COUNT = "PROV_MAXSUB_COUNT";
+ public static final String PROV_POKETIMER1 = "PROV_POKETIMER1";
+ public static final String PROV_POKETIMER2 = "PROV_POKETIMER2";
+ public static final String PROV_SPECIAL_SUBNET = "PROV_SPECIAL_SUBNET";
+ public static final String PROV_LOG_RETENTION = "PROV_LOG_RETENTION";
+ public static final String NODES = "NODES";
+ public static final String ACTIVE_POD = "ACTIVE_POD";
+ public static final String STANDBY_POD = "STANDBY_POD";
+ public static final String LOGROLL_INTERVAL = "LOGROLL_INTERVAL";
+ public static final String DELIVERY_INIT_RETRY_INTERVAL = "DELIVERY_INIT_RETRY_INTERVAL";
+ public static final String DELIVERY_MAX_RETRY_INTERVAL = "DELIVERY_MAX_RETRY_INTERVAL";
+ public static final String DELIVERY_RETRY_RATIO = "DELIVERY_RETRY_RATIO";
+ public static final String DELIVERY_MAX_AGE = "DELIVERY_MAX_AGE";
+ public static final String THROTTLE_FILTER = "THROTTLE_FILTER";
+ public static final String STATIC_ROUTING_NODES = "STATIC_ROUTING_NODES"; //Adding new param for static Routing - Rally:US664862-1610
+
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+
+ private String keyname;
+ private String value;
+
+ /**
+ * Get all parameters in the DB as a Map.
+ *
+ * @return the Map of keynames/values from the DB.
+ */
+ public static Map<String, String> getParameters() {
+ Map<String, String> props = new HashMap<String, String>();
+ for (Parameters p : getParameterCollection()) {
+ props.put(p.getKeyname(), p.getValue());
+ }
+ return props;
+ }
+
+ public static Collection<Parameters> getParameterCollection() {
+ Collection<Parameters> coll = new ArrayList<Parameters>();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ String sql = "select * from PARAMETERS";
+ ResultSet rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ Parameters p = new Parameters(rs);
+ coll.add(p);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return coll;
+ }
+
+ /**
+ * Get a specific parameter value from the DB.
+ *
+ * @param k the key to lookup
+ * @return the value, or null if non-existant
+ */
+ public static Parameters getParameter(String k) {
+ Parameters v = null;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ String sql = "select KEYNAME, VALUE from PARAMETERS where KEYNAME = \"" + k + "\"";
+ ResultSet rs = stmt.executeQuery(sql);
+ if (rs.next()) {
+ v = new Parameters(rs);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return v;
+ }
+
+ public Parameters() {
+ this("", "");
+ }
+
+ public Parameters(String k, String v) {
+ this.keyname = k;
+ this.value = v;
+ }
+
+ public Parameters(ResultSet rs) throws SQLException {
+ this.keyname = rs.getString("KEYNAME");
+ this.value = rs.getString("VALUE");
+ }
+
+ public String getKeyname() {
+ return keyname;
+ }
+
+ public void setKeyname(String keyname) {
+ this.keyname = keyname;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("keyname", keyname);
+ jo.put("value", value);
+ return jo;
+ }
+
+ @Override
+ public boolean doInsert(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ // Create the SUBSCRIPTIONS row
+ String sql = "insert into PARAMETERS values (?, ?)";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, getKeyname());
+ ps.setString(2, getValue());
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ @Override
+ public boolean doUpdate(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ // Update the PARAMETERS row
+ String sql = "update PARAMETERS set VALUE = ? where KEYNAME = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, getValue());
+ ps.setString(2, getKeyname());
+ ps.executeUpdate();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
- private String keyname;
- private String value;
+ @Override
+ public boolean doDelete(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ // Create the SUBSCRIPTIONS row
+ String sql = "delete from PARAMETERS where KEYNAME = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, getKeyname());
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
- /**
- * Get all parameters in the DB as a Map.
- * @return the Map of keynames/values from the DB.
- */
- public static Map<String,String> getParameters() {
- Map<String,String> props = new HashMap<String,String>();
- for (Parameters p : getParameterCollection()) {
- props.put(p.getKeyname(), p.getValue());
- }
- return props;
- }
- public static Collection<Parameters> getParameterCollection() {
- Collection<Parameters> coll = new ArrayList<Parameters>();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- String sql = "select * from PARAMETERS";
- ResultSet rs = stmt.executeQuery(sql);
- while (rs.next()) {
- Parameters p = new Parameters(rs);
- coll.add(p);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return coll;
- }
- /**
- * Get a specific parameter value from the DB.
- * @param k the key to lookup
- * @return the value, or null if non-existant
- */
- public static Parameters getParameter(String k) {
- Parameters v = null;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- String sql = "select KEYNAME, VALUE from PARAMETERS where KEYNAME = \"" + k + "\"";
- ResultSet rs = stmt.executeQuery(sql);
- if (rs.next()) {
- v = new Parameters(rs);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return v;
- }
+ @Override
+ public String getKey() {
+ return getKeyname();
+ }
- public Parameters() {
- this("", "");
- }
- public Parameters(String k, String v) {
- this.keyname = k;
- this.value = v;
- }
- public Parameters(ResultSet rs) throws SQLException {
- this.keyname = rs.getString("KEYNAME");
- this.value = rs.getString("VALUE");
- }
- public String getKeyname() {
- return keyname;
- }
- public void setKeyname(String keyname) {
- this.keyname = keyname;
- }
- public String getValue() {
- return value;
- }
- public void setValue(String value) {
- this.value = value;
- }
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("keyname", keyname);
- jo.put("value", value);
- return jo;
- }
- @Override
- public boolean doInsert(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- // Create the SUBSCRIPTIONS row
- String sql = "insert into PARAMETERS values (?, ?)";
- ps = c.prepareStatement(sql);
- ps.setString(1, getKeyname());
- ps.setString(2, getValue());
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public boolean doUpdate(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- // Update the PARAMETERS row
- String sql = "update PARAMETERS set VALUE = ? where KEYNAME = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, getValue());
- ps.setString(2, getKeyname());
- ps.executeUpdate();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public boolean doDelete(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- // Create the SUBSCRIPTIONS row
- String sql = "delete from PARAMETERS where KEYNAME = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, getKeyname());
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public String getKey() {
- return getKeyname();
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Parameters))
- return false;
- Parameters of = (Parameters) obj;
- if (!keyname.equals(of.keyname))
- return false;
- if (!value.equals(of.value))
- return false;
- return true;
- }
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Parameters))
+ return false;
+ Parameters of = (Parameters) obj;
+ if (!keyname.equals(of.keyname))
+ return false;
+ if (!value.equals(of.value))
+ return false;
+ return true;
+ }
- @Override
- public String toString() {
- return "PARAM: keyname=" + keyname + ", value=" + value;
- }
+ @Override
+ public String toString() {
+ return "PARAM: keyname=" + keyname + ", value=" + value;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PubFailRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PubFailRecord.java
index de2ad731..cead8b05 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PubFailRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PubFailRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -31,55 +31,62 @@ import java.text.ParseException;
/**
* The representation of a Publish Failure (PBF) Record, as retrieved from the DB.
+ *
* @author Robert Eby
* @version $Id: PubFailRecord.java,v 1.1 2013/10/28 18:06:53 eby Exp $
*/
public class PubFailRecord extends BaseLogRecord {
- private long contentLengthReceived;
- private String sourceIP;
- private String user;
- private String error;
+ private long contentLengthReceived;
+ private String sourceIP;
+ private String user;
+ private String error;
+
+ public PubFailRecord(String[] pp) throws ParseException {
+ super(pp);
+ this.contentLengthReceived = Long.parseLong(pp[8]);
+ this.sourceIP = pp[9];
+ this.user = pp[10];
+ this.error = pp[11];
+ }
+
+ public PubFailRecord(ResultSet rs) throws SQLException {
+ super(rs);
+ // Note: because this record should be "rare" these fields are mapped to unconventional fields in the DB
+ this.contentLengthReceived = rs.getLong("CONTENT_LENGTH_2");
+ this.sourceIP = rs.getString("REMOTE_ADDR");
+ this.user = rs.getString("USER");
+ this.error = rs.getString("FEED_FILEID");
+ }
+
+ public long getContentLengthReceived() {
+ return contentLengthReceived;
+ }
+
+ public String getSourceIP() {
+ return sourceIP;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public String getError() {
+ return error;
+ }
- public PubFailRecord(String[] pp) throws ParseException {
- super(pp);
- this.contentLengthReceived = Long.parseLong(pp[8]);
- this.sourceIP = pp[9];
- this.user = pp[10];
- this.error = pp[11];
- }
- public PubFailRecord(ResultSet rs) throws SQLException {
- super(rs);
- // Note: because this record should be "rare" these fields are mapped to unconventional fields in the DB
- this.contentLengthReceived = rs.getLong("CONTENT_LENGTH_2");
- this.sourceIP = rs.getString("REMOTE_ADDR");
- this.user = rs.getString("USER");
- this.error = rs.getString("FEED_FILEID");
- }
- public long getContentLengthReceived() {
- return contentLengthReceived;
- }
- public String getSourceIP() {
- return sourceIP;
- }
- public String getUser() {
- return user;
- }
- public String getError() {
- return error;
- }
- @Override
- public void load(PreparedStatement ps) throws SQLException {
- ps.setString(1, "pbf"); // field 1: type
- super.load(ps); // loads fields 2-8
- ps.setString( 9, getError());
- ps.setString(10, getSourceIP());
- ps.setString(11, getUser());
- ps.setNull (12, Types.INTEGER);
- ps.setNull (13, Types.INTEGER);
- ps.setNull (14, Types.VARCHAR);
- ps.setNull (15, Types.INTEGER);
- ps.setNull (16, Types.INTEGER);
- ps.setNull (17, Types.VARCHAR);
- ps.setLong (19, getContentLengthReceived());
- }
+ @Override
+ public void load(PreparedStatement ps) throws SQLException {
+ ps.setString(1, "pbf"); // field 1: type
+ super.load(ps); // loads fields 2-8
+ ps.setString(9, getError());
+ ps.setString(10, getSourceIP());
+ ps.setString(11, getUser());
+ ps.setNull(12, Types.INTEGER);
+ ps.setNull(13, Types.INTEGER);
+ ps.setNull(14, Types.VARCHAR);
+ ps.setNull(15, Types.INTEGER);
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setLong(19, getContentLengthReceived());
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecord.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecord.java
index 74a97ccc..e7575ff3 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecord.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecord.java
@@ -7,9 +7,9 @@
* * 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.
@@ -35,120 +35,124 @@ import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;
/**
* The representation of a Publish Record, as retrieved from the DB.
+ *
* @author Robert Eby
* @version $Id: PublishRecord.java,v 1.6 2013/10/28 18:06:53 eby Exp $
*/
public class PublishRecord extends BaseLogRecord {
- private String feedFileid;
- private String remoteAddr;
- private String user;
- private int status;
-
- public PublishRecord(String[] pp) throws ParseException {
- super(pp);
-// This is too slow!
-// Matcher m = Pattern.compile(".*/publish/(\\d+)/(.*)$").matcher(pp[4]);
-// if (!m.matches())
-// throw new ParseException("bad pattern", 0);
-// this.feedFileid = m.group(2);
- int ix = pp[4].indexOf("/publish/");
- if (ix < 0)
- throw new ParseException("bad pattern", 0);
- ix = pp[4].indexOf('/', ix+9);
- if (ix < 0)
- throw new ParseException("bad pattern", 0);
- this.feedFileid = pp[4].substring(ix+1);
- this.remoteAddr = pp[8];
- this.user = pp[9];
- this.status = Integer.parseInt(pp[10]);
- }
- public PublishRecord(ResultSet rs) throws SQLException {
- super(rs);
- this.feedFileid = rs.getString("FEED_FILEID");
- this.remoteAddr = rs.getString("REMOTE_ADDR");
- this.user = rs.getString("USER");
- this.status = rs.getInt("STATUS");
- }
- public String getFeedFileid() {
- return feedFileid;
- }
-
- public void setFeedFileid(String feedFileid) {
- this.feedFileid = feedFileid;
- }
-
- public String getRemoteAddr() {
- return remoteAddr;
- }
-
- public void setRemoteAddr(String remoteAddr) {
- this.remoteAddr = remoteAddr;
- }
-
- public String getUser() {
- return user;
- }
-
- public void setUser(String user) {
- this.user = user;
- }
-
- public int getStatus() {
- return status;
- }
-
- public void setStatus(int status) {
- this.status = status;
- }
-
-
- public LOGJSONObject reOrderObject(LOGJSONObject jo) {
- LinkedHashMap<String,Object> logrecordObj = new LinkedHashMap<String,Object>();
-
-
- logrecordObj.put("statusCode", jo.get("statusCode"));
- logrecordObj.put("publishId", jo.get("publishId"));
- logrecordObj.put("requestURI", jo.get("requestURI"));
- logrecordObj.put("sourceIP", jo.get("sourceIP"));
- logrecordObj.put("method", jo.get("method"));
- logrecordObj.put("contentType", jo.get("contentType"));
- logrecordObj.put("endpointId", jo.get("endpointId"));
- logrecordObj.put("type", jo.get("type"));
- logrecordObj.put("date", jo.get("date"));
- logrecordObj.put("contentLength", jo.get("contentLength"));
-
- LOGJSONObject newjo = new LOGJSONObject(logrecordObj);
- return newjo;
- }
-
- @Override
- public LOGJSONObject asJSONObject() {
- LOGJSONObject jo = super.asJSONObject();
- jo.put("type", "pub");
-// jo.put("feedFileid", feedFileid);
-// jo.put("remoteAddr", remoteAddr);
-// jo.put("user", user);
- jo.put("sourceIP", remoteAddr);
- jo.put("endpointId", user);
- jo.put("statusCode", status);
-
- LOGJSONObject newjo = this.reOrderObject(jo);
-
- return newjo;
- }
- @Override
- public void load(PreparedStatement ps) throws SQLException {
- ps.setString(1, "pub"); // field 1: type
- super.load(ps); // loads fields 2-8
- ps.setString( 9, getFeedFileid());
- ps.setString(10, getRemoteAddr());
- ps.setString(11, getUser());
- ps.setInt (12, getStatus());
- ps.setNull (13, Types.INTEGER);
- ps.setNull (14, Types.VARCHAR);
- ps.setNull (15, Types.INTEGER);
- ps.setNull (16, Types.INTEGER);
- ps.setNull (17, Types.VARCHAR);
- ps.setNull (19, Types.BIGINT);
- }
+ private String feedFileid;
+ private String remoteAddr;
+ private String user;
+ private int status;
+
+ public PublishRecord(String[] pp) throws ParseException {
+ super(pp);
+// This is too slow!
+// Matcher m = Pattern.compile(".*/publish/(\\d+)/(.*)$").matcher(pp[4]);
+// if (!m.matches())
+// throw new ParseException("bad pattern", 0);
+// this.feedFileid = m.group(2);
+ int ix = pp[4].indexOf("/publish/");
+ if (ix < 0)
+ throw new ParseException("bad pattern", 0);
+ ix = pp[4].indexOf('/', ix + 9);
+ if (ix < 0)
+ throw new ParseException("bad pattern", 0);
+ this.feedFileid = pp[4].substring(ix + 1);
+ this.remoteAddr = pp[8];
+ this.user = pp[9];
+ this.status = Integer.parseInt(pp[10]);
+ }
+
+ public PublishRecord(ResultSet rs) throws SQLException {
+ super(rs);
+ this.feedFileid = rs.getString("FEED_FILEID");
+ this.remoteAddr = rs.getString("REMOTE_ADDR");
+ this.user = rs.getString("USER");
+ this.status = rs.getInt("STATUS");
+ }
+
+ public String getFeedFileid() {
+ return feedFileid;
+ }
+
+ public void setFeedFileid(String feedFileid) {
+ this.feedFileid = feedFileid;
+ }
+
+ public String getRemoteAddr() {
+ return remoteAddr;
+ }
+
+ public void setRemoteAddr(String remoteAddr) {
+ this.remoteAddr = remoteAddr;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+
+ public LOGJSONObject reOrderObject(LOGJSONObject jo) {
+ LinkedHashMap<String, Object> logrecordObj = new LinkedHashMap<String, Object>();
+
+
+ logrecordObj.put("statusCode", jo.get("statusCode"));
+ logrecordObj.put("publishId", jo.get("publishId"));
+ logrecordObj.put("requestURI", jo.get("requestURI"));
+ logrecordObj.put("sourceIP", jo.get("sourceIP"));
+ logrecordObj.put("method", jo.get("method"));
+ logrecordObj.put("contentType", jo.get("contentType"));
+ logrecordObj.put("endpointId", jo.get("endpointId"));
+ logrecordObj.put("type", jo.get("type"));
+ logrecordObj.put("date", jo.get("date"));
+ logrecordObj.put("contentLength", jo.get("contentLength"));
+
+ LOGJSONObject newjo = new LOGJSONObject(logrecordObj);
+ return newjo;
+ }
+
+ @Override
+ public LOGJSONObject asJSONObject() {
+ LOGJSONObject jo = super.asJSONObject();
+ jo.put("type", "pub");
+// jo.put("feedFileid", feedFileid);
+// jo.put("remoteAddr", remoteAddr);
+// jo.put("user", user);
+ jo.put("sourceIP", remoteAddr);
+ jo.put("endpointId", user);
+ jo.put("statusCode", status);
+
+ LOGJSONObject newjo = this.reOrderObject(jo);
+
+ return newjo;
+ }
+
+ @Override
+ public void load(PreparedStatement ps) throws SQLException {
+ ps.setString(1, "pub"); // field 1: type
+ super.load(ps); // loads fields 2-8
+ ps.setString(9, getFeedFileid());
+ ps.setString(10, getRemoteAddr());
+ ps.setString(11, getUser());
+ ps.setInt(12, getStatus());
+ ps.setNull(13, Types.INTEGER);
+ ps.setNull(14, Types.VARCHAR);
+ ps.setNull(15, Types.INTEGER);
+ ps.setNull(16, Types.INTEGER);
+ ps.setNull(17, Types.VARCHAR);
+ ps.setNull(19, Types.BIGINT);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubDelivery.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubDelivery.java
index 2341f2ba..fe60f89f 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubDelivery.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubDelivery.java
@@ -7,9 +7,9 @@
* * 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.
@@ -32,78 +32,90 @@ import org.json.JSONObject;
/**
* The representation of Subscription delivery information. This includes the URL to deliver to,
* login and password, and whether to use the "HTTP 100-continue" feature for this subscription.
+ *
* @author Robert Eby
* @version $Id: SubDelivery.java,v 1.2 2013/06/20 14:11:05 eby Exp $
*/
public class SubDelivery implements JSONable {
- private String url;
- private String user;
- private String password;
- private boolean use100;
-
- public SubDelivery() {
- this("", "", "", false);
- }
- public SubDelivery(String url, String user, String password, boolean use100) {
- this.url = url;
- this.user = user;
- this.password = password;
- this.use100 = use100;
- }
- public SubDelivery(ResultSet rs) throws SQLException {
- this.url = rs.getString("DELIVERY_URL");
- this.user = rs.getString("DELIVERY_USER");
- this.password = rs.getString("DELIVERY_PASSWORD");
- this.use100 = rs.getBoolean("DELIVERY_USE100");
-
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getUser() {
- return user;
- }
- public void setUser(String user) {
- this.user = user;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
-
- public boolean isUse100() {
- return use100;
- }
- public void setUse100(boolean use100) {
- this.use100 = use100;
- }
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("url", url);
- jo.put("user", user);
- jo.put("password", password);
- jo.put("use100", use100);
- return jo;
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof SubDelivery))
- return false;
- SubDelivery os = (SubDelivery) obj;
- if (!url.equals(os.url))
- return false;
- if (!user.equals(os.user))
- return false;
- if (!password.equals(os.password))
- return false;
- if (use100 != os.use100)
- return false;
- return true;
- }
+ private String url;
+ private String user;
+ private String password;
+ private boolean use100;
+
+ public SubDelivery() {
+ this("", "", "", false);
+ }
+
+ public SubDelivery(String url, String user, String password, boolean use100) {
+ this.url = url;
+ this.user = user;
+ this.password = password;
+ this.use100 = use100;
+ }
+
+ public SubDelivery(ResultSet rs) throws SQLException {
+ this.url = rs.getString("DELIVERY_URL");
+ this.user = rs.getString("DELIVERY_USER");
+ this.password = rs.getString("DELIVERY_PASSWORD");
+ this.use100 = rs.getBoolean("DELIVERY_USE100");
+
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+ public void setUser(String user) {
+ this.user = user;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public boolean isUse100() {
+ return use100;
+ }
+
+ public void setUse100(boolean use100) {
+ this.use100 = use100;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("url", url);
+ jo.put("user", user);
+ jo.put("password", password);
+ jo.put("use100", use100);
+ return jo;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof SubDelivery))
+ return false;
+ SubDelivery os = (SubDelivery) obj;
+ if (!url.equals(os.url))
+ return false;
+ if (!user.equals(os.user))
+ return false;
+ if (!password.equals(os.password))
+ return false;
+ if (use100 != os.use100)
+ return false;
+ return true;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubLinks.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubLinks.java
index 2f66a498..f07a76e2 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubLinks.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/SubLinks.java
@@ -7,9 +7,9 @@
* * 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.
@@ -30,66 +30,76 @@ import org.json.JSONObject;
/**
* The URLs associated with a Subscription.
+ *
* @author Robert Eby
* @version $Id: SubLinks.java,v 1.3 2013/07/05 13:48:05 eby Exp $
*/
public class SubLinks implements JSONable {
- private String self;
- private String feed;
- private String log;
-
- public SubLinks() {
- self = feed = log = null;
- }
- public SubLinks(JSONObject jo) throws InvalidObjectException {
- this();
- self = jo.getString("self");
- feed = jo.getString("feed");
- log = jo.getString("log");
- }
- public SubLinks(String self, String feed, String log) {
- this.self = self;
- this.feed = feed;
- this.log = log;
- }
- public String getSelf() {
- return self;
- }
- public void setSelf(String self) {
- this.self = self;
- }
- public String getFeed() {
- return feed;
- }
- public void setFeed(String feed) {
- this.feed = feed;
- }
- public String getLog() {
- return log;
- }
- public void setLog(String log) {
- this.log = log;
- }
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("self", self);
- jo.put("feed", feed);
- jo.put("log", log);
- return jo;
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof SubLinks))
- return false;
- SubLinks os = (SubLinks) obj;
- if (!self.equals(os.self))
- return false;
- if (!feed.equals(os.feed))
- return false;
- if (!log.equals(os.log))
- return false;
- return true;
- }
+ private String self;
+ private String feed;
+ private String log;
+
+ public SubLinks() {
+ self = feed = log = null;
+ }
+
+ public SubLinks(JSONObject jo) throws InvalidObjectException {
+ this();
+ self = jo.getString("self");
+ feed = jo.getString("feed");
+ log = jo.getString("log");
+ }
+
+ public SubLinks(String self, String feed, String log) {
+ this.self = self;
+ this.feed = feed;
+ this.log = log;
+ }
+
+ public String getSelf() {
+ return self;
+ }
+
+ public void setSelf(String self) {
+ this.self = self;
+ }
+
+ public String getFeed() {
+ return feed;
+ }
+
+ public void setFeed(String feed) {
+ this.feed = feed;
+ }
+
+ public String getLog() {
+ return log;
+ }
+
+ public void setLog(String log) {
+ this.log = log;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("self", self);
+ jo.put("feed", feed);
+ jo.put("log", log);
+ return jo;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof SubLinks))
+ return false;
+ SubLinks os = (SubLinks) obj;
+ if (!self.equals(os.self))
+ return false;
+ if (!feed.equals(os.feed))
+ return false;
+ if (!log.equals(os.log))
+ return false;
+ return true;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Subscription.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Subscription.java
index 4084f744..027d859c 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Subscription.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Subscription.java
@@ -7,9 +7,9 @@
* * 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.
@@ -43,469 +43,499 @@ import java.util.Properties;
/**
* The representation of a Subscription. Subscriptions can be retrieved from the DB, or stored/updated in the DB.
+ *
* @author Robert Eby
* @version $Id: Subscription.java,v 1.9 2013/10/28 18:06:53 eby Exp $
*/
public class Subscription extends Syncable {
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private static int next_subid = getMaxSubID() + 1;
-
- private int subid;
- private int feedid;
- private int groupid; //New field is added - Groups feature Rally:US708115 - 1610
- private SubDelivery delivery;
- private boolean metadataOnly;
- private String subscriber;
- private SubLinks links;
- private boolean suspended;
- private Date last_mod;
- private Date created_date;
-
- public static Subscription getSubscriptionMatching(Subscription sub) {
- SubDelivery deli = sub.getDelivery();
- String sql = String.format(
- "select * from SUBSCRIPTIONS where FEEDID = %d and DELIVERY_URL = \"%s\" and DELIVERY_USER = \"%s\" and DELIVERY_PASSWORD = \"%s\" and DELIVERY_USE100 = %d and METADATA_ONLY = %d",
- sub.getFeedid(),
- deli.getUrl(),
- deli.getUser(),
- deli.getPassword(),
- deli.isUse100() ? 1 : 0,
- sub.isMetadataOnly() ? 1 : 0
- );
- List<Subscription> list = getSubscriptionsForSQL(sql);
- return list.size() > 0 ? list.get(0) : null;
- }
- public static Subscription getSubscriptionById(int id) {
- String sql = "select * from SUBSCRIPTIONS where SUBID = " + id;
- List<Subscription> list = getSubscriptionsForSQL(sql);
- return list.size() > 0 ? list.get(0) : null;
- }
- public static Collection<Subscription> getAllSubscriptions() {
- return getSubscriptionsForSQL("select * from SUBSCRIPTIONS");
- }
- private static List<Subscription> getSubscriptionsForSQL(String sql) {
- List<Subscription> list = new ArrayList<Subscription>();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- while (rs.next()) {
- Subscription sub = new Subscription(rs);
- list.add(sub);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return list;
- }
- public static int getMaxSubID() {
- int max = 0;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select MAX(subid) from SUBSCRIPTIONS");
- if (rs.next()) {
- max = rs.getInt(1);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- intlogger.info("getMaxSubID: "+e.getMessage());
- e.printStackTrace();
- }
- return max;
- }
- public static Collection<String> getSubscriptionUrlList(int feedid) {
- List<String> list = new ArrayList<String>();
- String sql = "select SUBID from SUBSCRIPTIONS where FEEDID = "+feedid;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery(sql);
- while (rs.next()) {
- int subid = rs.getInt("SUBID");
- list.add(URLUtilities.generateSubscriptionURL(subid));
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return list;
- }
- /**
- * Return a count of the number of active subscriptions in the DB.
- * @return the count
- */
- public static int countActiveSubscriptions() {
- int count = 0;
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("select count(*) from SUBSCRIPTIONS");
- if (rs.next()) {
- count = rs.getInt(1);
- }
- rs.close();
- stmt.close();
- db.release(conn);
- } catch (SQLException e) {
- intlogger.warn("PROV0008 countActiveSubscriptions: "+e.getMessage());
- e.printStackTrace();
- }
- return count;
- }
-
- public Subscription() {
- this("", "", "");
- }
- public Subscription(String url, String user, String password) {
- this.subid = -1;
- this.feedid = -1;
- this.groupid = -1; //New field is added - Groups feature Rally:US708115 - 1610
- this.delivery = new SubDelivery(url, user, password, false);
- this.metadataOnly = false;
- this.subscriber = "";
- this.links = new SubLinks();
- this.suspended = false;
- this.last_mod = new Date();
- this.created_date = new Date();
- }
- public Subscription(ResultSet rs) throws SQLException {
- this.subid = rs.getInt("SUBID");
- this.feedid = rs.getInt("FEEDID");
- this.groupid = rs.getInt("GROUPID"); //New field is added - Groups feature Rally:US708115 - 1610
- this.delivery = new SubDelivery(rs);
- this.metadataOnly = rs.getBoolean("METADATA_ONLY");
- this.subscriber = rs.getString("SUBSCRIBER");
- this.links = new SubLinks(rs.getString("SELF_LINK"), URLUtilities.generateFeedURL(feedid), rs.getString("LOG_LINK"));
- this.suspended = rs.getBoolean("SUSPENDED");
- this.last_mod = rs.getDate("LAST_MOD");
- this.created_date = rs.getDate("CREATED_DATE");
- }
- public Subscription(JSONObject jo) throws InvalidObjectException {
- this("", "", "");
- try {
- // The JSONObject is assumed to contain a vnd.att-dr.subscription representation
- this.subid = jo.optInt("subid", -1);
- this.feedid = jo.optInt("feedid", -1);
- this.groupid = jo.optInt("groupid", -1); //New field is added - Groups feature Rally:US708115 - 1610
-
- JSONObject jdeli = jo.getJSONObject("delivery");
- String url = jdeli.getString("url");
- String user = jdeli.getString("user");
- String password = jdeli.getString("password");
- boolean use100 = jdeli.getBoolean("use100");
-
-
- //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
- Properties p = (new DB()).getProperties();
- if(p.get("org.onap.dmaap.datarouter.provserver.https.relaxation").toString().equals("false") && !jo.has("sync")) {
- if (!url.startsWith("https://"))
- throw new InvalidObjectException("delivery URL is not HTTPS");
- }
-
- if (url.length() > 256)
- throw new InvalidObjectException("delivery url field is too long");
- if (user.length() > 20)
- throw new InvalidObjectException("delivery user field is too long");
- if (password.length() > 32)
- throw new InvalidObjectException("delivery password field is too long");
- this.delivery = new SubDelivery(url, user, password, use100);
-
- this.metadataOnly = jo.getBoolean("metadataOnly");
- this.suspended = jo.optBoolean("suspend", false);
-
- this.subscriber = jo.optString("subscriber", "");
- JSONObject jol = jo.optJSONObject("links");
- this.links = (jol == null) ? (new SubLinks()) : (new SubLinks(jol));
- } catch (InvalidObjectException e) {
- throw e;
- } catch (Exception e) {
- throw new InvalidObjectException("invalid JSON: "+e.getMessage());
- }
- }
- public int getSubid() {
- return subid;
- }
- public void setSubid(int subid) {
- this.subid = subid;
-
- // Create link URLs
- SubLinks sl = getLinks();
- sl.setSelf(URLUtilities.generateSubscriptionURL(subid));
- sl.setLog(URLUtilities.generateSubLogURL(subid));
- }
- public int getFeedid() {
- return feedid;
- }
- public void setFeedid(int feedid) {
- this.feedid = feedid;
-
- // Create link URLs
- SubLinks sl = getLinks();
- sl.setFeed(URLUtilities.generateFeedURL(feedid));
- }
-
- //New getter setters for Groups feature Rally:US708115 - 1610
- public int getGroupid() {
- return groupid;
- }
- public void setGroupid(int groupid) {
- this.groupid = groupid;
- }
-
- public SubDelivery getDelivery() {
- return delivery;
- }
- public void setDelivery(SubDelivery delivery) {
- this.delivery = delivery;
- }
- public boolean isMetadataOnly() {
- return metadataOnly;
- }
- public void setMetadataOnly(boolean metadataOnly) {
- this.metadataOnly = metadataOnly;
- }
- public boolean isSuspended() {
- return suspended;
- }
- public void setSuspended(boolean suspended) {
- this.suspended = suspended;
- }
- public String getSubscriber() {
- return subscriber;
- }
- public void setSubscriber(String subscriber) {
- if (subscriber != null) {
- if (subscriber.length() > 8)
- subscriber = subscriber.substring(0, 8);
- this.subscriber = subscriber;
- }
- }
- public SubLinks getLinks() {
- return links;
- }
- public void setLinks(SubLinks links) {
- this.links = links;
- }
-
- @Override
- public JSONObject asJSONObject() {
- JSONObject jo = new JSONObject();
- jo.put("subid", subid);
- jo.put("feedid", feedid);
- jo.put("groupid", groupid); //New field is added - Groups feature Rally:US708115 - 1610
- jo.put("delivery", delivery.asJSONObject());
- jo.put("metadataOnly", metadataOnly);
- jo.put("subscriber", subscriber);
- jo.put("links", links.asJSONObject());
- jo.put("suspend", suspended);
- jo.put("last_mod", last_mod.getTime());
- jo.put("created_date", created_date.getTime());
- return jo;
- }
- public JSONObject asLimitedJSONObject() {
- JSONObject jo = asJSONObject();
- jo.remove("subid");
- jo.remove("feedid");
- jo.remove("last_mod");
- return jo;
- }
- public JSONObject asJSONObject(boolean hidepasswords) {
- JSONObject jo = asJSONObject();
- if (hidepasswords) {
- jo.remove("subid"); // we no longer hide passwords, however we do hide these
- jo.remove("feedid");
- jo.remove("last_mod");
- jo.remove("created_date");
- }
- return jo;
- }
- @Override
- public boolean doInsert(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- if (subid == -1) {
- // No feed ID assigned yet, so assign the next available one
- setSubid(next_subid++);
- }
- // In case we insert a feed from synchronization
- if (subid > next_subid)
- next_subid = subid+1;
-
- // Create the SUBSCRIPTIONS row
- String sql = "insert into SUBSCRIPTIONS (SUBID, FEEDID, DELIVERY_URL, DELIVERY_USER, DELIVERY_PASSWORD, DELIVERY_USE100, METADATA_ONLY, SUBSCRIBER, SUSPENDED, GROUPID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
- ps = c.prepareStatement(sql, new String[] { "SUBID" });
- ps.setInt(1, subid);
- ps.setInt(2, feedid);
- ps.setString(3, getDelivery().getUrl());
- ps.setString(4, getDelivery().getUser());
- ps.setString(5, getDelivery().getPassword());
- ps.setInt(6, getDelivery().isUse100()?1:0);
- ps.setInt(7, isMetadataOnly()?1:0);
- ps.setString(8, getSubscriber());
- ps.setBoolean(9, isSuspended());
- ps.setInt(10, groupid); //New field is added - Groups feature Rally:US708115 - 1610
- ps.execute();
- ps.close();
-// ResultSet rs = ps.getGeneratedKeys();
-// rs.first();
-// setSubid(rs.getInt(1)); // side effect - sets the link URLs
-// ps.close();
-
- // Update the row to set the URLs
- sql = "update SUBSCRIPTIONS set SELF_LINK = ?, LOG_LINK = ? where SUBID = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, getLinks().getSelf());
- ps.setString(2, getLinks().getLog());
- ps.setInt(3, subid);
- ps.execute();
- ps.close();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0005 doInsert: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public boolean doUpdate(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "update SUBSCRIPTIONS set DELIVERY_URL = ?, DELIVERY_USER = ?, DELIVERY_PASSWORD = ?, DELIVERY_USE100 = ?, METADATA_ONLY = ?, SUSPENDED = ?, GROUPID = ? where SUBID = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, delivery.getUrl());
- ps.setString(2, delivery.getUser());
- ps.setString(3, delivery.getPassword());
- ps.setInt(4, delivery.isUse100()?1:0);
- ps.setInt(5, isMetadataOnly()?1:0);
- ps.setInt(6, suspended ? 1 : 0);
- ps.setInt(7, groupid); //New field is added - Groups feature Rally:US708115 - 1610
- ps.setInt(8, subid);
- ps.executeUpdate();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
-
-
- /**Rally US708115
- * Change Ownership of Subscription - 1610
- * */
- public boolean changeOwnerShip() {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
-
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection c = db.getConnection();
- String sql = "update SUBSCRIPTIONS set SUBSCRIBER = ? where SUBID = ?";
- ps = c.prepareStatement(sql);
- ps.setString(1, this.subscriber);
- ps.setInt(2, subid);
- ps.execute();
- ps.close();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0006 doUpdate: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
-
-
-
- @Override
- public boolean doDelete(Connection c) {
- boolean rv = true;
- PreparedStatement ps = null;
- try {
- String sql = "delete from SUBSCRIPTIONS where SUBID = ?";
- ps = c.prepareStatement(sql);
- ps.setInt(1, subid);
- ps.execute();
- } catch (SQLException e) {
- rv = false;
- intlogger.warn("PROV0007 doDelete: "+e.getMessage());
- e.printStackTrace();
- } finally {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- return rv;
- }
- @Override
- public String getKey() {
- return ""+getSubid();
- }
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof Subscription))
- return false;
- Subscription os = (Subscription) obj;
- if (subid != os.subid)
- return false;
- if (feedid != os.feedid)
- return false;
- if (groupid != os.groupid) //New field is added - Groups feature Rally:US708115 - 1610
- return false;
- if (!delivery.equals(os.delivery))
- return false;
- if (metadataOnly != os.metadataOnly)
- return false;
- if (!subscriber.equals(os.subscriber))
- return false;
- if (!links.equals(os.links))
- return false;
- if (suspended != os.suspended)
- return false;
- return true;
- }
-
- @Override
- public String toString() {
- return "SUB: subid=" + subid + ", feedid=" + feedid;
- }
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private static int next_subid = getMaxSubID() + 1;
+
+ private int subid;
+ private int feedid;
+ private int groupid; //New field is added - Groups feature Rally:US708115 - 1610
+ private SubDelivery delivery;
+ private boolean metadataOnly;
+ private String subscriber;
+ private SubLinks links;
+ private boolean suspended;
+ private Date last_mod;
+ private Date created_date;
+
+ public static Subscription getSubscriptionMatching(Subscription sub) {
+ SubDelivery deli = sub.getDelivery();
+ String sql = String.format(
+ "select * from SUBSCRIPTIONS where FEEDID = %d and DELIVERY_URL = \"%s\" and DELIVERY_USER = \"%s\" and DELIVERY_PASSWORD = \"%s\" and DELIVERY_USE100 = %d and METADATA_ONLY = %d",
+ sub.getFeedid(),
+ deli.getUrl(),
+ deli.getUser(),
+ deli.getPassword(),
+ deli.isUse100() ? 1 : 0,
+ sub.isMetadataOnly() ? 1 : 0
+ );
+ List<Subscription> list = getSubscriptionsForSQL(sql);
+ return list.size() > 0 ? list.get(0) : null;
+ }
+
+ public static Subscription getSubscriptionById(int id) {
+ String sql = "select * from SUBSCRIPTIONS where SUBID = " + id;
+ List<Subscription> list = getSubscriptionsForSQL(sql);
+ return list.size() > 0 ? list.get(0) : null;
+ }
+
+ public static Collection<Subscription> getAllSubscriptions() {
+ return getSubscriptionsForSQL("select * from SUBSCRIPTIONS");
+ }
+
+ private static List<Subscription> getSubscriptionsForSQL(String sql) {
+ List<Subscription> list = new ArrayList<Subscription>();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ Subscription sub = new Subscription(rs);
+ list.add(sub);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return list;
+ }
+
+ public static int getMaxSubID() {
+ int max = 0;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select MAX(subid) from SUBSCRIPTIONS");
+ if (rs.next()) {
+ max = rs.getInt(1);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ intlogger.info("getMaxSubID: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return max;
+ }
+
+ public static Collection<String> getSubscriptionUrlList(int feedid) {
+ List<String> list = new ArrayList<String>();
+ String sql = "select SUBID from SUBSCRIPTIONS where FEEDID = " + feedid;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery(sql);
+ while (rs.next()) {
+ int subid = rs.getInt("SUBID");
+ list.add(URLUtilities.generateSubscriptionURL(subid));
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ return list;
+ }
+
+ /**
+ * Return a count of the number of active subscriptions in the DB.
+ *
+ * @return the count
+ */
+ public static int countActiveSubscriptions() {
+ int count = 0;
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("select count(*) from SUBSCRIPTIONS");
+ if (rs.next()) {
+ count = rs.getInt(1);
+ }
+ rs.close();
+ stmt.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ intlogger.warn("PROV0008 countActiveSubscriptions: " + e.getMessage());
+ e.printStackTrace();
+ }
+ return count;
+ }
+
+ public Subscription() {
+ this("", "", "");
+ }
+
+ public Subscription(String url, String user, String password) {
+ this.subid = -1;
+ this.feedid = -1;
+ this.groupid = -1; //New field is added - Groups feature Rally:US708115 - 1610
+ this.delivery = new SubDelivery(url, user, password, false);
+ this.metadataOnly = false;
+ this.subscriber = "";
+ this.links = new SubLinks();
+ this.suspended = false;
+ this.last_mod = new Date();
+ this.created_date = new Date();
+ }
+
+ public Subscription(ResultSet rs) throws SQLException {
+ this.subid = rs.getInt("SUBID");
+ this.feedid = rs.getInt("FEEDID");
+ this.groupid = rs.getInt("GROUPID"); //New field is added - Groups feature Rally:US708115 - 1610
+ this.delivery = new SubDelivery(rs);
+ this.metadataOnly = rs.getBoolean("METADATA_ONLY");
+ this.subscriber = rs.getString("SUBSCRIBER");
+ this.links = new SubLinks(rs.getString("SELF_LINK"), URLUtilities.generateFeedURL(feedid), rs.getString("LOG_LINK"));
+ this.suspended = rs.getBoolean("SUSPENDED");
+ this.last_mod = rs.getDate("LAST_MOD");
+ this.created_date = rs.getDate("CREATED_DATE");
+ }
+
+ public Subscription(JSONObject jo) throws InvalidObjectException {
+ this("", "", "");
+ try {
+ // The JSONObject is assumed to contain a vnd.att-dr.subscription representation
+ this.subid = jo.optInt("subid", -1);
+ this.feedid = jo.optInt("feedid", -1);
+ this.groupid = jo.optInt("groupid", -1); //New field is added - Groups feature Rally:US708115 - 1610
+
+ JSONObject jdeli = jo.getJSONObject("delivery");
+ String url = jdeli.getString("url");
+ String user = jdeli.getString("user");
+ String password = jdeli.getString("password");
+ boolean use100 = jdeli.getBoolean("use100");
+
+
+ //Data Router Subscriber HTTPS Relaxation feature USERSTORYID:US674047.
+ Properties p = (new DB()).getProperties();
+ if (p.get("org.onap.dmaap.datarouter.provserver.https.relaxation").toString().equals("false") && !jo.has("sync")) {
+ if (!url.startsWith("https://"))
+ throw new InvalidObjectException("delivery URL is not HTTPS");
+ }
+
+ if (url.length() > 256)
+ throw new InvalidObjectException("delivery url field is too long");
+ if (user.length() > 20)
+ throw new InvalidObjectException("delivery user field is too long");
+ if (password.length() > 32)
+ throw new InvalidObjectException("delivery password field is too long");
+ this.delivery = new SubDelivery(url, user, password, use100);
+
+ this.metadataOnly = jo.getBoolean("metadataOnly");
+ this.suspended = jo.optBoolean("suspend", false);
+
+ this.subscriber = jo.optString("subscriber", "");
+ JSONObject jol = jo.optJSONObject("links");
+ this.links = (jol == null) ? (new SubLinks()) : (new SubLinks(jol));
+ } catch (InvalidObjectException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new InvalidObjectException("invalid JSON: " + e.getMessage());
+ }
+ }
+
+ public int getSubid() {
+ return subid;
+ }
+
+ public void setSubid(int subid) {
+ this.subid = subid;
+
+ // Create link URLs
+ SubLinks sl = getLinks();
+ sl.setSelf(URLUtilities.generateSubscriptionURL(subid));
+ sl.setLog(URLUtilities.generateSubLogURL(subid));
+ }
+
+ public int getFeedid() {
+ return feedid;
+ }
+
+ public void setFeedid(int feedid) {
+ this.feedid = feedid;
+
+ // Create link URLs
+ SubLinks sl = getLinks();
+ sl.setFeed(URLUtilities.generateFeedURL(feedid));
+ }
+
+ //New getter setters for Groups feature Rally:US708115 - 1610
+ public int getGroupid() {
+ return groupid;
+ }
+
+ public void setGroupid(int groupid) {
+ this.groupid = groupid;
+ }
+
+ public SubDelivery getDelivery() {
+ return delivery;
+ }
+
+ public void setDelivery(SubDelivery delivery) {
+ this.delivery = delivery;
+ }
+
+ public boolean isMetadataOnly() {
+ return metadataOnly;
+ }
+
+ public void setMetadataOnly(boolean metadataOnly) {
+ this.metadataOnly = metadataOnly;
+ }
+
+ public boolean isSuspended() {
+ return suspended;
+ }
+
+ public void setSuspended(boolean suspended) {
+ this.suspended = suspended;
+ }
+
+ public String getSubscriber() {
+ return subscriber;
+ }
+
+ public void setSubscriber(String subscriber) {
+ if (subscriber != null) {
+ if (subscriber.length() > 8)
+ subscriber = subscriber.substring(0, 8);
+ this.subscriber = subscriber;
+ }
+ }
+
+ public SubLinks getLinks() {
+ return links;
+ }
+
+ public void setLinks(SubLinks links) {
+ this.links = links;
+ }
+
+ @Override
+ public JSONObject asJSONObject() {
+ JSONObject jo = new JSONObject();
+ jo.put("subid", subid);
+ jo.put("feedid", feedid);
+ jo.put("groupid", groupid); //New field is added - Groups feature Rally:US708115 - 1610
+ jo.put("delivery", delivery.asJSONObject());
+ jo.put("metadataOnly", metadataOnly);
+ jo.put("subscriber", subscriber);
+ jo.put("links", links.asJSONObject());
+ jo.put("suspend", suspended);
+ jo.put("last_mod", last_mod.getTime());
+ jo.put("created_date", created_date.getTime());
+ return jo;
+ }
+
+ public JSONObject asLimitedJSONObject() {
+ JSONObject jo = asJSONObject();
+ jo.remove("subid");
+ jo.remove("feedid");
+ jo.remove("last_mod");
+ return jo;
+ }
+
+ public JSONObject asJSONObject(boolean hidepasswords) {
+ JSONObject jo = asJSONObject();
+ if (hidepasswords) {
+ jo.remove("subid"); // we no longer hide passwords, however we do hide these
+ jo.remove("feedid");
+ jo.remove("last_mod");
+ jo.remove("created_date");
+ }
+ return jo;
+ }
+
+ @Override
+ public boolean doInsert(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ if (subid == -1) {
+ // No feed ID assigned yet, so assign the next available one
+ setSubid(next_subid++);
+ }
+ // In case we insert a feed from synchronization
+ if (subid > next_subid)
+ next_subid = subid + 1;
+
+ // Create the SUBSCRIPTIONS row
+ String sql = "insert into SUBSCRIPTIONS (SUBID, FEEDID, DELIVERY_URL, DELIVERY_USER, DELIVERY_PASSWORD, DELIVERY_USE100, METADATA_ONLY, SUBSCRIBER, SUSPENDED, GROUPID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ ps = c.prepareStatement(sql, new String[]{"SUBID"});
+ ps.setInt(1, subid);
+ ps.setInt(2, feedid);
+ ps.setString(3, getDelivery().getUrl());
+ ps.setString(4, getDelivery().getUser());
+ ps.setString(5, getDelivery().getPassword());
+ ps.setInt(6, getDelivery().isUse100() ? 1 : 0);
+ ps.setInt(7, isMetadataOnly() ? 1 : 0);
+ ps.setString(8, getSubscriber());
+ ps.setBoolean(9, isSuspended());
+ ps.setInt(10, groupid); //New field is added - Groups feature Rally:US708115 - 1610
+ ps.execute();
+ ps.close();
+// ResultSet rs = ps.getGeneratedKeys();
+// rs.first();
+// setSubid(rs.getInt(1)); // side effect - sets the link URLs
+// ps.close();
+
+ // Update the row to set the URLs
+ sql = "update SUBSCRIPTIONS set SELF_LINK = ?, LOG_LINK = ? where SUBID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, getLinks().getSelf());
+ ps.setString(2, getLinks().getLog());
+ ps.setInt(3, subid);
+ ps.execute();
+ ps.close();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0005 doInsert: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public boolean doUpdate(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "update SUBSCRIPTIONS set DELIVERY_URL = ?, DELIVERY_USER = ?, DELIVERY_PASSWORD = ?, DELIVERY_USE100 = ?, METADATA_ONLY = ?, SUSPENDED = ?, GROUPID = ? where SUBID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, delivery.getUrl());
+ ps.setString(2, delivery.getUser());
+ ps.setString(3, delivery.getPassword());
+ ps.setInt(4, delivery.isUse100() ? 1 : 0);
+ ps.setInt(5, isMetadataOnly() ? 1 : 0);
+ ps.setInt(6, suspended ? 1 : 0);
+ ps.setInt(7, groupid); //New field is added - Groups feature Rally:US708115 - 1610
+ ps.setInt(8, subid);
+ ps.executeUpdate();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+
+ /**
+ * Rally US708115
+ * Change Ownership of Subscription - 1610
+ */
+ public boolean changeOwnerShip() {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection c = db.getConnection();
+ String sql = "update SUBSCRIPTIONS set SUBSCRIBER = ? where SUBID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setString(1, this.subscriber);
+ ps.setInt(2, subid);
+ ps.execute();
+ ps.close();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0006 doUpdate: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+
+ @Override
+ public boolean doDelete(Connection c) {
+ boolean rv = true;
+ PreparedStatement ps = null;
+ try {
+ String sql = "delete from SUBSCRIPTIONS where SUBID = ?";
+ ps = c.prepareStatement(sql);
+ ps.setInt(1, subid);
+ ps.execute();
+ } catch (SQLException e) {
+ rv = false;
+ intlogger.warn("PROV0007 doDelete: " + e.getMessage());
+ e.printStackTrace();
+ } finally {
+ try {
+ ps.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ return rv;
+ }
+
+ @Override
+ public String getKey() {
+ return "" + getSubid();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Subscription))
+ return false;
+ Subscription os = (Subscription) obj;
+ if (subid != os.subid)
+ return false;
+ if (feedid != os.feedid)
+ return false;
+ if (groupid != os.groupid) //New field is added - Groups feature Rally:US708115 - 1610
+ return false;
+ if (!delivery.equals(os.delivery))
+ return false;
+ if (metadataOnly != os.metadataOnly)
+ return false;
+ if (!subscriber.equals(os.subscriber))
+ return false;
+ if (!links.equals(os.links))
+ return false;
+ if (suspended != os.suspended)
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "SUB: subid=" + subid + ", feedid=" + feedid;
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Syncable.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Syncable.java
index 8e6b9c9c..6b9eb42a 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Syncable.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Syncable.java
@@ -7,9 +7,9 @@
* * 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.
@@ -37,21 +37,22 @@ import org.json.JSONObject;
* @version $Id: Syncable.java,v 1.1 2013/07/05 13:48:05 eby Exp $
*/
public abstract class Syncable implements Deleteable, Insertable, Updateable, JSONable {
- @Override
- abstract public JSONObject asJSONObject();
+ @Override
+ abstract public JSONObject asJSONObject();
- @Override
- abstract public boolean doUpdate(Connection c);
+ @Override
+ abstract public boolean doUpdate(Connection c);
- @Override
- abstract public boolean doInsert(Connection c);
+ @Override
+ abstract public boolean doInsert(Connection c);
- @Override
- abstract public boolean doDelete(Connection c);
+ @Override
+ abstract public boolean doDelete(Connection c);
- /**
- * Get the "natural key" for this object type, as a String.
- * @return the key
- */
- abstract public String getKey();
+ /**
+ * Get the "natural key" for this object type, as a String.
+ *
+ * @return the key
+ */
+ abstract public String getKey();
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Updateable.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Updateable.java
index d7d0b33f..60af748d 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Updateable.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/Updateable.java
@@ -7,9 +7,9 @@
* * 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.
@@ -27,14 +27,16 @@ import java.sql.Connection;
/**
* An object that can be UPDATE-ed in the database.
+ *
* @author Robert Eby
* @version $Id: Updateable.java,v 1.2 2013/05/29 14:44:36 eby Exp $
*/
public interface Updateable {
- /**
- * Update this object in the DB.
- * @param c the JDBC Connection to use
- * @return true if the UPDATE succeeded, false otherwise
- */
- public boolean doUpdate(Connection c);
+ /**
+ * Update this object in the DB.
+ *
+ * @param c the JDBC Connection to use
+ * @return true if the UPDATE succeeded, false otherwise
+ */
+ public boolean doUpdate(Connection c);
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/package.html b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/package.html
index 4b28053a..c33902cd 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/package.html
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/beans/package.html
@@ -2,7 +2,7 @@
# ============LICENSE_START==================================================
# * org.onap.dmaap
# * ===========================================================================
-# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
# * ===========================================================================
# * Licensed under the Apache License, Version 2.0 (the "License");
# * you may not use this file except in compliance with the License.
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/EelfMsgs.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/EelfMsgs.java
index ccd29381..de16ca4b 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/EelfMsgs.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/EelfMsgs.java
@@ -7,9 +7,9 @@
* * 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.
@@ -26,26 +26,25 @@ import com.att.eelf.i18n.EELFResolvableErrorEnum;
import com.att.eelf.i18n.EELFResourceManager;
public enum EelfMsgs implements EELFResolvableErrorEnum {
-
- /**
+
+ /**
* Application message prints user (accepts one argument)
*/
- MESSAGE_WITH_BEHALF,
+ MESSAGE_WITH_BEHALF,
- /**
+ /**
* Application message prints user and FeedID (accepts two arguments)
*/
- MESSAGE_WITH_BEHALF_AND_FEEDID,
+ MESSAGE_WITH_BEHALF_AND_FEEDID,
- /**
+ /**
* Application message prints user and SUBID (accepts two arguments)
*/
- MESSAGE_WITH_BEHALF_AND_SUBID;
+ MESSAGE_WITH_BEHALF_AND_SUBID;
+
-
-
/**
* Static initializer to ensure the resource bundles for this class are loaded...
* Here this application loads messages from three bundles
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/JettyFilter.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/JettyFilter.java
index 1e127d8a..eb8ffe6c 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/JettyFilter.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/eelf/JettyFilter.java
@@ -7,9 +7,9 @@
* * 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.
@@ -26,13 +26,13 @@ import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
-public class JettyFilter extends Filter<ILoggingEvent>{
- @Override
- public FilterReply decide(ILoggingEvent event) {
- if (event.getLoggerName().contains("org.eclipse.jetty")) {
- return FilterReply.ACCEPT;
- } else {
- return FilterReply.DENY;
- }
- }
+public class JettyFilter extends Filter<ILoggingEvent> {
+ @Override
+ public FilterReply decide(ILoggingEvent event) {
+ if (event.getLoggerName().contains("org.eclipse.jetty")) {
+ return FilterReply.ACCEPT;
+ } else {
+ return FilterReply.DENY;
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/package.html b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/package.html
index 113b1cc4..af08391a 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/package.html
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/package.html
@@ -1,123 +1,123 @@
-#-------------------------------------------------------------------------------
-# ============LICENSE_START==================================================
-# * org.onap.dmaap
-# * ===========================================================================
-# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
-# * ===========================================================================
-# * Licensed under the Apache License, Version 2.0 (the "License");
-# * you may not use this file except in compliance with the License.
-# * You may obtain a copy of the License at
-# *
-# * http://www.apache.org/licenses/LICENSE-2.0
-# *
-# * Unless required by applicable law or agreed to in writing, software
-# * distributed under the License is distributed on an "AS IS" BASIS,
-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# * See the License for the specific language governing permissions and
-# * limitations under the License.
-# * ============LICENSE_END====================================================
-# *
-# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
-# *
-#-------------------------------------------------------------------------------
-
-<html>
-<body>
-<p>
-This package provides the servlets used by the provisioning server for the Data Router application.
-URLs are from the document <b>URLs for DR Release 1</b> <i>Version 1.2</i>.
-</p>
-<div class="contentContainer">
-<table class="packageSummary" border="0" cellpadding="3" cellspacing="0">
-<caption><span>URL Path Summary</span><span class="tabEnd">&nbsp;</span></caption>
-<tr class="altColor">
- <th class="colFirst">URL Path</th>
- <th class="colOne">Symbolic Name</th>
- <th class="colLast">Servlet Name</th>
- <th class="colLast" colspan="4">Allowed Methods</th>
-</tr>
-<tr>
- <td class="colFirst" class="colOne">/</td>
- <td class="colOne" class="colOne">&lt;drFeedsUrl&gt;</td>
- <td class="colLast" class="colOne">{@link org.onap.dmaap.datarouter.provisioning.DRFeedsServlet}</td>
- <td class="colLast" class="colOne" style="background-color: pink">DELETE</td>
- <td class="colLast" class="colOne" style="background-color: lightgreen">GET</td>
- <td class="colLast" class="colOne" style="background-color: lightgreen">POST</td>
- <td class="colLast" class="colOne" style="background-color: pink">PUT</td>
-</tr>
-<tr class="altColor">
- <td class="colFirst" class="colOne">/feed/feedid</td>
- <td class="colOne" class="colOne">&lt;feedUrl&gt;</td>
- <td class="colLast" class="colOne">{@link org.onap.dmaap.datarouter.provisioning.FeedServlet}</td>
- <td class="colLast" style="background-color: lightgreen">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: pink">POST</td>
- <td class="colLast" style="background-color: lightgreen">PUT</td>
-</tr>
-<tr>
- <td class="colFirst">/publish/feedid</td>
- <td class="colOne">&lt;publishUrl&gt;</td>
- <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.PublishServlet}</td>
- <td class="colLast" style="background-color: lightgreen">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: lightgreen">POST</td>
- <td class="colLast" style="background-color: lightgreen">PUT</td>
-</tr>
-<tr class="altColor">
- <td class="colFirst">/subscribe/feedid</td>
- <td class="colOne">&lt;subscribeUrl&gt;</td>
- <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.SubscribeServlet}</td>
- <td class="colLast" style="background-color: pink">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: lightgreen">POST</td>
- <td class="colLast" style="background-color: pink">PUT</td>
-</tr>
-<tr>
- <td class="colFirst">/feedlog/feedid</td>
- <td class="colOne">&lt;feedLogUrl&gt;</td>
- <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.FeedLogServlet}</td>
- <td class="colLast" style="background-color: pink">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: pink">POST</td>
- <td class="colLast" style="background-color: pink">PUT</td>
-</tr>
-<tr class="altColor">
- <td class="colFirst">/subs/subid</td>
- <td class="colOne">&lt;subscriptionUrl&gt;</td>
- <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.SubscriptionServlet}</td>
- <td class="colLast" style="background-color: lightgreen">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: lightgreen">POST</td>
- <td class="colLast" style="background-color: lightgreen">PUT</td>
-</tr>
-<tr>
- <td class="colFirst">/sublog/subid</td>
- <td class="colOne">&lt;subLogUrl&gt;</td>
- <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.SubLogServlet}</td>
- <td class="colLast" style="background-color: pink">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: pink">POST</td>
- <td class="colLast" style="background-color: pink">PUT</td>
-</tr>
-<tr class="altColor">
- <td class="colFirst">/internal/*</td>
- <td class="colOne">&lt;internalUrl&gt;</td>
- <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.InternalServlet}</td>
- <td class="colLast" style="background-color: lightgreen">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: lightgreen">POST</td>
- <td class="colLast" style="background-color: lightgreen">PUT</td>
-</tr>
-<tr>
- <td class="colFirst">/internal/route/*</td>
- <td class="colOne">&lt;routeUrl&gt;</td>
- <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.RouteServlet}</td>
- <td class="colLast" style="background-color: lightgreen">DELETE</td>
- <td class="colLast" style="background-color: lightgreen">GET</td>
- <td class="colLast" style="background-color: lightgreen">POST</td>
- <td class="colLast" style="background-color: pink">PUT</td>
-</tr>
-</table>
-</div>
-</body>
-</html>
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+
+<html>
+<body>
+<p>
+This package provides the servlets used by the provisioning server for the Data Router application.
+URLs are from the document <b>URLs for DR Release 1</b> <i>Version 1.2</i>.
+</p>
+<div class="contentContainer">
+<table class="packageSummary" border="0" cellpadding="3" cellspacing="0">
+<caption><span>URL Path Summary</span><span class="tabEnd">&nbsp;</span></caption>
+<tr class="altColor">
+ <th class="colFirst">URL Path</th>
+ <th class="colOne">Symbolic Name</th>
+ <th class="colLast">Servlet Name</th>
+ <th class="colLast" colspan="4">Allowed Methods</th>
+</tr>
+<tr>
+ <td class="colFirst" class="colOne">/</td>
+ <td class="colOne" class="colOne">&lt;drFeedsUrl&gt;</td>
+ <td class="colLast" class="colOne">{@link org.onap.dmaap.datarouter.provisioning.DRFeedsServlet}</td>
+ <td class="colLast" class="colOne" style="background-color: pink">DELETE</td>
+ <td class="colLast" class="colOne" style="background-color: lightgreen">GET</td>
+ <td class="colLast" class="colOne" style="background-color: lightgreen">POST</td>
+ <td class="colLast" class="colOne" style="background-color: pink">PUT</td>
+</tr>
+<tr class="altColor">
+ <td class="colFirst" class="colOne">/feed/feedid</td>
+ <td class="colOne" class="colOne">&lt;feedUrl&gt;</td>
+ <td class="colLast" class="colOne">{@link org.onap.dmaap.datarouter.provisioning.FeedServlet}</td>
+ <td class="colLast" style="background-color: lightgreen">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: pink">POST</td>
+ <td class="colLast" style="background-color: lightgreen">PUT</td>
+</tr>
+<tr>
+ <td class="colFirst">/publish/feedid</td>
+ <td class="colOne">&lt;publishUrl&gt;</td>
+ <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.PublishServlet}</td>
+ <td class="colLast" style="background-color: lightgreen">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: lightgreen">POST</td>
+ <td class="colLast" style="background-color: lightgreen">PUT</td>
+</tr>
+<tr class="altColor">
+ <td class="colFirst">/subscribe/feedid</td>
+ <td class="colOne">&lt;subscribeUrl&gt;</td>
+ <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.SubscribeServlet}</td>
+ <td class="colLast" style="background-color: pink">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: lightgreen">POST</td>
+ <td class="colLast" style="background-color: pink">PUT</td>
+</tr>
+<tr>
+ <td class="colFirst">/feedlog/feedid</td>
+ <td class="colOne">&lt;feedLogUrl&gt;</td>
+ <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.FeedLogServlet}</td>
+ <td class="colLast" style="background-color: pink">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: pink">POST</td>
+ <td class="colLast" style="background-color: pink">PUT</td>
+</tr>
+<tr class="altColor">
+ <td class="colFirst">/subs/subid</td>
+ <td class="colOne">&lt;subscriptionUrl&gt;</td>
+ <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.SubscriptionServlet}</td>
+ <td class="colLast" style="background-color: lightgreen">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: lightgreen">POST</td>
+ <td class="colLast" style="background-color: lightgreen">PUT</td>
+</tr>
+<tr>
+ <td class="colFirst">/sublog/subid</td>
+ <td class="colOne">&lt;subLogUrl&gt;</td>
+ <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.SubLogServlet}</td>
+ <td class="colLast" style="background-color: pink">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: pink">POST</td>
+ <td class="colLast" style="background-color: pink">PUT</td>
+</tr>
+<tr class="altColor">
+ <td class="colFirst">/internal/*</td>
+ <td class="colOne">&lt;internalUrl&gt;</td>
+ <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.InternalServlet}</td>
+ <td class="colLast" style="background-color: lightgreen">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: lightgreen">POST</td>
+ <td class="colLast" style="background-color: lightgreen">PUT</td>
+</tr>
+<tr>
+ <td class="colFirst">/internal/route/*</td>
+ <td class="colOne">&lt;routeUrl&gt;</td>
+ <td class="colLast">{@link org.onap.dmaap.datarouter.provisioning.RouteServlet}</td>
+ <td class="colLast" style="background-color: lightgreen">DELETE</td>
+ <td class="colLast" style="background-color: lightgreen">GET</td>
+ <td class="colLast" style="background-color: lightgreen">POST</td>
+ <td class="colLast" style="background-color: pink">PUT</td>
+</tr>
+</table>
+</div>
+</body>
+</html>
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java
index 98cc824b..c65ee267 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java
@@ -7,9 +7,9 @@
* * 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.
@@ -37,197 +37,210 @@ import java.util.*;
* @version $Id$
*/
public class DB {
- /** The name of the properties file (in CLASSPATH) */
- private static final String CONFIG_FILE = "provserver.properties";
-
- private static String DB_URL;
- private static String DB_LOGIN;
- private static String DB_PASSWORD;
- private static Properties props;
- private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private static final Queue<Connection> queue = new LinkedList<>();
-
- public static String HTTPS_PORT;
- public static String HTTP_PORT;
-
- /**
- * Construct a DB object. If this is the very first creation of this object, it will load a copy
- * of the properties for the server, and attempt to load the JDBC driver for the database. If a fatal
- * error occurs (e.g. either the properties file or the DB driver is missing), the JVM will exit.
- */
- public DB() {
- if (props == null) {
- props = new Properties();
- try (InputStream inStream = getClass().getClassLoader().getResourceAsStream(CONFIG_FILE)) {
- props.load(inStream);
- String DB_DRIVER = (String) props.get("org.onap.dmaap.datarouter.db.driver");
- DB_URL = (String) props.get("org.onap.dmaap.datarouter.db.url");
- DB_LOGIN = (String) props.get("org.onap.dmaap.datarouter.db.login");
- DB_PASSWORD = (String) props.get("org.onap.dmaap.datarouter.db.password");
- HTTPS_PORT = (String) props.get("org.onap.dmaap.datarouter.provserver.https.port");
- HTTP_PORT = (String) props.get("org.onap.dmaap.datarouter.provserver.http.port");
- Class.forName(DB_DRIVER);
- } catch (IOException e) {
- intlogger.fatal("PROV9003 Opening properties: " + e.getMessage());
- e.printStackTrace();
- System.exit(1);
- } catch (ClassNotFoundException e) {
- intlogger.fatal("PROV9004 cannot find the DB driver: " + e);
- e.printStackTrace();
- System.exit(1);
- }
- }
- }
- /**
- * Get the provisioning server properties (loaded from provserver.properties).
- * @return the Properties object
- */
- public Properties getProperties() {
- return props;
- }
- /**
- * Get a JDBC connection to the DB from the pool. Creates a new one if none are available.
- * @return the Connection
- * @throws SQLException
- */
- @SuppressWarnings("resource")
- public Connection getConnection() throws SQLException {
- Connection connection = null;
- while (connection == null) {
- synchronized (queue) {
- try {
- connection = queue.remove();
- } catch (NoSuchElementException nseEx) {
- int n = 0;
- do {
- // Try up to 3 times to get a connection
- try {
- connection = DriverManager.getConnection(DB_URL, DB_LOGIN, DB_PASSWORD);
- } catch (SQLException sqlEx) {
- if (++n >= 3)
- throw sqlEx;
- }
- } while (connection == null);
- }
- }
- if (connection != null && !connection.isValid(1)) {
- connection.close();
- connection = null;
- }
- }
- return connection;
- }
- /**
- * Returns a JDBC connection to the pool.
- * @param connection the Connection to return
- */
- public void release(Connection connection) {
- if (connection != null) {
- synchronized (queue) {
- if (!queue.contains(connection))
- queue.add(connection);
- }
- }
- }
-
- /**
- * Run all necessary retrofits required to bring the database up to the level required for this version
- * of the provisioning server. This should be run before the server itself is started.
- * @return true if all retrofits worked, false otherwise
- */
- public boolean runRetroFits() {
- return retroFit1();
- }
-
- /**
- * Retrofit 1 - Make sure the expected tables are in DB and are initialized.
- * Uses sql_init_01.sql to setup the DB.
- * @return true if the retrofit worked, false otherwise
- */
- private boolean retroFit1() {
- final String[] expectedTables = {
- "FEEDS", "FEED_ENDPOINT_ADDRS", "FEED_ENDPOINT_IDS", "PARAMETERS",
- "SUBSCRIPTIONS", "LOG_RECORDS", "INGRESS_ROUTES", "EGRESS_ROUTES",
- "NETWORK_ROUTES", "NODESETS", "NODES", "GROUPS"
- };
- Connection connection = null;
- try {
- connection = getConnection();
- Set<String> actualTables = getTableSet(connection);
- boolean initialize = false;
- for (String table : expectedTables) {
- initialize |= !actualTables.contains(table);
- }
- if (initialize) {
- intlogger.info("PROV9001: First time startup; The database is being initialized.");
- runInitScript(connection, 1);
- }
- } catch (SQLException e) {
- intlogger.fatal("PROV9000: The database credentials are not working: "+e.getMessage());
- return false;
- } finally {
- if (connection != null)
- release(connection);
- }
- return true;
- }
-
- /**
- * Get a set of all table names in the DB.
- * @param connection a DB connection
- * @return the set of table names
- */
- private Set<String> getTableSet(Connection connection) {
- Set<String> tables = new HashSet<String>();
- try {
- DatabaseMetaData md = connection.getMetaData();
- ResultSet rs = md.getTables("datarouter", "", "", null);
- if (rs != null) {
- while (rs.next()) {
- tables.add(rs.getString("TABLE_NAME"));
- }
- rs.close();
- }
- } catch (SQLException e) {
- }
- return tables;
- }
- /**
- * Initialize the tables by running the initialization scripts located in the directory specified
- * by the property <i>org.onap.dmaap.datarouter.provserver.dbscripts</i>. Scripts have names of
- * the form sql_init_NN.sql
- * @param connection a DB connection
- * @param scriptId the number of the sql_init_NN.sql script to run
- */
- private void runInitScript(Connection connection, int scriptId) {
- String scriptDir = (String) props.get("org.onap.dmaap.datarouter.provserver.dbscripts");
- StringBuilder sb = new StringBuilder();
- try {
- String scriptFile = String.format("%s/sql_init_%02d.sql", scriptDir, scriptId);
- if (!(new File(scriptFile)).exists())
- return;
-
- LineNumberReader in = new LineNumberReader(new FileReader(scriptFile));
- String line;
- while ((line = in.readLine()) != null) {
- if (!line.startsWith("--")) {
- line = line.trim();
- sb.append(line);
- if (line.endsWith(";")) {
- // Execute one DDL statement
- String sql = sb.toString();
- sb.setLength(0);
- Statement s = connection.createStatement();
- s.execute(sql);
- s.close();
- }
- }
- }
- in.close();
- sb.setLength(0);
- } catch (Exception e) {
- intlogger.fatal("PROV9002 Error when initializing table: "+e.getMessage());
- System.exit(1);
- }
- }
+ /**
+ * The name of the properties file (in CLASSPATH)
+ */
+ private static final String CONFIG_FILE = "provserver.properties";
+
+ private static String DB_URL;
+ private static String DB_LOGIN;
+ private static String DB_PASSWORD;
+ private static Properties props;
+ private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private static final Queue<Connection> queue = new LinkedList<>();
+
+ public static String HTTPS_PORT;
+ public static String HTTP_PORT;
+
+ /**
+ * Construct a DB object. If this is the very first creation of this object, it will load a copy
+ * of the properties for the server, and attempt to load the JDBC driver for the database. If a fatal
+ * error occurs (e.g. either the properties file or the DB driver is missing), the JVM will exit.
+ */
+ public DB() {
+ if (props == null) {
+ props = new Properties();
+ try (InputStream inStream = getClass().getClassLoader().getResourceAsStream(CONFIG_FILE)) {
+ props.load(inStream);
+ String DB_DRIVER = (String) props.get("org.onap.dmaap.datarouter.db.driver");
+ DB_URL = (String) props.get("org.onap.dmaap.datarouter.db.url");
+ DB_LOGIN = (String) props.get("org.onap.dmaap.datarouter.db.login");
+ DB_PASSWORD = (String) props.get("org.onap.dmaap.datarouter.db.password");
+ HTTPS_PORT = (String) props.get("org.onap.dmaap.datarouter.provserver.https.port");
+ HTTP_PORT = (String) props.get("org.onap.dmaap.datarouter.provserver.http.port");
+ Class.forName(DB_DRIVER);
+ } catch (IOException e) {
+ intlogger.fatal("PROV9003 Opening properties: " + e.getMessage());
+ e.printStackTrace();
+ System.exit(1);
+ } catch (ClassNotFoundException e) {
+ intlogger.fatal("PROV9004 cannot find the DB driver: " + e);
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+ }
+
+ /**
+ * Get the provisioning server properties (loaded from provserver.properties).
+ *
+ * @return the Properties object
+ */
+ public Properties getProperties() {
+ return props;
+ }
+
+ /**
+ * Get a JDBC connection to the DB from the pool. Creates a new one if none are available.
+ *
+ * @return the Connection
+ * @throws SQLException
+ */
+ @SuppressWarnings("resource")
+ public Connection getConnection() throws SQLException {
+ Connection connection = null;
+ while (connection == null) {
+ synchronized (queue) {
+ try {
+ connection = queue.remove();
+ } catch (NoSuchElementException nseEx) {
+ int n = 0;
+ do {
+ // Try up to 3 times to get a connection
+ try {
+ connection = DriverManager.getConnection(DB_URL, DB_LOGIN, DB_PASSWORD);
+ } catch (SQLException sqlEx) {
+ if (++n >= 3)
+ throw sqlEx;
+ }
+ } while (connection == null);
+ }
+ }
+ if (connection != null && !connection.isValid(1)) {
+ connection.close();
+ connection = null;
+ }
+ }
+ return connection;
+ }
+
+ /**
+ * Returns a JDBC connection to the pool.
+ *
+ * @param connection the Connection to return
+ */
+ public void release(Connection connection) {
+ if (connection != null) {
+ synchronized (queue) {
+ if (!queue.contains(connection))
+ queue.add(connection);
+ }
+ }
+ }
+
+ /**
+ * Run all necessary retrofits required to bring the database up to the level required for this version
+ * of the provisioning server. This should be run before the server itself is started.
+ *
+ * @return true if all retrofits worked, false otherwise
+ */
+ public boolean runRetroFits() {
+ return retroFit1();
+ }
+
+ /**
+ * Retrofit 1 - Make sure the expected tables are in DB and are initialized.
+ * Uses sql_init_01.sql to setup the DB.
+ *
+ * @return true if the retrofit worked, false otherwise
+ */
+ private boolean retroFit1() {
+ final String[] expectedTables = {
+ "FEEDS", "FEED_ENDPOINT_ADDRS", "FEED_ENDPOINT_IDS", "PARAMETERS",
+ "SUBSCRIPTIONS", "LOG_RECORDS", "INGRESS_ROUTES", "EGRESS_ROUTES",
+ "NETWORK_ROUTES", "NODESETS", "NODES", "GROUPS"
+ };
+ Connection connection = null;
+ try {
+ connection = getConnection();
+ Set<String> actualTables = getTableSet(connection);
+ boolean initialize = false;
+ for (String table : expectedTables) {
+ initialize |= !actualTables.contains(table);
+ }
+ if (initialize) {
+ intlogger.info("PROV9001: First time startup; The database is being initialized.");
+ runInitScript(connection, 1);
+ }
+ } catch (SQLException e) {
+ intlogger.fatal("PROV9000: The database credentials are not working: " + e.getMessage());
+ return false;
+ } finally {
+ if (connection != null)
+ release(connection);
+ }
+ return true;
+ }
+
+ /**
+ * Get a set of all table names in the DB.
+ *
+ * @param connection a DB connection
+ * @return the set of table names
+ */
+ private Set<String> getTableSet(Connection connection) {
+ Set<String> tables = new HashSet<String>();
+ try {
+ DatabaseMetaData md = connection.getMetaData();
+ ResultSet rs = md.getTables("datarouter", "", "", null);
+ if (rs != null) {
+ while (rs.next()) {
+ tables.add(rs.getString("TABLE_NAME"));
+ }
+ rs.close();
+ }
+ } catch (SQLException e) {
+ }
+ return tables;
+ }
+
+ /**
+ * Initialize the tables by running the initialization scripts located in the directory specified
+ * by the property <i>org.onap.dmaap.datarouter.provserver.dbscripts</i>. Scripts have names of
+ * the form sql_init_NN.sql
+ *
+ * @param connection a DB connection
+ * @param scriptId the number of the sql_init_NN.sql script to run
+ */
+ private void runInitScript(Connection connection, int scriptId) {
+ String scriptDir = (String) props.get("org.onap.dmaap.datarouter.provserver.dbscripts");
+ StringBuilder sb = new StringBuilder();
+ try {
+ String scriptFile = String.format("%s/sql_init_%02d.sql", scriptDir, scriptId);
+ if (!(new File(scriptFile)).exists())
+ return;
+
+ LineNumberReader in = new LineNumberReader(new FileReader(scriptFile));
+ String line;
+ while ((line = in.readLine()) != null) {
+ if (!line.startsWith("--")) {
+ line = line.trim();
+ sb.append(line);
+ if (line.endsWith(";")) {
+ // Execute one DDL statement
+ String sql = sb.toString();
+ sb.setLength(0);
+ Statement s = connection.createStatement();
+ s.execute(sql);
+ s.close();
+ }
+ }
+ }
+ in.close();
+ sb.setLength(0);
+ } catch (Exception e) {
+ intlogger.fatal("PROV9002 Error when initializing table: " + e.getMessage());
+ System.exit(1);
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLI.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLI.java
index a3f4b32c..1bbf4460 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLI.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLI.java
@@ -7,9 +7,9 @@
* * 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.
@@ -59,398 +59,404 @@ import org.json.JSONTokener;
* @version $Id: DRRouteCLI.java,v 1.2 2013/11/05 15:54:16 eby Exp $
*/
public class DRRouteCLI {
- /**
- * Invoke the CLI. The CLI can be run with a single command (given as command line arguments),
- * or in an interactive mode where the user types a sequence of commands to the program. The CLI is invoked via:
- * <pre>
- * java org.onap.dmaap.datarouter.provisioning.utils.DRRouteCLI [ -s <i>server</i> ] [ <i>command</i> ]
- * </pre>
- * A full description of the arguments to this command are
- * <a href="http://wiki.proto.research.att.com/doku.php?id=datarouter-route-cli">here</a>.
- *
- * @param args command line arguments
- * @throws Exception for any unrecoverable problem
- */
- public static void main(String[] args) throws Exception {
- String server = System.getenv(ENV_VAR);
- if (args.length >= 2 && args[0].equals("-s")) {
- server = args[1];
- String[] t = new String[args.length-2];
- if (t.length > 0)
- System.arraycopy(args, 2, t, 0, t.length);
- args = t;
- }
- if (server == null || server.equals("")) {
- System.err.println("dr-route: you need to specify a server, either via $PROVSRVR or the '-s' option.");
- System.exit(1);
- }
- DRRouteCLI cli = new DRRouteCLI(server);
- if (args.length > 0) {
- boolean b = cli.runCommand(args);
- System.exit(b ? 0 : 1);
- } else {
- cli.interactive();
- System.exit(0);
- }
- }
+ /**
+ * Invoke the CLI. The CLI can be run with a single command (given as command line arguments),
+ * or in an interactive mode where the user types a sequence of commands to the program. The CLI is invoked via:
+ * <pre>
+ * java org.onap.dmaap.datarouter.provisioning.utils.DRRouteCLI [ -s <i>server</i> ] [ <i>command</i> ]
+ * </pre>
+ * A full description of the arguments to this command are
+ * <a href="http://wiki.proto.research.att.com/doku.php?id=datarouter-route-cli">here</a>.
+ *
+ * @param args command line arguments
+ * @throws Exception for any unrecoverable problem
+ */
+ public static void main(String[] args) throws Exception {
+ String server = System.getenv(ENV_VAR);
+ if (args.length >= 2 && args[0].equals("-s")) {
+ server = args[1];
+ String[] t = new String[args.length - 2];
+ if (t.length > 0)
+ System.arraycopy(args, 2, t, 0, t.length);
+ args = t;
+ }
+ if (server == null || server.equals("")) {
+ System.err.println("dr-route: you need to specify a server, either via $PROVSRVR or the '-s' option.");
+ System.exit(1);
+ }
+ DRRouteCLI cli = new DRRouteCLI(server);
+ if (args.length > 0) {
+ boolean b = cli.runCommand(args);
+ System.exit(b ? 0 : 1);
+ } else {
+ cli.interactive();
+ System.exit(0);
+ }
+ }
+
+ public static final String ENV_VAR = "PROVSRVR";
+ public static final String PROMPT = "dr-route> ";
+ public static final String DEFAULT_TRUSTSTORE_PATH = /* $JAVA_HOME + */ "/jre/lib/security/cacerts";
- public static final String ENV_VAR = "PROVSRVR";
- public static final String PROMPT = "dr-route> ";
- public static final String DEFAULT_TRUSTSTORE_PATH = /* $JAVA_HOME + */ "/jre/lib/security/cacerts";
+ private final String server;
+ private int width = 120; // screen width (for list)
+ private AbstractHttpClient httpclient;
- private final String server;
- private int width = 120; // screen width (for list)
- private AbstractHttpClient httpclient;
+ /**
+ * Create a DRRouteCLI object connecting to the specified server.
+ *
+ * @param server the server to send command to
+ * @throws Exception
+ */
+ public DRRouteCLI(String server) throws Exception {
+ this.server = server;
+ this.width = 120;
+ this.httpclient = new DefaultHttpClient();
- /**
- * Create a DRRouteCLI object connecting to the specified server.
- * @param server the server to send command to
- * @throws Exception
- */
- public DRRouteCLI(String server) throws Exception {
- this.server = server;
- this.width = 120;
- this.httpclient = new DefaultHttpClient();
+ Properties p = (new DB()).getProperties();
+ String truststore_file = p.getProperty("org.onap.dmaap.datarouter.provserver.truststore.path");
+ String truststore_pw = p.getProperty("org.onap.dmaap.datarouter.provserver.truststore.password");
- Properties p = (new DB()).getProperties();
- String truststore_file = p.getProperty("org.onap.dmaap.datarouter.provserver.truststore.path");
- String truststore_pw = p.getProperty("org.onap.dmaap.datarouter.provserver.truststore.password");
+ KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ if (truststore_file == null || truststore_file.equals("")) {
+ String jhome = System.getenv("JAVA_HOME");
+ if (jhome == null || jhome.equals(""))
+ jhome = "/opt/java/jdk/jdk180";
+ truststore_file = jhome + DEFAULT_TRUSTSTORE_PATH;
+ }
+ File f = new File(truststore_file);
+ if (f.exists()) {
+ FileInputStream instream = new FileInputStream(f);
+ try {
+ trustStore.load(instream, truststore_pw.toCharArray());
+ } catch (Exception x) {
+ System.err.println("Problem reading truststore: " + x);
+ throw x;
+ } finally {
+ try {
+ instream.close();
+ } catch (Exception ignore) {
+ }
+ }
+ }
- KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
- if (truststore_file == null || truststore_file.equals("")) {
- String jhome = System.getenv("JAVA_HOME");
- if (jhome == null || jhome.equals(""))
- jhome = "/opt/java/jdk/jdk180";
- truststore_file = jhome + DEFAULT_TRUSTSTORE_PATH;
- }
- File f = new File(truststore_file);
- if (f.exists()) {
- FileInputStream instream = new FileInputStream(f);
- try {
- trustStore.load(instream, truststore_pw.toCharArray());
- } catch (Exception x) {
- System.err.println("Problem reading truststore: "+x);
- throw x;
- } finally {
- try { instream.close(); } catch (Exception ignore) {}
- }
- }
+ SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
+ Scheme sch = new Scheme("https", 443, socketFactory);
+ httpclient.getConnectionManager().getSchemeRegistry().register(sch);
+ }
- SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
- Scheme sch = new Scheme("https", 443, socketFactory);
- httpclient.getConnectionManager().getSchemeRegistry().register(sch);
- }
+ private void interactive() throws IOException {
+ LineNumberReader in = new LineNumberReader(new InputStreamReader(System.in));
+ while (true) {
+ System.out.print(PROMPT);
+ String line = in.readLine();
+ if (line == null)
+ return;
+ line = line.trim();
+ if (line.equalsIgnoreCase("exit")) // "exit" may only be used in interactive mode
+ return;
+ if (line.equalsIgnoreCase("quit")) // "quit" may only be used in interactive mode
+ return;
+ String[] args = line.split("[ \t]+");
+ if (args.length > 0)
+ runCommand(args);
+ }
+ }
- private void interactive() throws IOException {
- LineNumberReader in = new LineNumberReader(new InputStreamReader(System.in));
- while (true) {
- System.out.print(PROMPT);
- String line = in.readLine();
- if (line == null)
- return;
- line = line.trim();
- if (line.equalsIgnoreCase("exit")) // "exit" may only be used in interactive mode
- return;
- if (line.equalsIgnoreCase("quit")) // "quit" may only be used in interactive mode
- return;
- String[] args = line.split("[ \t]+");
- if (args.length > 0)
- runCommand(args);
- }
- }
+ /**
+ * Run the command specified by the arguments.
+ *
+ * @param args The command line arguments.
+ * @return true if the command was valid and succeeded
+ */
+ public boolean runCommand(String[] args) {
+ String cmd = args[0].trim().toLowerCase();
+ if (cmd.equals("add")) {
+ if (args.length > 2) {
+ if (args[1].startsWith("in") && args.length >= 6) {
+ return addIngress(args);
+ }
+ if (args[1].startsWith("eg") && args.length == 4) {
+ return addEgress(args);
+ }
+ if (args[1].startsWith("ne") && args.length == 5) {
+ return addRoute(args);
+ }
+ }
+ System.err.println("Add command should be one of:");
+ System.err.println(" add in[gress] feedid user subnet nodepatt [ seq ]");
+ System.err.println(" add eg[ress] subid node");
+ System.err.println(" add ne[twork] fromnode tonode vianode");
+ } else if (cmd.startsWith("del")) {
+ if (args.length > 2) {
+ if (args[1].startsWith("in") && args.length == 5) {
+ return delIngress(args);
+ }
+ if (args[1].startsWith("in") && args.length == 3) {
+ return delIngress(args);
+ }
+ if (args[1].startsWith("eg") && args.length == 3) {
+ return delEgress(args);
+ }
+ if (args[1].startsWith("ne") && args.length == 4) {
+ return delRoute(args);
+ }
+ }
+ System.err.println("Delete command should be one of:");
+ System.err.println(" del in[gress] feedid user subnet");
+ System.err.println(" del in[gress] seq");
+ System.err.println(" del eg[ress] subid");
+ System.err.println(" del ne[twork] fromnode tonode");
+ } else if (cmd.startsWith("lis")) {
+ return list(args);
+ } else if (cmd.startsWith("wid") && args.length > 1) {
+ width = Integer.parseInt(args[1]);
+ return true;
+ } else if (cmd.startsWith("?") || cmd.startsWith("hel") || cmd.startsWith("usa")) {
+ usage();
+ } else if (cmd.startsWith("#")) {
+ // comment -- ignore
+ } else {
+ System.err.println("Command should be one of add, del, list, exit, quit");
+ }
+ return false;
+ }
- /**
- * Run the command specified by the arguments.
- * @param args The command line arguments.
- * @return true if the command was valid and succeeded
- */
- public boolean runCommand(String[] args) {
- String cmd = args[0].trim().toLowerCase();
- if (cmd.equals("add")) {
- if (args.length > 2) {
- if (args[1].startsWith("in") && args.length >= 6) {
- return addIngress(args);
- }
- if (args[1].startsWith("eg") && args.length == 4) {
- return addEgress(args);
- }
- if (args[1].startsWith("ne") && args.length == 5) {
- return addRoute(args);
- }
- }
- System.err.println("Add command should be one of:");
- System.err.println(" add in[gress] feedid user subnet nodepatt [ seq ]");
- System.err.println(" add eg[ress] subid node");
- System.err.println(" add ne[twork] fromnode tonode vianode");
- } else if (cmd.startsWith("del")) {
- if (args.length > 2) {
- if (args[1].startsWith("in") && args.length == 5) {
- return delIngress(args);
- }
- if (args[1].startsWith("in") && args.length == 3) {
- return delIngress(args);
- }
- if (args[1].startsWith("eg") && args.length == 3) {
- return delEgress(args);
- }
- if (args[1].startsWith("ne") && args.length == 4) {
- return delRoute(args);
- }
- }
- System.err.println("Delete command should be one of:");
- System.err.println(" del in[gress] feedid user subnet");
- System.err.println(" del in[gress] seq");
- System.err.println(" del eg[ress] subid");
- System.err.println(" del ne[twork] fromnode tonode");
- } else if (cmd.startsWith("lis")) {
- return list(args);
- } else if (cmd.startsWith("wid") && args.length > 1) {
- width = Integer.parseInt(args[1]);
- return true;
- } else if (cmd.startsWith("?") || cmd.startsWith("hel") || cmd.startsWith("usa")) {
- usage();
- } else if (cmd.startsWith("#")) {
- // comment -- ignore
- } else {
- System.err.println("Command should be one of add, del, list, exit, quit");
- }
- return false;
- }
+ private void usage() {
+ System.out.println("Enter one of the following commands:");
+ System.out.println(" add in[gress] feedid user subnet nodepatt [ seq ]");
+ System.out.println(" add eg[ress] subid node");
+ System.out.println(" add ne[twork] fromnode tonode vianode");
+ System.out.println(" del in[gress] feedid user subnet");
+ System.out.println(" del in[gress] seq");
+ System.out.println(" del eg[ress] subid");
+ System.out.println(" del ne[twork] fromnode tonode");
+ System.out.println(" list [ all | ingress | egress | network ]");
+ System.out.println(" exit");
+ System.out.println(" quit");
+ }
- private void usage() {
- System.out.println("Enter one of the following commands:");
- System.out.println(" add in[gress] feedid user subnet nodepatt [ seq ]");
- System.out.println(" add eg[ress] subid node");
- System.out.println(" add ne[twork] fromnode tonode vianode");
- System.out.println(" del in[gress] feedid user subnet");
- System.out.println(" del in[gress] seq");
- System.out.println(" del eg[ress] subid");
- System.out.println(" del ne[twork] fromnode tonode");
- System.out.println(" list [ all | ingress | egress | network ]");
- System.out.println(" exit");
- System.out.println(" quit");
- }
+ private boolean addIngress(String[] args) {
+ String url = String.format("https://%s/internal/route/ingress/?feed=%s&user=%s&subnet=%s&nodepatt=%s", server, args[2], args[3], args[4], args[5]);
+ if (args.length > 6)
+ url += "&seq=" + args[6];
+ return doPost(url);
+ }
- private boolean addIngress(String[] args) {
- String url = String.format("https://%s/internal/route/ingress/?feed=%s&user=%s&subnet=%s&nodepatt=%s", server, args[2], args[3], args[4], args[5]);
- if (args.length > 6)
- url += "&seq=" + args[6];
- return doPost(url);
- }
+ private boolean addEgress(String[] args) {
+ String url = String.format("https://%s/internal/route/egress/?sub=%s&node=%s", server, args[2], args[3]);
+ return doPost(url);
+ }
- private boolean addEgress(String[] args) {
- String url = String.format("https://%s/internal/route/egress/?sub=%s&node=%s", server, args[2], args[3]);
- return doPost(url);
- }
+ private boolean addRoute(String[] args) {
+ String url = String.format("https://%s/internal/route/network/?from=%s&to=%s&via=%s", server, args[2], args[3], args[4]);
+ return doPost(url);
+ }
- private boolean addRoute(String[] args) {
- String url = String.format("https://%s/internal/route/network/?from=%s&to=%s&via=%s", server, args[2], args[3], args[4]);
- return doPost(url);
- }
+ private boolean delIngress(String[] args) {
+ String url;
+ if (args.length == 5) {
+ String subnet = args[4].replaceAll("/", "!"); // replace the / with a !
+ url = String.format("https://%s/internal/route/ingress/%s/%s/%s", server, args[2], args[3], subnet);
+ } else {
+ url = String.format("https://%s/internal/route/ingress/%s", server, args[2]);
+ }
+ return doDelete(url);
+ }
- private boolean delIngress(String[] args) {
- String url;
- if (args.length == 5) {
- String subnet = args[4].replaceAll("/", "!"); // replace the / with a !
- url = String.format("https://%s/internal/route/ingress/%s/%s/%s", server, args[2], args[3], subnet);
- } else {
- url = String.format("https://%s/internal/route/ingress/%s", server, args[2]);
- }
- return doDelete(url);
- }
+ private boolean delEgress(String[] args) {
+ String url = String.format("https://%s/internal/route/egress/%s", server, args[2]);
+ return doDelete(url);
+ }
- private boolean delEgress(String[] args) {
- String url = String.format("https://%s/internal/route/egress/%s", server, args[2]);
- return doDelete(url);
- }
+ private boolean delRoute(String[] args) {
+ String url = String.format("https://%s/internal/route/network/%s/%s", server, args[2], args[3]);
+ return doDelete(url);
+ }
- private boolean delRoute(String[] args) {
- String url = String.format("https://%s/internal/route/network/%s/%s", server, args[2], args[3]);
- return doDelete(url);
- }
+ private boolean list(String[] args) {
+ String tbl = (args.length == 1) ? "all" : args[1].toLowerCase();
+ JSONObject jo = doGet("https://" + server + "/internal/route/"); // Returns all 3 tables
+ StringBuilder sb = new StringBuilder();
+ if (tbl.startsWith("al") || tbl.startsWith("in")) {
+ // Display the IRT
+ JSONArray irt = jo.optJSONArray("ingress");
+ int cw1 = 6, cw2 = 6, cw3 = 6, cw4 = 6; // determine column widths for first 4 cols
+ for (int i = 0; irt != null && i < irt.length(); i++) {
+ JSONObject e = irt.getJSONObject(i);
+ cw1 = Math.max(cw1, ("" + e.getInt("seq")).length());
+ cw2 = Math.max(cw2, ("" + e.getInt("feedid")).length());
+ String t = e.optString("user");
+ cw3 = Math.max(cw3, (t == null) ? 1 : t.length());
+ t = e.optString("subnet");
+ cw4 = Math.max(cw4, (t == null) ? 1 : t.length());
+ }
- private boolean list(String[] args) {
- String tbl = (args.length == 1) ? "all" : args[1].toLowerCase();
- JSONObject jo = doGet("https://"+server+"/internal/route/"); // Returns all 3 tables
- StringBuilder sb = new StringBuilder();
- if (tbl.startsWith("al") || tbl.startsWith("in")) {
- // Display the IRT
- JSONArray irt = jo.optJSONArray("ingress");
- int cw1 = 6, cw2 = 6, cw3 = 6, cw4 = 6; // determine column widths for first 4 cols
- for (int i = 0; irt != null && i < irt.length(); i++) {
- JSONObject e = irt.getJSONObject(i);
- cw1 = Math.max(cw1, (""+ e.getInt("seq")).length());
- cw2 = Math.max(cw2, (""+e.getInt("feedid")).length());
- String t = e.optString("user");
- cw3 = Math.max(cw3, (t == null) ? 1 : t.length());
- t = e.optString("subnet");
- cw4 = Math.max(cw4, (t == null) ? 1 : t.length());
- }
+ int nblank = cw1 + cw2 + cw3 + cw4 + 8;
+ sb.append("Ingress Routing Table\n");
+ sb.append(String.format("%s %s %s %s Nodes\n", ext("Seq", cw1), ext("FeedID", cw2), ext("User", cw3), ext("Subnet", cw4)));
+ for (int i = 0; irt != null && i < irt.length(); i++) {
+ JSONObject e = irt.getJSONObject(i);
+ String seq = "" + e.getInt("seq");
+ String feedid = "" + e.getInt("feedid");
+ String user = e.optString("user");
+ String subnet = e.optString("subnet");
+ if (user.equals("")) user = "-";
+ if (subnet.equals("")) subnet = "-";
+ JSONArray nodes = e.getJSONArray("node");
+ int sol = sb.length();
+ sb.append(String.format("%s %s %s %s ", ext(seq, cw1), ext(feedid, cw2), ext(user, cw3), ext(subnet, cw4)));
+ for (int j = 0; j < nodes.length(); j++) {
+ String nd = nodes.getString(j);
+ int cursor = sb.length() - sol;
+ if (j > 0 && (cursor + nd.length() > width)) {
+ sb.append("\n");
+ sol = sb.length();
+ sb.append(ext(" ", nblank));
+ }
+ sb.append(nd);
+ if ((j + 1) < nodes.length()) {
+ sb.append(", ");
+ }
+ }
+ sb.append("\n");
+ }
+ }
+ if (tbl.startsWith("al") || tbl.startsWith("eg")) {
+ // Display the ERT
+ JSONObject ert = jo.optJSONObject("egress");
+ String[] subs = (ert == null) ? new String[0] : JSONObject.getNames(ert);
+ if (subs == null)
+ subs = new String[0];
+ Arrays.sort(subs);
+ int cw1 = 5;
+ for (int i = 0; i < subs.length; i++) {
+ cw1 = Math.max(cw1, subs[i].length());
+ }
- int nblank = cw1 + cw2 + cw3 + cw4 + 8;
- sb.append("Ingress Routing Table\n");
- sb.append(String.format("%s %s %s %s Nodes\n", ext("Seq", cw1), ext("FeedID", cw2), ext("User", cw3), ext("Subnet", cw4)));
- for (int i = 0; irt != null && i < irt.length(); i++) {
- JSONObject e = irt.getJSONObject(i);
- String seq = ""+e.getInt("seq");
- String feedid = ""+e.getInt("feedid");
- String user = e.optString("user");
- String subnet = e.optString("subnet");
- if (user.equals("")) user = "-";
- if (subnet.equals("")) subnet = "-";
- JSONArray nodes = e.getJSONArray("node");
- int sol = sb.length();
- sb.append(String.format("%s %s %s %s ", ext(seq, cw1), ext(feedid, cw2), ext(user, cw3), ext(subnet, cw4)));
- for (int j = 0; j < nodes.length(); j++) {
- String nd = nodes.getString(j);
- int cursor = sb.length() - sol;
- if (j > 0 && (cursor + nd.length() > width)) {
- sb.append("\n");
- sol = sb.length();
- sb.append(ext(" ", nblank));
- }
- sb.append(nd);
- if ((j+1) < nodes.length()) {
- sb.append(", ");
- }
- }
- sb.append("\n");
- }
- }
- if (tbl.startsWith("al") || tbl.startsWith("eg")) {
- // Display the ERT
- JSONObject ert = jo.optJSONObject("egress");
- String[] subs = (ert == null) ? new String[0] : JSONObject.getNames(ert);
- if (subs == null)
- subs = new String[0];
- Arrays.sort(subs);
- int cw1 = 5;
- for (int i = 0; i < subs.length; i++) {
- cw1 = Math.max(cw1, subs[i].length());
- }
+ if (sb.length() > 0)
+ sb.append("\n");
+ sb.append("Egress Routing Table\n");
+ sb.append(String.format("%s Node\n", ext("SubID", cw1)));
+ for (int i = 0; i < subs.length; i++) {
+ String node = ert.getString(subs[i]);
+ sb.append(String.format("%s %s\n", ext(subs[i], cw1), node));
+ }
+ }
+ if (tbl.startsWith("al") || tbl.startsWith("ne")) {
+ // Display the NRT
+ JSONArray nrt = jo.optJSONArray("routing");
+ int cw1 = 4, cw2 = 4;
+ for (int i = 0; nrt != null && i < nrt.length(); i++) {
+ JSONObject e = nrt.getJSONObject(i);
+ String from = e.getString("from");
+ String to = e.getString("to");
+ cw1 = Math.max(cw1, from.length());
+ cw2 = Math.max(cw2, to.length());
+ }
- if (sb.length() > 0)
- sb.append("\n");
- sb.append("Egress Routing Table\n");
- sb.append(String.format("%s Node\n", ext("SubID", cw1)));
- for (int i = 0; i < subs.length; i++) {
- String node = ert.getString(subs[i]);
- sb.append(String.format("%s %s\n", ext(subs[i], cw1), node));
- }
- }
- if (tbl.startsWith("al") || tbl.startsWith("ne")) {
- // Display the NRT
- JSONArray nrt = jo.optJSONArray("routing");
- int cw1 = 4, cw2 = 4;
- for (int i = 0; nrt != null && i < nrt.length(); i++) {
- JSONObject e = nrt.getJSONObject(i);
- String from = e.getString("from");
- String to = e.getString("to");
- cw1 = Math.max(cw1, from.length());
- cw2 = Math.max(cw2, to.length());
- }
+ if (sb.length() > 0)
+ sb.append("\n");
+ sb.append("Network Routing Table\n");
+ sb.append(String.format("%s %s Via\n", ext("From", cw1), ext("To", cw2)));
+ for (int i = 0; nrt != null && i < nrt.length(); i++) {
+ JSONObject e = nrt.getJSONObject(i);
+ String from = e.getString("from");
+ String to = e.getString("to");
+ String via = e.getString("via");
+ sb.append(String.format("%s %s %s\n", ext(from, cw1), ext(to, cw2), via));
+ }
+ }
+ System.out.print(sb.toString());
+ return true;
+ }
- if (sb.length() > 0)
- sb.append("\n");
- sb.append("Network Routing Table\n");
- sb.append(String.format("%s %s Via\n", ext("From", cw1), ext("To", cw2)));
- for (int i = 0; nrt != null && i < nrt.length(); i++) {
- JSONObject e = nrt.getJSONObject(i);
- String from = e.getString("from");
- String to = e.getString("to");
- String via = e.getString("via");
- sb.append(String.format("%s %s %s\n", ext(from, cw1), ext(to, cw2), via));
- }
- }
- System.out.print(sb.toString());
- return true;
- }
- private String ext(String s, int n) {
- if (s == null)
- s = "-";
- while (s.length() < n)
- s += " ";
- return s;
- }
+ private String ext(String s, int n) {
+ if (s == null)
+ s = "-";
+ while (s.length() < n)
+ s += " ";
+ return s;
+ }
- private boolean doDelete(String url) {
- boolean rv = false;
- HttpDelete meth = new HttpDelete(url);
- try {
- HttpResponse response = httpclient.execute(meth);
- HttpEntity entity = response.getEntity();
- StatusLine sl = response.getStatusLine();
- rv = (sl.getStatusCode() == HttpServletResponse.SC_OK);
- if (rv) {
- System.out.println("Routing entry deleted.");
- EntityUtils.consume(entity);
- } else {
- printErrorText(entity);
- }
- } catch (Exception e) {
- } finally {
- meth.releaseConnection();
- }
- return rv;
- }
+ private boolean doDelete(String url) {
+ boolean rv = false;
+ HttpDelete meth = new HttpDelete(url);
+ try {
+ HttpResponse response = httpclient.execute(meth);
+ HttpEntity entity = response.getEntity();
+ StatusLine sl = response.getStatusLine();
+ rv = (sl.getStatusCode() == HttpServletResponse.SC_OK);
+ if (rv) {
+ System.out.println("Routing entry deleted.");
+ EntityUtils.consume(entity);
+ } else {
+ printErrorText(entity);
+ }
+ } catch (Exception e) {
+ } finally {
+ meth.releaseConnection();
+ }
+ return rv;
+ }
- private JSONObject doGet(String url) {
- JSONObject rv = new JSONObject();
- HttpGet meth = new HttpGet(url);
- try {
- HttpResponse response = httpclient.execute(meth);
- HttpEntity entity = response.getEntity();
- StatusLine sl = response.getStatusLine();
- if (sl.getStatusCode() == HttpServletResponse.SC_OK) {
- rv = new JSONObject(new JSONTokener(entity.getContent()));
- } else {
- printErrorText(entity);
- }
- } catch (Exception e) {
- System.err.println(e);
- } finally {
- meth.releaseConnection();
- }
- return rv;
- }
+ private JSONObject doGet(String url) {
+ JSONObject rv = new JSONObject();
+ HttpGet meth = new HttpGet(url);
+ try {
+ HttpResponse response = httpclient.execute(meth);
+ HttpEntity entity = response.getEntity();
+ StatusLine sl = response.getStatusLine();
+ if (sl.getStatusCode() == HttpServletResponse.SC_OK) {
+ rv = new JSONObject(new JSONTokener(entity.getContent()));
+ } else {
+ printErrorText(entity);
+ }
+ } catch (Exception e) {
+ System.err.println(e);
+ } finally {
+ meth.releaseConnection();
+ }
+ return rv;
+ }
- private boolean doPost(String url) {
- boolean rv = false;
- HttpPost meth = new HttpPost(url);
- try {
- HttpResponse response = httpclient.execute(meth);
- HttpEntity entity = response.getEntity();
- StatusLine sl = response.getStatusLine();
- rv = (sl.getStatusCode() == HttpServletResponse.SC_OK);
- if (rv) {
- System.out.println("Routing entry added.");
- EntityUtils.consume(entity);
- } else {
- printErrorText(entity);
- }
- } catch (Exception e) {
- } finally {
- meth.releaseConnection();
- }
- return rv;
- }
+ private boolean doPost(String url) {
+ boolean rv = false;
+ HttpPost meth = new HttpPost(url);
+ try {
+ HttpResponse response = httpclient.execute(meth);
+ HttpEntity entity = response.getEntity();
+ StatusLine sl = response.getStatusLine();
+ rv = (sl.getStatusCode() == HttpServletResponse.SC_OK);
+ if (rv) {
+ System.out.println("Routing entry added.");
+ EntityUtils.consume(entity);
+ } else {
+ printErrorText(entity);
+ }
+ } catch (Exception e) {
+ } finally {
+ meth.releaseConnection();
+ }
+ return rv;
+ }
- private void printErrorText(HttpEntity entity) throws IllegalStateException, IOException {
- // Look for and print only the part of the output between <pre>...</pre>
- InputStream is = entity.getContent();
- StringBuilder sb = new StringBuilder();
- byte[] b = new byte[512];
- int n = 0;
- while ((n = is.read(b)) > 0) {
- sb.append(new String(b, 0, n));
- }
- is.close();
- int ix = sb.indexOf("<pre>");
- if (ix > 0)
- sb.delete(0, ix+5);
- ix = sb.indexOf("</pre>");
- if (ix > 0)
- sb.delete(ix, sb.length());
- System.err.println(sb.toString());
- }
+ private void printErrorText(HttpEntity entity) throws IllegalStateException, IOException {
+ // Look for and print only the part of the output between <pre>...</pre>
+ InputStream is = entity.getContent();
+ StringBuilder sb = new StringBuilder();
+ byte[] b = new byte[512];
+ int n = 0;
+ while ((n = is.read(b)) > 0) {
+ sb.append(new String(b, 0, n));
+ }
+ is.close();
+ int ix = sb.indexOf("<pre>");
+ if (ix > 0)
+ sb.delete(0, ix + 5);
+ ix = sb.indexOf("</pre>");
+ if (ix > 0)
+ sb.delete(ix, sb.length());
+ System.err.println(sb.toString());
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/JSONUtilities.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/JSONUtilities.java
index 886a85c7..915aa610 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/JSONUtilities.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/JSONUtilities.java
@@ -7,9 +7,9 @@
* * 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.
@@ -35,42 +35,45 @@ import java.util.Collection;
* @version $Id: JSONUtilities.java,v 1.1 2013/04/26 21:00:26 eby Exp $
*/
public class JSONUtilities {
- /**
- * Does the String <i>v</i> represent a valid Internet address (with or without a
- * mask length appended).
- * @param v the string to check
- * @return true if valid, false otherwise
- */
- public static boolean validIPAddrOrSubnet(String v) {
- String[] pp = { v, "" };
- if (v.indexOf('/') > 0)
- pp = v.split("/");
- try {
- InetAddress addr = InetAddress.getByName(pp[0]);
- if (pp[1].length() > 0) {
- // check subnet mask
- int mask = Integer.parseInt(pp[1]);
- if (mask > (addr.getAddress().length * 8))
- return false;
- }
- return true;
- } catch (UnknownHostException e) {
- return false;
- }
- }
- /**
- * Build a JSON array from a collection of Strings.
- * @param coll the collection
- * @return a String containing a JSON array
- */
- public static String createJSONArray(Collection<String> coll) {
- StringBuilder sb = new StringBuilder("[");
- String pfx = "\n";
- for (String t : coll) {
- sb.append(pfx).append(" \"").append(t).append("\"");
- pfx = ",\n";
- }
- sb.append("\n]\n");
- return sb.toString();
- }
+ /**
+ * Does the String <i>v</i> represent a valid Internet address (with or without a
+ * mask length appended).
+ *
+ * @param v the string to check
+ * @return true if valid, false otherwise
+ */
+ public static boolean validIPAddrOrSubnet(String v) {
+ String[] pp = {v, ""};
+ if (v.indexOf('/') > 0)
+ pp = v.split("/");
+ try {
+ InetAddress addr = InetAddress.getByName(pp[0]);
+ if (pp[1].length() > 0) {
+ // check subnet mask
+ int mask = Integer.parseInt(pp[1]);
+ if (mask > (addr.getAddress().length * 8))
+ return false;
+ }
+ return true;
+ } catch (UnknownHostException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Build a JSON array from a collection of Strings.
+ *
+ * @param coll the collection
+ * @return a String containing a JSON array
+ */
+ public static String createJSONArray(Collection<String> coll) {
+ StringBuilder sb = new StringBuilder("[");
+ String pfx = "\n";
+ for (String t : coll) {
+ sb.append(pfx).append(" \"").append(t).append("\"");
+ pfx = ",\n";
+ }
+ sb.append("\n]\n");
+ return sb.toString();
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObject.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObject.java
index cbe87da8..afb0de24 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObject.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObject.java
@@ -9,9 +9,9 @@ package org.onap.dmaap.datarouter.provisioning.utils;
* * 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.
@@ -71,7 +71,7 @@ import org.json.JSONTokener;
* <pre>
* myString = new JSONObject().put(&quot;JSON&quot;, &quot;Hello, World!&quot;).toString();
* </pre>
- *
+ * <p>
* produces the string <code>{"JSON": "Hello, World"}</code>.
* <p>
* The texts produced by the <code>toString</code> methods strictly conform to
@@ -101,27 +101,28 @@ public class LOGJSONObject {
/**
* The maximum number of keys in the key pool.
*/
- private static final int keyPoolSize = 100;
+ private static final int keyPoolSize = 100;
- /**
+ /**
* Key pooling is like string interning, but without permanently tying up
* memory. To help conserve memory, storage of duplicated key strings in
* JSONObjects will be avoided by using a key pool to manage unique key
* string objects. This is used by JSONObject.put(string, object).
*/
- private static Map<String,Object> keyPool = new LinkedHashMap<String,Object>(keyPoolSize);
+ private static Map<String, Object> keyPool = new LinkedHashMap<String, Object>(keyPoolSize);
/**
* JSONObject.NULL is equivalent to the value that JavaScript calls null,
* whilst Java's null is equivalent to the value that JavaScript calls
* undefined.
*/
- private static final class Null {
+ private static final class Null {
/**
* There is only intended to be a single instance of the NULL object,
* so the clone method returns itself.
- * @return NULL.
+ *
+ * @return NULL.
*/
protected final Object clone() {
return this;
@@ -129,9 +130,10 @@ public class LOGJSONObject {
/**
* A Null object is equal to the null value and to itself.
- * @param object An object to test for nullness.
+ *
+ * @param object An object to test for nullness.
* @return true if the object parameter is the JSONObject.NULL object
- * or null.
+ * or null.
*/
public boolean equals(Object object) {
return object == null || object == this;
@@ -139,6 +141,7 @@ public class LOGJSONObject {
/**
* Get the "null" string value.
+ *
* @return The string "null".
*/
public String toString() {
@@ -150,7 +153,7 @@ public class LOGJSONObject {
/**
* The map where the JSONObject's properties are kept.
*/
- private final Map<String,Object> map;
+ private final Map<String, Object> map;
/**
@@ -166,7 +169,7 @@ public class LOGJSONObject {
* Construct an empty JSONObject.
*/
public LOGJSONObject() {
- this.map = new LinkedHashMap<String,Object>();
+ this.map = new LinkedHashMap<String, Object>();
}
@@ -174,10 +177,11 @@ public class LOGJSONObject {
* Construct a JSONObject from a subset of another JSONObject.
* An array of strings is used to identify the keys that should be copied.
* Missing keys are ignored.
- * @param jo A JSONObject.
+ *
+ * @param jo A JSONObject.
* @param names An array of strings.
* @throws JSONException
- * @exception JSONException If a value is a non-finite number or if a name is duplicated.
+ * @throws JSONException If a value is a non-finite number or if a name is duplicated.
*/
public LOGJSONObject(LOGJSONObject jo, String[] names) {
this();
@@ -192,9 +196,10 @@ public class LOGJSONObject {
/**
* Construct a JSONObject from a JSONTokener.
+ *
* @param x A JSONTokener object containing the source string.
* @throws JSONException If there is a syntax error in the source string
- * or a duplicated key.
+ * or a duplicated key.
*/
public LOGJSONObject(JSONTokener x) throws JSONException {
this();
@@ -204,16 +209,16 @@ public class LOGJSONObject {
if (x.nextClean() != '{') {
throw x.syntaxError("A JSONObject text must begin with '{'");
}
- for (;;) {
+ for (; ; ) {
c = x.nextClean();
switch (c) {
- case 0:
- throw x.syntaxError("A JSONObject text must end with '}'");
- case '}':
- return;
- default:
- x.back();
- key = x.nextValue().toString();
+ case 0:
+ throw x.syntaxError("A JSONObject text must end with '}'");
+ case '}':
+ return;
+ default:
+ x.back();
+ key = x.nextValue().toString();
}
// The key is followed by ':'. We will also tolerate '=' or '=>'.
@@ -231,17 +236,17 @@ public class LOGJSONObject {
// Pairs are separated by ','. We will also tolerate ';'.
switch (x.nextClean()) {
- case ';':
- case ',':
- if (x.nextClean() == '}') {
+ case ';':
+ case ',':
+ if (x.nextClean() == '}') {
+ return;
+ }
+ x.back();
+ break;
+ case '}':
return;
- }
- x.back();
- break;
- case '}':
- return;
- default:
- throw x.syntaxError("Expected a ',' or '}'");
+ default:
+ throw x.syntaxError("Expected a ',' or '}'");
}
}
}
@@ -251,15 +256,15 @@ public class LOGJSONObject {
* Construct a JSONObject from a Map.
*
* @param map A map object that can be used to initialize the contents of
- * the JSONObject.
+ * the JSONObject.
* @throws JSONException
*/
- public LOGJSONObject(Map<String,Object> map) {
- this.map = new LinkedHashMap<String,Object>();
+ public LOGJSONObject(Map<String, Object> map) {
+ this.map = new LinkedHashMap<String, Object>();
if (map != null) {
- Iterator<Map.Entry<String,Object>> i = map.entrySet().iterator();
+ Iterator<Map.Entry<String, Object>> i = map.entrySet().iterator();
while (i.hasNext()) {
- Map.Entry<String,Object> e = i.next();
+ Map.Entry<String, Object> e = i.next();
Object value = e.getValue();
if (value != null) {
this.map.put(e.getKey(), wrap(value));
@@ -276,17 +281,17 @@ public class LOGJSONObject {
* with <code>"get"</code> or <code>"is"</code> followed by an uppercase letter,
* the method is invoked, and a key and the value returned from the getter method
* are put into the new JSONObject.
- *
+ * <p>
* The key is formed by removing the <code>"get"</code> or <code>"is"</code> prefix.
* If the second remaining character is not upper case, then the first
* character is converted to lower case.
- *
+ * <p>
* For example, if an object has a method named <code>"getName"</code>, and
* if the result of calling <code>object.getName()</code> is <code>"Larry Fine"</code>,
* then the JSONObject will contain <code>"name": "Larry Fine"</code>.
*
* @param bean An object that has getter methods that should be used
- * to make a JSONObject.
+ * to make a JSONObject.
*/
public LOGJSONObject(Object bean) {
this();
@@ -300,10 +305,11 @@ public class LOGJSONObject {
* from the names array, and the values will be the field values associated
* with those keys in the object. If a key is not found or not visible,
* then it will not be copied into the new JSONObject.
+ *
* @param object An object that has fields that should be used to make a
- * JSONObject.
- * @param names An array of strings, the names of the fields to be obtained
- * from the object.
+ * JSONObject.
+ * @param names An array of strings, the names of the fields to be obtained
+ * from the object.
*/
public LOGJSONObject(Object object, String names[]) {
this();
@@ -321,11 +327,12 @@ public class LOGJSONObject {
/**
* Construct a JSONObject from a source JSON text string.
* This is the most commonly used JSONObject constructor.
- * @param source A string beginning
- * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
- * with <code>}</code>&nbsp;<small>(right brace)</small>.
- * @exception JSONException If there is a syntax error in the source
- * string or a duplicated key.
+ *
+ * @param source A string beginning
+ * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+ * with <code>}</code>&nbsp;<small>(right brace)</small>.
+ * @throws JSONException If there is a syntax error in the source
+ * string or a duplicated key.
*/
public LOGJSONObject(String source) throws JSONException {
this(new JSONTokener(source));
@@ -334,8 +341,9 @@ public class LOGJSONObject {
/**
* Construct a JSONObject from a ResourceBundle.
+ *
* @param baseName The ResourceBundle base name.
- * @param locale The Locale to load the ResourceBundle for.
+ * @param locale The Locale to load the ResourceBundle for.
* @throws JSONException If any JSONExceptions are detected.
*/
public LOGJSONObject(String baseName, Locale locale) throws JSONException {
@@ -354,7 +362,7 @@ public class LOGJSONObject {
// segment except the last. Add the value using the last segment's name into
// the deepest nested JSONObject.
- String[] path = ((String)key).split("\\.");
+ String[] path = ((String) key).split("\\.");
int last = path.length - 1;
LOGJSONObject target = this;
for (int i = 0; i < last; i += 1) {
@@ -366,7 +374,7 @@ public class LOGJSONObject {
}
target = nextTarget;
}
- target.put(path[last], bundle.getString((String)key));
+ target.put(path[last], bundle.getString((String) key));
}
}
}
@@ -378,19 +386,20 @@ public class LOGJSONObject {
* JSONArray is stored under the key to hold all of the accumulated values.
* If there is already a JSONArray, then the new value is appended to it.
* In contrast, the put method replaces the previous value.
- *
+ * <p>
* If only one value is accumulated that is not a JSONArray, then the
* result will be the same as using put. But if multiple values are
* accumulated, then the result will be like append.
+ *
* @param key A key string.
* @param value An object to be accumulated under the key.
* @return this.
* @throws JSONException If the value is an invalid number
- * or if the key is null.
+ * or if the key is null.
*/
public LOGJSONObject accumulate(
- String key,
- Object value
+ String key,
+ Object value
) throws JSONException {
testValidity(value);
Object object = this.opt(key);
@@ -399,7 +408,7 @@ public class LOGJSONObject {
? new JSONArray().put(value)
: value);
} else if (object instanceof JSONArray) {
- ((JSONArray)object).put(value);
+ ((JSONArray) object).put(value);
} else {
this.put(key, new JSONArray().put(object).put(value));
}
@@ -412,11 +421,12 @@ public class LOGJSONObject {
* JSONObject, then the key is put in the JSONObject with its value being a
* JSONArray containing the value parameter. If the key was already
* associated with a JSONArray, then the value parameter is appended to it.
+ *
* @param key A key string.
* @param value An object to be accumulated under the key.
* @return this.
* @throws JSONException If the key is null or if the current value
- * associated with the key is not a JSONArray.
+ * associated with the key is not a JSONArray.
*/
public LOGJSONObject append(String key, Object value) throws JSONException {
testValidity(value);
@@ -424,7 +434,7 @@ public class LOGJSONObject {
if (object == null) {
this.put(key, new JSONArray().put(value));
} else if (object instanceof JSONArray) {
- this.put(key, ((JSONArray)object).put(value));
+ this.put(key, ((JSONArray) object).put(value));
} else {
throw new JSONException("JSONObject[" + key +
"] is not a JSONArray.");
@@ -436,7 +446,8 @@ public class LOGJSONObject {
/**
* Produce a string from a double. The string "null" will be returned if
* the number is not finite.
- * @param d A double.
+ *
+ * @param d A double.
* @return A String.
*/
public static String doubleToString(double d) {
@@ -463,9 +474,9 @@ public class LOGJSONObject {
/**
* Get the value object associated with a key.
*
- * @param key A key string.
- * @return The object associated with the key.
- * @throws JSONException if the key is not found.
+ * @param key A key string.
+ * @return The object associated with the key.
+ * @throws JSONException if the key is not found.
*/
public Object get(String key) throws JSONException {
if (key == null) {
@@ -483,20 +494,19 @@ public class LOGJSONObject {
/**
* Get the boolean value associated with a key.
*
- * @param key A key string.
- * @return The truth.
- * @throws JSONException
- * if the value is not a Boolean or the String "true" or "false".
+ * @param key A key string.
+ * @return The truth.
+ * @throws JSONException if the value is not a Boolean or the String "true" or "false".
*/
public boolean getBoolean(String key) throws JSONException {
Object object = this.get(key);
if (object.equals(Boolean.FALSE) ||
(object instanceof String &&
- ((String)object).equalsIgnoreCase("false"))) {
+ ((String) object).equalsIgnoreCase("false"))) {
return false;
} else if (object.equals(Boolean.TRUE) ||
(object instanceof String &&
- ((String)object).equalsIgnoreCase("true"))) {
+ ((String) object).equalsIgnoreCase("true"))) {
return true;
}
throw new JSONException("JSONObject[" + quote(key) +
@@ -506,20 +516,21 @@ public class LOGJSONObject {
/**
* Get the double value associated with a key.
- * @param key A key string.
- * @return The numeric value.
+ *
+ * @param key A key string.
+ * @return The numeric value.
* @throws JSONException if the key is not found or
- * if the value is not a Number object and cannot be converted to a number.
+ * if the value is not a Number object and cannot be converted to a number.
*/
public double getDouble(String key) throws JSONException {
Object object = this.get(key);
try {
return object instanceof Number
- ? ((Number)object).doubleValue()
- : Double.parseDouble((String)object);
+ ? ((Number) object).doubleValue()
+ : Double.parseDouble((String) object);
} catch (Exception e) {
throw new JSONException("JSONObject[" + quote(key) +
- "] is not a number.");
+ "] is not a number.");
}
}
@@ -527,20 +538,20 @@ public class LOGJSONObject {
/**
* Get the int value associated with a key.
*
- * @param key A key string.
- * @return The integer value.
- * @throws JSONException if the key is not found or if the value cannot
- * be converted to an integer.
+ * @param key A key string.
+ * @return The integer value.
+ * @throws JSONException if the key is not found or if the value cannot
+ * be converted to an integer.
*/
public int getInt(String key) throws JSONException {
Object object = this.get(key);
try {
return object instanceof Number
- ? ((Number)object).intValue()
- : Integer.parseInt((String)object);
+ ? ((Number) object).intValue()
+ : Integer.parseInt((String) object);
} catch (Exception e) {
throw new JSONException("JSONObject[" + quote(key) +
- "] is not an int.");
+ "] is not an int.");
}
}
@@ -548,15 +559,15 @@ public class LOGJSONObject {
/**
* Get the JSONArray value associated with a key.
*
- * @param key A key string.
- * @return A JSONArray which is the value.
- * @throws JSONException if the key is not found or
- * if the value is not a JSONArray.
+ * @param key A key string.
+ * @return A JSONArray which is the value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a JSONArray.
*/
public JSONArray getJSONArray(String key) throws JSONException {
Object object = this.get(key);
if (object instanceof JSONArray) {
- return (JSONArray)object;
+ return (JSONArray) object;
}
throw new JSONException("JSONObject[" + quote(key) +
"] is not a JSONArray.");
@@ -566,15 +577,15 @@ public class LOGJSONObject {
/**
* Get the JSONObject value associated with a key.
*
- * @param key A key string.
- * @return A JSONObject which is the value.
- * @throws JSONException if the key is not found or
- * if the value is not a JSONObject.
+ * @param key A key string.
+ * @return A JSONObject which is the value.
+ * @throws JSONException if the key is not found or
+ * if the value is not a JSONObject.
*/
public LOGJSONObject getJSONObject(String key) throws JSONException {
Object object = this.get(key);
if (object instanceof LOGJSONObject) {
- return (LOGJSONObject)object;
+ return (LOGJSONObject) object;
}
throw new JSONException("JSONObject[" + quote(key) +
"] is not a JSONObject.");
@@ -584,20 +595,20 @@ public class LOGJSONObject {
/**
* Get the long value associated with a key.
*
- * @param key A key string.
- * @return The long value.
- * @throws JSONException if the key is not found or if the value cannot
- * be converted to a long.
+ * @param key A key string.
+ * @return The long value.
+ * @throws JSONException if the key is not found or if the value cannot
+ * be converted to a long.
*/
public long getLong(String key) throws JSONException {
Object object = this.get(key);
try {
return object instanceof Number
- ? ((Number)object).longValue()
- : Long.parseLong((String)object);
+ ? ((Number) object).longValue()
+ : Long.parseLong((String) object);
} catch (Exception e) {
throw new JSONException("JSONObject[" + quote(key) +
- "] is not a long.");
+ "] is not a long.");
}
}
@@ -649,24 +660,25 @@ public class LOGJSONObject {
/**
* Get the string associated with a key.
*
- * @param key A key string.
- * @return A string which is the value.
- * @throws JSONException if there is no string value for the key.
+ * @param key A key string.
+ * @return A string which is the value.
+ * @throws JSONException if there is no string value for the key.
*/
public String getString(String key) throws JSONException {
Object object = this.get(key);
if (object instanceof String) {
- return (String)object;
+ return (String) object;
}
throw new JSONException("JSONObject[" + quote(key) +
- "] not a string.");
+ "] not a string.");
}
/**
* Determine if the JSONObject contains a specific key.
- * @param key A key string.
- * @return true if the key exists in the JSONObject.
+ *
+ * @param key A key string.
+ * @return true if the key exists in the JSONObject.
*/
public boolean has(String key) {
return this.map.containsKey(key);
@@ -677,23 +689,24 @@ public class LOGJSONObject {
* Increment a property of a JSONObject. If there is no such property,
* create one with a value of 1. If there is such a property, and if
* it is an Integer, Long, Double, or Float, then add one to it.
- * @param key A key string.
+ *
+ * @param key A key string.
* @return this.
* @throws JSONException If there is already a property with this name
- * that is not an Integer, Long, Double, or Float.
+ * that is not an Integer, Long, Double, or Float.
*/
public LOGJSONObject increment(String key) throws JSONException {
Object value = this.opt(key);
if (value == null) {
this.put(key, 1);
} else if (value instanceof Integer) {
- this.put(key, ((Integer)value).intValue() + 1);
+ this.put(key, ((Integer) value).intValue() + 1);
} else if (value instanceof Long) {
- this.put(key, ((Long)value).longValue() + 1);
+ this.put(key, ((Long) value).longValue() + 1);
} else if (value instanceof Double) {
- this.put(key, ((Double)value).doubleValue() + 1);
+ this.put(key, ((Double) value).doubleValue() + 1);
} else if (value instanceof Float) {
- this.put(key, ((Float)value).floatValue() + 1);
+ this.put(key, ((Float) value).floatValue() + 1);
} else {
throw new JSONException("Unable to increment [" + quote(key) + "].");
}
@@ -703,10 +716,11 @@ public class LOGJSONObject {
/**
* Determine if the value associated with the key is null or if there is
- * no value.
- * @param key A key string.
- * @return true if there is no value associated with the key or if
- * the value is the JSONObject.NULL object.
+ * no value.
+ *
+ * @param key A key string.
+ * @return true if there is no value associated with the key or if
+ * the value is the JSONObject.NULL object.
*/
public boolean isNull(String key) {
return LOGJSONObject.NULL.equals(this.opt(key));
@@ -746,6 +760,7 @@ public class LOGJSONObject {
/**
* Produce a JSONArray containing the names of the elements of this
* JSONObject.
+ *
* @return A JSONArray containing the key strings, or null if the JSONObject
* is empty.
*/
@@ -760,7 +775,8 @@ public class LOGJSONObject {
/**
* Produce a string from a Number.
- * @param number A Number
+ *
+ * @param number A Number
* @return A String.
* @throws JSONException If n is a non-finite number.
*/
@@ -789,8 +805,9 @@ public class LOGJSONObject {
/**
* Get an optional value associated with a key.
- * @param key A key string.
- * @return An object which is the value, or null if there is no value.
+ *
+ * @param key A key string.
+ * @return An object which is the value, or null if there is no value.
*/
public Object opt(String key) {
return key == null ? null : this.map.get(key);
@@ -802,8 +819,8 @@ public class LOGJSONObject {
* It returns false if there is no such key, or if the value is not
* Boolean.TRUE or the String "true".
*
- * @param key A key string.
- * @return The truth.
+ * @param key A key string.
+ * @return The truth.
*/
public boolean optBoolean(String key) {
return this.optBoolean(key, false);
@@ -815,9 +832,9 @@ public class LOGJSONObject {
* It returns the defaultValue if there is no such key, or if it is not
* a Boolean or the String "true" or "false" (case insensitive).
*
- * @param key A key string.
- * @param defaultValue The default.
- * @return The truth.
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return The truth.
*/
public boolean optBoolean(String key, boolean defaultValue) {
try {
@@ -834,8 +851,8 @@ public class LOGJSONObject {
* If the value is a string, an attempt will be made to evaluate it as
* a number.
*
- * @param key A string which is the key.
- * @return An object which is the value.
+ * @param key A string which is the key.
+ * @return An object which is the value.
*/
public double optDouble(String key) {
return this.optDouble(key, Double.NaN);
@@ -848,9 +865,9 @@ public class LOGJSONObject {
* If the value is a string, an attempt will be made to evaluate it as
* a number.
*
- * @param key A key string.
- * @param defaultValue The default.
- * @return An object which is the value.
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
*/
public double optDouble(String key, double defaultValue) {
try {
@@ -867,8 +884,8 @@ public class LOGJSONObject {
* If the value is a string, an attempt will be made to evaluate it as
* a number.
*
- * @param key A key string.
- * @return An object which is the value.
+ * @param key A key string.
+ * @return An object which is the value.
*/
public int optInt(String key) {
return this.optInt(key, 0);
@@ -881,9 +898,9 @@ public class LOGJSONObject {
* If the value is a string, an attempt will be made to evaluate it as
* a number.
*
- * @param key A key string.
- * @param defaultValue The default.
- * @return An object which is the value.
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return An object which is the value.
*/
public int optInt(String key, int defaultValue) {
try {
@@ -899,12 +916,12 @@ public class LOGJSONObject {
* It returns null if there is no such key, or if its value is not a
* JSONArray.
*
- * @param key A key string.
- * @return A JSONArray which is the value.
+ * @param key A key string.
+ * @return A JSONArray which is the value.
*/
public JSONArray optJSONArray(String key) {
Object o = this.opt(key);
- return o instanceof JSONArray ? (JSONArray)o : null;
+ return o instanceof JSONArray ? (JSONArray) o : null;
}
@@ -913,12 +930,12 @@ public class LOGJSONObject {
* It returns null if there is no such key, or if its value is not a
* JSONObject.
*
- * @param key A key string.
- * @return A JSONObject which is the value.
+ * @param key A key string.
+ * @return A JSONObject which is the value.
*/
public LOGJSONObject optJSONObject(String key) {
Object object = this.opt(key);
- return object instanceof LOGJSONObject ? (LOGJSONObject)object : null;
+ return object instanceof LOGJSONObject ? (LOGJSONObject) object : null;
}
@@ -928,8 +945,8 @@ public class LOGJSONObject {
* If the value is a string, an attempt will be made to evaluate it as
* a number.
*
- * @param key A key string.
- * @return An object which is the value.
+ * @param key A key string.
+ * @return An object which is the value.
*/
public long optLong(String key) {
return this.optLong(key, 0);
@@ -944,7 +961,7 @@ public class LOGJSONObject {
*
* @param key A key string.
* @param defaultValue The default.
- * @return An object which is the value.
+ * @return An object which is the value.
*/
public long optLong(String key, long defaultValue) {
try {
@@ -960,8 +977,8 @@ public class LOGJSONObject {
* It returns an empty string if there is no such key. If the value is not
* a string and is not null, then it is converted to a string.
*
- * @param key A key string.
- * @return A string which is the value.
+ * @param key A key string.
+ * @return A string which is the value.
*/
public String optString(String key) {
return this.optString(key, "");
@@ -972,9 +989,9 @@ public class LOGJSONObject {
* Get an optional string associated with a key.
* It returns the defaultValue if there is no such key.
*
- * @param key A key string.
- * @param defaultValue The default.
- * @return A string which is the value.
+ * @param key A key string.
+ * @param defaultValue The default.
+ * @return A string which is the value.
*/
public String optString(String key, String defaultValue) {
Object object = this.opt(key);
@@ -1015,10 +1032,10 @@ public class LOGJSONObject {
key = key.toLowerCase();
} else if (!Character.isUpperCase(key.charAt(1))) {
key = key.substring(0, 1).toLowerCase() +
- key.substring(1);
+ key.substring(1);
}
- Object result = method.invoke(bean, (Object[])null);
+ Object result = method.invoke(bean, (Object[]) null);
if (result != null) {
this.map.put(key, wrap(result));
}
@@ -1047,9 +1064,10 @@ public class LOGJSONObject {
/**
* Put a key/value pair in the JSONObject, where the value will be a
* JSONArray which is produced from a Collection.
+ *
* @param key A key string.
* @param value A Collection value.
- * @return this.
+ * @return this.
* @throws JSONException
*/
public LOGJSONObject put(String key, Collection<Object> value) throws JSONException {
@@ -1103,9 +1121,10 @@ public class LOGJSONObject {
/**
* Put a key/value pair in the JSONObject, where the value will be a
* JSONObject which is produced from a Map.
+ *
* @param key A key string.
* @param value A Map value.
- * @return this.
+ * @return this.
* @throws JSONException
*/
public LOGJSONObject put(String key, Map<String, Object> value) throws JSONException {
@@ -1117,13 +1136,14 @@ public class LOGJSONObject {
/**
* Put a key/value pair in the JSONObject. If the value is null,
* then the key will be removed from the JSONObject if it is present.
+ *
* @param key A key string.
* @param value An object which is the value. It should be of one of these
- * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
- * or the JSONObject.NULL object.
+ * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+ * or the JSONObject.NULL object.
* @return this.
* @throws JSONException If the value is non-finite number
- * or if the key is null.
+ * or if the key is null.
*/
public LOGJSONObject put(String key, Object value) throws JSONException {
String pooled;
@@ -1132,7 +1152,7 @@ public class LOGJSONObject {
}
if (value != null) {
testValidity(value);
- pooled = (String)keyPool.get(key);
+ pooled = (String) keyPool.get(key);
if (pooled == null) {
if (keyPool.size() >= keyPoolSize) {
keyPool = new LinkedHashMap<String, Object>(keyPoolSize);
@@ -1153,6 +1173,7 @@ public class LOGJSONObject {
* Put a key/value pair in the JSONObject, but only if the key and the
* value are both non-null, and only if there is not already a member
* with that name.
+ *
* @param key
* @param value
* @return his.
@@ -1172,10 +1193,11 @@ public class LOGJSONObject {
/**
* Put a key/value pair in the JSONObject, but only if the
* key and the value are both non-null.
+ *
* @param key A key string.
* @param value An object which is the value. It should be of one of these
- * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
- * or the JSONObject.NULL object.
+ * types: Boolean, Double, Integer, JSONArray, JSONObject, Long, String,
+ * or the JSONObject.NULL object.
* @return this.
* @throws JSONException If the value is a non-finite number.
*/
@@ -1192,8 +1214,9 @@ public class LOGJSONObject {
* right places. A backslash will be inserted within </, producing <\/,
* allowing JSON text to be delivered in HTML. In JSON text, a string
* cannot contain a control character or an unescaped quote or backslash.
+ *
* @param string A String
- * @return A String correctly formatted for insertion in a JSON text.
+ * @return A String correctly formatted for insertion in a JSON text.
*/
public static String quote(String string) {
StringWriter sw = new StringWriter();
@@ -1224,42 +1247,42 @@ public class LOGJSONObject {
b = c;
c = string.charAt(i);
switch (c) {
- case '\\':
- case '"':
- w.write('\\');
- w.write(c);
- break;
- case '/':
- if (b == '<') {
+ case '\\':
+ case '"':
w.write('\\');
- }
- w.write(c);
- break;
- case '\b':
- w.write("\\b");
- break;
- case '\t':
- w.write("\\t");
- break;
- case '\n':
- w.write("\\n");
- break;
- case '\f':
- w.write("\\f");
- break;
- case '\r':
- w.write("\\r");
- break;
- default:
- if (c < ' ' || (c >= '\u0080' && c < '\u00a0')
- || (c >= '\u2000' && c < '\u2100')) {
- w.write("\\u");
- hhhh = Integer.toHexString(c);
- w.write("0000", 0, 4 - hhhh.length());
- w.write(hhhh);
- } else {
w.write(c);
- }
+ break;
+ case '/':
+ if (b == '<') {
+ w.write('\\');
+ }
+ w.write(c);
+ break;
+ case '\b':
+ w.write("\\b");
+ break;
+ case '\t':
+ w.write("\\t");
+ break;
+ case '\n':
+ w.write("\\n");
+ break;
+ case '\f':
+ w.write("\\f");
+ break;
+ case '\r':
+ w.write("\\r");
+ break;
+ default:
+ if (c < ' ' || (c >= '\u0080' && c < '\u00a0')
+ || (c >= '\u2000' && c < '\u2100')) {
+ w.write("\\u");
+ hhhh = Integer.toHexString(c);
+ w.write("0000", 0, 4 - hhhh.length());
+ w.write(hhhh);
+ } else {
+ w.write(c);
+ }
}
}
w.write('"');
@@ -1268,6 +1291,7 @@ public class LOGJSONObject {
/**
* Remove a name and its value, if present.
+ *
* @param key The name to be removed.
* @return The value that was associated with the name,
* or null if there was no value.
@@ -1279,6 +1303,7 @@ public class LOGJSONObject {
/**
* Try to convert a string into a number, boolean, or null. If the string
* can't be converted, return the string.
+ *
* @param string A String.
* @return A simple JSON value.
*/
@@ -1322,7 +1347,7 @@ public class LOGJSONObject {
return myLong;
}
}
- } catch (Exception ignore) {
+ } catch (Exception ignore) {
}
}
return string;
@@ -1331,20 +1356,21 @@ public class LOGJSONObject {
/**
* Throw an exception if the object is a NaN or infinite number.
+ *
* @param o The object to test.
* @throws JSONException If o is a non-finite number.
*/
public static void testValidity(Object o) throws JSONException {
if (o != null) {
if (o instanceof Double) {
- if (((Double)o).isInfinite() || ((Double)o).isNaN()) {
+ if (((Double) o).isInfinite() || ((Double) o).isNaN()) {
throw new JSONException(
- "JSON does not allow non-finite numbers.");
+ "JSON does not allow non-finite numbers.");
}
} else if (o instanceof Float) {
- if (((Float)o).isInfinite() || ((Float)o).isNaN()) {
+ if (((Float) o).isInfinite() || ((Float) o).isNaN()) {
throw new JSONException(
- "JSON does not allow non-finite numbers.");
+ "JSON does not allow non-finite numbers.");
}
}
}
@@ -1354,8 +1380,9 @@ public class LOGJSONObject {
/**
* Produce a JSONArray containing the values of the members of this
* JSONObject.
+ *
* @param names A JSONArray containing a list of key strings. This
- * determines the sequence of the values in the result.
+ * determines the sequence of the values in the result.
* @return A JSONArray of values.
* @throws JSONException If any of the values are non-finite numbers.
*/
@@ -1378,9 +1405,9 @@ public class LOGJSONObject {
* Warning: This method assumes that the data structure is acyclical.
*
* @return a printable, displayable, portable, transmittable
- * representation of the object, beginning
- * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
- * with <code>}</code>&nbsp;<small>(right brace)</small>.
+ * representation of the object, beginning
+ * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+ * with <code>}</code>&nbsp;<small>(right brace)</small>.
*/
public String toString() {
try {
@@ -1395,12 +1422,13 @@ public class LOGJSONObject {
* Make a prettyprinted JSON text of this JSONObject.
* <p>
* Warning: This method assumes that the data structure is acyclical.
+ *
* @param indentFactor The number of spaces to add to each level of
- * indentation.
+ * indentation.
* @return a printable, displayable, portable, transmittable
- * representation of the object, beginning
- * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
- * with <code>}</code>&nbsp;<small>(right brace)</small>.
+ * representation of the object, beginning
+ * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+ * with <code>}</code>&nbsp;<small>(right brace)</small>.
* @throws JSONException If the object contains an invalid number.
*/
public String toString(int indentFactor) throws JSONException {
@@ -1424,27 +1452,28 @@ public class LOGJSONObject {
*
* <p>
* Warning: This method assumes that the data structure is acyclical.
+ *
* @param value The value to be serialized.
* @return a printable, displayable, transmittable
- * representation of the object, beginning
- * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
- * with <code>}</code>&nbsp;<small>(right brace)</small>.
+ * representation of the object, beginning
+ * with <code>{</code>&nbsp;<small>(left brace)</small> and ending
+ * with <code>}</code>&nbsp;<small>(right brace)</small>.
* @throws JSONException If the value is or contains an invalid number.
*/
@SuppressWarnings("unchecked")
- public static String valueToString(Object value) throws JSONException {
+ public static String valueToString(Object value) throws JSONException {
if (value == null || value.equals(null)) {
return "null";
}
if (value instanceof JSONString) {
Object object;
try {
- object = ((JSONString)value).toJSONString();
+ object = ((JSONString) value).toJSONString();
} catch (Exception e) {
throw new JSONException(e);
}
if (object instanceof String) {
- return (String)object;
+ return (String) object;
}
throw new JSONException("Bad value from toJSONString: " + object);
}
@@ -1456,10 +1485,10 @@ public class LOGJSONObject {
return value.toString();
}
if (value instanceof Map) {
- return new LOGJSONObject((Map<String, Object>)value).toString();
+ return new LOGJSONObject((Map<String, Object>) value).toString();
}
if (value instanceof Collection) {
- return new JSONArray((Collection<Object>)value).toString();
+ return new JSONArray((Collection<Object>) value).toString();
}
if (value.getClass().isArray()) {
return new JSONArray(value).toString();
@@ -1467,78 +1496,78 @@ public class LOGJSONObject {
return quote(value.toString());
}
- /**
- * Wrap an object, if necessary. If the object is null, return the NULL
- * object. If it is an array or collection, wrap it in a JSONArray. If
- * it is a map, wrap it in a JSONObject. If it is a standard property
- * (Double, String, et al) then it is already wrapped. Otherwise, if it
- * comes from one of the java packages, turn it into a string. And if
- * it doesn't, try to wrap it in a JSONObject. If the wrapping fails,
- * then null is returned.
- *
- * @param object The object to wrap
- * @return The wrapped value
- */
- @SuppressWarnings("unchecked")
- public static Object wrap(Object object) {
- try {
- if (object == null) {
- return NULL;
- }
- if (object instanceof LOGJSONObject || object instanceof JSONArray ||
- NULL.equals(object) || object instanceof JSONString ||
- object instanceof Byte || object instanceof Character ||
- object instanceof Short || object instanceof Integer ||
- object instanceof Long || object instanceof Boolean ||
- object instanceof Float || object instanceof Double ||
- object instanceof String) {
- return object;
- }
-
- if (object instanceof Collection) {
- return new JSONArray((Collection<Object>)object);
- }
- if (object.getClass().isArray()) {
- return new JSONArray(object);
- }
- if (object instanceof Map) {
- return new LOGJSONObject((Map<String, Object>)object);
- }
- Package objectPackage = object.getClass().getPackage();
- String objectPackageName = objectPackage != null
- ? objectPackage.getName()
- : "";
- if (
- objectPackageName.startsWith("java.") ||
- objectPackageName.startsWith("javax.") ||
- object.getClass().getClassLoader() == null
- ) {
- return object.toString();
- }
- return new LOGJSONObject(object);
- } catch(Exception exception) {
- return null;
- }
- }
-
-
- /**
- * Write the contents of the JSONObject as JSON text to a writer.
- * For compactness, no whitespace is added.
- * <p>
- * Warning: This method assumes that the data structure is acyclical.
- *
- * @return The writer.
- * @throws JSONException
- */
- public Writer write(Writer writer) throws JSONException {
+ /**
+ * Wrap an object, if necessary. If the object is null, return the NULL
+ * object. If it is an array or collection, wrap it in a JSONArray. If
+ * it is a map, wrap it in a JSONObject. If it is a standard property
+ * (Double, String, et al) then it is already wrapped. Otherwise, if it
+ * comes from one of the java packages, turn it into a string. And if
+ * it doesn't, try to wrap it in a JSONObject. If the wrapping fails,
+ * then null is returned.
+ *
+ * @param object The object to wrap
+ * @return The wrapped value
+ */
+ @SuppressWarnings("unchecked")
+ public static Object wrap(Object object) {
+ try {
+ if (object == null) {
+ return NULL;
+ }
+ if (object instanceof LOGJSONObject || object instanceof JSONArray ||
+ NULL.equals(object) || object instanceof JSONString ||
+ object instanceof Byte || object instanceof Character ||
+ object instanceof Short || object instanceof Integer ||
+ object instanceof Long || object instanceof Boolean ||
+ object instanceof Float || object instanceof Double ||
+ object instanceof String) {
+ return object;
+ }
+
+ if (object instanceof Collection) {
+ return new JSONArray((Collection<Object>) object);
+ }
+ if (object.getClass().isArray()) {
+ return new JSONArray(object);
+ }
+ if (object instanceof Map) {
+ return new LOGJSONObject((Map<String, Object>) object);
+ }
+ Package objectPackage = object.getClass().getPackage();
+ String objectPackageName = objectPackage != null
+ ? objectPackage.getName()
+ : "";
+ if (
+ objectPackageName.startsWith("java.") ||
+ objectPackageName.startsWith("javax.") ||
+ object.getClass().getClassLoader() == null
+ ) {
+ return object.toString();
+ }
+ return new LOGJSONObject(object);
+ } catch (Exception exception) {
+ return null;
+ }
+ }
+
+
+ /**
+ * Write the contents of the JSONObject as JSON text to a writer.
+ * For compactness, no whitespace is added.
+ * <p>
+ * Warning: This method assumes that the data structure is acyclical.
+ *
+ * @return The writer.
+ * @throws JSONException
+ */
+ public Writer write(Writer writer) throws JSONException {
return this.write(writer, 0, 0);
}
@SuppressWarnings("unchecked")
- static final Writer writeValue(Writer writer, Object value,
- int indentFactor, int indent) throws JSONException, IOException {
+ static final Writer writeValue(Writer writer, Object value,
+ int indentFactor, int indent) throws JSONException, IOException {
if (value == null || value.equals(null)) {
writer.write("null");
} else if (value instanceof LOGJSONObject) {
@@ -1631,5 +1660,5 @@ public class LOGJSONObject {
} catch (IOException exception) {
throw new JSONException(exception);
}
- }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LogfileLoader.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LogfileLoader.java
index 45b87883..ff7893d5 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LogfileLoader.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/LogfileLoader.java
@@ -7,9 +7,9 @@
* * 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.
@@ -70,414 +70,436 @@ import org.onap.dmaap.datarouter.provisioning.beans.PublishRecord;
* @version $Id: LogfileLoader.java,v 1.22 2014/03/12 19:45:41 eby Exp $
*/
public class LogfileLoader extends Thread {
- /** Default number of log records to keep when pruning. Keep 10M by default. */
- public static final long DEFAULT_LOG_RETENTION = 10000000L;
- /** NOT USED: Percentage of free space required before old records are removed. */
- public static final int REQUIRED_FREE_PCT = 20;
+ /**
+ * Default number of log records to keep when pruning. Keep 10M by default.
+ */
+ public static final long DEFAULT_LOG_RETENTION = 10000000L;
+ /**
+ * NOT USED: Percentage of free space required before old records are removed.
+ */
+ public static final int REQUIRED_FREE_PCT = 20;
+
+ /**
+ * This is a singleton -- there is only one LogfileLoader object in the server
+ */
+ private static LogfileLoader p;
+
+ /**
+ * Get the singleton LogfileLoader object, and start it if it is not running.
+ *
+ * @return the LogfileLoader
+ */
+ public static synchronized LogfileLoader getLoader() {
+ if (p == null)
+ p = new LogfileLoader();
+ if (!p.isAlive())
+ p.start();
+ return p;
+ }
+
+ /**
+ * The PreparedStatement which is loaded by a <i>Loadable</i>.
+ */
+ public static final String INSERT_SQL = "insert into LOG_RECORDS values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ /**
+ * Each server can assign this many IDs
+ */
+ private static final long SET_SIZE = (1L << 56);
+
+ private final Logger logger;
+ private final DB db;
+ private final String spooldir;
+ private final long set_start;
+ private final long set_end;
+ private RLEBitSet seq_set;
+ private long nextid;
+ private boolean idle;
+
+ private LogfileLoader() {
+ this.logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ this.db = new DB();
+ this.spooldir = db.getProperties().getProperty("org.onap.dmaap.datarouter.provserver.spooldir");
+ this.set_start = getIdRange();
+ this.set_end = set_start + SET_SIZE - 1;
+ this.seq_set = new RLEBitSet();
+ this.nextid = 0;
+ this.idle = false;
+
+ // This is a potentially lengthy operation, so has been moved to run()
+ //initializeNextid();
+ this.setDaemon(true);
+ this.setName("LogfileLoader");
+ }
+
+ private long getIdRange() {
+ long n;
+ if (BaseServlet.isInitialActivePOD())
+ n = 0;
+ else if (BaseServlet.isInitialStandbyPOD())
+ n = SET_SIZE;
+ else
+ n = SET_SIZE * 2;
+ String r = String.format("[%X .. %X]", n, n + SET_SIZE - 1);
+ logger.debug("This server shall assign RECORD_IDs in the range " + r);
+ return n;
+ }
+
+ /**
+ * Return the bit set representing the record ID's that are loaded in this database.
+ *
+ * @return the bit set
+ */
+ public RLEBitSet getBitSet() {
+ return seq_set;
+ }
- /** This is a singleton -- there is only one LogfileLoader object in the server */
- private static LogfileLoader p;
+ /**
+ * True if the LogfileLoader is currently waiting for work.
+ *
+ * @return true if idle
+ */
+ public boolean isIdle() {
+ return idle;
+ }
- /**
- * Get the singleton LogfileLoader object, and start it if it is not running.
- * @return the LogfileLoader
- */
- public static synchronized LogfileLoader getLoader() {
- if (p == null)
- p = new LogfileLoader();
- if (!p.isAlive())
- p.start();
- return p;
- }
+ /**
+ * Run continuously to look for new logfiles in the spool directory and import them into the DB.
+ * The spool is checked once per second. If free space on the MariaDB filesystem falls below
+ * REQUIRED_FREE_PCT (normally 20%) then the oldest logfile entries are removed and the LOG_RECORDS
+ * table is compacted until free space rises above the threshold.
+ */
+ @Override
+ public void run() {
+ initializeNextid(); // moved from the constructor
+ while (true) {
+ try {
+ File dirfile = new File(spooldir);
+ while (true) {
+ // process IN files
+ File[] infiles = dirfile.listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.startsWith("IN.");
+ }
+ });
- /** The PreparedStatement which is loaded by a <i>Loadable</i>. */
- public static final String INSERT_SQL = "insert into LOG_RECORDS values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
- /** Each server can assign this many IDs */
- private static final long SET_SIZE = (1L << 56);
+ if (infiles.length == 0) {
+ idle = true;
+ try {
+ Thread.sleep(1000L);
+ } catch (InterruptedException e) {
+ }
+ idle = false;
+ } else {
+ // Remove old rows
+ if (pruneRecords()) {
+ // Removed at least some entries, recompute the bit map
+ initializeNextid();
+ }
- private final Logger logger;
- private final DB db;
- private final String spooldir;
- private final long set_start;
- private final long set_end;
- private RLEBitSet seq_set;
- private long nextid;
- private boolean idle;
+ // Process incoming logfiles
+ for (File f : infiles) {
+ if (logger.isDebugEnabled())
+ logger.debug("PROV8001 Starting " + f + " ...");
+ long time = System.currentTimeMillis();
+ int[] n = process(f);
+ time = System.currentTimeMillis() - time;
+ logger.info(String
+ .format("PROV8000 Processed %s in %d ms; %d of %d records.",
+ f.toString(), time, n[0], n[1]));
+ f.delete();
+ }
+ }
+ }
+ } catch (Exception e) {
+ logger.warn("PROV0020: Caught exception in LogfileLoader: " + e);
+ e.printStackTrace();
+ }
+ }
+ }
- private LogfileLoader() {
- this.logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- this.db = new DB();
- this.spooldir = db.getProperties().getProperty("org.onap.dmaap.datarouter.provserver.spooldir");
- this.set_start = getIdRange();
- this.set_end = set_start + SET_SIZE - 1;
- this.seq_set = new RLEBitSet();
- this.nextid = 0;
- this.idle = false;
+ private boolean pruneRecords() {
+ boolean did1 = false;
+ long count = countRecords();
+ long threshold = DEFAULT_LOG_RETENTION;
+ Parameters param = Parameters.getParameter(Parameters.PROV_LOG_RETENTION);
+ if (param != null) {
+ try {
+ long n = Long.parseLong(param.getValue());
+ // This check is to prevent inadvertent errors from wiping the table out
+ if (n > 1000000L)
+ threshold = n;
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ }
+ logger.debug("Pruning LOG_RECORD table: records in DB=" + count + ", threshold=" + threshold);
+ if (count > threshold) {
+ count -= threshold; // we need to remove this many records;
+ Map<Long, Long> hist = getHistogram(); // histogram of records per day
+ // Determine the cutoff point to remove the needed number of records
+ long sum = 0;
+ long cutoff = 0;
+ for (Long day : new TreeSet<Long>(hist.keySet())) {
+ sum += hist.get(day);
+ cutoff = day;
+ if (sum >= count)
+ break;
+ }
+ cutoff++;
+ cutoff *= 86400000L; // convert day to ms
+ logger.debug(" Pruning records older than=" + (cutoff / 86400000L) + " (" + new Date(cutoff) + ")");
- // This is a potentially lengthy operation, so has been moved to run()
- //initializeNextid();
- this.setDaemon(true);
- this.setName("LogfileLoader");
- }
+ Connection conn = null;
+ try {
+ // Limit to a million at a time to avoid typing up the DB for too long.
+ conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement("DELETE from LOG_RECORDS where EVENT_TIME < ? limit 1000000");
+ ps.setLong(1, cutoff);
+ while (count > 0) {
+ if (!ps.execute()) {
+ int dcount = ps.getUpdateCount();
+ count -= dcount;
+ logger.debug(" " + dcount + " rows deleted.");
+ did1 |= (dcount != 0);
+ if (dcount == 0)
+ count = 0; // prevent inf. loops
+ } else {
+ count = 0; // shouldn't happen!
+ }
+ }
+ ps.close();
+ Statement stmt = conn.createStatement();
+ stmt.execute("OPTIMIZE TABLE LOG_RECORDS");
+ stmt.close();
+ } catch (SQLException e) {
+ System.err.println(e);
+ e.printStackTrace();
+ } finally {
+ db.release(conn);
+ }
+ }
+ return did1;
+ }
- private long getIdRange() {
- long n;
- if (BaseServlet.isInitialActivePOD())
- n = 0;
- else if (BaseServlet.isInitialStandbyPOD())
- n = SET_SIZE;
- else
- n = SET_SIZE * 2;
- String r = String.format("[%X .. %X]", n, n+SET_SIZE-1);
- logger.debug("This server shall assign RECORD_IDs in the range "+r);
- return n;
- }
- /**
- * Return the bit set representing the record ID's that are loaded in this database.
- * @return the bit set
- */
- public RLEBitSet getBitSet() {
- return seq_set;
- }
- /**
- * True if the LogfileLoader is currently waiting for work.
- * @return true if idle
- */
- public boolean isIdle() {
- return idle;
- }
- /**
- * Run continuously to look for new logfiles in the spool directory and import them into the DB.
- * The spool is checked once per second. If free space on the MariaDB filesystem falls below
- * REQUIRED_FREE_PCT (normally 20%) then the oldest logfile entries are removed and the LOG_RECORDS
- * table is compacted until free space rises above the threshold.
- */
- @Override
- public void run() {
- initializeNextid(); // moved from the constructor
- while (true) {
- try {
- File dirfile = new File(spooldir);
- while (true) {
- // process IN files
- File[] infiles = dirfile.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name.startsWith("IN.");
- }
- });
+ private long countRecords() {
+ long count = 0;
+ Connection conn = null;
+ try {
+ conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT COUNT(*) as COUNT from LOG_RECORDS");
+ if (rs.next()) {
+ count = rs.getLong("COUNT");
+ }
+ rs.close();
+ stmt.close();
+ } catch (SQLException e) {
+ System.err.println(e);
+ e.printStackTrace();
+ } finally {
+ db.release(conn);
+ }
+ return count;
+ }
- if (infiles.length == 0) {
- idle = true;
- try {
- Thread.sleep(1000L);
- } catch (InterruptedException e) {
- }
- idle = false;
- } else {
- // Remove old rows
- if (pruneRecords()) {
- // Removed at least some entries, recompute the bit map
- initializeNextid();
- }
+ private Map<Long, Long> getHistogram() {
+ Map<Long, Long> map = new HashMap<Long, Long>();
+ Connection conn = null;
+ try {
+ logger.debug(" LOG_RECORD table histogram...");
+ conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT FLOOR(EVENT_TIME/86400000) AS DAY, COUNT(*) AS COUNT FROM LOG_RECORDS GROUP BY DAY");
+ while (rs.next()) {
+ long day = rs.getLong("DAY");
+ long cnt = rs.getLong("COUNT");
+ map.put(day, cnt);
+ logger.debug(" " + day + " " + cnt);
+ }
+ rs.close();
+ stmt.close();
+ } catch (SQLException e) {
+ System.err.println(e);
+ e.printStackTrace();
+ } finally {
+ db.release(conn);
+ }
+ return map;
+ }
- // Process incoming logfiles
- for (File f : infiles) {
- if (logger.isDebugEnabled())
- logger.debug("PROV8001 Starting " + f + " ...");
- long time = System.currentTimeMillis();
- int[] n = process(f);
- time = System.currentTimeMillis() - time;
- logger.info(String
- .format("PROV8000 Processed %s in %d ms; %d of %d records.",
- f.toString(), time, n[0], n[1]));
- f.delete();
- }
- }
- }
- } catch (Exception e) {
- logger.warn("PROV0020: Caught exception in LogfileLoader: " + e);
- e.printStackTrace();
- }
- }
- }
- private boolean pruneRecords() {
- boolean did1 = false;
- long count = countRecords();
- long threshold = DEFAULT_LOG_RETENTION;
- Parameters param = Parameters.getParameter(Parameters.PROV_LOG_RETENTION);
- if (param != null) {
- try {
- long n = Long.parseLong(param.getValue());
- // This check is to prevent inadvertent errors from wiping the table out
- if (n > 1000000L)
- threshold = n;
- } catch (NumberFormatException e) {
- // ignore
- }
- }
- logger.debug("Pruning LOG_RECORD table: records in DB="+count+", threshold="+threshold);
- if (count > threshold) {
- count -= threshold; // we need to remove this many records;
- Map<Long,Long> hist = getHistogram(); // histogram of records per day
- // Determine the cutoff point to remove the needed number of records
- long sum = 0;
- long cutoff = 0;
- for (Long day : new TreeSet<Long>(hist.keySet())) {
- sum += hist.get(day);
- cutoff = day;
- if (sum >= count)
- break;
- }
- cutoff++;
- cutoff *= 86400000L; // convert day to ms
- logger.debug(" Pruning records older than="+(cutoff/86400000L)+" ("+new Date(cutoff)+")");
+ private void initializeNextid() {
+ Connection conn = null;
+ try {
+ conn = db.getConnection();
+ Statement stmt = conn.createStatement();
+ // Build a bitset of all records in the LOG_RECORDS table
+ // We need to run this SELECT in stages, because otherwise we run out of memory!
+ RLEBitSet nbs = new RLEBitSet();
+ final long stepsize = 6000000L;
+ boolean go_again = true;
+ for (long i = 0; go_again; i += stepsize) {
+ String sql = String.format("select RECORD_ID from LOG_RECORDS LIMIT %d,%d", i, stepsize);
+ ResultSet rs = stmt.executeQuery(sql);
+ go_again = false;
+ while (rs.next()) {
+ long n = rs.getLong("RECORD_ID");
+ nbs.set(n);
+ go_again = true;
+ }
+ rs.close();
+ }
+ stmt.close();
+ seq_set = nbs;
- Connection conn = null;
- try {
- // Limit to a million at a time to avoid typing up the DB for too long.
- conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement("DELETE from LOG_RECORDS where EVENT_TIME < ? limit 1000000");
- ps.setLong(1, cutoff);
- while (count > 0) {
- if (!ps.execute()) {
- int dcount = ps.getUpdateCount();
- count -= dcount;
- logger.debug(" "+dcount+" rows deleted.");
- did1 |= (dcount!=0);
- if (dcount == 0)
- count = 0; // prevent inf. loops
- } else {
- count = 0; // shouldn't happen!
- }
- }
- ps.close();
- Statement stmt = conn.createStatement();
- stmt.execute("OPTIMIZE TABLE LOG_RECORDS");
- stmt.close();
- } catch (SQLException e) {
- System.err.println(e);
- e.printStackTrace();
- } finally {
- db.release(conn);
- }
- }
- return did1;
- }
- private long countRecords() {
- long count = 0;
- Connection conn = null;
- try {
- conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT COUNT(*) as COUNT from LOG_RECORDS");
- if (rs.next()) {
- count = rs.getLong("COUNT");
- }
- rs.close();
- stmt.close();
- } catch (SQLException e) {
- System.err.println(e);
- e.printStackTrace();
- } finally {
- db.release(conn);
- }
- return count;
- }
- private Map<Long,Long> getHistogram() {
- Map<Long,Long> map = new HashMap<Long,Long>();
- Connection conn = null;
- try {
- logger.debug(" LOG_RECORD table histogram...");
- conn = db.getConnection();
- Statement stmt = conn.createStatement();
- ResultSet rs = stmt.executeQuery("SELECT FLOOR(EVENT_TIME/86400000) AS DAY, COUNT(*) AS COUNT FROM LOG_RECORDS GROUP BY DAY");
- while (rs.next()) {
- long day = rs.getLong("DAY");
- long cnt = rs.getLong("COUNT");
- map.put(day, cnt);
- logger.debug(" "+day + " "+cnt);
- }
- rs.close();
- stmt.close();
- } catch (SQLException e) {
- System.err.println(e);
- e.printStackTrace();
- } finally {
- db.release(conn);
- }
- return map;
- }
- private void initializeNextid() {
- Connection conn = null;
- try {
- conn = db.getConnection();
- Statement stmt = conn.createStatement();
- // Build a bitset of all records in the LOG_RECORDS table
- // We need to run this SELECT in stages, because otherwise we run out of memory!
- RLEBitSet nbs = new RLEBitSet();
- final long stepsize = 6000000L;
- boolean go_again = true;
- for (long i = 0; go_again; i += stepsize) {
- String sql = String.format("select RECORD_ID from LOG_RECORDS LIMIT %d,%d", i, stepsize);
- ResultSet rs = stmt.executeQuery(sql);
- go_again = false;
- while (rs.next()) {
- long n = rs.getLong("RECORD_ID");
- nbs.set(n);
- go_again = true;
- }
- rs.close();
- }
- stmt.close();
- seq_set = nbs;
+ // Compare with the range for this server
+ // Determine the next ID for this set of record IDs
+ RLEBitSet tbs = (RLEBitSet) nbs.clone();
+ RLEBitSet idset = new RLEBitSet();
+ idset.set(set_start, set_start + SET_SIZE);
+ tbs.and(idset);
+ long t = tbs.length();
+ nextid = (t == 0) ? set_start : (t - 1);
+ if (nextid >= set_start + SET_SIZE) {
+ // Handle wraparound, when the IDs reach the end of our "range"
+ Long[] last = null;
+ Iterator<Long[]> li = tbs.getRangeIterator();
+ while (li.hasNext()) {
+ last = li.next();
+ }
+ if (last != null) {
+ tbs.clear(last[0], last[1] + 1);
+ t = tbs.length();
+ nextid = (t == 0) ? set_start : (t - 1);
+ }
+ }
+ logger.debug(String.format("initializeNextid, next ID is %d (%x)", nextid, nextid));
+ } catch (SQLException e) {
+ System.err.println(e);
+ e.printStackTrace();
+ } finally {
+ db.release(conn);
+ }
+ }
- // Compare with the range for this server
- // Determine the next ID for this set of record IDs
- RLEBitSet tbs = (RLEBitSet) nbs.clone();
- RLEBitSet idset = new RLEBitSet();
- idset.set(set_start, set_start+SET_SIZE);
- tbs.and(idset);
- long t = tbs.length();
- nextid = (t == 0) ? set_start : (t - 1);
- if (nextid >= set_start+SET_SIZE) {
- // Handle wraparound, when the IDs reach the end of our "range"
- Long[] last = null;
- Iterator<Long[]> li = tbs.getRangeIterator();
- while (li.hasNext()) {
- last = li.next();
- }
- if (last != null) {
- tbs.clear(last[0], last[1]+1);
- t = tbs.length();
- nextid = (t == 0) ? set_start : (t - 1);
- }
- }
- logger.debug(String.format("initializeNextid, next ID is %d (%x)", nextid, nextid));
- } catch (SQLException e) {
- System.err.println(e);
- e.printStackTrace();
- } finally {
- db.release(conn);
- }
- }
+ @SuppressWarnings("resource")
+ private int[] process(File f) {
+ int ok = 0, total = 0;
+ try {
+ Connection conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement(INSERT_SQL);
+ Reader r = f.getPath().endsWith(".gz")
+ ? new InputStreamReader(new GZIPInputStream(new FileInputStream(f)))
+ : new FileReader(f);
+ LineNumberReader in = new LineNumberReader(r);
+ String line;
+ while ((line = in.readLine()) != null) {
+ try {
+ for (Loadable rec : buildRecords(line)) {
+ rec.load(ps);
+ if (rec instanceof LogRecord) {
+ LogRecord lr = ((LogRecord) rec);
+ if (!seq_set.get(lr.getRecordId())) {
+ ps.executeUpdate();
+ seq_set.set(lr.getRecordId());
+ } else
+ logger.debug("Duplicate record ignored: " + lr.getRecordId());
+ } else {
+ if (++nextid > set_end)
+ nextid = set_start;
+ ps.setLong(18, nextid);
+ ps.executeUpdate();
+ seq_set.set(nextid);
+ }
+ ps.clearParameters();
+ ok++;
+ }
+ } catch (SQLException e) {
+ logger.warn("PROV8003 Invalid value in record: " + line);
+ logger.debug(e);
+ e.printStackTrace();
+ } catch (NumberFormatException e) {
+ logger.warn("PROV8004 Invalid number in record: " + line);
+ logger.debug(e);
+ e.printStackTrace();
+ } catch (ParseException e) {
+ logger.warn("PROV8005 Invalid date in record: " + line);
+ logger.debug(e);
+ e.printStackTrace();
+ } catch (Exception e) {
+ logger.warn("PROV8006 Invalid pattern in record: " + line);
+ logger.debug(e);
+ e.printStackTrace();
+ }
+ total++;
+ }
+ in.close();
+ ps.close();
+ db.release(conn);
+ conn = null;
+ } catch (FileNotFoundException e) {
+ logger.warn("PROV8007 Exception reading " + f + ": " + e);
+ } catch (IOException e) {
+ logger.warn("PROV8007 Exception reading " + f + ": " + e);
+ } catch (SQLException e) {
+ logger.warn("PROV8007 Exception reading " + f + ": " + e);
+ }
+ return new int[]{ok, total};
+ }
- @SuppressWarnings("resource")
- private int[] process(File f) {
- int ok = 0, total = 0;
- try {
- Connection conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement(INSERT_SQL);
- Reader r = f.getPath().endsWith(".gz")
- ? new InputStreamReader(new GZIPInputStream(new FileInputStream(f)))
- : new FileReader(f);
- LineNumberReader in = new LineNumberReader(r);
- String line;
- while ((line = in.readLine()) != null) {
- try {
- for (Loadable rec : buildRecords(line)) {
- rec.load(ps);
- if (rec instanceof LogRecord) {
- LogRecord lr = ((LogRecord)rec);
- if (!seq_set.get(lr.getRecordId())) {
- ps.executeUpdate();
- seq_set.set(lr.getRecordId());
- } else
- logger.debug("Duplicate record ignored: "+lr.getRecordId());
- } else {
- if (++nextid > set_end)
- nextid = set_start;
- ps.setLong(18, nextid);
- ps.executeUpdate();
- seq_set.set(nextid);
- }
- ps.clearParameters();
- ok++;
- }
- } catch (SQLException e) {
- logger.warn("PROV8003 Invalid value in record: "+line);
- logger.debug(e);
- e.printStackTrace();
- } catch (NumberFormatException e) {
- logger.warn("PROV8004 Invalid number in record: "+line);
- logger.debug(e);
- e.printStackTrace();
- } catch (ParseException e) {
- logger.warn("PROV8005 Invalid date in record: "+line);
- logger.debug(e);
- e.printStackTrace();
- } catch (Exception e) {
- logger.warn("PROV8006 Invalid pattern in record: "+line);
- logger.debug(e);
- e.printStackTrace();
- }
- total++;
- }
- in.close();
- ps.close();
- db.release(conn);
- conn = null;
- } catch (FileNotFoundException e) {
- logger.warn("PROV8007 Exception reading "+f+": "+e);
- } catch (IOException e) {
- logger.warn("PROV8007 Exception reading "+f+": "+e);
- } catch (SQLException e) {
- logger.warn("PROV8007 Exception reading "+f+": "+e);
- }
- return new int[] { ok, total };
- }
- private Loadable[] buildRecords(String line) throws ParseException {
- String[] pp = line.split("\\|");
- if (pp != null && pp.length >= 7) {
- String rtype = pp[1].toUpperCase();
- if (rtype.equals("PUB") && pp.length == 11) {
- // Fields are: date|PUB|pubid|feedid|requrl|method|ctype|clen|srcip|user|status
- return new Loadable[] { new PublishRecord(pp) };
- }
- if (rtype.equals("DEL") && pp.length == 12) {
- // Fields are: date|DEL|pubid|feedid|subid|requrl|method|ctype|clen|user|status|xpubid
- String[] subs = pp[4].split("\\s+");
- if (subs != null) {
- Loadable[] rv = new Loadable[subs.length];
- for (int i = 0; i < subs.length; i++) {
- // create a new record for each individual sub
- pp[4] = subs[i];
- rv[i] = new DeliveryRecord(pp);
- }
- return rv;
- }
- }
- if (rtype.equals("EXP") && pp.length == 11) {
- // Fields are: date|EXP|pubid|feedid|subid|requrl|method|ctype|clen|reason|attempts
- ExpiryRecord e = new ExpiryRecord(pp);
- if (e.getReason().equals("other"))
- logger.info("Invalid reason '"+pp[9]+"' changed to 'other' for record: "+e.getPublishId());
- return new Loadable[] { e };
- }
- if (rtype.equals("PBF") && pp.length == 12) {
- // Fields are: date|PBF|pubid|feedid|requrl|method|ctype|clen-expected|clen-received|srcip|user|error
- return new Loadable[] { new PubFailRecord(pp) };
- }
- if (rtype.equals("DLX") && pp.length == 7) {
- // Fields are: date|DLX|pubid|feedid|subid|clen-tosend|clen-sent
- return new Loadable[] { new DeliveryExtraRecord(pp) };
- }
- if (rtype.equals("LOG") && (pp.length == 19 || pp.length == 20)) {
- // Fields are: date|LOG|pubid|feedid|requrl|method|ctype|clen|type|feedFileid|remoteAddr|user|status|subid|fileid|result|attempts|reason|record_id
- return new Loadable[] { new LogRecord(pp) };
- }
- }
- logger.warn("PROV8002 bad record: "+line);
- return new Loadable[0];
- }
+ private Loadable[] buildRecords(String line) throws ParseException {
+ String[] pp = line.split("\\|");
+ if (pp != null && pp.length >= 7) {
+ String rtype = pp[1].toUpperCase();
+ if (rtype.equals("PUB") && pp.length == 11) {
+ // Fields are: date|PUB|pubid|feedid|requrl|method|ctype|clen|srcip|user|status
+ return new Loadable[]{new PublishRecord(pp)};
+ }
+ if (rtype.equals("DEL") && pp.length == 12) {
+ // Fields are: date|DEL|pubid|feedid|subid|requrl|method|ctype|clen|user|status|xpubid
+ String[] subs = pp[4].split("\\s+");
+ if (subs != null) {
+ Loadable[] rv = new Loadable[subs.length];
+ for (int i = 0; i < subs.length; i++) {
+ // create a new record for each individual sub
+ pp[4] = subs[i];
+ rv[i] = new DeliveryRecord(pp);
+ }
+ return rv;
+ }
+ }
+ if (rtype.equals("EXP") && pp.length == 11) {
+ // Fields are: date|EXP|pubid|feedid|subid|requrl|method|ctype|clen|reason|attempts
+ ExpiryRecord e = new ExpiryRecord(pp);
+ if (e.getReason().equals("other"))
+ logger.info("Invalid reason '" + pp[9] + "' changed to 'other' for record: " + e.getPublishId());
+ return new Loadable[]{e};
+ }
+ if (rtype.equals("PBF") && pp.length == 12) {
+ // Fields are: date|PBF|pubid|feedid|requrl|method|ctype|clen-expected|clen-received|srcip|user|error
+ return new Loadable[]{new PubFailRecord(pp)};
+ }
+ if (rtype.equals("DLX") && pp.length == 7) {
+ // Fields are: date|DLX|pubid|feedid|subid|clen-tosend|clen-sent
+ return new Loadable[]{new DeliveryExtraRecord(pp)};
+ }
+ if (rtype.equals("LOG") && (pp.length == 19 || pp.length == 20)) {
+ // Fields are: date|LOG|pubid|feedid|requrl|method|ctype|clen|type|feedFileid|remoteAddr|user|status|subid|fileid|result|attempts|reason|record_id
+ return new Loadable[]{new LogRecord(pp)};
+ }
+ }
+ logger.warn("PROV8002 bad record: " + line);
+ return new Loadable[0];
+ }
- /**
- * The LogfileLoader can be run stand-alone by invoking the main() method of this class.
- * @param a ignored
- * @throws InterruptedException
- */
- public static void main(String[] a) throws InterruptedException {
- LogfileLoader.getLoader();
- Thread.sleep(200000L);
- }
+ /**
+ * The LogfileLoader can be run stand-alone by invoking the main() method of this class.
+ *
+ * @param a ignored
+ * @throws InterruptedException
+ */
+ public static void main(String[] a) throws InterruptedException {
+ LogfileLoader.getLoader();
+ Thread.sleep(200000L);
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/PurgeLogDirTask.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/PurgeLogDirTask.java
index 8cfce5cf..7b0e0e61 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/PurgeLogDirTask.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/PurgeLogDirTask.java
@@ -7,9 +7,9 @@
* * 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.
@@ -31,40 +31,42 @@ import java.util.TimerTask;
/**
* This class provides a {@link TimerTask} that purges old logfiles
* (older than the number of days specified by the org.onap.dmaap.datarouter.provserver.logretention property).
+ *
* @author Robert Eby
* @version $Id: PurgeLogDirTask.java,v 1.2 2013/07/05 13:48:05 eby Exp $
*/
public class PurgeLogDirTask extends TimerTask {
- private static final long ONEDAY = 86400000L;
+ private static final long ONEDAY = 86400000L;
+
+ private final String logdir;
+ private final long interval;
- private final String logdir;
- private final long interval;
+ public PurgeLogDirTask() {
+ Properties p = (new DB()).getProperties();
+ logdir = p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
+ String s = p.getProperty("org.onap.dmaap.datarouter.provserver.logretention", "30");
+ long n = 30;
+ try {
+ n = Long.parseLong(s);
+ } catch (NumberFormatException e) {
+ // ignore
+ }
+ interval = n * ONEDAY;
+ }
- public PurgeLogDirTask() {
- Properties p = (new DB()).getProperties();
- logdir = p.getProperty("org.onap.dmaap.datarouter.provserver.accesslog.dir");
- String s = p.getProperty("org.onap.dmaap.datarouter.provserver.logretention", "30");
- long n = 30;
- try {
- n = Long.parseLong(s);
- } catch (NumberFormatException e) {
- // ignore
- }
- interval = n * ONEDAY;
- }
- @Override
- public void run() {
- try {
- File dir = new File(logdir);
- if (dir.exists()) {
- long exptime = System.currentTimeMillis() - interval;
- for (File logfile : dir.listFiles()) {
- if (logfile.lastModified() < exptime)
- logfile.delete();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
+ @Override
+ public void run() {
+ try {
+ File dir = new File(logdir);
+ if (dir.exists()) {
+ long exptime = System.currentTimeMillis() - interval;
+ for (File logfile : dir.listFiles()) {
+ if (logfile.lastModified() < exptime)
+ logfile.delete();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/RLEBitSet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/RLEBitSet.java
index a9df2feb..bc1919f7 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/RLEBitSet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/RLEBitSet.java
@@ -7,9 +7,9 @@
* * 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.
@@ -40,379 +40,428 @@ import java.util.TreeSet;
* @version $Id$
*/
public class RLEBitSet {
- /**
- * Used to represent a continues set of <i>nbits</i> 1 bits starting at <i>start</i>.
- */
- private class RLE implements Comparable<RLE> {
- private final long start;
- private long nbits;
- public RLE(long from, long nbits) {
- this.start = from;
- this.nbits = (nbits > 0) ? nbits : 0;
- }
- /**
- * Returns the index of the first set bit in this RLE.
- * @return the index
- */
- public long firstBit() {
- return start;
- }
- /**
- * Returns the index of the last set bit in this RLE.
- * @return the index
- */
- public long lastBit() {
- return start+nbits-1;
- }
- public boolean intersects(RLE b2) {
- if (b2.lastBit() < this.firstBit())
- return false;
- if (b2.firstBit() > this.lastBit())
- return false;
- return true;
- }
- public boolean isSubset(RLE b2) {
- if (firstBit() < b2.firstBit())
- return false;
- if (firstBit() > b2.lastBit())
- return false;
- if (lastBit() < b2.firstBit())
- return false;
- if (lastBit() > b2.lastBit())
- return false;
- return true;
- }
- public RLE union(RLE b2) {
- RLE b1 = this;
- if (b1.firstBit() > b2.firstBit()) {
- b1 = b2;
- b2 = this;
- }
- long end = b1.lastBit();
- if (b2.lastBit() > b1.lastBit())
- end = b2.lastBit();
- return new RLE(b1.firstBit(), end-b1.firstBit()+1);
- }
- /**
- * Returns the number of bits set to {@code true} in this {@code RLE}.
- * @return the number of bits set to {@code true} in this {@code RLE}.
- */
- public int cardinality() {
- return (int) nbits;
- }
- @Override
- public int compareTo(RLE o) {
- if (this.equals(o))
- return 0;
- return (start < o.start) ? -1 : 1;
- }
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof RLE) {
- RLE b = (RLE) obj;
- return (start == b.start) && (nbits == b.nbits);
- }
- return false;
- }
- @Override
- public int hashCode() {
- return new Long(start ^ nbits).hashCode();
- }
- @Override
- public String toString() {
- return "["+firstBit()+".."+lastBit()+"]";
- }
- }
- private SortedSet<RLE> bitsets;
-
- /**
- * Creates a new bit set. All bits are initially <code>false</code>.
- */
- public RLEBitSet() {
- bitsets = new TreeSet<RLE>();
- }
- /**
- * Creates a new bit set, with bits set according to the value of <code>s</code>.
- * @param s the initialization String
- */
- public RLEBitSet(String s) {
- bitsets = new TreeSet<RLE>();
- set(s);
- }
- /**
- * Returns the "logical size" of this {@code RLEBitSet}: the index of the highest set bit
- * in the {@code RLEBitSet} plus one. Returns zero if the {@code RLEBitSet} contains no set bits.
- * @return the logical size of this {@code RLEBitSet}
- */
- public long length() {
- if (isEmpty())
- return 0;
- return bitsets.last().lastBit()+1;
- }
- /**
- * Returns the value of the bit with the specified index. The value is {@code true} if the bit
- * with the index bit is currently set in this BitSet; otherwise, the result is {@code false}.
- * @param bit the bit index
- * @return the value of the bit with the specified index
- */
- public boolean get(long bit) {
- synchronized (bitsets) {
- for (RLE bs : bitsets) {
- if (bit >= bs.firstBit() && bit <= bs.lastBit())
- return true;
- }
- }
- return false;
- }
- /**
- * Set one or more bits to true, based on the value of <code>s</code>.
- * @param s the initialization String, which consists of a comma or space separated list of
- * non-negative numbers and ranges. An individual number represents the bit index to set.
- * A range (two numbers separated by a dash) causes all bit indexes between the two numbers
- * (inclusive) to be set.
- * @exception NumberFormatException - if a number is incorrectly formatted
- * @exception IndexOutOfBoundsException - if an index is negative
- */
- public void set(String s) throws NumberFormatException {
- s = s.trim();
- if (!s.isEmpty()) {
- for (String s2 : s.split("[, \n]+")) {
- if (s2.indexOf('-') >= 0) {
- String[] pp = s2.split("-");
- long f = Long.parseLong(pp[0]);
- long t = Long.parseLong(pp[1]);
- set(f, t+1);
- } else
- set(Long.parseLong(s2));
- }
- }
- }
- /**
- * Sets the bit at the specified index to {@code true}.
- * @param bit a bit index
- */
- public void set(long bit) {
- set(bit, bit+1);
- }
- /**
- * Sets the bits from the specified {@code from} (inclusive) to the
- * specified {@code to} (exclusive) to {@code true}.
- * @param from index of the first bit to be set
- * @param to index after the last bit to be set
- * @throws IndexOutOfBoundsException if {@code from} is negative,
- * or {@code to} is negative,
- * or {@code from} is larger than {@code to}
- */
- public void set(long from, long to) {
- checkRange(from, to);
- RLE newbits = new RLE(from, to-from);
- synchronized (bitsets) {
- for (RLE bs : bitsets) {
- if (bs.intersects(newbits)) {
- if (!newbits.isSubset(bs)) {
- bitsets.remove(bs);
- bitsets.add(newbits.union(bs));
- coalesce();
- }
- return;
- }
- }
- bitsets.add(newbits);
- }
- coalesce();
- }
- /**
- * Sets all of the bits in this BitSet to {@code false}.
- */
- public void clear() {
- synchronized (bitsets) {
- bitsets.clear();
- }
- }
- /**
- * Sets the bit specified by the index to {@code false}.
- * @param bit the index of the bit to be cleared
- */
- public void clear(long bit) {
- clear(bit, bit+1);
- }
- /**
- * Sets the bits from the specified {@code from} (inclusive) to the
- * specified {@code to} (exclusive) to {@code false}.
- * @param from index of the first bit to be cleared
- * @param to index after the last bit to be cleared
- * @throws IndexOutOfBoundsException if {@code from} is negative,
- * or {@code to} is negative,
- * or {@code from} is larger than {@code to}
- */
- public void clear(long from, long to) {
- checkRange(from, to);
- RLE newbits = new RLE(from, to-from);
- List<RLE> newranges = new ArrayList<RLE>();
- synchronized (bitsets) {
- for (RLE bs : bitsets) {
- if (bs.intersects(newbits)) {
- // preserve the bits that are not being cleared
- long len = newbits.firstBit() - bs.firstBit();
- if (len > 0)
- newranges.add(new RLE(bs.firstBit(), len));
- len = bs.lastBit() - newbits.lastBit();
- if (len > 0)
- newranges.add(new RLE(newbits.lastBit()+1, len));
- bs.nbits = 0;
- }
- }
- if (!newranges.isEmpty()) {
- for (RLE bs : newranges) {
- bitsets.add(bs);
- }
- }
- }
- coalesce();
- }
- /** Combine abutting RLEBitSets, and remove 0 length RLEBitSets. */
- private void coalesce() {
- RLE last = null;
- synchronized (bitsets) {
- Iterator<RLE> iter = bitsets.iterator();
- while (iter.hasNext()) {
- RLE bs = iter.next();
- if (last != null && (last.lastBit()+1 == bs.firstBit())) {
- last.nbits += bs.nbits;
- iter.remove();
- } else if (bs.nbits == 0) {
- iter.remove();
- } else {
- last = bs;
- }
- }
- }
- }
- /**
- * Checks that fromIndex ... toIndex is a valid range of bit indices.
- */
- private static void checkRange(long from, long to) {
- if (from < 0)
- throw new IndexOutOfBoundsException("fromIndex < 0: " + from);
- if (to < 0)
- throw new IndexOutOfBoundsException("toIndex < 0: " + to);
- if (from > to)
- throw new IndexOutOfBoundsException("fromIndex: " + from + " > toIndex: " + to);
- }
- /**
- * Performs a logical <b>AND</b> of this target bit set with the argument bit set.
- * This bit set is modified so that each bit in it has the value {@code true} if and only if
- * it both initially had the value {@code true} and the corresponding bit in the bit set
- * argument also had the value {@code true}.
- * @param set a {@code RLEBitSet}
- */
- public void and(RLEBitSet set) {
- long last = 0;
- synchronized (set.bitsets) {
- for (RLE bs : set.bitsets) {
- clear(last, bs.start);
- last = bs.start + bs.nbits;
- }
- }
- clear(last, Long.MAX_VALUE);
- }
- /**
- * Clears all of the bits in this {@code RLEBitSet} whose corresponding bit is set in
- * the specified {@code RLEBitSet}.
- * @param set the {@code RLEBitSet} with which to mask this {@code RLEBitSet}
- */
- public void andNot(RLEBitSet set) {
- synchronized (set.bitsets) {
- for (RLE bs : set.bitsets) {
- clear(bs.start, bs.start + bs.nbits);
- }
- }
- }
- /**
- * Returns true if this {@code RLEBitSet} contains no bits that are set
- * to {@code true}.
- *
- * @return boolean indicating whether this {@code BitSet} is empty
- */
- public boolean isEmpty() {
- return bitsets.isEmpty();
- }
- /**
- * Returns the number of bits set to {@code true} in this {@code RLEBitSet}.
- * @return the number of bits set to {@code true} in this {@code RLEBitSet}.
- */
- public int cardinality() {
- int n = 0;
- synchronized (bitsets) {
- for (RLE bs : bitsets) {
- n += bs.cardinality();
- }
- }
- return n;
- }
- /**
- * Cloning this RLEBitSet produces a new RLEBitSet that is equal to it. The clone of the
- * bit set is another bit set that has exactly the same bits set to true as this bit set.
- * @return a clone of this bit set
- */
- public Object clone() {
- RLEBitSet rv = new RLEBitSet();
- synchronized (bitsets) {
- for (RLE bs : bitsets) {
- rv.bitsets.add(new RLE(bs.start, bs.nbits));
- }
- }
- return rv;
- }
- /**
- * Returns a string representation of this bit set, using the same notation as is required for
- * the String constructor. For every index for which this {@code RLEBitSet} contains a bit in
- * the set state, the decimal representation of that index is included in the result. Such
- * indices are listed in order from lowest to highest, separated by ",". Ranges of set bits are
- * indicated by <i>lobit</i>-<i>hibit</i>.
- * @return the String
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- String prefix = "";
- synchronized (bitsets) {
- for (RLE bs : bitsets) {
- sb.append(prefix);
- prefix = ",";
- long s = bs.firstBit();
- long e = bs.lastBit();
- sb.append(s);
- if (s != e)
- sb.append('-').append(e);
- }
- }
- return sb.toString();
- }
- /**
- * Return an Iterator which provides pairs of {@code Long}s representing the beginning and
- * ending index of a range of set bits in this {@code RLEBitSet}.
- * @return the Iterator
- */
- public Iterator<Long[]> getRangeIterator() {
- return new Iterator<Long[]>() {
- private Iterator<RLE> i = bitsets.iterator();
-
- @Override
- public boolean hasNext() {
- return i.hasNext();
- }
-
- @Override
- public Long[] next() {
- RLE bs = i.next();
- return new Long[] { bs.firstBit(), bs.lastBit() };
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException();
- }
- };
- }
+ /**
+ * Used to represent a continues set of <i>nbits</i> 1 bits starting at <i>start</i>.
+ */
+ private class RLE implements Comparable<RLE> {
+ private final long start;
+ private long nbits;
+
+ public RLE(long from, long nbits) {
+ this.start = from;
+ this.nbits = (nbits > 0) ? nbits : 0;
+ }
+
+ /**
+ * Returns the index of the first set bit in this RLE.
+ *
+ * @return the index
+ */
+ public long firstBit() {
+ return start;
+ }
+
+ /**
+ * Returns the index of the last set bit in this RLE.
+ *
+ * @return the index
+ */
+ public long lastBit() {
+ return start + nbits - 1;
+ }
+
+ public boolean intersects(RLE b2) {
+ if (b2.lastBit() < this.firstBit())
+ return false;
+ if (b2.firstBit() > this.lastBit())
+ return false;
+ return true;
+ }
+
+ public boolean isSubset(RLE b2) {
+ if (firstBit() < b2.firstBit())
+ return false;
+ if (firstBit() > b2.lastBit())
+ return false;
+ if (lastBit() < b2.firstBit())
+ return false;
+ if (lastBit() > b2.lastBit())
+ return false;
+ return true;
+ }
+
+ public RLE union(RLE b2) {
+ RLE b1 = this;
+ if (b1.firstBit() > b2.firstBit()) {
+ b1 = b2;
+ b2 = this;
+ }
+ long end = b1.lastBit();
+ if (b2.lastBit() > b1.lastBit())
+ end = b2.lastBit();
+ return new RLE(b1.firstBit(), end - b1.firstBit() + 1);
+ }
+
+ /**
+ * Returns the number of bits set to {@code true} in this {@code RLE}.
+ *
+ * @return the number of bits set to {@code true} in this {@code RLE}.
+ */
+ public int cardinality() {
+ return (int) nbits;
+ }
+
+ @Override
+ public int compareTo(RLE o) {
+ if (this.equals(o))
+ return 0;
+ return (start < o.start) ? -1 : 1;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof RLE) {
+ RLE b = (RLE) obj;
+ return (start == b.start) && (nbits == b.nbits);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return new Long(start ^ nbits).hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return "[" + firstBit() + ".." + lastBit() + "]";
+ }
+ }
+
+ private SortedSet<RLE> bitsets;
+
+ /**
+ * Creates a new bit set. All bits are initially <code>false</code>.
+ */
+ public RLEBitSet() {
+ bitsets = new TreeSet<RLE>();
+ }
+
+ /**
+ * Creates a new bit set, with bits set according to the value of <code>s</code>.
+ *
+ * @param s the initialization String
+ */
+ public RLEBitSet(String s) {
+ bitsets = new TreeSet<RLE>();
+ set(s);
+ }
+
+ /**
+ * Returns the "logical size" of this {@code RLEBitSet}: the index of the highest set bit
+ * in the {@code RLEBitSet} plus one. Returns zero if the {@code RLEBitSet} contains no set bits.
+ *
+ * @return the logical size of this {@code RLEBitSet}
+ */
+ public long length() {
+ if (isEmpty())
+ return 0;
+ return bitsets.last().lastBit() + 1;
+ }
+
+ /**
+ * Returns the value of the bit with the specified index. The value is {@code true} if the bit
+ * with the index bit is currently set in this BitSet; otherwise, the result is {@code false}.
+ *
+ * @param bit the bit index
+ * @return the value of the bit with the specified index
+ */
+ public boolean get(long bit) {
+ synchronized (bitsets) {
+ for (RLE bs : bitsets) {
+ if (bit >= bs.firstBit() && bit <= bs.lastBit())
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Set one or more bits to true, based on the value of <code>s</code>.
+ *
+ * @param s the initialization String, which consists of a comma or space separated list of
+ * non-negative numbers and ranges. An individual number represents the bit index to set.
+ * A range (two numbers separated by a dash) causes all bit indexes between the two numbers
+ * (inclusive) to be set.
+ * @throws NumberFormatException - if a number is incorrectly formatted
+ * @throws IndexOutOfBoundsException - if an index is negative
+ */
+ public void set(String s) throws NumberFormatException {
+ s = s.trim();
+ if (!s.isEmpty()) {
+ for (String s2 : s.split("[, \n]+")) {
+ if (s2.indexOf('-') >= 0) {
+ String[] pp = s2.split("-");
+ long f = Long.parseLong(pp[0]);
+ long t = Long.parseLong(pp[1]);
+ set(f, t + 1);
+ } else
+ set(Long.parseLong(s2));
+ }
+ }
+ }
+
+ /**
+ * Sets the bit at the specified index to {@code true}.
+ *
+ * @param bit a bit index
+ */
+ public void set(long bit) {
+ set(bit, bit + 1);
+ }
+
+ /**
+ * Sets the bits from the specified {@code from} (inclusive) to the
+ * specified {@code to} (exclusive) to {@code true}.
+ *
+ * @param from index of the first bit to be set
+ * @param to index after the last bit to be set
+ * @throws IndexOutOfBoundsException if {@code from} is negative,
+ * or {@code to} is negative,
+ * or {@code from} is larger than {@code to}
+ */
+ public void set(long from, long to) {
+ checkRange(from, to);
+ RLE newbits = new RLE(from, to - from);
+ synchronized (bitsets) {
+ for (RLE bs : bitsets) {
+ if (bs.intersects(newbits)) {
+ if (!newbits.isSubset(bs)) {
+ bitsets.remove(bs);
+ bitsets.add(newbits.union(bs));
+ coalesce();
+ }
+ return;
+ }
+ }
+ bitsets.add(newbits);
+ }
+ coalesce();
+ }
+
+ /**
+ * Sets all of the bits in this BitSet to {@code false}.
+ */
+ public void clear() {
+ synchronized (bitsets) {
+ bitsets.clear();
+ }
+ }
+
+ /**
+ * Sets the bit specified by the index to {@code false}.
+ *
+ * @param bit the index of the bit to be cleared
+ */
+ public void clear(long bit) {
+ clear(bit, bit + 1);
+ }
+
+ /**
+ * Sets the bits from the specified {@code from} (inclusive) to the
+ * specified {@code to} (exclusive) to {@code false}.
+ *
+ * @param from index of the first bit to be cleared
+ * @param to index after the last bit to be cleared
+ * @throws IndexOutOfBoundsException if {@code from} is negative,
+ * or {@code to} is negative,
+ * or {@code from} is larger than {@code to}
+ */
+ public void clear(long from, long to) {
+ checkRange(from, to);
+ RLE newbits = new RLE(from, to - from);
+ List<RLE> newranges = new ArrayList<RLE>();
+ synchronized (bitsets) {
+ for (RLE bs : bitsets) {
+ if (bs.intersects(newbits)) {
+ // preserve the bits that are not being cleared
+ long len = newbits.firstBit() - bs.firstBit();
+ if (len > 0)
+ newranges.add(new RLE(bs.firstBit(), len));
+ len = bs.lastBit() - newbits.lastBit();
+ if (len > 0)
+ newranges.add(new RLE(newbits.lastBit() + 1, len));
+ bs.nbits = 0;
+ }
+ }
+ if (!newranges.isEmpty()) {
+ for (RLE bs : newranges) {
+ bitsets.add(bs);
+ }
+ }
+ }
+ coalesce();
+ }
+
+ /**
+ * Combine abutting RLEBitSets, and remove 0 length RLEBitSets.
+ */
+ private void coalesce() {
+ RLE last = null;
+ synchronized (bitsets) {
+ Iterator<RLE> iter = bitsets.iterator();
+ while (iter.hasNext()) {
+ RLE bs = iter.next();
+ if (last != null && (last.lastBit() + 1 == bs.firstBit())) {
+ last.nbits += bs.nbits;
+ iter.remove();
+ } else if (bs.nbits == 0) {
+ iter.remove();
+ } else {
+ last = bs;
+ }
+ }
+ }
+ }
+
+ /**
+ * Checks that fromIndex ... toIndex is a valid range of bit indices.
+ */
+ private static void checkRange(long from, long to) {
+ if (from < 0)
+ throw new IndexOutOfBoundsException("fromIndex < 0: " + from);
+ if (to < 0)
+ throw new IndexOutOfBoundsException("toIndex < 0: " + to);
+ if (from > to)
+ throw new IndexOutOfBoundsException("fromIndex: " + from + " > toIndex: " + to);
+ }
+
+ /**
+ * Performs a logical <b>AND</b> of this target bit set with the argument bit set.
+ * This bit set is modified so that each bit in it has the value {@code true} if and only if
+ * it both initially had the value {@code true} and the corresponding bit in the bit set
+ * argument also had the value {@code true}.
+ *
+ * @param set a {@code RLEBitSet}
+ */
+ public void and(RLEBitSet set) {
+ long last = 0;
+ synchronized (set.bitsets) {
+ for (RLE bs : set.bitsets) {
+ clear(last, bs.start);
+ last = bs.start + bs.nbits;
+ }
+ }
+ clear(last, Long.MAX_VALUE);
+ }
+
+ /**
+ * Clears all of the bits in this {@code RLEBitSet} whose corresponding bit is set in
+ * the specified {@code RLEBitSet}.
+ *
+ * @param set the {@code RLEBitSet} with which to mask this {@code RLEBitSet}
+ */
+ public void andNot(RLEBitSet set) {
+ synchronized (set.bitsets) {
+ for (RLE bs : set.bitsets) {
+ clear(bs.start, bs.start + bs.nbits);
+ }
+ }
+ }
+
+ /**
+ * Returns true if this {@code RLEBitSet} contains no bits that are set
+ * to {@code true}.
+ *
+ * @return boolean indicating whether this {@code BitSet} is empty
+ */
+ public boolean isEmpty() {
+ return bitsets.isEmpty();
+ }
+
+ /**
+ * Returns the number of bits set to {@code true} in this {@code RLEBitSet}.
+ *
+ * @return the number of bits set to {@code true} in this {@code RLEBitSet}.
+ */
+ public int cardinality() {
+ int n = 0;
+ synchronized (bitsets) {
+ for (RLE bs : bitsets) {
+ n += bs.cardinality();
+ }
+ }
+ return n;
+ }
+
+ /**
+ * Cloning this RLEBitSet produces a new RLEBitSet that is equal to it. The clone of the
+ * bit set is another bit set that has exactly the same bits set to true as this bit set.
+ *
+ * @return a clone of this bit set
+ */
+ public Object clone() {
+ RLEBitSet rv = new RLEBitSet();
+ synchronized (bitsets) {
+ for (RLE bs : bitsets) {
+ rv.bitsets.add(new RLE(bs.start, bs.nbits));
+ }
+ }
+ return rv;
+ }
+
+ /**
+ * Returns a string representation of this bit set, using the same notation as is required for
+ * the String constructor. For every index for which this {@code RLEBitSet} contains a bit in
+ * the set state, the decimal representation of that index is included in the result. Such
+ * indices are listed in order from lowest to highest, separated by ",". Ranges of set bits are
+ * indicated by <i>lobit</i>-<i>hibit</i>.
+ *
+ * @return the String
+ */
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ String prefix = "";
+ synchronized (bitsets) {
+ for (RLE bs : bitsets) {
+ sb.append(prefix);
+ prefix = ",";
+ long s = bs.firstBit();
+ long e = bs.lastBit();
+ sb.append(s);
+ if (s != e)
+ sb.append('-').append(e);
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Return an Iterator which provides pairs of {@code Long}s representing the beginning and
+ * ending index of a range of set bits in this {@code RLEBitSet}.
+ *
+ * @return the Iterator
+ */
+ public Iterator<Long[]> getRangeIterator() {
+ return new Iterator<Long[]>() {
+ private Iterator<RLE> i = bitsets.iterator();
+
+ @Override
+ public boolean hasNext() {
+ return i.hasNext();
+ }
+
+ @Override
+ public Long[] next() {
+ RLE bs = i.next();
+ return new Long[]{bs.firstBit(), bs.lastBit()};
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/ThrottleFilter.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/ThrottleFilter.java
index ba2ca7e7..7f8d7a8c 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/ThrottleFilter.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/ThrottleFilter.java
@@ -7,9 +7,9 @@
* * 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.
@@ -58,9 +58,9 @@ import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
* <tr><td>(no value)</td><td>filter disabled</td></tr>
* <tr><td>off</td><td>filter disabled</td></tr>
* <tr><td>N[,M[,action]]</td><td>set N, M, and action (used in the algorithm below).
- * Action is <i>drop</i> or <i>throttle</i>.
- * If M is missing, it defaults to 5 minutes.
- * If the action is missing, it defaults to <i>drop</i>.
+ * Action is <i>drop</i> or <i>throttle</i>.
+ * If M is missing, it defaults to 5 minutes.
+ * If the action is missing, it defaults to <i>drop</i>.
* </td></tr>
* </table>
* <p>
@@ -68,19 +68,19 @@ import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
* <ol>
* <li>the filter is enabled, and</li>
* <li>N /publish requests come to the provisioning server in M minutes
- * <ol>
- * <li>from the same IP address</li>
- * <li>for the same feed</li>
- * <li>lacking the <i>Expect: 100-continue</i> header</li>
- * </ol>
+ * <ol>
+ * <li>from the same IP address</li>
+ * <li>for the same feed</li>
+ * <li>lacking the <i>Expect: 100-continue</i> header</li>
+ * </ol>
* </li>
* </ol>
* The action that can be performed (if triggered) are:
* <ol>
* <li><i>drop</i> - the connection is dropped immediately.</li>
* <li><i>throttle</i> - [not supported] the connection is put into a low priority queue with all other throttled connections.
- * These are then processed at a slower rate. Note: this option does not work correctly, and is disabled.
- * The only action that is supported is <i>drop</i>.
+ * These are then processed at a slower rate. Note: this option does not work correctly, and is disabled.
+ * The only action that is supported is <i>drop</i>.
* </li>
* </ol>
*
@@ -88,228 +88,236 @@ import org.onap.dmaap.datarouter.provisioning.beans.Parameters;
* @version $Id: ThrottleFilter.java,v 1.2 2014/03/12 19:45:41 eby Exp $
*/
public class ThrottleFilter extends TimerTask implements Filter {
- public static final int DEFAULT_N = 10;
- public static final int DEFAULT_M = 5;
- public static final String THROTTLE_MARKER = "org.onap.dmaap.datarouter.provisioning.THROTTLE_MARKER";
- private static final String JETTY_REQUEST = "org.eclipse.jetty.server.Request";
- private static final long ONE_MINUTE = 60000L;
- private static final int ACTION_DROP = 0;
- private static final int ACTION_THROTTLE = 1;
+ public static final int DEFAULT_N = 10;
+ public static final int DEFAULT_M = 5;
+ public static final String THROTTLE_MARKER = "org.onap.dmaap.datarouter.provisioning.THROTTLE_MARKER";
+ private static final String JETTY_REQUEST = "org.eclipse.jetty.server.Request";
+ private static final long ONE_MINUTE = 60000L;
+ private static final int ACTION_DROP = 0;
+ private static final int ACTION_THROTTLE = 1;
+
+ // Configuration
+ private static boolean enabled = false; // enabled or not
+ private static int n_requests = 0; // number of requests in M minutes
+ private static int m_minutes = 0; // sampling period
+ private static int action = ACTION_DROP; // action to take (throttle or drop)
+
+ private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
+ private static Map<String, Counter> map = new HashMap<String, Counter>();
+ private static final Timer rolex = new Timer();
+
+ @Override
+ public void init(FilterConfig arg0) throws ServletException {
+ configure();
+ rolex.scheduleAtFixedRate(this, 5 * 60000L, 5 * 60000L); // Run once every 5 minutes to clean map
+ }
+
+ /**
+ * Configure the throttle. This should be called from BaseServlet.provisioningParametersChanged(), to make sure it stays up to date.
+ */
+ public static void configure() {
+ Parameters p = Parameters.getParameter(Parameters.THROTTLE_FILTER);
+ if (p != null) {
+ try {
+ Class.forName(JETTY_REQUEST);
+ String v = p.getValue();
+ if (v != null && !v.equals("off")) {
+ String[] pp = v.split(",");
+ if (pp != null) {
+ n_requests = (pp.length > 0) ? getInt(pp[0], DEFAULT_N) : DEFAULT_N;
+ m_minutes = (pp.length > 1) ? getInt(pp[1], DEFAULT_M) : DEFAULT_M;
+ action = (pp.length > 2 && pp[2] != null && pp[2].equalsIgnoreCase("throttle")) ? ACTION_THROTTLE : ACTION_DROP;
+ enabled = true;
+ // ACTION_THROTTLE is not currently working, so is not supported
+ if (action == ACTION_THROTTLE) {
+ action = ACTION_DROP;
+ logger.info("Throttling is not currently supported; action changed to DROP");
+ }
+ logger.info("ThrottleFilter is ENABLED for /publish requests; N=" + n_requests + ", M=" + m_minutes + ", Action=" + action);
+ return;
+ }
+ }
+ } catch (ClassNotFoundException e) {
+ logger.warn("Class " + JETTY_REQUEST + " is not available; this filter requires Jetty.");
+ }
+ }
+ logger.info("ThrottleFilter is DISABLED for /publish requests.");
+ enabled = false;
+ map.clear();
+ }
+
+ private static int getInt(String s, int deflt) {
+ try {
+ return Integer.parseInt(s);
+ } catch (NumberFormatException x) {
+ return deflt;
+ }
+ }
+
+ @Override
+ public void destroy() {
+ rolex.cancel();
+ map.clear();
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ if (enabled && action == ACTION_THROTTLE) {
+ throttleFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
+ } else if (enabled) {
+ dropFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
+ } else {
+ chain.doFilter(request, response);
+ }
+ }
+
+ public void dropFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ int rate = getRequestRate((HttpServletRequest) request);
+ if (rate >= n_requests) {
+ // drop request - only works under Jetty
+ String m = String.format("Dropping connection: %s %d bad connections in %d minutes", getConnectionId((HttpServletRequest) request), rate, m_minutes);
+ logger.info(m);
+ Request base_request = (request instanceof Request)
+ ? (Request) request
+ : AbstractHttpConnection.getCurrentConnection().getRequest();
+ base_request.getConnection().getEndPoint().close();
+ } else {
+ chain.doFilter(request, response);
+ }
+ }
+
+ public void throttleFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ // throttle request
+ String id = getConnectionId((HttpServletRequest) request);
+ int rate = getRequestRate((HttpServletRequest) request);
+ Object results = request.getAttribute(THROTTLE_MARKER);
+ if (rate >= n_requests && results == null) {
+ String m = String.format("Throttling connection: %s %d bad connections in %d minutes", getConnectionId((HttpServletRequest) request), rate, m_minutes);
+ logger.info(m);
+ Continuation continuation = ContinuationSupport.getContinuation(request);
+ continuation.suspend();
+ register(id, continuation);
+ continuation.undispatch();
+ } else {
+ chain.doFilter(request, response);
+ @SuppressWarnings("resource")
+ InputStream is = request.getInputStream();
+ byte[] b = new byte[4096];
+ int n = is.read(b);
+ while (n > 0) {
+ n = is.read(b);
+ }
+ resume(id);
+ }
+ }
+
+ private Map<String, List<Continuation>> suspended_requests = new HashMap<String, List<Continuation>>();
- // Configuration
- private static boolean enabled = false; // enabled or not
- private static int n_requests = 0; // number of requests in M minutes
- private static int m_minutes = 0; // sampling period
- private static int action = ACTION_DROP; // action to take (throttle or drop)
+ private void register(String id, Continuation continuation) {
+ synchronized (suspended_requests) {
+ List<Continuation> list = suspended_requests.get(id);
+ if (list == null) {
+ list = new ArrayList<Continuation>();
+ suspended_requests.put(id, list);
+ }
+ list.add(continuation);
+ }
+ }
- private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");
- private static Map<String, Counter> map = new HashMap<String, Counter>();
- private static final Timer rolex = new Timer();
+ private void resume(String id) {
+ synchronized (suspended_requests) {
+ List<Continuation> list = suspended_requests.get(id);
+ if (list != null) {
+ // when the waited for event happens
+ Continuation continuation = list.remove(0);
+ continuation.setAttribute(ThrottleFilter.THROTTLE_MARKER, new Object());
+ continuation.resume();
+ }
+ }
+ }
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- configure();
- rolex.scheduleAtFixedRate(this, 5*60000L, 5*60000L); // Run once every 5 minutes to clean map
- }
+ /**
+ * Return a count of number of requests in the last M minutes, iff this is a "bad" request.
+ * If the request has been resumed (if it contains the THROTTLE_MARKER) it is considered good.
+ *
+ * @param request the request
+ * @return number of requests in the last M minutes, 0 means it is a "good" request
+ */
+ private int getRequestRate(HttpServletRequest request) {
+ String expecthdr = request.getHeader("Expect");
+ if (expecthdr != null && expecthdr.equalsIgnoreCase("100-continue"))
+ return 0;
- /**
- * Configure the throttle. This should be called from BaseServlet.provisioningParametersChanged(), to make sure it stays up to date.
- */
- public static void configure() {
- Parameters p = Parameters.getParameter(Parameters.THROTTLE_FILTER);
- if (p != null) {
- try {
- Class.forName(JETTY_REQUEST);
- String v = p.getValue();
- if (v != null && !v.equals("off")) {
- String[] pp = v.split(",");
- if (pp != null) {
- n_requests = (pp.length > 0) ? getInt(pp[0], DEFAULT_N) : DEFAULT_N;
- m_minutes = (pp.length > 1) ? getInt(pp[1], DEFAULT_M) : DEFAULT_M;
- action = (pp.length > 2 && pp[2] != null && pp[2].equalsIgnoreCase("throttle")) ? ACTION_THROTTLE : ACTION_DROP;
- enabled = true;
- // ACTION_THROTTLE is not currently working, so is not supported
- if (action == ACTION_THROTTLE) {
- action = ACTION_DROP;
- logger.info("Throttling is not currently supported; action changed to DROP");
- }
- logger.info("ThrottleFilter is ENABLED for /publish requests; N="+n_requests+", M="+m_minutes+", Action="+action);
- return;
- }
- }
- } catch (ClassNotFoundException e) {
- logger.warn("Class "+JETTY_REQUEST+" is not available; this filter requires Jetty.");
- }
- }
- logger.info("ThrottleFilter is DISABLED for /publish requests.");
- enabled = false;
- map.clear();
- }
- private static int getInt(String s, int deflt) {
- try {
- return Integer.parseInt(s);
- } catch (NumberFormatException x) {
- return deflt;
- }
- }
- @Override
- public void destroy() {
- rolex.cancel();
- map.clear();
- }
+ String key = getConnectionId(request);
+ synchronized (map) {
+ Counter cnt = map.get(key);
+ if (cnt == null) {
+ cnt = new Counter();
+ map.put(key, cnt);
+ }
+ int n = cnt.getRequestRate();
+ return n;
+ }
+ }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- throws IOException, ServletException
- {
- if (enabled && action == ACTION_THROTTLE) {
- throttleFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
- } else if (enabled) {
- dropFilter((HttpServletRequest) request, (HttpServletResponse) response, chain);
- } else {
- chain.doFilter(request, response);
- }
- }
- public void dropFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
- throws IOException, ServletException
- {
- int rate = getRequestRate((HttpServletRequest) request);
- if (rate >= n_requests) {
- // drop request - only works under Jetty
- String m = String.format("Dropping connection: %s %d bad connections in %d minutes", getConnectionId((HttpServletRequest) request), rate, m_minutes);
- logger.info(m);
- Request base_request = (request instanceof Request)
- ? (Request) request
- : AbstractHttpConnection.getCurrentConnection().getRequest();
- base_request.getConnection().getEndPoint().close();
- } else {
- chain.doFilter(request, response);
- }
- }
- public void throttleFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
- throws IOException, ServletException
- {
- // throttle request
- String id = getConnectionId((HttpServletRequest) request);
- int rate = getRequestRate((HttpServletRequest) request);
- Object results = request.getAttribute(THROTTLE_MARKER);
- if (rate >= n_requests && results == null) {
- String m = String.format("Throttling connection: %s %d bad connections in %d minutes", getConnectionId((HttpServletRequest) request), rate, m_minutes);
- logger.info(m);
- Continuation continuation = ContinuationSupport.getContinuation(request);
- continuation.suspend();
- register(id, continuation);
- continuation.undispatch();
- } else {
- chain.doFilter(request, response);
- @SuppressWarnings("resource")
- InputStream is = request.getInputStream();
- byte[] b = new byte[4096];
- int n = is.read(b);
- while (n > 0) {
- n = is.read(b);
- }
- resume(id);
- }
- }
- private Map<String, List<Continuation>> suspended_requests = new HashMap<String, List<Continuation>>();
- private void register(String id, Continuation continuation) {
- synchronized (suspended_requests) {
- List<Continuation> list = suspended_requests.get(id);
- if (list == null) {
- list = new ArrayList<Continuation>();
- suspended_requests.put(id, list);
- }
- list.add(continuation);
- }
- }
- private void resume(String id) {
- synchronized (suspended_requests) {
- List<Continuation> list = suspended_requests.get(id);
- if (list != null) {
- // when the waited for event happens
- Continuation continuation = list.remove(0);
- continuation.setAttribute(ThrottleFilter.THROTTLE_MARKER, new Object());
- continuation.resume();
- }
- }
- }
+ public class Counter {
+ private List<Long> times = new Vector<Long>(); // a record of request times
- /**
- * Return a count of number of requests in the last M minutes, iff this is a "bad" request.
- * If the request has been resumed (if it contains the THROTTLE_MARKER) it is considered good.
- * @param request the request
- * @return number of requests in the last M minutes, 0 means it is a "good" request
- */
- private int getRequestRate(HttpServletRequest request) {
- String expecthdr = request.getHeader("Expect");
- if (expecthdr != null && expecthdr.equalsIgnoreCase("100-continue"))
- return 0;
+ public int prune() {
+ try {
+ long n = System.currentTimeMillis() - (m_minutes * ONE_MINUTE);
+ long t = times.get(0);
+ while (t < n) {
+ times.remove(0);
+ t = times.get(0);
+ }
+ } catch (IndexOutOfBoundsException e) {
+ // ignore
+ }
+ return times.size();
+ }
- String key = getConnectionId(request);
- synchronized (map) {
- Counter cnt = map.get(key);
- if (cnt == null) {
- cnt = new Counter();
- map.put(key, cnt);
- }
- int n = cnt.getRequestRate();
- return n;
- }
- }
+ public int getRequestRate() {
+ times.add(System.currentTimeMillis());
+ return prune();
+ }
+ }
- public class Counter {
- private List<Long> times = new Vector<Long>(); // a record of request times
- public int prune() {
- try {
- long n = System.currentTimeMillis() - (m_minutes * ONE_MINUTE);
- long t = times.get(0);
- while (t < n) {
- times.remove(0);
- t = times.get(0);
- }
- } catch (IndexOutOfBoundsException e) {
- // ignore
- }
- return times.size();
- }
- public int getRequestRate() {
- times.add(System.currentTimeMillis());
- return prune();
- }
- }
+ /**
+ * Identify a connection by endpoint IP address, and feed ID.
+ */
+ private String getConnectionId(HttpServletRequest req) {
+ return req.getRemoteAddr() + "/" + getFeedId(req);
+ }
- /**
- * Identify a connection by endpoint IP address, and feed ID.
- */
- private String getConnectionId(HttpServletRequest req) {
- return req.getRemoteAddr() + "/" + getFeedId(req);
- }
- private int getFeedId(HttpServletRequest req) {
- String path = req.getPathInfo();
- if (path == null || path.length() < 2)
- return -1;
- path = path.substring(1);
- int ix = path.indexOf('/');
- if (ix < 0 || ix == path.length()-1)
- return -2;
- try {
- int feedid = Integer.parseInt(path.substring(0, ix));
- return feedid;
- } catch (NumberFormatException e) {
- return -1;
- }
- }
+ private int getFeedId(HttpServletRequest req) {
+ String path = req.getPathInfo();
+ if (path == null || path.length() < 2)
+ return -1;
+ path = path.substring(1);
+ int ix = path.indexOf('/');
+ if (ix < 0 || ix == path.length() - 1)
+ return -2;
+ try {
+ int feedid = Integer.parseInt(path.substring(0, ix));
+ return feedid;
+ } catch (NumberFormatException e) {
+ return -1;
+ }
+ }
- @Override
- public void run() {
- // Once every 5 minutes, go through the map, and remove empty entrys
- for (Object s : map.keySet().toArray()) {
- synchronized (map) {
- Counter c = map.get(s);
- if (c.prune() <= 0)
- map.remove(s);
- }
- }
- }
+ @Override
+ public void run() {
+ // Once every 5 minutes, go through the map, and remove empty entrys
+ for (Object s : map.keySet().toArray()) {
+ synchronized (map) {
+ Counter c = map.get(s);
+ if (c.prune() <= 0)
+ map.remove(s);
+ }
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/URLUtilities.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/URLUtilities.java
index c3249426..c3661ba0 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/URLUtilities.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/URLUtilities.java
@@ -7,9 +7,9 @@
* * 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.
@@ -37,94 +37,112 @@ import org.onap.dmaap.datarouter.provisioning.BaseServlet;
* @version $Id: URLUtilities.java,v 1.2 2014/03/12 19:45:41 eby Exp $
*/
public class URLUtilities {
- /**
- * Generate the URL used to access a feed.
- * @param feedid the feed id
- * @return the URL
- */
- public static String generateFeedURL(int feedid) {
- return "https://" + BaseServlet.prov_name + "/feed/" + feedid;
- }
- /**
- * Generate the URL used to publish to a feed.
- * @param feedid the feed id
- * @return the URL
- */
- public static String generatePublishURL(int feedid) {
- return "https://" + BaseServlet.prov_name + "/publish/" + feedid;
- }
- /**
- * Generate the URL used to subscribe to a feed.
- * @param feedid the feed id
- * @return the URL
- */
- public static String generateSubscribeURL(int feedid) {
- return "https://" + BaseServlet.prov_name + "/subscribe/" + feedid;
- }
- /**
- * Generate the URL used to access a feed's logs.
- * @param feedid the feed id
- * @return the URL
- */
- public static String generateFeedLogURL(int feedid) {
- return "https://" + BaseServlet.prov_name + "/feedlog/" + feedid;
- }
- /**
- * Generate the URL used to access a subscription.
- * @param subid the subscription id
- * @return the URL
- */
- public static String generateSubscriptionURL(int subid) {
- return "https://" + BaseServlet.prov_name + "/subs/" + subid;
- }
- /**
- * Generate the URL used to access a subscription's logs.
- * @param subid the subscription id
- * @return the URL
- */
- public static String generateSubLogURL(int subid) {
- return "https://" + BaseServlet.prov_name + "/sublog/" + subid;
- }
- /**
- * Generate the URL used to access the provisioning data on the peer POD.
- * @return the URL
- */
- public static String generatePeerProvURL() {
- return "https://" + getPeerPodName() + "/internal/prov";
- }
- /**
- * Generate the URL used to access the logfile data on the peer POD.
- * @return the URL
- */
- public static String generatePeerLogsURL() {
- //Fixes for Itrack ticket - DATARTR-4#Fixing if only one Prov is configured, not to give exception to fill logs.
- String peerPodUrl = getPeerPodName();
- if(peerPodUrl.equals("") || peerPodUrl.equals(null)){
- return "";
- }
-
- return "https://" + peerPodUrl + "/internal/drlogs/";
- }
- /**
- * Return the real (non CNAME) version of the peer POD's DNS name.
- * @return the name
- */
- public static String getPeerPodName() {
- if (other_pod == null) {
- String this_pod = "";
- try {
- this_pod = InetAddress.getLocalHost().getHostName();
- System.out.println("this_pod: "+this_pod);
- } catch (UnknownHostException e) {
- this_pod = "";
- }
- System.out.println("ALL PODS: "+Arrays.asList(BaseServlet.getPods()));
- for (String pod : BaseServlet.getPods()) {
- if (!pod.equals(this_pod))
- other_pod = pod;
- }
- }
- return other_pod;
- }
- private static String other_pod;
+ /**
+ * Generate the URL used to access a feed.
+ *
+ * @param feedid the feed id
+ * @return the URL
+ */
+ public static String generateFeedURL(int feedid) {
+ return "https://" + BaseServlet.prov_name + "/feed/" + feedid;
+ }
+
+ /**
+ * Generate the URL used to publish to a feed.
+ *
+ * @param feedid the feed id
+ * @return the URL
+ */
+ public static String generatePublishURL(int feedid) {
+ return "https://" + BaseServlet.prov_name + "/publish/" + feedid;
+ }
+
+ /**
+ * Generate the URL used to subscribe to a feed.
+ *
+ * @param feedid the feed id
+ * @return the URL
+ */
+ public static String generateSubscribeURL(int feedid) {
+ return "https://" + BaseServlet.prov_name + "/subscribe/" + feedid;
+ }
+
+ /**
+ * Generate the URL used to access a feed's logs.
+ *
+ * @param feedid the feed id
+ * @return the URL
+ */
+ public static String generateFeedLogURL(int feedid) {
+ return "https://" + BaseServlet.prov_name + "/feedlog/" + feedid;
+ }
+
+ /**
+ * Generate the URL used to access a subscription.
+ *
+ * @param subid the subscription id
+ * @return the URL
+ */
+ public static String generateSubscriptionURL(int subid) {
+ return "https://" + BaseServlet.prov_name + "/subs/" + subid;
+ }
+
+ /**
+ * Generate the URL used to access a subscription's logs.
+ *
+ * @param subid the subscription id
+ * @return the URL
+ */
+ public static String generateSubLogURL(int subid) {
+ return "https://" + BaseServlet.prov_name + "/sublog/" + subid;
+ }
+
+ /**
+ * Generate the URL used to access the provisioning data on the peer POD.
+ *
+ * @return the URL
+ */
+ public static String generatePeerProvURL() {
+ return "https://" + getPeerPodName() + "/internal/prov";
+ }
+
+ /**
+ * Generate the URL used to access the logfile data on the peer POD.
+ *
+ * @return the URL
+ */
+ public static String generatePeerLogsURL() {
+ //Fixes for Itrack ticket - DATARTR-4#Fixing if only one Prov is configured, not to give exception to fill logs.
+ String peerPodUrl = getPeerPodName();
+ if (peerPodUrl.equals("") || peerPodUrl.equals(null)) {
+ return "";
+ }
+
+ return "https://" + peerPodUrl + "/internal/drlogs/";
+ }
+
+ /**
+ * Return the real (non CNAME) version of the peer POD's DNS name.
+ *
+ * @return the name
+ */
+ public static String getPeerPodName() {
+ if (other_pod == null) {
+ String this_pod = "";
+ try {
+ this_pod = InetAddress.getLocalHost().getHostName();
+ System.out.println("this_pod: " + this_pod);
+ } catch (UnknownHostException e) {
+ this_pod = "";
+ }
+ System.out.println("ALL PODS: " + Arrays.asList(BaseServlet.getPods()));
+ for (String pod : BaseServlet.getPods()) {
+ if (!pod.equals(this_pod))
+ other_pod = pod;
+ }
+ }
+ return other_pod;
+ }
+
+ private static String other_pod;
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/package.html b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/package.html
index 7855bb40..09517fea 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/package.html
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/package.html
@@ -2,7 +2,7 @@
# ============LICENSE_START==================================================
# * org.onap.dmaap
# * ===========================================================================
-# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
# * ===========================================================================
# * Licensed under the Apache License, Version 2.0 (the "License");
# * you may not use this file except in compliance with the License.
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/DailyLatencyReport.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/DailyLatencyReport.java
index cd48e623..a5281c06 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/DailyLatencyReport.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/DailyLatencyReport.java
@@ -7,9 +7,9 @@
* * 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.
@@ -65,130 +65,130 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: DailyLatencyReport.java,v 1.2 2013/11/06 16:23:54 eby Exp $
*/
public class DailyLatencyReport extends ReportBase {
- private static final String SELECT_SQL =
- "select EVENT_TIME, TYPE, PUBLISH_ID, FEED_FILEID, FEEDID, CONTENT_LENGTH from LOG_RECORDS" +
- " where EVENT_TIME >= ? and EVENT_TIME <= ?";
+ private static final String SELECT_SQL =
+ "select EVENT_TIME, TYPE, PUBLISH_ID, FEED_FILEID, FEEDID, CONTENT_LENGTH from LOG_RECORDS" +
+ " where EVENT_TIME >= ? and EVENT_TIME <= ?";
- private class Job {
- public long pubtime = 0;
- public long clen = 0;
- public List<Long> deltime = new ArrayList<Long>();
- public long minLatency() {
- long n = deltime.isEmpty() ? 0 : Long.MAX_VALUE;
- for (Long l : deltime)
- n = Math.min(n, l-pubtime);
- return n;
- }
- public long maxLatency() {
- long n = 0;
- for (Long l : deltime)
- n = Math.max(n, l-pubtime);
- return n;
- }
- public long totalLatency() {
- long n = 0;
- for (Long l : deltime)
- n += (l-pubtime);
- return n;
- }
- }
- private class Counters {
- public final String date;
- public final int feedid;
- public final Map<String, Job> jobs;
- public Counters(String d, int fid) {
- date = d;
- feedid = fid;
- jobs = new HashMap<String, Job>();
- }
- public void addEvent(long etime, String type, String id, String fid, long clen) {
- Job j = jobs.get(id);
- if (j == null) {
- j = new Job();
- jobs.put(id, j);
- }
- if (type.equals("pub")) {
- j.pubtime = getPstart(id);
- j.clen = clen;
- } else if (type.equals("del")) {
- j.deltime.add(etime);
- }
- }
- @Override
- public String toString() {
- long minsize = Long.MAX_VALUE, maxsize = 0, avgsize = 0;
- long minl = Long.MAX_VALUE, maxl = 0;
- long fanout = 0, totall = 0, totaln = 0;
- for (Job j : jobs.values()) {
- minsize = Math.min(minsize, j.clen);
- maxsize = Math.max(maxsize, j.clen);
- avgsize += j.clen;
- minl = Math.min(minl, j.minLatency());
- maxl = Math.max(maxl, j.maxLatency());
- totall += j.totalLatency();
- totaln += j.deltime.size();
- fanout += j.deltime.size();
- }
- if (jobs.size() > 0) {
- avgsize /= jobs.size();
- fanout /= jobs.size();
- }
- long avgl = (totaln > 0) ? (totall / totaln) : 0;
- return date + "," + feedid + "," + minsize + "," + maxsize + "," + avgsize + "," + minl + "," + maxl + "," + avgl + "," + fanout;
- }
- }
- private long getPstart(String t) {
- if (t.indexOf('.') > 0)
- t = t.substring(0, t.indexOf('.'));
- return Long.parseLong(t);
- }
+ private class Job {
+ public long pubtime = 0;
+ public long clen = 0;
+ public List<Long> deltime = new ArrayList<Long>();
+ public long minLatency() {
+ long n = deltime.isEmpty() ? 0 : Long.MAX_VALUE;
+ for (Long l : deltime)
+ n = Math.min(n, l-pubtime);
+ return n;
+ }
+ public long maxLatency() {
+ long n = 0;
+ for (Long l : deltime)
+ n = Math.max(n, l-pubtime);
+ return n;
+ }
+ public long totalLatency() {
+ long n = 0;
+ for (Long l : deltime)
+ n += (l-pubtime);
+ return n;
+ }
+ }
+ private class Counters {
+ public final String date;
+ public final int feedid;
+ public final Map<String, Job> jobs;
+ public Counters(String d, int fid) {
+ date = d;
+ feedid = fid;
+ jobs = new HashMap<String, Job>();
+ }
+ public void addEvent(long etime, String type, String id, String fid, long clen) {
+ Job j = jobs.get(id);
+ if (j == null) {
+ j = new Job();
+ jobs.put(id, j);
+ }
+ if (type.equals("pub")) {
+ j.pubtime = getPstart(id);
+ j.clen = clen;
+ } else if (type.equals("del")) {
+ j.deltime.add(etime);
+ }
+ }
+ @Override
+ public String toString() {
+ long minsize = Long.MAX_VALUE, maxsize = 0, avgsize = 0;
+ long minl = Long.MAX_VALUE, maxl = 0;
+ long fanout = 0, totall = 0, totaln = 0;
+ for (Job j : jobs.values()) {
+ minsize = Math.min(minsize, j.clen);
+ maxsize = Math.max(maxsize, j.clen);
+ avgsize += j.clen;
+ minl = Math.min(minl, j.minLatency());
+ maxl = Math.max(maxl, j.maxLatency());
+ totall += j.totalLatency();
+ totaln += j.deltime.size();
+ fanout += j.deltime.size();
+ }
+ if (jobs.size() > 0) {
+ avgsize /= jobs.size();
+ fanout /= jobs.size();
+ }
+ long avgl = (totaln > 0) ? (totall / totaln) : 0;
+ return date + "," + feedid + "," + minsize + "," + maxsize + "," + avgsize + "," + minl + "," + maxl + "," + avgl + "," + fanout;
+ }
+ }
+ private long getPstart(String t) {
+ if (t.indexOf('.') > 0)
+ t = t.substring(0, t.indexOf('.'));
+ return Long.parseLong(t);
+ }
- @Override
- public void run() {
- Map<String, Counters> map = new HashMap<String, Counters>();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- long start = System.currentTimeMillis();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
- ps.setLong(1, from);
- ps.setLong(2, to);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- String id = rs.getString("PUBLISH_ID");
- int feed = rs.getInt("FEEDID");
- long etime = rs.getLong("EVENT_TIME");
- String type = rs.getString("TYPE");
- String fid = rs.getString("FEED_FILEID");
- long clen = rs.getLong("CONTENT_LENGTH");
- String date = sdf.format(new Date(getPstart(id)));
- String key = date + "," + feed;
- Counters c = map.get(key);
- if (c == null) {
- c = new Counters(date, feed);
- map.put(key, c);
- }
- c.addEvent(etime, type, id, fid, clen);
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");
- try {
- PrintWriter os = new PrintWriter(outfile);
- os.println("date,feedid,minsize,maxsize,avgsize,minlat,maxlat,avglat,fanout");
- for (String key : new TreeSet<String>(map.keySet())) {
- Counters c = map.get(key);
- os.println(c.toString());
- }
- os.close();
- } catch (FileNotFoundException e) {
- System.err.println("File cannot be written: "+outfile);
- }
- }
+ @Override
+ public void run() {
+ Map<String, Counters> map = new HashMap<String, Counters>();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ long start = System.currentTimeMillis();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
+ ps.setLong(1, from);
+ ps.setLong(2, to);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ String id = rs.getString("PUBLISH_ID");
+ int feed = rs.getInt("FEEDID");
+ long etime = rs.getLong("EVENT_TIME");
+ String type = rs.getString("TYPE");
+ String fid = rs.getString("FEED_FILEID");
+ long clen = rs.getLong("CONTENT_LENGTH");
+ String date = sdf.format(new Date(getPstart(id)));
+ String key = date + "," + feed;
+ Counters c = map.get(key);
+ if (c == null) {
+ c = new Counters(date, feed);
+ map.put(key, c);
+ }
+ c.addEvent(etime, type, id, fid, clen);
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");
+ try {
+ PrintWriter os = new PrintWriter(outfile);
+ os.println("date,feedid,minsize,maxsize,avgsize,minlat,maxlat,avglat,fanout");
+ for (String key : new TreeSet<String>(map.keySet())) {
+ Counters c = map.get(key);
+ os.println(c.toString());
+ }
+ os.close();
+ } catch (FileNotFoundException e) {
+ System.err.println("File cannot be written: "+outfile);
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/FeedReport.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/FeedReport.java
index a3e15dc3..d638aaa6 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/FeedReport.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/FeedReport.java
@@ -7,9 +7,9 @@
* * 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.
@@ -49,346 +49,369 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: FeedReport.java,v 1.2 2013/11/06 16:23:55 eby Exp $
*/
public class FeedReport extends ReportBase {
- private static final String SELECT_SQL =
- // Note to use the time in the publish_id, use date(from_unixtime(substring(publish_id, 1, 10)))
- // To just use month, substring(from_unixtime(event_time div 1000), 1, 7)
- "select date(from_unixtime(event_time div 1000)) as date, type, feedid, delivery_subid, count(*) as count" +
- " from LOG_RECORDS" +
- " where type = 'pub' or type = 'del'" +
- " group by date, type, feedid, delivery_subid";
- private static final String SELECT_SQL_OLD =
- "select PUBLISH_ID, TYPE, FEEDID, DELIVERY_SUBID from LOG_RECORDS where EVENT_TIME >= ? and EVENT_TIME <= ?";
+ private static final String SELECT_SQL =
+ // Note to use the time in the publish_id, use date(from_unixtime(substring(publish_id, 1, 10)))
+ // To just use month, substring(from_unixtime(event_time div 1000), 1, 7)
+ "select date(from_unixtime(event_time div 1000)) as date, type, feedid, delivery_subid, count(*) as count" +
+ " from LOG_RECORDS" +
+ " where type = 'pub' or type = 'del'" +
+ " group by date, type, feedid, delivery_subid";
+ private static final String SELECT_SQL_OLD =
+ "select PUBLISH_ID, TYPE, FEEDID, DELIVERY_SUBID from LOG_RECORDS where EVENT_TIME >= ? and EVENT_TIME <= ?";
+
+ @Override
+ public void run() {
+ boolean alg1 = true;
+ JSONObject jo = new JSONObject();
+ long start = System.currentTimeMillis();
+ StringBuilder sb = new StringBuilder();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
+// ps.setLong(1, from);
+// ps.setLong(2, to);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ if (alg1) {
+ String date = rs.getString("date");
+ String type = rs.getString("type");
+ int feedid = rs.getInt("feedid");
+ int subid = type.equals("del") ? rs.getInt("delivery_subid") : 0;
+ int count = rs.getInt("count");
+ sb.append(date + "," + type + "," + feedid + "," + subid + "," + count + "\n");
+ } else {
+ String date = rs.getString("date");
+ JSONObject datemap = jo.optJSONObject(date);
+ if (datemap == null) {
+ datemap = new JSONObject();
+ jo.put(date, datemap);
+ }
+ int feed = rs.getInt("FEEDID");
+ JSONObject feedmap = datemap.optJSONObject("" + feed);
+ if (feedmap == null) {
+ feedmap = new JSONObject();
+ feedmap.put("pubcount", 0);
+ datemap.put("" + feed, feedmap);
+ }
+ String type = rs.getString("TYPE");
+ int count = rs.getInt("count");
+ if (type.equals("pub")) {
+ feedmap.put("pubcount", count);
+ } else if (type.equals("del")) {
+ String subid = "" + rs.getInt("DELIVERY_SUBID");
+ feedmap.put(subid, count);
+ }
+ }
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ logger.debug("Query time: " + (System.currentTimeMillis() - start) + " ms");
+ try {
+ PrintWriter os = new PrintWriter(outfile);
+ if (alg1) {
+ os.print("date,type,feedid,subid,count\n");
+ os.print(sb.toString());
+ } else {
+ os.println(toHTML(jo));
+ }
+ os.close();
+ } catch (FileNotFoundException e) {
+ System.err.println("File cannot be written: " + outfile);
+ }
+ }
+
+ public void run2() {
+ JSONObject jo = new JSONObject();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ long start = System.currentTimeMillis();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement(SELECT_SQL_OLD);
+ ps.setLong(1, from);
+ ps.setLong(2, to);
+ ps.setFetchSize(100000);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ String id = rs.getString("PUBLISH_ID");
+ String date = sdf.format(new Date(getPstart(id)));
+ JSONObject datemap = jo.optJSONObject(date);
+ if (datemap == null) {
+ datemap = new JSONObject();
+ jo.put(date, datemap);
+ }
+ int feed = rs.getInt("FEEDID");
+ JSONObject feedmap = datemap.optJSONObject("" + feed);
+ if (feedmap == null) {
+ feedmap = new JSONObject();
+ feedmap.put("pubcount", 0);
+ datemap.put("" + feed, feedmap);
+ }
+ String type = rs.getString("TYPE");
+ if (type.equals("pub")) {
+ try {
+ int n = feedmap.getInt("pubcount");
+ feedmap.put("pubcount", n + 1);
+ } catch (JSONException e) {
+ feedmap.put("pubcount", 1);
+ }
+ } else if (type.equals("del")) {
+ String subid = "" + rs.getInt("DELIVERY_SUBID");
+ try {
+ int n = feedmap.getInt(subid);
+ feedmap.put(subid, n + 1);
+ } catch (JSONException e) {
+ feedmap.put(subid, 1);
+ }
+ }
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ logger.debug("Query time: " + (System.currentTimeMillis() - start) + " ms");
+ try {
+ PrintWriter os = new PrintWriter(outfile);
+ os.println(toHTML(jo));
+ os.close();
+ } catch (FileNotFoundException e) {
+ System.err.println("File cannot be written: " + outfile);
+ }
+ }
+
+ private long getPstart(String t) {
+ if (t.indexOf('.') > 0)
+ t = t.substring(0, t.indexOf('.'));
+ return Long.parseLong(t);
+ }
+
+ @SuppressWarnings("unused")
+ private static String toHTMLNested(JSONObject jo) {
+ StringBuilder s = new StringBuilder();
+ s.append("<table>\n");
+ s.append("<tr><th>Date</th><th>Feeds</th></tr>\n");
+ String[] dates = JSONObject.getNames(jo);
+ Arrays.sort(dates);
+ for (int i = dates.length - 1; i >= 0; i--) {
+ String date = dates[i];
+ JSONObject j2 = jo.getJSONObject(date);
+ String[] feeds = JSONObject.getNames(j2);
+ Arrays.sort(feeds);
+ s.append("<tr><td>" + date + "</td><td>");
+ s.append(feeds.length).append(feeds.length > 1 ? " Feeds\n" : " Feed\n");
+ s.append("<table>\n");
+ s.append("<tr><th>Feed ID</th><th>Publish Count</th><th>Subscriptions</th></tr>\n");
+ for (String feed : feeds) {
+ JSONObject j3 = j2.getJSONObject(feed);
+ String[] subs = JSONObject.getNames(j3);
+ Arrays.sort(subs);
+ s.append("<tr><td>" + feed + "</td>");
+ s.append("<td>" + j3.getInt("pubcount") + "</td>");
+ int scnt = j3.length() - 1;
+ s.append("<td>").append(scnt).append(" Subcription");
+ if (scnt > 1)
+ s.append("s");
+ s.append("<table>\n");
+ s.append("<tr><th>Sub ID</th><th>Delivery Count</th></tr>\n");
+ for (String sub : subs) {
+ if (!sub.equals("pubcount")) {
+ s.append("<tr><td>" + sub + "</td>");
+ s.append("<td>" + j3.getInt(sub) + "</td>");
+ s.append("</td></tr>\n");
+ }
+ }
+ s.append("</table>\n");
- @Override
- public void run() {
- boolean alg1 = true;
- JSONObject jo = new JSONObject();
- long start = System.currentTimeMillis();
- StringBuilder sb = new StringBuilder();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
-// ps.setLong(1, from);
-// ps.setLong(2, to);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- if (alg1) {
- String date = rs.getString("date");
- String type = rs.getString("type");
- int feedid = rs.getInt("feedid");
- int subid = type.equals("del") ? rs.getInt("delivery_subid") : 0;
- int count = rs.getInt("count");
- sb.append(date + "," + type + "," + feedid + "," + subid + "," + count + "\n");
- } else {
- String date = rs.getString("date");
- JSONObject datemap = jo.optJSONObject(date);
- if (datemap == null) {
- datemap = new JSONObject();
- jo.put(date, datemap);
- }
- int feed = rs.getInt("FEEDID");
- JSONObject feedmap = datemap.optJSONObject(""+feed);
- if (feedmap == null) {
- feedmap = new JSONObject();
- feedmap.put("pubcount", 0);
- datemap.put(""+feed, feedmap);
- }
- String type = rs.getString("TYPE");
- int count = rs.getInt("count");
- if (type.equals("pub")) {
- feedmap.put("pubcount", count);
- } else if (type.equals("del")) {
- String subid = ""+rs.getInt("DELIVERY_SUBID");
- feedmap.put(subid, count);
- }
- }
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");
- try {
- PrintWriter os = new PrintWriter(outfile);
- if (alg1) {
- os.print("date,type,feedid,subid,count\n");
- os.print(sb.toString());
- } else {
- os.println(toHTML(jo));
- }
- os.close();
- } catch (FileNotFoundException e) {
- System.err.println("File cannot be written: "+outfile);
- }
- }
+ s.append("</td></tr>\n");
+ }
+ s.append("</table>\n");
+ s.append("</td></tr>\n");
+ }
+ s.append("</table>\n");
+ return s.toString();
+ }
- public void run2() {
- JSONObject jo = new JSONObject();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- long start = System.currentTimeMillis();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement(SELECT_SQL_OLD);
- ps.setLong(1, from);
- ps.setLong(2, to);
- ps.setFetchSize(100000);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- String id = rs.getString("PUBLISH_ID");
- String date = sdf.format(new Date(getPstart(id)));
- JSONObject datemap = jo.optJSONObject(date);
- if (datemap == null) {
- datemap = new JSONObject();
- jo.put(date, datemap);
- }
- int feed = rs.getInt("FEEDID");
- JSONObject feedmap = datemap.optJSONObject(""+feed);
- if (feedmap == null) {
- feedmap = new JSONObject();
- feedmap.put("pubcount", 0);
- datemap.put(""+feed, feedmap);
- }
- String type = rs.getString("TYPE");
- if (type.equals("pub")) {
- try {
- int n = feedmap.getInt("pubcount");
- feedmap.put("pubcount", n+1);
- } catch (JSONException e) {
- feedmap.put("pubcount", 1);
- }
- } else if (type.equals("del")) {
- String subid = ""+rs.getInt("DELIVERY_SUBID");
- try {
- int n = feedmap.getInt(subid);
- feedmap.put(subid, n+1);
- } catch (JSONException e) {
- feedmap.put(subid, 1);
- }
- }
- }
- rs.close();
- ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");
- try {
- PrintWriter os = new PrintWriter(outfile);
- os.println(toHTML(jo));
- os.close();
- } catch (FileNotFoundException e) {
- System.err.println("File cannot be written: "+outfile);
- }
- }
- private long getPstart(String t) {
- if (t.indexOf('.') > 0)
- t = t.substring(0, t.indexOf('.'));
- return Long.parseLong(t);
- }
- @SuppressWarnings("unused")
- private static String toHTMLNested(JSONObject jo) {
- StringBuilder s = new StringBuilder();
- s.append("<table>\n");
- s.append("<tr><th>Date</th><th>Feeds</th></tr>\n");
- String[] dates = JSONObject.getNames(jo);
- Arrays.sort(dates);
- for (int i = dates.length-1; i >= 0; i--) {
- String date = dates[i];
- JSONObject j2 = jo.getJSONObject(date);
- String[] feeds = JSONObject.getNames(j2);
- Arrays.sort(feeds);
- s.append("<tr><td>"+date+"</td><td>");
- s.append(feeds.length).append(feeds.length > 1 ? " Feeds\n" : " Feed\n");
- s.append("<table>\n");
- s.append("<tr><th>Feed ID</th><th>Publish Count</th><th>Subscriptions</th></tr>\n");
- for (String feed : feeds) {
- JSONObject j3 = j2.getJSONObject(feed);
- String[] subs = JSONObject.getNames(j3);
- Arrays.sort(subs);
- s.append("<tr><td>"+feed+"</td>");
- s.append("<td>"+j3.getInt("pubcount")+"</td>");
- int scnt = j3.length()-1;
- s.append("<td>").append(scnt).append(" Subcription");
- if (scnt > 1)
- s.append("s");
- s.append("<table>\n");
- s.append("<tr><th>Sub ID</th><th>Delivery Count</th></tr>\n");
- for (String sub : subs) {
- if (!sub.equals("pubcount")) {
- s.append("<tr><td>"+sub+"</td>");
- s.append("<td>"+j3.getInt(sub)+"</td>");
- s.append("</td></tr>\n");
- }
- }
- s.append("</table>\n");
+ private static String toHTML(JSONObject jo) {
+ StringBuilder s = new StringBuilder();
+ s.append("<table>\n");
+ s.append("<tr><th>Date</th><th>Feeds</th><th>Feed ID</th><th>Publish Count</th><th>Subs</th><th>Sub ID</th><th>Delivery Count</th></tr>\n");
+ String[] dates = JSONObject.getNames(jo);
+ Arrays.sort(dates);
+ for (int i = dates.length - 1; i >= 0; i--) {
+ String date = dates[i];
+ JSONObject j2 = jo.getJSONObject(date);
+ int rc1 = countrows(j2);
+ String[] feeds = JSONObject.getNames(j2);
+ Arrays.sort(feeds);
+ s.append("<tr><td rowspan=\"" + rc1 + "\">")
+ .append(date)
+ .append("</td>");
+ s.append("<td rowspan=\"" + rc1 + "\">")
+ .append(feeds.length)
+ .append("</td>");
+ String px1 = "";
+ for (String feed : feeds) {
+ JSONObject j3 = j2.getJSONObject(feed);
+ int pubcount = j3.getInt("pubcount");
+ int subcnt = j3.length() - 1;
+ int rc2 = (subcnt < 1) ? 1 : subcnt;
+ String[] subs = JSONObject.getNames(j3);
+ Arrays.sort(subs);
+ s.append(px1)
+ .append("<td rowspan=\"" + rc2 + "\">")
+ .append(feed)
+ .append("</td>");
+ s.append("<td rowspan=\"" + rc2 + "\">")
+ .append(pubcount)
+ .append("</td>");
+ s.append("<td rowspan=\"" + rc2 + "\">")
+ .append(subcnt)
+ .append("</td>");
+ String px2 = "";
+ for (String sub : subs) {
+ if (!sub.equals("pubcount")) {
+ s.append(px2);
+ s.append("<td>" + sub + "</td>");
+ s.append("<td>" + j3.getInt(sub) + "</td>");
+ s.append("</tr>\n");
+ px2 = "<tr>";
+ }
+ }
+ if (px2.equals(""))
+ s.append("<td></td><td></td></tr>\n");
+ px1 = "<tr>";
+ }
+ }
+ s.append("</table>\n");
+ return s.toString();
+ }
- s.append("</td></tr>\n");
- }
- s.append("</table>\n");
- s.append("</td></tr>\n");
- }
- s.append("</table>\n");
- return s.toString();
- }
- private static String toHTML(JSONObject jo) {
- StringBuilder s = new StringBuilder();
- s.append("<table>\n");
- s.append("<tr><th>Date</th><th>Feeds</th><th>Feed ID</th><th>Publish Count</th><th>Subs</th><th>Sub ID</th><th>Delivery Count</th></tr>\n");
- String[] dates = JSONObject.getNames(jo);
- Arrays.sort(dates);
- for (int i = dates.length-1; i >= 0; i--) {
- String date = dates[i];
- JSONObject j2 = jo.getJSONObject(date);
- int rc1 = countrows(j2);
- String[] feeds = JSONObject.getNames(j2);
- Arrays.sort(feeds);
- s.append("<tr><td rowspan=\"" + rc1 + "\">")
- .append(date)
- .append("</td>");
- s.append("<td rowspan=\"" + rc1 + "\">")
- .append(feeds.length)
- .append("</td>");
- String px1 = "";
- for (String feed : feeds) {
- JSONObject j3 = j2.getJSONObject(feed);
- int pubcount = j3.getInt("pubcount");
- int subcnt = j3.length()-1;
- int rc2 = (subcnt < 1) ? 1 : subcnt;
- String[] subs = JSONObject.getNames(j3);
- Arrays.sort(subs);
- s.append(px1)
- .append("<td rowspan=\"" + rc2 + "\">")
- .append(feed)
- .append("</td>");
- s.append("<td rowspan=\"" + rc2 + "\">")
- .append(pubcount)
- .append("</td>");
- s.append("<td rowspan=\"" + rc2 + "\">")
- .append(subcnt)
- .append("</td>");
- String px2 = "";
- for (String sub : subs) {
- if (!sub.equals("pubcount")) {
- s.append(px2);
- s.append("<td>"+sub+"</td>");
- s.append("<td>"+j3.getInt(sub)+"</td>");
- s.append("</tr>\n");
- px2 = "<tr>";
- }
- }
- if (px2.equals(""))
- s.append("<td></td><td></td></tr>\n");
- px1 = "<tr>";
- }
- }
- s.append("</table>\n");
- return s.toString();
- }
- private static int countrows(JSONObject x) {
- int n = 0;
- for (String feed : JSONObject.getNames(x)) {
- JSONObject j3 = x.getJSONObject(feed);
- int subcnt = j3.length()-1;
- int rc2 = (subcnt < 1) ? 1 : subcnt;
- n += rc2;
- }
- return (n > 0) ? n : 1;
- }
+ private static int countrows(JSONObject x) {
+ int n = 0;
+ for (String feed : JSONObject.getNames(x)) {
+ JSONObject j3 = x.getJSONObject(feed);
+ int subcnt = j3.length() - 1;
+ int rc2 = (subcnt < 1) ? 1 : subcnt;
+ n += rc2;
+ }
+ return (n > 0) ? n : 1;
+ }
- /**
- * Convert a .CSV file (as generated by the normal FeedReport mechanism) to an HTML table.
- * @param args
- */
- public static void main(String[] args) {
- int rtype = 0; // 0 -> day, 1 -> week, 2 -> month, 3 -> year
- String infile = null;
- String outfile = null;
- for (int i = 0; i < args.length; i++) {
- if (args[i].equals("-t")) {
- switch (args[++i].charAt(0)) {
- case 'w': rtype = 1; break;
- case 'm': rtype = 2; break;
- case 'y': rtype = 3; break;
- default: rtype = 0; break;
- }
- } else if (infile == null) {
- infile = args[i];
- } else if (outfile == null) {
- outfile = args[i];
- }
- }
- if (infile == null) {
- System.err.println("usage: FeedReport [ -t <reporttype> ] [ <input .csv> ] [ <output .html> ]");
- System.exit(1);
- }
- try {
- JSONObject jo = new JSONObject();
- LineNumberReader lr = new LineNumberReader(new FileReader(infile));
- String line = lr.readLine();
- while (line != null) {
- String[] tt = line.split(",");
- if (tt[0].startsWith("2")) {
- String date = tt[0];
- switch (rtype) {
- case 1:
- String[] xx = date.split("-");
- Calendar cal = new GregorianCalendar(new Integer(xx[0]), new Integer(xx[1])-1, new Integer(xx[2]));
- date = xx[0] + "-W" + cal.get(Calendar.WEEK_OF_YEAR);
- break;
- case 2: date = date.substring(0, 7); break;
- case 3: date = date.substring(0, 4); break;
- }
- JSONObject datemap = jo.optJSONObject(date);
- if (datemap == null) {
- datemap = new JSONObject();
- jo.put(date, datemap);
- }
- int feed = Integer.parseInt(tt[2]);
- JSONObject feedmap = datemap.optJSONObject(""+feed);
- if (feedmap == null) {
- feedmap = new JSONObject();
- feedmap.put("pubcount", 0);
- datemap.put(""+feed, feedmap);
- }
- String type = tt[1];
- int count = Integer.parseInt(tt[4]);
- if (type.equals("pub")) {
- try {
- int n = feedmap.getInt("pubcount");
- feedmap.put("pubcount", n+count);
- } catch (JSONException e) {
- feedmap.put("pubcount", count);
- }
- } else if (type.equals("del")) {
- String subid = tt[3];
- try {
- int n = feedmap.getInt(subid);
- feedmap.put(subid, n+count);
- } catch (JSONException e) {
- feedmap.put(subid, count);
- }
- }
- }
- line = lr.readLine();
- }
- lr.close();
- String t = toHTML(jo);
- switch (rtype) {
- case 1: t = t.replaceAll("<th>Date</th>", "<th>Week</th>"); break;
- case 2: t = t.replaceAll("<th>Date</th>", "<th>Month</th>"); break;
- case 3: t = t.replaceAll("<th>Date</th>", "<th>Year</th>"); break;
- }
- System.out.println(t);
- } catch (Exception e) {
- System.err.println(e);
- e.printStackTrace();
- }
- }
+ /**
+ * Convert a .CSV file (as generated by the normal FeedReport mechanism) to an HTML table.
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ int rtype = 0; // 0 -> day, 1 -> week, 2 -> month, 3 -> year
+ String infile = null;
+ String outfile = null;
+ for (int i = 0; i < args.length; i++) {
+ if (args[i].equals("-t")) {
+ switch (args[++i].charAt(0)) {
+ case 'w':
+ rtype = 1;
+ break;
+ case 'm':
+ rtype = 2;
+ break;
+ case 'y':
+ rtype = 3;
+ break;
+ default:
+ rtype = 0;
+ break;
+ }
+ } else if (infile == null) {
+ infile = args[i];
+ } else if (outfile == null) {
+ outfile = args[i];
+ }
+ }
+ if (infile == null) {
+ System.err.println("usage: FeedReport [ -t <reporttype> ] [ <input .csv> ] [ <output .html> ]");
+ System.exit(1);
+ }
+ try {
+ JSONObject jo = new JSONObject();
+ LineNumberReader lr = new LineNumberReader(new FileReader(infile));
+ String line = lr.readLine();
+ while (line != null) {
+ String[] tt = line.split(",");
+ if (tt[0].startsWith("2")) {
+ String date = tt[0];
+ switch (rtype) {
+ case 1:
+ String[] xx = date.split("-");
+ Calendar cal = new GregorianCalendar(new Integer(xx[0]), new Integer(xx[1]) - 1, new Integer(xx[2]));
+ date = xx[0] + "-W" + cal.get(Calendar.WEEK_OF_YEAR);
+ break;
+ case 2:
+ date = date.substring(0, 7);
+ break;
+ case 3:
+ date = date.substring(0, 4);
+ break;
+ }
+ JSONObject datemap = jo.optJSONObject(date);
+ if (datemap == null) {
+ datemap = new JSONObject();
+ jo.put(date, datemap);
+ }
+ int feed = Integer.parseInt(tt[2]);
+ JSONObject feedmap = datemap.optJSONObject("" + feed);
+ if (feedmap == null) {
+ feedmap = new JSONObject();
+ feedmap.put("pubcount", 0);
+ datemap.put("" + feed, feedmap);
+ }
+ String type = tt[1];
+ int count = Integer.parseInt(tt[4]);
+ if (type.equals("pub")) {
+ try {
+ int n = feedmap.getInt("pubcount");
+ feedmap.put("pubcount", n + count);
+ } catch (JSONException e) {
+ feedmap.put("pubcount", count);
+ }
+ } else if (type.equals("del")) {
+ String subid = tt[3];
+ try {
+ int n = feedmap.getInt(subid);
+ feedmap.put(subid, n + count);
+ } catch (JSONException e) {
+ feedmap.put(subid, count);
+ }
+ }
+ }
+ line = lr.readLine();
+ }
+ lr.close();
+ String t = toHTML(jo);
+ switch (rtype) {
+ case 1:
+ t = t.replaceAll("<th>Date</th>", "<th>Week</th>");
+ break;
+ case 2:
+ t = t.replaceAll("<th>Date</th>", "<th>Month</th>");
+ break;
+ case 3:
+ t = t.replaceAll("<th>Date</th>", "<th>Year</th>");
+ break;
+ }
+ System.out.println(t);
+ } catch (Exception e) {
+ System.err.println(e);
+ e.printStackTrace();
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/LatencyReport.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/LatencyReport.java
index c213c03d..ba8f15a0 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/LatencyReport.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/LatencyReport.java
@@ -7,9 +7,9 @@
* * 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.
@@ -54,126 +54,136 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: LatencyReport.java,v 1.1 2013/10/28 18:06:53 eby Exp $
*/
public class LatencyReport extends ReportBase {
- private static final String SELECT_SQL =
- "select EVENT_TIME, TYPE, PUBLISH_ID, FEED_FILEID, FEEDID, CONTENT_LENGTH from LOG_RECORDS" +
- " where EVENT_TIME >= ? and EVENT_TIME <= ? order by PUBLISH_ID, EVENT_TIME";
-
- private class Event {
- public final String type;
- public final long time;
- public Event(String t, long tm) {
- type = t;
- time = tm;
- }
- }
- private class Counters {
- public final String id;
- public final int feedid;
- public final long clen;
- public final String fileid;
- public final List<Event> events;
- public Counters(String i, int fid, long c, String s) {
- id = i;
- feedid = fid;
- clen = c;
- fileid = s;
- events = new ArrayList<Event>();
- }
- private long pubtime;
- public void addEvent(String t, long tm) {
- events.add(new Event(t, tm));
- if (t.equals("pub"))
- pubtime = tm;
- }
- public long min() {
- long min = Long.MAX_VALUE;
- for (Event e : events) {
- if (e.type.equals("del")) {
- min = Math.min(min, e.time - pubtime);
- }
- }
- return min;
- }
- public long max() {
- long max = 0;
- for (Event e : events) {
- if (e.type.equals("del")) {
- max = Math.max(max, e.time - pubtime);
- }
- }
- return max;
- }
- public long avg() {
- long total = 0, c = 0;
- for (Event e : events) {
- if (e.type.equals("del")) {
- total += e.time - pubtime;
- c++;
- }
- }
- return (c == 0) ? 0 : total/c;
- }
- public int fanout() {
- int n = 0;
- for (Event e : events) {
- if (e.type.equals("del")) {
- n++;
- }
- }
- return n;
- }
- @Override
- public String toString() {
- return feedid + "," + fileid + "," + clen + "," + min() + "," + max() + "," + avg() + "," + fanout();
- }
- }
-
- @Override
- public void run() {
- long start = System.currentTimeMillis();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
- ps.setLong(1, from);
- ps.setLong(2, to);
- ResultSet rs = ps.executeQuery();
- PrintWriter os = new PrintWriter(outfile);
- os.println("recordid,feedid,uri,size,min,max,avg,fanout");
- Counters c = null;
- while (rs.next()) {
- long etime = rs.getLong("EVENT_TIME");
- String type = rs.getString("TYPE");
- String id = rs.getString("PUBLISH_ID");
- String fid = rs.getString("FEED_FILEID");
- int feed = rs.getInt("FEEDID");
- long clen = rs.getLong("CONTENT_LENGTH");
- if (c != null && !id.equals(c.id)) {
- String line = id + "," + c.toString();
- os.println(line);
- c = null;
- }
- if (c == null) {
- c = new Counters(id, feed, clen, fid);
- }
- if (feed != c.feedid)
- System.err.println("Feed ID mismatch, "+feed+" <=> "+c.feedid);
- if (clen != c.clen)
- System.err.println("Cont Len mismatch, "+clen+" <=> "+c.clen);
-// if (fid != c.fileid)
-// System.err.println("File ID mismatch, "+fid+" <=> "+c.fileid);
- c.addEvent(type, etime);
- }
- rs.close();
- ps.close();
- db.release(conn);
- os.close();
- } catch (FileNotFoundException e) {
- System.err.println("File cannot be written: "+outfile);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");
- }
+ private static final String SELECT_SQL =
+ "select EVENT_TIME, TYPE, PUBLISH_ID, FEED_FILEID, FEEDID, CONTENT_LENGTH from LOG_RECORDS" +
+ " where EVENT_TIME >= ? and EVENT_TIME <= ? order by PUBLISH_ID, EVENT_TIME";
+
+ private class Event {
+ public final String type;
+ public final long time;
+
+ public Event(String t, long tm) {
+ type = t;
+ time = tm;
+ }
+ }
+
+ private class Counters {
+ public final String id;
+ public final int feedid;
+ public final long clen;
+ public final String fileid;
+ public final List<Event> events;
+
+ public Counters(String i, int fid, long c, String s) {
+ id = i;
+ feedid = fid;
+ clen = c;
+ fileid = s;
+ events = new ArrayList<Event>();
+ }
+
+ private long pubtime;
+
+ public void addEvent(String t, long tm) {
+ events.add(new Event(t, tm));
+ if (t.equals("pub"))
+ pubtime = tm;
+ }
+
+ public long min() {
+ long min = Long.MAX_VALUE;
+ for (Event e : events) {
+ if (e.type.equals("del")) {
+ min = Math.min(min, e.time - pubtime);
+ }
+ }
+ return min;
+ }
+
+ public long max() {
+ long max = 0;
+ for (Event e : events) {
+ if (e.type.equals("del")) {
+ max = Math.max(max, e.time - pubtime);
+ }
+ }
+ return max;
+ }
+
+ public long avg() {
+ long total = 0, c = 0;
+ for (Event e : events) {
+ if (e.type.equals("del")) {
+ total += e.time - pubtime;
+ c++;
+ }
+ }
+ return (c == 0) ? 0 : total / c;
+ }
+
+ public int fanout() {
+ int n = 0;
+ for (Event e : events) {
+ if (e.type.equals("del")) {
+ n++;
+ }
+ }
+ return n;
+ }
+
+ @Override
+ public String toString() {
+ return feedid + "," + fileid + "," + clen + "," + min() + "," + max() + "," + avg() + "," + fanout();
+ }
+ }
+
+ @Override
+ public void run() {
+ long start = System.currentTimeMillis();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
+ ps.setLong(1, from);
+ ps.setLong(2, to);
+ ResultSet rs = ps.executeQuery();
+ PrintWriter os = new PrintWriter(outfile);
+ os.println("recordid,feedid,uri,size,min,max,avg,fanout");
+ Counters c = null;
+ while (rs.next()) {
+ long etime = rs.getLong("EVENT_TIME");
+ String type = rs.getString("TYPE");
+ String id = rs.getString("PUBLISH_ID");
+ String fid = rs.getString("FEED_FILEID");
+ int feed = rs.getInt("FEEDID");
+ long clen = rs.getLong("CONTENT_LENGTH");
+ if (c != null && !id.equals(c.id)) {
+ String line = id + "," + c.toString();
+ os.println(line);
+ c = null;
+ }
+ if (c == null) {
+ c = new Counters(id, feed, clen, fid);
+ }
+ if (feed != c.feedid)
+ System.err.println("Feed ID mismatch, " + feed + " <=> " + c.feedid);
+ if (clen != c.clen)
+ System.err.println("Cont Len mismatch, " + clen + " <=> " + c.clen);
+// if (fid != c.fileid)
+// System.err.println("File ID mismatch, "+fid+" <=> "+c.fileid);
+ c.addEvent(type, etime);
+ }
+ rs.close();
+ ps.close();
+ db.release(conn);
+ os.close();
+ } catch (FileNotFoundException e) {
+ System.err.println("File cannot be written: " + outfile);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ logger.debug("Query time: " + (System.currentTimeMillis() - start) + " ms");
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/Report.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/Report.java
index f4e0255e..67e15963 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/Report.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/Report.java
@@ -7,9 +7,9 @@
* * 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.
@@ -36,120 +36,121 @@ import java.util.TimeZone;
* @version $Id: Report.java,v 1.2 2013/11/06 16:23:55 eby Exp $
*/
public class Report {
- /**
- * Generate .csv report files from the database. Usage:
- * <pre>
- * java org.onap.dmaap.datarouter.reports.Report [ -t <i>type</i> ] [ -o <i>outfile</i> ] [ <i>fromdate</i> [ <i>todate</i> ]]
- * </pre>
- * <i>type</i> should be <b>volume</b> for a {@link VolumeReport},
- * <b>feed</b> for a {@link FeedReport},
- * <b>latency</b> for a {@link LatencyReport}, or
- * <b>dailyLatency</b> for a {@link DailyLatencyReport}.
- * If <i>outfile</i> is not specified, the report goes into a file <i>/tmp/nnnnnnnnnnnnn.csv</i>,
- * where nnnnnnnnnnnnn is the current time in milliseconds.
- * If <i>from</i> and <i>to</i> are not specified, then the report is limited to the last weeks worth of data.
- * <i>from</i> can be the keyword <b>ALL</b> to specify all data in the DB, or the keyword <b>yesterday</b>.
- * Otherwise, <i>from</i> and <i>to</i> should match the pattern YYYY-MM-DD.
- * @param args the command line arguments
- */
- public static void main(String[] args) {
- ReportBase report = new VolumeReport();
- String outfile = "/tmp/" + System.currentTimeMillis() + ".csv";
- String from = null, to = null;
+ /**
+ * Generate .csv report files from the database. Usage:
+ * <pre>
+ * java org.onap.dmaap.datarouter.reports.Report [ -t <i>type</i> ] [ -o <i>outfile</i> ] [ <i>fromdate</i> [ <i>todate</i> ]]
+ * </pre>
+ * <i>type</i> should be <b>volume</b> for a {@link VolumeReport},
+ * <b>feed</b> for a {@link FeedReport},
+ * <b>latency</b> for a {@link LatencyReport}, or
+ * <b>dailyLatency</b> for a {@link DailyLatencyReport}.
+ * If <i>outfile</i> is not specified, the report goes into a file <i>/tmp/nnnnnnnnnnnnn.csv</i>,
+ * where nnnnnnnnnnnnn is the current time in milliseconds.
+ * If <i>from</i> and <i>to</i> are not specified, then the report is limited to the last weeks worth of data.
+ * <i>from</i> can be the keyword <b>ALL</b> to specify all data in the DB, or the keyword <b>yesterday</b>.
+ * Otherwise, <i>from</i> and <i>to</i> should match the pattern YYYY-MM-DD.
+ *
+ * @param args the command line arguments
+ */
+ public static void main(String[] args) {
+ ReportBase report = new VolumeReport();
+ String outfile = "/tmp/" + System.currentTimeMillis() + ".csv";
+ String from = null, to = null;
- for (int i = 0; i < args.length; i++) {
- if (args[i].equals("-?")) {
- System.err.println("usage: java org.onap.dmaap.datarouter.reports.Report [ -t <i>type</i> ] [ -o <i>outfile</i> ] [ <i>fromdate</i> [ <i>todate</i> ]]");
- System.exit(0);
- } else if (args[i].equals("-o")) {
- if (++i < args.length) {
- outfile = args[i];
- }
- } else if (args[i].equals("-t")) {
- if (++i < args.length) {
- String base = args[i];
- base = Character.toUpperCase(base.charAt(0)) + base.substring(1);
- base = "org.onap.dmaap.datarouter.reports."+base+"Report";
- try {
- @SuppressWarnings("unchecked")
- Class<? extends ReportBase> cl = (Class<? extends ReportBase>) Class.forName(base);
- Constructor<? extends ReportBase> con = cl.getConstructor();
- report = con.newInstance();
- } catch (Exception e) {
- System.err.println("Unknown report type: "+args[i]);
- System.exit(1);
- }
- }
- } else if (from == null) {
- from = args[i];
- } else {
- to = args[i];
- }
- }
- long lfrom = 0, lto = 0;
- if (from == null) {
- // last 7 days
- TimeZone utc = TimeZone.getTimeZone("UTC");
- Calendar cal = new GregorianCalendar(utc);
- cal.set(Calendar.HOUR_OF_DAY, 0);
- cal.set(Calendar.MINUTE, 0);
- cal.set(Calendar.SECOND, 0);
- cal.set(Calendar.MILLISECOND, 0);
- lfrom = cal.getTimeInMillis() - (7 * 24 * 60 * 60 * 1000L); // 1 week
- lto = cal.getTimeInMillis() - 1;
- } else if (to == null) {
- try {
- String[] dates = getDates(from);
- lfrom = Long.parseLong(dates[0]);
- lto = Long.parseLong(dates[1]);
- } catch (Exception e) {
- System.err.println("Invalid date: "+from);
- System.exit(1);
- }
- } else {
- String[] dates;
- try {
- dates = getDates(from);
- lfrom = Long.parseLong(dates[0]);
- } catch (Exception e) {
- System.err.println("Invalid date: "+from);
- System.exit(1);
- }
- try {
- dates = getDates(to);
- lto = Long.parseLong(dates[0]);
- } catch (Exception e) {
- System.err.println("Invalid date: "+to);
- System.exit(1);
- }
- }
+ for (int i = 0; i < args.length; i++) {
+ if (args[i].equals("-?")) {
+ System.err.println("usage: java org.onap.dmaap.datarouter.reports.Report [ -t <i>type</i> ] [ -o <i>outfile</i> ] [ <i>fromdate</i> [ <i>todate</i> ]]");
+ System.exit(0);
+ } else if (args[i].equals("-o")) {
+ if (++i < args.length) {
+ outfile = args[i];
+ }
+ } else if (args[i].equals("-t")) {
+ if (++i < args.length) {
+ String base = args[i];
+ base = Character.toUpperCase(base.charAt(0)) + base.substring(1);
+ base = "org.onap.dmaap.datarouter.reports." + base + "Report";
+ try {
+ @SuppressWarnings("unchecked")
+ Class<? extends ReportBase> cl = (Class<? extends ReportBase>) Class.forName(base);
+ Constructor<? extends ReportBase> con = cl.getConstructor();
+ report = con.newInstance();
+ } catch (Exception e) {
+ System.err.println("Unknown report type: " + args[i]);
+ System.exit(1);
+ }
+ }
+ } else if (from == null) {
+ from = args[i];
+ } else {
+ to = args[i];
+ }
+ }
+ long lfrom = 0, lto = 0;
+ if (from == null) {
+ // last 7 days
+ TimeZone utc = TimeZone.getTimeZone("UTC");
+ Calendar cal = new GregorianCalendar(utc);
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ lfrom = cal.getTimeInMillis() - (7 * 24 * 60 * 60 * 1000L); // 1 week
+ lto = cal.getTimeInMillis() - 1;
+ } else if (to == null) {
+ try {
+ String[] dates = getDates(from);
+ lfrom = Long.parseLong(dates[0]);
+ lto = Long.parseLong(dates[1]);
+ } catch (Exception e) {
+ System.err.println("Invalid date: " + from);
+ System.exit(1);
+ }
+ } else {
+ String[] dates;
+ try {
+ dates = getDates(from);
+ lfrom = Long.parseLong(dates[0]);
+ } catch (Exception e) {
+ System.err.println("Invalid date: " + from);
+ System.exit(1);
+ }
+ try {
+ dates = getDates(to);
+ lto = Long.parseLong(dates[0]);
+ } catch (Exception e) {
+ System.err.println("Invalid date: " + to);
+ System.exit(1);
+ }
+ }
- report.setFrom(lfrom);
- report.setTo(lto);
- report.setOutputFile(outfile);
- report.run();
- }
+ report.setFrom(lfrom);
+ report.setTo(lto);
+ report.setOutputFile(outfile);
+ report.run();
+ }
- private static String[] getDates(String d) throws Exception {
- if (d.equals("ALL"))
- return new String[] { "1", ""+System.currentTimeMillis() };
+ private static String[] getDates(String d) throws Exception {
+ if (d.equals("ALL"))
+ return new String[]{"1", "" + System.currentTimeMillis()};
- TimeZone utc = TimeZone.getTimeZone("UTC");
- Calendar cal = new GregorianCalendar(utc);
- if (d.matches("20\\d\\d-\\d\\d-\\d\\d")) {
- cal.set(Calendar.YEAR, Integer.parseInt(d.substring(0, 4)));
- cal.set(Calendar.MONTH, Integer.parseInt(d.substring(5, 7))-1);
- cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(d.substring(8, 10)));
- } else if (d.equals("yesterday")) {
- cal.add(Calendar.DAY_OF_YEAR, -1);
- } else
- throw new Exception("wa?");
- cal.set(Calendar.HOUR_OF_DAY, 0);
- cal.set(Calendar.MINUTE, 0);
- cal.set(Calendar.SECOND, 0);
- cal.set(Calendar.MILLISECOND, 0);
- long start = cal.getTimeInMillis();
- long end = start + (24 * 60 * 60 * 1000L) - 1;
- return new String[] { ""+start, ""+end };
- }
+ TimeZone utc = TimeZone.getTimeZone("UTC");
+ Calendar cal = new GregorianCalendar(utc);
+ if (d.matches("20\\d\\d-\\d\\d-\\d\\d")) {
+ cal.set(Calendar.YEAR, Integer.parseInt(d.substring(0, 4)));
+ cal.set(Calendar.MONTH, Integer.parseInt(d.substring(5, 7)) - 1);
+ cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(d.substring(8, 10)));
+ } else if (d.equals("yesterday")) {
+ cal.add(Calendar.DAY_OF_YEAR, -1);
+ } else
+ throw new Exception("wa?");
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ long start = cal.getTimeInMillis();
+ long end = start + (24 * 60 * 60 * 1000L) - 1;
+ return new String[]{"" + start, "" + end};
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/ReportBase.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/ReportBase.java
index 15f056d2..d24866c3 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/ReportBase.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/ReportBase.java
@@ -7,9 +7,9 @@
* * 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.
@@ -32,32 +32,32 @@ import org.apache.log4j.Logger;
* @version $Id: ReportBase.java,v 1.1 2013/10/28 18:06:53 eby Exp $
*/
abstract public class ReportBase implements Runnable {
- protected long from, to;
- protected String outfile;
- protected Logger logger;
-
- public ReportBase() {
- this.from = 0;
- this.to = System.currentTimeMillis();
- this.logger = Logger.getLogger("org.onap.dmaap.datarouter.reports");
- }
-
- public void setFrom(long from) {
- this.from = from;
- }
-
- public void setTo(long to) {
- this.to = to;
- }
-
- public String getOutfile() {
- return outfile;
- }
-
- public void setOutputFile(String s) {
- this.outfile = s;
- }
-
- @Override
- abstract public void run();
+ protected long from, to;
+ protected String outfile;
+ protected Logger logger;
+
+ public ReportBase() {
+ this.from = 0;
+ this.to = System.currentTimeMillis();
+ this.logger = Logger.getLogger("org.onap.dmaap.datarouter.reports");
+ }
+
+ public void setFrom(long from) {
+ this.from = from;
+ }
+
+ public void setTo(long to) {
+ this.to = to;
+ }
+
+ public String getOutfile() {
+ return outfile;
+ }
+
+ public void setOutputFile(String s) {
+ this.outfile = s;
+ }
+
+ @Override
+ abstract public void run();
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/SubscriberReport.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/SubscriberReport.java
index 5d62e1ec..e00c3944 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/SubscriberReport.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/SubscriberReport.java
@@ -7,9 +7,9 @@
* * 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.
@@ -44,114 +44,118 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: SubscriberReport.java,v 1.2 2013/11/06 16:23:55 eby Exp $
*/
public class SubscriberReport extends ReportBase {
- private static final String SELECT_SQL =
- "select date(from_unixtime(EVENT_TIME div 1000)) as DATE, DELIVERY_SUBID, RESULT, COUNT(RESULT) as COUNT" +
- " from LOG_RECORDS" +
- " where TYPE = 'del' and EVENT_TIME >= ? and EVENT_TIME <= ?" +
- " group by DATE, DELIVERY_SUBID, RESULT";
- private static final String SELECT_SQL2 =
- "select date(from_unixtime(EVENT_TIME div 1000)) as DATE, DELIVERY_SUBID, COUNT(CONTENT_LENGTH_2) as COUNT" +
- " from LOG_RECORDS" +
- " where TYPE = 'dlx' and CONTENT_LENGTH_2 = -1 and EVENT_TIME >= ? and EVENT_TIME <= ?" +
- " group by DATE, DELIVERY_SUBID";
+ private static final String SELECT_SQL =
+ "select date(from_unixtime(EVENT_TIME div 1000)) as DATE, DELIVERY_SUBID, RESULT, COUNT(RESULT) as COUNT" +
+ " from LOG_RECORDS" +
+ " where TYPE = 'del' and EVENT_TIME >= ? and EVENT_TIME <= ?" +
+ " group by DATE, DELIVERY_SUBID, RESULT";
+ private static final String SELECT_SQL2 =
+ "select date(from_unixtime(EVENT_TIME div 1000)) as DATE, DELIVERY_SUBID, COUNT(CONTENT_LENGTH_2) as COUNT" +
+ " from LOG_RECORDS" +
+ " where TYPE = 'dlx' and CONTENT_LENGTH_2 = -1 and EVENT_TIME >= ? and EVENT_TIME <= ?" +
+ " group by DATE, DELIVERY_SUBID";
+
+ private class Counters {
+ private String date;
+ private int sub;
+ private int c100, c200, c300, c400, c500, cm1, cdlx;
+
+ public Counters(String date, int sub) {
+ this.date = date;
+ this.sub = sub;
+ c100 = c200 = c300 = c400 = c500 = cm1 = cdlx = 0;
+ }
+
+ public void addCounts(int status, int n) {
+ if (status < 0) {
+ cm1 += n;
+ } else if (status >= 100 && status <= 199) {
+ c100 += n;
+ } else if (status >= 200 && status <= 299) {
+ c200 += n;
+ } else if (status >= 300 && status <= 399) {
+ c300 += n;
+ } else if (status >= 400 && status <= 499) {
+ c400 += n;
+ } else if (status >= 500 && status <= 599) {
+ c500 += n;
+ }
+ }
+
+ public void addDlxCount(int n) {
+ cdlx += n;
+ }
- private class Counters {
- private String date;
- private int sub;
- private int c100, c200, c300, c400, c500, cm1, cdlx;
- public Counters(String date, int sub) {
- this.date = date;
- this.sub = sub;
- c100 = c200 = c300 = c400 = c500 = cm1 = cdlx = 0;
- }
- public void addCounts(int status, int n) {
- if (status < 0) {
- cm1 += n;
- } else if (status >= 100 && status <= 199) {
- c100 += n;
- } else if (status >= 200 && status <= 299) {
- c200 += n;
- } else if (status >= 300 && status <= 399) {
- c300 += n;
- } else if (status >= 400 && status <= 499) {
- c400 += n;
- } else if (status >= 500 && status <= 599) {
- c500 += n;
- }
- }
- public void addDlxCount(int n) {
- cdlx += n;
- }
- @Override
- public String toString() {
- return date + "," + sub + "," +
- c100 + "," + c200 + "," + c300 + "," + c400 + "," + c500 + "," +
- cm1 + "," + cdlx;
- }
- }
+ @Override
+ public String toString() {
+ return date + "," + sub + "," +
+ c100 + "," + c200 + "," + c300 + "," + c400 + "," + c500 + "," +
+ cm1 + "," + cdlx;
+ }
+ }
- @Override
- public void run() {
- Map<String, Counters> map = new HashMap<String, Counters>();
- long start = System.currentTimeMillis();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
- ps.setLong(1, from);
- ps.setLong(2, to);
- ResultSet rs = ps.executeQuery();
- while (rs.next()) {
- String date = rs.getString("DATE");
- int sub = rs.getInt("DELIVERY_SUBID");
- int res = rs.getInt("RESULT");
- int count = rs.getInt("COUNT");
- String key = date + "," + sub;
- Counters c = map.get(key);
- if (c == null) {
- c = new Counters(date, sub);
- map.put(key, c);
- }
- c.addCounts(res, count);
- }
- rs.close();
- ps.close();
+ @Override
+ public void run() {
+ Map<String, Counters> map = new HashMap<String, Counters>();
+ long start = System.currentTimeMillis();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
+ ps.setLong(1, from);
+ ps.setLong(2, to);
+ ResultSet rs = ps.executeQuery();
+ while (rs.next()) {
+ String date = rs.getString("DATE");
+ int sub = rs.getInt("DELIVERY_SUBID");
+ int res = rs.getInt("RESULT");
+ int count = rs.getInt("COUNT");
+ String key = date + "," + sub;
+ Counters c = map.get(key);
+ if (c == null) {
+ c = new Counters(date, sub);
+ map.put(key, c);
+ }
+ c.addCounts(res, count);
+ }
+ rs.close();
+ ps.close();
- ps = conn.prepareStatement(SELECT_SQL2);
- ps.setLong(1, from);
- ps.setLong(2, to);
- rs = ps.executeQuery();
- while (rs.next()) {
- String date = rs.getString("DATE");
- int sub = rs.getInt("DELIVERY_SUBID");
- int count = rs.getInt("COUNT");
- String key = date + "," + sub;
- Counters c = map.get(key);
- if (c == null) {
- c = new Counters(date, sub);
- map.put(key, c);
- }
- c.addDlxCount(count);
- }
- rs.close();
- ps.close();
+ ps = conn.prepareStatement(SELECT_SQL2);
+ ps.setLong(1, from);
+ ps.setLong(2, to);
+ rs = ps.executeQuery();
+ while (rs.next()) {
+ String date = rs.getString("DATE");
+ int sub = rs.getInt("DELIVERY_SUBID");
+ int count = rs.getInt("COUNT");
+ String key = date + "," + sub;
+ Counters c = map.get(key);
+ if (c == null) {
+ c = new Counters(date, sub);
+ map.put(key, c);
+ }
+ c.addDlxCount(count);
+ }
+ rs.close();
+ ps.close();
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");
- try {
- PrintWriter os = new PrintWriter(outfile);
- os.println("date,subid,count100,count200,count300,count400,count500,countminus1,countdlx");
- for (String key : new TreeSet<String>(map.keySet())) {
- Counters c = map.get(key);
- os.println(c.toString());
- }
- os.close();
- } catch (FileNotFoundException e) {
- System.err.println("File cannot be written: "+outfile);
- }
- }
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ logger.debug("Query time: " + (System.currentTimeMillis() - start) + " ms");
+ try {
+ PrintWriter os = new PrintWriter(outfile);
+ os.println("date,subid,count100,count200,count300,count400,count500,countminus1,countdlx");
+ for (String key : new TreeSet<String>(map.keySet())) {
+ Counters c = map.get(key);
+ os.println(c.toString());
+ }
+ os.close();
+ } catch (FileNotFoundException e) {
+ System.err.println("File cannot be written: " + outfile);
+ }
+ }
}
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/VolumeReport.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/VolumeReport.java
index b210ef9f..169db0d2 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/VolumeReport.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/reports/VolumeReport.java
@@ -7,9 +7,9 @@
* * 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.
@@ -55,86 +55,87 @@ import org.onap.dmaap.datarouter.provisioning.utils.DB;
* @version $Id: VolumeReport.java,v 1.3 2014/02/28 15:11:13 eby Exp $
*/
public class VolumeReport extends ReportBase {
- private static final String SELECT_SQL = "select EVENT_TIME, TYPE, FEEDID, CONTENT_LENGTH, RESULT" +
- " from LOG_RECORDS where EVENT_TIME >= ? and EVENT_TIME <= ? LIMIT ?, ?";
+ private static final String SELECT_SQL = "select EVENT_TIME, TYPE, FEEDID, CONTENT_LENGTH, RESULT" +
+ " from LOG_RECORDS where EVENT_TIME >= ? and EVENT_TIME <= ? LIMIT ?, ?";
+
+ private class Counters {
+ public int filespublished, filesdelivered, filesexpired;
+ public long bytespublished, bytesdelivered, bytesexpired;
- private class Counters {
- public int filespublished, filesdelivered, filesexpired;
- public long bytespublished, bytesdelivered, bytesexpired;
- @Override
- public String toString() {
- return String.format("%d,%d,%d,%d,%d,%d",
- filespublished, bytespublished, filesdelivered,
- bytesdelivered, filesexpired, bytesexpired);
- }
- }
+ @Override
+ public String toString() {
+ return String.format("%d,%d,%d,%d,%d,%d",
+ filespublished, bytespublished, filesdelivered,
+ bytesdelivered, filesexpired, bytesexpired);
+ }
+ }
- @Override
- public void run() {
- Map<String, Counters> map = new HashMap<String, Counters>();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- long start = System.currentTimeMillis();
- try {
- DB db = new DB();
- @SuppressWarnings("resource")
- Connection conn = db.getConnection();
- // We need to run this SELECT in stages, because otherwise we run out of memory!
- final long stepsize = 6000000L;
- boolean go_again = true;
- for (long i = 0; go_again; i += stepsize) {
- PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
- ps.setLong(1, from);
- ps.setLong(2, to);
- ps.setLong(3, i);
- ps.setLong(4, stepsize);
- ResultSet rs = ps.executeQuery();
- go_again = false;
- while (rs.next()) {
- go_again = true;
- long etime = rs.getLong("EVENT_TIME");
- String type = rs.getString("TYPE");
- int feed = rs.getInt("FEEDID");
- long clen = rs.getLong("CONTENT_LENGTH");
- String key = sdf.format(new Date(etime)) + ":" + feed;
- Counters c = map.get(key);
- if (c == null) {
- c = new Counters();
- map.put(key, c);
- }
- if (type.equalsIgnoreCase("pub")) {
- c.filespublished++;
- c.bytespublished += clen;
- } else if (type.equalsIgnoreCase("del")) {
- // Only count successful deliveries
- int statusCode = rs.getInt("RESULT");
- if (statusCode >= 200 && statusCode < 300) {
- c.filesdelivered++;
- c.bytesdelivered += clen;
- }
- } else if (type.equalsIgnoreCase("exp")) {
- c.filesexpired++;
- c.bytesexpired += clen;
- }
- }
- rs.close();
- ps.close();
- }
- db.release(conn);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- logger.debug("Query time: " + (System.currentTimeMillis()-start) + " ms");
- try {
- PrintWriter os = new PrintWriter(outfile);
- os.println("date,feedid,filespublished,bytespublished,filesdelivered,bytesdelivered,filesexpired,bytesexpired");
- for (String key : new TreeSet<String>(map.keySet())) {
- Counters c = map.get(key);
- String[] p = key.split(":");
- os.println(String.format("%s,%s,%s", p[0], p[1], c.toString()));
- }
- os.close();
- } catch (FileNotFoundException e) {
- System.err.println("File cannot be written: "+outfile);
- }
- }
+ @Override
+ public void run() {
+ Map<String, Counters> map = new HashMap<String, Counters>();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ long start = System.currentTimeMillis();
+ try {
+ DB db = new DB();
+ @SuppressWarnings("resource")
+ Connection conn = db.getConnection();
+ // We need to run this SELECT in stages, because otherwise we run out of memory!
+ final long stepsize = 6000000L;
+ boolean go_again = true;
+ for (long i = 0; go_again; i += stepsize) {
+ PreparedStatement ps = conn.prepareStatement(SELECT_SQL);
+ ps.setLong(1, from);
+ ps.setLong(2, to);
+ ps.setLong(3, i);
+ ps.setLong(4, stepsize);
+ ResultSet rs = ps.executeQuery();
+ go_again = false;
+ while (rs.next()) {
+ go_again = true;
+ long etime = rs.getLong("EVENT_TIME");
+ String type = rs.getString("TYPE");
+ int feed = rs.getInt("FEEDID");
+ long clen = rs.getLong("CONTENT_LENGTH");
+ String key = sdf.format(new Date(etime)) + ":" + feed;
+ Counters c = map.get(key);
+ if (c == null) {
+ c = new Counters();
+ map.put(key, c);
+ }
+ if (type.equalsIgnoreCase("pub")) {
+ c.filespublished++;
+ c.bytespublished += clen;
+ } else if (type.equalsIgnoreCase("del")) {
+ // Only count successful deliveries
+ int statusCode = rs.getInt("RESULT");
+ if (statusCode >= 200 && statusCode < 300) {
+ c.filesdelivered++;
+ c.bytesdelivered += clen;
+ }
+ } else if (type.equalsIgnoreCase("exp")) {
+ c.filesexpired++;
+ c.bytesexpired += clen;
+ }
+ }
+ rs.close();
+ ps.close();
+ }
+ db.release(conn);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ logger.debug("Query time: " + (System.currentTimeMillis() - start) + " ms");
+ try {
+ PrintWriter os = new PrintWriter(outfile);
+ os.println("date,feedid,filespublished,bytespublished,filesdelivered,bytesdelivered,filesexpired,bytesexpired");
+ for (String key : new TreeSet<String>(map.keySet())) {
+ Counters c = map.get(key);
+ String[] p = key.split(":");
+ os.println(String.format("%s,%s,%s", p[0], p[1], c.toString()));
+ }
+ os.close();
+ } catch (FileNotFoundException e) {
+ System.err.println("File cannot be written: " + outfile);
+ }
+ }
}
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/addFeed3.txt b/datarouter-prov/src/main/resources/docker-compose/prov_data/addFeed3.txt
index 03eabb7d..21000d0a 100644
--- a/datarouter-prov/src/main/resources/docker-compose/prov_data/addFeed3.txt
+++ b/datarouter-prov/src/main/resources/docker-compose/prov_data/addFeed3.txt
@@ -1,44 +1,44 @@
-#-------------------------------------------------------------------------------
-# ============LICENSE_START==================================================
-# * org.onap.dmaap
-# * ===========================================================================
-# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
-# * ===========================================================================
-# * Licensed under the Apache License, Version 2.0 (the "License");
-# * you may not use this file except in compliance with the License.
-# * You may obtain a copy of the License at
-# *
-# * http://www.apache.org/licenses/LICENSE-2.0
-# *
-# * Unless required by applicable law or agreed to in writing, software
-# * distributed under the License is distributed on an "AS IS" BASIS,
-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# * See the License for the specific language governing permissions and
-# * limitations under the License.
-# * ============LICENSE_END====================================================
-# *
-# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
-# *
-#-------------------------------------------------------------------------------
-{
- "name": "Jettydemo",
- "version": "m1.0",
- "description": "Jettydemo",
- "business_description": "Jettydemo",
- "suspend": false,
- "deleted": false,
- "changeowner": true,
- "authorization": {
- "classification": "unclassified",
- "endpoint_addrs": [
- "172.100.0.3",
- ],
- "endpoint_ids": [
- {
- "password": "rs873m",
- "id": "rs873m"
- }
- ]
- },
-}
-
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+{
+ "name": "Jettydemo",
+ "version": "m1.0",
+ "description": "Jettydemo",
+ "business_description": "Jettydemo",
+ "suspend": false,
+ "deleted": false,
+ "changeowner": true,
+ "authorization": {
+ "classification": "unclassified",
+ "endpoint_addrs": [
+ "172.100.0.3",
+ ],
+ "endpoint_ids": [
+ {
+ "password": "rs873m",
+ "id": "rs873m"
+ }
+ ]
+ },
+}
+
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/addSubscriber.txt b/datarouter-prov/src/main/resources/docker-compose/prov_data/addSubscriber.txt
index 15ca3095..45e12732 100644
--- a/datarouter-prov/src/main/resources/docker-compose/prov_data/addSubscriber.txt
+++ b/datarouter-prov/src/main/resources/docker-compose/prov_data/addSubscriber.txt
@@ -1,36 +1,36 @@
-#-------------------------------------------------------------------------------
-# ============LICENSE_START==================================================
-# * org.onap.dmaap
-# * ===========================================================================
-# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
-# * ===========================================================================
-# * Licensed under the Apache License, Version 2.0 (the "License");
-# * you may not use this file except in compliance with the License.
-# * You may obtain a copy of the License at
-# *
-# * http://www.apache.org/licenses/LICENSE-2.0
-# *
-# * Unless required by applicable law or agreed to in writing, software
-# * distributed under the License is distributed on an "AS IS" BASIS,
-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# * See the License for the specific language governing permissions and
-# * limitations under the License.
-# * ============LICENSE_END====================================================
-# *
-# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
-# *
-#-------------------------------------------------------------------------------
-{
- "delivery" :
-
- {
- "url" : "http://172.100.0.3:7070/",
- "user" : "datarouter",
- "password" : "datarouter",
- "use100" : true
- },
- "metadataOnly" : false,
- "suspend" : false,
- "groupid" : 29,
- "subscriber" : "sg481n"
-}
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+{
+ "delivery" :
+
+ {
+ "url" : "http://172.100.0.3:7070/",
+ "user" : "datarouter",
+ "password" : "datarouter",
+ "use100" : true
+ },
+ "metadataOnly" : false,
+ "suspend" : false,
+ "groupid" : 29,
+ "subscriber" : "sg481n"
+}
diff --git a/datarouter-prov/src/main/resources/logback.xml b/datarouter-prov/src/main/resources/logback.xml
index a9655154..e3d17128 100644
--- a/datarouter-prov/src/main/resources/logback.xml
+++ b/datarouter-prov/src/main/resources/logback.xml
@@ -1,405 +1,405 @@
-<!--
- ============LICENSE_START==================================================
- * org.onap.dmaap
- * ===========================================================================
- * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * ===========================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END====================================================
- *
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- *
--->
-<configuration scan="true" scanPeriod="3 seconds" debug="true">
- <!--<jmxConfigurator /> -->
- <!-- directory path for all other type logs -->
- <!-- property name="logDir" value="/home/eby/dr2/logs" / -->
- <property name="logDir" value="/opt/app/datartr/logs" />
-
- <!-- directory path for debugging type logs -->
- <!-- property name="debugDir" value="/home/eby/dr2/debug-logs" /-->
-
- <!-- specify the component name
- <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC" -->
- <!-- This creates the MSO directory in in the LogDir which is not needed, mentioned last directory of the path-->
- <!-- property name="componentName" value="logs"></property -->
-
- <!-- log file names -->
- <property name="generalLogName" value="apicalls" />
- <!-- name="securityLogName" value="security" -->
- <!-- name="performanceLogName" value="performance" -->
- <!-- name="serverLogName" value="server" -->
- <!-- name="policyLogName" value="policy"-->
- <property name="errorLogName" value="errors" />
- <!-- name="metricsLogName" value="metrics" -->
- <!-- name="auditLogName" value="audit" -->
- <!-- name="debugLogName" value="debug" -->
- <property name="jettyLogName" value="jetty"></property>
- <property name="defaultPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%msg%n" />
- <property name="jettyLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%thread|%.-5level|%msg%n" />
-
- <property name="debugLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />
-
- <property name="logDirectory" value="${logDir}" />
- <!-- property name="debugLogDirectory" value="${debugDir}/${componentName}" /-->
-
-
- <!-- Example evaluator filter applied against console appender -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>${defaultPattern}</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>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>INFO</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${generalLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELF" />
- </appender>
-
- <!-- EELF Security Appender. This appender is used to record security events
- to the security log file. Security events are separate from other loggers
- in EELF so that security log records can be captured and managed in a secure
- way separate from the other logs. This appender is set to never discard any
- events. -->
- <!--appender name="EELFSecurity"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${securityLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${securityLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <discardingThreshold>0</discardingThreshold>
- <appender-ref ref="EELFSecurity" />
- </appender-->
-
- <!-- EELF Performance Appender. This appender is used to record performance
- records. -->
- <!--appender name="EELFPerformance"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${performanceLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <outputPatternAsHeader>true</outputPatternAsHeader>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPerformance" />
- </appender-->
-
- <!-- EELF Server Appender. This appender is used to record Server related
- logging events. The Server logger and appender are specializations of the
- EELF application root logger and appender. This can be used to segregate Server
- events from other components, or it can be eliminated to record these events
- as part of the application root log. -->
- <!--appender name="EELFServer"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${serverLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${serverLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFServer" />
- </appender-->
-
-
- <!-- EELF Policy Appender. This appender is used to record Policy engine
- related logging events. The Policy 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="EELFPolicy"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${policyLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${policyLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPolicy" >
- </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.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${auditLogName}.%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>${defaultPattern}</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.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${metricsLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
-
- <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFMetrics"/>
- </appender-->
-
- <appender name="EELFError"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${errorLogName}.log</file>
- <filter class="ch.qos.logback.classic.filter.LevelFilter">
- <level>ERROR</level>
- <onMatch>ACCEPT</onMatch>
- <onMismatch>DENY</onMismatch>
- </filter>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${errorLogName}.%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>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFError"/>
- </appender>
-
- <!-- ============================================================================ -->
- <appender name="jettylog"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${jettyLogName}.log</file>
- <filter class="org.onap.dmaap.datarouter.provisioning.eelf.JettyFilter" />
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${jettyLogName}.%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>${jettyLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFjettylog" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="jettylog" />
- <includeCallerData>true</includeCallerData>
- </appender>
-
- <!-- ============================================================================ -->
-
-
- <!--appender name="EELFDebug"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${debugLogDirectory}/${debugLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${debugLogDirectory}/${debugLogName}.%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>${debugLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFDebug" />
- <includeCallerData>true</includeCallerData>
- </appender-->
-
-
- <!-- ============================================================================ -->
- <!-- EELF loggers -->
- <!-- ============================================================================ -->
- <logger name="com.att.eelf" level="info" additivity="false">
- <appender-ref ref="asyncEELF" />
- </logger>
-
- <logger name="com.att.eelf.error" level="error" additivity="false">
- <appender-ref ref="asyncEELFError" />
- </logger>
-
- <logger name="log4j.logger.org.eclipse.jetty" additivity="false" level="info">
- <appender-ref ref="asyncEELFjettylog"/>
- </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>
-
- <logger name="com.att.eelf.debug" level="debug" additivity="false">
- <appender-ref ref="asyncEELFDebug" />
- </logger-->
-
-
-
-
- <root level="INFO">
- <appender-ref ref="asyncEELF" />
- <appender-ref ref="asyncEELFError" />
- <appender-ref ref="asyncEELFjettylog" />
- </root>
-
-</configuration>
+<!--
+ ============LICENSE_START==================================================
+ * org.onap.dmaap
+ * ===========================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ===========================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END====================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *
+-->
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+ <!--<jmxConfigurator /> -->
+ <!-- directory path for all other type logs -->
+ <!-- property name="logDir" value="/home/eby/dr2/logs" / -->
+ <property name="logDir" value="/opt/app/datartr/logs" />
+
+ <!-- directory path for debugging type logs -->
+ <!-- property name="debugDir" value="/home/eby/dr2/debug-logs" /-->
+
+ <!-- specify the component name
+ <ECOMP-component-name>::= "MSO" | "DCAE" | "ASDC " | "AAI" |"Policy" | "SDNC" | "AC" -->
+ <!-- This creates the MSO directory in in the LogDir which is not needed, mentioned last directory of the path-->
+ <!-- property name="componentName" value="logs"></property -->
+
+ <!-- log file names -->
+ <property name="generalLogName" value="apicalls" />
+ <!-- name="securityLogName" value="security" -->
+ <!-- name="performanceLogName" value="performance" -->
+ <!-- name="serverLogName" value="server" -->
+ <!-- name="policyLogName" value="policy"-->
+ <property name="errorLogName" value="errors" />
+ <!-- name="metricsLogName" value="metrics" -->
+ <!-- name="auditLogName" value="audit" -->
+ <!-- name="debugLogName" value="debug" -->
+ <property name="jettyLogName" value="jetty"></property>
+ <property name="defaultPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|%msg%n" />
+ <property name="jettyLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%logger|%thread|%.-5level|%msg%n" />
+
+ <property name="debugLoggerPattern" value="%d{MM/dd-HH:mm:ss.SSS}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />
+
+ <property name="logDirectory" value="${logDir}" />
+ <!-- property name="debugLogDirectory" value="${debugDir}/${componentName}" /-->
+
+
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${defaultPattern}</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>
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>INFO</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${generalLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <!--appender name="EELFSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender-->
+
+ <!-- EELF Performance Appender. This appender is used to record performance
+ records. -->
+ <!--appender name="EELFPerformance"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${performanceLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <outputPatternAsHeader>true</outputPatternAsHeader>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPerformance" />
+ </appender-->
+
+ <!-- EELF Server Appender. This appender is used to record Server related
+ logging events. The Server logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate Server
+ events from other components, or it can be eliminated to record these events
+ as part of the application root log. -->
+ <!--appender name="EELFServer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${serverLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${serverLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFServer" />
+ </appender-->
+
+
+ <!-- EELF Policy Appender. This appender is used to record Policy engine
+ related logging events. The Policy 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="EELFPolicy"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${policyLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${policyLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPolicy" >
+ </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.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%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>${defaultPattern}</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.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics"/>
+ </appender-->
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <filter class="ch.qos.logback.classic.filter.LevelFilter">
+ <level>ERROR</level>
+ <onMatch>ACCEPT</onMatch>
+ <onMismatch>DENY</onMismatch>
+ </filter>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%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>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError"/>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <appender name="jettylog"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${jettyLogName}.log</file>
+ <filter class="org.onap.dmaap.datarouter.provisioning.eelf.JettyFilter" />
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${jettyLogName}.%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>${jettyLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFjettylog" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="jettylog" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+ <!-- ============================================================================ -->
+
+
+ <!--appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%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>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender-->
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="info" additivity="false">
+ <appender-ref ref="asyncEELF" />
+ </logger>
+
+ <logger name="com.att.eelf.error" level="error" additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="log4j.logger.org.eclipse.jetty" additivity="false" level="info">
+ <appender-ref ref="asyncEELFjettylog"/>
+ </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>
+
+ <logger name="com.att.eelf.debug" level="debug" additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+ </logger-->
+
+
+
+
+ <root level="INFO">
+ <appender-ref ref="asyncEELF" />
+ <appender-ref ref="asyncEELFError" />
+ <appender-ref ref="asyncEELFjettylog" />
+ </root>
+
+</configuration>
diff --git a/datarouter-prov/src/main/resources/misc/doaction b/datarouter-prov/src/main/resources/misc/doaction
index 8e719d4e..c5692901 100644
--- a/datarouter-prov/src/main/resources/misc/doaction
+++ b/datarouter-prov/src/main/resources/misc/doaction
@@ -24,49 +24,49 @@ for action in "$@"
do
case "$action" in
'stop')
- /opt/app/platform/init.d/drtrprov stop
- ;;
+ /opt/app/platform/init.d/drtrprov stop
+ ;;
'start')
- /opt/app/platform/init.d/drtrprov start || exit 1
- ;;
+ /opt/app/platform/init.d/drtrprov start || exit 1
+ ;;
'backup')
- cp log4j.properties log4j.properties.save 2>/dev/null
- cp provserver.properties provserver.properties.save 2>/dev/null
- cp mail.properties mail.properties.save 2>/dev/null
- cp havecert havecert.save 2>/dev/null
- cp mysql_init_0001 mysql_init_0001.save 2>/dev/null
- ;;
+ cp log4j.properties log4j.properties.save 2>/dev/null
+ cp provserver.properties provserver.properties.save 2>/dev/null
+ cp mail.properties mail.properties.save 2>/dev/null
+ cp havecert havecert.save 2>/dev/null
+ cp mysql_init_0001 mysql_init_0001.save 2>/dev/null
+ ;;
'restore')
- cp log4j.properties.save log4j.properties 2>/dev/null
- cp provserver.properties.save provserver.properties 2>/dev/null
- cp mail.properties.save mail.properties 2>/dev/null
- cp havecert.save havecert 2>/dev/null
- cp mysql_init_0001.save mysql_init_0001 2>/dev/null
- ;;
+ cp log4j.properties.save log4j.properties 2>/dev/null
+ cp provserver.properties.save provserver.properties 2>/dev/null
+ cp mail.properties.save mail.properties 2>/dev/null
+ cp havecert.save havecert 2>/dev/null
+ cp mysql_init_0001.save mysql_init_0001 2>/dev/null
+ ;;
'config')
- /bin/bash log4j.properties.tmpl >log4j.properties
- /bin/bash provserver.properties.tmpl >provserver.properties
- /bin/bash mail.properties.tmpl >mail.properties
- /bin/bash havecert.tmpl >havecert
- /bin/bash mysql_init_0001.tmpl >mysql_init_0001
- echo "$AFTSWM_ACTION_NEW_VERSION" >VERSION.prov
- chmod +x havecert
- rm -f /opt/app/platform/rc.d/K90zdrtrprov /opt/app/platform/rc.d/S99zdrtrprov
- ln -s ../init.d/drtrprov /opt/app/platform/rc.d/K90zdrtrprov
- ln -s ../init.d/drtrprov /opt/app/platform/rc.d/S99zdrtrprov
- ;;
+ /bin/bash log4j.properties.tmpl >log4j.properties
+ /bin/bash provserver.properties.tmpl >provserver.properties
+ /bin/bash mail.properties.tmpl >mail.properties
+ /bin/bash havecert.tmpl >havecert
+ /bin/bash mysql_init_0001.tmpl >mysql_init_0001
+ echo "$AFTSWM_ACTION_NEW_VERSION" >VERSION.prov
+ chmod +x havecert
+ rm -f /opt/app/platform/rc.d/K90zdrtrprov /opt/app/platform/rc.d/S99zdrtrprov
+ ln -s ../init.d/drtrprov /opt/app/platform/rc.d/K90zdrtrprov
+ ln -s ../init.d/drtrprov /opt/app/platform/rc.d/S99zdrtrprov
+ ;;
'clean')
- rm -f log4j.properties log4j.properties.save
- rm -f provserver.properties provserver.properties.save
- rm -f mail.properties mail.properties.save
- rm -f havecert havecert.properties.save
- rm -f mysql_init_0001 mysql_init_0001.save
- rm -f VERSION.prov
- rm -f /opt/app/platform/rc.d/K90zdrtrprov /opt/app/platform/rc.d/S99zdrtrprov
- ;;
+ rm -f log4j.properties log4j.properties.save
+ rm -f provserver.properties provserver.properties.save
+ rm -f mail.properties mail.properties.save
+ rm -f havecert havecert.properties.save
+ rm -f mysql_init_0001 mysql_init_0001.save
+ rm -f VERSION.prov
+ rm -f /opt/app/platform/rc.d/K90zdrtrprov /opt/app/platform/rc.d/S99zdrtrprov
+ ;;
*)
- exit 1
- ;;
+ exit 1
+ ;;
esac
done
exit 0
diff --git a/datarouter-prov/src/main/resources/misc/dr-route b/datarouter-prov/src/main/resources/misc/dr-route
index 56d7766c..307614f7 100644
--- a/datarouter-prov/src/main/resources/misc/dr-route
+++ b/datarouter-prov/src/main/resources/misc/dr-route
@@ -28,5 +28,5 @@ CLASSPATH=`echo /opt/app/datartr/etc /opt/app/datartr/lib/*.jar | tr ' ' ':'`
export CLASSPATH JAVA_HOME JAVA_OPTS TZ PATH
$JAVA_HOME/bin/java \
- -Dlog4j.configuration=file:///opt/app/datartr/etc/log4j.drroute.properties \
- org.onap.dmaap.datarouter.provisioning.utils.DRRouteCLI $*
+ -Dlog4j.configuration=file:///opt/app/datartr/etc/log4j.drroute.properties \
+ org.onap.dmaap.datarouter.provisioning.utils.DRRouteCLI $*
diff --git a/datarouter-prov/src/main/resources/misc/drtrprov b/datarouter-prov/src/main/resources/misc/drtrprov
index 9f86c23b..e764c145 100644
--- a/datarouter-prov/src/main/resources/misc/drtrprov
+++ b/datarouter-prov/src/main/resources/misc/drtrprov
@@ -30,108 +30,108 @@ CLASSPATH=`echo /opt/app/datartr/etc /opt/app/datartr/lib/*.jar | tr ' ' ':'`
export CLASSPATH JAVA_HOME JAVA_OPTS TZ PATH
pids() {
- pgrep -u datartr -f provisioning.Main
+ pgrep -u datartr -f provisioning.Main
}
start() {
- ID=`id -n -u`
- GRP=`id -n -g`
- if [ "$ID" != "root" ]
- then
- echo drtrprov must be started as user datartr not $ID
- exit 1
- fi
+ ID=`id -n -u`
+ GRP=`id -n -g`
+ if [ "$ID" != "root" ]
+ then
+ echo drtrprov must be started as user datartr not $ID
+ exit 1
+ fi
# if [ "$GRP" != "datartr" ]
-# then
-# echo drtrprov must be started as group datartr not $GRP
-# exit 1
-# fi
-# cd /opt/app/datartr
-# if etc/havecert
-# then
-# echo >/dev/null
-# else
-# echo No certificate file available. Cannot start
-# exit 0
-# fi
- if [ "`pgrep -u mysql mysqld`" = "" ]
- then
- echo MariaDB is not running. It must be started before drtrprov
- exit 0
- fi
- PIDS=`pids`
- if [ "$PIDS" != "" ]
- then
- echo drtrprov already running
- exit 0
- fi
- echo '0 1 * * * /opt/app/datartr/bin/runreports' | crontab
- nohup java $JAVA_OPTS org.onap.dmaap.datarouter.provisioning.Main </dev/null &
- sleep 5
- PIDS=`pids`
- if [ "$PIDS" = "" ]
- then
- echo drtrprov startup failed
- else
- echo drtrprov started
- fi
+# then
+# echo drtrprov must be started as group datartr not $GRP
+# exit 1
+# fi
+# cd /opt/app/datartr
+# if etc/havecert
+# then
+# echo >/dev/null
+# else
+# echo No certificate file available. Cannot start
+# exit 0
+# fi
+ if [ "`pgrep -u mysql mysqld`" = "" ]
+ then
+ echo MariaDB is not running. It must be started before drtrprov
+ exit 0
+ fi
+ PIDS=`pids`
+ if [ "$PIDS" != "" ]
+ then
+ echo drtrprov already running
+ exit 0
+ fi
+ echo '0 1 * * * /opt/app/datartr/bin/runreports' | crontab
+ nohup java $JAVA_OPTS org.onap.dmaap.datarouter.provisioning.Main </dev/null &
+ sleep 5
+ PIDS=`pids`
+ if [ "$PIDS" = "" ]
+ then
+ echo drtrprov startup failed
+ else
+ echo drtrprov started
+ fi
}
stop() {
- ID=`id -n -u`
- GRP=`id -n -g`
- if [ "$ID" != "datartr" ]
- then
- echo drtrprov must be stopped as user datartr not $ID
- exit 1
- fi
- if [ "$GRP" != "datartr" ]
- then
- echo drtrprov must be stopped as group datartr not $GRP
- exit 1
- fi
- /usr/bin/curl http://127.0.0.1:8080/internal/halt
- sleep 5
- PIDS=`pids`
- if [ "$PIDS" != "" ]
- then
- sleep 5
- kill -9 $PIDS
- sleep 5
- echo drtrprov stopped
- else
- echo drtrprov not running
- fi
+ ID=`id -n -u`
+ GRP=`id -n -g`
+ if [ "$ID" != "datartr" ]
+ then
+ echo drtrprov must be stopped as user datartr not $ID
+ exit 1
+ fi
+ if [ "$GRP" != "datartr" ]
+ then
+ echo drtrprov must be stopped as group datartr not $GRP
+ exit 1
+ fi
+ /usr/bin/curl http://127.0.0.1:8080/internal/halt
+ sleep 5
+ PIDS=`pids`
+ if [ "$PIDS" != "" ]
+ then
+ sleep 5
+ kill -9 $PIDS
+ sleep 5
+ echo drtrprov stopped
+ else
+ echo drtrprov not running
+ fi
}
status() {
- PIDS=`pids`
- if [ "$PIDS" != "" ]
- then
- echo drtrprov running
- else
- echo drtrprov not running
- fi
+ PIDS=`pids`
+ if [ "$PIDS" != "" ]
+ then
+ echo drtrprov running
+ else
+ echo drtrprov not running
+ fi
}
case "$1" in
'start')
- start
- ;;
+ start
+ ;;
'stop')
- stop
- ;;
+ stop
+ ;;
'restart')
- stop
- sleep 20
- start
- ;;
+ stop
+ sleep 20
+ start
+ ;;
'status')
- status
- ;;
+ status
+ ;;
*)
- echo "Usage: $0 { start | stop | restart | status }"
- exit 1
- ;;
+ echo "Usage: $0 { start | stop | restart | status }"
+ exit 1
+ ;;
esac
exit 0
diff --git a/datarouter-prov/src/main/resources/misc/havecert.tmpl b/datarouter-prov/src/main/resources/misc/havecert.tmpl
index e2389868..d4968016 100644
--- a/datarouter-prov/src/main/resources/misc/havecert.tmpl
+++ b/datarouter-prov/src/main/resources/misc/havecert.tmpl
@@ -4,7 +4,7 @@ TZ=GMT0
cd /opt/app/datartr;
if [ -f ${DRTR_PROV_KSTOREFILE:-etc/keystore} ]
then
- exit 0
+ exit 0
fi
echo `date '+%F %T,000'` WARN Certificate file "${DRTR_PROV_KSTOREFILE:-etc/keystore}" is missing >>${DRTR_PROV_LOGS:-logs}/provint.log
exit 1
diff --git a/datarouter-prov/src/main/resources/misc/notes b/datarouter-prov/src/main/resources/misc/notes
index 4888dc27..7120c729 100644
--- a/datarouter-prov/src/main/resources/misc/notes
+++ b/datarouter-prov/src/main/resources/misc/notes
@@ -3,76 +3,76 @@ Package notes for com.att.dmaap.datarouter:prov
This component is for the Data Router Provisioning Server software.
The following pre-requisite components should already be present:
- com.att.aft.swm:swm-cli
- com.att.aft.swm:swm-node
- - SWM Variables: AFTSWM_AUTOLINK_PARENTS=/opt/app:/opt/app/workload,/opt/app/aft:/opt/app/workload/aft
- com.att.platform:uam-auto
- com.att.java:jdk8lin
- com.att.platform:initd
- com.att.platform:port-fwd
- - SWM Variables: PLATFORM_PORT_FWD=80,8080|443,8443
- mysql:mysql
- mysql:mysql-config
- - SWM Variables: MYSQL_CONFIG_SIZE=small
- MYSQL_DB_DATABASES=datarouter
- MYSQL_DB_datarouter_USERS=datarouter,tier2
- MYSQL_DB_datarouter_USERS_datarouter_LEVEL=RW
- MYSQL_DB_datarouter_USERS_datarouter_PASSWORD=datarouter
- MYSQL_DB_datarouter_USERS_tier2_LEVEL=RO
- MYSQL_DB_datarouter_USERS_tier2_PASSWORD=<password>
- MYSQL_MAX_ALLOWED_PACKET=32M
- MYSQL_MAX_CONNECTIONS=300
- MYSQL_PASSWORD=datarouter
- MYSQL_PORT=3306
+ com.att.aft.swm:swm-cli
+ com.att.aft.swm:swm-node
+ - SWM Variables: AFTSWM_AUTOLINK_PARENTS=/opt/app:/opt/app/workload,/opt/app/aft:/opt/app/workload/aft
+ com.att.platform:uam-auto
+ com.att.java:jdk8lin
+ com.att.platform:initd
+ com.att.platform:port-fwd
+ - SWM Variables: PLATFORM_PORT_FWD=80,8080|443,8443
+ mysql:mysql
+ mysql:mysql-config
+ - SWM Variables: MYSQL_CONFIG_SIZE=small
+ MYSQL_DB_DATABASES=datarouter
+ MYSQL_DB_datarouter_USERS=datarouter,tier2
+ MYSQL_DB_datarouter_USERS_datarouter_LEVEL=RW
+ MYSQL_DB_datarouter_USERS_datarouter_PASSWORD=datarouter
+ MYSQL_DB_datarouter_USERS_tier2_LEVEL=RO
+ MYSQL_DB_datarouter_USERS_tier2_PASSWORD=<password>
+ MYSQL_MAX_ALLOWED_PACKET=32M
+ MYSQL_MAX_CONNECTIONS=300
+ MYSQL_PASSWORD=datarouter
+ MYSQL_PORT=3306
In a production environment, the SWM variables that MUST be overwridden are:
- DRTR_PROV_ACTIVEPOD, DRTR_PROV_STANDBYPOD, DRTR_PROV_NODES
+ DRTR_PROV_ACTIVEPOD, DRTR_PROV_STANDBYPOD, DRTR_PROV_NODES
In addition, in a non-production environment, the DRTR_PROV_CNAME SWM variable
must also be overwridden.
The SWM variables that can be set to control the provisioning server are:
DRTR_PROV_ACTIVEPOD
- The FQDN of the active POD
+ The FQDN of the active POD
DRTR_PROV_STANDBYPOD
- The FQDN of the standby POD
+ The FQDN of the standby POD
DRTR_PROV_CNAME (default feeds-drtr.web.att.com)
- The DNS CNAME used for the prov server in this environment.
+ The DNS CNAME used for the prov server in this environment.
DRTR_PROV_NODES
- Pipe-delimited list of DR nodes to init the DB with.
+ Pipe-delimited list of DR nodes to init the DB with.
DRTR_PROV_DOMAIN (default web.att.com)
- Domain to use for non-FQDN node names
+ Domain to use for non-FQDN node names
DRTR_PROV_INTHTTPPORT (default 8080)
- The TCP/IP port number the component should listen on for "go fetch"
- requests from the provisioning server
+ The TCP/IP port number the component should listen on for "go fetch"
+ requests from the provisioning server
DRTR_PROV_INTHTTPSPORT (default 8443)
- The TCP/IP port number the component should listen on for publish
- requests from feed publishers and other nodes
+ The TCP/IP port number the component should listen on for publish
+ requests from feed publishers and other nodes
DRTR_PROV_LOGS (default /opt/app/datartr/logs)
- The directory where log files should be kept
+ The directory where log files should be kept
DRTR_PROV_SPOOL (default /opt/app/datartr/spool)
- The directory where logfiles from the DR nodes are spooled before being
- imported into the DB.
+ The directory where logfiles from the DR nodes are spooled before being
+ imported into the DB.
DRTR_PROV_KEYMGRPASS (default changeit)
- The password for the key manager
+ The password for the key manager
DRTR_PROV_KSTOREFILE (default /opt/app/datartr/etc/keystore)
- The java keystore file containing the server certificate and private key
- for this server
+ The java keystore file containing the server certificate and private key
+ for this server
DRTR_PROV_KSTOREPASS (default changeit)
- The password for the keystore file
+ The password for the keystore file
DRTR_PROV_TSTOREFILE (by default, use the truststore from the Java JDK)
- The java keystore file containing the trusted certificate authority
- certificates
+ The java keystore file containing the trusted certificate authority
+ certificates
DRTR_PROV_TSTOREPASS (default changeit)
- The password for the trust store file. Only applies if a trust store
- file is specified.
+ The password for the trust store file. Only applies if a trust store
+ file is specified.
DRTR_PROV_DBLOGIN (default datarouter)
- The login used to access MariaDB
+ The login used to access MariaDB
DRTR_PROV_DBPASS (default datarouter)
- The password used to access MariaDB
+ The password used to access MariaDB
DRTR_PROV_DBSCRIPTS (default /opt/app/datartr/etc)
- The directory containing DB initialization scripts
+ The directory containing DB initialization scripts
diff --git a/datarouter-prov/src/main/resources/misc/provcmd b/datarouter-prov/src/main/resources/misc/provcmd
index b48084f1..75d0bffa 100644
--- a/datarouter-prov/src/main/resources/misc/provcmd
+++ b/datarouter-prov/src/main/resources/misc/provcmd
@@ -26,105 +26,105 @@ export PATH PROVSRVR PROVCMD NOPROXY
if [ ! -x /usr/bin/curl ]
then
- echo provcmd: curl is required for this tool.
- exit 1
+ echo provcmd: curl is required for this tool.
+ exit 1
fi
optloop=
while [ -z "$optloop" ]
do
- if [ "$1" == '-s' ]
- then
- shift
- PROVSRVR="$1"
- shift
- elif [ "$1" == '-v' ]
- then
- shift
- VERBOSE=x
- elif [ "$1" == '-N' ]
- then
- shift
- NOPROXY='?noproxy=1'
- else
- optloop=1
- fi
+ if [ "$1" == '-s' ]
+ then
+ shift
+ PROVSRVR="$1"
+ shift
+ elif [ "$1" == '-v' ]
+ then
+ shift
+ VERBOSE=x
+ elif [ "$1" == '-N' ]
+ then
+ shift
+ NOPROXY='?noproxy=1'
+ else
+ optloop=1
+ fi
done
if [ -z "$PROVSRVR" ]
then
- echo "provcmd: you need to specify the server, either via the -s option"
- echo " or by setting and exporting PROVSRVR"
- exit 1
+ echo "provcmd: you need to specify the server, either via the -s option"
+ echo " or by setting and exporting PROVSRVR"
+ exit 1
fi
CMD="$1"
shift
if [ "$CMD" == 'delete' ]
then
- if [ $# -gt 0 ]
- then
- for i
- do
- [ -n "$VERBOSE" ] && echo curl -4 -k -X DELETE "https://$PROVSRVR/internal/api/$1$NOPROXY"
- curl -4 -k -X DELETE "https://$PROVSRVR/internal/api/$1$NOPROXY"
- done
- exit 0
- fi
+ if [ $# -gt 0 ]
+ then
+ for i
+ do
+ [ -n "$VERBOSE" ] && echo curl -4 -k -X DELETE "https://$PROVSRVR/internal/api/$1$NOPROXY"
+ curl -4 -k -X DELETE "https://$PROVSRVR/internal/api/$1$NOPROXY"
+ done
+ exit 0
+ fi
elif [ "$CMD" == 'create' ]
then
- if [ $# -eq 2 ]
- then
- # create (with POST), then set the value
- [ -n "$VERBOSE" ] && echo curl -4 -k -X POST --data '' "https://$PROVSRVR/internal/api/$1$NOPROXY"
- curl -4 -k -X POST --data '' "https://$PROVSRVR/internal/api/$1$NOPROXY"
- $PROVCMD set "$1" "$2"
- exit 0
- fi
+ if [ $# -eq 2 ]
+ then
+ # create (with POST), then set the value
+ [ -n "$VERBOSE" ] && echo curl -4 -k -X POST --data '' "https://$PROVSRVR/internal/api/$1$NOPROXY"
+ curl -4 -k -X POST --data '' "https://$PROVSRVR/internal/api/$1$NOPROXY"
+ $PROVCMD set "$1" "$2"
+ exit 0
+ fi
elif [ "$CMD" == 'get' ]
then
- if [ $# -eq 1 ]
- then
- # get
- [ -n "$VERBOSE" ] && echo curl -4 -k "https://$PROVSRVR/internal/api/$1$NOPROXY"
- curl -4 -k "https://$PROVSRVR/internal/api/$1$NOPROXY" 2>/dev/null | tr '|' '\012' | sort
- exit 0
- fi
+ if [ $# -eq 1 ]
+ then
+ # get
+ [ -n "$VERBOSE" ] && echo curl -4 -k "https://$PROVSRVR/internal/api/$1$NOPROXY"
+ curl -4 -k "https://$PROVSRVR/internal/api/$1$NOPROXY" 2>/dev/null | tr '|' '\012' | sort
+ exit 0
+ fi
elif [ "$CMD" == 'set' ]
then
- if [ $# -ge 2 ]
- then
- p="$1"
- shift
- v=""
- for i; do [ -n "$v" ] && v="$v|"; v="$v$i"; done
- # set (with PUT)
- ue=`urlencode "$v"`
- NOPROXY=`echo $NOPROXY | tr '?' '&'`
- [ -n "$VERBOSE" ] && echo curl -4 -k -X PUT "https://$PROVSRVR/internal/api/$p?val=$ue$NOPROXY"
- curl -4 -k -X PUT "https://$PROVSRVR/internal/api/$p?val=$ue$NOPROXY"
- exit 0
- fi
+ if [ $# -ge 2 ]
+ then
+ p="$1"
+ shift
+ v=""
+ for i; do [ -n "$v" ] && v="$v|"; v="$v$i"; done
+ # set (with PUT)
+ ue=`urlencode "$v"`
+ NOPROXY=`echo $NOPROXY | tr '?' '&'`
+ [ -n "$VERBOSE" ] && echo curl -4 -k -X PUT "https://$PROVSRVR/internal/api/$p?val=$ue$NOPROXY"
+ curl -4 -k -X PUT "https://$PROVSRVR/internal/api/$p?val=$ue$NOPROXY"
+ exit 0
+ fi
elif [ "$CMD" == 'append' ]
then
- if [ $# -ge 2 ]
- then
- p="$1"
- shift
- tmp=`curl -4 -k "https://$PROVSRVR/internal/api/$p$NOPROXY" 2>/dev/null`
- $PROVCMD set "$p" "$tmp" "$@"
- exit 0
- fi
+ if [ $# -ge 2 ]
+ then
+ p="$1"
+ shift
+ tmp=`curl -4 -k "https://$PROVSRVR/internal/api/$p$NOPROXY" 2>/dev/null`
+ $PROVCMD set "$p" "$tmp" "$@"
+ exit 0
+ fi
elif [ "$CMD" == 'remove' ]
then
- if [ $# -eq 2 ]
- then
- p="$1"
- rm="$2"
- $PROVCMD get "$p" | grep -v "^$rm\$" > /tmp/pc$$
- IFS=$'\r\n'
- $PROVCMD set "$p" `cat /tmp/pc$$`
- rm /tmp/pc$$
- exit 0
- fi
+ if [ $# -eq 2 ]
+ then
+ p="$1"
+ rm="$2"
+ $PROVCMD get "$p" | grep -v "^$rm\$" > /tmp/pc$$
+ IFS=$'\r\n'
+ $PROVCMD set "$p" `cat /tmp/pc$$`
+ rm /tmp/pc$$
+ exit 0
+ fi
fi
# Some error somewhere - display usage
diff --git a/datarouter-prov/src/main/resources/misc/runreports b/datarouter-prov/src/main/resources/misc/runreports
index f6037f4b..a5be6d98 100644
--- a/datarouter-prov/src/main/resources/misc/runreports
+++ b/datarouter-prov/src/main/resources/misc/runreports
@@ -37,18 +37,18 @@ ID=`id -n -u`
GRP=`id -n -g`
if [ "$ID" != "datartr" ]
then
- echo runreports must be started as user datartr not $ID
- exit 1
+ echo runreports must be started as user datartr not $ID
+ exit 1
fi
if [ "$GRP" != "datartr" ]
then
- echo runreports must be started as group datartr not $GRP
- exit 1
+ echo runreports must be started as group datartr not $GRP
+ exit 1
fi
if [ "`pgrep -u mysql mysqld`" = "" ]
then
- echo MariaDB is not running. It must be started before runreports
- exit 1
+ echo MariaDB is not running. It must be started before runreports
+ exit 1
fi
# Volume report