blob: fbc6528937e01f1143701c18c8ba019c595c278f [file] [log] [blame]
/*
* Copyright (c) 2020 Kentyou.
* 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:
* Kentyou - initial API and implementation
*/
package org.eclipse.sensinact.gateway.core;
import java.util.Enumeration;
import java.util.Set;
import org.eclipse.sensinact.gateway.common.bundle.Mediator;
import org.eclipse.sensinact.gateway.common.primitive.ElementsProxy;
import org.eclipse.sensinact.gateway.common.primitive.Nameable;
import org.eclipse.sensinact.gateway.common.execution.ErrorHandler;
import org.eclipse.sensinact.gateway.common.execution.Executable;
import org.eclipse.sensinact.gateway.core.message.MidAgentCallback;
import org.eclipse.sensinact.gateway.core.message.Recipient;
import org.eclipse.sensinact.gateway.core.message.SnaErrorfulMessage;
import org.eclipse.sensinact.gateway.core.message.SnaFilter;
import org.eclipse.sensinact.gateway.core.method.AccessMethod;
import org.eclipse.sensinact.gateway.core.method.AccessMethodResponse;
import org.eclipse.sensinact.gateway.core.method.AccessMethodResponse.Status;
import org.eclipse.sensinact.gateway.core.method.legacy.ActResponse;
import org.eclipse.sensinact.gateway.core.method.legacy.DescribeMethod.DescribeType;
import org.eclipse.sensinact.gateway.core.method.legacy.DescribeResponse;
import org.eclipse.sensinact.gateway.core.method.legacy.DescribeResponseBuilder;
import org.eclipse.sensinact.gateway.core.method.legacy.GetResponse;
import org.eclipse.sensinact.gateway.core.method.legacy.SetResponse;
import org.eclipse.sensinact.gateway.core.method.legacy.SubscribeResponse;
import org.eclipse.sensinact.gateway.core.method.legacy.UnsubscribeResponse;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* Abstract {@link Session} implementation
*
* @author <a href="mailto:christophe.munilla@cea.fr">Christophe Munilla</a>
*/
public abstract class AbstractSession implements Session {
// ********************************************************************//
// NESTED DECLARATIONS //
// ********************************************************************//
// ********************************************************************//
// ABSTRACT DECLARATIONS //
// ********************************************************************//
// ********************************************************************//
// STATIC DECLARATIONS //
// ********************************************************************//
// ********************************************************************//
// INSTANCE DECLARATIONS //
// ********************************************************************//
protected final String identifier;
protected <N extends Nameable, E extends ElementsProxy<N>> String joinElementNames(E elements) {
int index = 0;
StringBuilder builder = new StringBuilder();
Enumeration<N> enumeration = elements.elements();
while (enumeration.hasMoreElements()) {
N nameable = enumeration.nextElement();
if (index > 0) {
builder.append(",");
}
builder.append("\"");
builder.append(nameable.getName());
builder.append("\"");
index++;
}
return builder.toString();
}
protected <T, R extends AccessMethodResponse<T>> R tatooRequestId(String requestId, R response) {
if(response == null){
return null;
}
response.put(AccessMethod.REQUEST_ID_KEY, requestId, requestId == null);
return response;
}
protected <A extends AccessMethodResponse<JSONObject>> A responseFromJSONObject(Mediator mediator, String uri,
String method, JSONObject object) throws Exception {
A response = null;
if (object == null) {
response = AccessMethodResponse.<JSONObject, A>error(mediator, uri, AccessMethod.Type.valueOf(method),
SnaErrorfulMessage.NOT_FOUND_ERROR_CODE, "Not found", null);
} else {
object.remove("type");
object.remove("uri");
Integer statusCode = (Integer) object.remove("statusCode");
Class<A> clazz = null;
switch (method) {
case "ACT":
clazz = (Class<A>) ActResponse.class;
break;
case "GET":
clazz = (Class<A>) GetResponse.class;
break;
case "SET":
clazz = (Class<A>) SetResponse.class;
break;
case "SUBSCRIBE":
clazz = (Class<A>) SubscribeResponse.class;
break;
case "UNSUBSCRIBE":
clazz = (Class<A>) UnsubscribeResponse.class;
break;
default:
break;
}
if (clazz != null) {
response = clazz.getConstructor(new Class<?>[] { Mediator.class, String.class,
Status.class, int.class }).newInstance(mediator, uri, statusCode.intValue() == 200
? Status.SUCCESS : Status.ERROR, statusCode.intValue());
response.setResponse((JSONObject) object.remove("response"));
response.setErrors((JSONArray) object.remove("errors"));
String[] names = JSONObject.getNames(object);
int index = 0;
int length = names == null ? 0 : names.length;
for (; index < length; index++) {
String name = names[index];
response.put(name, object.get(name));
}
}
}
return response;
}
protected DescribeResponse<JSONObject> describeFromJSONObject(Mediator mediator,
DescribeResponseBuilder<JSONObject> builder, DescribeType describeType, JSONObject object) {
DescribeResponse<JSONObject> response = null;
if (object == null) {
String element = describeType.name().toLowerCase();
String first = element.substring(0, 1).toUpperCase();
String suite = element.substring(1);
response = AccessMethodResponse.<JSONObject, DescribeResponse<JSONObject>>error(mediator, builder.getPath(),
describeType, SnaErrorfulMessage.NOT_FOUND_ERROR_CODE,
new StringBuilder().append(first).append(suite).append(" not found").toString(), null);
} else {
object.remove("type");
object.remove("uri");
builder.setAccessMethodObjectResult((JSONObject) object.remove("response"));
response = builder
.createAccessMethodResponse(object.optInt("statusCode") == 200 ? Status.SUCCESS : Status.ERROR);
response.setErrors((JSONArray) object.remove("errors"));
String[] names = JSONObject.getNames(object);
int index = 0;
int length = names == null ? 0 : names.length;
for (; index < length; index++) {
String name = names[index];
response.put(name, object.get(name));
}
}
return response;
}
/**
* Constructor
*
* @param identifier
* the String identifier of the Session to be instantiated
*/
public AbstractSession(String identifier) {
this.identifier = identifier;
}
/**
* return String identifier of this Session
*
* @return this Session's identifier
*/
public String getSessionId() {
return this.identifier;
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#getServiceProviders()
*/
@Override
public Set<ServiceProvider> serviceProviders() {
return this.serviceProviders(null);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# getService(java.lang.String,
* java.lang.String)
*/
@Override
public Service service(String serviceProviderName, String serviceName) {
Service service = null;
ServiceProvider provider = this.serviceProvider(serviceProviderName);
if (provider != null) {
service = provider.getService(serviceName);
}
return service;
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getResource(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public Resource resource(String serviceProviderName, String serviceName, String resourceName) {
Resource resource = null;
Service service = null;
if ((service = this.service(serviceProviderName, serviceName)) != null) {
resource = service.getResource(resourceName);
}
return resource;
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* registerSessionIntent(org.eclipse.sensinact.gateway.common.execution.Executable, java.lang.String[])
*/
@Override
public SubscribeResponse registerSessionIntent(Executable<Boolean,Void> callback, String... resourcePath) {
return registerSessionIntent(null, callback, resourcePath);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#unregisterSessionIntent(java.lang.String)
*/
@Override
public UnsubscribeResponse unregisterSessionIntent(String intentId) {
return unregisterSessionIntent(null, intentId);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#registerSessionAgent(org.eclipse.sensinact.gateway.core.message.MidAgentCallback,
* org.eclipse.sensinact.gateway.core.message.SnaFilter)
*/
@Override
public SubscribeResponse registerSessionAgent(MidAgentCallback callback, SnaFilter filter) {
return registerSessionAgent(null, callback, filter);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* unregisterSessionAgent(java.lang.String)
*/
@Override
public UnsubscribeResponse unregisterSessionAgent(String agentId) {
return unregisterSessionAgent(null, agentId);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# get(java.lang.String,
* java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public GetResponse get(String serviceProviderId, String serviceId, String resourceId, String attributeId) {
return get(null, serviceProviderId, serviceId, resourceId, attributeId);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# set(java.lang.String,
* java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
*/
@Override
public SetResponse set(final String serviceProviderId, final String serviceId, final String resourceId,
final String attributeId, final Object parameter) {
return set(null, serviceProviderId, serviceId, resourceId, attributeId, parameter);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# act(java.lang.String,
* java.lang.String, java.lang.String, java.lang.Object[])
*/
public ActResponse act(String serviceProviderId, String serviceId, String resourceId,
Object[] parameters) {
return act(null, serviceProviderId, serviceId, resourceId, parameters);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# subscribe(java.lang.String,
* java.lang.String, java.lang.String,org.eclipse.sensinact.gateway.core.message.Recipient,
* org.json.JSONArray)
*/
@Override
public SubscribeResponse subscribe(String serviceProviderId, String serviceId,
String resourceId, Recipient recipient, JSONArray conditions) {
return subscribe(null, serviceProviderId, serviceId, resourceId, recipient, conditions);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#subscribe(java.lang.String, java.lang.String,
* java.lang.String, org.eclipse.sensinact.gateway.core.message.Recipient, org.json.JSONArray,
* java.lang.String)
*/
@Override
public SubscribeResponse subscribe(String serviceProviderId, String serviceId,
String resourceId, Recipient recipient, JSONArray conditions, String policy) {
return subscribe(null, serviceProviderId, serviceId, resourceId, recipient, conditions, policy);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#subscribe(java.lang.String, java.lang.String,
* java.lang.String, java.lang.String, org.eclipse.sensinact.gateway.core.message.Recipient,
* org.json.JSONArray)
*/
@Override
public SubscribeResponse subscribe(String requestId, String serviceProviderId, String serviceId,
String resourceId, Recipient recipient, JSONArray conditions) {
return subscribe(requestId, serviceProviderId, serviceId, resourceId, recipient,
conditions, String.valueOf(ErrorHandler.Policy.DEFAULT_POLICY));
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* unsubscribe(java.lang.String, java.lang.String, java.lang.String,
* java.lang.String)
*/
@Override
public UnsubscribeResponse unsubscribe(String serviceProviderId, String serviceId,
final String resourceId, String subscriptionId) {
return unsubscribe(null, serviceProviderId, serviceId, resourceId, subscriptionId);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# getAll(java.lang.String,
* org.eclipse.sensinact.gateway.core.FilteringDefinition)
*/
@Override
public DescribeResponse<String> getAll() {
return getAll(null, null, null);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# getAll(java.lang.String,
* org.eclipse.sensinact.gateway.core.FilteringDefinition)
*/
@Override
public DescribeResponse<String> getAll(FilteringCollection filterCollection) {
return getAll(null, null, filterCollection);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# getAll(java.lang.String,
* org.eclipse.sensinact.gateway.core.FilteringDefinition)
*/
@Override
public DescribeResponse<String> getAll(String filter, FilteringCollection filterCollection) {
return getAll(null, filter, filterCollection);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#getProviders()
*/
@Override
public DescribeResponse<String> getProviders() {
return getProviders(null, null);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getProviders(org.eclipse.sensinact.gateway.core.FilteringCollection)
*/
@Override
public DescribeResponse<String> getProviders(FilteringCollection filterCollection) {
return getProviders(null, filterCollection);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getProvider(java.lang.String)
*/
@Override
public DescribeResponse<JSONObject> getProvider(String serviceProviderId) {
return getProvider(null, serviceProviderId);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getServices(java.lang.String)
*/
@Override
public DescribeResponse<String> getServices(String serviceProviderId) {
return getServices(null, serviceProviderId, null);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getServices(java.lang.String,
* org.eclipse.sensinact.gateway.core.FilteringCollection)
*/
@Override
public DescribeResponse<String> getServices(final String serviceProviderId, FilteringCollection filterCollection) {
return getServices(null, serviceProviderId, filterCollection);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session# getService(java.lang.String,
* java.lang.String)
*/
@Override
public DescribeResponse<JSONObject> getService(final String serviceProviderId, final String serviceId) {
return getService(null, serviceProviderId, serviceId);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getResources(java.lang.String, java.lang.String)
*/
@Override
public DescribeResponse<String> getResources(final String serviceProviderId, final String serviceId) {
return getResources(null, serviceProviderId, serviceId, null);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getResources(java.lang.String, java.lang.String,
* org.eclipse.sensinact.gateway.core.FilteringDefinition)
*/
@Override
public DescribeResponse<String> getResources(final String serviceProviderId, final String serviceId,
FilteringCollection filterCollection) {
return getResources(null, serviceProviderId, serviceId, filterCollection);
}
/**
* @inheritDoc
*
* @see org.eclipse.sensinact.gateway.core.Session#
* getResource(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public DescribeResponse<JSONObject> getResource(final String serviceProviderId, final String serviceId,
final String resourceId) {
return getResource(null, serviceProviderId, serviceId, resourceId);
}
}