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);
}
}
}
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);
}
}
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;
}
}
Aggregations