Example usage for org.apache.commons.io.monitor FileAlterationMonitor FileAlterationMonitor

List of usage examples for org.apache.commons.io.monitor FileAlterationMonitor FileAlterationMonitor

Introduction

In this page you can find the example usage for org.apache.commons.io.monitor FileAlterationMonitor FileAlterationMonitor.

Prototype

public FileAlterationMonitor(long interval) 

Source Link

Document

Construct a monitor with the specified interval.

Usage

From source file:nl.armatiek.xslweb.configuration.Context.java

private void initFileAlterationObservers() {
    File webAppsDir = new File(homeDir, "webapps");
    IOFileFilter webAppFiles = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
            FileFilterUtils.nameFileFilter("webapp.xml"));
    IOFileFilter filter = FileFilterUtils.or(FileFilterUtils.directoryFileFilter(), webAppFiles);
    FileAlterationObserver webAppObserver = new FileAlterationObserver(webAppsDir, filter);
    webAppObserver.addListener(new FileAlterationListenerAdaptor() {

        @Override//from  w w w  . j a  va 2s  .  c o  m
        public void onFileCreate(File file) {
            logger.info("New webapp detected ...");
            reloadWebApp(file, true);
        }

        @Override
        public void onFileChange(File file) {
            logger.info("Change in webapp definition detected ...");
            reloadWebApp(file, true);
        }

        @Override
        public void onFileDelete(File file) {
            logger.info("Deletion of webapp detected ...");
            reloadWebApp(file, true);
        }

    });

    monitor = new FileAlterationMonitor(3000);
    monitor.addObserver(webAppObserver);
}

From source file:nl.armatiek.xslweb.configuration.WebApp.java

private void initFileAlterationObservers() {
    monitor = new FileAlterationMonitor(3000);

    if (!developmentMode) {
        IOFileFilter xslFiles = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
                new SuffixFileFilter(new String[] { ".xsl", ".xslt" }, IOCase.INSENSITIVE));
        FileAlterationObserver xslObserver = new FileAlterationObserver(new File(homeDir, "xsl"),
                FileFilterUtils.or(FileFilterUtils.directoryFileFilter(), xslFiles));
        xslObserver.addListener(new FileAlterationListenerAdaptor() {

            @Override/*ww  w .  j  a  va  2s . c  om*/
            public void onFileChange(File file) {
                onFileChanged(file, "Change in XSL stylesheet \"%s\" detected. Reloading webapp ...");
            }

            @Override
            public void onFileDelete(File file) {
                onFileChanged(file, "Deletion of XSL stylesheet \"%s\" detected. Reloading webapp ...");
            }

        });
        monitor.addObserver(xslObserver);
    }

    IOFileFilter jarAndClassFiles = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
            new SuffixFileFilter(new String[] { ".jar", ".class" }, IOCase.INSENSITIVE));
    FileAlterationObserver classObserver = new FileAlterationObserver(new File(homeDir, "lib"),
            FileFilterUtils.or(FileFilterUtils.directoryFileFilter(), jarAndClassFiles));
    classObserver.addListener(new FileAlterationListenerAdaptor() {

        @Override
        public void onFileCreate(File file) {
            onFileChanged(file, "New plugin jar or class file \"%s\" detected. Reloading webapp ...");
        }

        @Override
        public void onFileChange(File file) {
            onFileChanged(file, "Change in plugin jar or class file \"%s\" detected. Reloading webapp ...");
        }

        @Override
        public void onFileDelete(File file) {
            onFileChanged(file, "Deletion of plugin jar or class file \"%s\" detected. Reloading webapp ...");
        }

    });
    monitor.addObserver(classObserver);
}

From source file:org.apache.hadoop.gateway.services.topology.DefaultTopologyServiceTest.java

