Search in sources :

Example 1 with ProtocolConfiguration

use of org.openremote.model.asset.agent.ProtocolConfiguration in project openremote by openremote.

the class AbstractHttpServerProtocol method createDeployment.

protected ResteasyDeployment createDeployment(Application application, AssetAttribute protocolConfiguration) {
    ResteasyDeployment resteasyDeployment = new ResteasyDeployment();
    resteasyDeployment.setApplication(application);
    List<String> allowedOrigins;
    if (devMode) {
        allowedOrigins = Collections.singletonList("*");
    } else {
        Optional<MetaItem> allowedOriginsMeta = protocolConfiguration.getMetaItem(META_PROTOCOL_ALLOWED_ORIGINS);
        allowedOrigins = allowedOriginsMeta.flatMap(AbstractValueHolder::getValueAsString).map(Collections::singletonList).orElseGet(() -> allowedOriginsMeta.flatMap(AbstractValueHolder::getValueAsArray).flatMap(arrayValue -> Values.getArrayElements(arrayValue, StringValue.class, true, false, StringValue::getString)).orElse(null));
    }
    if (allowedOrigins != null) {
        String allowedMethods = protocolConfiguration.getMetaItem(META_PROTOCOL_ALLOWED_METHODS).flatMap(AbstractValueHolder::getValueAsString).orElse(DEFAULT_ALLOWED_METHODS);
        if (TextUtil.isNullOrEmpty(allowedMethods)) {
            throw new IllegalArgumentException("Allowed methods meta item must be a non empty string: " + META_PROTOCOL_ALLOWED_METHODS);
        }
        CorsFilter corsFilter = new CorsFilter();
        corsFilter.getAllowedOrigins().addAll(allowedOrigins);
        corsFilter.setAllowedMethods(allowedMethods);
        resteasyDeployment.getProviders().add(corsFilter);
    }
    return resteasyDeployment;
}
Also used : java.util(java.util) ServletException(javax.servlet.ServletException) ProtocolConfiguration(org.openremote.model.asset.agent.ProtocolConfiguration) AttributeRef(org.openremote.model.attribute.AttributeRef) ArrayValue(org.openremote.model.value.ArrayValue) Application(javax.ws.rs.core.Application) ServletInfo(io.undertow.servlet.api.ServletInfo) HttpMethod(javax.ws.rs.HttpMethod) Level(java.util.logging.Level) Servlets(io.undertow.servlet.Servlets) Container(org.openremote.container.Container) Lists(com.google.common.collect.Lists) ResteasyDeployment(org.jboss.resteasy.spi.ResteasyDeployment) TextUtil(org.openremote.model.util.TextUtil) PROTOCOL_NAMESPACE(org.openremote.model.Constants.PROTOCOL_NAMESPACE) AbstractValueHolder(org.openremote.model.AbstractValueHolder) StringValue(org.openremote.model.value.StringValue) org.openremote.container.web(org.openremote.container.web) Pair(org.openremote.model.util.Pair) ModelValueMessageBodyConverter(org.openremote.container.json.ModelValueMessageBodyConverter) Logger(java.util.logging.Logger) DeploymentManager(io.undertow.servlet.api.DeploymentManager) HttpServlet30Dispatcher(org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher) AbstractProtocol(org.openremote.agent.protocol.AbstractProtocol) HttpHandler(io.undertow.server.HttpHandler) MetaItem(org.openremote.model.attribute.MetaItem) IdentityService(org.openremote.container.security.IdentityService) CorsFilter(org.jboss.resteasy.plugins.interceptors.CorsFilter) RoleBasedSecurityFeature(org.jboss.resteasy.plugins.interceptors.RoleBasedSecurityFeature) JacksonConfig(org.openremote.container.json.JacksonConfig) DeploymentInfo(io.undertow.servlet.api.DeploymentInfo) Values(org.openremote.model.value.Values) Pattern(java.util.regex.Pattern) ValueHolder(org.openremote.model.ValueHolder) AssetAttribute(org.openremote.model.asset.AssetAttribute) CorsFilter(org.jboss.resteasy.plugins.interceptors.CorsFilter) ResteasyDeployment(org.jboss.resteasy.spi.ResteasyDeployment) MetaItem(org.openremote.model.attribute.MetaItem) AbstractValueHolder(org.openremote.model.AbstractValueHolder) StringValue(org.openremote.model.value.StringValue)

