*/
protected void uninstallContext(ControllerContext context, boolean trace)
{
Object name = context.getName();
ControllerState fromState = context.getState();
int currentIndex = states.indexOf(fromState);
if (trace)
log.trace("Uninstalling " + name + " from " + fromState.getStateString());
Set fromContexts = (Set) contextsByState.get(fromState);
if (fromContexts.remove(context) == false)
throw new IllegalStateException("Context not found in previous state " + fromState.getStateString() + " context=" + context.toShortString());
DependencyInfo dependencies = context.getDependencyInfo();
Set dependsOnMe = dependencies.getDependsOnMe(null);
if (dependsOnMe.isEmpty() == false)
{
for (Iterator i = dependsOnMe.iterator(); i.hasNext();)
{
DependencyItem item = (DependencyItem) i.next();
if (item.isResolved())
{
ControllerState dependentState = item.getDependentState();
if (dependentState == null || dependentState.equals(fromState))
{
item.unresolved(this);
ControllerContext dependent = getContext(item.getName(), null);
if (dependent != null)
{
ControllerState whenRequired = item.getWhenRequired();
if (whenRequired == null)
whenRequired = ControllerState.NOT_INSTALLED;
int proposed = states.indexOf(whenRequired);
int actual = states.indexOf(dependent.getState());
if (proposed <= actual)
uninstallContext(dependent, whenRequired, trace);
}
}
}
}
}
int toIndex = currentIndex-1;
if (toIndex == -1)
{
context.setError(new IllegalStateException("Cannot uninstall from " + fromState));
return;
}
ControllerState toState = (ControllerState) states.get(toIndex);
Set toContexts = (Set) contextsByState.get(toState);
toContexts.add(context);
try
{