@Test
public void testGetTopologies() throws Exception {

    File dir = createDir();/*from   w w  w .j  av  a 2  s.c om*/
    long time = dir.lastModified();
    try {
        createFile(dir, "one.xml", "org/apache/hadoop/gateway/topology/file/topology-one.xml", time);

        TestTopologyListener topoListener = new TestTopologyListener();
        FileAlterationMonitor monitor = new FileAlterationMonitor(Long.MAX_VALUE);

        TopologyService provider = new DefaultTopologyService();
        Map<String, String> c = new HashMap<>();

        GatewayConfig config = EasyMock.createNiceMock(GatewayConfig.class);
        EasyMock.expect(config.getGatewayTopologyDir()).andReturn(dir.toString()).anyTimes();
        EasyMock.replay(config);

        provider.init(config, c);

        provider.addTopologyChangeListener(topoListener);

        provider.reloadTopologies();

        Collection<Topology> topologies = provider.getTopologies();
        assertThat(topologies, notNullValue());
        assertThat(topologies.size(), is(1));
        Topology topology = topologies.iterator().next();
        assertThat(topology.getName(), is("one"));
        assertThat(topology.getTimestamp(), is(time));
        assertThat(topoListener.events.size(), is(1));
        topoListener.events.clear();

        // Add a file to the directory.
        File two = createFile(dir, "two.xml", "org/apache/hadoop/gateway/topology/file/topology-two.xml", 1L);
        provider.reloadTopologies();
        topologies = provider.getTopologies();
        assertThat(topologies.size(), is(2));
        Set<String> names = new HashSet<>(Arrays.asList("one", "two"));
        Iterator<Topology> iterator = topologies.iterator();
        topology = iterator.next();
        assertThat(names, hasItem(topology.getName()));
        names.remove(topology.getName());
        topology = iterator.next();
        assertThat(names, hasItem(topology.getName()));
        names.remove(topology.getName());
        assertThat(names.size(), is(0));
        assertThat(topoListener.events.size(), is(1));
        List<TopologyEvent> events = topoListener.events.get(0);
        assertThat(events.size(), is(1));
        TopologyEvent event = events.get(0);
        assertThat(event.getType(), is(TopologyEvent.Type.CREATED));
        assertThat(event.getTopology(), notNullValue());

        // Update a file in the directory.
        two = createFile(dir, "two.xml", "org/apache/hadoop/gateway/topology/file/topology-three.xml", 2L);
        provider.reloadTopologies();
        topologies = provider.getTopologies();
        assertThat(topologies.size(), is(2));
        names = new HashSet<>(Arrays.asList("one", "two"));
        iterator = topologies.iterator();
        topology = iterator.next();
        assertThat(names, hasItem(topology.getName()));
        names.remove(topology.getName());
        topology = iterator.next();
        assertThat(names, hasItem(topology.getName()));
        names.remove(topology.getName());
        assertThat(names.size(), is(0));

        // Remove a file from the directory.
        two.delete();
        provider.reloadTopologies();
        topologies = provider.getTopologies();
        assertThat(topologies.size(), is(1));
        topology = topologies.iterator().next();
        assertThat(topology.getName(), is("one"));
        assertThat(topology.getTimestamp(), is(time));
    } finally {
        FileUtils.deleteQuietly(dir);
    }
}

From source file:org.apache.hadoop.gateway.services.topology.impl.DefaultTopologyService.java

private void initListener(File directory) throws IOException, SAXException {
    // Increasing the monitoring interval to 5 seconds as profiling has shown
    // this is rather expensive in terms of generated garbage objects.
    initListener(new FileAlterationMonitor(5000L), directory);
}

From source file:org.apache.lucene.analysis.ko.utils.DictionaryUtil.java

