You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by bi...@apache.org on 2011/11/28 20:59:39 UTC

svn commit: r1207551 [1/2] - in /incubator/accumulo/trunk: ./ src/core/src/main/java/org/apache/accumulo/core/client/ src/core/src/main/java/org/apache/accumulo/core/client/admin/ src/core/src/main/java/org/apache/accumulo/core/client/mock/ src/core/sr...

Author: billie
Date: Mon Nov 28 19:59:37 2011
New Revision: 1207551

URL: http://svn.apache.org/viewvc?rev=1207551&view=rev
Log:
ACCUMULO-167 merged to trunk

Added:
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/system/ColumnFamilySkippingIteratorTest.java
      - copied unchanged from r1207545, incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/system/ColumnFamilySkippingIteratorTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/system/ColumnFilterTest.java
      - copied unchanged from r1207545, incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/system/ColumnFilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java
      - copied unchanged from r1207545, incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java
      - copied unchanged from r1207545, incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/FilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/user/LargeRowFilterTest.java
      - copied unchanged from r1207545, incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/LargeRowFilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/user/RegExFilterTest.java
      - copied unchanged from r1207545, incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/RegExFilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/user/VersioningIteratorTest.java
      - copied unchanged from r1207545, incubator/accumulo/branches/1.4/src/core/src/test/java/org/apache/accumulo/core/iterators/user/VersioningIteratorTest.java
Removed:
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/ColumnFamilySkippingIteratorTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/ColumnFilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/CombinerTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/FilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/LargeRowFilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/RegExFilterTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/VersioningIteratorTest.java
Modified:
    incubator/accumulo/trunk/   (props changed)
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperations.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsHelper.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockBatchScanner.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockScanner.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Filter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/LongCombiner.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/ColumnQualifierFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/VisibilityFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/IntersectingIterator.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/LargeRowFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/NoVisFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/SummingArrayCombiner.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/ArgumentChecker.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteIterCommand.java
    incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/SetIterCommand.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/admin/TableOperationsHelperTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/mock/MockConnectorTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/FamilyIntersectingIteratorTest.java
    incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/RowDeletingIteratorTest.java
    incubator/accumulo/trunk/src/server/src/main/java/org/apache/accumulo/server/master/Master.java
    incubator/accumulo/trunk/src/server/src/main/java/org/apache/accumulo/server/test/functional/ServerSideErrorTest.java

Propchange: incubator/accumulo/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Nov 28 19:59:37 2011
@@ -1,2 +1,2 @@
 /incubator/accumulo/branches/1.3:1190280,1190413,1190420,1190427,1190500,1195622,1195625,1195629,1195635,1196044,1196054,1196057,1196071-1196072,1196106,1197066,1198935,1199383,1203683,1204625,1205547,1205880,1206169
-/incubator/accumulo/branches/1.4:1201902-1205055
+/incubator/accumulo/branches/1.4:1201902-1207545

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java Mon Nov 28 19:59:37 2011
@@ -16,8 +16,7 @@
  */
 package org.apache.accumulo.core.client;
 
