You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by ab...@apache.org on 2015/03/16 22:01:57 UTC
sqoop git commit: SQOOP-2214: Sqoop2: Add ability to easily iterate
over entries stored in Context
Repository: sqoop
Updated Branches:
refs/heads/sqoop2 4fb5d6a92 -> 118007106
SQOOP-2214: Sqoop2: Add ability to easily iterate over entries stored in Context
(Jarek Jarcec Cecho via Abraham Elmahrek)
Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/11800710
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/11800710
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/11800710
Branch: refs/heads/sqoop2
Commit: 118007106a629916c884d74178dd2b8a06c37c3b
Parents: 4fb5d6a
Author: Abraham Elmahrek <ab...@apache.org>
Authored: Mon Mar 16 13:13:38 2015 -0700
Committer: Abraham Elmahrek <ab...@apache.org>
Committed: Mon Mar 16 13:13:38 2015 -0700
----------------------------------------------------------------------
.../apache/sqoop/common/ImmutableContext.java | 4 +-
.../org/apache/sqoop/common/MapContext.java | 6 +
.../org/apache/sqoop/common/PrefixContext.java | 23 ++++
.../org/apache/sqoop/common/TestMapContext.java | 29 +++++
.../apache/sqoop/common/TestPrefixContext.java | 113 +++++++++++++++++++
5 files changed, 174 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/sqoop/blob/11800710/common/src/main/java/org/apache/sqoop/common/ImmutableContext.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/common/ImmutableContext.java b/common/src/main/java/org/apache/sqoop/common/ImmutableContext.java
index 7eed27f..2245ba9 100644
--- a/common/src/main/java/org/apache/sqoop/common/ImmutableContext.java
+++ b/common/src/main/java/org/apache/sqoop/common/ImmutableContext.java
@@ -20,6 +20,8 @@ package org.apache.sqoop.common;
import org.apache.sqoop.classification.InterfaceAudience;
import org.apache.sqoop.classification.InterfaceStability;
+import java.util.Map;
+
/**
* Immutable context interface for key value pairs.
*
@@ -27,7 +29,7 @@ import org.apache.sqoop.classification.InterfaceStability;
*/
@InterfaceAudience.Public
@InterfaceStability.Unstable
-public interface ImmutableContext {
+public interface ImmutableContext extends Iterable<Map.Entry<String,String>> {
/**
* Return string for given key or null by default.
http://git-wip-us.apache.org/repos/asf/sqoop/blob/11800710/common/src/main/java/org/apache/sqoop/common/MapContext.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/common/MapContext.java b/common/src/main/java/org/apache/sqoop/common/MapContext.java
index d23ff1a..abf5634 100644
--- a/common/src/main/java/org/apache/sqoop/common/MapContext.java
+++ b/common/src/main/java/org/apache/sqoop/common/MapContext.java
@@ -21,6 +21,7 @@ import org.apache.sqoop.classification.InterfaceAudience;
import org.apache.sqoop.classification.InterfaceStability;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -138,4 +139,9 @@ public class MapContext implements ImmutableContext {
}
return result;
}
+
+ @Override
+ public Iterator<Map.Entry<String, String>> iterator() {
+ return options.entrySet().iterator();
+ }
}
http://git-wip-us.apache.org/repos/asf/sqoop/blob/11800710/common/src/main/java/org/apache/sqoop/common/PrefixContext.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/sqoop/common/PrefixContext.java b/common/src/main/java/org/apache/sqoop/common/PrefixContext.java
index 8d33861..c78616d 100644
--- a/common/src/main/java/org/apache/sqoop/common/PrefixContext.java
+++ b/common/src/main/java/org/apache/sqoop/common/PrefixContext.java
@@ -22,6 +22,10 @@ import org.apache.sqoop.classification.InterfaceStability;
import org.apache.hadoop.conf.Configuration;
import org.apache.sqoop.common.ImmutableContext;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
/**
* Implementation of immutable context that is based on Hadoop configuration
* object. Each context property is prefixed with special prefix and loaded
@@ -71,4 +75,23 @@ public class PrefixContext implements ImmutableContext {
public Configuration getConfiguration() {
return configuration;
}
+
+ /*
+ * There is no good way to get iterator from the underlying Configuration object that would
+ * filter only the prefixed properties, so we create new Context/Map that contains only the
+ * relevant properties.
+ */
+ @Override
+ public Iterator<Map.Entry<String, String>> iterator() {
+ Map<String, String> intermediateMap = new HashMap<String, String>();
+ for(Map.Entry<String, String> entry : configuration) {
+ String key = entry.getKey();
+
+ if(key.startsWith(prefix)) {
+ intermediateMap.put(key.replaceFirst(prefix, ""), entry.getValue());
+ }
+ }
+
+ return intermediateMap.entrySet().iterator();
+ }
}
http://git-wip-us.apache.org/repos/asf/sqoop/blob/11800710/common/src/test/java/org/apache/sqoop/common/TestMapContext.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/common/TestMapContext.java b/common/src/test/java/org/apache/sqoop/common/TestMapContext.java
index f9ed37b..0bd6a3b 100644
--- a/common/src/test/java/org/apache/sqoop/common/TestMapContext.java
+++ b/common/src/test/java/org/apache/sqoop/common/TestMapContext.java
@@ -23,6 +23,9 @@ import java.util.Map;
import org.testng.Assert;
import org.testng.annotations.Test;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
/**
* Test class for org.apache.sqoop.common.MapContext
*/
@@ -106,4 +109,30 @@ public class TestMapContext {
Assert.assertFalse(result.containsKey("testsqoop1"));
Assert.assertFalse(result.containsKey("testsqoop2"));
}
+
+ /**
+ * Test iteration
+ */
+ @Test
+ public void testIterator() {
+ Map<String, String> options = new HashMap<String, String>();
+ options.put("sqooptest1", "value");
+ options.put("sqooptest2", "value");
+
+ MapContext mc = new MapContext(options);
+ boolean seenSqooptest1 = false;
+ boolean seenSqooptest2 = false;
+ for(Map.Entry<String, String> entry : mc) {
+ if("sqooptest1".equals(entry.getKey()) && "value".equals(entry.getValue())) {
+ seenSqooptest1 = true;
+ } else if("sqooptest2".equals(entry.getKey()) && "value".equals(entry.getValue())) {
+ seenSqooptest2 = true;
+ } else {
+ fail("Found unexpected property: " + entry.getKey() + " with value " + entry.getValue());
+ }
+ }
+
+ assertTrue(seenSqooptest1);
+ assertTrue(seenSqooptest2);
+ }
}
http://git-wip-us.apache.org/repos/asf/sqoop/blob/11800710/common/src/test/java/org/apache/sqoop/common/TestPrefixContext.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/sqoop/common/TestPrefixContext.java b/common/src/test/java/org/apache/sqoop/common/TestPrefixContext.java
new file mode 100644
index 0000000..b4a4b00
--- /dev/null
+++ b/common/src/test/java/org/apache/sqoop/common/TestPrefixContext.java
@@ -0,0 +1,113 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sqoop.common;
+
+import org.apache.hadoop.conf.Configuration;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+public class TestPrefixContext {
+
+ @Test
+ public void testBlankPrefix() {
+ Configuration configuration = new Configuration();
+ configuration.set("testkey", "testvalue");
+
+ PrefixContext context = new PrefixContext(configuration, "");
+ assertEquals("testvalue", context.getString("testkey"));
+ }
+
+ @Test
+ public void testNonBlankPrefix() {
+ Configuration configuration = new Configuration();
+ configuration.set("prefix.testkey", "testvalue");
+
+ PrefixContext context = new PrefixContext(configuration, "prefix.");
+ assertEquals("testvalue", context.getString("testkey"));
+ }
+
+ @Test
+ public void testGetString() {
+ Configuration configuration = new Configuration();
+ configuration.set("p.testkey", "testvalue");
+
+ PrefixContext context = new PrefixContext(configuration, "p.");
+ assertEquals("testvalue", context.getString("testkey"));
+ assertEquals("testvalue", context.getString("testkey", "defaultValue"));
+ assertEquals("defaultValue", context.getString("wrongKey", "defaultValue"));
+ }
+
+ @Test
+ public void testGetBoolean() {
+ Configuration configuration = new Configuration();
+ configuration.set("p.testkey", "true");
+
+ PrefixContext context = new PrefixContext(configuration, "p.");
+ assertEquals(true, context.getBoolean("testkey", false));
+ assertEquals(false, context.getBoolean("wrongKey", false));
+ }
+
+ @Test
+ public void testGetInt() {
+ Configuration configuration = new Configuration();
+ configuration.set("p.testkey", "123");
+
+ PrefixContext context = new PrefixContext(configuration, "p.");
+ assertEquals(123, context.getInt("testkey", 456));
+ assertEquals(456, context.getInt("wrongKey", 456));
+ }
+
+ @Test
+ public void testGetLong() {
+ Configuration configuration = new Configuration();
+ configuration.set("p.testkey", "123");
+
+ PrefixContext context = new PrefixContext(configuration, "p.");
+ assertEquals(123l, context.getLong("testkey", 456l));
+ assertEquals(456l, context.getLong("wrongKey", 456l));
+ }
+
+ @Test
+ public void testIterator() {
+ Configuration configuration = new Configuration();
+ configuration.set("p.sqooptest1", "value");
+ configuration.set("p.sqooptest2", "value");
+
+ PrefixContext context = new PrefixContext(configuration, "p.");
+ boolean seenSqooptest1 = false;
+ boolean seenSqooptest2 = false;
+ for(Map.Entry<String, String> entry : context) {
+ if("sqooptest1".equals(entry.getKey()) && "value".equals(entry.getValue())) {
+ seenSqooptest1 = true;
+ } else if("sqooptest2".equals(entry.getKey()) && "value".equals(entry.getValue())) {
+ seenSqooptest2 = true;
+ } else {
+ fail("Found unexpected property: " + entry.getKey() + " with value " + entry.getValue());
+ }
+ }
+
+ assertTrue(seenSqooptest1);
+ assertTrue(seenSqooptest2);
+ }
+}