/**
  * ? .//from   w ww.  j  a va 2 s .com
  */
 public synchronized static void loadDictionary() throws MorphException {

     // monitor file change every 30 seconds
     final long pollingInterval = 30 * 1000;

     // wait file modification end
     final long delayfilemodify = 5 * 1000;

     dictionary = new Trie<String, WordEntry>(true);
     List<String> strList = null;
     List<String> compounds = null;
     List<String> abbrevs = null;
     try {
         strList = FileUtil.readLines(KoreanEnv.getInstance().getValue(KoreanEnv.FILE_DICTIONARY), "UTF-8");
         strList.addAll(FileUtil.readLines(KoreanEnv.getInstance().getValue(KoreanEnv.FILE_EXTENSION), "UTF-8"));
         compounds = FileUtil.readLines(KoreanEnv.getInstance().getValue(KoreanEnv.FILE_COMPOUNDS), "UTF-8");
         abbrevs = FileUtil.readLines(KoreanEnv.getInstance().getValue(KoreanEnv.FILE_ABBREV), "UTF-8");

         if (monitor == null) {
             File dicPath = new File(KoreanEnv.getInstance().getValue(KoreanEnv.FILE_EXTENSION));
             File folder = new File(dicPath.getParentFile().getAbsolutePath());
             if (folder != null && folder.exists()) {
                 FileAlterationObserver observer = new FileAlterationObserver(folder);
                 monitor = new FileAlterationMonitor(pollingInterval);
                 FileAlterationListener listener = new FileAlterationListenerAdaptor() {
                     @Override
                     public void onFileChange(File file) {
                         try {
                             Thread.sleep(delayfilemodify);
                             dictionary = null;
                         } catch (InterruptedException e) {
                             new MorphException(e.getMessage(), e);
                         }
                     }
                 };

                 observer.addListener(listener);
                 monitor.addObserver(observer);
                 monitor.start();
             }
         }
     } catch (IOException e) {
         new MorphException(e.getMessage(), e);
     } catch (Exception e) {
         new MorphException(e.getMessage(), e);
     }
     if (strList == null)
         throw new MorphException("dictionary is null");
     ;

     for (String str : strList) {
         String[] infos = str.split("[,]+");
         if (infos.length != 2)
             continue;
         infos[1] = infos[1].trim();
         if (infos[1].length() == 6)
             infos[1] = infos[1].substring(0, 5) + "000" + infos[1].substring(5);

         WordEntry entry = new WordEntry(infos[0].trim(), infos[1].trim().toCharArray());
         dictionary.add(entry.getWord(), entry);
     }

     for (String compound : compounds) {
         String[] infos = compound.split("[:]+");
         if (infos.length != 3 && infos.length != 2)
             continue;

         WordEntry entry = null;
         if (infos.length == 2)
             entry = new WordEntry(infos[0].trim(), "200000000X".toCharArray());
         else
             entry = new WordEntry(infos[0].trim(), ("200" + infos[2] + "0X").toCharArray());

         entry.setCompounds(compoundArrayToList(infos[1], infos[1].split("[,]+")));
         dictionary.add(entry.getWord(), entry);
     }

     abbreviations = new HashMap<String, String>();

     for (String abbrev : abbrevs) {
         String[] infos = abbrev.split("[:]+");
         if (infos.length != 2)
             continue;
         abbreviations.put(infos[0].trim(), infos[1].trim());
     }
 }

From source file:org.apache.syncope.client.enduser.SyncopeEnduserApplication.java

