List applicationsToInstall = new ArrayList();
List applicationsToRemove = new ArrayList();
try {
List removedApplications = new ArrayList();
removedApplications.addAll(installedApplications.keySet());
applicationUris = ((ArrayValue)Projector.getRepository().getChildren(new URIValue(Projector.getApplicationsDir()), context.getCredentials())).getArray();
for ( int i = 0; i < applicationUris.length; i++ ) {
String applicationUri = applicationUris[i].toString();
if ( !applicationUri.endsWith("/") ) {
applicationUri = applicationUri + "/";
}
/* FIXME: Is this needed or can it be fixed in getChildren() ?
if ( applicationUri.indexOf(Constants.REPOSITORY_DOMAIN) != -1 ) {
applicationUri = applicationUri.substring(applicationUri.indexOf(Constants.REPOSITORY_DOMAIN)+Constants.REPOSITORY_DOMAIN.length());
}
*/
if ( !installedApplications.containsKey(applicationUri) ) {
Application installedApplication = parseApplication(new URIValue(applicationUri));
if ( installedApplication != null ) {
applicationsToInstall.add(installedApplication);
}
} else {
logger.log(Level.FINE, "Application '"+applicationUri+"' already installed");
removedApplications.remove(applicationUri);
}
}
for ( Iterator i = removedApplications.iterator(); i.hasNext(); ) {
Application removedApplication = (Application)installedApplications.get((URI)i.next());
applicationsToRemove.add(removedApplication);
}
// install applications sorted by application dependencies
List sortedApplications = sortApplications(applicationsToInstall);
for ( Iterator i = sortedApplications.iterator(); i.hasNext(); ) {
Application application = (Application)i.next();
Projector.getRepository().subscribe("Update", application.getUri(), 0,
new Subscriber() {
public void notify(String uri, Map information) {
applicationManager.updateApplication(uri);
}
}, context.getCredentials());
install(Application.MESSAGES, application);
install(Application.PROCESSORS, application);
}
Scheduler.getInstance().install(new URIValue(Projector.getWorkDir() + Scheduler.JOBS), true);
for ( Iterator i = sortedApplications.iterator(); i.hasNext(); ) {
Application application = (Application)i.next();
install(Application.JOBS, application);
}
Scheduler.getInstance().saveJobs();