Search in sources :

Example 1 with DirectoryMonitoringRequest

use of org.springframework.roo.file.monitor.DirectoryMonitoringRequest in project spring-roo by spring-projects.

the class ProjectPathMonitoringInitializer method monitorPathIfExists.

private void monitorPathIfExists(final LogicalPath logicalPath) {
    final String canonicalPath = pathResolver.getRoot(logicalPath);
    // belong to a module
    if (StringUtils.isNotBlank(canonicalPath)) {
        final File directory = new File(canonicalPath);
        if (directory.isDirectory()) {
            final MonitoringRequest request = new DirectoryMonitoringRequest(directory, true, MONITORED_OPERATIONS);
            new UndoableMonitoringRequest(undoManager, fileMonitorService, request, true);
        }
    }
}
Also used : DirectoryMonitoringRequest(org.springframework.roo.file.monitor.DirectoryMonitoringRequest) DirectoryMonitoringRequest(org.springframework.roo.file.monitor.DirectoryMonitoringRequest) MonitoringRequest(org.springframework.roo.file.monitor.MonitoringRequest) File(java.io.File)

Example 2 with DirectoryMonitoringRequest

use of org.springframework.roo.file.monitor.DirectoryMonitoringRequest in project spring-roo by spring-projects.

the class PollingFileMonitorService method add.

public boolean add(final MonitoringRequest request) {
    synchronized (lock) {
        Validate.notNull(request, "MonitoringRequest required");
        // amend existing requests or ignore new request as appropriate
        if (request instanceof DirectoryMonitoringRequest) {
            final DirectoryMonitoringRequest dmr = (DirectoryMonitoringRequest) request;
            if (dmr.isWatchSubtree()) {
                for (final MonitoringRequest existing : requests) {
                    if (existing instanceof DirectoryMonitoringRequest) {
                        final DirectoryMonitoringRequest existingDmr = (DirectoryMonitoringRequest) existing;
                        if (existingDmr.isWatchSubtree()) {
                            // We have a new request and an existing
                            // request, both for directories, and both which
                            // monitor sub-trees
                            String existingDmrPath;
                            String newDmrPath;
                            try {
                                existingDmrPath = existingDmr.getFile().getCanonicalPath();
                                newDmrPath = dmr.getFile().getCanonicalPath();
                            } catch (final IOException ioe) {
                                throw new IllegalStateException("Unable to resolve canonical name", ioe);
                            }
                            // it's unnecessary
                            if (newDmrPath.startsWith(existingDmrPath)) {
                                return false;
                            }
                            // will incorporate it
                            if (existingDmrPath.startsWith(newDmrPath)) {
                                remove(existing);
                            }
                        }
                    }
                }
            }
        }
        return requests.add(request);
    }
}
Also used : DirectoryMonitoringRequest(org.springframework.roo.file.monitor.DirectoryMonitoringRequest) IOException(java.io.IOException) MonitoringRequest(org.springframework.roo.file.monitor.MonitoringRequest) DirectoryMonitoringRequest(org.springframework.roo.file.monitor.DirectoryMonitoringRequest)

Example 3 with DirectoryMonitoringRequest

use of org.springframework.roo.file.monitor.DirectoryMonitoringRequest in project spring-roo by spring-projects.

the class PollingFileMonitorService method scanAll.

