for (UnitRemote targetRemote : targetRemotes) { targetRemote.addServiceStateObserver(ServiceTempus.REQUESTED, ServiceType.POWER_STATE_SERVICE, targetRequestObserer); targetRemote.addServiceStateObserver(ServiceTempus.CURRENT, ServiceType.POWER_STATE_SERVICE, targetObserver); targetRemote.addServiceStateObserver(ServiceTempus.CURRENT, ServiceType.COLOR_STATE_SERVICE, unitRemoteColorObserverMap.get(targetRemote)); targetRemote.addServiceStateObserver(ServiceTempus.REQUESTED, ServiceType.COLOR_STATE_SERVICE, unitRemoteColorObserverMap.get(targetRemote)); if (targetRemote.isDataAvailable()) { PowerState.State powerValue = getPowerState(targetRemote.getData()).getValue(); latestPowerStateTarget = PowerState.State.OFF; handleTargetPowerStateUpdate(getPowerState(targetRemote.getData()).getValue()); sourceRemote.addServiceStateObserver(ServiceTempus.REQUESTED, ServiceType.POWER_STATE_SERVICE, sourceRequestObserver); sourceRemote.addServiceStateObserver(ServiceTempus.CURRENT, ServiceType.POWER_STATE_SERVICE, sourceObserver); if (sourceRemote.isDataAvailable()) { handleSourcePowerStateUpdate(getPowerState(sourceRemote.getData()).getValue()); logger.debug("Source [" + sourceRemote.getLabel() + "] behaviour [" + sourceBehaviour + "]"); logger.debug("Targets [" + targetIds + "] behaviour [" + targetBehaviour + "]");
public void initObserver() throws CouldNotPerformException, InterruptedException { unitRemote.addDataObserver(dataObserver); unitRemote.addConnectionStateObserver(connectionStateObserver); unitRemote.waitForData(); updateDynamicComponents(); }
/** * {@inheritDoc} * * @throws CouldNotPerformException {@inheritDoc} * @throws InterruptedException {@inheritDoc} */ @Override public void activate() throws CouldNotPerformException, InterruptedException { verifyMaintainability(); active = true; unitRemoteMap.values().stream().forEach((remote) -> { remote.addDataObserver(dataObserver); remote.addConnectionStateObserver(connectionStateObserver); }); updateServiceState(); }
ResourceAllocation.Builder resourceAllocation = actionDescription.getResourceAllocationBuilder(); serviceStateDescription.setUnitId(getId()); resourceAllocation.addResourceIds(ScopeGenerator.generateStringRep(getScope())); actionDescription.setDescription(actionDescription.getDescription().replace(ActionDescriptionProcessor.LABEL_KEY, getLabel())); try { String username = ""; if (getSessionManager().getUserId() != null) { username += Registries.getUnitRegistry().getUnitConfigById(getSessionManager().getUserId()).getUserConfig().getUserName(); if (getSessionManager().getClientId() != null) { if (!username.isEmpty()) { username += "@"; username += Registries.getUnitRegistry().getUnitConfigById(getSessionManager().getClientId()).getUserConfig().getUserName(); Thread.currentThread().interrupt(); actionDescription.setLabel(actionDescription.getLabel().replace(ActionDescriptionProcessor.LABEL_KEY, getLabel()));
resourceAllocation.setPolicy(policy); resourceAllocation.setPriority(priority); resourceAllocation.addResourceIds(ScopeGenerator.generateStringRep(unitRemote.getScope())); serviceStateDescription.setUnitId(unitRemote.getId().toString()); serviceStateDescription.setUnitType(unitType); actionDescriptionBuilder.setDescription(actionDescriptionBuilder.getDescription().replace(ActionDescriptionProcessor.LABEL_KEY, unitRemote.getLabel())); actionDescriptionBuilder.setLabel(actionDescriptionBuilder.getLabel().replace(ActionDescriptionProcessor.LABEL_KEY, unitRemote.getLabel()));
@Override public TemperatureState getTemperatureState(final UnitType unitType) throws NotAvailableException { Double average = 0d; Collection<TemperatureStateProviderService> temperatureStateProviderServices = getServices(unitType); int amount = temperatureStateProviderServices.size(); long timestamp = 0; for (TemperatureStateProviderService service : temperatureStateProviderServices) { if (!((UnitRemote) service).isDataAvailable()) { amount--; continue; } average += service.getTemperatureState().getTemperature(); timestamp = Math.max(timestamp, service.getTemperatureState().getTimestamp().getTime()); } average /= amount; return TimestampProcessor.updateTimestamp(timestamp, TemperatureState.newBuilder().setTemperature(average), TimeUnit.MICROSECONDS, logger).build(); } }
Collection<UnitRemote> contactUnits = serviceRemoteManager.getServiceRemote(ServiceType.CONTACT_STATE_SERVICE).getInternalUnits(); for (UnitRemote contactStateProvider : contactUnits) { if (!contactStateProvider.isDataAvailable()) { continue; WindowState.State correspondingWindowState = contactWindowPositionMap.get((String) contactStateProvider.getId()).getCorrespondingWindowState(); switch (contactState.getValue()) { case CLOSED:
private ActionDescription updateActionDescriptionForUnit(ActionDescription actionDescription, UnitRemote unitRemote) throws CouldNotPerformException { // create new builder and copy fields ActionDescription.Builder unitActionDescription = ActionDescription.newBuilder(actionDescription); // get a new resource allocation id ActionDescriptionProcessor.updateResourceAllocationId(unitActionDescription); // update the action chain ActionDescriptionProcessor.updateActionChain(unitActionDescription, actionDescription); // resource ids should only contain that unit ResourceAllocation.Builder unitResourceAllocation = unitActionDescription.getResourceAllocationBuilder(); unitResourceAllocation.clearResourceIds(); unitResourceAllocation.addResourceIds(ScopeGenerator.generateStringRep(unitRemote.getScope())); // update the id in the serviceStateDescription to that of the unit ServiceStateDescription.Builder serviceStateDescription = unitActionDescription.getServiceStateDescriptionBuilder(); serviceStateDescription.setUnitId((String) unitRemote.getId()); return unitActionDescription.build(); }
if (!unitRemoteTypeMap.containsKey(unitRemote.getUnitType())) { unitRemoteTypeMap.put(unitRemote.getUnitType(), new ArrayList()); for (UnitType superType : Registries.getUnitRegistry().getSuperUnitTypes(unitRemote.getUnitType())) { if (!unitRemoteTypeMap.containsKey(superType)) { unitRemoteTypeMap.put(superType, new ArrayList<>()); unitRemote.addConfigObserver(unitConfigObserver); unitRemoteTypeMap.get(unitRemote.getUnitType()).add((S) unitRemote); for (UnitType superType : Registries.getUnitRegistry().getSuperUnitTypes(unitRemote.getUnitType())) { unitRemoteTypeMap.get(superType).add((S) unitRemote); unitRemote.addDataObserver(dataObserver); unitRemote.addConnectionStateObserver(connectionStateObserver);
for (final UnitRemote unitRemote : internalUnits) { if (unitRemote.getUnitType() == unitType) { unitRemoteSet.add(unitRemote); try { if (UnitProcessor.isDalUnit(remote)) { if (!remote.isConnected()) { throw new NotAvailableException("Unit[" + remote.getLabel() + "] is currently not reachable!"); snapshotFutureMap.put(remote, remote.recordSnapshot()); ExceptionPrinter.printHistory(new CouldNotPerformException("Could not record snapshot of " + remote.getLabel(), ex), LOGGER, LogLevel.WARN); snapshotBuilder.addAllServiceStateDescription(snapshotFutureEntry.getValue().get(5, TimeUnit.SECONDS).getServiceStateDescriptionList()); } catch (ExecutionException | TimeoutException ex) { ExceptionPrinter.printHistory(new CouldNotPerformException("Could not record snapshot of " + snapshotFutureEntry.getKey().getLabel(), ex), LOGGER);
@Override public void removeUnit(UnitConfig unitConfig) throws CouldNotPerformException, InterruptedException { UnitRemote unitRemote; if (unitRemoteMap.containsKey(unitConfig.getId())) { unitRemote = unitRemoteMap.remove(unitConfig.getId()); serviceMap.remove(unitConfig.getId()); unitRemoteTypeMap.get(unitConfig.getType()).remove(unitRemote); for (UnitType superType : Registries.getUnitRegistry().getSuperUnitTypes(unitRemote.getUnitType())) { unitRemoteTypeMap.get(superType).remove(unitRemote); } } else if (disabledUnitRemoteMap.containsKey(unitConfig.getId())) { unitRemote = disabledUnitRemoteMap.remove(unitConfig.getId()); } else { throw new NotAvailableException("UnitConfig[" + ScopeGenerator.generateStringRep(unitConfig.getScope()) + "]"); } unitRemote.removeDataObserver(dataObserver); unitRemote.removeConnectionStateObserver(connectionStateObserver); unitRemote.removeConfigObserver(unitConfigObserver); }
/** * Constructor initiates the observation of the input unitRemote to detect the state values and send it to the ontology server. * * @param unitRemote contains the state data, which should be observed. * @throws InstantiationException is thrown in case the observation could not be initiated, because at least one component failed. */ public StateObservation(final UnitRemote unitRemote) throws InstantiationException { try { this.unitType = unitRemote.getUnitType(); this.rsbInformer = RSBFactoryImpl.getInstance().createSynchronizedInformer(OntConfig.getOntologyRsbScope(), OntologyChange.class); // this.stopwatch = new Stopwatch(); this.unitRemoteId = unitRemote.getId().toString(); this.connectionPhase = new ConnectionPhase(unitRemote); this.dateFormat = new SimpleDateFormat(OntConfig.DATE_TIME, Locale.getDefault()); createAndAddObserver(unitRemote); } catch (CouldNotPerformException ex) { throw new InstantiationException(this, ex); } }
for (AbstractServiceRemote<?, ?> serviceRemote : this.getServiceRemoteList()) { for (UnitRemote<?> unitRemote : serviceRemote.getInternalUnits()) { unitRemoteMap.put(unitRemote.getId(), unitRemote); unitRemote.updateActionDescription(actionDescription, serviceAttribute.build(), serviceStateDescription.getServiceType()); futureCollection.add(unitRemote.applyAction(actionDescription.build()));
/** * Method creates and adds the necessary observer for collecting time and system state information. The observer types are: * 1 connectionState: Keep the state of the unit remote connection to verify the correctness of the state changes. * N providerServices: Keep the state changes of the different provider services, which are set dependent on the unit remote. * * @param unitRemote is the unit remote to identify the provider services and their state changes. * @throws CouldNotPerformException is thrown in case the provider services could not be detected. */ private void createAndAddObserver(final UnitRemote unitRemote) throws CouldNotPerformException { final Set<Method> methodsStateType = ReflectionUtility.detectMethods(unitRemote.getDataClass(), MethodRegEx.STATE_METHOD.getName(), Pattern.CASE_INSENSITIVE); for (final Method getGenericStateService : methodsStateType) { final String serviceTypeName = StringModifier.getServiceTypeNameFromStateMethodName(getGenericStateService.getName()); final ServiceType serviceType = OntConfig.SERVICE_NAME_MAP.get(serviceTypeName); final RecurrenceEventFilter recurrenceEventFilter = new RecurrenceEventFilter(200) { @Override public void relay() { serviceStateChangeProcessing(providerServiceObj, serviceType, serviceTypeName); } }; final Observer<T> serviceStateObserver = (final Observable<T> observable, final T providerServiceData) -> { this.providerServiceObj = providerServiceData; recurrenceEventFilter.trigger(); }; unitRemote.addServiceStateObserver(OntConfig.SERVICE_NAME_MAP.get(serviceTypeName), serviceStateObserver); } final Observer<ConnectionState> unitRemoteConnectionObserver = (final Observable<ConnectionState> observable, final ConnectionState connectionState) -> connectionPhase.identifyConnectionState(connectionState); unitRemote.addConnectionStateObserver(unitRemoteConnectionObserver); }
/** * Constructor initiates the connectionPhase of an unit. * * @param unitRemote is the unitRemote to identify the unit. * @throws NotAvailableException is thrown in case the id of the unitRemote is not available. */ public ConnectionPhase(final UnitRemote unitRemote) throws NotAvailableException { this.unitId = unitRemote.getId().toString(); this.isSetConnectionPhaseSuccess = false; this.connectionPhaseInst = null; initConnectionPhase(unitRemote); }
ActionDescription.Builder unitActionDescription = ActionDescription.newBuilder(actionDescription); unitRemote.updateActionDescription(unitActionDescription, serviceAttribute, actionDescription.getServiceStateDescription().getServiceType()); unitActionDescription.addActionChain(actionReference); actionFutureList.add(unitRemote.applyAction(unitActionDescription.build())); Collection<UnitRemote> units = (Collection<UnitRemote>) multiUnitServiceFusion.getServiceRemote(serviceType).getInternalUnits(actionDescription.getServiceStateDescription().getUnitType()); for (UnitRemote unit : units) { scopeUnitMap.put(ScopeGenerator.generateStringRep(unit.getScope()), unit); scopeUnitMap.put(ScopeGenerator.generateStringRep(unitRemote.getScope()), unitRemote); ActionDescription unitActionDescription = updateActionDescriptionForUnit(actionDescriptionBuilder.build(), unitRemote); actionFuture.addActionDescription(unitActionDescription); actionFutureList.add(unitRemote.applyAction(unitActionDescription)); ActionDescription unitActionDescription = updateActionDescriptionForUnit(actionDescriptionBuilder.build(), unitRemote); actionFuture.addActionDescription(unitActionDescription); actionFutureList.add(unitRemote.applyAction(unitActionDescription));
@Override protected boolean check(ActionFuture actionFuture) throws CouldNotPerformException { if (actionFuture.getActionDescriptionCount() == 0) { throw new NotAvailableException(dataProvider.getLabel(), "ActionDescription"); } ActionDescription actionDescription = actionFuture.getActionDescription(0); if (!actionDescription.hasTransactionId() || actionDescription.getTransactionId() == 0) { // this is for compatibility reasons with old versions logger.warn("TransactionId has not been set for Action[" + ActionDescriptionProcessor.getDescription(actionFuture.getActionDescriptionList()) + "] of " + dataProvider); return true; } return dataProvider.getLatestTransactionId() >= actionDescription.getTransactionId(); } }
unitRemote.addConnectionStateObserver(connectionStateObserver); updateConnectionState(unitRemote.getConnectionState()); if (autoRemove) { contextPanel.removeAll();
private void setStateObservation(final UnitConfig unitConfig) throws InterruptedException { try { final UnitRemote unitRemote = Units.getFutureUnit(unitConfig, true).get(); addLoadedUnitRemote(unitRemote); identifyUnitRemote(unitRemote); incrementSuccessfullyRemotesNum(unitRemote.getLabel()); } catch (ExecutionException | NotAvailableException | InstantiationException ex) { incrementFailedRemotesNum(); LOGGER.warn("Could not get unitRemote of " + unitConfig.getLabel() + ". Dropped."); } checkDone(); }