summaryrefslogtreecommitdiffstats
path: root/sdnr/wt/common
diff options
context:
space:
mode:
Diffstat (limited to 'sdnr/wt/common')
-rw-r--r--sdnr/wt/common/pom.xml35
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java5
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java3
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/GenericRunnableFactory.java4
-rw-r--r--sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/KeyBasedThreadpool.java65
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java10
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestKeybasedThreadpool.java100
-rw-r--r--sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/helper/HelpServletBase.java1
8 files changed, 175 insertions, 48 deletions
diff --git a/sdnr/wt/common/pom.xml b/sdnr/wt/common/pom.xml
index 11fb27c51..cda4e9739 100644
--- a/sdnr/wt/common/pom.xml
+++ b/sdnr/wt/common/pom.xml
@@ -22,13 +22,14 @@
~ ============LICENSE_END=======================================================
~
-->
+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onap.ccsdk.parent</groupId>
<artifactId>binding-parent</artifactId>
- <version>2.4.0</version>
+ <version>2.4.1-SNAPSHOT</version>
<relativePath/>
</parent>
@@ -62,6 +63,7 @@
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
@@ -71,44 +73,27 @@
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
+ <scope>provided</scope>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
</dependency>
-<!-- <dependency> -->
-<!-- <groupId>com.fasterxml.jackson.core</groupId> -->
-<!-- <artifactId>jackson-core</artifactId> -->
-<!-- </dependency> -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
+ <scope>provided</scope>
</dependency>
-<!-- <dependency> -->
-<!-- <groupId>com.fasterxml.jackson.core</groupId> -->
-<!-- <artifactId>jackson-databind</artifactId> -->
-<!-- </dependency> -->
- <dependency>
- <groupId>com.google.code.findbugs</groupId>
- <artifactId>annotations</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.google.code.findbugs</groupId>
+ <artifactId>annotations</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
<build>
<plugins>
<plugin>
- <groupId>org.jacoco</groupId>
- <artifactId>jacoco-maven-plugin</artifactId>
- <configuration>
- <excludes>
- <exclude>**/gen/**</exclude>
- <exclude>**/generated-sources/**</exclude>
- <exclude>**/yang-gen-sal/**</exclude>
- <exclude>**/pax/**</exclude>
- </excludes>
- </configuration>
- </plugin>
- <plugin>
<groupId>com.github.alexcojocaru</groupId>
<artifactId>elasticsearch-maven-plugin</artifactId>
<configuration>
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java
index 529853e08..233f48fa3 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/SearchResult.java
@@ -23,7 +23,9 @@ package org.onap.ccsdk.features.sdnr.wt.common.database;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
public class SearchResult<T> {
@@ -53,6 +55,9 @@ public class SearchResult<T> {
public List<T> getHits() {
return this.hits;
}
+ public Set<T> getHitSets() {
+ return new HashSet<>(this.hits);
+ }
public long getTotal() {
return this.total;
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java
index b73d3eadc..914ee1cf1 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/database/data/IndicesEntry.java
@@ -22,11 +22,8 @@
package org.onap.ccsdk.features.sdnr.wt.common.database.data;
import java.text.ParseException;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/GenericRunnableFactory.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/GenericRunnableFactory.java
index c163facbb..2f052d6b2 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/GenericRunnableFactory.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/GenericRunnableFactory.java
@@ -26,7 +26,5 @@ public abstract class GenericRunnableFactory<T,S> {
public GenericRunnableFactory() {
}
- public Runnable create(S arg, GenericRunnableFactoryCallback<T> callback) {
- return null;
- }
+ public abstract Runnable create(final T key, final S arg);
}
diff --git a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/KeyBasedThreadpool.java b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/KeyBasedThreadpool.java
index f41a9038f..f507eec13 100644
--- a/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/KeyBasedThreadpool.java
+++ b/sdnr/wt/common/src/main/java/org/onap/ccsdk/features/sdnr/wt/common/threading/KeyBasedThreadpool.java
@@ -23,23 +23,27 @@ package org.onap.ccsdk.features.sdnr.wt.common.threading;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Threadpool for running n instances per key T
*
* @author jack
*
- * @param <T>
- * @param <S>
+ * @param <T> type of key for the pools
+ * @param <S> type of arg to create a runner
*/
public class KeyBasedThreadpool<T, S> implements GenericRunnableFactoryCallback<T> {
+ private static final Logger LOG = LoggerFactory.getLogger(KeyBasedThreadpool.class);
private final Queue<Entry<T, S>> queue;
private final List<T> runningKeys;
private final int keyPoolSize;
@@ -57,37 +61,80 @@ public class KeyBasedThreadpool<T, S> implements GenericRunnableFactoryCallback<
this.keyPoolSize = keyPoolSize;
this.factory = factory;
this.executor = Executors.newFixedThreadPool(poolSize);
- this.runningKeys = new ArrayList<>();
+ this.runningKeys = Collections.synchronizedList(new ArrayList<T>());
+ LOG.info("starting key-based threadpool with keysize={} and size={}", keyPoolSize, poolSize);
}
public void execute(T key, S arg) {
if (this.isKeyPoolSizeReached(key)) {
+ LOG.debug("pool size for key {} reached. add to queue", key);
queue.add(new SimpleEntry<>(key, arg));
+
} else {
+ LOG.debug("starting executor for key {}.", key);
this.runningKeys.add(key);
- this.executor.execute(this.factory.create(arg, this));
+ this.executor.execute(new RunnableWrapper<T>(this.factory.create(key, arg), key, this));
}
}
private void executeNext() {
Entry<T, S> entry = this.queue.peek();
- if (!this.isKeyPoolSizeReached(entry.getKey())) {
- this.queue.poll();
- this.runningKeys.add(entry.getKey());
- this.executor.execute(this.factory.create(entry.getValue(), this));
+ if (entry != null) {
+ LOG.debug("executing next for key {} with arg {}", entry.getKey(), entry.getValue());
+ if (!this.isKeyPoolSizeReached(entry.getKey())) {
+ this.queue.poll();
+ this.runningKeys.add(entry.getKey());
+ this.executor.execute(new RunnableWrapper<T>(this.factory.create(entry.getKey(), entry.getValue()),
+ entry.getKey(), this));
+ } else {
+ LOG.debug("key pool size reached. waiting for someone else to stop");
+ }
+ } else {
+ LOG.info("nothing to execute. queue is empty.");
}
}
private boolean isKeyPoolSizeReached(T key) {
+ LOG.trace("running keys size={}", this.runningKeys.size());
return this.runningKeys.stream().filter(e -> e == key).count() >= this.keyPoolSize;
}
@Override
- public void onFinish(T key) {
+ public synchronized void onFinish(T key) {
+ LOG.debug("executor finished for key {}.", key);
this.runningKeys.remove(key);
this.executeNext();
}
+ public void join() {
+ LOG.debug("wait for all executors to finish");
+ while (this.runningKeys.size() > 0 && this.queue.size() > 0) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ }
+
+ private static class RunnableWrapper<T> implements Runnable {
+
+ private final Runnable inner;
+ private final GenericRunnableFactoryCallback<T> callback;
+ private final T key;
+ public RunnableWrapper(Runnable inner, T key, GenericRunnableFactoryCallback<T> cb) {
+ this.inner = inner;
+ this.callback = cb;
+ this.key = key;
+ }
+
+ @Override
+ public void run() {
+ this.inner.run();
+ this.callback.onFinish(this.key);
+ }
+
+ }
}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java
index 3584d7f28..253b790eb 100644
--- a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestBaseHttpClient.java
@@ -25,7 +25,9 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
@@ -33,18 +35,12 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPClient;
import org.onap.ccsdk.features.sdnr.wt.common.http.BaseHTTPResponse;
-import com.sun.net.httpserver.HttpExchange;
-import com.sun.net.httpserver.HttpHandler;
-import com.sun.net.httpserver.HttpServer;
-
-@SuppressWarnings("restriction")
public class TestBaseHttpClient {
public static final String HTTPMETHOD_GET = "GET";
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestKeybasedThreadpool.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestKeybasedThreadpool.java
new file mode 100644
index 000000000..868275690
--- /dev/null
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/TestKeybasedThreadpool.java
@@ -0,0 +1,100 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : ccsdk features
+ * ================================================================================
+ * Copyright (C) 2020 highstreet technologies GmbH Intellectual Property.
+ * All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ */
+package org.onap.ccsdk.features.sdnr.wt.common.test;
+
+import java.util.Random;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.onap.ccsdk.features.sdnr.wt.common.threading.GenericRunnableFactory;
+import org.onap.ccsdk.features.sdnr.wt.common.threading.KeyBasedThreadpool;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestKeybasedThreadpool {
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(TestKeybasedThreadpool.class);
+ private static final String KEY_A = "a";
+ private static final String KEY_B = "b";
+ private static final String KEY_C = "c";
+ private static final String KEY_D = "d";
+
+ @Ignore
+ @Test
+ public void test1() {
+ GenericRunnableFactory<String, TestClass> factory1 =
+ new GenericRunnableFactory<String, TestKeybasedThreadpool.TestClass>() {
+ @Override
+ public Runnable create(final String key, final TestClass arg) {
+ return new Runnable() {
+
+ @Override
+ public void run() {
+ final String key2 = arg.value;
+ final long sleep = arg.sleep;
+ LOG.info("{}: sleeping now for {} seconds",key2, sleep);
+ try {
+ Thread.sleep(sleep*1000);
+ } catch (InterruptedException e) {
+ LOG.error("InterruptedException",e);
+ Thread.currentThread().interrupt();
+ }
+ LOG.info("{}: finished",key2);
+ }
+ };
+ }
+ };
+ LOG.info("starting");
+ KeyBasedThreadpool<String, TestClass> threadpool = new KeyBasedThreadpool<String, TestClass>(10, 1, factory1);
+ threadpool.execute(KEY_A, new TestClass(KEY_A));
+ threadpool.execute(KEY_A, new TestClass(KEY_A));
+ threadpool.execute(KEY_A, new TestClass(KEY_A));
+ threadpool.execute(KEY_B, new TestClass(KEY_B));
+ threadpool.execute(KEY_C, new TestClass(KEY_C));
+ threadpool.execute(KEY_D, new TestClass(KEY_D));
+ threadpool.execute(KEY_D, new TestClass(KEY_D));
+ threadpool.join();
+ LOG.info("done");
+ }
+
+ private static int counter=0;
+
+
+ public class TestClass {
+ protected final long sleep;
+ private final String value;
+
+ public TestClass(String value) {
+
+ this.value = value+ String.valueOf(counter++);
+ Random rnd = new Random();
+ this.sleep = rnd.nextInt(20);
+ LOG.info("instatiate {}",this);
+ }
+
+ @Override
+ public String toString() {
+ return "TestClass [sleep=" + sleep + ", value=" + value + "]";
+ }
+ }
+}
diff --git a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/helper/HelpServletBase.java b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/helper/HelpServletBase.java
index a3d2c9be9..6913ec21e 100644
--- a/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/helper/HelpServletBase.java
+++ b/sdnr/wt/common/src/test/java/org/onap/ccsdk/features/sdnr/wt/common/test/helper/HelpServletBase.java
@@ -45,7 +45,6 @@ import org.junit.Before;
import org.onap.ccsdk.features.sdnr.wt.common.test.ServletInputStreamFromByteArrayInputStream;
import org.onap.ccsdk.features.sdnr.wt.common.test.ServletOutputStreamToStringWriter;
-@SuppressWarnings("restriction")
public class HelpServletBase {
public static final String RESPONSE_GET = "This is the response get";