Search in sources :

Example 6 with Value

use of org.openremote.model.value.Value in project openremote by openremote.

the class MetaEditor method onMetaItemTypeChanged.

protected void onMetaItemTypeChanged(MetaItemEditor itemEditor, boolean updateItem) {
    if (updateItem) {
        itemEditor.item.clearValue();
        // TODO Should use meta item descriptors from server
        Value initialValue = Arrays.stream(AssetMeta.values()).filter(assetMeta -> assetMeta.getUrn().equals(itemEditor.nameList.getSelectedValue())).map(MetaItemDescriptor::getInitialValue).findFirst().orElse(null);
        ValueType valueType = EnumUtil.enumFromString(ValueType.class, itemEditor.typeList.getSelectedValue()).orElse(null);
        if (valueType == ValueType.BOOLEAN && initialValue == null) {
            initialValue = Values.create(false);
        }
        itemEditor.onModified(initialValue);
    }
    itemEditor.updateValueEditor();
}
Also used : IntStream(java.util.stream.IntStream) Supplier(org.openremote.model.interop.Supplier) java.util(java.util) ValueType(org.openremote.model.value.ValueType) Environment(org.openremote.app.client.Environment) MetaItemDescriptor(org.openremote.model.attribute.MetaItemDescriptor) Pair(org.openremote.model.util.Pair) EnumUtil(org.openremote.model.util.EnumUtil) ValidationFailure(org.openremote.model.ValidationFailure) org.openremote.app.client.widget(org.openremote.app.client.widget) Collectors(java.util.stream.Collectors) AssetMeta(org.openremote.model.asset.AssetMeta) AttributeValidationResult(org.openremote.model.attribute.AttributeValidationResult) MetaItem(org.openremote.model.attribute.MetaItem) AgentLink(org.openremote.model.asset.agent.AgentLink) Value(org.openremote.model.value.Value) FlowPanel(com.google.gwt.user.client.ui.FlowPanel) ProtocolDescriptor(org.openremote.model.asset.agent.ProtocolDescriptor) IsWidget(com.google.gwt.user.client.ui.IsWidget) Values(org.openremote.model.value.Values) TextUtil.isNullOrEmpty(org.openremote.model.util.TextUtil.isNullOrEmpty) AssetAttribute(org.openremote.model.asset.AssetAttribute) ValueType(org.openremote.model.value.ValueType) Value(org.openremote.model.value.Value) MetaItemDescriptor(org.openremote.model.attribute.MetaItemDescriptor)

Example 7 with Value

use of org.openremote.model.value.Value in project openremote by openremote.

the class MetaEditor method showMetaItemFailure.

protected void showMetaItemFailure(MetaItemEditor metaItemEditor, List<ValidationFailure> failures) {
    if (failures != null) {
        Optional<MetaItemDescriptor> optionalMetaItemDescriptor = metaItemEditor.getCurrentDescriptor();
        String displayName = optionalMetaItemDescriptor.map(metaItemDescriptor -> getMetaItemDisplayName(environment, metaItemDescriptor.name())).orElse(metaItemEditor.getItem().getName().orElse(""));
        failures.forEach(failure -> {
            if (failure.getReason() == MetaItem.MetaItemFailureReason.META_ITEM_VALUE_IS_REQUIRED) {
                // Substitute in value type info
                String parameter = EnumUtil.enumFromString(ValueType.class, metaItemEditor.getTypeList().getSelectedValue()).map(Enum::name).orElse("Value");
                failure = new ValidationFailure(failure.getReason(), parameter);
            }
            showValidationError(attribute.getName().orElse(""), displayName, failure);
        });
    }
}
Also used : IntStream(java.util.stream.IntStream) Supplier(org.openremote.model.interop.Supplier) java.util(java.util) ValueType(org.openremote.model.value.ValueType) Environment(org.openremote.app.client.Environment) MetaItemDescriptor(org.openremote.model.attribute.MetaItemDescriptor) Pair(org.openremote.model.util.Pair) EnumUtil(org.openremote.model.util.EnumUtil) ValidationFailure(org.openremote.model.ValidationFailure) org.openremote.app.client.widget(org.openremote.app.client.widget) Collectors(java.util.stream.Collectors) AssetMeta(org.openremote.model.asset.AssetMeta) AttributeValidationResult(org.openremote.model.attribute.AttributeValidationResult) MetaItem(org.openremote.model.attribute.MetaItem) AgentLink(org.openremote.model.asset.agent.AgentLink) Value(org.openremote.model.value.Value) FlowPanel(com.google.gwt.user.client.ui.FlowPanel) ProtocolDescriptor(org.openremote.model.asset.agent.ProtocolDescriptor) IsWidget(com.google.gwt.user.client.ui.IsWidget) Values(org.openremote.model.value.Values) TextUtil.isNullOrEmpty(org.openremote.model.util.TextUtil.isNullOrEmpty) AssetAttribute(org.openremote.model.asset.AssetAttribute) MetaItemDescriptor(org.openremote.model.attribute.MetaItemDescriptor) ValidationFailure(org.openremote.model.ValidationFailure)

