import org.ten60.netkernel.xml.xda.*;
import org.ten60.netkernel.xml.representation.*;
import org.ten60.netkernel.layer1.representation.*;
import com.ten60.netkernel.urii.*;
import java.text.*;
import java.util.*;

main()
{   try
    {   IAspectNVP param = context.sourceAspect("this:param:param",IAspectNVP.class);
        index = param.getValue("state");
        history = new DOMXDA(context.sourceAspect("history.xml",IXAspect.class).getReadOnlyDocument(),true);
        n=0;
        doneList = new HashSet();
        for (i=history.readOnlyIterator("/history/state[position()>="+index+"]"); i.hasNext(); )
        {   i.next();
            deployedModule=i.getText("deployedModules",true);
            if (n==0)
            {   // use this deployedModules
                config = context.sourceAspect(deployedModule,IURAspect.class);
                context.sinkAspect("netkernel:module-list",config);
                System.out.println(deployedModule+"->netkernel:module-list");
            }
            context.delete(deployedModule);

            for (j=i.readOnlyIterator("moduleXMLs/module"); j.hasNext(); )
            {   j.next();
                destURI = j.getText("dest",true);
                sourceURI = j.getText("source",true);
                if (!doneList.contains(destURI))
                {   doneList.add(destURI);
                    config = context.sourceAspect(destURI,IURAspect.class);
                    context.sinkAspect(sourceURI,config);
                    context.delete(destURI);
                    System.out.println(destURI+"->"+sourceURI);
                }
            }
            n++;
        }

        // remove the states we have used
        history.delete("/history/state[position()>="+index+"]");
        historyAspect = new DOMXDAAspect(history);
        context.sinkAspect("history.xml",historyAspect);

        req = context.createSubRequest();
        req.setURI("active:HTTPRedirect");
        req.addArgument("operator",new StringAspect("<uri>/install/confirmRestart</uri>"));
        result = context.issueSubRequest(req);

        response = context.createResponseFrom(result);
        context.setResponse(response);
    }
    catch(Exception e)
    {   // log error
        req = context.createSubRequest();
        req.setURI("active:log");
        req.addArgument("operand",new StringAspect(e.toString()));
        result = context.issueSubRequest(req);

        //redirect to error page
        req = context.createSubRequest();
        req.setURI("active:HTTPRedirect");
        req.addArgument("operator",new StringAspect("<uri>/install/failure</uri>"));
        result = context.issueSubRequest(req);

        response = context.createResponseFrom(result);
        context.setResponse(response);
    }
}