public AbstractUnitController(final Class unitClass, final DB builder) throws InstantiationException { super(builder); this.serviceList = new ArrayList<>(); this.unitDataObservableMap = new HashMap<>(); this.serviceTempusServiceTypeObservableMap = new HashMap<>(); for (final ServiceTempus serviceTempus : ServiceTempus.values()) { unitDataObservableMap.put(serviceTempus, new UnitDataFilteredObservable<>(this, serviceTempus)); super.addDataObserver((Observable<D> source, D data) -> { unitDataObservableMap.get(serviceTempus).notifyObservers(data); }); serviceTempusServiceTypeObservableMap.put(serviceTempus, new HashMap<>()); } this.unitRegistryObserver = new Observer<UnitRegistryData>() { @Override public void update(Observable<UnitRegistryData> source, UnitRegistryData data) throws Exception { try { final UnitConfig newUnitConfig = Registries.getUnitRegistry(true).getUnitConfigById(getId()); if (!newUnitConfig.equals(getConfig())) { applyConfigUpdate(newUnitConfig); } } catch (NotAvailableException ex) { // unit config has been removed, probably because of deletion and a higher controller will do the shutdown in this case logger.debug("Could not update unit controller", ex); } catch (CouldNotPerformException ex) { ExceptionPrinter.printHistory("Could not update unit config of " + this, ex, logger); } } }; }
public static String getServiceFieldName(final ServiceType serviceType, final ServiceTempus serviceTempus) { String result = serviceType.name().replace(Service.SERVICE_LABEL.toUpperCase(), "").toLowerCase(); switch (serviceTempus) { case REQUESTED: case LAST: // add service tempus postfix result += serviceTempus.name().toLowerCase(); break; case CURRENT: case UNKNOWN: // remove underscore at the end result = result.substring(0, result.length() - 1); break; } return result; }
for (ServiceTempus serviceTempus : ServiceTempus.values()) { unitDataObservableMap.get(serviceTempus).updateToUnitTemplateChange(template);
for (ServiceTempus serviceTempus : ServiceTempus.values()) { this.unitDataObservableMap.put(serviceTempus, new UnitDataFilteredObservable<>(this, serviceTempus)); super.addDataObserver((Observable<D> source, D data1) -> {
@Override protected void notifyDataUpdate(final D data) throws CouldNotPerformException { super.notifyDataUpdate(data); for (final ServiceTempus serviceTempus : ServiceTempus.values()) { final Set<ServiceType> serviceTypeSet = new HashSet<>(); for (final ServiceDescription serviceDescription : getUnitTemplate().getServiceDescriptionList()) { // check if already handled if (!serviceTypeSet.contains(serviceDescription.getType())) { serviceTypeSet.add(serviceDescription.getType()); try { Object serviceData = Services.invokeServiceMethod(serviceDescription.getType(), ServicePattern.PROVIDER, serviceTempus, data); serviceTempusServiceTypeObservableMap.get(serviceTempus).get(serviceDescription.getType()).notifyObservers(serviceData); } catch (CouldNotPerformException ex) { logger.debug("Could not notify state update for service[" + serviceDescription.getType() + "] because this service is not supported by this controller.", ex); } } } } }
@Override public void shutdown() { super.shutdown(); try { // shutdown registry observer Registries.getUnitRegistry().removeDataObserver(unitRegistryObserver); } catch (final NotAvailableException ex) { // if the registry is not any longer available (in case of registry shutdown) than the observer is already cleared } catch (final Exception ex) { ExceptionPrinter.printHistory(new CouldNotPerformException("Could not remove unit registry observer.", ex), logger); } for (final ServiceTempus serviceTempus : ServiceTempus.values()) { // shutdown service observer for (final MessageObservable serviceObservable : serviceTempusServiceTypeObservableMap.get(serviceTempus).values()) { serviceObservable.shutdown(); } unitDataObservableMap.get(serviceTempus).shutdown(); } }
@Override public void shutdown() { super.shutdown(); try { // shutdown registry observer Registries.getUnitRegistry().removeDataObserver(unitRegistryObserver); } catch (final NotAvailableException ex) { // if the registry is not any longer available (in case of registry shutdown) than the observer is already cleared. } catch (final Exception ex) { ExceptionPrinter.printHistory(new CouldNotPerformException("Could not remove unit registry observer.", ex), logger); } // shutdown service observer for (final ServiceTempus serviceTempus : ServiceTempus.values()) { for (final MessageObservable serviceObservable : serviceTempusServiceTypeObservableMap.get(serviceTempus).values()) { serviceObservable.shutdown(); } unitDataObservableMap.get(serviceTempus).shutdown(); } }
public static Method detectServiceMethod(final ServiceType serviceType, final String methodPattern, final ServiceTempus serviceTempus, final Class instanceClass, final Class... argumentClasses) throws CouldNotPerformException { String messageName = "?"; try { messageName = methodPattern + getServiceStateName(serviceType) + StringProcessor.transformUpperCaseToCamelCase(serviceTempus.name().replace(serviceTempus.CURRENT.name(), "")); return instanceClass.getMethod(messageName, argumentClasses); } catch (NoSuchMethodException | SecurityException ex) { throw new CouldNotPerformException("Could not detect service method[" + messageName + "]!", ex); } }