Example 8 with Value

use of org.openremote.model.value.Value in project openremote by openremote.

the class AssetProcessingService method configure.

@Override
public void configure() throws Exception {
    // A client wants to write attribute state through event bus
    from(CLIENT_EVENT_TOPIC).routeId("FromClientUpdates").filter(body().isInstanceOf(AttributeEvent.class)).setHeader(HEADER_SOURCE, () -> CLIENT).to(ASSET_QUEUE);
    // Process attribute events
    /* TODO This message consumer should be transactionally consistent with the database, this is currently not the case

         Our "if I have not processed this message before" duplicate detection:

          - discard events with source time greater than server processing time (future events)
          - discard events with source time less than last applied/stored event source time
          - allow the rest (also events with same source time, order of application undefined)

         Possible improvements moving towards at-least-once:

         - Make AssetUpdateProcessor transactional with a two-phase commit API
         - Replace at-most-once ClientEventService with at-least-once capable, embeddable message broker/protocol
         - See pseudocode here: http://activemq.apache.org/should-i-use-xa.html
         - Do we want JMS/AMQP/WSS or SOME_API/MQTT/WSS? ActiveMQ or Moquette?
        */
    from(ASSET_QUEUE).routeId("AssetQueueProcessor").filter(body().isInstanceOf(AttributeEvent.class)).doTry().process(exchange -> withLock(getClass().getSimpleName() + "::processFromAssetQueue", () -> {
        AttributeEvent event = exchange.getIn().getBody(AttributeEvent.class);
        LOG.finest("Processing: " + event);
        if (event.getEntityId() == null || event.getEntityId().isEmpty())
            return;
        if (event.getAttributeName() == null || event.getAttributeName().isEmpty())
            return;
        Source source = exchange.getIn().getHeader(HEADER_SOURCE, () -> null, Source.class);
        if (source == null) {
            throw new AssetProcessingException(MISSING_SOURCE);
        }
        // Process the asset update in a database transaction, this ensures that processors
        // will see consistent database state and we only commit if no processor failed. This
        // still won't make this procedure consistent with the message queue from which we consume!
        persistenceService.doTransaction(em -> {
            ServerAsset asset = assetStorageService.find(em, event.getEntityId(), true);
            if (asset == null)
                throw new AssetProcessingException(ASSET_NOT_FOUND);
            AssetAttribute oldAttribute = asset.getAttribute(event.getAttributeName()).orElse(null);
            if (oldAttribute == null)
                throw new AssetProcessingException(ATTRIBUTE_NOT_FOUND);
            // Agent attributes can't be updated with events
            if (asset.getWellKnownType() == AssetType.AGENT) {
                throw new AssetProcessingException(ILLEGAL_AGENT_UPDATE);
            }
            // For executable attributes, non-sensor sources can set a writable attribute execute status
            if (oldAttribute.isExecutable() && source != SENSOR) {
                Optional<AttributeExecuteStatus> status = event.getValue().flatMap(Values::getString).flatMap(AttributeExecuteStatus::fromString);
                if (status.isPresent() && !status.get().isWrite()) {
                    throw new AssetProcessingException(INVALID_ATTRIBUTE_EXECUTE_STATUS);
                }
            }
            switch(source) {
                case CLIENT:
                    AuthContext authContext = exchange.getIn().getHeader(Constants.AUTH_CONTEXT, AuthContext.class);
                    if (authContext == null) {
                        throw new AssetProcessingException(NO_AUTH_CONTEXT);
                    }
                    // Check realm, must be accessible
                    if (!identityService.getIdentityProvider().isTenantActiveAndAccessible(authContext, asset)) {
                        throw new AssetProcessingException(INSUFFICIENT_ACCESS);
                    }
                    // Check read-only
                    if (oldAttribute.isReadOnly() && !authContext.isSuperUser()) {
                        throw new AssetProcessingException(INSUFFICIENT_ACCESS);
                    }
                    // Regular user must have write assets role
                    if (!authContext.hasResourceRoleOrIsSuperUser(ClientRole.WRITE_ASSETS.getValue(), Constants.KEYCLOAK_CLIENT_ID)) {
                        throw new AssetProcessingException(INSUFFICIENT_ACCESS);
                    }
                    // Check restricted user
                    if (identityService.getIdentityProvider().isRestrictedUser(authContext.getUserId())) {
                        // Must be asset linked to user
                        if (!assetStorageService.isUserAsset(authContext.getUserId(), event.getEntityId())) {
                            throw new AssetProcessingException(INSUFFICIENT_ACCESS);
                        }
                        // Must be writable by restricted client
                        if (!oldAttribute.isAccessRestrictedWrite()) {
                            throw new AssetProcessingException(INSUFFICIENT_ACCESS);
                        }
                    }
                    break;
                case SENSOR:
                    Optional<AssetAttribute> protocolConfiguration = getAgentLink(oldAttribute).flatMap(agentService::getProtocolConfiguration);
                    // Sensor event must be for an attribute linked to a protocol configuration
                    if (!protocolConfiguration.isPresent()) {
                        throw new AssetProcessingException(INVALID_AGENT_LINK);
                    }
                    break;
            }
            // Either use the timestamp of the event or set event time to processing time
            long processingTime = timerService.getCurrentTimeMillis();
            long eventTime = event.getTimestamp() > 0 ? event.getTimestamp() : processingTime;
            // the attribute until after that time (maybe that is desirable behaviour)
            if (eventTime - processingTime > 0) {
                // TODO: Decide how to handle update events in the future - ignore or change timestamp
                throw new AssetProcessingException(EVENT_IN_FUTURE, "current time: " + new Date(processingTime) + "/" + processingTime + ", event time: " + new Date(eventTime) + "/" + eventTime);
            }
            // Check the last update timestamp of the attribute, ignoring any event that is older than last update
            // TODO This means we drop out-of-sequence events but accept events with the same source timestamp
            // TODO Several attribute events can occur in the same millisecond, then order of application is undefined
            oldAttribute.getValueTimestamp().filter(t -> t >= 0 && eventTime < t).ifPresent(lastStateTime -> {
                throw new AssetProcessingException(EVENT_OUTDATED, "last asset state time: " + new Date(lastStateTime) + "/" + lastStateTime + ", event time: " + new Date(eventTime) + "/" + eventTime);
            });
            // Create a copy of the attribute and set the new value and timestamp
            AssetAttribute updatedAttribute = oldAttribute.deepCopy();
            updatedAttribute.setValue(event.getValue().orElse(null), eventTime);
            // Validate constraints of attribute
            List<ValidationFailure> validationFailures = updatedAttribute.getValidationFailures();
            if (!validationFailures.isEmpty()) {
                throw new AssetProcessingException(ATTRIBUTE_VALIDATION_FAILURE, validationFailures.toString());
            }
            // Push through all processors
            boolean consumedCompletely = processAssetUpdate(em, asset, updatedAttribute, source);
            // Publish a new event for clients if no processor consumed the update completely
            if (!consumedCompletely) {
                publishClientEvent(asset, updatedAttribute);
            }
        });
    })).endDoTry().doCatch(AssetProcessingException.class).process(handleAssetProcessingException(LOG));
}
Also used : ClientRole(org.openremote.model.security.ClientRole) AuthContext(org.openremote.container.security.AuthContext) AssetDatapointService(org.openremote.manager.datapoint.AssetDatapointService) Date(java.util.Date) CLIENT_EVENT_TOPIC(org.openremote.manager.event.ClientEventService.CLIENT_EVENT_TOPIC) ValidationFailure(org.openremote.model.ValidationFailure) Exchange(org.apache.camel.Exchange) ArrayList(java.util.ArrayList) Level(java.util.logging.Level) Processor(org.apache.camel.Processor) Container(org.openremote.container.Container) ContainerService(org.openremote.container.ContainerService) RulesService(org.openremote.manager.rules.RulesService) AttributeEvent(org.openremote.model.attribute.AttributeEvent) PersistenceService(org.openremote.container.persistence.PersistenceService) AgentService(org.openremote.manager.agent.AgentService) AgentLink.getAgentLink(org.openremote.model.asset.agent.AgentLink.getAgentLink) MessageBrokerService(org.openremote.container.message.MessageBrokerService) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) Asset(org.openremote.model.asset.Asset) AssetType(org.openremote.model.asset.AssetType) EntityManager(javax.persistence.EntityManager) Constants(org.openremote.model.Constants) Logger(java.util.logging.Logger) MessageBrokerSetupService(org.openremote.container.message.MessageBrokerSetupService) Collectors(java.util.stream.Collectors) Reason(org.openremote.manager.asset.AssetProcessingException.Reason) AssetResource(org.openremote.model.asset.AssetResource) HEADER_SOURCE(org.openremote.model.attribute.AttributeEvent.HEADER_SOURCE) Value(org.openremote.model.value.Value) ClientEventService(org.openremote.manager.event.ClientEventService) List(java.util.List) RouteBuilder(org.apache.camel.builder.RouteBuilder) TimerService(org.openremote.container.timer.TimerService) Optional(java.util.Optional) Source(org.openremote.model.attribute.AttributeEvent.Source) Values(org.openremote.model.value.Values) AssetAttribute(org.openremote.model.asset.AssetAttribute) Protocol(org.openremote.agent.protocol.Protocol) AttributeExecuteStatus(org.openremote.model.attribute.AttributeExecuteStatus) GlobalLock.withLock(org.openremote.container.concurrent.GlobalLock.withLock) AuthContext(org.openremote.container.security.AuthContext) AttributeEvent(org.openremote.model.attribute.AttributeEvent) Source(org.openremote.model.attribute.AttributeEvent.Source) Date(java.util.Date) ValidationFailure(org.openremote.model.ValidationFailure) AttributeExecuteStatus(org.openremote.model.attribute.AttributeExecuteStatus) AssetAttribute(org.openremote.model.asset.AssetAttribute)

