
org.computate.smartvillage.enus.model.iotnode.IotNodeEnUSGenApiServiceImpl Maven / Gradle / Ivy
/*
* Copyright (c) 2018-2022 Computate Limited Liability Company in Utah, USA,
* and the Smarta Byar Smart Village FIWARE IHub.
*
* This program and the accompanying materials are made available under the
* terms of the GNU GENERAL PUBLIC LICENSE Version 3 which is available at
*
* https://www.gnu.org/licenses/gpl-3.0.en.html
*
* You may not propagate or modify a covered work except as expressly provided
* under this License. Any attempt otherwise to propagate or modify it is void,
* and will automatically terminate your rights under this License (including
* any patent licenses granted under the third paragraph of section 11).
*/
package org.computate.smartvillage.enus.model.iotnode;
import org.computate.smartvillage.enus.request.SiteRequestEnUS;
import org.computate.smartvillage.enus.model.user.SiteUser;
import org.computate.vertx.api.ApiRequest;
import org.computate.vertx.search.list.SearchResult;
import org.computate.vertx.verticle.EmailVerticle;
import org.computate.smartvillage.enus.config.ConfigKeys;
import org.computate.vertx.api.BaseApiServiceImpl;
import io.vertx.ext.web.client.WebClient;
import java.util.Objects;
import io.vertx.core.WorkerExecutor;
import io.vertx.core.eventbus.EventBus;
import io.vertx.pgclient.PgPool;
import io.vertx.kafka.client.producer.KafkaProducer;
import io.vertx.core.json.impl.JsonUtil;
import io.vertx.ext.auth.authorization.AuthorizationProvider;
import io.vertx.ext.web.templ.handlebars.HandlebarsTemplateEngine;
import io.vertx.core.eventbus.DeliveryOptions;
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.time.Instant;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import org.computate.search.response.solr.SolrResponse.StatsField;
import java.util.stream.Collectors;
import io.vertx.core.json.Json;
import org.apache.commons.lang3.StringUtils;
import java.security.Principal;
import org.apache.commons.lang3.exception.ExceptionUtils;
import java.io.PrintWriter;
import java.util.Collection;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import org.computate.search.serialize.ComputateZonedDateTimeSerializer;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;
import java.util.HashSet;
import io.vertx.core.Handler;
import io.vertx.ext.web.RoutingContext;
import org.apache.commons.lang3.math.NumberUtils;
import io.vertx.ext.web.Router;
import io.vertx.core.Vertx;
import io.vertx.ext.reactivestreams.ReactiveReadStream;
import io.vertx.ext.reactivestreams.ReactiveWriteStream;
import io.vertx.core.MultiMap;
import io.vertx.ext.auth.oauth2.OAuth2Auth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.vertx.sqlclient.Transaction;
import io.vertx.sqlclient.SqlConnection;
import io.vertx.sqlclient.Tuple;
import io.vertx.sqlclient.Row;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.sql.Timestamp;
import io.vertx.core.Future;
import io.vertx.core.Promise;
import io.vertx.core.AsyncResult;
import java.net.URLEncoder;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.CompositeFuture;
import io.vertx.core.http.HttpHeaders;
import java.nio.charset.Charset;
import io.vertx.ext.auth.authorization.RoleBasedAuthorization;
import io.vertx.ext.web.api.service.ServiceRequest;
import io.vertx.ext.web.api.service.ServiceResponse;
import io.vertx.ext.web.client.predicate.ResponsePredicate;
import java.util.HashMap;
import io.vertx.ext.auth.User;
import java.util.Optional;
import java.util.stream.Stream;
import java.net.URLDecoder;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Map.Entry;
import java.util.Iterator;
import org.computate.search.tool.SearchTool;
import org.computate.search.response.solr.SolrResponse;
import java.util.Base64;
import java.time.ZonedDateTime;
import org.apache.commons.lang3.BooleanUtils;
import org.computate.vertx.search.list.SearchList;
import org.computate.smartvillage.enus.model.iotnode.IotNodePage;
/**
* Translate: false
* Generated: true
**/
public class IotNodeEnUSGenApiServiceImpl extends BaseApiServiceImpl implements IotNodeEnUSGenApiService {
protected static final Logger LOG = LoggerFactory.getLogger(IotNodeEnUSGenApiServiceImpl.class);
public IotNodeEnUSGenApiServiceImpl(EventBus eventBus, JsonObject config, WorkerExecutor workerExecutor, PgPool pgPool, KafkaProducer kafkaProducer, WebClient webClient, OAuth2Auth oauth2AuthenticationProvider, AuthorizationProvider authorizationProvider, HandlebarsTemplateEngine templateEngine) {
super(eventBus, config, workerExecutor, pgPool, kafkaProducer, webClient, oauth2AuthenticationProvider, authorizationProvider, templateEngine);
}
// Search //
@Override
public void searchIotNode(ServiceRequest serviceRequest, Handler> eventHandler) {
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
authorizationProvider.getAuthorizations(siteRequest.getUser()).onFailure(ex -> {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
}).onSuccess(b -> {
if(
!Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode")).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
&& !Optional.ofNullable(Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_READ_REQUIRED + "_IotNode")).orElse(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode"))).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
) {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
try {
searchIotNodeList(siteRequest, false, true, false).onSuccess(listIotNode -> {
response200SearchIotNode(listIotNode).onSuccess(response -> {
eventHandler.handle(Future.succeededFuture(response));
LOG.debug(String.format("searchIotNode succeeded. "));
}).onFailure(ex -> {
LOG.error(String.format("searchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
}).onFailure(ex -> {
LOG.error(String.format("searchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
} catch(Exception ex) {
LOG.error(String.format("searchIotNode failed. "), ex);
error(null, eventHandler, ex);
}
}
});
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("searchIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("searchIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
public Future response200SearchIotNode(SearchList listIotNode) {
Promise promise = Promise.promise();
try {
SiteRequestEnUS siteRequest = listIotNode.getSiteRequest_(SiteRequestEnUS.class);
List fls = listIotNode.getRequest().getFields();
JsonObject json = new JsonObject();
JsonArray l = new JsonArray();
listIotNode.getList().stream().forEach(o -> {
JsonObject json2 = JsonObject.mapFrom(o);
if(fls.size() > 0) {
Set fieldNames = new HashSet();
for(String fieldName : json2.fieldNames()) {
String v = IotNode.varIndexedIotNode(fieldName);
if(v != null)
fieldNames.add(IotNode.varIndexedIotNode(fieldName));
}
if(fls.size() == 1 && fls.stream().findFirst().orElse(null).equals("saves_docvalues_strings")) {
fieldNames.removeAll(Optional.ofNullable(json2.getJsonArray("saves_docvalues_strings")).orElse(new JsonArray()).stream().map(s -> s.toString()).collect(Collectors.toList()));
fieldNames.remove("_docvalues_long");
fieldNames.remove("created_docvalues_date");
}
else if(fls.size() >= 1) {
fieldNames.removeAll(fls);
}
for(String fieldName : fieldNames) {
if(!fls.contains(fieldName))
json2.remove(fieldName);
}
}
l.add(json2);
});
json.put("list", l);
response200Search(listIotNode.getRequest(), listIotNode.getResponse(), json);
promise.complete(ServiceResponse.completedWithJson(Buffer.buffer(Optional.ofNullable(json).orElse(new JsonObject()).encodePrettily())));
} catch(Exception ex) {
LOG.error(String.format("response200SearchIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public void responsePivotSearchIotNode(List pivots, JsonArray pivotArray) {
if(pivots != null) {
for(SolrResponse.Pivot pivotField : pivots) {
String entityIndexed = pivotField.getField();
String entityVar = StringUtils.substringBefore(entityIndexed, "_docvalues_");
JsonObject pivotJson = new JsonObject();
pivotArray.add(pivotJson);
pivotJson.put("field", entityVar);
pivotJson.put("value", pivotField.getValue());
pivotJson.put("count", pivotField.getCount());
Collection pivotRanges = pivotField.getRanges().values();
List pivotFields2 = pivotField.getPivotList();
if(pivotRanges != null) {
JsonObject rangeJson = new JsonObject();
pivotJson.put("ranges", rangeJson);
for(SolrResponse.PivotRange rangeFacet : pivotRanges) {
JsonObject rangeFacetJson = new JsonObject();
String rangeFacetVar = StringUtils.substringBefore(rangeFacet.getName(), "_docvalues_");
rangeJson.put(rangeFacetVar, rangeFacetJson);
JsonObject rangeFacetCountsObject = new JsonObject();
rangeFacetJson.put("counts", rangeFacetCountsObject);
rangeFacet.getCounts().forEach((value, count) -> {
rangeFacetCountsObject.put(value, count);
});
}
}
if(pivotFields2 != null) {
JsonArray pivotArray2 = new JsonArray();
pivotJson.put("pivot", pivotArray2);
responsePivotSearchIotNode(pivotFields2, pivotArray2);
}
}
}
}
// GET //
@Override
public void getIotNode(ServiceRequest serviceRequest, Handler> eventHandler) {
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
authorizationProvider.getAuthorizations(siteRequest.getUser()).onFailure(ex -> {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
}).onSuccess(b -> {
if(
!Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode")).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
&& !Optional.ofNullable(Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_READ_REQUIRED + "_IotNode")).orElse(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode"))).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
) {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
try {
searchIotNodeList(siteRequest, false, true, false).onSuccess(listIotNode -> {
response200GETIotNode(listIotNode).onSuccess(response -> {
eventHandler.handle(Future.succeededFuture(response));
LOG.debug(String.format("getIotNode succeeded. "));
}).onFailure(ex -> {
LOG.error(String.format("getIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
}).onFailure(ex -> {
LOG.error(String.format("getIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
} catch(Exception ex) {
LOG.error(String.format("getIotNode failed. "), ex);
error(null, eventHandler, ex);
}
}
});
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("getIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("getIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
public Future response200GETIotNode(SearchList listIotNode) {
Promise promise = Promise.promise();
try {
SiteRequestEnUS siteRequest = listIotNode.getSiteRequest_(SiteRequestEnUS.class);
JsonObject json = JsonObject.mapFrom(listIotNode.getList().stream().findFirst().orElse(null));
promise.complete(ServiceResponse.completedWithJson(Buffer.buffer(Optional.ofNullable(json).orElse(new JsonObject()).encodePrettily())));
} catch(Exception ex) {
LOG.error(String.format("response200GETIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
// PATCH //
@Override
public void patchIotNode(JsonObject body, ServiceRequest serviceRequest, Handler> eventHandler) {
LOG.debug(String.format("patchIotNode started. "));
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
authorizationProvider.getAuthorizations(siteRequest.getUser()).onFailure(ex -> {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
}).onSuccess(b -> {
if(
!Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode")).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
|| !Optional.ofNullable(Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_READ_REQUIRED + "_IotNode")).orElse(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode"))).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
) {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
try {
searchIotNodeList(siteRequest, true, false, true).onSuccess(listIotNode -> {
try {
if(listIotNode.getResponse().getResponse().getNumFound() > 1
&& !Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode")).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
) {
String message = String.format("roles required: " + config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode"));
LOG.error(message);
error(siteRequest, eventHandler, new RuntimeException(message));
} else {
ApiRequest apiRequest = new ApiRequest();
apiRequest.setRows(listIotNode.getRequest().getRows());
apiRequest.setNumFound(listIotNode.getResponse().getResponse().getNumFound());
apiRequest.setNumPATCH(0L);
apiRequest.initDeepApiRequest(siteRequest);
siteRequest.setApiRequest_(apiRequest);
if(apiRequest.getNumFound() == 1L)
apiRequest.setOriginal(listIotNode.first());
eventBus.publish("websocketIotNode", JsonObject.mapFrom(apiRequest).toString());
listPATCHIotNode(apiRequest, listIotNode).onSuccess(e -> {
response200PATCHIotNode(siteRequest).onSuccess(response -> {
LOG.debug(String.format("patchIotNode succeeded. "));
eventHandler.handle(Future.succeededFuture(response));
}).onFailure(ex -> {
LOG.error(String.format("patchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
}).onFailure(ex -> {
LOG.error(String.format("patchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
}
} catch(Exception ex) {
LOG.error(String.format("patchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
}
}).onFailure(ex -> {
LOG.error(String.format("patchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
} catch(Exception ex) {
LOG.error(String.format("patchIotNode failed. "), ex);
error(null, eventHandler, ex);
}
}
});
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("patchIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("patchIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
public Future listPATCHIotNode(ApiRequest apiRequest, SearchList listIotNode) {
Promise promise = Promise.promise();
List futures = new ArrayList<>();
SiteRequestEnUS siteRequest = listIotNode.getSiteRequest_(SiteRequestEnUS.class);
listIotNode.getList().forEach(o -> {
SiteRequestEnUS siteRequest2 = generateSiteRequest(siteRequest.getUser(), siteRequest.getUserPrincipal(), siteRequest.getServiceRequest(), siteRequest.getJsonObject(), SiteRequestEnUS.class);
o.setSiteRequest_(siteRequest2);
siteRequest2.setApiRequest_(siteRequest.getApiRequest_());
futures.add(Future.future(promise1 -> {
patchIotNodeFuture(o, false).onSuccess(a -> {
promise1.complete();
}).onFailure(ex -> {
LOG.error(String.format("listPATCHIotNode failed. "), ex);
promise1.fail(ex);
});
}));
});
CompositeFuture.all(futures).onSuccess( a -> {
listIotNode.next().onSuccess(next -> {
if(next) {
listPATCHIotNode(apiRequest, listIotNode).onSuccess(b -> {
promise.complete();
}).onFailure(ex -> {
LOG.error(String.format("listPATCHIotNode failed. "), ex);
promise.fail(ex);
});
} else {
promise.complete();
}
}).onFailure(ex -> {
LOG.error(String.format("listPATCHIotNode failed. "), ex);
promise.fail(ex);
});
}).onFailure(ex -> {
LOG.error(String.format("listPATCHIotNode failed. "), ex);
promise.fail(ex);
});
return promise.future();
}
@Override
public void patchIotNodeFuture(JsonObject body, ServiceRequest serviceRequest, Handler> eventHandler) {
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
try {
siteRequest.setJsonObject(body);
serviceRequest.getParams().getJsonObject("query").put("rows", 1);
searchIotNodeList(siteRequest, false, true, true).onSuccess(listIotNode -> {
try {
IotNode o = listIotNode.first();
if(o != null && listIotNode.getResponse().getResponse().getNumFound() == 1) {
ApiRequest apiRequest = new ApiRequest();
apiRequest.setRows(1L);
apiRequest.setNumFound(1L);
apiRequest.setNumPATCH(0L);
apiRequest.initDeepApiRequest(siteRequest);
siteRequest.setApiRequest_(apiRequest);
if(Optional.ofNullable(serviceRequest.getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getJsonArray("var")).orElse(new JsonArray()).stream().filter(s -> "refresh:false".equals(s)).count() > 0L) {
siteRequest.getRequestVars().put( "refresh", "false" );
}
if(apiRequest.getNumFound() == 1L)
apiRequest.setOriginal(o);
patchIotNodeFuture(o, false).onSuccess(o2 -> {
eventHandler.handle(Future.succeededFuture(ServiceResponse.completedWithJson(Buffer.buffer(new JsonObject().encodePrettily()))));
}).onFailure(ex -> {
eventHandler.handle(Future.failedFuture(ex));
});
} else {
eventHandler.handle(Future.succeededFuture(ServiceResponse.completedWithJson(Buffer.buffer(new JsonObject().encodePrettily()))));
}
} catch(Exception ex) {
LOG.error(String.format("patchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
}
}).onFailure(ex -> {
LOG.error(String.format("patchIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
} catch(Exception ex) {
LOG.error(String.format("patchIotNode failed. "), ex);
error(null, eventHandler, ex);
}
}).onFailure(ex -> {
LOG.error(String.format("patchIotNode failed. "), ex);
error(null, eventHandler, ex);
});
}
public Future patchIotNodeFuture(IotNode o, Boolean inheritPk) {
SiteRequestEnUS siteRequest = o.getSiteRequest_();
Promise promise = Promise.promise();
try {
ApiRequest apiRequest = siteRequest.getApiRequest_();
persistIotNode(o, true).onSuccess(c -> {
indexIotNode(o).onSuccess(e -> {
promise.complete(o);
}).onFailure(ex -> {
promise.fail(ex);
});
}).onFailure(ex -> {
promise.fail(ex);
});
} catch(Exception ex) {
LOG.error(String.format("patchIotNodeFuture failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public Future response200PATCHIotNode(SiteRequestEnUS siteRequest) {
Promise promise = Promise.promise();
try {
JsonObject json = new JsonObject();
promise.complete(ServiceResponse.completedWithJson(Buffer.buffer(Optional.ofNullable(json).orElse(new JsonObject()).encodePrettily())));
} catch(Exception ex) {
LOG.error(String.format("response200PATCHIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
// POST //
@Override
public void postIotNode(JsonObject body, ServiceRequest serviceRequest, Handler> eventHandler) {
LOG.debug(String.format("postIotNode started. "));
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
authorizationProvider.getAuthorizations(siteRequest.getUser()).onFailure(ex -> {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
}).onSuccess(b -> {
if(
!Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode")).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
|| !Optional.ofNullable(Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_READ_REQUIRED + "_IotNode")).orElse(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode"))).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
) {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
try {
ApiRequest apiRequest = new ApiRequest();
apiRequest.setRows(1L);
apiRequest.setNumFound(1L);
apiRequest.setNumPATCH(0L);
apiRequest.initDeepApiRequest(siteRequest);
siteRequest.setApiRequest_(apiRequest);
eventBus.publish("websocketIotNode", JsonObject.mapFrom(apiRequest).toString());
JsonObject params = new JsonObject();
params.put("body", siteRequest.getJsonObject());
params.put("path", new JsonObject());
params.put("cookie", new JsonObject());
params.put("header", siteRequest.getServiceRequest().getParams().getJsonObject("header"));
params.put("form", new JsonObject());
JsonObject query = new JsonObject();
Boolean softCommit = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getBoolean("softCommit")).orElse(null);
Integer commitWithin = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getInteger("commitWithin")).orElse(null);
if(softCommit == null && commitWithin == null)
softCommit = true;
if(softCommit != null)
query.put("softCommit", softCommit);
if(commitWithin != null)
query.put("commitWithin", commitWithin);
params.put("query", query);
JsonObject context = new JsonObject().put("params", params).put("user", siteRequest.getUserPrincipal());
JsonObject json = new JsonObject().put("context", context);
eventBus.request(IotNode.getClassApiAddress(), json, new DeliveryOptions().addHeader("action", "postIotNodeFuture")).onSuccess(a -> {
JsonObject responseMessage = (JsonObject)a.body();
JsonObject responseBody = new JsonObject(Buffer.buffer(JsonUtil.BASE64_DECODER.decode(responseMessage.getString("payload"))));
eventHandler.handle(Future.succeededFuture(ServiceResponse.completedWithJson(Buffer.buffer(responseBody.encodePrettily()))));
LOG.debug(String.format("postIotNode succeeded. "));
}).onFailure(ex -> {
LOG.error(String.format("postIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
} catch(Exception ex) {
LOG.error(String.format("postIotNode failed. "), ex);
error(null, eventHandler, ex);
}
}
});
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("postIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("postIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
@Override
public void postIotNodeFuture(JsonObject body, ServiceRequest serviceRequest, Handler> eventHandler) {
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
ApiRequest apiRequest = new ApiRequest();
apiRequest.setRows(1L);
apiRequest.setNumFound(1L);
apiRequest.setNumPATCH(0L);
apiRequest.initDeepApiRequest(siteRequest);
siteRequest.setApiRequest_(apiRequest);
if(Optional.ofNullable(serviceRequest.getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getJsonArray("var")).orElse(new JsonArray()).stream().filter(s -> "refresh:false".equals(s)).count() > 0L) {
siteRequest.getRequestVars().put( "refresh", "false" );
}
postIotNodeFuture(siteRequest, false).onSuccess(o -> {
eventHandler.handle(Future.succeededFuture(ServiceResponse.completedWithJson(Buffer.buffer(JsonObject.mapFrom(o).encodePrettily()))));
}).onFailure(ex -> {
eventHandler.handle(Future.failedFuture(ex));
});
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("postIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("postIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
public Future postIotNodeFuture(SiteRequestEnUS siteRequest, Boolean inheritPk) {
Promise promise = Promise.promise();
try {
createIotNode(siteRequest).onSuccess(iotNode -> {
persistIotNode(iotNode, false).onSuccess(c -> {
indexIotNode(iotNode).onSuccess(o2 -> {
promise.complete(iotNode);
}).onFailure(ex -> {
promise.fail(ex);
});
}).onFailure(ex -> {
promise.fail(ex);
});
}).onFailure(ex -> {
promise.fail(ex);
});
} catch(Exception ex) {
LOG.error(String.format("postIotNodeFuture failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public Future response200POSTIotNode(IotNode o) {
Promise promise = Promise.promise();
try {
SiteRequestEnUS siteRequest = o.getSiteRequest_();
JsonObject json = JsonObject.mapFrom(o);
promise.complete(ServiceResponse.completedWithJson(Buffer.buffer(Optional.ofNullable(json).orElse(new JsonObject()).encodePrettily())));
} catch(Exception ex) {
LOG.error(String.format("response200POSTIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
// PUTImport //
@Override
public void putimportIotNode(JsonObject body, ServiceRequest serviceRequest, Handler> eventHandler) {
LOG.debug(String.format("putimportIotNode started. "));
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
authorizationProvider.getAuthorizations(siteRequest.getUser()).onFailure(ex -> {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
}).onSuccess(b -> {
if(
!Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode")).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
|| !Optional.ofNullable(Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_READ_REQUIRED + "_IotNode")).orElse(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode"))).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
) {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
try {
ApiRequest apiRequest = new ApiRequest();
JsonArray jsonArray = Optional.ofNullable(siteRequest.getJsonObject()).map(o -> o.getJsonArray("list")).orElse(new JsonArray());
apiRequest.setRows(Long.valueOf(jsonArray.size()));
apiRequest.setNumFound(Long.valueOf(jsonArray.size()));
apiRequest.setNumPATCH(0L);
apiRequest.initDeepApiRequest(siteRequest);
siteRequest.setApiRequest_(apiRequest);
eventBus.publish("websocketIotNode", JsonObject.mapFrom(apiRequest).toString());
varsIotNode(siteRequest).onSuccess(d -> {
listPUTImportIotNode(apiRequest, siteRequest).onSuccess(e -> {
response200PUTImportIotNode(siteRequest).onSuccess(response -> {
LOG.debug(String.format("putimportIotNode succeeded. "));
eventHandler.handle(Future.succeededFuture(response));
}).onFailure(ex -> {
LOG.error(String.format("putimportIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
}).onFailure(ex -> {
LOG.error(String.format("putimportIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
}).onFailure(ex -> {
LOG.error(String.format("putimportIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
} catch(Exception ex) {
LOG.error(String.format("putimportIotNode failed. "), ex);
error(null, eventHandler, ex);
}
}
});
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("putimportIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("putimportIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
public Future listPUTImportIotNode(ApiRequest apiRequest, SiteRequestEnUS siteRequest) {
Promise promise = Promise.promise();
List futures = new ArrayList<>();
JsonArray jsonArray = Optional.ofNullable(siteRequest.getJsonObject()).map(o -> o.getJsonArray("list")).orElse(new JsonArray());
try {
jsonArray.forEach(obj -> {
futures.add(Future.future(promise1 -> {
JsonObject params = new JsonObject();
params.put("body", obj);
params.put("path", new JsonObject());
params.put("cookie", new JsonObject());
params.put("header", siteRequest.getServiceRequest().getParams().getJsonObject("header"));
params.put("form", new JsonObject());
JsonObject query = new JsonObject();
Boolean softCommit = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getBoolean("softCommit")).orElse(null);
Integer commitWithin = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getInteger("commitWithin")).orElse(null);
if(softCommit == null && commitWithin == null)
softCommit = true;
if(softCommit != null)
query.put("softCommit", softCommit);
if(commitWithin != null)
query.put("commitWithin", commitWithin);
params.put("query", query);
JsonObject context = new JsonObject().put("params", params).put("user", siteRequest.getUserPrincipal());
JsonObject json = new JsonObject().put("context", context);
eventBus.request(IotNode.getClassApiAddress(), json, new DeliveryOptions().addHeader("action", "putimportIotNodeFuture")).onSuccess(a -> {
promise1.complete();
}).onFailure(ex -> {
LOG.error(String.format("listPUTImportIotNode failed. "), ex);
promise1.fail(ex);
});
}));
});
CompositeFuture.all(futures).onSuccess(a -> {
apiRequest.setNumPATCH(apiRequest.getNumPATCH() + 1);
promise.complete();
}).onFailure(ex -> {
LOG.error(String.format("listPUTImportIotNode failed. "), ex);
promise.fail(ex);
});
} catch(Exception ex) {
LOG.error(String.format("listPUTImportIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
@Override
public void putimportIotNodeFuture(JsonObject body, ServiceRequest serviceRequest, Handler> eventHandler) {
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
try {
ApiRequest apiRequest = new ApiRequest();
apiRequest.setRows(1L);
apiRequest.setNumFound(1L);
apiRequest.setNumPATCH(0L);
apiRequest.initDeepApiRequest(siteRequest);
siteRequest.setApiRequest_(apiRequest);
String inheritPk = Optional.ofNullable(body.getString(IotNode.VAR_id)).orElse(body.getString(IotNode.VAR_id));
body.put("inheritPk", inheritPk);
body.put("inheritPk", body.getValue("id"));
if(Optional.ofNullable(serviceRequest.getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getJsonArray("var")).orElse(new JsonArray()).stream().filter(s -> "refresh:false".equals(s)).count() > 0L) {
siteRequest.getRequestVars().put( "refresh", "false" );
}
SearchList searchList = new SearchList();
searchList.setStore(true);
searchList.q("*:*");
searchList.setC(IotNode.class);
searchList.fq("deleted_docvalues_boolean:false");
searchList.fq("archived_docvalues_boolean:false");
searchList.fq("inheritPk_docvalues_string:" + SearchTool.escapeQueryChars(inheritPk));
searchList.promiseDeepForClass(siteRequest).onSuccess(a -> {
try {
if(searchList.size() >= 1) {
IotNode o = searchList.getList().stream().findFirst().orElse(null);
IotNode o2 = new IotNode();
o2.setSiteRequest_(siteRequest);
JsonObject body2 = new JsonObject();
for(String f : body.fieldNames()) {
Object bodyVal = body.getValue(f);
if(bodyVal instanceof JsonArray) {
JsonArray bodyVals = (JsonArray)bodyVal;
Object valsObj = o.obtainForClass(f);
Collection> vals = valsObj instanceof JsonArray ? ((JsonArray)valsObj).getList() : (Collection>)valsObj;
if(bodyVals.size() == vals.size()) {
Boolean match = true;
for(Object val : vals) {
if(val != null) {
if(!bodyVals.contains(val.toString())) {
match = false;
break;
}
} else {
match = false;
break;
}
}
vals.clear();
body2.put("set" + StringUtils.capitalize(f), bodyVal);
} else {
vals.clear();
body2.put("set" + StringUtils.capitalize(f), bodyVal);
}
} else {
o2.persistForClass(f, bodyVal);
o2.relateForClass(f, bodyVal);
if(!StringUtils.containsAny(f, "id", "created", "setCreated") && !Objects.equals(o.obtainForClass(f), o2.obtainForClass(f)))
body2.put("set" + StringUtils.capitalize(f), bodyVal);
}
}
for(String f : Optional.ofNullable(o.getSaves()).orElse(new ArrayList<>())) {
if(!body.fieldNames().contains(f)) {
if(!StringUtils.containsAny(f, "id", "created", "setCreated") && !Objects.equals(o.obtainForClass(f), o2.obtainForClass(f)))
body2.putNull("set" + StringUtils.capitalize(f));
}
}
if(body2.size() > 0) {
if(searchList.size() == 1) {
apiRequest.setOriginal(o);
}
siteRequest.setJsonObject(body2);
patchIotNodeFuture(o2, true).onSuccess(b -> {
LOG.debug("Import IotNode {} succeeded, modified IotNode. ", body.getValue(IotNode.VAR_id));
eventHandler.handle(Future.succeededFuture());
}).onFailure(ex -> {
LOG.error(String.format("putimportIotNodeFuture failed. "), ex);
eventHandler.handle(Future.failedFuture(ex));
});
} else {
eventHandler.handle(Future.succeededFuture());
}
} else {
postIotNodeFuture(siteRequest, true).onSuccess(b -> {
LOG.debug("Import IotNode {} succeeded, created new IotNode. ", body.getValue(IotNode.VAR_id));
eventHandler.handle(Future.succeededFuture());
}).onFailure(ex -> {
LOG.error(String.format("putimportIotNodeFuture failed. "), ex);
eventHandler.handle(Future.failedFuture(ex));
});
}
} catch(Exception ex) {
LOG.error(String.format("putimportIotNodeFuture failed. "), ex);
eventHandler.handle(Future.failedFuture(ex));
}
}).onFailure(ex -> {
LOG.error(String.format("putimportIotNodeFuture failed. "), ex);
eventHandler.handle(Future.failedFuture(ex));
});
} catch(Exception ex) {
LOG.error(String.format("putimportIotNodeFuture failed. "), ex);
eventHandler.handle(Future.failedFuture(ex));
}
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("putimportIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("putimportIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
public Future response200PUTImportIotNode(SiteRequestEnUS siteRequest) {
Promise promise = Promise.promise();
try {
JsonObject json = new JsonObject();
promise.complete(ServiceResponse.completedWithJson(Buffer.buffer(Optional.ofNullable(json).orElse(new JsonObject()).encodePrettily())));
} catch(Exception ex) {
LOG.error(String.format("response200PUTImportIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
// SearchPage //
@Override
public void searchpageIotNodeId(ServiceRequest serviceRequest, Handler> eventHandler) {
searchpageIotNode(serviceRequest, eventHandler);
}
@Override
public void searchpageIotNode(ServiceRequest serviceRequest, Handler> eventHandler) {
user(serviceRequest, SiteRequestEnUS.class, SiteUser.class, SiteUser.getClassApiAddress(), "postSiteUserFuture", "patchSiteUserFuture").onSuccess(siteRequest -> {
authorizationProvider.getAuthorizations(siteRequest.getUser()).onFailure(ex -> {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
}).onSuccess(b -> {
if(
!Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode")).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
&& !Optional.ofNullable(Optional.ofNullable(config.getString(ConfigKeys.AUTH_ROLE_READ_REQUIRED + "_IotNode")).orElse(config.getString(ConfigKeys.AUTH_ROLE_REQUIRED + "_IotNode"))).map(v -> RoleBasedAuthorization.create(v).match(siteRequest.getUser())).orElse(false)
) {
String msg = String.format("401 UNAUTHORIZED user %s to %s %s", siteRequest.getUser().attributes().getJsonObject("accessToken").getString("preferred_username"), serviceRequest.getExtra().getString("method"), serviceRequest.getExtra().getString("uri"));
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", msg)
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
try {
searchIotNodeList(siteRequest, false, true, false).onSuccess(listIotNode -> {
response200SearchPageIotNode(listIotNode).onSuccess(response -> {
eventHandler.handle(Future.succeededFuture(response));
LOG.debug(String.format("searchpageIotNode succeeded. "));
}).onFailure(ex -> {
LOG.error(String.format("searchpageIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
}).onFailure(ex -> {
LOG.error(String.format("searchpageIotNode failed. "), ex);
error(siteRequest, eventHandler, ex);
});
} catch(Exception ex) {
LOG.error(String.format("searchpageIotNode failed. "), ex);
error(null, eventHandler, ex);
}
}
});
}).onFailure(ex -> {
if("Inactive Token".equals(ex.getMessage()) || StringUtils.startsWith(ex.getMessage(), "invalid_grant:")) {
try {
eventHandler.handle(Future.succeededFuture(new ServiceResponse(302, "Found", null, MultiMap.caseInsensitiveMultiMap().add(HttpHeaders.LOCATION, "/logout?redirect_uri=" + URLEncoder.encode(serviceRequest.getExtra().getString("uri"), "UTF-8")))));
} catch(Exception ex2) {
LOG.error(String.format("searchpageIotNode failed. ", ex2));
error(null, eventHandler, ex2);
}
} else if(StringUtils.startsWith(ex.getMessage(), "401 UNAUTHORIZED ")) {
eventHandler.handle(Future.succeededFuture(
new ServiceResponse(401, "UNAUTHORIZED",
Buffer.buffer().appendString(
new JsonObject()
.put("errorCode", "401")
.put("errorMessage", "SSO Resource Permission check returned DENY")
.encodePrettily()
), MultiMap.caseInsensitiveMultiMap()
)
));
} else {
LOG.error(String.format("searchpageIotNode failed. "), ex);
error(null, eventHandler, ex);
}
});
}
public void searchpageIotNodePageInit(IotNodePage page, SearchList listIotNode) {
}
public String templateSearchPageIotNode() {
return Optional.ofNullable(config.getString(ConfigKeys.TEMPLATE_PATH)).orElse("templates") + "/enUS/IotNodePage";
}
public Future response200SearchPageIotNode(SearchList listIotNode) {
Promise promise = Promise.promise();
try {
SiteRequestEnUS siteRequest = listIotNode.getSiteRequest_(SiteRequestEnUS.class);
IotNodePage page = new IotNodePage();
MultiMap requestHeaders = MultiMap.caseInsensitiveMultiMap();
siteRequest.setRequestHeaders(requestHeaders);
page.setSearchListIotNode_(listIotNode);
page.setSiteRequest_(siteRequest);
page.promiseDeepIotNodePage(siteRequest).onSuccess(a -> {
JsonObject json = JsonObject.mapFrom(page);
json.put(ConfigKeys.STATIC_BASE_URL, config.getString(ConfigKeys.STATIC_BASE_URL));
json.put(ConfigKeys.GITHUB_ORG, config.getString(ConfigKeys.GITHUB_ORG));
json.put(ConfigKeys.SITE_NAME, config.getString(ConfigKeys.SITE_NAME));
json.put(ConfigKeys.SITE_DISPLAY_NAME, config.getString(ConfigKeys.SITE_DISPLAY_NAME));
json.put(ConfigKeys.SITE_POWERED_BY_URL, config.getString(ConfigKeys.SITE_POWERED_BY_URL));
json.put(ConfigKeys.SITE_POWERED_BY_NAME, config.getString(ConfigKeys.SITE_POWERED_BY_NAME));
json.put(ConfigKeys.SITE_POWERED_BY_IMAGE_URI, config.getString(ConfigKeys.SITE_POWERED_BY_IMAGE_URI));
templateEngine.render(json, templateSearchPageIotNode()).onSuccess(buffer -> {
promise.complete(new ServiceResponse(200, "OK", buffer, requestHeaders));
}).onFailure(ex -> {
promise.fail(ex);
});
}).onFailure(ex -> {
promise.fail(ex);
});
} catch(Exception ex) {
LOG.error(String.format("response200SearchPageIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
// General //
public Future createIotNode(SiteRequestEnUS siteRequest) {
Promise promise = Promise.promise();
try {
IotNode o = new IotNode();
o.setSiteRequest_(siteRequest);
promise.complete(o);
} catch(Exception ex) {
LOG.error(String.format("createIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public void searchIotNodeQ(SearchList searchList, String entityVar, String valueIndexed, String varIndexed) {
searchList.q(varIndexed + ":" + ("*".equals(valueIndexed) ? valueIndexed : SearchTool.escapeQueryChars(valueIndexed)));
if(!"*".equals(entityVar)) {
}
}
public String searchIotNodeFq(SearchList searchList, String entityVar, String valueIndexed, String varIndexed) {
if(varIndexed == null)
throw new RuntimeException(String.format("\"%s\" is not an indexed entity. ", entityVar));
if(StringUtils.startsWith(valueIndexed, "[")) {
String[] fqs = StringUtils.substringAfter(StringUtils.substringBeforeLast(valueIndexed, "]"), "[").split(" TO ");
if(fqs.length != 2)
throw new RuntimeException(String.format("\"%s\" invalid range query. ", valueIndexed));
String fq1 = fqs[0].equals("*") ? fqs[0] : IotNode.staticSearchFqForClass(entityVar, searchList.getSiteRequest_(SiteRequestEnUS.class), fqs[0]);
String fq2 = fqs[1].equals("*") ? fqs[1] : IotNode.staticSearchFqForClass(entityVar, searchList.getSiteRequest_(SiteRequestEnUS.class), fqs[1]);
return varIndexed + ":[" + fq1 + " TO " + fq2 + "]";
} else {
return varIndexed + ":" + SearchTool.escapeQueryChars(IotNode.staticSearchFqForClass(entityVar, searchList.getSiteRequest_(SiteRequestEnUS.class), valueIndexed)).replace("\\", "\\\\");
}
}
public void searchIotNodeSort(SearchList searchList, String entityVar, String valueIndexed, String varIndexed) {
if(varIndexed == null)
throw new RuntimeException(String.format("\"%s\" is not an indexed entity. ", entityVar));
searchList.sort(varIndexed, valueIndexed);
}
public void searchIotNodeRows(SearchList searchList, Long valueRows) {
searchList.rows(valueRows != null ? valueRows : 10L);
}
public void searchIotNodeStart(SearchList searchList, Long valueStart) {
searchList.start(valueStart);
}
public void searchIotNodeVar(SearchList searchList, String var, String value) {
searchList.getSiteRequest_(SiteRequestEnUS.class).getRequestVars().put(var, value);
}
public void searchIotNodeUri(SearchList searchList) {
}
public Future varsIotNode(SiteRequestEnUS siteRequest) {
Promise promise = Promise.promise();
try {
ServiceRequest serviceRequest = siteRequest.getServiceRequest();
serviceRequest.getParams().getJsonObject("query").stream().filter(paramRequest -> "var".equals(paramRequest.getKey()) && paramRequest.getValue() != null).findFirst().ifPresent(paramRequest -> {
String entityVar = null;
String valueIndexed = null;
Object paramValuesObject = paramRequest.getValue();
JsonArray paramObjects = paramValuesObject instanceof JsonArray ? (JsonArray)paramValuesObject : new JsonArray().add(paramValuesObject);
try {
for(Object paramObject : paramObjects) {
entityVar = StringUtils.trim(StringUtils.substringBefore((String)paramObject, ":"));
valueIndexed = URLDecoder.decode(StringUtils.trim(StringUtils.substringAfter((String)paramObject, ":")), "UTF-8");
siteRequest.getRequestVars().put(entityVar, valueIndexed);
}
} catch(Exception ex) {
LOG.error(String.format("searchIotNode failed. "), ex);
promise.fail(ex);
}
});
promise.complete();
} catch(Exception ex) {
LOG.error(String.format("searchIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public Future> searchIotNodeList(SiteRequestEnUS siteRequest, Boolean populate, Boolean store, Boolean modify) {
Promise> promise = Promise.promise();
try {
ServiceRequest serviceRequest = siteRequest.getServiceRequest();
String entityListStr = siteRequest.getServiceRequest().getParams().getJsonObject("query").getString("fl");
String[] entityList = entityListStr == null ? null : entityListStr.split(",\\s*");
SearchList searchList = new SearchList();
String facetRange = null;
Date facetRangeStart = null;
Date facetRangeEnd = null;
String facetRangeGap = null;
String statsField = null;
String statsFieldIndexed = null;
searchList.setPopulate(populate);
searchList.setStore(store);
searchList.q("*:*");
searchList.setC(IotNode.class);
searchList.setSiteRequest_(siteRequest);
if(entityList != null) {
for(String v : entityList) {
searchList.fl(IotNode.varIndexedIotNode(v));
}
}
String id = serviceRequest.getParams().getJsonObject("path").getString("id");
if(id != null && NumberUtils.isCreatable(id)) {
searchList.fq("(_docvalues_long:" + SearchTool.escapeQueryChars(id) + " OR objectId_docvalues_string:" + SearchTool.escapeQueryChars(id) + ")");
} else if(id != null) {
searchList.fq("objectId_docvalues_string:" + SearchTool.escapeQueryChars(id));
}
for(String paramName : serviceRequest.getParams().getJsonObject("query").fieldNames()) {
Object paramValuesObject = serviceRequest.getParams().getJsonObject("query").getValue(paramName);
String entityVar = null;
String valueIndexed = null;
String varIndexed = null;
String valueSort = null;
Long valueStart = null;
Long valueRows = null;
String valueCursorMark = null;
JsonArray paramObjects = paramValuesObject instanceof JsonArray ? (JsonArray)paramValuesObject : new JsonArray().add(paramValuesObject);
try {
if(paramValuesObject != null && "facet.pivot".equals(paramName)) {
Matcher mFacetPivot = Pattern.compile("(?:(\\{![^\\}]+\\}))?(.*)").matcher(StringUtils.join(paramObjects.getList().toArray(), ","));
boolean foundFacetPivot = mFacetPivot.find();
if(foundFacetPivot) {
String solrLocalParams = mFacetPivot.group(1);
String[] entityVars = mFacetPivot.group(2).trim().split(",");
String[] varsIndexed = new String[entityVars.length];
for(Integer i = 0; i < entityVars.length; i++) {
entityVar = entityVars[i];
varsIndexed[i] = IotNode.varIndexedIotNode(entityVar);
}
searchList.facetPivot((solrLocalParams == null ? "" : solrLocalParams) + StringUtils.join(varsIndexed, ","));
}
} else if(paramValuesObject != null) {
for(Object paramObject : paramObjects) {
if(paramName.equals("q")) {
Matcher mQ = Pattern.compile("(\\w+):(.+?(?=(\\)|\\s+OR\\s+|\\s+AND\\s+|\\^|$)))").matcher((String)paramObject);
boolean foundQ = mQ.find();
if(foundQ) {
StringBuffer sb = new StringBuffer();
while(foundQ) {
entityVar = mQ.group(1).trim();
valueIndexed = mQ.group(2).trim();
varIndexed = IotNode.varIndexedIotNode(entityVar);
String entityQ = searchIotNodeFq(searchList, entityVar, valueIndexed, varIndexed);
mQ.appendReplacement(sb, entityQ);
foundQ = mQ.find();
}
mQ.appendTail(sb);
searchList.q(sb.toString());
}
} else if(paramName.equals("fq")) {
Matcher mFq = Pattern.compile("(\\w+):(.+?(?=(\\)|\\s+OR\\s+|\\s+AND\\s+|$)))").matcher((String)paramObject);
boolean foundFq = mFq.find();
if(foundFq) {
StringBuffer sb = new StringBuffer();
while(foundFq) {
entityVar = mFq.group(1).trim();
valueIndexed = mFq.group(2).trim();
varIndexed = IotNode.varIndexedIotNode(entityVar);
String entityFq = searchIotNodeFq(searchList, entityVar, valueIndexed, varIndexed);
mFq.appendReplacement(sb, entityFq);
foundFq = mFq.find();
}
mFq.appendTail(sb);
searchList.fq(sb.toString());
}
} else if(paramName.equals("sort")) {
entityVar = StringUtils.trim(StringUtils.substringBefore((String)paramObject, " "));
valueIndexed = StringUtils.trim(StringUtils.substringAfter((String)paramObject, " "));
varIndexed = IotNode.varIndexedIotNode(entityVar);
searchIotNodeSort(searchList, entityVar, valueIndexed, varIndexed);
} else if(paramName.equals("start")) {
valueStart = paramObject instanceof Long ? (Long)paramObject : Long.parseLong(paramObject.toString());
searchIotNodeStart(searchList, valueStart);
} else if(paramName.equals("rows")) {
valueRows = paramObject instanceof Long ? (Long)paramObject : Long.parseLong(paramObject.toString());
searchIotNodeRows(searchList, valueRows);
} else if(paramName.equals("stats")) {
searchList.stats((Boolean)paramObject);
} else if(paramName.equals("stats.field")) {
Matcher mStats = Pattern.compile("(?:(\\{![^\\}]+\\}))?(.*)").matcher((String)paramObject);
boolean foundStats = mStats.find();
if(foundStats) {
String solrLocalParams = mStats.group(1);
entityVar = mStats.group(2).trim();
varIndexed = IotNode.varIndexedIotNode(entityVar);
searchList.statsField((solrLocalParams == null ? "" : solrLocalParams) + varIndexed);
statsField = entityVar;
statsFieldIndexed = varIndexed;
}
} else if(paramName.equals("facet")) {
searchList.facet((Boolean)paramObject);
} else if(paramName.equals("facet.range.start")) {
String startMathStr = (String)paramObject;
Date start = SearchTool.parseMath(startMathStr);
searchList.facetRangeStart(start.toInstant().toString());
facetRangeStart = start;
} else if(paramName.equals("facet.range.end")) {
String endMathStr = (String)paramObject;
Date end = SearchTool.parseMath(endMathStr);
searchList.facetRangeEnd(end.toInstant().toString());
facetRangeEnd = end;
} else if(paramName.equals("facet.range.gap")) {
String gap = (String)paramObject;
searchList.facetRangeGap(gap);
facetRangeGap = gap;
} else if(paramName.equals("facet.range")) {
Matcher mFacetRange = Pattern.compile("(?:(\\{![^\\}]+\\}))?(.*)").matcher((String)paramObject);
boolean foundFacetRange = mFacetRange.find();
if(foundFacetRange) {
String solrLocalParams = mFacetRange.group(1);
entityVar = mFacetRange.group(2).trim();
varIndexed = IotNode.varIndexedIotNode(entityVar);
searchList.facetRange((solrLocalParams == null ? "" : solrLocalParams) + varIndexed);
facetRange = entityVar;
}
} else if(paramName.equals("facet.field")) {
entityVar = (String)paramObject;
varIndexed = IotNode.varIndexedIotNode(entityVar);
if(varIndexed != null)
searchList.facetField(varIndexed);
} else if(paramName.equals("var")) {
entityVar = StringUtils.trim(StringUtils.substringBefore((String)paramObject, ":"));
valueIndexed = URLDecoder.decode(StringUtils.trim(StringUtils.substringAfter((String)paramObject, ":")), "UTF-8");
searchIotNodeVar(searchList, entityVar, valueIndexed);
} else if(paramName.equals("cursorMark")) {
valueCursorMark = (String)paramObject;
searchList.cursorMark((String)paramObject);
}
}
searchIotNodeUri(searchList);
}
} catch(Exception e) {
ExceptionUtils.rethrow(e);
}
}
if("*:*".equals(searchList.getQuery()) && searchList.getSorts().size() == 0) {
searchList.sort("created_docvalues_date", "desc");
}
String facetRange2 = facetRange;
Date facetRangeStart2 = facetRangeStart;
Date facetRangeEnd2 = facetRangeEnd;
String facetRangeGap2 = facetRangeGap;
String statsField2 = statsField;
String statsFieldIndexed2 = statsFieldIndexed;
searchIotNode2(siteRequest, populate, store, modify, searchList);
searchList.promiseDeepForClass(siteRequest).onSuccess(a -> {
if(facetRange2 != null && statsField2 != null && facetRange2.equals(statsField2)) {
StatsField stats = searchList.getResponse().getStats().getStatsFields().get(statsFieldIndexed2);
Instant min = Optional.ofNullable(stats.getMin()).map(val -> Instant.parse(val.toString())).orElse(Instant.now());
Instant max = Optional.ofNullable(stats.getMax()).map(val -> Instant.parse(val.toString())).orElse(Instant.now());
if(min.equals(max)) {
min = min.minus(1, ChronoUnit.DAYS);
max = max.plus(2, ChronoUnit.DAYS);
}
Duration duration = Duration.between(min, max);
String gap = "DAY";
if(duration.toDays() >= 365)
gap = "YEAR";
else if(duration.toDays() >= 28)
gap = "MONTH";
else if(duration.toDays() >= 1)
gap = "DAY";
else if(duration.toHours() >= 1)
gap = "HOUR";
else if(duration.toMinutes() >= 1)
gap = "MINUTE";
else if(duration.toMillis() >= 1000)
gap = "SECOND";
else if(duration.toMillis() >= 1)
gap = "MILLI";
if(facetRangeStart2 == null)
searchList.facetRangeStart(min.toString());
if(facetRangeEnd2 == null)
searchList.facetRangeEnd(max.toString());
if(facetRangeGap2 == null)
searchList.facetRangeGap(String.format("+1%s", gap));
searchList.query().onSuccess(b -> {
promise.complete(searchList);
}).onFailure(ex -> {
LOG.error(String.format("searchIotNode failed. "), ex);
promise.fail(ex);
});
} else {
promise.complete(searchList);
}
}).onFailure(ex -> {
LOG.error(String.format("searchIotNode failed. "), ex);
promise.fail(ex);
});
} catch(Exception ex) {
LOG.error(String.format("searchIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public void searchIotNode2(SiteRequestEnUS siteRequest, Boolean populate, Boolean store, Boolean modify, SearchList searchList) {
}
public Future persistIotNode(IotNode o, Boolean patch) {
Promise promise = Promise.promise();
try {
SiteRequestEnUS siteRequest = o.getSiteRequest_();
try {
JsonObject jsonObject = siteRequest.getJsonObject();
jsonObject.forEach(definition -> {
String columnName;
Object columnValue;
if(patch && StringUtils.startsWith(definition.getKey(), "set")) {
columnName = StringUtils.uncapitalize(StringUtils.substringAfter(definition.getKey(), "set"));
columnValue = definition.getValue();
} else {
columnName = definition.getKey();
columnValue = definition.getValue();
}
if(!"".equals(columnName)) {
try {
o.persistForClass(columnName, columnValue);
} catch(Exception e) {
LOG.error(String.format("persistIotNode failed. "), e);
}
}
});
promise.complete();
} catch(Exception ex) {
LOG.error(String.format("persistIotNode failed. "), ex);
promise.fail(ex);
}
} catch(Exception ex) {
LOG.error(String.format("persistIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public Future indexIotNode(IotNode o) {
Promise promise = Promise.promise();
try {
SiteRequestEnUS siteRequest = o.getSiteRequest_();
ApiRequest apiRequest = siteRequest.getApiRequest_();
o.promiseDeepForClass(siteRequest).onSuccess(a -> {
JsonObject json = new JsonObject();
JsonObject add = new JsonObject();
json.put("add", add);
JsonObject doc = new JsonObject();
add.put("doc", doc);
o.indexIotNode(doc);
String solrHostName = siteRequest.getConfig().getString(ConfigKeys.SOLR_HOST_NAME);
Integer solrPort = siteRequest.getConfig().getInteger(ConfigKeys.SOLR_PORT);
String solrCollection = siteRequest.getConfig().getString(ConfigKeys.SOLR_COLLECTION);
Boolean solrSsl = siteRequest.getConfig().getBoolean(ConfigKeys.SOLR_SSL);
Boolean softCommit = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getBoolean("softCommit")).orElse(null);
Integer commitWithin = Optional.ofNullable(siteRequest.getServiceRequest().getParams()).map(p -> p.getJsonObject("query")).map( q -> q.getInteger("commitWithin")).orElse(null);
if(softCommit == null && commitWithin == null)
softCommit = true;
else if(softCommit == null)
softCommit = false;
String solrRequestUri = String.format("/solr/%s/update%s%s%s", solrCollection, "?overwrite=true&wt=json", softCommit ? "&softCommit=true" : "", commitWithin != null ? ("&commitWithin=" + commitWithin) : "");
webClient.post(solrPort, solrHostName, solrRequestUri).ssl(solrSsl).putHeader("Content-Type", "application/json").expect(ResponsePredicate.SC_OK).sendBuffer(json.toBuffer()).onSuccess(b -> {
promise.complete(o);
}).onFailure(ex -> {
LOG.error(String.format("indexIotNode failed. "), new RuntimeException(ex));
promise.fail(ex);
});
}).onFailure(ex -> {
LOG.error(String.format("indexIotNode failed. "), ex);
promise.fail(ex);
});
} catch(Exception ex) {
LOG.error(String.format("indexIotNode failed. "), ex);
promise.fail(ex);
}
return promise.future();
}
public String searchVar(String varIndexed) {
return IotNode.searchVarIotNode(varIndexed);
}
@Override
public String getClassApiAddress() {
return IotNode.CLASS_API_ADDRESS_IotNode;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy