From 6af8d21688273b390c5f6ca9fbd91d2968f80c8a Mon Sep 17 00:00:00 2001 From: zapata Date: Thu, 1 Jun 2006 18:26:51 +0000 Subject: [PATCH] introduction of the change engine --- source/mir/changetracker/ChangeReporter.java | 107 ++++++++++++++++++++ source/mir/changetracker/ChangeTracker.java | 146 +++++++++++++++++++++++++++ source/mircoders/global/ChangeEngine.java | 76 ++++++++++++++ 3 files changed, 329 insertions(+) create mode 100644 source/mir/changetracker/ChangeReporter.java create mode 100644 source/mir/changetracker/ChangeTracker.java create mode 100644 source/mircoders/global/ChangeEngine.java diff --git a/source/mir/changetracker/ChangeReporter.java b/source/mir/changetracker/ChangeReporter.java new file mode 100644 index 00000000..e90d0c2e --- /dev/null +++ b/source/mir/changetracker/ChangeReporter.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. + */ +package mir.changetracker; + +import mir.util.LockFile; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +/** + * Class to report changes by writing to a file and using a lockfile. + * + * This class is NOT thread-safe, the perform() method should not be called + * concurrently. + */ +public class ChangeReporter { + public static void reportChanges( + ChangeTracker aTracker, String aBasePath, + List anExcludedPaths, File aReportFilename, + File aReportLockfile, long aMaxTimeOut, boolean aFlush) throws IOException { + + reportChanges(aTracker, aBasePath, + (String[]) anExcludedPaths.toArray(new String[0]), + aReportFilename, aReportLockfile, aMaxTimeOut, aFlush); + } + + /** + * @param aBasePath The base path that should be tracked + * @param anExcludedPaths The paths that are excluded from tracking + * @param aTracker The actual tracker to query for changes + * @param aReportFilename The file to write changed filenames to + * @param aReportLockfile The lockfile for the report file + */ + public static void reportChanges(ChangeTracker aTracker, String aBasePath, + String[] anExcludedPaths, File aReportFilename, File aReportLockfile, + long aMaxTimeOut, boolean aFlush) throws IOException { + List changesToReport = aTracker.getChanges(aBasePath, anExcludedPaths); + LockFile lockFile = null; + + if (aReportLockfile!=null) + lockFile = new LockFile(aReportLockfile); + + if (changesToReport.size()>0) { + if (lockFile == null || lockFile.lock()) { + try { + FileWriter writer = new FileWriter(aReportFilename.getAbsolutePath(), true); + try { + Iterator i = changesToReport.iterator(); + while (i.hasNext()) { + writer.write((String) i.next()); + writer.write("\n"); + } + } + finally { + try { + writer.close(); + } + catch (Throwable t) { + } + } + + if (aFlush) { + aTracker.clearChanges(changesToReport); + } + } + finally { + try { + if (lockFile!=null) + lockFile.unlock(); + } + catch (Throwable t) { + } + } + } + } + } +} diff --git a/source/mir/changetracker/ChangeTracker.java b/source/mir/changetracker/ChangeTracker.java new file mode 100644 index 00000000..0218f32a --- /dev/null +++ b/source/mir/changetracker/ChangeTracker.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2001, 2002 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. + */ + +package mir.changetracker; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Arrays; + +/** + * Change tracker, tracks changes to a path based repository. + * All methods are thread-safe + */ + +public class ChangeTracker { + private List changes; + + public ChangeTracker() { + changes = new ArrayList(); + } + + /** + * Adds a single change + */ + public void addChange(String aPath) { + synchronized (changes) { + changes.add(aPath); + } + } + + /** + * Adds an array of changes + */ + public void addChanges(String[] aPaths) { + addChanges(Arrays.asList(aPaths)); + } + + /** + * Adds a List of changes + */ + public void addChanges(List aChanges) { + synchronized (changes) { + changes.addAll(aChanges); + } + } + + /** + * Returns changes within a base path, and removes them from the + * tracker. + */ + public List flushChanges(String aBasePath) { + return flushChanges(aBasePath, new String[0]); + } + + /** + * Returns changes within a base path, and removes them from the + * tracker. + */ + public List flushChanges(String aBasePath, String[] anExcludedPaths) { + synchronized (changes) { + List result = getChanges(aBasePath, anExcludedPaths); + + clearChanges(result); + + return result; + } + } + + /** + * Removes changes from the tracker + */ + public void clearChanges(List aChanges) { + synchronized (changes) { + changes.removeAll(aChanges); + } + } + + /** + * Returns all changes within a base path + */ + public List getChanges(String aBasePath) { + synchronized (changes) { + List result = new ArrayList(); + + Iterator i = changes.iterator(); + while (i.hasNext()) { + String change = (String) i.next(); + if (change.startsWith(aBasePath)) + result.add(change); + } + + return result; + } + } + + /** + * gets all changes within a base path, but excluding some other paths + */ + public List getChanges(String aBasePath, String[] anExcludingPaths) { + synchronized (changes) { + List result = getChanges(aBasePath); + + for (int i=0; i0; i++) { + List remove = new ArrayList(); + Iterator j = result.iterator(); + while (j.hasNext()) { + String item = (String) j.next(); + if (item.startsWith(anExcludingPaths[i])) { + remove.add(item); + } + } + result.removeAll(remove); + } + + return result; + } + } +} \ No newline at end of file diff --git a/source/mircoders/global/ChangeEngine.java b/source/mircoders/global/ChangeEngine.java new file mode 100644 index 00000000..e1f44ccb --- /dev/null +++ b/source/mircoders/global/ChangeEngine.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2006 The Mir-coders group + * + * This file is part of Mir. + * + * Mir is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Mir is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Mir; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In addition, as a special exception, The Mir-coders gives permission to link + * the code of this program with any library licensed under the Apache Software License, + * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library + * (or with modified versions of the above that use the same license as the above), + * and distribute linked combinations including the two. You must obey the + * GNU General Public License in all respects for all of the code used other than + * the above mentioned libraries. If you modify this file, you may extend this + * exception to your version of the file, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your version. + */ +package mircoders.global; + +import mir.changetracker.ChangeReporter; +import mir.changetracker.ChangeTracker; +import mir.log.LoggerWrapper; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +public class ChangeEngine { + private ChangeTracker tracker; + private LoggerWrapper logger; + + public ChangeEngine() { + tracker = new ChangeTracker(); + logger = new LoggerWrapper("Global.Changes"); + } + + /** + * Return the (global) change tracker + */ + public ChangeTracker getTracker() { + return tracker; + } + + /** + * + * @param aReportFileName + * @param aLockFileName + * @param aBasePath + * @param anExcludedPaths + * @param aFlush + */ + public void report(String aReportFileName, String aLockFileName, String aBasePath, + List anExcludedPaths, boolean aFlush) throws IOException { + + File reportFile = new File(MirGlobal.config().getHome(), aReportFileName); + File lockFile = null; + + if (aLockFileName!=null) { + lockFile = new File(MirGlobal.config().getHome(), aLockFileName); + } + + ChangeReporter.reportChanges(tracker, aBasePath, anExcludedPaths, reportFile, lockFile, 30*1000, aFlush); + } +} -- 2.11.0