-import java.util.Collections;
-import java.util.EnumMap;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -25,30 +24,34 @@ import java.util.Set;
 
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
+import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.core.util.ArgumentChecker;
+import org.apache.accumulo.core.util.Pair;
+import org.apache.hadoop.io.Text;
 
 /**
- * Configure a scan-time iterator.
+ * Configure an iterator for minc, majc, and/or scan. By default, IteratorSetting will be configured for scan.
+ * 
+ * Every iterator has a priority, a name, a class, a set of scopes, and configuration parameters.
  * 
- * Every iterator has a priority, a name, a class and any number of named configuration parameters. The typical use case:
+ * A typical use case configured for scan:
  * 
  * <pre>
  * IteratorSetting cfg = new IteratorSetting(priority, &quot;myIter&quot;, MyIterator.class);
- * MyIterator.setOption(cfg, 42);
+ * MyIterator.addOption(cfg, 42);
  * scanner.addScanIterator(cfg);
  * </pre>
- * 
  */
 public class IteratorSetting {
   private int priority;
   private String name;
   private String iteratorClass;
-  private Map<IteratorScope,Map<String,String>> properties = new EnumMap<IteratorScope,Map<String,String>>(IteratorScope.class);
+  private EnumSet<IteratorScope> scopes;
+  private Map<String,String> properties;
   
   /**
-   * Set layer at which this iterator applies. See {@link #setPriority(int) for how the priority is used.}
+   * Get layer at which this iterator applies. See {@link #setPriority(int) for how the priority is used.}
    * 
    * @return the priority of this Iterator
    */
@@ -57,10 +60,14 @@ public class IteratorSetting {
   }
   
   /**
+   * Set layer at which this iterator applies.
+   * 
    * @param priority
-   *          determines the order in which iterators are applied (system iterators are always applied first, then per-table and scan-time, lowest first)
+   *          determines the order in which iterators are applied (system iterators are always applied first, then user-configured iterators, lowest priority
+   *          first)
    */
   public void setPriority(int priority) {
+    ArgumentChecker.strictlyPositive(priority);
     this.priority = priority;
   }
   
@@ -79,6 +86,7 @@ public class IteratorSetting {
    * @param name
    */
   public void setName(String name) {
+    ArgumentChecker.notNull(name);
     this.name = name;
   }
   
@@ -98,87 +106,162 @@ public class IteratorSetting {
    * @param iteratorClass
    */
   public void setIteratorClass(String iteratorClass) {
+    ArgumentChecker.notNull(iteratorClass);
     this.iteratorClass = iteratorClass;
   }
   
   /**
-   * Get any properties set on the iterator. Note that this will be a merged view of the settings for all scopes.
+   * Get the scopes under which this iterator will be configured.
+   * 
+   * @return the scopes
+   */
+  public EnumSet<IteratorScope> getScopes() {
+    return scopes;
+  }
+  
+  /**
+   * Set the scopes under which this iterator will be configured.
    * 
-   * @return a read-only copy of the named options (for all scopes)
+   * @param scopes
+   *          the scopes to set
+   */
+  public void setScopes(EnumSet<IteratorScope> scopes) {
+    ArgumentChecker.notNull(scopes);
+    if (scopes.isEmpty())
+      throw new IllegalArgumentException("empty scopes");
+    this.scopes = scopes;
+  }
+  
+  /**
+   * Get the configuration parameters for this iterator.
+   * 
+   * @return the properties
    */
   public Map<String,String> getProperties() {
-    Map<String,String> result = new HashMap<String,String>();
-    for (Map<String,String> props : properties.values()) {
-      result.putAll(props);
-    }
-    return result;
+    return properties;
+  }
+  
+  /**
+   * Set the configuration parameters for this iterator.
+   * 
+   * @param properties
+   *          the properties to set
+   */
+  public void setProperties(Map<String,String> properties) {
+    this.properties.clear();
+    addOptions(properties);
+  }
+
+  /**
+   * @return <tt>true</tt> if this iterator has configuration parameters.
+   */
+  public boolean hasProperties() {
+    return !properties.isEmpty();
   }
   
   /**
-   * Construct a basic iterator setting with all the required values.
+   * Constructs an iterator setting configured for the scan scope with no parameters. (Parameters can be added later.)
    * 
    * @param priority
    *          the priority for the iterator @see {@link #setPriority(int)}
    * @param name
-   *          the name for the iterator
+   *          the distinguishing name for the iterator
    * @param iteratorClass
-   *          the full class name for the iterator
+   *          the fully qualified class name for the iterator
    */
   public IteratorSetting(int priority, String name, String iteratorClass) {
-    ArgumentChecker.notNull(name, iteratorClass);
-    this.priority = priority;
-    this.name = name;
-    this.iteratorClass = iteratorClass;
+    this(priority, name, iteratorClass, EnumSet.of(IteratorScope.scan), new HashMap<String,String>());
   }
   
   /**
-   * Construct a basic iterator setting.
+   * Constructs an iterator setting configured for the specified scopes with the specified parameters.
    * 
    * @param priority
    *          the priority for the iterator @see {@link #setPriority(int)}
    * @param name
-   *          the name for the iterator
+   *          the distinguishing name for the iterator
    * @param iteratorClass
-   *          the full class name for the iterator
-   * @param scope
-   *          the scope of the iterator
+   *          the fully qualified class name for the iterator
+   * @param scopes
+   *          the scopes of the iterator
    * @param properties
    *          any properties for the iterator
    */
-  public IteratorSetting(int priority, String name, String iteratorClass, IteratorScope scope, Map<String,String> properties) {
-    ArgumentChecker.notNull(name, iteratorClass, scope);
-    this.priority = priority;
-    this.name = name;
-    this.iteratorClass = iteratorClass;
-    addOptions(scope, properties);
+  public IteratorSetting(int priority, String name, String iteratorClass, EnumSet<IteratorScope> scopes, Map<String,String> properties) {
+    setPriority(priority);
+    setName(name);
+    setIteratorClass(iteratorClass);
+    setScopes(scopes);
+    this.properties = new HashMap<String,String>();
+    setProperties(properties);
   }
   
   /**
+   * Constructs an iterator setting using the given class's SimpleName for the iterator name. The iterator setting will be configured for the scan scope with no
+   * parameters.
+   * 
+   * @param priority
+   *          the priority for the iterator @see {@link #setPriority(int)}
+   * @param iteratorClass
+   *          the class for the iterator
+   */
+  public IteratorSetting(int priority, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass) {
+    this(priority, iteratorClass.getSimpleName(), iteratorClass.getName());
+  }
+  
+  /**
+   * Constructs an iterator setting using the given class's SimpleName for the iterator name and configured for the specified scopes with the specified
+   * parameters.
+   * 
+   * @param priority
+   *          the priority for the iterator @see {@link #setPriority(int)}
+   * @param iteratorClass
+   *          the class for the iterator
+   * @param scopes
+   *          the scopes of the iterator
+   * @param properties
+   *          any properties for the iterator
+   */
+  public IteratorSetting(int priority, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass, EnumSet<IteratorScope> scopes,
+      Map<String,String> properties) {
+    this(priority, iteratorClass.getSimpleName(), iteratorClass.getName(), scopes, properties);
+  }
+  
+  /**
+   * Constructs an iterator setting configured for the scan scope with no parameters.
+   * 
    * @param priority
    *          the priority for the iterator @see {@link #setPriority(int)}
    * @param name
-   *          the name for the iterator
+   *          the distinguishing name for the iterator
    * @param iteratorClass
-   *          the class to use for the class name
+   *          the class for the iterator
    */
   public IteratorSetting(int priority, String name, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass) {
     this(priority, name, iteratorClass.getName());
   }
   
   /**
-   * Constructs an ScanIterator using the given class's SimpleName for the iterator name
+   * Constructs an iterator setting configured for the specified scopes with the specified parameters.
    * 
    * @param priority
-   *          the priority for the iterator
+   *          the priority for the iterator @see {@link #setPriority(int)}
+   * @param name
+   *          the distinguishing name for the iterator
    * @param iteratorClass
-   *          the class to use for the iterator
+   *          the class for the iterator
+   * @param scopes
+   *          the scopes of the iterator
+   * @param properties
+   *          any properties for the iterator
    */
-  public IteratorSetting(int priority, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass) {
-    this(priority, iteratorClass.getSimpleName(), iteratorClass.getName());
+  public IteratorSetting(int priority, String name, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass, EnumSet<IteratorScope> scopes,
+      Map<String,String> properties) {
+    this(priority, name, iteratorClass.getName(), scopes, properties);
   }
   
   /**
-   * Add another option to the iterator
+   * Add another option to the iterator.
    * 
    * @param option
    *          the name of the option
@@ -187,61 +270,91 @@ public class IteratorSetting {
    */
   public void addOption(String option, String value) {
     ArgumentChecker.notNull(option, value);
-    for (IteratorScope scope : IteratorScope.values()) {
-      addOptions(scope, Collections.singletonMap(option, value));
-    }
+    properties.put(option, value);
   }
   
   /**
-   * Add many options to the iterator
+   * Remove an option from the iterator.
    * 
-   * @param keyValues
-   *          the values to add to the options
+   * @param option
+   *          the name of the option
+   * @return the value previously associated with the option, or null if no such option existed
    */
-  public void addOptions(Set<Entry<String,String>> keyValues) {
-    for (Entry<String,String> keyValue : keyValues) {
-      addOption(keyValue.getKey(), keyValue.getValue());
-    }
+  public String removeOption(String option) {
+    ArgumentChecker.notNull(option);
+    return properties.remove(option);
   }
   
   /**
-   * Get the properties on the iterator by scope
+   * Add many options to the iterator.
    * 
-   * @return a mapping from scope to key/value settings
+   * @param propertyEntries
+   *          a set of entries to add to the options
    */
-  public Map<IteratorScope,Map<String,String>> getOptionsByScope() {
-    Map<IteratorScope,Map<String,String>> result = new EnumMap<IteratorScope,Map<String,String>>(IteratorScope.class);
-    for (Entry<IteratorScope,Map<String,String>> property : properties.entrySet()) {
-      result.put(property.getKey(), Collections.unmodifiableMap(property.getValue()));
+  public void addOptions(Set<Entry<String,String>> propertyEntries) {
+    ArgumentChecker.notNull(propertyEntries);
+    for (Entry<String,String> keyValue : propertyEntries) {
+      addOption(keyValue.getKey(), keyValue.getValue());
     }
-    return Collections.unmodifiableMap(result);
   }
   
   /**
-   * Add many options to to the iterator for a scope
+   * Add many options to the iterator.
    * 
-   * @param scope
-   *          the scope to put the properties
    * @param properties
-   *          key/value pairs
+   *          a map of entries to add to the options
    */
-  public void addOptions(IteratorScope scope, Map<String,String> properties) {
-    if (properties == null)
-      return;
-    if (!this.properties.containsKey(scope))
-      this.properties.put(scope, new HashMap<String,String>());
-    for (Entry<String,String> entry : properties.entrySet()) {
-      this.properties.get(scope).put(entry.getKey(), entry.getValue());
-    }
+  public void addOptions(Map<String,String> properties) {
+    ArgumentChecker.notNull(properties);
+    addOptions(properties.entrySet());
   }
   
   /**
-   * Delete the properties per-scope
-   * 
-   * @param scope
-   *          the scope to delete
+   * Remove all options from the iterator.
    */
-  public void deleteOptions(IteratorScope scope) {
-    this.properties.remove(scope);
+  public void clearOptions() {
+    properties.clear();
+  }
+  
+  /**
+   * @see java.lang.Object#toString()
+   */
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("name:");
+    sb.append(name);
+    sb.append(", priority:");
+    sb.append(Integer.toString(priority));
+    sb.append(", class:");
+    sb.append(iteratorClass);
+    sb.append(", scopes:");
+    sb.append(scopes);
+    sb.append(", properties:");
+    sb.append(properties);
+    return sb.toString();
+  }
+
+  /**
+   * A convenience class for passing column family and column qualifiers to iterator configuration methods.
+   */
+  public static class Column extends Pair<Text,Text> {
+    
+    public Column(Text columnFamily, Text columnQualifier) {
+      super(columnFamily, columnQualifier);
+    }
+    
+    public Column(Text columnFamily) {
+      super(columnFamily, null);
+    }
+    
+    public Column(String columnFamily, String columnQualifier) {
+      super(new Text(columnFamily), new Text(columnQualifier));
+    }
+    
+    public Column(String columnFamily) {
+      super(new Text(columnFamily), null);
+    }
+    
   }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperations.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperations.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperations.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperations.java Mon Nov 28 19:59:37 2011
@@ -18,6 +18,7 @@ package org.apache.accumulo.core.client.
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -30,6 +31,7 @@ import org.apache.accumulo.core.client.I
 import org.apache.accumulo.core.client.TableExistsException;
 import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.data.Range;
+import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
 import org.apache.accumulo.core.iterators.conf.PerColumnIteratorConfig;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.core.util.BulkImportHelper.AssignmentStats;
@@ -478,21 +480,26 @@ public interface TableOperations {
    *          the name of the table
    * @param name
    *          the name of the iterator
+   * @param scopes
+   *          the scopes of the iterator
    * @throws AccumuloSecurityException
    *           thrown if the user does not have the ability to set properties on the table
    * @throws AccumuloException
    * @throws TableNotFoundException
    *           throw if the table no longer exists
    */
-  public void removeIterator(String tableName, String name) throws AccumuloSecurityException, AccumuloException, TableNotFoundException;
+  public void removeIterator(String tableName, String name, EnumSet<IteratorScope> scopes) throws AccumuloSecurityException, AccumuloException,
+      TableNotFoundException;
   
   /**
-   * Get the settings for an iterator
+   * Get the settings for an iterator.
    * 
    * @param tableName
    *          the name of the table
    * @param name
    *          the name of the iterator
+   * @param scope
+   *          the scope of the iterator
    * @return the settings for this iterator
    * @throws AccumuloSecurityException
    *           thrown if the user does not have the ability to set properties on the table
@@ -500,7 +507,8 @@ public interface TableOperations {
    * @throws TableNotFoundException
    *           throw if the table no longer exists
    */
-  public IteratorSetting getIterator(String tableName, String name) throws AccumuloSecurityException, AccumuloException, TableNotFoundException;
+  public IteratorSetting getIteratorSetting(String tableName, String name, IteratorScope scope) throws AccumuloSecurityException, AccumuloException,
+      TableNotFoundException;
   
   /**
    * Get a list of iterators for this table.
@@ -512,5 +520,5 @@ public interface TableOperations {
    * @throws AccumuloException
    * @throws TableNotFoundException
    */
-  public Set<String> getIterators(String tableName) throws AccumuloSecurityException, AccumuloException, TableNotFoundException;
+  public Set<String> listIterators(String tableName) throws AccumuloSecurityException, AccumuloException, TableNotFoundException;
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsHelper.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsHelper.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsHelper.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsHelper.java Mon Nov 28 19:59:37 2011
@@ -16,7 +16,7 @@
  */
 package org.apache.accumulo.core.client.admin;
 
-import java.util.EnumMap;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -34,25 +34,26 @@ public abstract class TableOperationsHel
   
   @Override
   public void attachIterator(String tableName, IteratorSetting setting) throws AccumuloSecurityException, AccumuloException, TableNotFoundException {
-    removeIterator(tableName, setting.getName());
-    for (Entry<IteratorScope,Map<String,String>> entry : setting.getOptionsByScope().entrySet()) {
-      String root = String.format("%s%s.%s", Property.TABLE_ITERATOR_PREFIX, entry.getKey().name().toLowerCase(), setting.getName());
+    removeIterator(tableName, setting.getName(), setting.getScopes());
+    for (IteratorScope scope : setting.getScopes()) {
+      String root = String.format("%s%s.%s", Property.TABLE_ITERATOR_PREFIX, scope.name().toLowerCase(), setting.getName());
       this.setProperty(tableName, root, setting.getPriority() + "," + setting.getIteratorClass());
-      for (Entry<String,String> prop : entry.getValue().entrySet()) {
+      for (Entry<String,String> prop : setting.getProperties().entrySet()) {
         this.setProperty(tableName, root + ".opt." + prop.getKey(), prop.getValue());
       }
     }
   }
   
   @Override
-  public void removeIterator(String tableName, String name) throws AccumuloSecurityException, AccumuloException, TableNotFoundException {
+  public void removeIterator(String tableName, String name, EnumSet<IteratorScope> scopes) throws AccumuloSecurityException, AccumuloException,
+      TableNotFoundException {
     Map<String,String> copy = new HashMap<String,String>();
     for (Entry<String,String> property : this.getProperties(tableName)) {
       copy.put(property.getKey(), property.getValue());
     }
-    for (Entry<String,String> property : copy.entrySet()) {
-      for (IteratorScope scope : IteratorScope.values()) {
-        String root = String.format("%s%s.%s", Property.TABLE_ITERATOR_PREFIX, scope.name().toLowerCase(), name);
+    for (IteratorScope scope : scopes) {
+      String root = String.format("%s%s.%s", Property.TABLE_ITERATOR_PREFIX, scope.name().toLowerCase(), name);
+      for (Entry<String,String> property : copy.entrySet()) {
         if (property.getKey().equals(root) || property.getKey().startsWith(root + ".opt."))
           this.removeProperty(tableName, property.getKey());
       }
@@ -60,43 +61,34 @@ public abstract class TableOperationsHel
   }
   
   @Override
-  public IteratorSetting getIterator(String tableName, String name) throws AccumuloSecurityException, AccumuloException, TableNotFoundException {
+  public IteratorSetting getIteratorSetting(String tableName, String name, IteratorScope scope) throws AccumuloSecurityException, AccumuloException,
+      TableNotFoundException {
     int priority = -1;
     String classname = null;
-    EnumMap<IteratorScope,Map<String,String>> settings = new EnumMap<IteratorScope,Map<String,String>>(IteratorScope.class);
+    Map<String,String> settings = new HashMap<String,String>();
     
+    String root = String.format("%s%s.%s", Property.TABLE_ITERATOR_PREFIX, scope.name().toLowerCase(), name);
+    String opt = root + ".opt.";
     for (Entry<String,String> property : this.getProperties(tableName)) {
-      for (IteratorScope scope : IteratorScope.values()) {
-        String root = String.format("%s%s.%s", Property.TABLE_ITERATOR_PREFIX, scope.name().toLowerCase(), name);
-        String opt = root + ".opt.";
-        if (property.getKey().equals(root)) {
-          String parts[] = property.getValue().split(",");
-          if (parts.length != 2) {
-            throw new AccumuloException("Bad value for iterator setting: " + property.getValue());
-          }
-          priority = Integer.parseInt(parts[0]);
-          classname = parts[1];
-          if (!settings.containsKey(scope))
-            settings.put(scope, new HashMap<String,String>());
-        } else if (property.getKey().startsWith(opt)) {
-          if (!settings.containsKey(scope))
-            settings.put(scope, new HashMap<String,String>());
-          settings.get(scope).put(property.getKey().substring(opt.length()), property.getValue());
+      if (property.getKey().equals(root)) {
+        String parts[] = property.getValue().split(",");
+        if (parts.length != 2) {
+          throw new AccumuloException("Bad value for iterator setting: " + property.getValue());
         }
+        priority = Integer.parseInt(parts[0]);
+        classname = parts[1];
+      } else if (property.getKey().startsWith(opt)) {
+        settings.put(property.getKey().substring(opt.length()), property.getValue());
       }
     }
-    if (priority < 0 || classname == null) {
+    if (priority <= 0 || classname == null) {
       return null;
     }
-    IteratorSetting result = new IteratorSetting(priority, name, classname);
-    for (Entry<IteratorScope,Map<String,String>> entry : settings.entrySet()) {
-      result.addOptions(entry.getKey(), entry.getValue());
-    }
-    return result;
+    return new IteratorSetting(priority, name, classname, EnumSet.of(scope), settings);
   }
   
   @Override
-  public Set<String> getIterators(String tableName) throws AccumuloSecurityException, AccumuloException, TableNotFoundException {
+  public Set<String> listIterators(String tableName) throws AccumuloSecurityException, AccumuloException, TableNotFoundException {
     Set<String> result = new HashSet<String>();
     Set<String> lifecycles = new HashSet<String>();
     for (IteratorScope scope : IteratorScope.values())

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockBatchScanner.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockBatchScanner.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockBatchScanner.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockBatchScanner.java Mon Nov 28 19:59:37 2011
@@ -49,8 +49,8 @@ public class MockBatchScanner extends Mo
   static class RangesFilter extends Filter {
     List<Range> ranges;
     
-    public RangesFilter(SortedKeyValueIterator<Key,Value> iterator, List<Range> ranges) {
-      super(iterator);
+    RangesFilter(SortedKeyValueIterator<Key,Value> iterator, List<Range> ranges) {
+      setSource(iterator);
       this.ranges = ranges;
     }
     

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockScanner.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockScanner.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockScanner.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/client/mock/MockScanner.java Mon Nov 28 19:59:37 2011
@@ -78,8 +78,8 @@ public class MockScanner extends MockSca
   static class RangeFilter extends Filter {
     Range range;
     
-    public RangeFilter(SortedKeyValueIterator<Key,Value> i, Range range) {
-      super(i);
+    RangeFilter(SortedKeyValueIterator<Key,Value> i, Range range) {
+      setSource(i);
       this.range = range;
     }
     

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Combiner.java Mon Nov 28 19:59:37 2011
@@ -26,14 +26,13 @@ import java.util.Map;
 import java.util.NoSuchElementException;
 
 import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.accumulo.core.client.IteratorSetting.Column;
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.PartialKey;
 import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.conf.ColumnSet;
-import org.apache.accumulo.core.util.Pair;
-import org.apache.hadoop.io.Text;
 import org.apache.log4j.Logger;
 
 /**
@@ -46,7 +45,7 @@ import org.apache.log4j.Logger;
  */
 public abstract class Combiner extends WrappingIterator implements OptionDescriber {
   static final Logger log = Logger.getLogger(Combiner.class);
-  public static final String COLUMNS_OPTION = "columns";
+  protected static final String COLUMNS_OPTION = "columns";
   
   /**
    * A Java Iterator that iterates over the Values for a given Key from a source SortedKeyValueIterator.
@@ -115,8 +114,6 @@ public abstract class Combiner extends W
   Key topKey;
   Value topValue;
   
-  public Combiner() {}
-  
   @Override
   public Key getTopKey() {
     if (topKey == null)
@@ -231,7 +228,7 @@ public abstract class Combiner extends W
         Collections
             .singletonMap(
                 COLUMNS_OPTION,
-        "<col fam>[:<col qual>]{,<col fam>[:<col qual>]} escape non aplhanum chars using %<hex>."),
+        "<col fam>[:<col qual>]{,<col fam>[:<col qual>]} escape non-alphanum chars using %<hex>."),
         null);
   }
   
@@ -253,38 +250,15 @@ public abstract class Combiner extends W
   }
   
   /**
-   * A convenience class for passing column family and column qualifiers
-   */
-  public static class Column extends Pair<Text,Text> {
-    
-    public Column(Text columnFamily, Text columnQualifier) {
-      super(columnFamily, columnQualifier);
-    }
-    
-    public Column(Text columnFamily) {
-      super(columnFamily, null);
-    }
-    
-    public Column(String columnFamily, String columnQualifier) {
-      super(new Text(columnFamily), new Text(columnQualifier));
-    }
-    
-    public Column(String columnFamily) {
-      super(new Text(columnFamily), null);
-    }
-    
-  }
-
-  /**
    * A convenience method to set which columns a combiner should be applied to.
    * 
    * @param is
    *          iterator settings object to configure
    * @param columns
-   *          a list columns to encode as the value for the combiner column configuration
+   *          a list of columns to encode as the value for the combiner column configuration
    */
   
-  public static void setColumns(IteratorSetting is, List<Column> columns) {
+  public static void setColumns(IteratorSetting is, List<IteratorSetting.Column> columns) {
     String sep = "";
     StringBuilder sb = new StringBuilder();
     

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Filter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Filter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Filter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/Filter.java Mon Nov 28 19:59:37 2011
@@ -21,6 +21,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Range;
@@ -50,14 +51,7 @@ public abstract class Filter extends Wra
   }
   
   private static final String NEGATE = "negate";
-  boolean negate;
-  
-  public Filter() {}
-  
-  public Filter(SortedKeyValueIterator<Key,Value> iterator) {
-    setSource(iterator);
-    negate = false;
-  }
+  boolean negate = false;
   
   @Override
   public void next() throws IOException {
@@ -111,4 +105,16 @@ public abstract class Filter extends Wra
     }
     return true;
   }
+  
+  /**
+   * A convenience method for setting the negation option on a filter.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param negate
+   *          if false, filter accepts k/v for which the accept method returns true; if true, filter accepts k/v for which the accept method returns false.
+   */
+  public static void setNegate(IteratorSetting is, boolean negate) {
+    is.addOption(NEGATE, Boolean.toString(negate));
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/LongCombiner.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/LongCombiner.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/LongCombiner.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/LongCombiner.java Mon Nov 28 19:59:37 2011
@@ -23,8 +23,10 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.start.classloader.AccumuloClassLoader;
 import org.apache.hadoop.io.WritableUtils;
 
 /**
@@ -38,7 +40,8 @@ import org.apache.hadoop.io.WritableUtil
  * VARNUM, LONG, and STRING which indicate the VarNumEncoder, LongEncoder, and StringEncoder respectively.
  */
 public abstract class LongCombiner extends TypedValueCombiner<Long> {
-  public static final String TYPE = "type";
+  protected static final String TYPE = "type";
+  protected static final String CLASS_PREFIX = "class:";
   
   public static enum Type {
     VARNUM, LONG, STRING
@@ -47,20 +50,44 @@ public abstract class LongCombiner exten
   @Override
   public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, IteratorEnvironment env) throws IOException {
     super.init(source, options, env);
-    if (options.get(TYPE) == null)
+    setEncoder(options);
+  }
+  
+  private void setEncoder(Map<String,String> options) {
+    String type = options.get(TYPE);
+    if (type == null)
       throw new IllegalArgumentException("no type specified");
-    switch (Type.valueOf(options.get(TYPE))) {
-      case VARNUM:
-        encoder = new VarNumEncoder();
-        return;
-      case LONG:
-        encoder = new LongEncoder();
-        return;
-      case STRING:
-        encoder = new StringEncoder();
-        return;
-      default:
-        throw new IllegalArgumentException();
+    if (type.startsWith(CLASS_PREFIX)) {
+      try {
+        @SuppressWarnings("unchecked")
+        Class<? extends Encoder<Long>> clazz = (Class<? extends Encoder<Long>>) AccumuloClassLoader.loadClass(type.substring(CLASS_PREFIX.length()),
+            Encoder.class);
+        encoder = clazz.newInstance();
+        if (encoder.decode(encoder.encode(42l)) != 42l) {
+          throw new IllegalArgumentException("something wrong with " + type + " -- doesn't encode and decode a Long properly");
+        }
+      } catch (ClassNotFoundException e) {
+        throw new IllegalArgumentException(e);
+      } catch (InstantiationException e) {
+        throw new IllegalArgumentException(e);
+      } catch (IllegalAccessException e) {
+        throw new IllegalArgumentException(e);
+      }
+    }
+    else {
+      switch (Type.valueOf(type)) {
+        case VARNUM:
+          encoder = new VarNumEncoder();
+          return;
+        case LONG:
+          encoder = new LongEncoder();
+          return;
+        case STRING:
+          encoder = new StringEncoder();
+          return;
+        default:
+          throw new IllegalArgumentException();
+      }
     }
   }
   
@@ -76,13 +103,7 @@ public abstract class LongCombiner exten
   @Override
   public boolean validateOptions(Map<String,String> options) {
     super.validateOptions(options);
-    if (options.get(TYPE) == null)
-      return false;
-    try {
-      Type.valueOf(options.get(TYPE));
-    } catch (Exception e) {
-      return false;
-    }
+    setEncoder(options);
     return true;
   }
   
@@ -175,4 +196,40 @@ public abstract class LongCombiner exten
     }
     return a + b;
   }
+  
+  /**
+   * A convenience method for setting the long encoding type.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param type
+   *          LongCombiner.Type specifying the encoding type.
+   */
+  public static void setEncodingType(IteratorSetting is, LongCombiner.Type type) {
+    is.addOption(TYPE, type.toString());
+  }
+  
+  /**
+   * A convenience method for setting the long encoding type.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param encoderClass
+   *          Class<? extends Encoder<Long>> specifying the encoding type.
+   */
+  public static void setEncodingType(IteratorSetting is, Class<? extends Encoder<Long>> encoderClass) {
+    is.addOption(TYPE, CLASS_PREFIX + encoderClass.getName());
+  }
+  
+  /**
+   * A convenience method for setting the long encoding type.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param encoderClassName
+   *          name of a class specifying the encoding type.
+   */
+  public static void setEncodingType(IteratorSetting is, String encoderClassName) {
+    is.addOption(TYPE, CLASS_PREFIX + encoderClassName);
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/ColumnQualifierFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/ColumnQualifierFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/ColumnQualifierFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/ColumnQualifierFilter.java Mon Nov 28 19:59:37 2011
@@ -37,13 +37,13 @@ public class ColumnQualifierFilter exten
   public ColumnQualifierFilter() {}
   
   public ColumnQualifierFilter(SortedKeyValueIterator<Key,Value> iterator, HashSet<Column> columns) {
-    super(iterator);
+    setSource(iterator);
     init(columns);
   }
   
   public ColumnQualifierFilter(SortedKeyValueIterator<Key,Value> iterator, HashSet<ByteSequence> columnFamilies,
       HashMap<ByteSequence,HashSet<ByteSequence>> columnsQualifiers, boolean scanColumns) {
-    super(iterator);
+    setSource(iterator);
     this.columnFamilies = columnFamilies;
     this.columnsQualifiers = columnsQualifiers;
     this.scanColumns = scanColumns;

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/VisibilityFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/VisibilityFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/VisibilityFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/system/VisibilityFilter.java Mon Nov 28 19:59:37 2011
@@ -41,7 +41,7 @@ public class VisibilityFilter extends Fi
   public VisibilityFilter() {}
   
   public VisibilityFilter(SortedKeyValueIterator<Key,Value> iterator, Authorizations authorizations, byte[] defaultVisibility) {
-    super(iterator);
+    setSource(iterator);
     this.ve = new VisibilityEvaluator(authorizations);
     this.defaultVisibility = new Text(defaultVisibility);
     this.cache = new LRUMap(1000);

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/AgeOffFilter.java Mon Nov 28 19:59:37 2011
@@ -19,6 +19,7 @@ package org.apache.accumulo.core.iterato
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.Filter;
@@ -32,6 +33,7 @@ import org.apache.accumulo.core.iterator
  */
 public class AgeOffFilter extends Filter {
   private static final String TTL = "ttl";
+  private static final String CURRENT_TIME = "currentTime";
   private long threshold;
   private long currentTime;
   
@@ -49,8 +51,8 @@ public class AgeOffFilter extends Filter
    * @param threshold
    *          Current time in milliseconds.
    */
-  public AgeOffFilter(SortedKeyValueIterator<Key,Value> iterator, long threshold, long currentTime) {
-    super(iterator);
+  private AgeOffFilter(SortedKeyValueIterator<Key,Value> iterator, long threshold, long currentTime) {
+    setSource(iterator);
     this.threshold = threshold;
     this.currentTime = currentTime;
   }
@@ -80,7 +82,7 @@ public class AgeOffFilter extends Filter
     
     threshold = Long.parseLong(ttl);
     
-    String time = options.get("currentTime");
+    String time = options.get(CURRENT_TIME);
     if (time != null)
       currentTime = Long.parseLong(time);
     else
@@ -98,7 +100,7 @@ public class AgeOffFilter extends Filter
   public IteratorOptions describeOptions() {
     IteratorOptions io = super.describeOptions();
     io.addNamedOption(TTL, "time to live (milliseconds)");
-    io.addNamedOption("currentTime", "if set, use the given value as the absolute time in milliseconds as the current time of day");
+    io.addNamedOption(CURRENT_TIME, "if set, use the given value as the absolute time in milliseconds as the current time of day");
     io.setName("ageoff");
     io.setDescription("AgeOffFilter removes entries with timestamps more than <ttl> milliseconds old");
     return io;
@@ -114,4 +116,28 @@ public class AgeOffFilter extends Filter
     }
     return true;
   }
+  
+  /**
+   * A convenience method for setting the age off threshold.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param ttl
+   *          age off threshold in milliseconds.
+   */
+  public static void setTTL(IteratorSetting is, Long ttl) {
+    is.addOption(TTL, Long.toString(ttl));
+  }
+  
+  /**
+   * A convenience method for setting the current time (from which to measure the age off threshold).
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param currentTime
+   *          time in milliseconds.
+   */
+  public static void setCurrentTime(IteratorSetting is, Long currentTime) {
+    is.addOption(CURRENT_TIME, Long.toString(currentTime));
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/ColumnAgeOffFilter.java Mon Nov 28 19:59:37 2011
@@ -20,13 +20,16 @@ import java.io.IOException;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.Filter;
 import org.apache.accumulo.core.iterators.IteratorEnvironment;
 import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
+import org.apache.accumulo.core.iterators.conf.ColumnSet;
 import org.apache.accumulo.core.iterators.conf.ColumnToClassMapping;
-import org.apache.accumulo.core.iterators.conf.PerColumnIteratorConfig;
+import org.apache.accumulo.core.util.Pair;
+import org.apache.hadoop.io.Text;
 
 /**
  * A filter that ages off key/value pairs based on the Key's column and timestamp. It removes an entry if its timestamp is less than currentTime - threshold.
@@ -36,8 +39,8 @@ public class ColumnAgeOffFilter extends 
   
   public ColumnAgeOffFilter() {}
   
-  public ColumnAgeOffFilter(SortedKeyValueIterator<Key,Value> iterator, TTLSet ttls, long currentTime) {
-    super(iterator);
+  private ColumnAgeOffFilter(SortedKeyValueIterator<Key,Value> iterator, TTLSet ttls, long currentTime) {
+    setSource(iterator);
     this.ttls = ttls;
     this.currentTime = currentTime;
   }
@@ -51,12 +54,12 @@ public class ColumnAgeOffFilter extends 
         String ttl = entry.getValue();
         Long l = Long.parseLong(ttl);
         
-        PerColumnIteratorConfig ac = PerColumnIteratorConfig.decodeColumns(column, ttl);
+        Pair<Text,Text> colPair = ColumnSet.decodeColumns(column);
         
-        if (ac.getColumnQualifier() == null) {
-          addObject(ac.getColumnFamily(), l);
+        if (colPair.getSecond() == null) {
+          addObject(colPair.getFirst(), l);
         } else {
-          addObject(ac.getColumnFamily(), ac.getColumnQualifier(), l);
+          addObject(colPair.getFirst(), colPair.getSecond(), l);
         }
       }
     }
@@ -96,7 +99,7 @@ public class ColumnAgeOffFilter extends 
     IteratorOptions io = super.describeOptions();
     io.setName("colageoff");
     io.setDescription("ColumnAgeOffFilter ages off columns at different rates given a time to live in milliseconds for each column");
-    io.addUnnamedOption("<columnName> <Long>");
+    io.addUnnamedOption("<col fam>[:<col qual>] <Long> (escape non-alphanum chars using %<hex>)");
     return io;
   }
   
@@ -106,4 +109,30 @@ public class ColumnAgeOffFilter extends 
     this.ttls = new TTLSet(options);
     return true;
   }
+  
+  /**
+   * A convenience method for adding or changing an age off threshold for a column.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param column
+   *          column to encode as a parameter name.
+   * @param ttl
+   *          age off threshold in milliseconds.
+   */
+  public static void addTTL(IteratorSetting is, IteratorSetting.Column column, Long ttl) {
+    is.addOption(ColumnSet.encodeColumns(column.getFirst(), column.getSecond()), Long.toString(ttl));
+  }
+
+  /**
+   * A convenience method for removing an age off threshold for a column.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param column
+   *          column to encode as a parameter name.
+   */
+  public static void removeTTL(IteratorSetting is, IteratorSetting.Column column) {
+    is.removeOption(ColumnSet.encodeColumns(column.getFirst(), column.getSecond()));
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/IntersectingIterator.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/IntersectingIterator.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/IntersectingIterator.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/IntersectingIterator.java Mon Nov 28 19:59:37 2011
@@ -115,7 +115,7 @@ public class IntersectingIterator implem
     return new IntersectingIterator(this, env);
   }
   
-  public IntersectingIterator(IntersectingIterator other, IteratorEnvironment env) {
+  private IntersectingIterator(IntersectingIterator other, IteratorEnvironment env) {
     if (other.sources != null) {
       sourcesCount = other.sourcesCount;
       sources = new TermSource[sourcesCount];

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/LargeRowFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/LargeRowFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/LargeRowFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/LargeRowFilter.java Mon Nov 28 19:59:37 2011
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.ArrayByteSequence;
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.data.Key;
@@ -48,7 +49,7 @@ public class LargeRowFilter implements S
   private static final ByteSequence EMPTY = new ArrayByteSequence(new byte[] {});
   
   /* key into hash map, value refers to the row supression limit (maxColumns) */
-  public static final String MAX_COLUMNS = "max_columns";
+  private static final String MAX_COLUMNS = "max_columns";
   
   private SortedKeyValueIterator<Key,Value> source;
   
@@ -275,4 +276,15 @@ public class LargeRowFilter implements S
     return true;
   }
   
+  /**
+   * A convenience method for setting the maximum number of columns to keep.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param maxColumns
+   *          number of columns to keep.
+   */
+  public static void setMaxColumns(IteratorSetting is, int maxColumns) {
+    is.addOption(MAX_COLUMNS, Integer.toString(maxColumns));
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/NoVisFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/NoVisFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/NoVisFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/NoVisFilter.java Mon Nov 28 19:59:37 2011
@@ -19,7 +19,6 @@ package org.apache.accumulo.core.iterato
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.Filter;
-import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.core.security.ColumnVisibility;
 
 /**
@@ -27,12 +26,6 @@ import org.apache.accumulo.core.security
  */
 public class NoVisFilter extends Filter {
   
-  public NoVisFilter() {}
-  
-  public NoVisFilter(SortedKeyValueIterator<Key,Value> iterator) {
-    super(iterator);
-  }
-  
   @Override
   public boolean accept(Key k, Value v) {
     ColumnVisibility vis = new ColumnVisibility(k.getColumnVisibility());

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/RegExFilter.java Mon Nov 28 19:59:37 2011
@@ -37,7 +37,8 @@ public class RegExFilter extends Filter 
   
   @Override
   public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
-    RegExFilter result = new RegExFilter(getSource().deepCopy(env));
+    RegExFilter result = new RegExFilter();
+    result.setSource(getSource().deepCopy(env));
     result.rowMatcher = rowMatcher.pattern().matcher("");
     result.colfMatcher = colfMatcher.pattern().matcher("");
     result.colqMatcher = colqMatcher.pattern().matcher("");
@@ -46,12 +47,6 @@ public class RegExFilter extends Filter 
     return result;
   }
   
-  public RegExFilter() {}
-  
-  public RegExFilter(SortedKeyValueIterator<Key,Value> iterator) {
-    super(iterator);
-  }
-  
   public static final String ROW_REGEX = "rowRegex";
   public static final String COLF_REGEX = "colfRegex";
   public static final String COLQ_REGEX = "colqRegex";

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/SummingArrayCombiner.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/SummingArrayCombiner.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/SummingArrayCombiner.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/SummingArrayCombiner.java Mon Nov 28 19:59:37 2011
@@ -22,23 +22,32 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.IteratorEnvironment;
 import org.apache.accumulo.core.iterators.LongCombiner;
-import org.apache.accumulo.core.iterators.LongCombiner.Type;
 import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.core.iterators.TypedValueCombiner;
+import org.apache.accumulo.start.classloader.AccumuloClassLoader;
 import org.apache.hadoop.io.WritableUtils;
 
 /**
  * A Combiner that interprets Values as arrays of Longs and returns an array of element-wise sums.
  */
 public class SummingArrayCombiner extends TypedValueCombiner<List<Long>> {
+  private static final String TYPE = "type";
+  private static final String CLASS_PREFIX = "class:";
+
+  public static enum Type {
+    VARNUM, LONG, STRING
+  }
+
   @Override
   public List<Long> typedReduce(Key key, Iterator<List<Long>> iter) {
     List<Long> sum = new ArrayList<Long>();
@@ -65,20 +74,44 @@ public class SummingArrayCombiner extend
   @Override
   public void init(SortedKeyValueIterator<Key,Value> source, Map<String,String> options, IteratorEnvironment env) throws IOException {
     super.init(source, options, env);
-    if (options.get(LongCombiner.TYPE) == null)
+    setEncoder(options);
+  }
+  
+  private void setEncoder(Map<String,String> options) {
+    String type = options.get(TYPE);
+    if (type == null)
       throw new IllegalArgumentException("no type specified");
-    switch (Type.valueOf(options.get(LongCombiner.TYPE))) {
-      case VARNUM:
-        encoder = new VarNumArrayEncoder();
-        return;
-      case LONG:
-        encoder = new LongArrayEncoder();
-        return;
-      case STRING:
-        encoder = new StringArrayEncoder();
-        return;
-      default:
-        throw new IllegalArgumentException();
+    if (type.startsWith(CLASS_PREFIX)) {
+      try {
+        @SuppressWarnings("unchecked")
+        Class<? extends Encoder<List<Long>>> clazz = (Class<? extends Encoder<List<Long>>>) AccumuloClassLoader.loadClass(
+            type.substring(CLASS_PREFIX.length()), Encoder.class);
+        encoder = clazz.newInstance();
+        List<Long> testList = encoder.decode(encoder.encode(Arrays.asList(0l, 1l)));
+        if (testList.size() != 3 || testList.get(0) != 0l || testList.get(1) != 1l) {
+          throw new IllegalArgumentException("something wrong with " + type + " -- doesn't encode and decode a List<Long> properly");
+        }
+      } catch (ClassNotFoundException e) {
+        throw new IllegalArgumentException(e);
+      } catch (InstantiationException e) {
+        throw new IllegalArgumentException(e);
+      } catch (IllegalAccessException e) {
+        throw new IllegalArgumentException(e);
+      }
+    } else {
+      switch (Type.valueOf(options.get(TYPE))) {
+        case VARNUM:
+          encoder = new VarNumArrayEncoder();
+          return;
+        case LONG:
+          encoder = new LongArrayEncoder();
+          return;
+        case STRING:
+          encoder = new StringArrayEncoder();
+          return;
+        default:
+          throw new IllegalArgumentException();
+      }
     }
   }
   
@@ -87,20 +120,14 @@ public class SummingArrayCombiner extend
     IteratorOptions io = super.describeOptions();
     io.setName("typedcombiner");
     io.setDescription("TypedValueCombiner can interpret Values as a variety of number encodings (VLong, Long, or String) before combining");
-    io.addNamedOption(LongCombiner.TYPE, "<VARNUM|LONG|STRING>");
+    io.addNamedOption(TYPE, "<VARNUM|LONG|STRING>");
     return io;
   }
   
   @Override
   public boolean validateOptions(Map<String,String> options) {
     super.validateOptions(options);
-    if (options.get(LongCombiner.TYPE) == null)
-      return false;
-    try {
-      Type.valueOf(options.get(LongCombiner.TYPE));
-    } catch (Exception e) {
-      return false;
-    }
+    setEncoder(options);
     return true;
   }
   
@@ -190,4 +217,40 @@ public class SummingArrayCombiner extend
       return la;
     }
   }
+  
+  /**
+   * A convenience method for setting the encoding type.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param type
+   *          SummingArrayCombiner.Type specifying the encoding type.
+   */
+  public static void setEncodingType(IteratorSetting is, Type type) {
+    is.addOption(TYPE, type.toString());
+  }
+  
+  /**
+   * A convenience method for setting the encoding type.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param encoderClass
+   *          Class<? extends Encoder<Long>> specifying the encoding type.
+   */
+  public static void setEncodingType(IteratorSetting is, Class<? extends Encoder<List<Long>>> encoderClass) {
+    is.addOption(TYPE, CLASS_PREFIX + encoderClass.getName());
+  }
+  
+  /**
+   * A convenience method for setting the encoding type.
+   * 
+   * @param is
+   *          IteratorSetting object to configure.
+   * @param encoderClassName
+   *          name of a class specifying the encoding type.
+   */
+  public static void setEncodingType(IteratorSetting is, String encoderClassName) {
+    is.addOption(TYPE, CLASS_PREFIX + encoderClassName);
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/iterators/user/TimestampFilter.java Mon Nov 28 19:59:37 2011
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.Filter;
@@ -40,25 +41,30 @@ public class TimestampFilter extends Fil
   private long end;
   private boolean startInclusive;
   private boolean endInclusive;
+  private boolean hasStart;
+  private boolean hasEnd;
   
   public TimestampFilter() {}
   
-  public TimestampFilter(SortedKeyValueIterator<Key,Value> iterator, long start, boolean startInclusive, long end, boolean endInclusive) {
-    super(iterator);
+  private TimestampFilter(SortedKeyValueIterator<Key,Value> iterator, boolean hasStart, long start, boolean startInclusive, boolean hasEnd, long end,
+      boolean endInclusive) {
+    setSource(iterator);
     this.start = start;
     this.startInclusive = startInclusive;
+    this.hasStart = true;
     this.end = end;
     this.endInclusive = endInclusive;
+    this.hasEnd = true;
   }
   
   @Override
   public boolean accept(Key k, Value v) {
     long ts = k.getTimestamp();
-    if (ts < start || ts > end)
+    if ((hasStart && (ts < start)) || (hasEnd && (ts > end)))
       return false;
-    if (!startInclusive && ts == start)
+    if (hasStart && !startInclusive && ts == start)
       return false;
-    if (!endInclusive && ts == end)
+    if (hasEnd && !endInclusive && ts == end)
       return false;
     return true;
   }
@@ -68,13 +74,25 @@ public class TimestampFilter extends Fil
     super.init(source, options, env);
     
     if (options == null)
-      throw new IllegalArgumentException("ttl must be set for AgeOffFilter");
+      throw new IllegalArgumentException("start and/or end must be set for " + TimestampFilter.class.getName());
     
+    hasStart = false;
+    hasEnd = false;
     startInclusive = true;
     endInclusive = true;
+    
+    if (options.containsKey(START))
+      hasStart = true;
+    if (options.containsKey(END))
+      hasEnd = true;
+    if (!hasStart && !hasEnd)
+      throw new IllegalArgumentException("must have either start or end for " + TimestampFilter.class.getName());
+
     try {
-      start = dateParser.parse(options.get(START)).getTime();
-      end = dateParser.parse(options.get(END)).getTime();
+      if (hasStart)
+        start = dateParser.parse(options.get(START)).getTime();
+      if (hasEnd)
+        end = dateParser.parse(options.get(END)).getTime();
     } catch (Exception e) {
       throw new IllegalArgumentException(e);
     }
@@ -86,7 +104,7 @@ public class TimestampFilter extends Fil
   
   @Override
   public SortedKeyValueIterator<Key,Value> deepCopy(IteratorEnvironment env) {
-    return new TimestampFilter(getSource(), start, startInclusive, end, endInclusive);
+    return new TimestampFilter(getSource(), hasStart, start, startInclusive, hasEnd, end, endInclusive);
   }
   
   @Override
@@ -105,8 +123,10 @@ public class TimestampFilter extends Fil
   public boolean validateOptions(Map<String,String> options) {
     super.validateOptions(options);
     try {
-      dateParser.parse(options.get(START));
-      dateParser.parse(options.get(END));
+      if (options.containsKey(START))
+        dateParser.parse(options.get(START));
+      if (options.containsKey(END))
+        dateParser.parse(options.get(END));
       if (options.get(START_INCL) != null)
         Boolean.parseBoolean(options.get(START_INCL));
       if (options.get(END_INCL) != null)
@@ -116,4 +136,67 @@ public class TimestampFilter extends Fil
     }
     return true;
   }
+  
+  /**
+   * A convenience method for setting the range of timestamps accepted by the timestamp filter.
+   * 
+   * @param is
+   *          the iterator setting object to configure
+   * @param start
+   *          the start timestamp, inclusive (yyyyMMddHHmmssz)
+   * @param end
+   *          the end timestamp, inclusive (yyyyMMddHHmmssz)
+   */
+  public static void setRange(IteratorSetting is, String start, String end) {
+    setRange(is, start, true, end, true);
+  }
+  
+  /**
+   * A convenience method for setting the range of timestamps accepted by the timestamp filter.
+   * 
+   * @param is
+   *          the iterator setting object to configure
+   * @param start
+   *          the start timestamp (yyyyMMddHHmmssz)
+   * @param startInclusive
+   *          boolean indicating whether the start is inclusive
+   * @param end
+   *          the end timestamp (yyyyMMddHHmmssz)
+   * @param endInclusive
+   *          boolean indicating whether the end is inclusive
+   */
+  public static void setRange(IteratorSetting is, String start, boolean startInclusive, String end, boolean endInclusive) {
+    setStart(is, start, startInclusive);
+    setEnd(is, end, endInclusive);
+  }
+  
+  /**
+   * A convenience method for setting the start timestamp accepted by the timestamp filter.
+   * 
+   * @param is
+   *          the iterator setting object to configure
+   * @param start
+   *          the start timestamp (yyyyMMddHHmmssz)
+   * @param startInclusive
+   *          boolean indicating whether the start is inclusive
+   */
+  public static void setStart(IteratorSetting is, String start, boolean startInclusive) {
+    is.addOption(START, start);
+    is.addOption(START_INCL, Boolean.toString(startInclusive));
+  }
+  
+  /**
+   * A convenience method for setting the end timestamp accepted by the timestamp filter.
+   * 
+   * @param is
+   *          the iterator setting object to configure
+   * @param end
+   *          the end timestamp (yyyyMMddHHmmssz)
+   * @param endInclusive
+   *          boolean indicating whether the end is inclusive
+   */
+  public static void setEnd(IteratorSetting is, String end, boolean endInclusive) {
+    is.addOption(END, end);
+    is.addOption(END_INCL, Boolean.toString(endInclusive));
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/ArgumentChecker.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/ArgumentChecker.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/ArgumentChecker.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/ArgumentChecker.java Mon Nov 28 19:59:37 2011
@@ -55,4 +55,9 @@ public class ArgumentChecker {
       if (args[i] == null)
         throw new IllegalArgumentException(NULL_ARG_MSG + ":arg" + i + " is null");
   }
+  
+  public static final void strictlyPositive(final int i) {
+    if (i <= 0)
+      throw new IllegalArgumentException("integer should be > 0, was " + i);
+  }
 }

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteIterCommand.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteIterCommand.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteIterCommand.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/DeleteIterCommand.java Mon Nov 28 19:59:37 2011
@@ -16,9 +16,10 @@
  */
 package org.apache.accumulo.core.util.shell.commands;
 
+import java.util.EnumSet;
+
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
-import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
 import org.apache.accumulo.core.util.shell.Shell;
@@ -45,29 +46,19 @@ public class DeleteIterCommand extends C
     }
     
     String name = cl.getOptionValue(nameOpt.getOpt());
-    if (!shellState.getConnector().tableOperations().getIterators(tableName).contains(name)) {
+    if (!shellState.getConnector().tableOperations().listIterators(tableName).contains(name)) {
       Shell.log.warn("no iterators found that match your criteria");
       return 0;
     }
-    IteratorSetting iterator = shellState.getConnector().tableOperations().getIterator(tableName, name);
-    if (iterator == null)
-      return 0;
-    boolean deleteAll = true;
-    if (cl.hasOption(mincScopeOpt.getOpt())) {
-      iterator.deleteOptions(IteratorScope.minc);
-      deleteAll = false;
-    }
-    if (cl.hasOption(majcScopeOpt.getOpt())) {
-      iterator.deleteOptions(IteratorScope.majc);
-      deleteAll = false;
-    }
-    if (cl.hasOption(scanScopeOpt.getOpt())) {
-      iterator.deleteOptions(IteratorScope.scan);
-      deleteAll = false;
-    }
-    shellState.getConnector().tableOperations().removeIterator(tableName, name);
-    if (!iterator.getProperties().isEmpty() && !deleteAll)
-      shellState.getConnector().tableOperations().attachIterator(tableName, iterator);
+    
+    EnumSet<IteratorScope> scopes = EnumSet.noneOf(IteratorScope.class);
+    if (cl.hasOption(mincScopeOpt.getOpt()))
+      scopes.add(IteratorScope.minc);
+    if (cl.hasOption(majcScopeOpt.getOpt()))
+      scopes.add(IteratorScope.majc);
+    if (cl.hasOption(scanScopeOpt.getOpt()))
+      scopes.add(IteratorScope.scan);
+    shellState.getConnector().tableOperations().removeIterator(tableName, name, scopes);
     return 0;
   }
   

Modified: incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/SetIterCommand.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/SetIterCommand.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/SetIterCommand.java (original)
+++ incubator/accumulo/trunk/src/core/src/main/java/org/apache/accumulo/core/util/shell/commands/SetIterCommand.java Mon Nov 28 19:59:37 2011
@@ -17,6 +17,7 @@
 package org.apache.accumulo.core.util.shell.commands;
 
 import java.io.IOException;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -102,21 +103,23 @@ public class SetIterCommand extends Comm
   
   protected void setTableProperties(CommandLine cl, Shell shellState, String tableName, int priority, Map<String,String> options, String classname, String name)
       throws AccumuloException, AccumuloSecurityException, ShellCommandException, TableNotFoundException {
-    IteratorSetting setting = new IteratorSetting(priority, name, classname);
     // remove empty values
     for (Iterator<Entry<String,String>> i = options.entrySet().iterator(); i.hasNext();) {
       Entry<String,String> entry = i.next();
       if (entry.getValue() == null || entry.getValue().isEmpty())
         i.remove();
     }
+    EnumSet<IteratorScope> scopes = EnumSet.noneOf(IteratorScope.class);
     if (cl.hasOption(mincScopeOpt.getOpt()))
-      setting.addOptions(IteratorScope.minc, options);
+      scopes.add(IteratorScope.minc);
     if (cl.hasOption(majcScopeOpt.getOpt()))
-      setting.addOptions(IteratorScope.majc, options);
+      scopes.add(IteratorScope.majc);
     if (cl.hasOption(scanScopeOpt.getOpt()))
-      setting.addOptions(IteratorScope.scan, options);
-    if (setting.getProperties().isEmpty())
+      scopes.add(IteratorScope.scan);
+    if (scopes.isEmpty())
       throw new IllegalArgumentException("You must select at least one scope to configure");
+    
+    IteratorSetting setting = new IteratorSetting(priority, name, classname, scopes, options);
     shellState.getConnector().tableOperations().attachIterator(tableName, setting);
   }
   

Modified: incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/admin/TableOperationsHelperTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/admin/TableOperationsHelperTest.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/admin/TableOperationsHelperTest.java (original)
+++ incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/admin/TableOperationsHelperTest.java Mon Nov 28 19:59:37 2011
@@ -19,6 +19,7 @@ package org.apache.accumulo.core.client.
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -198,36 +199,47 @@ public class TableOperationsHelperTest {
   public void testAttachIterator() throws Exception {
     Tester t = new Tester();
     Map<String,String> empty = Collections.emptyMap();
-    t.attachIterator("table", new IteratorSetting(10, "someName", "foo.bar", IteratorScope.scan, empty));
+    t.attachIterator("table", new IteratorSetting(10, "someName", "foo.bar", EnumSet.of(IteratorScope.scan), empty));
     t.check("table", new String[] {"table.iterator.scan.someName=10,foo.bar",});
-    t.removeIterator("table", "someName");
+    t.removeIterator("table", "someName", EnumSet.of(IteratorScope.scan));
     t.check("table", new String[] {});
+
     IteratorSetting setting = new IteratorSetting(10, "someName", "foo.bar");
-    setting.addOptions(IteratorScope.majc, Collections.singletonMap("key", "value"));
-    setting.addOptions(IteratorScope.scan, empty);
+    setting.setScopes(EnumSet.of(IteratorScope.majc));
+    setting.addOptions(Collections.singletonMap("key", "value"));
+    t.attachIterator("table", setting);
+    setting = new IteratorSetting(10, "someName", "foo.bar");
     t.attachIterator("table", setting);
     t.check("table", new String[] {"table.iterator.majc.someName=10,foo.bar", "table.iterator.majc.someName.opt.key=value",
         "table.iterator.scan.someName=10,foo.bar",});
+
+    setting = new IteratorSetting(20, "otherName", "some.classname");
+    setting.setScopes(EnumSet.of(IteratorScope.majc));
+    setting.addOptions(Collections.singletonMap("key", "value"));
+    t.attachIterator("table", setting);
     setting = new IteratorSetting(20, "otherName", "some.classname");
-    setting.addOptions(IteratorScope.majc, Collections.singletonMap("key", "value"));
-    setting.addOptions(IteratorScope.scan, empty);
     t.attachIterator("table", setting);
-    Set<String> two = t.getIterators("table");
+    Set<String> two = t.listIterators("table");
     Assert.assertEquals(2, two.size());
     Assert.assertTrue(two.contains("otherName"));
     Assert.assertTrue(two.contains("someName"));
-    t.removeIterator("table", "someName");
+    t.removeIterator("table", "someName", EnumSet.allOf(IteratorScope.class));
     t.check("table", new String[] {"table.iterator.majc.otherName=20,some.classname", "table.iterator.majc.otherName.opt.key=value",
         "table.iterator.scan.otherName=20,some.classname",});
-    setting = t.getIterator("table", "otherName");
+
+    setting = t.getIteratorSetting("table", "otherName", IteratorScope.scan);
+    Assert.assertEquals(20, setting.getPriority());
+    Assert.assertEquals("some.classname", setting.getIteratorClass());
+    Assert.assertFalse(setting.hasProperties());
+    setting = t.getIteratorSetting("table", "otherName", IteratorScope.majc);
     Assert.assertEquals(20, setting.getPriority());
     Assert.assertEquals("some.classname", setting.getIteratorClass());
-    Assert.assertEquals(0, setting.getOptionsByScope().get(IteratorScope.scan).size());
-    Assert.assertEquals(Collections.singletonMap("key", "value"), setting.getOptionsByScope().get(IteratorScope.majc));
-    setting.addOptions(IteratorScope.minc, Collections.singletonMap("a", "b"));
-    t.attachIterator("foo", setting);
-    t.check("foo", new String[] {"table.iterator.majc.otherName=20,some.classname", "table.iterator.majc.otherName.opt.key=value",
-        "table.iterator.minc.otherName=20,some.classname", "table.iterator.minc.otherName.opt.a=b", "table.iterator.scan.otherName=20,some.classname",});
+    Assert.assertTrue(setting.hasProperties());
+    Assert.assertEquals(Collections.singletonMap("key", "value"), setting.getProperties());
+    setting.setScopes(EnumSet.of(IteratorScope.minc));
+    t.attachIterator("table", setting);
+    t.check("table", new String[] {"table.iterator.majc.otherName=20,some.classname", "table.iterator.majc.otherName.opt.key=value",
+        "table.iterator.minc.otherName=20,some.classname", "table.iterator.minc.otherName.opt.key=value", "table.iterator.scan.otherName=20,some.classname",});
   }
   
 }

Modified: incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/mock/MockConnectorTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/mock/MockConnectorTest.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/mock/MockConnectorTest.java (original)
+++ incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/client/mock/MockConnectorTest.java Mon Nov 28 19:59:37 2011
@@ -38,7 +38,6 @@ import org.apache.accumulo.core.data.Mut
 import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.iterators.Combiner;
-import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.core.iterators.user.SummingCombiner;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
@@ -93,10 +92,9 @@ public class MockConnectorTest {
     Connector c = mockInstance.getConnector("root", new byte[] {});
     String table = "perDayCounts";
     c.tableOperations().create(table);
-    Class<? extends SortedKeyValueIterator<Key,Value>> clazz = SummingCombiner.class;
-    IteratorSetting is = new IteratorSetting(10, "String Summation", clazz);
-    Combiner.setColumns(is, Collections.singletonList(new Combiner.Column("day")));
-    is.addOption(SummingCombiner.TYPE, SummingCombiner.Type.STRING.name());
+    IteratorSetting is = new IteratorSetting(10, "String Summation", SummingCombiner.class);
+    Combiner.setColumns(is, Collections.singletonList(new IteratorSetting.Column("day")));
+    SummingCombiner.setEncodingType(is, SummingCombiner.Type.STRING);
     c.tableOperations().attachIterator(table, is);
     String keys[][] = { {"foo", "day", "20080101"}, {"foo", "day", "20080101"}, {"foo", "day", "20080103"}, {"bar", "day", "20080101"},
         {"bar", "day", "20080101"},};

Modified: incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/FamilyIntersectingIteratorTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/FamilyIntersectingIteratorTest.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/FamilyIntersectingIteratorTest.java (original)
+++ incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/FamilyIntersectingIteratorTest.java Mon Nov 28 19:59:37 2011
@@ -22,9 +22,9 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Random;
 import java.util.TreeMap;
-import java.util.Map.Entry;
 
 import junit.framework.TestCase;
 
@@ -34,9 +34,6 @@ import org.apache.accumulo.core.data.Ran
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.file.rfile.RFileTest;
 import org.apache.accumulo.core.file.rfile.RFileTest.TestRFile;
-import org.apache.accumulo.core.iterators.FamilyIntersectingIterator;
-import org.apache.accumulo.core.iterators.IteratorEnvironment;
-import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
 import org.apache.accumulo.core.iterators.system.MultiIterator;
 import org.apache.accumulo.core.iterators.user.IntersectingIterator;
 import org.apache.hadoop.io.Text;
@@ -158,8 +155,8 @@ public class FamilyIntersectingIteratorT
     Logger.getRootLogger().setLevel(Level.ERROR);
   }
   
-  private static final int NUM_ROWS = 10;
-  private static final int NUM_DOCIDS = 1000;
+  private static final int NUM_ROWS = 5;
+  private static final int NUM_DOCIDS = 200;
   
   public void test1() throws IOException {
     columnFamilies = new Text[2];

Modified: incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/RowDeletingIteratorTest.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/RowDeletingIteratorTest.java?rev=1207551&r1=1207550&r2=1207551&view=diff
==============================================================================
--- incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/RowDeletingIteratorTest.java (original)
+++ incubator/accumulo/trunk/src/core/src/test/java/org/apache/accumulo/core/iterators/RowDeletingIteratorTest.java Mon Nov 28 19:59:37 2011
@@ -21,30 +21,26 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.TreeMap;
 
+import junit.framework.TestCase;
+
 import org.apache.accumulo.core.conf.AccumuloConfiguration;
 import org.apache.accumulo.core.data.ArrayByteSequence;
 import org.apache.accumulo.core.data.ByteSequence;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.iterators.IteratorEnvironment;
-import org.apache.accumulo.core.iterators.RowDeletingIterator;
-import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
-import org.apache.accumulo.core.iterators.SortedMapIterator;
 import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
 import org.apache.accumulo.core.iterators.system.ColumnFamilySkippingIterator;
 import org.apache.hadoop.io.Text;
 
-import junit.framework.TestCase;
-
 public class RowDeletingIteratorTest extends TestCase {
   
-  static class TestIE implements IteratorEnvironment {
+  public static class TestIE implements IteratorEnvironment {
     
     private IteratorScope scope;
     private boolean fmc;
     
-    TestIE(IteratorScope scope, boolean fmc) {
+    public TestIE(IteratorScope scope, boolean fmc) {
       this.scope = scope;
       this.fmc = fmc;
     }