updated
diff --git a/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/Stack.java b/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/Stack.java
new file mode 100644
index 0000000..3aa424e
--- /dev/null
+++ b/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/Stack.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2017 CEA.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * CEA - initial API and implementation
+ */
+package org.eclipse.sensinact.gateway.agent.storage.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONObject;
+
+public class Stack {
+ private List<JSONObject> list = new ArrayList<>();
+
+ public boolean isEmpty() {
+ synchronized (list) {
+ return list.isEmpty();
+ }
+ }
+
+ public int size() {
+ synchronized (list) {
+ return list.size();
+ }
+ }
+
+ public void push(JSONObject element) {
+ if (element == null)
+ throw new IllegalArgumentException("Can't Push a null element");
+ synchronized (list) {
+ list.add(element);
+ }
+ }
+
+ public JSONObject pop() {
+ synchronized (list) {
+ if (list.isEmpty())
+ return null;
+ return list.remove(list.size()-1);
+ }
+ }
+}
diff --git a/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageAgent.java b/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageAgent.java
index 1a1f0c0..f18a844 100644
--- a/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageAgent.java
+++ b/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageAgent.java
@@ -115,8 +115,8 @@
jsonObject.put("resource", resource);
jsonObject.put(DataResource.VALUE, initialValue);
jsonObject.put("timestamp", timestampStr);
- LOG.debug("pushing to database {}/{}/{}/{}...", serviceProvider, service, resource, initialValue);
- this.storageConnection.push(jsonObject);
+ LOG.debug("pushing to stack {}/{}/{}/{}...", serviceProvider, service, resource, initialValue);
+ this.storageConnection.stack.push(jsonObject);
LOG.debug("...done");
}
diff --git a/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageConnection.java b/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageConnection.java
index 77113dd..056ee1d 100644
--- a/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageConnection.java
+++ b/platform/northbound/storage-agent/src/main/java/org/eclipse/sensinact/gateway/agent/storage/internal/StorageConnection.java
@@ -19,13 +19,14 @@
import org.eclipse.sensinact.gateway.protocol.http.client.SimpleResponse;
import org.eclipse.sensinact.gateway.util.crypto.Base64;
import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Stack;
/**
* HTTP Agent dedicated to storage service
@@ -33,120 +34,108 @@
* @author <a href="mailto:christophe.munilla@cea.fr">Christophe Munilla</a>
*/
class StorageConnection {
- private String authorization;
- private String uri;
- private Mediator mediator;
- private Stack<JSONObject> stack;
- private boolean running = false;
+ private static final Logger LOG = LoggerFactory.getLogger(StorageConnection.class);
- /**
- * Constructor
- *
- * @param mediator the associated {@link Mediator}
- * @param uri the string URI of the storage server
- * @param login the user login
- * @param password the user password
- * @throws IOException Exception on connection problem
- */
- StorageConnection(Mediator mediator, String uri, String login, String password) throws IOException {
- this.mediator = mediator;
- this.uri = uri;
- this.authorization = Base64.encodeBytes((login + ":" + password).getBytes());
- this.stack = new Stack<>();
- this.running = true;
- Runnable runner = new Runnable() {
- @Override
- public void run() {
- while (true) {
- if (!StorageConnection.this.running) {
- break;
- }
- JSONObject config = StorageConnection.this.pop();
- if (config != null) {
- StorageConnection.this.httpRequest(config);
- } else {
- try {
- Thread.sleep(200);
- } catch (InterruptedException e) {
- Thread.interrupted();
- break;
- }
- }
- }
- }
- };
- new Thread(runner).start();
- }
+ private String authorization;
+ private String uri;
+ private Mediator mediator;
+ Stack stack;
+ private boolean running = false;
- /**
- * @param request
- */
- final void push(JSONObject request) {
- if (request == null || !this.running) {
- return;
- }
- synchronized (this.stack) {
- this.stack.push(request);
- }
- }
+ /**
+ * Constructor
+ *
+ * @param mediator the associated {@link Mediator}
+ * @param uri the string URI of the storage server
+ * @param login the user login
+ * @param password the user password
+ * @throws IOException Exception on connection problem
+ */
+ StorageConnection(Mediator mediator, String uri, String login, String password) throws IOException {
+ this.mediator = mediator;
+ this.uri = uri;
+ this.authorization = Base64.encodeBytes((login + ":" + password).getBytes());
+ this.stack = new Stack();
+ this.running = true;
+
+ Runnable runner = new Runnable() {
+ @Override
+ public void run() {
+ LOG.info("POP thread started");
+ while (running) {
+ try {
+ JSONObject element = stack.pop();
+ if (element != null) {
+ sendRequest(element);
+ } else {
+ if (! shortSleep(200)) {
+ running = false;
+ }
+ }
+ } catch (Exception e) {
+ LOG.error("POP thread error", e);
+ }
+ }
+ LOG.info("POP thread terminated");
+ }
+ };
+ new Thread(runner).start();
+ }
- /**
- * @return
- */
- private JSONObject pop() {
- JSONObject request = null;
- synchronized (this.stack) {
- if (!this.stack.isEmpty()) {
- request = this.stack.pop();
- }
- }
- return request;
- }
+ /**
+ * Executes the HTTP request defined by the method, target, headers and entity
+ * arguments
+ */
+ private void sendRequest(JSONObject object) {
+ ConnectionConfiguration<SimpleResponse, SimpleRequest> configuration = new ConnectionConfigurationImpl<>();
+ try {
+ configuration.setContentType("application/json");
+ configuration.setAccept("application/json");
+ configuration.setUri(this.uri);
+ configuration.setContent(object.toString());
+ configuration.setHttpMethod("POST");
+ configuration.addHeader("Authorization", "Basic " + authorization);
+ configuration.addHeader("User-Agent", "java/sensiNact-storage");
+ Request request = new SimpleRequest(configuration);
+ Response response = request.send();
+ if (mediator.isDebugLoggable()) {
+ this.mediator.debug(" >> response status code: " + response.getStatusCode());
+ }
+ Iterator<Map.Entry<String, List<String>>> iterator = response.getHeaders().entrySet().iterator();
+ if (!iterator.hasNext()) {
+ return;
+ }
+ Map.Entry<String, List<String>> entry = iterator.next();
+ for (; iterator.hasNext(); entry = iterator.next()) {
+ this.mediator.debug(entry.getKey() + " :: " + (entry.getValue() == null ? "null"
+ : Arrays.toString(entry.getValue().toArray(new String[0]))));
+ }
+ } catch (Exception e) {
+ LOG.error("Can't send request", e);
+ if (this.mediator.isErrorLoggable()) {
+ this.mediator.error(e.getMessage(), e);
+ }
+ }
+ }
- /**
- * Executes the HTTP request defined by the method, target,
- * headers and entity arguments
- */
- private void httpRequest(JSONObject object) {
- ConnectionConfiguration<SimpleResponse, SimpleRequest> configuration = new ConnectionConfigurationImpl<>();
- try {
- configuration.setContentType("application/json");
- configuration.setAccept("application/json");
- configuration.setUri(this.uri);
- configuration.setContent(object.toString());
- configuration.setHttpMethod("POST");
- configuration.addHeader("Authorization", "Basic " + authorization);
- configuration.addHeader("User-Agent", "java/sensiNact-storage");
- Request request = new SimpleRequest(configuration);
- Response response = request.send();
- if (mediator.isDebugLoggable()) {
- this.mediator.debug(" >> response status code: " + response.getStatusCode());
- }
- Iterator<Map.Entry<String, List<String>>> iterator = response.getHeaders().entrySet().iterator();
- if (!iterator.hasNext()) {
- return;
- }
- Map.Entry<String, List<String>> entry = iterator.next();
- for (; iterator.hasNext(); entry = iterator.next()) {
- this.mediator.debug(entry.getKey() + " :: " + (entry.getValue() == null ? "null" : Arrays.toString(entry.getValue().toArray(new String[0]))));
- }
- } catch (Exception e) {
- e.printStackTrace();
- if (this.mediator.isErrorLoggable()) {
- this.mediator.error(e.getMessage(), e);
- }
- }
- }
-
- void close() {
- this.running = false;
- while (!this.stack.isEmpty()) {
- try {
- Thread.sleep(200);
- } catch (InterruptedException e) {
- Thread.interrupted();
- break;
- }
- }
- }
+ void close() {
+ for (int i=0; i< 10_000 && !this.stack.isEmpty(); i++) {
+ if (! shortSleep(200)) {
+ return;
+ }
+ }
+ LOG.info("close operation ended");
+ this.running = false;
+ }
+
+ private boolean shortSleep(long millis) {
+ try {
+ Thread.sleep(millis);
+ return true;
+ } catch (InterruptedException e) {
+ LOG.error("Sleep operation error", e);
+ Thread.interrupted();
+ return false;
+ }
+ }
}
diff --git a/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/ExtResourceImpl.java b/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/ExtResourceImpl.java
index e89ee34..795d598 100644
--- a/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/ExtResourceImpl.java
+++ b/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/ExtResourceImpl.java
@@ -14,6 +14,7 @@
package org.eclipse.sensinact.gateway.generic;
import org.eclipse.sensinact.gateway.common.primitive.InvalidValueException;
+import org.eclipse.sensinact.gateway.core.Resource.Type;
import org.eclipse.sensinact.gateway.core.ResourceImpl;
import org.eclipse.sensinact.gateway.core.method.AbstractAccessMethod;
import org.eclipse.sensinact.gateway.core.method.AccessMethod;
diff --git a/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/GenericActivator.java b/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/GenericActivator.java
index 9d071f3..d526bee 100644
--- a/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/GenericActivator.java
+++ b/platform/sensinact-generic/src/main/java/org/eclipse/sensinact/gateway/generic/GenericActivator.java
@@ -17,16 +17,21 @@
@Override
public void doStart() throws Exception {
- ExtModelConfiguration<?> configuration = ExtModelConfigurationBuilder.instance(
- mediator, getPacketClass()
- ).withServiceBuildPolicy((byte) (SensiNactResourceModelConfiguration.BuildPolicy.BUILD_ON_DESCRIPTION.getPolicy() | SensiNactResourceModelConfiguration.BuildPolicy.BUILD_NON_DESCRIBED.getPolicy())
- ).withResourceBuildPolicy((byte) (SensiNactResourceModelConfiguration.BuildPolicy.BUILD_ON_DESCRIPTION.getPolicy() | SensiNactResourceModelConfiguration.BuildPolicy.BUILD_NON_DESCRIBED.getPolicy())
- ).withStartAtInitializationTime(true
- ).build(this.getClass().getName()+".xml", Collections.emptyMap());
+ ExtModelConfigurationBuilder builder = ExtModelConfigurationBuilder.instance(mediator, getPacketClass());
+
+ ExtModelConfiguration configuration = configureBuilder(builder)
+ .withServiceBuildPolicy((byte) (SensiNactResourceModelConfiguration.BuildPolicy.BUILD_ON_DESCRIPTION.getPolicy() | SensiNactResourceModelConfiguration.BuildPolicy.BUILD_NON_DESCRIBED.getPolicy()))
+ .withResourceBuildPolicy((byte) (SensiNactResourceModelConfiguration.BuildPolicy.BUILD_ON_DESCRIPTION.getPolicy() | SensiNactResourceModelConfiguration.BuildPolicy.BUILD_NON_DESCRIBED.getPolicy()))
+ .withStartAtInitializationTime(true)
+ .build(this.getClass().getName()+".xml", Collections.emptyMap());
endPoint = getEndPoint();
this.connect(configuration);
}
+ protected ExtModelConfigurationBuilder configureBuilder(ExtModelConfigurationBuilder builder) {
+ return builder;
+ }
+
@Override
public void doStop() {
try {
diff --git a/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/InoResourceImpl.java b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/InoResourceImpl.java
new file mode 100644
index 0000000..c16cef5
--- /dev/null
+++ b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/InoResourceImpl.java
@@ -0,0 +1,65 @@
+package org.eclipse.sensinact.gateway.sthbnd.inovallee;
+
+import org.eclipse.sensinact.gateway.common.primitive.InvalidValueException;
+import org.eclipse.sensinact.gateway.core.ModelInstance;
+import org.eclipse.sensinact.gateway.core.ResourceConfig;
+import org.eclipse.sensinact.gateway.core.ResourceImpl;
+import org.eclipse.sensinact.gateway.core.ServiceImpl;
+import org.eclipse.sensinact.gateway.core.method.AbstractAccessMethod;
+import org.eclipse.sensinact.gateway.core.method.AccessMethod;
+import org.eclipse.sensinact.gateway.core.method.AccessMethod.Type;
+import org.eclipse.sensinact.gateway.core.method.AccessMethodExecutor;
+import org.eclipse.sensinact.gateway.core.method.AccessMethodExecutor.ExecutionPolicy;
+import org.eclipse.sensinact.gateway.core.method.AccessMethodResponseBuilder;
+import org.eclipse.sensinact.gateway.core.method.Signature;
+import org.eclipse.sensinact.gateway.generic.ExtModelInstance;
+import org.eclipse.sensinact.gateway.generic.ExtResourceConfig;
+import org.eclipse.sensinact.gateway.generic.ExtResourceImpl;
+import org.eclipse.sensinact.gateway.generic.ExtServiceImpl;
+import org.eclipse.sensinact.gateway.generic.annotation.Act;
+import org.eclipse.sensinact.gateway.generic.annotation.Get;
+import org.eclipse.sensinact.gateway.generic.annotation.Subscribe;
+import org.eclipse.sensinact.gateway.generic.annotation.Unsubscribe;
+import org.eclipse.sensinact.gateway.generic.parser.MethodDefinition;
+import org.eclipse.sensinact.gateway.generic.parser.SignatureDefinition;
+import org.eclipse.sensinact.gateway.util.ReflectUtils;
+import org.json.JSONObject;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+
+public class InoResourceImpl extends ExtResourceImpl {
+
+ protected InoResourceImpl(ExtModelInstance<?> modelInstance, ExtResourceConfig resourceConfig, ExtServiceImpl service) {
+ super(modelInstance, resourceConfig, service);
+ System.out.println("-----------> INIT");
+ System.out.println("-----------> " + getName());
+ System.out.println("-----------> " + getPath());
+
+ }
+
+ @Get
+ public JSONObject notNamedAct() {
+ System.out.println("-----------> NO ARGS");
+ return new JSONObject();
+ }
+
+
+ @Get
+ public JSONObject notNamedAct(String arg1) {
+ System.out.println("-----------> 1 arg : " + arg1);
+ return new JSONObject();
+ }
+
+
+ @Get
+ public JSONObject notNamedAct(String arg1, String arg2) {
+ System.out.println("-----------> 2 args : " + arg1 + " " + arg2);
+ return new JSONObject();
+ }
+}
+
diff --git a/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/InovalleeActivator.java b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/InovalleeActivator.java
index 3ea4b6a..d7d1d72 100644
--- a/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/InovalleeActivator.java
+++ b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/InovalleeActivator.java
@@ -15,6 +15,7 @@
import java.util.ArrayList;
import java.util.List;
+import org.eclipse.sensinact.gateway.generic.ExtModelConfigurationBuilder;
import org.eclipse.sensinact.gateway.generic.GenericActivator;
import org.eclipse.sensinact.gateway.generic.model.Resource;
import org.eclipse.sensinact.gateway.generic.model.Tree;
@@ -49,6 +50,11 @@
}
@Override
+ protected ExtModelConfigurationBuilder configureBuilder(ExtModelConfigurationBuilder builder) {
+ return builder.withResourceImplementationType(InoResourceImpl.class);
+ }
+
+ @Override
public void doStop() {
super.doStop();
LOG.info("Thread killed for " + InovalleeActivator.class.getName());
diff --git a/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/EliorFetcher.java b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/EliorFetcher.java
index c4f6f74..e0b9535 100644
--- a/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/EliorFetcher.java
+++ b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/EliorFetcher.java
@@ -32,6 +32,8 @@
private final BasicHttpClient client = new BasicHttpClient();
private final String url = "http://193.48.18.251:8095/restaurants/aggregated";
+ //private final String url = "http://localhost:8095/restaurants/aggregated";
+
public Tree fetch() throws IOException {
diff --git a/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/MobilityFetcher.java b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/MobilityFetcher.java
index a2593f3..04186e5 100644
--- a/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/MobilityFetcher.java
+++ b/platform/southbound/inovallee/src/main/java/org/eclipse/sensinact/gateway/sthbnd/inovallee/fetcher/MobilityFetcher.java
@@ -22,7 +22,8 @@
private final BasicHttpClient client = new BasicHttpClient();
private final String urlStations = "http://193.48.18.251:8095/mobilite/stations";
-
+ //private final String urlStations = "http://localhost:8095/mobilite/stations";
+
public Tree fetch() throws IOException {
Response response = get(client, urlStations);
JSONArray array = new JSONArray(response.getPayload());