Example 2 with ProtocolConfiguration

use of org.openremote.model.asset.agent.ProtocolConfiguration in project openremote by openremote.

the class HttpClientProtocol method doLinkAttribute.

@Override
protected void doLinkAttribute(AssetAttribute attribute, AssetAttribute protocolConfiguration) {
    AttributeRef protocolConfigurationRef = protocolConfiguration.getReferenceOrThrow();
    Pair<ResteasyWebTarget, List<Integer>> clientAndFailureCodes;
    clientAndFailureCodes = clientMap.get(protocolConfigurationRef);
    WebTarget client = clientAndFailureCodes != null ? clientAndFailureCodes.key : null;
    if (client == null) {
        LOG.warning("Attempt to link attribute to non existent protocol configuration: " + attribute.getReferenceOrThrow());
        return;
    }
    String method = Values.getMetaItemValueOrThrow(attribute, META_ATTRIBUTE_METHOD, StringValue.class, false, true).map(StringValue::getString).orElse(DEFAULT_HTTP_METHOD);
    String path = Values.getMetaItemValueOrThrow(attribute, META_ATTRIBUTE_PATH, StringValue.class, false, true).map(StringValue::getString).orElse(null);
    String contentType = Values.getMetaItemValueOrThrow(attribute, META_ATTRIBUTE_CONTENT_TYPE, StringValue.class, false, true).map(StringValue::getString).orElse(null);
    Value body = attribute.getMetaItem(META_ATTRIBUTE_BODY).flatMap(AbstractValueHolder::getValue).orElse(null);
    List<Integer> failureCodes = attribute.getMetaItem(META_FAILURE_CODES).flatMap(AbstractValueHolder::getValueAsArray).flatMap(arrayValue -> Values.getArrayElements(arrayValue, NumberValue.class, true, false, number -> Values.getIntegerCoerced(number).orElse(null))).map(fCodes -> {
        if (clientAndFailureCodes.value != null) {
            fCodes.addAll(clientAndFailureCodes.value);
        }
        return fCodes;
    }).orElseGet(() -> {
        if (clientAndFailureCodes.value != null) {
            return clientAndFailureCodes.value;
        }
        return null;
    });
    MultivaluedMap<String, String> headers = Values.getMetaItemValueOrThrow(attribute, META_HEADERS, ObjectValue.class, false, true).flatMap(objectValue -> getMultivaluedMap(objectValue, true)).orElse(null);
    MultivaluedMap<String, String> queryParams = Values.getMetaItemValueOrThrow(attribute, META_QUERY_PARAMETERS, ObjectValue.class, false, true).flatMap(objectValue -> getMultivaluedMap(objectValue, false)).orElse(null);
    Optional<Integer> pollingSeconds = Values.getMetaItemValueOrThrow(attribute, META_ATTRIBUTE_POLLING_SECONDS, NumberValue.class, false, true).map(polling -> Values.getIntegerCoerced(polling).map(seconds -> seconds < 1 ? null : seconds).orElseThrow(() -> new IllegalArgumentException("Polling seconds meta item must be an integer >= 1")));
    final AttributeRef attributeRef = attribute.getReferenceOrThrow();
    boolean updateConnectionStatus = !pollingMap.containsKey(protocolConfigurationRef);
    HttpClientRequest clientRequest = buildClientRequest(client, path, method, headers, queryParams, failureCodes, updateConnectionStatus, body, contentType);
    LOG.fine("Creating HTTP request for linked attribute '" + clientRequest + "': " + attributeRef);
    requestMap.put(attributeRef, clientRequest);
    pollingSeconds.ifPresent(seconds -> pollingMap.put(attributeRef, schedulePollingRequest(attributeRef, protocolConfigurationRef, clientRequest, seconds)));
}
Also used : ScheduledFuture(java.util.concurrent.ScheduledFuture) ProtocolConfiguration(org.openremote.model.asset.agent.ProtocolConfiguration) ConnectionStatus(org.openremote.model.asset.agent.ConnectionStatus) HashMap(java.util.HashMap) ResteasyWebTarget(org.jboss.resteasy.client.jaxrs.ResteasyWebTarget) HttpMethod(javax.ws.rs.HttpMethod) Level(java.util.logging.Level) Container(org.openremote.container.Container) MediaType(javax.ws.rs.core.MediaType) Future(java.util.concurrent.Future) Map(java.util.Map) TextUtil(org.openremote.model.util.TextUtil) PROTOCOL_NAMESPACE(org.openremote.model.Constants.PROTOCOL_NAMESPACE) AbstractValueHolder(org.openremote.model.AbstractValueHolder) Pair(org.openremote.model.util.Pair) IOException(java.io.IOException) Invocation(javax.ws.rs.client.Invocation) Logger(java.util.logging.Logger) Entity(javax.ws.rs.client.Entity) MultivaluedHashMap(javax.ws.rs.core.MultivaluedHashMap) AbstractProtocol(org.openremote.agent.protocol.AbstractProtocol) AssetMeta(org.openremote.model.asset.AssetMeta) MultivaluedMap(javax.ws.rs.core.MultivaluedMap) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) List(java.util.List) org.openremote.model.value(org.openremote.model.value) Response(javax.ws.rs.core.Response) org.openremote.model.attribute(org.openremote.model.attribute) Optional(java.util.Optional) WebTarget(javax.ws.rs.client.WebTarget) AssetAttribute(org.openremote.model.asset.AssetAttribute) Protocol(org.openremote.agent.protocol.Protocol) GlobalLock.withLock(org.openremote.container.concurrent.GlobalLock.withLock) ResteasyWebTarget(org.jboss.resteasy.client.jaxrs.ResteasyWebTarget) List(java.util.List) ResteasyWebTarget(org.jboss.resteasy.client.jaxrs.ResteasyWebTarget) WebTarget(javax.ws.rs.client.WebTarget)

