changeset 217:e39cf474ef94

Experimental support to mix-in start and end events for inspectors. Additionally, Lifecycle may serve as iteration control
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 17 May 2011 03:40:52 +0200
parents c251bbc979cf
children 047b1dec7a04
files src/org/tmatesoft/hg/internal/Lifecycle.java src/org/tmatesoft/hg/internal/RevlogStream.java
diffstat 2 files changed, 60 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/tmatesoft/hg/internal/Lifecycle.java	Tue May 17 03:40:52 2011 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2011 TMate Software Ltd
+ *  
+ * 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; version 2 of the License.
+ *
+ * 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.
+ *
+ * For information on how to redistribute this software under
+ * the terms of a license other than GNU General Public License
+ * contact TMate Software at support@hg4j.com
+ */
+package org.tmatesoft.hg.internal;
+
+/**
+ * EXPERIMENTAL.
+ * Mix-in for RevlogStream.Inspector to get informed about start and end of the iteration
+ * 
+ * @author Artem Tikhomirov
+ * @author TMate Software Ltd.
+ */
+public interface Lifecycle {
+
+	public void start(int count, Callback callback, Object token);
+	public void finish(Object token);
+
+	interface Callback {
+		void stop();
+	}
+	
+	class BasicCallback implements Callback {
+		private boolean done = false;
+		
+		public void stop() {
+			done = true;
+		}
+		public boolean isStopped() {
+			return done;
+		}
+	}
+}
--- a/src/org/tmatesoft/hg/internal/RevlogStream.java	Tue May 17 01:15:12 2011 +0200
+++ b/src/org/tmatesoft/hg/internal/RevlogStream.java	Tue May 17 03:40:52 2011 +0200
@@ -200,6 +200,7 @@
 		}
 		// XXX may cache [start .. end] from index with a single read (pre-read)
 		
+		Lifecycle.BasicCallback cb = null;
 		DataAccess daIndex = null, daData = null;
 		daIndex = getIndexStream();
 		if (needData && !inline) {
@@ -218,6 +219,12 @@
 			}
 			
 			daIndex.seek(getIndexOffsetInt(i));
+			
+			if (inspector instanceof Lifecycle) {
+				cb = new Lifecycle.BasicCallback();
+				((Lifecycle) inspector).start(end - start + 1, cb, cb);
+			}
+			
 			for (; i <= end; i++ ) {
 				if (inline && needData) {
 					// inspector reading data (though FilterDataAccess) may have affected index position
@@ -282,6 +289,11 @@
 				if (!extraReadsToBaseRev || i >= start) {
 					inspector.next(i, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, nodeidBuf, userDataAccess);
 				}
+				if (cb != null) {
+					if (cb.isStopped()) {
+						break;
+					}
+				}
 				if (userDataAccess != null) {
 					userDataAccess.reset();
 					if (lastUserData != null) {
@@ -293,6 +305,9 @@
 		} catch (IOException ex) {
 			throw new HgBadStateException(ex); // FIXME need better handling
 		} finally {
+			if (inspector instanceof Lifecycle) {
+				((Lifecycle) inspector).finish(cb);
+			}
 			daIndex.done();
 			if (daData != null) {
 				daData.done();