From f8fd96b1e16d9d27f6a3e4264f89efd2d1061e37 Mon Sep 17 00:00:00 2001 From: Jon Cox Date: Fri, 22 Jun 2007 05:32:58 +0000 Subject: [PATCH] Point checkin. Rough cut at href merge op (don't use it yet though). Also included abort() method on progress object. What's left: o put incremental update in looping thread(s) to let system bootstrap from nothing o deal with store/webapp going away o deal with virt server down o Switch to using virtualized snapshot instead of HEAD in staging o testing... and lots of it git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6063 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../linkvalidation/HrefDifference.java | 37 +++++++++-- .../linkvalidation/HrefStatusMap.java | 8 ++- .../HrefValidationProgress.java | 21 ++++++ .../LinkValidationAbortedException.java | 66 +++++++++++++++++++ .../LinkValidationException.java | 65 ++++++++++++++++++ .../linkvalidation/LinkValidationService.java | 15 +++-- 6 files changed, 196 insertions(+), 16 deletions(-) create mode 100644 source/java/org/alfresco/linkvalidation/LinkValidationAbortedException.java create mode 100644 source/java/org/alfresco/linkvalidation/LinkValidationException.java diff --git a/source/java/org/alfresco/linkvalidation/HrefDifference.java b/source/java/org/alfresco/linkvalidation/HrefDifference.java index ebd6c3aac5..301b5a891c 100644 --- a/source/java/org/alfresco/linkvalidation/HrefDifference.java +++ b/source/java/org/alfresco/linkvalidation/HrefDifference.java @@ -35,8 +35,18 @@ import java.util.Map; public class HrefDifference { + /** + * The href_status_map_ is a map of URLs the tuple of their + * return status & list of dependencies. + */ protected HrefStatusMap href_status_map_; // status of links/maybe dep info - protected HrefManifest href_manifest_; // overall manifest in of change + + /** + * The href_manifest_ contains a List objects. + * Each HrefManifestEntry contains a file name, + * and possibly a list of hrefs within that file. + */ + protected HrefManifest href_manifest_; // Lazily computed values protected HrefManifest broken_in_newmod_; // errors in new files @@ -50,27 +60,36 @@ public class HrefDifference protected HashMap> broken_manifest_map_; protected HashMap deleted_file_md5_; - // href attribute lookup prefix - String href_attr_; - String src_store_; + + String href_attr_; // href attribute lookup prefix + String src_store_; String dst_store_; String src_webapp_url_base_; String dst_webapp_url_base_; + int connect_timeout_; + int read_timeout_; + int nthreads_; HrefDifference(String href_attr, String src_store, String dst_store, String src_webapp_url_base, - String dst_webapp_url_base) + String dst_webapp_url_base, + int connect_timeout, + int read_timeout, + int nthreads) { href_attr_ = href_attr; src_store_ = src_store; dst_store_ = dst_store; src_webapp_url_base_ = src_webapp_url_base; dst_webapp_url_base_ = dst_webapp_url_base; + connect_timeout_ = connect_timeout; + read_timeout_ = read_timeout_; + nthreads_ = nthreads; - href_manifest_ = new HrefManifest(); - href_status_map_ = new HrefStatusMap(); + href_manifest_ = new HrefManifest(); + href_status_map_ = new HrefStatusMap(); broken_manifest_map_ = new HashMap>(); deleted_file_md5_ = new HashMap(); @@ -85,6 +104,10 @@ public class HrefDifference String getDstStore() { return dst_store_;} String getSrcWebappUrlBase() { return src_webapp_url_base_; } String getDstWebappUrlBase() { return dst_webapp_url_base_; } + int getConnectTimeout() { return connect_timeout_; } + int getReadTimeout() { return read_timeout_; } + int getNthreads() { return nthreads_; } + Map getDeletedFileMd5() { return deleted_file_md5_; } Map> getBrokenManifestMap() diff --git a/source/java/org/alfresco/linkvalidation/HrefStatusMap.java b/source/java/org/alfresco/linkvalidation/HrefStatusMap.java index f8e32f078c..0f7556e234 100644 --- a/source/java/org/alfresco/linkvalidation/HrefStatusMap.java +++ b/source/java/org/alfresco/linkvalidation/HrefStatusMap.java @@ -34,8 +34,12 @@ import org.alfresco.util.Pair; /** * A synchronized wrapper for the ephemeral cache of href status results. -* The key is a url, the value is a pair consisting of the url's status code -* and the list of files accessed when the URL is requested, if known. +* +* The key is the raw url that was tested (not an md5sum), +* the value is a pair consisting of the url's status code, +* and the list of files accessed when the URL is requested, +* if known. Note that all url & file data are in the namespace +* of the proposed changeset (e.g.: the workflow). * * This class also allows the non-synchronized map it wraps to be extracted. */ diff --git a/source/java/org/alfresco/linkvalidation/HrefValidationProgress.java b/source/java/org/alfresco/linkvalidation/HrefValidationProgress.java index 9bcf472092..68845c303c 100644 --- a/source/java/org/alfresco/linkvalidation/HrefValidationProgress.java +++ b/source/java/org/alfresco/linkvalidation/HrefValidationProgress.java @@ -56,6 +56,7 @@ public class HrefValidationProgress implements Serializable AtomicInteger file_update_count_; AtomicInteger url_update_count_; AtomicBoolean is_done_; + AtomicBoolean is_aborted_; public HrefValidationProgress() { @@ -64,6 +65,7 @@ public class HrefValidationProgress implements Serializable file_update_count_ = new AtomicInteger(); url_update_count_ = new AtomicInteger(); is_done_ = new AtomicBoolean( false ); + is_aborted_ = new AtomicBoolean( false ); } /** @@ -81,6 +83,25 @@ public class HrefValidationProgress implements Serializable */ public int getDirUpdateCount() { return dir_update_count_.intValue(); } + /** + * Tell the thread that is validating hrefs to abort its current + * operation, and cause that operation to declare it "done" and throw + * LinkValidationAbortedException. + * + * Thus, if you have an observer polling progress & checking isDone(), + * they'll also see that things are "finished", and can check to see + * whether it's because isAborted() is true. + */ + public void abort() + { + is_aborted_.set( true ); + setDone( true ); + } + + /** + * Indicates whether or not the validation operation was halted by abort(). + */ + public boolean isAborted() { return is_aborted_.get(); } /** * Returns the number of files that have been completely diff --git a/source/java/org/alfresco/linkvalidation/LinkValidationAbortedException.java b/source/java/org/alfresco/linkvalidation/LinkValidationAbortedException.java new file mode 100644 index 0000000000..5dd9a90d71 --- /dev/null +++ b/source/java/org/alfresco/linkvalidation/LinkValidationAbortedException.java @@ -0,0 +1,66 @@ +/*----------------------------------------------------------------------------- +* Copyright 2007 Alfresco Inc. +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special +* exception to the terms and conditions of version 2.0 of the GPL, you may +* redistribute this Program in connection with Free/Libre and Open Source +* Software ("FLOSS") applications as described in Alfresco's FLOSS exception. +* You should have received a copy of the text describing the FLOSS exception, +* and it is also available here: http://www.alfresco.com/legal/licensing +* +* +* Author Jon Cox +* File LinkValidationException.java +*----------------------------------------------------------------------------*/ + +package org.alfresco.linkvalidation; +import java.io.Serializable; + +/** + * An exception class thrown when a link validation operation is aborted. + * + * @author Jon Cox + */ +public class LinkValidationAbortedException extends LinkValidationException + implements Serializable +{ + // serialVersionUID via: + // + // CLASSPATH=$CLASSPATH:projects/repository/build/classes \ + // serialver org.alfresco.linkvalidation.LinkValidationAbortedException + // + static final long serialVersionUID = 8307355006036359098L; + + + public LinkValidationAbortedException() + { + super(); + } + + public LinkValidationAbortedException(String message) + { + super(message); + } + + public LinkValidationAbortedException(String message, Throwable cause) + { + super(message, cause); + } + + public LinkValidationAbortedException(Throwable cause) + { + super(cause); + } +} diff --git a/source/java/org/alfresco/linkvalidation/LinkValidationException.java b/source/java/org/alfresco/linkvalidation/LinkValidationException.java new file mode 100644 index 0000000000..776eae45eb --- /dev/null +++ b/source/java/org/alfresco/linkvalidation/LinkValidationException.java @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------- +* Copyright 2007 Alfresco Inc. +* +* This program 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. +* +* This program 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 this program; if not, write to the Free Software Foundation, Inc., +* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special +* exception to the terms and conditions of version 2.0 of the GPL, you may +* redistribute this Program in connection with Free/Libre and Open Source +* Software ("FLOSS") applications as described in Alfresco's FLOSS exception. +* You should have received a copy of the text describing the FLOSS exception, +* and it is also available here: http://www.alfresco.com/legal/licensing +* +* +* Author Jon Cox +* File LinkValidationException.java +*----------------------------------------------------------------------------*/ + +package org.alfresco.linkvalidation; +import java.io.Serializable; + +/** + * Class for generic LinkValidation Exceptions. + * + * @author Jon Cox + */ +public class LinkValidationException extends Exception + implements Serializable +{ + // serialVersionUID via: + // + // CLASSPATH=$CLASSPATH:projects/repository/build/classes \ + // serialver org.alfresco.linkvalidation.LinkValidationException + // + static final long serialVersionUID = 571631235536445801L; + + public LinkValidationException() + { + super(); + } + + public LinkValidationException(String message) + { + super(message); + } + + public LinkValidationException(String message, Throwable cause) + { + super(message, cause); + } + + public LinkValidationException(Throwable cause) + { + super(cause); + } +} diff --git a/source/java/org/alfresco/linkvalidation/LinkValidationService.java b/source/java/org/alfresco/linkvalidation/LinkValidationService.java index a75ee0240d..f4e5135dfb 100644 --- a/source/java/org/alfresco/linkvalidation/LinkValidationService.java +++ b/source/java/org/alfresco/linkvalidation/LinkValidationService.java @@ -179,13 +179,14 @@ public interface LinkValidationService public List getHrefsDependentUponFile(String path); public HrefDifference getHrefDifference( - String srcWebappPath, - String dstWebappPath, - int connectTimeout, - int readTimeout, - int nthreads, - HrefValidationProgress progress - ) throws AVMNotFoundException; + String srcWebappPath, + String dstWebappPath, + int connectTimeout, + int readTimeout, + int nthreads, + HrefValidationProgress progress) + throws AVMNotFoundException, + LinkValidationAbortedException; public HrefManifest getHrefManifestBrokenByDelete(HrefDifference hdiff); public HrefManifest getHrefManifestBrokenByNewOrMod(HrefDifference hdiff);