@Override
protected void init() {
    super.init();

    // read enduser.properties
    Properties props = PropertyUtils.read(getClass(), ENDUSER_PROPERTIES, "enduser.directory").getLeft();

    domain = props.getProperty("domain", SyncopeConstants.MASTER_DOMAIN);
    adminUser = props.getProperty("adminUser");
    Args.notNull(adminUser, "<adminUser>");
    anonymousUser = props.getProperty("anonymousUser");
    Args.notNull(anonymousUser, "<anonymousUser>");
    anonymousKey = props.getProperty("anonymousKey");
    Args.notNull(anonymousKey, "<anonymousKey>");

    captchaEnabled = Boolean.parseBoolean(props.getProperty("captcha"));
    Args.notNull(captchaEnabled, "<captcha>");

    xsrfEnabled = Boolean.parseBoolean(props.getProperty("xsrf"));
    Args.notNull(xsrfEnabled, "<xsrf>");

    String scheme = props.getProperty("scheme");
    Args.notNull(scheme, "<scheme>");
    String host = props.getProperty("host");
    Args.notNull(host, "<host>");
    String port = props.getProperty("port");
    Args.notNull(port, "<port>");
    String rootPath = props.getProperty("rootPath");
    Args.notNull(rootPath, "<rootPath>");
    String useGZIPCompression = props.getProperty("useGZIPCompression");
    Args.notNull(useGZIPCompression, "<useGZIPCompression>");
    maxUploadFileSizeMB = props.getProperty("maxUploadFileSizeMB") == null ? null
            : Integer.valueOf(props.getProperty("maxUploadFileSizeMB"));

    clientFactory = new SyncopeClientFactoryBean()
            .setAddress(scheme + "://" + host + ":" + port + "/" + rootPath)
            .setContentType(SyncopeClientFactoryBean.ContentType.JSON)
            .setUseCompression(BooleanUtils.toBoolean(useGZIPCompression));

    // read customForm.json
    try (InputStream is = getClass().getResourceAsStream("/" + CUSTOM_FORM_FILE)) {
        customForm = MAPPER.readValue(is, new TypeReference<HashMap<String, CustomAttributesInfo>>() {
        });//  w w  w  .ja  v a  2  s .  com
        File enduserDir = new File(props.getProperty("enduser.directory"));
        boolean existsEnduserDir = enduserDir.exists() && enduserDir.canRead() && enduserDir.isDirectory();
        if (existsEnduserDir) {
            File customFormFile = FileUtils.getFile(enduserDir, CUSTOM_FORM_FILE);
            if (customFormFile.exists() && customFormFile.canRead() && customFormFile.isFile()) {
                customForm = MAPPER.readValue(FileUtils.openInputStream(customFormFile),
                        new TypeReference<HashMap<String, CustomAttributesInfo>>() {
                        });
            }
        }
        FileAlterationObserver observer = existsEnduserDir
                ? new FileAlterationObserver(enduserDir,
                        pathname -> StringUtils.contains(pathname.getPath(), CUSTOM_FORM_FILE))
                : new FileAlterationObserver(getClass().getResource("/" + CUSTOM_FORM_FILE).getFile(),
                        pathname -> StringUtils.contains(pathname.getPath(), CUSTOM_FORM_FILE));

        FileAlterationMonitor monitor = new FileAlterationMonitor(5000);

        FileAlterationListener listener = new FileAlterationListenerAdaptor() {

            @Override
            public void onFileChange(final File file) {
                try {
                    LOG.trace("{} has changed. Reloading form customization configuration.", CUSTOM_FORM_FILE);
                    customForm = MAPPER.readValue(FileUtils.openInputStream(file),
                            new TypeReference<HashMap<String, CustomAttributesInfo>>() {
                            });
                } catch (IOException e) {
                    e.printStackTrace(System.err);
                }
            }

            @Override
            public void onFileCreate(final File file) {
                try {
                    LOG.trace("{} has been created. Loading form customization configuration.",
                            CUSTOM_FORM_FILE);
                    customForm = MAPPER.readValue(FileUtils.openInputStream(file),
                            new TypeReference<HashMap<String, CustomAttributesInfo>>() {
                            });
                } catch (IOException e) {
                    e.printStackTrace(System.err);
                }
            }

            @Override
            public void onFileDelete(final File file) {
                LOG.trace("{} has been deleted. Resetting form customization configuration.", CUSTOM_FORM_FILE);
                customForm = null;
            }
        };

        observer.addListener(listener);
        monitor.addObserver(observer);
        monitor.start();
    } catch (Exception e) {
        throw new WicketRuntimeException("Could not read " + CUSTOM_FORM_FILE, e);
    }

    // mount resources
    ClassPathScanImplementationLookup classPathScanImplementationLookup = (ClassPathScanImplementationLookup) getServletContext()
            .getAttribute(EnduserInitializer.CLASSPATH_LOOKUP);
    for (final Class<? extends AbstractResource> resource : classPathScanImplementationLookup.getResources()) {
        Resource annotation = resource.getAnnotation(Resource.class);
        if (annotation == null) {
            LOG.debug("No @Resource annotation found on {}, ignoring", resource.getName());
        } else {
            try {
                final AbstractResource instance = resource.newInstance();

                mountResource(annotation.path(), new ResourceReference(annotation.key()) {

                    private static final long serialVersionUID = -128426276529456602L;

                    @Override
                    public IResource getResource() {
                        return instance;
                    }
                });
            } catch (Exception e) {
                LOG.error("Could not instantiate {}", resource.getName(), e);
            }
        }
    }
    //mount captcha resource only if captcha is enabled
    if (captchaEnabled) {
        mountResource("/api/captcha", new ResourceReference("captcha") {

            private static final long serialVersionUID = -128426276529456602L;

            @Override
            public IResource getResource() {
                return new CaptchaResource();
            }
        });
    }
}