Example 9 with Value

use of org.openremote.model.value.Value in project openremote by openremote.

the class AssetStorageService method buildAttributeFilter.

protected String buildAttributeFilter(AssetQuery.AttributePredicate attributePredicate, List<ParameterBinder> binders) {
    StringBuilder attributeBuilder = new StringBuilder();
    if (attributePredicate.name != null) {
        attributeBuilder.append(attributePredicate.name.caseSensitive ? " and AX.key" : " and upper(AX.key)");
        switch(attributePredicate.name.match) {
            case EXACT:
                attributeBuilder.append(" = ? ");
                break;
            case NOT_EXACT:
                attributeBuilder.append(" <> ? ");
                break;
            case BEGIN:
            case END:
            case CONTAINS:
                attributeBuilder.append(" like ? ");
                break;
        }
        final int pos = binders.size() + 1;
        binders.add(st -> st.setString(pos, attributePredicate.name.prepareValue()));
    }
    if (attributePredicate.value != null) {
        if (attributePredicate.value instanceof AssetQuery.StringPredicate) {
            AssetQuery.StringPredicate stringPredicate = (AssetQuery.StringPredicate) attributePredicate.value;
            attributeBuilder.append(stringPredicate.caseSensitive ? " and AX.VALUE #>> '{value}'" : " and upper(AX.VALUE #>> '{value}')");
            switch(stringPredicate.match) {
                case EXACT:
                    attributeBuilder.append(" = ? ");
                    break;
                case NOT_EXACT:
                    attributeBuilder.append(" <> ? ");
                    break;
                case BEGIN:
                case END:
                case CONTAINS:
                    attributeBuilder.append(" like ? ");
                    break;
            }
            final int pos = binders.size() + 1;
            binders.add(st -> st.setString(pos, stringPredicate.prepareValue()));
        } else if (attributePredicate.value instanceof AssetQuery.BooleanPredicate) {
            AssetQuery.BooleanPredicate booleanPredicate = (AssetQuery.BooleanPredicate) attributePredicate.value;
            attributeBuilder.append(" and AX.VALUE #> '{value}' = to_jsonb(").append(booleanPredicate.value).append(")");
        } else if (attributePredicate.value instanceof AssetQuery.StringArrayPredicate) {
            AssetQuery.StringArrayPredicate stringArrayPredicate = (AssetQuery.StringArrayPredicate) attributePredicate.value;
            for (int i = 0; i < stringArrayPredicate.predicates.length; i++) {
                AssetQuery.StringPredicate stringPredicate = stringArrayPredicate.predicates[i];
                attributeBuilder.append(stringPredicate.caseSensitive ? " and AX.VALUE #> '{value}' ->> " + i : " and upper(AX.VALUE #> '{value}' ->> " + i + ")");
                switch(stringPredicate.match) {
                    case EXACT:
                        attributeBuilder.append(" = ? ");
                        break;
                    case NOT_EXACT:
                        attributeBuilder.append(" <> ? ");
                        break;
                    case BEGIN:
                    case END:
                    case CONTAINS:
                        attributeBuilder.append(" like ? ");
                        break;
                }
                final int pos = binders.size() + 1;
                binders.add(st -> st.setString(pos, stringPredicate.prepareValue()));
            }
        } else if (attributePredicate.value instanceof AssetQuery.DateTimePredicate) {
            AssetQuery.DateTimePredicate dateTimePredicate = (AssetQuery.DateTimePredicate) attributePredicate.value;
            attributeBuilder.append(" and to_timestamp(AX.VALUE #>> '{value}', ?)");
            final int keyFormatPos = binders.size() + 1;
            binders.add(st -> st.setString(keyFormatPos, dateTimePredicate.dateFormat));
            final int pos = binders.size() + 1;
            binders.add(st -> st.setString(pos, dateTimePredicate.value));
            final int formatPos = binders.size() + 1;
            binders.add(st -> st.setString(formatPos, dateTimePredicate.dateFormat));
            switch(dateTimePredicate.operator) {
                case EQUALS:
                    attributeBuilder.append(" = to_timestamp(?, ?)");
                    break;
                case NOT_EQUALS:
                    attributeBuilder.append(" <> to_timestamp(?, ?)");
                    break;
                case GREATER_THAN:
                    attributeBuilder.append(" > to_timestamp(?, ?)");
                    break;
                case GREATER_EQUALS:
                    attributeBuilder.append(" >= to_timestamp(?, ?)");
                    break;
                case LESS_THAN:
                    attributeBuilder.append(" < to_timestamp(?, ?)");
                    break;
                case LESS_EQUALS:
                    attributeBuilder.append(" <= to_timestamp(?, ?)");
                    break;
                case BETWEEN:
                    attributeBuilder.append(" BETWEEN to_timestamp(?, ?) AND to_timestamp(?, ?)");
                    final int pos2 = binders.size() + 1;
                    binders.add(st -> st.setString(pos2, dateTimePredicate.rangeValue));
                    final int formatPos2 = binders.size() + 1;
                    binders.add(st -> st.setString(formatPos2, dateTimePredicate.dateFormat));
                    break;
            }
        } else if (attributePredicate.value instanceof AssetQuery.NumberPredicate) {
            AssetQuery.NumberPredicate numberPredicate = (AssetQuery.NumberPredicate) attributePredicate.value;
            attributeBuilder.append(" and (AX.VALUE #>> '{value}')::numeric");
            switch(numberPredicate.operator) {
                case EQUALS:
                default:
                    attributeBuilder.append(" = ?");
                    break;
                case NOT_EQUALS:
                    attributeBuilder.append(" <> ?");
                    break;
                case GREATER_THAN:
                    attributeBuilder.append(" > ?");
                    break;
                case GREATER_EQUALS:
                    attributeBuilder.append(" >= ?");
                    break;
                case LESS_THAN:
                    attributeBuilder.append(" < ?");
                    break;
                case LESS_EQUALS:
                    attributeBuilder.append(" <= ?");
                    break;
                case BETWEEN:
                    attributeBuilder.append(" BETWEEN ? AND ?");
                    break;
            }
            final int pos = binders.size() + 1;
            switch(numberPredicate.numberType) {
                case DOUBLE:
                default:
                    binders.add(st -> st.setDouble(pos, numberPredicate.value));
                    if (numberPredicate.operator == Operator.BETWEEN) {
                        final int pos2 = binders.size() + 1;
                        binders.add(st -> st.setDouble(pos, numberPredicate.rangeValue));
                    }
                    break;
                case INTEGER:
                    binders.add(st -> st.setInt(pos, (int) numberPredicate.value));
                    if (numberPredicate.operator == Operator.BETWEEN) {
                        final int pos2 = binders.size() + 1;
                        binders.add(st -> st.setInt(pos2, (int) numberPredicate.rangeValue));
                    }
                    break;
            }
        }
    }
    return attributeBuilder.toString();
}
Also used : ClientRole(org.openremote.model.security.ClientRole) DateTime(net.fortuna.ical4j.model.DateTime) AuthContext(org.openremote.container.security.AuthContext) Date(java.util.Date) NoResultException(javax.persistence.NoResultException) RRule(net.fortuna.ical4j.model.property.RRule) Period(net.fortuna.ical4j.model.Period) ObjectValue(org.openremote.model.value.ObjectValue) UserConfiguration(org.openremote.manager.security.UserConfiguration) Dur(net.fortuna.ical4j.model.Dur) PersistenceEvent.isPersistenceEventForEntityType(org.openremote.container.persistence.PersistenceEvent.isPersistenceEventForEntityType) AttributeEvent(org.openremote.model.attribute.AttributeEvent) TextUtil(org.openremote.model.util.TextUtil) PERSISTENCE_TOPIC(org.openremote.container.persistence.PersistenceEvent.PERSISTENCE_TOPIC) Constants(org.openremote.model.Constants) Logger(java.util.logging.Logger) MessageBrokerSetupService(org.openremote.container.message.MessageBrokerSetupService) Value(org.openremote.model.value.Value) RouteBuilder(org.apache.camel.builder.RouteBuilder) Recur(net.fortuna.ical4j.model.Recur) TextUtil.isNullOrEmpty(org.openremote.model.util.TextUtil.isNullOrEmpty) ALL(org.openremote.model.asset.BaseAssetQuery.Include.ALL) PersistenceEvent(org.openremote.container.persistence.PersistenceEvent) java.sql(java.sql) CalendarEvent(org.openremote.model.calendar.CalendarEvent) java.util(java.util) BaseAssetQuery(org.openremote.model.asset.BaseAssetQuery) WebService(org.openremote.container.web.WebService) CLIENT_EVENT_TOPIC(org.openremote.manager.event.ClientEventService.CLIENT_EVENT_TOPIC) Session(org.hibernate.Session) ValidationFailure(org.openremote.model.ValidationFailure) RESTRICTED_READ(org.openremote.model.asset.BaseAssetQuery.Access.RESTRICTED_READ) Point(com.vividsolutions.jts.geom.Point) AbstractReturningWork(org.hibernate.jdbc.AbstractReturningWork) PGobject(org.postgresql.util.PGobject) Container(org.openremote.container.Container) TenantFilter(org.openremote.model.event.shared.TenantFilter) ContainerService(org.openremote.container.ContainerService) PeriodRule(net.fortuna.ical4j.filter.PeriodRule) PersistenceService(org.openremote.container.persistence.PersistenceService) ClientEventService.getSessionKey(org.openremote.manager.event.ClientEventService.getSessionKey) org.openremote.model.asset(org.openremote.model.asset) VEvent(net.fortuna.ical4j.model.component.VEvent) MessageBrokerService(org.openremote.container.message.MessageBrokerService) User(org.openremote.model.security.User) ALL_EXCEPT_PATH_AND_ATTRIBUTES(org.openremote.model.asset.BaseAssetQuery.Include.ALL_EXCEPT_PATH_AND_ATTRIBUTES) ManagerIdentityService(org.openremote.manager.security.ManagerIdentityService) PRIVATE_READ(org.openremote.model.asset.BaseAssetQuery.Access.PRIVATE_READ) RecurrenceRule(org.openremote.model.calendar.RecurrenceRule) EntityManager(javax.persistence.EntityManager) Consumer(java.util.function.Consumer) ClientEventService(org.openremote.manager.event.ClientEventService) TimerService(org.openremote.container.timer.TimerService) Values(org.openremote.model.value.Values) BaseAssetQuery(org.openremote.model.asset.BaseAssetQuery) Point(com.vividsolutions.jts.geom.Point)

