diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/api/ComponentContainer.java b/li.strolch.agent/src/main/java/li/strolch/agent/api/ComponentContainer.java index fba0a9c31..8cc8188f5 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/api/ComponentContainer.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/api/ComponentContainer.java @@ -1,12 +1,12 @@ /* * Copyright 2013 Robert von Burg - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -33,6 +33,18 @@ public interface ComponentContainer { public abstract boolean hasComponent(Class clazz); + /** + * Returns the reference to the {@link StrolchComponent} with the given name, if it exists. If it does not exist, an + * {@link IllegalArgumentException} is thrown + * + * @param clazz + * the type of component to return + * + * @return the component with the given name + * + * @throws IllegalArgumentException + * if the component does not exist + */ public abstract T getComponent(Class clazz) throws IllegalArgumentException; public abstract PrivilegeHandler getPrivilegeHandler() throws IllegalArgumentException; @@ -42,31 +54,31 @@ public interface ComponentContainer { public abstract Set getRealmNames(); /** - * Returns the {@link StrolchRealm} with the given name. To get the default realm, use the constant - * {@link StrolchConstants#DEFAULT_REALM}. - * + * Returns the {@link StrolchRealm} with the given name. To get the default realm, use the constant {@link + * StrolchConstants#DEFAULT_REALM}. + * * @param realm - * the name of the {@link StrolchRealm} to return - * + * the name of the {@link StrolchRealm} to return + * * @return the {@link StrolchRealm} with the given name - * + * * @throws StrolchException - * if the {@link StrolchRealm} does not exist with the given name + * if the {@link StrolchRealm} does not exist with the given name */ public abstract StrolchRealm getRealm(String realm) throws StrolchException; /** * Returns the default {@link StrolchRealm} for the user with the given {@link Certificate}. This is done by * querying the property {@link StrolchConstants#PROP_REALM} from the certificate. - * + * * @param certificate - * the {@link Certificate} from which to retrieve the name of the {@link StrolchRealm} to return - * + * the {@link Certificate} from which to retrieve the name of the {@link StrolchRealm} to return + * * @return the {@link StrolchRealm} - * + * * @throws StrolchException - * if the user does not have a {@link StrolchConstants#PROP_REALM} property configured, and the default - * realm is not configured, or if the realm does not exist with the found value + * if the user does not have a {@link StrolchConstants#PROP_REALM} property configured, and the default realm is + * not configured, or if the realm does not exist with the found value */ public abstract StrolchRealm getRealm(Certificate certificate) throws StrolchException; diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentContainerImpl.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentContainerImpl.java index c8206ad3c..366fd67a6 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentContainerImpl.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/ComponentContainerImpl.java @@ -1,12 +1,12 @@ /* * Copyright 2013 Robert von Burg - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -25,15 +25,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import li.strolch.agent.api.ComponentContainer; -import li.strolch.agent.api.ComponentState; -import li.strolch.agent.api.RealmHandler; -import li.strolch.agent.api.StrolchAgent; -import li.strolch.agent.api.StrolchComponent; -import li.strolch.agent.api.StrolchRealm; +import li.strolch.agent.api.*; import li.strolch.exception.StrolchException; import li.strolch.privilege.model.Certificate; import li.strolch.runtime.StrolchConstants; @@ -43,6 +35,8 @@ import li.strolch.runtime.configuration.StrolchConfigurationException; import li.strolch.runtime.privilege.PrivilegeHandler; import li.strolch.utils.helper.StringHelper; import li.strolch.utils.helper.SystemHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ComponentContainerImpl implements ComponentContainer { @@ -118,8 +112,9 @@ public class ComponentContainerImpl implements ComponentContainer { realmName = StrolchConstants.DEFAULT_REALM; } else { String msg = "The User {0} is missing the property {1} and the Realm {2} can not be used as it does not exist!"; - throw new StrolchException(MessageFormat.format(msg, certificate.getUsername(), - StrolchConstants.PROP_REALM, StrolchConstants.DEFAULT_REALM)); + throw new StrolchException(MessageFormat + .format(msg, certificate.getUsername(), StrolchConstants.PROP_REALM, + StrolchConstants.DEFAULT_REALM)); } } @@ -156,8 +151,8 @@ public class ComponentContainerImpl implements ComponentContainer { @SuppressWarnings("unchecked") Class strolchComponentClass = (Class) implClass; - Constructor constructor = strolchComponentClass.getConstructor(ComponentContainer.class, - String.class); + Constructor constructor = strolchComponentClass + .getConstructor(ComponentContainer.class, String.class); StrolchComponent strolchComponent = constructor.newInstance(this, componentName); strolchComponent.setup(componentConfiguration); @@ -170,8 +165,7 @@ public class ComponentContainerImpl implements ComponentContainer { msg = MessageFormat.format(msg, componentName, e.getMessage()); throw new StrolchConfigurationException(msg, e); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SecurityException - | IllegalArgumentException | InvocationTargetException e) { + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SecurityException | IllegalArgumentException | InvocationTargetException e) { String msg = "Could not load class for component {0} due to: {1}"; //$NON-NLS-1$ msg = MessageFormat.format(msg, componentName, e.getMessage()); @@ -221,8 +215,8 @@ public class ComponentContainerImpl implements ComponentContainer { long took = System.nanoTime() - start; msg = "{0}:{1} Strolch Container setup with {2} components. Took {3}"; //$NON-NLS-1$ - logger.info(MessageFormat.format(msg, applicationName, environment, this.componentMap.size(), - formatNanoDuration(took))); + logger.info(MessageFormat + .format(msg, applicationName, environment, this.componentMap.size(), formatNanoDuration(took))); } public void initialize(StrolchConfiguration strolchConfiguration) { @@ -243,8 +237,8 @@ public class ComponentContainerImpl implements ComponentContainer { long took = System.nanoTime() - start; msg = "{0}:{1} All {2} Strolch Components have been initialized. Took {3}"; //$NON-NLS-1$ - logger.info(MessageFormat.format(msg, applicationName, environment, this.controllerMap.size(), - formatNanoDuration(took))); + logger.info(MessageFormat + .format(msg, applicationName, environment, this.controllerMap.size(), formatNanoDuration(took))); } public void start() { @@ -264,8 +258,8 @@ public class ComponentContainerImpl implements ComponentContainer { long took = System.nanoTime() - start; msg = "{0}:{1} All {2} Strolch Components started. Took {3}. Strolch is now ready to be used. Have fun =))"; //$NON-NLS-1$ - logger.info(MessageFormat.format(msg, applicationName, environment, this.controllerMap.size(), - formatNanoDuration(took))); + logger.info(MessageFormat + .format(msg, applicationName, environment, this.controllerMap.size(), formatNanoDuration(took))); logger.info(MessageFormat.format("System: {0}", SystemHelper.asString())); //$NON-NLS-1$ logger.info(MessageFormat.format("Memory: {0}", SystemHelper.getMemorySummary())); //$NON-NLS-1$ } @@ -288,8 +282,8 @@ public class ComponentContainerImpl implements ComponentContainer { long took = System.nanoTime() - start; msg = "{0}:{1} All {2} Strolch Components have been stopped. Took {3}"; //$NON-NLS-1$ - logger.info(MessageFormat.format(msg, applicationName, environment, this.controllerMap.size(), - formatNanoDuration(took))); + logger.info(MessageFormat + .format(msg, applicationName, environment, this.controllerMap.size(), formatNanoDuration(took))); } this.state = ComponentState.STOPPED; @@ -313,8 +307,8 @@ public class ComponentContainerImpl implements ComponentContainer { long took = System.nanoTime() - start; msg = "{0}:{1} All {2} Strolch Components have been destroyed! Took {3}"; //$NON-NLS-1$ - logger.info(MessageFormat.format(msg, applicationName, environment, this.controllerMap.size(), - formatNanoDuration(took))); + logger.info(MessageFormat + .format(msg, applicationName, environment, this.controllerMap.size(), formatNanoDuration(took))); this.controllerMap.clear(); this.componentMap.clear(); } diff --git a/li.strolch.agent/src/main/java/li/strolch/job/StrolchJob.java b/li.strolch.agent/src/main/java/li/strolch/job/StrolchJob.java index c5ebdb4c5..833a535fc 100644 --- a/li.strolch.agent/src/main/java/li/strolch/job/StrolchJob.java +++ b/li.strolch.agent/src/main/java/li/strolch/job/StrolchJob.java @@ -2,6 +2,7 @@ package li.strolch.job; import static li.strolch.model.Tags.AGENT; +import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; @@ -14,6 +15,7 @@ import java.util.concurrent.TimeUnit; import com.google.gson.JsonObject; import li.strolch.agent.api.ComponentContainer; import li.strolch.agent.api.StrolchAgent; +import li.strolch.agent.api.StrolchComponent; import li.strolch.agent.api.StrolchRealm; import li.strolch.handler.operationslog.LogMessage; import li.strolch.handler.operationslog.LogSeverity; @@ -50,6 +52,7 @@ public abstract class StrolchJob implements Runnable { private long nrOfExecutions; private boolean first; private ScheduledFuture future; + private ZonedDateTime lastExecution; private Throwable lastException; public StrolchJob(StrolchAgent agent, JobMode jobMode, long initialDelay, TimeUnit initialDelayTimeUnit, long delay, @@ -131,6 +134,22 @@ public abstract class StrolchJob implements Runnable { getContainer().getPrivilegeHandler().runAsAgent(runnable); } + /** + * Returns the reference to the {@link StrolchComponent} with the given name, if it exists. If it does not exist, an + * {@link IllegalArgumentException} is thrown + * + * @param clazz + * the type of component to return + * + * @return the component with the given name + * + * @throws IllegalArgumentException + * if the component does not exist + */ + public T getComponent(Class clazz) throws IllegalArgumentException { + return getContainer().getComponent(clazz); + } + /** * Opens a {@link StrolchTransaction} for the default realm and certificate * @@ -151,6 +170,7 @@ public abstract class StrolchJob implements Runnable { public void runNow() { synchronized (this) { runAsAgent(this::execute); + this.lastExecution = ZonedDateTime.now(); this.nrOfExecutions++; } } @@ -175,6 +195,7 @@ public abstract class StrolchJob implements Runnable { } } + this.lastExecution = ZonedDateTime.now(); this.nrOfExecutions++; if (this.first) { @@ -245,20 +266,36 @@ public abstract class StrolchJob implements Runnable { public JsonObject toJson() { JsonObject jsonObject = new JsonObject(); - long delay = this.future.getDelay(TimeUnit.MILLISECONDS); - String nextExecution = ZonedDateTime.now().plus(delay, ChronoUnit.MILLIS) - .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME); - jsonObject.addProperty(Tags.Json.NAME, getName()); jsonObject.addProperty(Tags.Json.REALM, this.realmName); + jsonObject.addProperty("mode", this.mode.name()); jsonObject.addProperty("initialDelay", this.initialDelay); jsonObject.addProperty("initialDelayTimeUnit", this.initialDelayTimeUnit.name()); jsonObject.addProperty("delay", this.delay); jsonObject.addProperty("delayTimeUnit", this.delayTimeUnit.name()); - jsonObject.addProperty("nextExecution", nextExecution); + + if (this.lastExecution == null) { + jsonObject.addProperty("lastExecution", "-"); + } else { + String lastExecution = this.lastExecution + .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault())); + jsonObject.addProperty("lastExecution", lastExecution); + } + + if (this.future == null) { + jsonObject.addProperty("nextExecution", "-"); + } else { + + long delay = this.future.getDelay(TimeUnit.MILLISECONDS); + String nextExecution = ZonedDateTime.now().plus(delay, ChronoUnit.MILLIS) + .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault())); + jsonObject.addProperty("nextExecution", nextExecution); + } + jsonObject.addProperty("nrOfExecutions", this.nrOfExecutions); - jsonObject.addProperty("lastException", - this.lastException == null ? null : ExceptionHelper.formatExceptionMessage(this.lastException)); + + if (this.lastException != null) + jsonObject.addProperty("lastException", ExceptionHelper.formatExceptionMessage(this.lastException)); return jsonObject; } diff --git a/li.strolch.agent/src/main/java/li/strolch/job/StrolchJobsHandler.java b/li.strolch.agent/src/main/java/li/strolch/job/StrolchJobsHandler.java index 4b8e89fae..061115348 100644 --- a/li.strolch.agent/src/main/java/li/strolch/job/StrolchJobsHandler.java +++ b/li.strolch.agent/src/main/java/li/strolch/job/StrolchJobsHandler.java @@ -38,7 +38,7 @@ public class StrolchJobsHandler extends StrolchComponent { super.initialize(configuration); } - public void registerAndScheduleJob(Class strolchJobClass) { + public StrolchJob registerAndScheduleJob(Class strolchJobClass) { StrolchJob strolchJob; try { @@ -54,6 +54,7 @@ public class StrolchJobsHandler extends StrolchComponent { strolchJob.schedule(); this.jobs.put(strolchJob.getName(), strolchJob); + return strolchJob; } public List getJobs(Certificate cert) {