Example 3 with ProtocolConfiguration

use of org.openremote.model.asset.agent.ProtocolConfiguration in project openremote by openremote.

the class HttpClientProtocol method doLinkProtocolConfiguration.

@Override
protected void doLinkProtocolConfiguration(AssetAttribute protocolConfiguration) {
    final AttributeRef protocolRef = protocolConfiguration.getReferenceOrThrow();
    if (!protocolConfiguration.isEnabled()) {
        updateStatus(protocolRef, ConnectionStatus.DISABLED);
        return;
    }
    String baseUri = protocolConfiguration.getMetaItem(META_PROTOCOL_BASE_URI).flatMap(AbstractValueHolder::getValueAsString).orElseThrow(() -> new IllegalArgumentException("Missing or invalid require meta item: " + META_PROTOCOL_BASE_URI));
    /* We're going to fail hard and fast if optional meta items are incorrectly configured */
    Optional<OAuthGrant> oAuthGrant = getOAuthGrant(protocolConfiguration);
    Optional<StringValue> username = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_USERNAME, StringValue.class, false, true);
    Optional<StringValue> password = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_PASSWORD, StringValue.class, false, true);
    boolean followRedirects = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_FOLLOW_REDIRECTS, BooleanValue.class, false, true).map(BooleanValue::getBoolean).orElse(false);
    List<Integer> failureCodes = protocolConfiguration.getMetaItem(META_FAILURE_CODES).flatMap(AbstractValueHolder::getValueAsArray).flatMap(arrayValue -> Values.getArrayElements(arrayValue, NumberValue.class, true, false, number -> Values.getIntegerCoerced(number).orElse(null))).orElse(null);
    Optional<MultivaluedMap<String, String>> headers = Values.getMetaItemValueOrThrow(protocolConfiguration, META_HEADERS, ObjectValue.class, false, true).flatMap(objectValue -> getMultivaluedMap(objectValue, true));
    Optional<MultivaluedMap<String, String>> queryParams = Values.getMetaItemValueOrThrow(protocolConfiguration, META_QUERY_PARAMETERS, ObjectValue.class, false, true).flatMap(objectValue -> getMultivaluedMap(objectValue, false));
    String pingPath = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_PING_PATH, StringValue.class, false, true).map(StringValue::getString).orElse(null);
    if ((username.isPresent() && !password.isPresent()) || (!username.isPresent() && password.isPresent())) {
        throw new IllegalArgumentException("Both username and password must be set for basic authentication");
    }
    WebTargetBuilder webTargetBuilder = new WebTargetBuilder(baseUri);
    if (oAuthGrant.isPresent()) {
        LOG.info("Adding OAuth");
        webTargetBuilder.setOAuthAuthentication(oAuthGrant.get());
    } else {
        // noinspection ConstantConditions
        username.ifPresent(stringValue -> {
            LOG.info("Adding Basic Authentication");
            webTargetBuilder.setBasicAuthentication(stringValue.getString(), password.get().getString());
        });
    }
    headers.ifPresent(webTargetBuilder::setInjectHeaders);
    queryParams.ifPresent(webTargetBuilder::setInjectQueryParameters);
    webTargetBuilder.followRedirects(followRedirects);
    LOG.fine("Creating web target client '" + baseUri + "'");
    ResteasyWebTarget client = webTargetBuilder.build();
    clientMap.put(protocolRef, new Pair<>(client, failureCodes));
    updateStatus(protocolRef, ConnectionStatus.UNKNOWN);
    if (pingPath == null) {
        return;
    }
    String pingMethod = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_PING_METHOD, StringValue.class, false, true).map(StringValue::getString).orElse(DEFAULT_HTTP_METHOD);
    Value pingBody = protocolConfiguration.getMetaItem(META_PROTOCOL_PING_BODY).flatMap(AbstractValueHolder::getValue).orElse(null);
    MultivaluedMap<String, String> pingQueryParams = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_PING_QUERY_PARAMETERS, ObjectValue.class, false, true).flatMap(objectValue -> getMultivaluedMap(objectValue, false)).orElse(null);
    Integer pingPollingSeconds = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_PING_SECONDS, NumberValue.class, false, true).map(polling -> Values.getIntegerCoerced(polling).map(seconds -> seconds < 1 ? null : seconds).orElseThrow(() -> new IllegalArgumentException("Ping polling seconds meta item must be an integer >= 1"))).orElse(DEFAULT_PING_SECONDS);
    String contentType = Values.getMetaItemValueOrThrow(protocolConfiguration, META_PROTOCOL_PING_CONTENT_TYPE, StringValue.class, false, true).map(StringValue::getString).orElse(null);
    HttpClientRequest pingRequest = buildClientRequest(client, pingPath, pingMethod, null, pingQueryParams, null, true, pingBody, contentType);
    LOG.info("Creating ping polling request '" + pingRequest + "'");
    requestMap.put(protocolRef, pingRequest);
    pollingMap.put(protocolRef, schedulePollingRequest(null, protocolRef, pingRequest, pingPollingSeconds));
}
Also used : ScheduledFuture(java.util.concurrent.ScheduledFuture) ProtocolConfiguration(org.openremote.model.asset.agent.ProtocolConfiguration) ConnectionStatus(org.openremote.model.asset.agent.ConnectionStatus) HashMap(java.util.HashMap) ResteasyWebTarget(org.jboss.resteasy.client.jaxrs.ResteasyWebTarget) HttpMethod(javax.ws.rs.HttpMethod) Level(java.util.logging.Level) Container(org.openremote.container.Container) MediaType(javax.ws.rs.core.MediaType) Future(java.util.concurrent.Future) Map(java.util.Map) TextUtil(org.openremote.model.util.TextUtil) PROTOCOL_NAMESPACE(org.openremote.model.Constants.PROTOCOL_NAMESPACE) AbstractValueHolder(org.openremote.model.AbstractValueHolder) Pair(org.openremote.model.util.Pair) IOException(java.io.IOException) Invocation(javax.ws.rs.client.Invocation) Logger(java.util.logging.Logger) Entity(javax.ws.rs.client.Entity) MultivaluedHashMap(javax.ws.rs.core.MultivaluedHashMap) AbstractProtocol(org.openremote.agent.protocol.AbstractProtocol) AssetMeta(org.openremote.model.asset.AssetMeta) MultivaluedMap(javax.ws.rs.core.MultivaluedMap) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) List(java.util.List) org.openremote.model.value(org.openremote.model.value) Response(javax.ws.rs.core.Response) org.openremote.model.attribute(org.openremote.model.attribute) Optional(java.util.Optional) WebTarget(javax.ws.rs.client.WebTarget) AssetAttribute(org.openremote.model.asset.AssetAttribute) Protocol(org.openremote.agent.protocol.Protocol) GlobalLock.withLock(org.openremote.container.concurrent.GlobalLock.withLock) AbstractValueHolder(org.openremote.model.AbstractValueHolder) ResteasyWebTarget(org.jboss.resteasy.client.jaxrs.ResteasyWebTarget) MultivaluedMap(javax.ws.rs.core.MultivaluedMap)