Example 10 with Value

use of org.openremote.model.value.Value in project openremote by openremote.

the class Simulator method writeView.

protected void writeView() {
    clear();
    addLabel(environment.getMessages().simulator());
    formGroups.clear();
    List<SimulatorElement> sortedElements = Arrays.asList(simulatorState.getElements());
    sortedElements.sort(Comparator.comparing(o -> simulatorState.getElementName(o)));
    for (SimulatorElement element : sortedElements) {
        FormGroup formGroup = new FormGroup();
        String elementName = simulatorState.getElementName(element);
        FormLabel formLabel = new FormLabel(elementName);
        formLabel.addStyleName("largest");
        formGroup.setFormLabel(formLabel);
        FormField formField = new FormField();
        formGroup.setFormField(formField);
        // Don't push simulator value validation up to the presenter as it is a special case that should
        // just be evaluated in-situ and shouldn't invalidate the parent attribute
        Consumer<Value> onModified = value -> {
            element.setValue(value);
            List<ValidationFailure> failures = element.getValidationFailures();
            formGroup.setError(failures != null && !failures.isEmpty());
        };
        ValueType valueType = element.getExpectedType().getValueType();
        IsWidget editor = valueEditorSupplier.createValueEditor(element, valueType, style, parentView, onModified);
        formField.add(editor);
        formGroups.put(element.getAttributeRef(), formGroup);
        add(formGroup);
    }
    if (sortedElements.size() > 0) {
        FormGroup submitGroup = new FormGroup();
        submitGroup.getElement().getStyle().setWidth(80, com.google.gwt.dom.client.Style.Unit.PCT);
        FormField submitField = new FormField();
        submitGroup.setFormField(submitField);
        FormButton writeButton = new FormButton(environment.getMessages().writeSimulatorState());
        writeButton.setPrimary(true);
        writeButton.addClickHandler(event -> {
            if (isValid()) {
                environment.getEventService().dispatch(simulatorState);
                environment.getEventBus().dispatch(new ShowSuccessEvent(environment.getMessages().simulatorStateSubmitted()));
            }
        });
        submitField.add(writeButton);
        add(submitGroup);
    } else {
        add(new FormInlineLabel(environment.getMessages().noAttributesLinkedToSimulator()));
    }
    // "Blink" the editor so users know there might be a new value
    for (FormGroup formGroup : formGroups.values()) {
        formGroup.addStyleName(environment.getWidgetStyle().HighlightBackground());
    }
    Browser.getWindow().setTimeout(() -> {
        for (FormGroup formGroup : formGroups.values()) formGroup.removeStyleName(environment.getWidgetStyle().HighlightBackground());
    }, 250);
}
Also used : Browser(elemental.client.Browser) EventRegistration(org.openremote.model.event.bus.EventRegistration) Consumer(org.openremote.model.interop.Consumer) SimulatorState(org.openremote.model.simulator.SimulatorState) java.util(java.util) ValueType(org.openremote.model.value.ValueType) Environment(org.openremote.app.client.Environment) AttributeRef(org.openremote.model.attribute.AttributeRef) ValidationFailure(org.openremote.model.ValidationFailure) org.openremote.app.client.widget(org.openremote.app.client.widget) AttributeViewImpl(org.openremote.app.client.assets.attributes.AttributeViewImpl) RequestSimulatorState(org.openremote.model.simulator.RequestSimulatorState) ShowSuccessEvent(org.openremote.app.client.event.ShowSuccessEvent) AttributeValidationResult(org.openremote.model.attribute.AttributeValidationResult) Value(org.openremote.model.value.Value) SimulatorElement(org.openremote.model.simulator.SimulatorElement) AbstractAttributeViewExtension(org.openremote.app.client.assets.attributes.AbstractAttributeViewExtension) IsWidget(com.google.gwt.user.client.ui.IsWidget) AssetAttribute(org.openremote.model.asset.AssetAttribute) AttributeView(org.openremote.app.client.assets.attributes.AttributeView) IsWidget(com.google.gwt.user.client.ui.IsWidget) ValueType(org.openremote.model.value.ValueType) SimulatorElement(org.openremote.model.simulator.SimulatorElement) ShowSuccessEvent(org.openremote.app.client.event.ShowSuccessEvent) Value(org.openremote.model.value.Value)

Aggregations

Value (org.openremote.model.value.Value)16 ValidationFailure (org.openremote.model.ValidationFailure)6 java.util (java.util)5 Values (org.openremote.model.value.Values)5 AssetAttribute (org.openremote.model.asset.AssetAttribute)4 ValueType (org.openremote.model.value.ValueType)4 IsWidget (com.google.gwt.user.client.ui.IsWidget)3 Collectors (java.util.stream.Collectors)3 FlowPanel (com.google.gwt.user.client.ui.FlowPanel)2 UnknownHostException (java.net.UnknownHostException)2 Date (java.util.Date)2 Level (java.util.logging.Level)2 Logger (java.util.logging.Logger)2 IntStream (java.util.stream.IntStream)2 EntityManager (javax.persistence.EntityManager)2 RouteBuilder (org.apache.camel.builder.RouteBuilder)2 Environment (org.openremote.app.client.Environment)2 org.openremote.app.client.widget (org.openremote.app.client.widget)2 Container (org.openremote.container.Container)2 ContainerService (org.openremote.container.ContainerService)2