CCM NG: LifecycleManager

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4218 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2016-08-12 12:30:23 +00:00
parent 3c5625b033
commit b7458c77a8
1 changed files with 102 additions and 2 deletions

View File

@ -18,6 +18,8 @@
*/ */
package org.librecms.lifecycle; package org.librecms.lifecycle;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.AuthorizationRequired;
import org.libreccm.security.RequiresPrivilege; import org.libreccm.security.RequiresPrivilege;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
@ -37,6 +39,9 @@ import javax.transaction.Transactional;
@RequestScoped @RequestScoped
public class LifecycleManager { public class LifecycleManager {
public static final Logger LOGGER = LogManager.getLogger(
LifecycleManager.class);
@Inject @Inject
private LifecycleDefinitionRepository lifecycleDefinitionRepo; private LifecycleDefinitionRepository lifecycleDefinitionRepo;
@ -136,7 +141,7 @@ public class LifecycleManager {
} }
} }
//ToDo Invoke Listeners invokeLifecycleEventListener(lifecycle, LifecycleEvent.STARTED);
} }
} }
@ -160,9 +165,15 @@ public class LifecycleManager {
} }
lifecycle.getPhases().get(current).setFinished(true); lifecycle.getPhases().get(current).setFinished(true);
invokePhaseEventListener(lifecycle,
lifecycle.getPhases().get(current),
PhaseEvent.FINISHED);
//Check for last phase, if not set next phase to started //Check for last phase, if not set next phase to started
if (current < lifecycle.getPhases().size() - 1) { if (current < lifecycle.getPhases().size() - 1) {
lifecycle.getPhases().get(current + 1).setStarted(true); lifecycle.getPhases().get(current + 1).setStarted(true);
invokePhaseEventListener(lifecycle,
lifecycle.getPhases().get(current + 1),
PhaseEvent.STARTED);
} }
} else { } else {
startLifecycle(lifecycle); startLifecycle(lifecycle);
@ -182,7 +193,96 @@ public class LifecycleManager {
phaseRepo.save(phase); phaseRepo.save(phase);
}); });
invokeLifecycleEventListener(lifecycle, LifecycleEvent.RESET);
lifecycleRepo.save(lifecycle); lifecycleRepo.save(lifecycle);
} }
private void invokeLifecycleEventListener(final Lifecycle lifecycle,
final LifecycleEvent event) {
final String listenerClassName = lifecycle.getListener();
final Class<?> listenerClass;
try {
listenerClass = Class.forName(listenerClassName);
} catch (ClassNotFoundException ex) {
LOGGER.error("Failed to find LifecycleListener class \"{}\". "
+ "Listener is ignored.",
listenerClassName);
return;
}
if (!LifecycleEventListener.class.isAssignableFrom(listenerClass)) {
LOGGER.warn("Class \"{}\" is not an implementation of the "
+ "interface \"{}\".",
listenerClassName,
LifecycleEventListener.class.getName());
return;
}
final Object object;
try {
object = listenerClass.newInstance();
} catch (IllegalAccessException |
InstantiationException ex) {
LOGGER.error("Failed to create instance of LifecycleEventListener "
+ "of class \"{}\".",
listenerClass.getName());
LOGGER.error("Reason: ", ex);
return;
}
if (object instanceof LifecycleEventListener) {
final LifecycleEventListener listener
= (LifecycleEventListener) object;
listener.update(lifecycle, event);
} else {
LOGGER.error("Generated object is not an instance of \"{}\". "
+ "Ignoring listener.",
LifecycleEventListener.class.getName());
}
}
private void invokePhaseEventListener(final Lifecycle lifecycle,
final Phase phase,
final PhaseEvent event) {
final String listenerClassName = phase.getListener();
final Class<?> listenerClass;
try {
listenerClass = Class.forName(listenerClassName);
} catch (ClassNotFoundException ex) {
LOGGER.error("Failed to find PhaseListener class \"{}\". "
+ "Listener is ignored.",
listenerClassName);
return;
}
if (!PhaseEventListener.class.isAssignableFrom(listenerClass)) {
LOGGER.warn("Class \"{}\" is not an implementation of the "
+ "interface \"{}\".",
listenerClassName,
PhaseEventListener.class.getName());
return;
}
final Object object;
try {
object = listenerClass.newInstance();
} catch (IllegalAccessException |
InstantiationException ex) {
LOGGER.error("Failed to create instance of PhaseEventListener "
+ "of class \"{}\".",
listenerClass.getName());
LOGGER.error("Reason: ", ex);
return;
}
if (object instanceof PhaseEventListener) {
final PhaseEventListener listener = (PhaseEventListener) object;
listener.update(lifecycle, phase, event);
} else {
LOGGER.error("Generated object is not an instance of \"{}\". "
+ "Ignoring listener.",
PhaseEventListener.class.getName());
}
}
} }