/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.agent; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * This will scan a directory for files to watch for a change. It will update * the list of files only if they number of files in a directory changes. * * @author Michael Neale */ public class DirectoryScanner extends PackageProvider { private FileScanner scanner; private File dir; void configure(Properties config) { String d = config.getProperty(RuleAgent.DIRECTORY); // now check to see whats in them dir... dir = new File(d); if (!(dir.isDirectory() && dir.exists())) { throw new IllegalArgumentException("The directory " + d + "is not valid."); } scanner = new FileScanner(); scanner.setFiles( dir.listFiles() ); scanner.setAgentListener( this.listener ); } PackageChangeInfo loadPackageChanges() { Map<String, String> pathToPackage = scanner.pathToPackage; Collection<String> removedPackageNames = new ArrayList<String>(); if( pathToPackage != null ) { Map<String,String> tempPathToPackage = new HashMap<String, String>(); File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { File f = files[i]; String path = f.getPath(); if (pathToPackage.containsKey(path)) { tempPathToPackage.put(path, pathToPackage.get(path)); pathToPackage.remove(path); } } if( pathToPackage.size() > 0 || files.length != tempPathToPackage.size() ) { removedPackageNames.addAll( pathToPackage.values() ); listener.info("File changes detected in the directory " + dir.getPath()); // scanner = new FileScanner(); scanner.setFiles( files ); } scanner.pathToPackage = tempPathToPackage; } PackageChangeInfo info = scanner.loadPackageChanges(); info.addRemovedPackages(removedPackageNames); return info; } public void setAgentListener(AgentEventListener listener) { super.setAgentListener( listener ); if ( this.scanner != null ) { this.scanner.setAgentListener( listener ); } } public String toString() { String s = "DirectoryScanner"; if (dir != null) { s = s + " scanning dir: " + dir.getPath(); } if (scanner != null && scanner.files != null) { s = s + " found " + scanner.files.length + " file(s)."; } return s; } }