ControllerState fromState = context.getState();
if (trace)
log.trace("Uninstalling " + name + " from " + fromState.getStateString());
Controller fromController = context.getController();
Set<ControllerContext> fromContexts = fromController.getContextsByState(fromState);
if (fromContexts == null || fromContexts.remove(context) == false)
throw new Error("INTERNAL ERROR: context not found in previous state " + fromState.getStateString() + " context=" + context.toShortString(), new Exception("STACKTRACE"));
DependencyInfo dependencies = context.getDependencyInfo();
if (dependencies != null)
{
try
{
Set<DependencyItem> dependsOnMe = dependencies.getDependsOnMe(null);
if (dependsOnMe.isEmpty() == false)
{
for (DependencyItem item : dependsOnMe)
{
if (item.isResolved())
{
ControllerState dependentState = item.getDependentState();
if (dependentState == null || dependentState.equals(fromState))
{
if (item.unresolved(this))
{
Set<ControllerContext> dependents = CollectionsFactory.createLazySet();
getContexts(item.getName(), dependents);
if (dependents.isEmpty() == false)
{
ControllerState whenRequired = item.getWhenRequired();
if (whenRequired == null)
whenRequired = ControllerState.NOT_INSTALLED;
for (ControllerContext dependent : dependents)
{
if (isBeforeState(dependent.getState(), whenRequired) == false)
uninstallContext(dependent, whenRequired, trace);
}
}
}
}
}
}
}
}
catch (Throwable error)
{
log.error("Error resolving dependencies for " + fromState.getStateString() + ": " + context.toShortString(), error);
// Not much else we can do - no uninstall, since we are at uninstall ;-)
errorContexts.put(context.getName(), context);
context.setError(error);
}
}
// The state could have changed while calling out to dependents
fromState = context.getState();
if (ControllerState.ERROR.equals(fromState))
return;
// Calculate the previous state
int currentIndex = states.indexOf(fromState);
int toIndex = currentIndex - 1;
if (toIndex < 0)
{
// This is hack, we signal true uninstalled status by putting it in the error state
context.setState(ControllerState.ERROR);
return;
}
ControllerState toState = states.get(toIndex);
unlockWrite();
try
{
resolveCallbacks(context, fromState, false);
handleUninstallLifecycleCallbacks(context, toState);
uninstall(context, fromState, toState);
Controller toController = context.getController();
Set<ControllerContext> toContexts = toController.getContextsByState(toState);
toContexts.add(context);
context.setState(toState);
}
catch (Throwable t)
{