From source file:org.asciidoctor.maven.AsciidoctorRefreshMojo.java

private void startPolling() throws MojoExecutionException {
    monitors = new ArrayList<FileAlterationMonitor>();

    { // content monitor
        final FileAlterationObserver observer;
        if (sourceDocumentName != null) {
            observer = new FileAlterationObserver(sourceDirectory, new NameFileFilter(sourceDocumentName));
        } else if (sourceDirectory != null) {
            observer = new FileAlterationObserver(sourceDirectory,
                    new RegexFileFilter(ASCIIDOC_REG_EXP_EXTENSION));
        } else {//from  w  ww  . j  a  v a2 s . c  o m
            monitors = null; // no need to start anything because there is no content
            return;
        }

        final FileAlterationMonitor monitor = new FileAlterationMonitor(interval);
        final FileAlterationListener listener = new FileAlterationListenerAdaptor() {
            @Override
            public void onFileCreate(final File file) {
                getLog().info("File " + file.getAbsolutePath() + " created.");
                needsUpdate.set(true);
            }

            @Override
            public void onFileChange(final File file) {
                getLog().info("File " + file.getAbsolutePath() + " updated.");
                needsUpdate.set(true);
            }

            @Override
            public void onFileDelete(final File file) {
                getLog().info("File " + file.getAbsolutePath() + " deleted.");
                needsUpdate.set(true);
            }
        };

        observer.addListener(listener);
        monitor.addObserver(observer);

        monitors.add(monitor);
    }

    { // resources monitors
        if (synchronizations != null) {
            for (final Synchronization s : synchronizations) {
                final FileAlterationMonitor monitor = new FileAlterationMonitor(interval);
                final FileAlterationListener listener = new FileAlterationListenerAdaptor() {
                    @Override
                    public void onFileCreate(final File file) {
                        getLog().info("File " + file.getAbsolutePath() + " created.");
                        synchronize(s);
                        needsUpdate.set(true);
                    }

                    @Override
                    public void onFileChange(final File file) {
                        getLog().info("File " + file.getAbsolutePath() + " updated.");
                        synchronize(s);
                        needsUpdate.set(true);
                    }

                    @Override
                    public void onFileDelete(final File file) {
                        getLog().info("File " + file.getAbsolutePath() + " deleted.");
                        FileUtils.deleteQuietly(file);
                        needsUpdate.set(true);
                    }
                };

                final File source = s.getSource();

                final FileAlterationObserver observer;
                if (source.isDirectory()) {
                    observer = new FileAlterationObserver(source);
                } else {
                    observer = new FileAlterationObserver(source.getParentFile(),
                            new NameFileFilter(source.getName()));
                }

                observer.addListener(listener);
                monitor.addObserver(observer);

                monitors.add(monitor);
            }
        }
    }

    for (final FileAlterationMonitor monitor : monitors) {
        try {
            monitor.start();
        } catch (final Exception e) {
            throw new MojoExecutionException(e.getMessage(), e);
        }
    }
}

From source file:org.bonitasoft.web.designer.config.LiveBuildConfig.java

@Bean
public FileAlterationMonitor monitor() {
    return new FileAlterationMonitor(1000);
}

From source file:org.codice.opendx.utility.NITFDirectoryWatcher.java

public void init() throws Exception {
    log.info("Starting NITFDirectoryWatcher");

    File directory = new File(path);
    try {/*from   w w  w  . j a v  a  2s. c o  m*/
        directory.mkdirs();
    } catch (Exception e) {
        log.warn("Unable to create nitf target directory: " + directory.getPath(), e);
    }

    FileAlterationObserver observer = new FileAlterationObserver(directory);

    observer.addListener(alterationListener);

    long interval = 5000l;
    monitor = new FileAlterationMonitor(interval);
    monitor.addObserver(observer);
    monitor.start();
}