Example 4 with ProtocolConfiguration

use of org.openremote.model.asset.agent.ProtocolConfiguration in project openremote by openremote.

the class AssetEditActivity method getLinkableAssetsAndAttributes.

@Override
public void getLinkableAssetsAndAttributes(ValueHolder valueHolder, Consumer<Map<AttributeRefEditor.AssetInfo, List<AttributeRefEditor.AttributeInfo>>> assetAttributeConsumer) {
    AssetQuery query;
    Predicate<AssetAttribute> attributeFilter = null;
    // Is it agent or attribute link?
    if ((valueHolder instanceof MetaItem) && AgentLink.isAgentLink((MetaItem) valueHolder)) {
        query = new AssetQuery().select(new AssetQuery.Select(AssetQuery.Include.ONLY_ID_AND_NAME_AND_ATTRIBUTES)).type(AssetType.AGENT);
        // the query will be automatically restricted to the logged in users realm)
        if (!isNullOrEmpty(asset.getRealmId())) {
            query.tenant(new TenantPredicate(asset.getRealmId()));
        }
        // Agents must have protocol configurations
        query.attributeMeta(new AttributeMetaPredicate(AssetMeta.PROTOCOL_CONFIGURATION, new BooleanPredicate(true)));
        // Only show protocol configurations
        attributeFilter = ProtocolConfiguration::isProtocolConfiguration;
    } else {
        query = new AssetQuery().select(new AssetQuery.Select(AssetQuery.Include.ONLY_ID_AND_NAME_AND_ATTRIBUTE_NAMES));
        // otherwise the query will be automatically restricted to the logged in users realm)
        if (!isNullOrEmpty(asset.getRealmId())) {
            query.tenant(new AssetQuery.TenantPredicate(asset.getRealmId()));
        }
    }
    // Do request
    final Predicate<AssetAttribute> finalAttributeFilter = attributeFilter;
    environment.getApp().getRequests().sendWithAndReturn(assetArrayMapper, assetQueryMapper, requestParams -> assetResource.queryAssets(requestParams, query), 200, assets -> {
        Map<AttributeRefEditor.AssetInfo, List<AttributeRefEditor.AttributeInfo>> assetAttributeMap = Arrays.stream(assets).filter(asset -> !asset.getAttributesList().isEmpty()).collect(Collectors.toMap(asset -> new AttributeRefEditor.AssetInfo(asset.getName(), asset.getId()), asset -> asset.getAttributesStream().filter(attribute -> finalAttributeFilter == null || finalAttributeFilter.test(attribute)).map(attribute -> new AttributeRefEditor.AttributeInfo(attribute.getName().orElse(null), attribute.getLabelOrName().orElse(null))).collect(Collectors.toList())));
        assetAttributeConsumer.accept(assetAttributeMap);
    }, exception -> assetAttributeConsumer.accept(new HashMap<>()));
}
Also used : org.openremote.app.client.assets.attributes(org.openremote.app.client.assets.attributes) java.util(java.util) Environment(org.openremote.app.client.Environment) ProtocolConfiguration(org.openremote.model.asset.agent.ProtocolConfiguration) ATTRIBUTE_NAME_VALIDATOR(org.openremote.model.attribute.Attribute.ATTRIBUTE_NAME_VALIDATOR) ObjectValueMapper(org.openremote.app.client.interop.value.ObjectValueMapper) FormButton(org.openremote.app.client.widget.FormButton) ShowSuccessEvent(org.openremote.app.client.event.ShowSuccessEvent) AgentLink(org.openremote.model.asset.agent.AgentLink) Inject(javax.inject.Inject) AttributeRefEditor(org.openremote.app.client.widget.AttributeRefEditor) IsWidget(com.google.gwt.user.client.ui.IsWidget) AssetTreeNode(org.openremote.app.client.assets.browser.AssetTreeNode) org.openremote.model.asset(org.openremote.model.asset) FileInfoMapper(org.openremote.app.client.interop.jackson.FileInfoMapper) BrowserTreeNode(org.openremote.app.client.assets.browser.BrowserTreeNode) Consumer(org.openremote.model.interop.Consumer) AgentResource(org.openremote.model.asset.agent.AgentResource) MapResource(org.openremote.model.map.MapResource) ValueType(org.openremote.model.value.ValueType) AttributeLinkEditor(org.openremote.app.client.widget.AttributeLinkEditor) Predicate(java.util.function.Predicate) Pair(org.openremote.model.util.Pair) ShowFailureEvent(org.openremote.app.client.event.ShowFailureEvent) ValueEditors(org.openremote.app.client.widget.ValueEditors) EnumUtil(org.openremote.model.util.EnumUtil) AssetAttribute.attributesFromJson(org.openremote.model.asset.AssetAttribute.attributesFromJson) JsonEditor(org.openremote.app.client.app.dialog.JsonEditor) Collectors(java.util.stream.Collectors) org.openremote.app.client.assets(org.openremote.app.client.assets) Value(org.openremote.model.value.Value) Provider(com.google.inject.Provider) AssetBrowser(org.openremote.app.client.assets.browser.AssetBrowser) AssetQuery(org.openremote.model.asset.AssetQuery) org.openremote.model.attribute(org.openremote.model.attribute) ConstraintViolation(org.openremote.model.http.ConstraintViolation) ProtocolDescriptor(org.openremote.model.asset.agent.ProtocolDescriptor) TenantTreeNode(org.openremote.app.client.assets.browser.TenantTreeNode) TextUtil.isNullOrEmpty(org.openremote.model.util.TextUtil.isNullOrEmpty) ValueHolder(org.openremote.model.ValueHolder) Attribute.isAttributeNameEqualTo(org.openremote.model.attribute.Attribute.isAttributeNameEqualTo) MetaItem.isMetaNameEqualTo(org.openremote.model.attribute.MetaItem.isMetaNameEqualTo) AssetQuery(org.openremote.model.asset.AssetQuery) AttributeRefEditor(org.openremote.app.client.widget.AttributeRefEditor) ProtocolConfiguration(org.openremote.model.asset.agent.ProtocolConfiguration)

Aggregations

ProtocolConfiguration (org.openremote.model.asset.agent.ProtocolConfiguration)4 Pair (org.openremote.model.util.Pair)4 Level (java.util.logging.Level)3 Logger (java.util.logging.Logger)3 HttpMethod (javax.ws.rs.HttpMethod)3 AbstractProtocol (org.openremote.agent.protocol.AbstractProtocol)3 Container (org.openremote.container.Container)3 AbstractValueHolder (org.openremote.model.AbstractValueHolder)3 PROTOCOL_NAMESPACE (org.openremote.model.Constants.PROTOCOL_NAMESPACE)3 AssetAttribute (org.openremote.model.asset.AssetAttribute)3 org.openremote.model.attribute (org.openremote.model.attribute)3 TextUtil (org.openremote.model.util.TextUtil)3 IOException (java.io.IOException)2 java.util (java.util)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Map (java.util.Map)2 Optional (java.util.Optional)2 Future (java.util.concurrent.Future)2 ScheduledFuture (java.util.concurrent.ScheduledFuture)2