public int scanAll() {
    synchronized (lock) {
        if (requests.isEmpty()) {
            return 0;
        }
        int changes = 0;
        for (final MonitoringRequest request : requests) {
            boolean includeSubtree = false;
            if (request instanceof DirectoryMonitoringRequest) {
                includeSubtree = ((DirectoryMonitoringRequest) request).isWatchSubtree();
            }
            if (!request.getFile().exists()) {
                continue;
            }
            // Build contents of the monitored location
            final Map<File, Long> currentExecution = new HashMap<File, Long>();
            computeEntries(currentExecution, request.getFile(), includeSubtree);
            final List<FileEvent> eventsToPublish = new ArrayList<FileEvent>();
            if (priorExecution.containsKey(request)) {
                // Need to perform a comparison, as we have data from a
                // previous execution
                final Map<File, Long> priorFiles = priorExecution.get(request);
                // Locate created and modified files
                for (final Entry<File, Long> entry : currentExecution.entrySet()) {
                    final File thisFile = entry.getKey();
                    final Long currentTimestamp = entry.getValue();
                    if (!priorFiles.containsKey(thisFile)) {
                        // This file did not exist last execution, so it
                        // must be new
                        eventsToPublish.add(new FileEvent(new FileDetails(thisFile, currentTimestamp), FileOperation.CREATED, null));
                        try {
                            // If this file was already going to be
                            // notified, there is no need to do it twice
                            notifyCreated.remove(thisFile.getCanonicalPath());
                        } catch (final IOException ignored) {
                        }
                        continue;
                    }
                    final Long previousTimestamp = priorFiles.get(thisFile);
                    if (!currentTimestamp.equals(previousTimestamp)) {
                        // Modified
                        eventsToPublish.add(new FileEvent(new FileDetails(thisFile, currentTimestamp), FileOperation.UPDATED, null));
                        try {
                            // If this file was already going to be
                            // notified, there is no need to do it twice
                            notifyChanged.remove(thisFile.getCanonicalPath());
                        } catch (final IOException ignored) {
                        }
                    }
                }
                // Now locate deleted files
                priorFiles.keySet().removeAll(currentExecution.keySet());
                for (final Entry<File, Long> entry : priorFiles.entrySet()) {
                    final File deletedFile = entry.getKey();
                    eventsToPublish.add(new FileEvent(new FileDetails(deletedFile, entry.getValue()), FileOperation.DELETED, null));
                    try {
                        // If this file was already going to be notified,
                        // there is no need to do it twice
                        notifyDeleted.remove(deletedFile.getCanonicalPath());
                    } catch (final IOException ignored) {
                    }
                }
            } else {
                // newly-monitored location
                for (final Entry<File, Long> entry : currentExecution.entrySet()) {
                    eventsToPublish.add(new FileEvent(new FileDetails(entry.getKey(), entry.getValue()), FileOperation.MONITORING_START, null));
                }
            }
            // Record the monitored location's contents, ready for next
            // execution
            priorExecution.put(request, currentExecution);
            // We can discard the created and deleted notifications, as they
            // would have been correctly discovered in the above loop
            notifyCreated.clear();
            notifyDeleted.clear();
            // this indicates an identical millisecond update occurred
            for (final String canonicalPath : notifyChanged) {
                final File file = new File(canonicalPath);
                eventsToPublish.add(new FileEvent(new FileDetails(file, file.lastModified()), FileOperation.UPDATED, null));
            }
            notifyChanged.clear();
            // ROO-3622: Validate if version change
            if (!isDifferentVersion()) {
                // Publishing pending events if needed
                if (!eventsPendingToPublish.isEmpty()) {
                    publish(eventsPendingToPublish);
                    // Clear events pending to publish
                    eventsPendingToPublish.clear();
                }
                publish(eventsToPublish);
            } else {
                for (FileEvent event : eventsToPublish) {
                    if (eventsPendingToPublish.indexOf(event) == -1) {
                        eventsPendingToPublish.add(event);
                    }
                }
            }
            changes += eventsToPublish.size();
        }
        return changes;
    }
}
Also used : HashMap(java.util.HashMap) WeakHashMap(java.util.WeakHashMap) ArrayList(java.util.ArrayList) FileDetails(org.springframework.roo.file.monitor.event.FileDetails) IOException(java.io.IOException) FileEvent(org.springframework.roo.file.monitor.event.FileEvent) DirectoryMonitoringRequest(org.springframework.roo.file.monitor.DirectoryMonitoringRequest) MonitoringRequest(org.springframework.roo.file.monitor.MonitoringRequest) DirectoryMonitoringRequest(org.springframework.roo.file.monitor.DirectoryMonitoringRequest) JarFile(java.util.jar.JarFile) File(java.io.File)

Aggregations

DirectoryMonitoringRequest (org.springframework.roo.file.monitor.DirectoryMonitoringRequest)3 MonitoringRequest (org.springframework.roo.file.monitor.MonitoringRequest)3 File (java.io.File)2 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 WeakHashMap (java.util.WeakHashMap)1 JarFile (java.util.jar.JarFile)1 FileDetails (org.springframework.roo.file.monitor.event.FileDetails)1 FileEvent (org.springframework.roo.file.monitor.event.FileEvent)1