From source file:org.cytoscape.app.internal.manager.AppManager.java

private void setupAlterationMonitor() {
    // Set up the FileAlterationMonitor to install/uninstall apps when apps are moved in/out of the 
    // installed/uninstalled app directories
    fileAlterationMonitor = new FileAlterationMonitor(2000L);

    File installedAppsPath = new File(getInstalledAppsPath());

    FileAlterationObserver installAlterationObserver = new FileAlterationObserver(installedAppsPath,
            new SingleLevelFileFilter(installedAppsPath), IOCase.SYSTEM);

    final AppManager appManager = this;

    // Listen for events on the "installed apps" folder
    installAlterationObserver.addListener(new FileAlterationListenerAdaptor() {
        @Override//from  ww w  .  ja  v  a  2  s.  c o m
        public void onFileCreate(File file) {
            App parsedApp = null;
            try {
                parsedApp = appParser.parseApp(file);
            } catch (AppParsingException e) {
                return;
            }

            App registeredApp = null;
            for (App app : apps) {
                if (parsedApp.heuristicEquals(app)) {
                    registeredApp = app;

                    // Delete old file if it was still there
                    File oldFile = registeredApp.getAppFile();

                    if (oldFile.exists() && !registeredApp.getAppFile().equals(parsedApp.getAppFile())) {
                        FileUtils.deleteQuietly(oldFile);
                    }

                    // Update file reference to reflect file having been moved
                    registeredApp.setAppFile(file);
                }
            }

            try {
                if (registeredApp == null) {
                    apps.add(parsedApp);
                    parsedApp.install(appManager);
                } else {
                    registeredApp.install(appManager);
                }
            } catch (AppInstallException e) {
                logger.warn(e.getLocalizedMessage());
            }

            fireAppsChangedEvent();
        }

        @Override
        public void onFileChange(File file) {
            // Can treat file replacements/changes as old file deleted, new file added
            this.onFileDelete(file);
            this.onFileCreate(file);

            fireAppsChangedEvent();
        }

        @Override
        public void onFileDelete(File file) {
            // System.out.println(file + " on delete");

            DebugHelper.print(this + " installObserverDelete", file.getAbsolutePath() + " deleted.");

            for (App app : apps) {

                if (app.getAppFile().equals(file)) {
                    app.setStatus(AppStatus.FILE_MOVED);
                }
            }

            fireAppsChangedEvent();
        }
    });

    FileAlterationObserver disableAlterationObserver = new FileAlterationObserver(getDisabledAppsPath(),
            new SingleLevelFileFilter(new File(getDisabledAppsPath())), IOCase.SYSTEM);

    // Listen for events on the "disabled apps" folder
    disableAlterationObserver.addListener(new FileAlterationListenerAdaptor() {
        @Override
        public void onFileCreate(File file) {
            App parsedApp = null;
            try {
                parsedApp = appParser.parseApp(file);
            } catch (AppParsingException e) {
                logger.warn(e.getLocalizedMessage());
                return;
            }

            DebugHelper.print(this + " disableObserver Create", parsedApp.getAppName() + " parsed");

            App registeredApp = null;
            for (App app : apps) {
                if (parsedApp.heuristicEquals(app)) {
                    registeredApp = app;

                    // Delete old file if it was still there
                    // TODO: Possible rename from filename-2 to filename?
                    File oldFile = registeredApp.getAppFile();

                    if (oldFile.exists() && !registeredApp.getAppFile().equals(parsedApp.getAppFile())) {
                        DebugHelper.print(this + " disableObserverCreate",
                                registeredApp.getAppName() + " moved from "
                                        + registeredApp.getAppFile().getAbsolutePath() + " to "
                                        + parsedApp.getAppFile().getAbsolutePath() + ". deleting: " + oldFile);

                        FileUtils.deleteQuietly(oldFile);
                    }

                    // Update file reference to reflect file having been moved
                    registeredApp.setAppFile(file);
                }
            }

            try {
                if (registeredApp == null) {
                    apps.add(parsedApp);
                    parsedApp.disable(appManager);
                } else {
                    registeredApp.disable(appManager);
                }

                fireAppsChangedEvent();

            } catch (AppDisableException e) {
            }

            // System.out.println(file + " on create");
        }

        @Override
        public void onFileChange(File file) {
            // Can treat file replacements/changes as old file deleted, new file added
            this.onFileDelete(file);
            this.onFileCreate(file);

            fireAppsChangedEvent();
        }

        @Override
        public void onFileDelete(File file) {
            // System.out.println(file + " on delete");

            DebugHelper.print(this + " disableObserverDelete", file.getAbsolutePath() + " deleted.");

            for (App app : apps) {
                // System.out.println("checking " + app.getAppFile().getAbsolutePath());
                if (app.getAppFile().equals(file)) {
                    // System.out.println(app + " moved");
                    app.setStatus(AppStatus.FILE_MOVED);
                }
            }

            fireAppsChangedEvent();
        }
    });

    FileAlterationObserver uninstallAlterationObserver = new FileAlterationObserver(getUninstalledAppsPath(),
            new SingleLevelFileFilter(new File(getUninstalledAppsPath())), IOCase.SYSTEM);

    // Listen for events on the "uninstalled apps" folder
    uninstallAlterationObserver.addListener(new FileAlterationListenerAdaptor() {
        @Override
        public void onFileCreate(File file) {
            App parsedApp = null;
            try {
                parsedApp = appParser.parseApp(file);
            } catch (AppParsingException e) {
                return;
            }

            DebugHelper.print(this + " uninstallObserverCreate", parsedApp.getAppName() + " parsed");

            App registeredApp = null;
            for (App app : apps) {
                if (parsedApp.heuristicEquals(app)) {
                    registeredApp = app;

                    // Delete old file if it was still there
                    // TODO: Possible rename from filename-2 to filename?
                    File oldFile = registeredApp.getAppFile();

                    if (oldFile.exists() && !registeredApp.getAppFile().equals(parsedApp.getAppFile())) {
                        DebugHelper.print(this + " uninstallObserverCreate",
                                registeredApp.getAppName() + " moved from "
                                        + registeredApp.getAppFile().getAbsolutePath() + " to "
                                        + parsedApp.getAppFile().getAbsolutePath() + ". deleting: " + oldFile);

                        FileUtils.deleteQuietly(oldFile);
                    }

                    // Update file reference to reflect file having been moved
                    registeredApp.setAppFile(file);
                }
            }

            try {
                // Checks if the app file moved here belonged to a known app, if so, uninstall it.
                if (registeredApp == null) {
                    apps.add(parsedApp);
                    parsedApp.uninstall(appManager);
                } else {
                    registeredApp.uninstall(appManager);
                }

                fireAppsChangedEvent();

            } catch (AppUninstallException e) {
            }

            // System.out.println(file + " on create");
        }

        @Override
        public void onFileChange(File file) {
            // Can treat file replacements/changes as old file deleted, new file added
            this.onFileDelete(file);
            this.onFileCreate(file);

            fireAppsChangedEvent();
        }

        @Override
        public void onFileDelete(File file) {
            // System.out.println(file + " on delete");

            DebugHelper.print(this + " uninstallObserverDelete", file.getAbsolutePath() + " deleted.");

            for (App app : apps) {
                // System.out.println("checking " + app.getAppFile().getAbsolutePath());
                if (app.getAppFile().equals(file)) {
                    // System.out.println(app + " moved");
                    app.setStatus(AppStatus.FILE_MOVED);
                }
            }

            fireAppsChangedEvent();
        }
    });

    // setupKarafDeployMonitor(fileAlterationMonitor);

    try {
        installAlterationObserver.initialize();
        fileAlterationMonitor.addObserver(installAlterationObserver);

        disableAlterationObserver.initialize();
        fileAlterationMonitor.addObserver(disableAlterationObserver);

        uninstallAlterationObserver.initialize();
        fileAlterationMonitor.addObserver(uninstallAlterationObserver);

        fileAlterationMonitor.start();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}