All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.talanlabs.processmanager.messages.trigger.tasks.filesys.FolderEventTriggerTask Maven / Gradle / Ivy

The newest version!
package com.talanlabs.processmanager.messages.trigger.tasks.filesys;

import com.talanlabs.processmanager.messages.trigger.api.TriggerEventListener;
import com.talanlabs.processmanager.messages.trigger.event.ModifiedFileTriggerEvent;
import com.talanlabs.processmanager.messages.trigger.event.NewFileTriggerEvent;
import com.talanlabs.processmanager.messages.trigger.event.RemovedFileTriggerEvent;
import com.talanlabs.processmanager.messages.trigger.tasks.AbstractTriggerTask;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * A task which scans a folder and sends a notification to its trigger when a change occurred (modified file, new file, removed file).
* @see com.talanlabs.processmanager.messages.gate.AbstractFileSysGate */ public class FolderEventTriggerTask extends AbstractTriggerTask { /** * If a file is called "trigger.stop", the trigger is paused */ private static final String STOP_FILE = "trigger.stop"; //$NON-NLS-1$ private final Map lmdates; private final File folder; private final String lockExtension; private final File stopFile; public FolderEventTriggerTask(File folder, String lockExtension) { this.folder = folder; this.lmdates = new HashMap<>(); this.lockExtension = lockExtension; this.stopFile = new File(folder, STOP_FILE); } @Override public void execute(TriggerEventListener triggerEventListener) { if (stopFile.exists()) { return; } File[] files = folder.listFiles(); if (files != null) { for (File file : files) { if (stopFile.exists()) { return; } if (acceptScan(file)) { propagateEvent(file, triggerEventListener); } } } List toRemove = new ArrayList<>(); for (String fname : lmdates.keySet()) { File file = new File(folder, fname); if (!file.exists()) { toRemove.add(fname); } } for (String fname : toRemove) { lmdates.remove(fname); triggerEventListener.notifyEvent(new RemovedFileTriggerEvent(new File(folder, fname), getTrigger())); } } private boolean acceptScan(File f) { if (f.isDirectory()) { return false; } if (f.getName().equals(STOP_FILE)) { return false; } // it's a standard file, is there a lock? if there is, ignore return !f.getName().endsWith(lockExtension) && !new File(folder, f.getName() + lockExtension).exists(); } private void propagateEvent(File f, TriggerEventListener triggerEventListener) { long lmdiff = getLastModifDateDiff(f); if (lmdiff < 0) { // This file is new // Propagate a "new file" message triggerEventListener.notifyEvent(new NewFileTriggerEvent(f, getTrigger())); } else if (lmdiff > 0) { // This file has been modified // Propagate a "modified file" message triggerEventListener.notifyEvent(new ModifiedFileTriggerEvent(f, getTrigger())); } } private long getLastModifDateDiff(File f) { long lmd = f.lastModified(); Object obj = lmdates.get(f.getName()); if (obj == null) { lmdates.put(f.getName(), lmd); return -1; } else { long delta = lmd - (Long) obj; if (delta > 0) { lmdates.put(f.getName(), lmd); } return delta; } } @Override public void clean() { lmdates.clear(); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy