public void unloadConfiguration(File file) throws Exception {
   try {
     deployer.undeploy(file);
   } finally {
     engine.fireConfigurationChanged();
   }
 }
 public void loadConfiguration(RuntimeContext context, File file, boolean trackChanges)
     throws Exception {
   try {
     deployer.deploy(context, file, trackChanges);
   } finally {
     engine.fireConfigurationChanged();
   }
 }
 @Override
 public void deactivate(ComponentContext context) throws Exception {
   notifier.stop();
   notifier.removeListener(this);
   deployer.removeConfigurationChangedListener(this);
   engine.destroy();
   engine = null;
   deployer = null;
   notifier = null;
   ctx = null;
   super.deactivate(context);
 }
  @Override
  public void activate(ComponentContext context) throws Exception {
    super.activate(context);
    ctx = context;
    String webDir = Framework.getProperty("org.nuxeo.ecm.web.root");
    File root = null;
    if (webDir != null) {
      root = new File(webDir);
    } else {
      root = new File(Framework.getRuntime().getHome(), "web");
    }
    root = root.getCanonicalFile();
    log.info("Using web root: " + root);
    if (!new File(root, "default").exists()) {
      try {
        root.mkdirs();
        // runtime predeployment is not supporting conditional unziping so we do the predeployment
        // here:
        deployWebDir(context.getRuntimeContext().getBundle(), root);
      } catch (Exception e) { // delete incomplete files
        FileUtils.deleteTree(root);
        throw e;
      }
    }
    // register contrib managers
    registerContributionManager(APPLICATION_XP, new ContributionManager(this));
    registerContributionManager(WEB_OBJ_XP, new ContributionManager(this));

    // load message bundle
    notifier = new FileChangeNotifier();
    notifier.start();
    notifier.addListener(this);

    engine = new DefaultWebEngine(root, notifier);
    deployer = new ConfigurationDeployer(notifier);
    deployer.addConfigurationChangedListener(this);
  }