SQOOP-386. Namespace migration cleanup.
authorArvind Prabhakar <arvind@apache.org>
Wed, 2 Nov 2011 07:48:56 +0000 (07:48 +0000)
committerArvind Prabhakar <arvind@apache.org>
Wed, 2 Nov 2011 07:48:56 +0000 (07:48 +0000)
(Bilung Lee via Arvind Prabhakar)

git-svn-id: https://svn.apache.org/repos/asf/incubator/sqoop/trunk@1196486 13f79535-47bb-0310-9956-ffa450edef68

181 files changed:
NOTICE.txt
src/docs/dev/SqoopDevGuide.txt
src/docs/dev/api-reference.txt
src/docs/dev/compiling.txt
src/docs/dev/intro.txt
src/docs/dev/preface.txt
src/docs/man/codegen-args.txt
src/docs/man/common-args.txt
src/docs/man/hbase-args.txt
src/docs/man/hive-args.txt
src/docs/man/import-args.txt
src/docs/man/input-args.txt
src/docs/man/output-args.txt
src/docs/sip/INDEX.txt
src/docs/sip/README.txt
src/docs/sip/sip-1.txt
src/docs/sip/sip-2.txt
src/docs/sip/sip-3.txt
src/docs/sip/sip-4.txt
src/docs/sip/sip-6.txt
src/docs/user/SqoopUserGuide.txt
src/docs/user/basics.txt
src/docs/user/codegen-args.txt
src/docs/user/codegen-purpose.txt
src/docs/user/codegen.txt
src/docs/user/common-args.txt
src/docs/user/compatibility.txt
src/docs/user/connecting.txt
src/docs/user/controlling-input-format.txt
src/docs/user/controlling-output-format.txt
src/docs/user/create-hive-table-purpose.txt
src/docs/user/create-hive-table.txt
src/docs/user/eval-purpose.txt
src/docs/user/eval.txt
src/docs/user/export-purpose.txt
src/docs/user/export.txt
src/docs/user/hbase-args.txt
src/docs/user/hbase.txt
src/docs/user/help.txt
src/docs/user/hive-args.txt
src/docs/user/hive-notes.txt
src/docs/user/hive.txt
src/docs/user/import-all-tables-purpose.txt
src/docs/user/import-all-tables.txt
src/docs/user/import-purpose.txt
src/docs/user/import.txt
src/docs/user/input-args.txt
src/docs/user/input-formatting-args.txt
src/docs/user/input-formatting.txt
src/docs/user/intro.txt
src/docs/user/job-purpose.txt
src/docs/user/list-databases.txt
src/docs/user/list-tables.txt
src/docs/user/merge-purpose.txt
src/docs/user/metastore-purpose.txt
src/docs/user/output-args.txt
src/docs/user/output-formatting-args.txt
src/docs/user/output-formatting.txt
src/docs/user/preface.txt
src/docs/user/saved-jobs.txt
src/docs/user/support.txt
src/docs/user/tools.txt
src/docs/user/troubleshooting.txt
src/docs/user/version.txt
src/docs/web/breadcrumbs.xsl
src/docs/web/docbook.css
src/docs/web/footer.xsl
src/docs/web/header.xsl
src/docs/web/html.xsl
src/docs/web/index.txt
src/java/com/cloudera/sqoop/ConnFactory.java
src/java/com/cloudera/sqoop/Sqoop.java
src/java/com/cloudera/sqoop/SqoopOptions.java
src/java/com/cloudera/sqoop/cli/RelatedOptions.java
src/java/com/cloudera/sqoop/hbase/ToStringPutTransformer.java
src/java/com/cloudera/sqoop/io/LobFile.java
src/java/com/cloudera/sqoop/manager/PostgresqlManager.java
src/java/com/cloudera/sqoop/mapreduce/DataDrivenImportJob.java
src/java/com/cloudera/sqoop/mapreduce/DelegatingOutputFormat.java
src/java/com/cloudera/sqoop/mapreduce/ExportBatchOutputFormat.java
src/java/com/cloudera/sqoop/mapreduce/db/DBOutputFormat.java
src/java/com/cloudera/sqoop/mapreduce/db/DataDrivenDBInputFormat.java
src/java/com/cloudera/sqoop/tool/CodeGenTool.java
src/java/com/cloudera/sqoop/tool/SqoopTool.java
src/java/com/cloudera/sqoop/util/TaskId.java
src/java/org/apache/sqoop/ConnFactory.java [new file with mode: 0644]
src/java/org/apache/sqoop/Sqoop.java [new file with mode: 0644]
src/java/org/apache/sqoop/SqoopOptions.java [new file with mode: 0644]
src/java/org/apache/sqoop/lib/ClobRef.java
src/java/org/apache/sqoop/lib/DelimiterSet.java
src/java/org/apache/sqoop/manager/PostgresqlManager.java
src/java/org/apache/sqoop/mapreduce/AvroExportMapper.java
src/java/org/apache/sqoop/mapreduce/MySQLDumpInputFormat.java
src/java/org/apache/sqoop/mapreduce/RawKeyTextOutputFormat.java
src/java/org/apache/sqoop/mapreduce/db/DBConfiguration.java
src/java/org/apache/sqoop/mapreduce/db/FloatSplitter.java
src/java/org/apache/sqoop/mapreduce/db/IntegerSplitter.java
src/java/org/apache/sqoop/mapreduce/db/TextSplitter.java
src/java/org/apache/sqoop/metastore/hsqldb/AutoHsqldbStorage.java
src/perftest/ExportStressTest.java
src/perftest/ExtConnFactoryTest.java
src/perftest/ExtFactory.java
src/perftest/LobFilePerfTest.java
src/perftest/LobFileStressTest.java
src/test/com/cloudera/sqoop/AllTests.java
src/test/com/cloudera/sqoop/SmokeTests.java
src/test/com/cloudera/sqoop/TestAllTables.java
src/test/com/cloudera/sqoop/TestAppendUtils.java
src/test/com/cloudera/sqoop/TestAvroExport.java
src/test/com/cloudera/sqoop/TestAvroImport.java
src/test/com/cloudera/sqoop/TestAvroImportExportRoundtrip.java
src/test/com/cloudera/sqoop/TestBoundaryQuery.java
src/test/com/cloudera/sqoop/TestColumnTypes.java
src/test/com/cloudera/sqoop/TestCompression.java
src/test/com/cloudera/sqoop/TestConnFactory.java
src/test/com/cloudera/sqoop/TestExport.java
src/test/com/cloudera/sqoop/TestExportUpdate.java
src/test/com/cloudera/sqoop/TestIncrementalImport.java
src/test/com/cloudera/sqoop/TestMerge.java
src/test/com/cloudera/sqoop/TestMultiCols.java
src/test/com/cloudera/sqoop/TestMultiMaps.java
src/test/com/cloudera/sqoop/TestQuery.java
src/test/com/cloudera/sqoop/TestSplitBy.java
src/test/com/cloudera/sqoop/TestSqoopOptions.java
src/test/com/cloudera/sqoop/TestTargetDir.java
src/test/com/cloudera/sqoop/TestWhere.java
src/test/com/cloudera/sqoop/ThirdPartyTests.java
src/test/com/cloudera/sqoop/hbase/HBaseTestCase.java
src/test/com/cloudera/sqoop/hbase/TestHBaseImport.java
src/test/com/cloudera/sqoop/hbase/TestHBaseQueryImport.java
src/test/com/cloudera/sqoop/hbase/TestHBaseUtil.java
src/test/com/cloudera/sqoop/hive/TestHiveImport.java
src/test/com/cloudera/sqoop/hive/TestTableDefWriter.java
src/test/com/cloudera/sqoop/io/TestCodecMap.java
src/test/com/cloudera/sqoop/io/TestLobFile.java
src/test/com/cloudera/sqoop/io/TestNamedFifo.java
src/test/com/cloudera/sqoop/io/TestSplittableBufferedWriter.java
src/test/com/cloudera/sqoop/lib/TestBlobRef.java
src/test/com/cloudera/sqoop/lib/TestBooleanParser.java
src/test/com/cloudera/sqoop/lib/TestClobRef.java
src/test/com/cloudera/sqoop/lib/TestFieldFormatter.java
src/test/com/cloudera/sqoop/lib/TestLargeObjectLoader.java
src/test/com/cloudera/sqoop/lib/TestRecordParser.java
src/test/com/cloudera/sqoop/manager/DB2ManagerImportManualTest.java
src/test/com/cloudera/sqoop/manager/DirectMySQLExportTest.java
src/test/com/cloudera/sqoop/manager/DirectMySQLTest.java
src/test/com/cloudera/sqoop/manager/JdbcMySQLExportTest.java
src/test/com/cloudera/sqoop/manager/MySQLAuthTest.java
src/test/com/cloudera/sqoop/manager/MySQLCompatTest.java
src/test/com/cloudera/sqoop/manager/MySQLTestUtils.java
src/test/com/cloudera/sqoop/manager/OracleCompatTest.java
src/test/com/cloudera/sqoop/manager/OracleExportTest.java
src/test/com/cloudera/sqoop/manager/OracleManagerTest.java
src/test/com/cloudera/sqoop/manager/OracleUtils.java
src/test/com/cloudera/sqoop/manager/PostgresqlTest.java
src/test/com/cloudera/sqoop/manager/SQLServerManagerImportManualTest.java
src/test/com/cloudera/sqoop/manager/TestHsqldbManager.java
src/test/com/cloudera/sqoop/manager/TestSqlManager.java
src/test/com/cloudera/sqoop/mapreduce/MapreduceTests.java
src/test/com/cloudera/sqoop/mapreduce/TestImportJob.java
src/test/com/cloudera/sqoop/mapreduce/db/TestDataDrivenDBInputFormat.java
src/test/com/cloudera/sqoop/metastore/TestSavedJobs.java
src/test/com/cloudera/sqoop/orm/TestClassWriter.java
src/test/com/cloudera/sqoop/orm/TestParseMethods.java
src/test/com/cloudera/sqoop/testutil/BaseSqoopTestCase.java
src/test/com/cloudera/sqoop/testutil/CommonArgs.java
src/test/com/cloudera/sqoop/testutil/DirUtil.java
src/test/com/cloudera/sqoop/testutil/ExplicitSetMapper.java
src/test/com/cloudera/sqoop/testutil/ExportJobTestCase.java
src/test/com/cloudera/sqoop/testutil/HsqldbTestServer.java
src/test/com/cloudera/sqoop/testutil/ImportJobTestCase.java
src/test/com/cloudera/sqoop/testutil/InjectableConnManager.java
src/test/com/cloudera/sqoop/testutil/InjectableManagerFactory.java
src/test/com/cloudera/sqoop/testutil/ManagerCompatTestCase.java
src/test/com/cloudera/sqoop/testutil/MockObjectFactory.java
src/test/com/cloudera/sqoop/testutil/MockResultSet.java
src/test/com/cloudera/sqoop/testutil/ReparseMapper.java
src/test/com/cloudera/sqoop/testutil/SeqFileReader.java
src/test/com/cloudera/sqoop/tool/TestToolPlugin.java
src/test/com/cloudera/sqoop/util/TestOptionsFileExpansion.java
src/test/org/apache/sqoop/mapreduce/db/TestTextSplitter.java

index df69c43..eb42552 100644 (file)
@@ -1,3 +1,10 @@
-This product includes software developed by Cloudera, Inc.
-(http://www.cloudera.com/).
+Apache SQOOP
+Copyright 2011 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions of this software were developed at
+Cloudera, Inc. (http://www.cloudera.com/).
+
 
index 1f3854b..a81cfda 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
@@ -24,6 +22,24 @@ Sqoop Developer's Guide v{revnumber}
 
 
 
+----
+  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.
+----
+
 include::intro.txt[]
 
 include::preface.txt[]
index 94eba66..80453ee 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 9cb3947..8cba5cd 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 302f6eb..e3728b0 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 8c0ea60..27f9417 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index a1c0f55..c1afaef 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index e103f4c..129f5d1 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index a4a98a8..7164e93 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 851b2d8..dd77c3e 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 03faf29..a4ce4ec 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 0f39c19..733d71a 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index a438291..dacc803 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 18cda16..876fd6e 100644 (file)
@@ -1,6 +1,4 @@
 
-  Copyright 2011 The Apache Software Foundation
   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
index 3dcabad..d139e0a 100644 (file)
@@ -1,6 +1,4 @@
 
-  Copyright 2011 The Apache Software Foundation
   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
index 985f9ac..7cb8b85 100644 (file)
@@ -1,6 +1,4 @@
 == <!--
-  Copyright 2011 The Apache Software Foundation
   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
index 8028b4f..c7dabd0 100644 (file)
@@ -1,6 +1,4 @@
 == <!--
-  Copyright 2011 The Apache Software Foundation
   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
index 25d9561..c79f1af 100644 (file)
@@ -1,6 +1,4 @@
 == <!--
-  Copyright 2011 The Apache Software Foundation
   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
index 83bcca7..9664125 100644 (file)
@@ -1,6 +1,4 @@
 == <!--
-  Copyright 2011 The Apache Software Foundation
   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
index e1b03a0..0e4b14c 100644 (file)
@@ -1,6 +1,4 @@
 == <!--
-  Copyright 2011 The Apache Software Foundation
   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
index 7d13043..819c512 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
@@ -24,6 +22,24 @@ Sqoop User Guide (v{revnumber})
 
 
 
+----
+  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.
+----
+
 include::intro.txt[]
 
 include::preface.txt[]
index 3c22eaf..7e5a76a 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index a2f3b56..5f6c479 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 89c7140..dcf75c9 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 403ec7c..4617437 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index a683f80..eff9939 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 3ba608c..ec1863d 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 0ad3777..44a5111 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 8a6ee4f..2ceb21a 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 77bc910..db3563d 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 511d3bf..bd957ca 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index bac1692..3aa34fd 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 772d153..fcf9056 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 58bbc6f..9f293b4 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 9c489c9..c26eaa7 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index f78b52b..ebd0ff0 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
-
   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
index 04342e5..36b930b 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index df783f9..4d2d3a1 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 35bfe27..11b4f0c 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 2b5952b..53de92d 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index d3717ba..a665a20 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 21542b8..69d6c7c 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index df7a9d8..d5df88c 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 341c014..9f9bc88 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 16fc256..c7eca60 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 4988131..deddb1a 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 10b874f..52785c4 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 65b8da8..230aa55 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 64893a2..7c177b8 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 38d415c..99cd475 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index c1c01ba..a1d7a48 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index af2c9ad..2326395 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index a9332b3..2d00237 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 5396e05..fd575e1 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 295632f..e7eb23d 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index beaf738..8871b0b 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 6927d26..6fa3251 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 7585720..ff9878e 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 165ba77..27e3650 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 1668677..2db0ff7 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index d411056..0fdf0e3 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index cc99475..ce83a24 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 41c9c0f..0f4fccf 100644 (file)
@@ -1,6 +1,4 @@
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 1992711..234d64b 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
index 9c17da3..a922264 100644 (file)
@@ -4,8 +4,6 @@
                 exclude-result-prefixes="exsl">
 
 <!--
-  Copyright 2011 The Apache Software Foundation
   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
index a3cbf3b..4bef7dd 100644 (file)
@@ -1,6 +1,4 @@
  /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 080bb9c..f93cbfb 100644 (file)
@@ -4,8 +4,6 @@
                 exclude-result-prefixes="exsl">
 
 <!--
-  Copyright 2011 The Apache Software Foundation
   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
index 9b25d1b..e7636e5 100644 (file)
@@ -4,8 +4,6 @@
                 exclude-result-prefixes="exsl">
 
 <!--
-  Copyright 2011 The Apache Software Foundation
   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
index 9d45b7a..a91826e 100644 (file)
@@ -2,8 +2,6 @@
 
 
 <!--
-  Copyright 2011 The Apache Software Foundation
   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
index e651e80..95a35b4 100644 (file)
@@ -1,7 +1,5 @@
 
 ////
-  Copyright 2011 The Apache Software Foundation
   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
@@ -24,6 +22,24 @@ Sqoop Documentation (v{revnumber})
 
 
 
+----
+  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.
+----
+
 The following pages are the documentation for Sqoop v{revnumber}:
 
 - link:SqoopUserGuide.html[Sqoop User Guide]
index e4e8d46..f75cb4e 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
 
 package com.cloudera.sqoop;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.util.ReflectionUtils;
-import org.apache.hadoop.util.StringUtils;
-
-import com.cloudera.sqoop.manager.ConnManager;
-import com.cloudera.sqoop.manager.DefaultManagerFactory;
-import com.cloudera.sqoop.manager.ManagerFactory;
-import com.cloudera.sqoop.metastore.JobData;
-
-import com.cloudera.sqoop.util.ClassLoaderStack;
 
 /**
- * Factory class to create the ConnManager type required
- * for the current import job.
- *
- * This class delegates the actual responsibility for instantiating
- * ConnManagers to one or more instances of ManagerFactory. ManagerFactories
- * are consulted in the order specified in sqoop-site.xml
- * (sqoop.connection.factories).
+ * @deprecated Moving to use org.apache.sqoop namespace.
  */
-public class ConnFactory {
-
-  public static final Log LOG = LogFactory.getLog(ConnFactory.class.getName());
-
-  public ConnFactory(Configuration conf) {
-    factories = new LinkedList<ManagerFactory>();
-    instantiateFactories(conf);
-  }
+public class ConnFactory
+    extends org.apache.sqoop.ConnFactory {
 
-  /** The sqoop-site.xml configuration property used to set the list of
-   * available ManagerFactories.
-   */
   public static final String FACTORY_CLASS_NAMES_KEY =
-      "sqoop.connection.factories";
-
-  // The default value for sqoop.connection.factories is the
-  // name of the DefaultManagerFactory.
-  static final String DEFAULT_FACTORY_CLASS_NAMES =
-      DefaultManagerFactory.class.getName();
-
-  /** The list of ManagerFactory instances consulted by getManager().
-   */
-  private List<ManagerFactory> factories;
-
-  /**
-   * Create the ManagerFactory instances that should populate
-   * the factories list.
-   */
-  private void instantiateFactories(Configuration conf) {
-    loadManagersFromConfDir(conf);
-    String [] classNameArray =
-        conf.getStrings(FACTORY_CLASS_NAMES_KEY, DEFAULT_FACTORY_CLASS_NAMES);
-
-    for (String className : classNameArray) {
-      try {
-        className = className.trim(); // Ignore leading/trailing whitespace.
-        ManagerFactory factory = ReflectionUtils.newInstance(
-            (Class<? extends ManagerFactory>)
-            conf.getClassByName(className), conf);
-        LOG.debug("Loaded manager factory: " + className);
-        factories.add(factory);
-      } catch (ClassNotFoundException cnfe) {
-        LOG.error("Could not load ManagerFactory " + className
-            + " (not found)");
-      }
-    }
-  }
+      org.apache.sqoop.ConnFactory.FACTORY_CLASS_NAMES_KEY;
 
-  /**
-   * Factory method to get a ConnManager for the given JDBC connect string.
-   * @param data the connection and other configuration arguments.
-   * @return a ConnManager instance for the appropriate database.
-   * @throws IOException if it cannot find a ConnManager for this schema.
-   */
-  public ConnManager getManager(JobData data) throws IOException {
-    // Try all the available manager factories.
-    for (ManagerFactory factory : factories) {
-      LOG.debug("Trying ManagerFactory: " + factory.getClass().getName());
-      ConnManager mgr = factory.accept(data);
-      if (null != mgr) {
-        LOG.debug("Instantiated ConnManager " + mgr.toString());
-        return mgr;
-      }
-    }
+  public static final String DEFAULT_FACTORY_CLASS_NAMES =
+    org.apache.sqoop.ConnFactory.DEFAULT_FACTORY_CLASS_NAMES;
 
-    throw new IOException("No manager for connect string: "
-        + data.getSqoopOptions().getConnectString());
-  }
-
-  /**
-   * Add a ManagerFactory class to the list that we instantiate.
-   * @param conf the Configuration to set.
-   * @param factory the ManagerFactory class name to add.
-   */
-  private void addManager(Configuration conf, String factory) {
-    String curVal = conf.get(FACTORY_CLASS_NAMES_KEY);
-    if (null == curVal) {
-      conf.set(FACTORY_CLASS_NAMES_KEY, factory);
-    } else {
-      conf.set(FACTORY_CLASS_NAMES_KEY, curVal + "," + factory);
-    }
-  }
-
-  /**
-   * Read the specified file and extract any ManagerFactory implementation
-   * names from there.
-   * @param conf the configuration to populate.
-   * @param f the file containing the configuration data to add.
-   */
-  private void addManagersFromFile(Configuration conf, File f) {
-    Reader r = null;
-    try {
-      // The file format is actually Java properties-file syntax.
-      r = new InputStreamReader(new FileInputStream(f));
-      Properties props = new Properties();
-      props.load(r);
-
-      for (Map.Entry<Object, Object> entry : props.entrySet()) {
-        // Each key is a ManagerFactory class name.
-        // Each value, if set, is the jar that contains it.
-        String factory = entry.getKey().toString();
-        addManager(conf, factory);
-
-        String jarName = entry.getValue().toString();
-        if (jarName.length() > 0) {
-          ClassLoaderStack.addJarFile(jarName, factory);
-          LOG.debug("Added factory " + factory + " in jar " + jarName
-              + " specified by " + f);
-        } else if (LOG.isDebugEnabled()) {
-          LOG.debug("Added factory " + factory + " specified by " + f);
-        }
-      }
-    } catch (IOException ioe) {
-      LOG.error("Error loading ManagerFactory information from file "
-          + f + ": " + StringUtils.stringifyException(ioe));
-    } finally {
-      if (null != r) {
-        try {
-          r.close();
-        } catch (IOException ioe) {
-          LOG.warn("Error closing file " + f + ": " + ioe);
-        }
-      }
-    }
+  public ConnFactory(Configuration conf) {
+    super(conf);
   }
 
-  /**
-   * If $SQOOP_CONF_DIR/managers.d/ exists and sqoop.connection.factories is
-   * not set, then we look through the files in that directory; they should
-   * contain lines of the form mgr.class.name[=/path/to/containing.jar].
-   *
-   * <p>
-   * Put all mgr.class.names into the Configuration, and load any specified
-   * jars into the ClassLoader.
-   * </p>
-   *
-   * @param conf the current configuration to populate with class names.
-   * @return conf again, after possibly populating sqoop.connection.factories.
-   */
-  private Configuration loadManagersFromConfDir(Configuration conf) {
-    if (conf.get(FACTORY_CLASS_NAMES_KEY) != null) {
-      LOG.debug(FACTORY_CLASS_NAMES_KEY + " is set; ignoring managers.d");
-      return conf;
-    }
-
-    String confDirName = System.getenv("SQOOP_CONF_DIR");
-    if (null == confDirName) {
-      LOG.warn("$SQOOP_CONF_DIR has not been set in the environment. "
-          + "Cannot check for additional configuration.");
-      return conf;
-    }
-
-    File confDir = new File(confDirName);
-    File mgrDir = new File(confDir, "managers.d");
-
-    if (mgrDir.exists() && mgrDir.isDirectory()) {
-      // We have a managers.d subdirectory. Get the file list, sort it,
-      // and process them in order.
-      String [] fileNames = mgrDir.list();
-      Arrays.sort(fileNames);
-
-      for (String fileName : fileNames) {
-        File f = new File(mgrDir, fileName);
-        if (f.isFile()) {
-          addManagersFromFile(conf, f);
-        }
-      }
-
-      // Add the default MF.
-      addManager(conf, DEFAULT_FACTORY_CLASS_NAMES);
-    }
-
-    // Set the classloader in this configuration so that it will use
-    // the jars we just loaded in.
-    conf.setClassLoader(Thread.currentThread().getContextClassLoader());
-    return conf;
-  }
 }
 
index 34927dd..c3d9725 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
 
 package com.cloudera.sqoop;
 
-import java.util.Arrays;
-
 import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.conf.Configured;
-import org.apache.hadoop.util.Tool;
-import org.apache.hadoop.util.ToolRunner;
-
-import com.cloudera.sqoop.cli.ToolOptions;
 import com.cloudera.sqoop.tool.SqoopTool;
-import com.cloudera.sqoop.util.OptionsFileUtil;
 
 /**
- * Main entry-point for Sqoop
- * Usage: hadoop jar (this_jar_name) com.cloudera.sqoop.Sqoop (options)
- * See the SqoopOptions class for options.
+ * @deprecated Moving to use org.apache.sqoop namespace.
  */
-public class Sqoop extends Configured implements Tool {
+public class Sqoop
+    extends org.apache.sqoop.Sqoop {
 
-  public static final Log SQOOP_LOG = LogFactory.getLog("com.cloudera.sqoop");
-  public static final Log LOG = LogFactory.getLog(Sqoop.class.getName());
+  public static final Log SQOOP_LOG =
+      org.apache.sqoop.Sqoop.SQOOP_LOG;
 
-  /**
-   * If this System property is set, always throw an exception, do not just
-   * exit with status 1.
-   */
-  public static final String SQOOP_RETHROW_PROPERTY = "sqoop.throwOnError";
+  public static final String SQOOP_RETHROW_PROPERTY =
+      org.apache.sqoop.Sqoop.SQOOP_RETHROW_PROPERTY;
 
-  /**
-   * The option to specify an options file from which other options to the
-   * tool are read.
-   */
-  public static final String SQOOP_OPTIONS_FILE_SPECIFIER = "--options-file";
+  public static final String SQOOP_OPTIONS_FILE_SPECIFIER =
+      org.apache.sqoop.Sqoop.SQOOP_OPTIONS_FILE_SPECIFIER;
 
   static {
     Configuration.addDefaultResource("sqoop-site.xml");
   }
 
-  private SqoopTool tool;
-  private SqoopOptions options;
-  private String [] childPrgmArgs;
-
-  /**
-   * Creates a new instance of Sqoop set to run the supplied SqoopTool
-   * with the default configuration.
-   * @param tool the SqoopTool to run in the main body of Sqoop.
-   */
-  public Sqoop(SqoopTool tool) {
-    this(tool, (Configuration) null);
-  }
-
-  /**
-   * Creates a new instance of Sqoop set to run the supplied SqoopTool
-   * with the provided configuration.
-   * @param tool the SqoopTool to run in the main body of Sqoop.
-   * @param conf the Configuration to use (e.g., from ToolRunner).
-   */
-  public Sqoop(SqoopTool tool, Configuration conf) {
-    this(tool, conf, new SqoopOptions());
-  }
-
-  /**
-   * Creates a new instance of Sqoop set to run the supplied SqoopTool
-   * with the provided configuration and SqoopOptions.
-   * @param tool the SqoopTool to run in the main body of Sqoop.
-   * @param conf the Configuration to use (e.g., from ToolRunner).
-   * @param opts the SqoopOptions which control the tool's parameters.
-   */
-  public Sqoop(SqoopTool tool, Configuration conf, SqoopOptions opts) {
-    if (null != conf) {
-      setConf(conf);
-    }
-
-    this.options = opts;
-    this.options.setConf(getConf());
-
-    this.tool = tool;
-  }
-
-  /**
-   * @return the SqoopOptions used in this Sqoop instance.
-   */
-  public SqoopOptions getOptions() {
-    return this.options;
+  public static int runSqoop(Sqoop sqoop, String [] args) {
+    return org.apache.sqoop.Sqoop.runSqoop(sqoop, args);
   }
 
-  /**
-   * @return the SqoopTool used in this Sqoop instance.
-   */
-  public SqoopTool getTool() {
-    return this.tool;
+  public static int runTool(String [] args, Configuration conf) {
+    return org.apache.sqoop.Sqoop.runTool(args, conf);
   }
 
-  @Override
-  /**
-   * Actual main entry-point for the program
-   */
-  public int run(String [] args) {
-    if (options.getConf() == null) {
-      // Configuration wasn't initialized until after the ToolRunner
-      // got us to this point. ToolRunner gave Sqoop itself a Conf
-      // though.
-      options.setConf(getConf());
-    }
-
-    try {
-      options = tool.parseArguments(args, null, options, false);
-      tool.appendArgs(this.childPrgmArgs);
-      tool.validateOptions(options);
-    } catch (Exception e) {
-      // Couldn't parse arguments.
-      // Log the stack trace for this exception
-      LOG.debug(e.getMessage(), e);
-      // Print exception message.
-      System.err.println(e.getMessage());
-      // Print the tool usage message and exit.
-      ToolOptions toolOpts = new ToolOptions();
-      tool.configureOptions(toolOpts);
-      tool.printHelp(toolOpts);
-      return 1; // Exit on exception here.
-    }
-
-    return tool.run(options);
+  public static int runTool(String [] args) {
+    return org.apache.sqoop.Sqoop.runTool(args);
   }
 
-  /**
-   * SqoopTools sometimes pass arguments to a child program (e.g., mysqldump).
-   * Users can specify additional args to these programs by preceeding the
-   * additional arguments with a standalone '--'; but
-   * ToolRunner/GenericOptionsParser will cull out this argument. We remove
-   * the child-program arguments in advance, and store them to be readded
-   * later.
-   * @param argv the argv in to the SqoopTool
-   * @return the argv with a "--" and any subsequent arguments removed.
-   */
-  private String [] stashChildPrgmArgs(String [] argv) {
-    for (int i = 0; i < argv.length; i++) {
-      if ("--".equals(argv[i])) {
-        this.childPrgmArgs = Arrays.copyOfRange(argv, i, argv.length);
-        return Arrays.copyOfRange(argv, 0, i);
-      }
-    }
-
-    // Didn't find child-program arguments.
-    return argv;
+  public static void main(String [] args) {
+    org.apache.sqoop.Sqoop.main(args);
   }
 
-  /**
-   * Given a Sqoop object and a set of arguments to deliver to
-   * its embedded SqoopTool, run the tool, wrapping the call to
-   * ToolRunner.
-   * This entry-point is preferred to ToolRunner.run() because
-   * it has a chance to stash child program arguments before
-   * GenericOptionsParser would remove them.
-   */
-  public static int runSqoop(Sqoop sqoop, String [] args) {
-    try {
-      String [] toolArgs = sqoop.stashChildPrgmArgs(args);
-      return ToolRunner.run(sqoop.getConf(), sqoop, toolArgs);
-    } catch (Exception e) {
-      LOG.error("Got exception running Sqoop: " + e.toString());
-      e.printStackTrace();
-      if (System.getProperty(SQOOP_RETHROW_PROPERTY) != null) {
-        throw new RuntimeException(e);
-      }
-      return 1;
-    }
-
+  public Sqoop(SqoopTool tool) {
+    super(tool);
   }
 
-  /**
-   * Entry-point that parses the correct SqoopTool to use from the args,
-   * but does not call System.exit() as main() will.
-   */
-  public static int runTool(String [] args, Configuration conf) {
-    // Expand the options
-    String[] expandedArgs = null;
-    try {
-      expandedArgs = OptionsFileUtil.expandArguments(args);
-    } catch (Exception ex) {
-      LOG.error("Error while expanding arguments", ex);
-      System.err.println(ex.getMessage());
-      System.err.println("Try 'sqoop help' for usage.");
-      return 1;
-    }
-
-    String toolName = expandedArgs[0];
-    Configuration pluginConf = SqoopTool.loadPlugins(conf);
-    SqoopTool tool = SqoopTool.getTool(toolName);
-    if (null == tool) {
-      System.err.println("No such sqoop tool: " + toolName
-          + ". See 'sqoop help'.");
-      return 1;
-    }
-
-
-    Sqoop sqoop = new Sqoop(tool, pluginConf);
-    return runSqoop(sqoop,
-        Arrays.copyOfRange(expandedArgs, 1, expandedArgs.length));
+  public Sqoop(SqoopTool tool, Configuration conf) {
+    super(tool, conf);
   }
 
-  /**
-   * Entry-point that parses the correct SqoopTool to use from the args,
-   * but does not call System.exit() as main() will.
-   */
-  public static int runTool(String [] args) {
-    return runTool(args, new Configuration());
+  public Sqoop(SqoopTool tool, Configuration conf, SqoopOptions opts) {
+    super(tool, conf, opts);
   }
 
-  public static void main(String [] args) {
-    if (args.length == 0) {
-      System.err.println("Try 'sqoop help' for usage.");
-      System.exit(1);
-    }
-
-    int ret = runTool(args);
-    System.exit(ret);
-  }
 }
 
index 68c847a..ee4e177 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index d0bd584..c6453b7 100644 (file)
@@ -20,7 +20,7 @@ package com.cloudera.sqoop.cli;
 /**
  * @deprecated Moving to use org.apache.sqoop namespace.
  */
-public class RelatedOptions 
+public class RelatedOptions
     extends org.apache.sqoop.cli.RelatedOptions {
 
   public RelatedOptions() {
index c153ae8..0c55b21 100644 (file)
 
 package com.cloudera.sqoop.hbase;
 
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.util.Bytes;
-
 /**
  * @deprecated Moving to use org.apache.sqoop namespace.
  */
index 1687869..905c68f 100644 (file)
@@ -44,7 +44,7 @@ public final class LobFile {
       org.apache.sqoop.io.LobFile.LATEST_LOB_VERSION;
 
   // Must be in sync with org.apache.sqoop.io.LobFile.HEADER_ID_STR
-  static final char [] HEADER_ID_STR = 
+  static final char [] HEADER_ID_STR =
       org.apache.sqoop.io.LobFile.HEADER_ID_STR;
 
   // Value for entryId to write to the beginning of an IndexSegment.
index f51398e..16adeb2 100644 (file)
 
 package com.cloudera.sqoop.manager;
 
-import java.io.IOException;
-import java.sql.SQLException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 import com.cloudera.sqoop.SqoopOptions;
-import com.cloudera.sqoop.util.ImportException;
 
 /**
  * Manages connections to Postgresql databases.
  */
-public class PostgresqlManager extends CatalogQueryManager {
-
-  public static final Log LOG = LogFactory.getLog(
-      PostgresqlManager.class.getName());
-
-  // driver class to ensure is loaded when making db connection.
-  private static final String DRIVER_CLASS = "org.postgresql.Driver";
-
-  // set to true after we warn the user that we can use direct fastpath.
-  private static boolean warningPrinted = false;
+public class PostgresqlManager
+    extends org.apache.sqoop.manager.PostgresqlManager {
 
   public PostgresqlManager(final SqoopOptions opts) {
-    super(DRIVER_CLASS, opts);
+    super(opts);
   }
 
   protected PostgresqlManager(final SqoopOptions opts, boolean ignored) {
-    // constructor used by subclasses to avoid the --direct warning.
-    super(DRIVER_CLASS, opts);
-  }
-
-  @Override
-  public String escapeColName(String colName) {
-    return escapeIdentifier(colName);
-  }
-
-  @Override
-  public String escapeTableName(String tableName) {
-    return escapeIdentifier(tableName);
-  }
-
-  protected String escapeIdentifier(String identifier) {
-    if (identifier == null) {
-      return null;
-    }
-    return "\"" + identifier.replace("\"", "\"\"") + "\"";
-  }
-
-  @Override
-  public void close() throws SQLException {
-    if (this.hasOpenConnection()) {
-      this.getConnection().commit(); // Commit any changes made thus far.
-    }
-
-    super.close();
-  }
-
-  @Override
-  protected String getColNamesQuery(String tableName) {
-    // Use LIMIT to return fast
-    return "SELECT t.* FROM " + escapeTableName(tableName) + " AS t LIMIT 1";
-  }
-
-  @Override
-  public void importTable(ImportJobContext context)
-        throws IOException, ImportException {
-
-    // The user probably should have requested --direct to invoke pg_dump.
-    // Display a warning informing them of this fact.
-    if (!PostgresqlManager.warningPrinted) {
-      LOG.warn("It looks like you are importing from postgresql.");
-      LOG.warn("This transfer can be faster! Use the --direct");
-      LOG.warn("option to exercise a postgresql-specific fast path.");
-
-      PostgresqlManager.warningPrinted = true; // don't display this twice.
-    }
-
-    // Then run the normal importTable() method.
-    super.importTable(context);
-  }
-
-  @Override
-  public boolean supportsStagingForExport() {
-    return true;
-  }
-
-  @Override
-  protected String getListDatabasesQuery() {
-    return
-      "SELECT DATNAME FROM PG_CATALOG.PG_DATABASE";
-  }
-
-  @Override
-  protected String getListTablesQuery() {
-    return
-      "SELECT TABLENAME FROM PG_CATALOG.PG_TABLES "
-    + "WHERE SCHEMANAME = (SELECT CURRENT_SCHEMA())";
-  }
-
-  @Override
-  protected String getListColumnsQuery(String tableName) {
-    return
-      "SELECT col.ATTNAME FROM PG_CATALOG.PG_NAMESPACE sch,"
-    + "  PG_CATALOG.PG_CLASS tab, PG_CATALOG.PG_ATTRIBUTE col "
-    + "WHERE sch.OID = tab.RELNAMESPACE "
-    + "  AND tab.OID = col.ATTRELID "
-    + "  AND sch.NSPNAME = (SELECT CURRENT_SCHEMA()) "
-    + "  AND tab.RELNAME = '" + escapeLiteral(tableName) + "' "
-    + "  AND col.ATTNUM >= 1";
-  }
-
-  @Override
-  protected String getPrimaryKeyQuery(String tableName) {
-    return
-      "SELECT col.ATTNAME FROM PG_CATALOG.PG_NAMESPACE sch, "
-    + "  PG_CATALOG.PG_CLASS tab, PG_CATALOG.PG_ATTRIBUTE col, "
-    + "  PG_CATALOG.PG_INDEX ind "
-    + "WHERE sch.OID = tab.RELNAMESPACE "
-    + "  AND tab.OID = col.ATTRELID "
-    + "  AND tab.OID = ind.INDRELID "
-    + "  AND sch.NSPNAME = (SELECT CURRENT_SCHEMA()) "
-    + "  AND tab.RELNAME = '" + escapeLiteral(tableName) + "' "
-    + "  AND col.ATTNUM = ANY(ind.INDKEY) "
-    + "  AND ind.INDISPRIMARY";
-  }
-
-  private String escapeLiteral(String literal) {
-    return literal.replace("'", "''");
-  }
-
-  @Override
-  protected String getCurTimestampQuery() {
-    return "SELECT CURRENT_TIMESTAMP";
+    super(opts, ignored);
   }
 
 }
index 43a9213..2a648a0 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 575dc7e..2994d21 100644 (file)
@@ -24,7 +24,7 @@ import com.cloudera.sqoop.lib.FieldMappable;
  * @deprecated Moving to use org.apache.sqoop namespace.
  */
 public class DelegatingOutputFormat<K extends FieldMappable, V>
-    extends org.apache.sqoop.mapreduce.DelegatingOutputFormat <K, V> {
+    extends org.apache.sqoop.mapreduce.DelegatingOutputFormat<K, V> {
 
   public static final String DELEGATE_CLASS_KEY =
       org.apache.sqoop.mapreduce.DelegatingOutputFormat.DELEGATE_CLASS_KEY;
index f969caa..030bcbe 100644 (file)
@@ -25,5 +25,5 @@ import com.cloudera.sqoop.lib.SqoopRecord;
  */
 public class ExportBatchOutputFormat<K extends SqoopRecord, V>
     extends org.apache.sqoop.mapreduce.ExportBatchOutputFormat
-    <SqoopRecord,V> {
+    <SqoopRecord, V> {
 }
index 6780f2f..41b037d 100644 (file)
@@ -21,7 +21,6 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 
-import org.apache.hadoop.mapreduce.RecordWriter;
 import org.apache.hadoop.mapreduce.lib.db.DBWritable;
 
 /**
index a639e30..df0719a 100644 (file)
@@ -47,7 +47,7 @@ public class DataDrivenDBInputFormat<T extends DBWritable>
    * @deprecated use org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.
    *   DataDrivenDBInputSplit instead.
    * @see org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.
-   *                                   DataDrivenDBInputSplit
+   *      DataDrivenDBInputSplit
    */
   public static class DataDrivenDBInputSplit extends
   org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.DataDrivenDBInputSplit {
index efed481..caab39f 100644 (file)
@@ -20,6 +20,6 @@ package com.cloudera.sqoop.tool;
 /**
  * @deprecated Moving to use org.apache.sqoop namespace.
  */
-public class CodeGenTool 
+public class CodeGenTool
     extends org.apache.sqoop.tool.CodeGenTool {
 }
index c519d20..8a4735b 100644 (file)
@@ -19,8 +19,6 @@ package com.cloudera.sqoop.tool;
 
 import java.util.Set;
 
-import org.apache.hadoop.util.StringUtils;
-
 /**
  * @deprecated Moving to use org.apache.sqoop namespace.
  */
index e5b6aec..7804c8e 100644 (file)
@@ -23,8 +23,6 @@ import java.io.IOException;
 
 import org.apache.hadoop.conf.Configuration;
 
-import com.cloudera.sqoop.config.ConfigurationConstants;
-
 /**
  * @deprecated Moving to use org.apache.sqoop namespace.
  */
diff --git a/src/java/org/apache/sqoop/ConnFactory.java b/src/java/org/apache/sqoop/ConnFactory.java
new file mode 100644 (file)
index 0000000..1921f7e
--- /dev/null
@@ -0,0 +1,232 @@
+/**
+ * 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;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.util.ReflectionUtils;
+import org.apache.hadoop.util.StringUtils;
+
+import com.cloudera.sqoop.manager.ConnManager;
+import com.cloudera.sqoop.manager.DefaultManagerFactory;
+import com.cloudera.sqoop.manager.ManagerFactory;
+import com.cloudera.sqoop.metastore.JobData;
+
+import com.cloudera.sqoop.util.ClassLoaderStack;
+
+/**
+ * Factory class to create the ConnManager type required
+ * for the current import job.
+ *
+ * This class delegates the actual responsibility for instantiating
+ * ConnManagers to one or more instances of ManagerFactory. ManagerFactories
+ * are consulted in the order specified in sqoop-site.xml
+ * (sqoop.connection.factories).
+ */
+public class ConnFactory {
+
+  public static final Log LOG = LogFactory.getLog(ConnFactory.class.getName());
+
+  public ConnFactory(Configuration conf) {
+    factories = new LinkedList<ManagerFactory>();
+    instantiateFactories(conf);
+  }
+
+  /** The sqoop-site.xml configuration property used to set the list of
+   * available ManagerFactories.
+   */
+  public static final String FACTORY_CLASS_NAMES_KEY =
+      "sqoop.connection.factories";
+
+  // The default value for sqoop.connection.factories is the
+  // name of the DefaultManagerFactory.
+  public static final String DEFAULT_FACTORY_CLASS_NAMES =
+      DefaultManagerFactory.class.getName();
+
+  /** The list of ManagerFactory instances consulted by getManager().
+   */
+  private List<ManagerFactory> factories;
+
+  /**
+   * Create the ManagerFactory instances that should populate
+   * the factories list.
+   */
+  private void instantiateFactories(Configuration conf) {
+    loadManagersFromConfDir(conf);
+    String [] classNameArray =
+        conf.getStrings(FACTORY_CLASS_NAMES_KEY, DEFAULT_FACTORY_CLASS_NAMES);
+
+    for (String className : classNameArray) {
+      try {
+        className = className.trim(); // Ignore leading/trailing whitespace.
+        ManagerFactory factory = ReflectionUtils.newInstance(
+            (Class<? extends ManagerFactory>)
+            conf.getClassByName(className), conf);
+        LOG.debug("Loaded manager factory: " + className);
+        factories.add(factory);
+      } catch (ClassNotFoundException cnfe) {
+        LOG.error("Could not load ManagerFactory " + className
+            + " (not found)");
+      }
+    }
+  }
+
+  /**
+   * Factory method to get a ConnManager for the given JDBC connect string.
+   * @param data the connection and other configuration arguments.
+   * @return a ConnManager instance for the appropriate database.
+   * @throws IOException if it cannot find a ConnManager for this schema.
+   */
+  public ConnManager getManager(JobData data) throws IOException {
+    // Try all the available manager factories.
+    for (ManagerFactory factory : factories) {
+      LOG.debug("Trying ManagerFactory: " + factory.getClass().getName());
+      ConnManager mgr = factory.accept(data);
+      if (null != mgr) {
+        LOG.debug("Instantiated ConnManager " + mgr.toString());
+        return mgr;
+      }
+    }
+
+    throw new IOException("No manager for connect string: "
+        + data.getSqoopOptions().getConnectString());
+  }
+
+  /**
+   * Add a ManagerFactory class to the list that we instantiate.
+   * @param conf the Configuration to set.
+   * @param factory the ManagerFactory class name to add.
+   */
+  private void addManager(Configuration conf, String factory) {
+    String curVal = conf.get(FACTORY_CLASS_NAMES_KEY);
+    if (null == curVal) {
+      conf.set(FACTORY_CLASS_NAMES_KEY, factory);
+    } else {
+      conf.set(FACTORY_CLASS_NAMES_KEY, curVal + "," + factory);
+    }
+  }
+
+  /**
+   * Read the specified file and extract any ManagerFactory implementation
+   * names from there.
+   * @param conf the configuration to populate.
+   * @param f the file containing the configuration data to add.
+   */
+  private void addManagersFromFile(Configuration conf, File f) {
+    Reader r = null;
+    try {
+      // The file format is actually Java properties-file syntax.
+      r = new InputStreamReader(new FileInputStream(f));
+      Properties props = new Properties();
+      props.load(r);
+
+      for (Map.Entry<Object, Object> entry : props.entrySet()) {
+        // Each key is a ManagerFactory class name.
+        // Each value, if set, is the jar that contains it.
+        String factory = entry.getKey().toString();
+        addManager(conf, factory);
+
+        String jarName = entry.getValue().toString();
+        if (jarName.length() > 0) {
+          ClassLoaderStack.addJarFile(jarName, factory);
+          LOG.debug("Added factory " + factory + " in jar " + jarName
+              + " specified by " + f);
+        } else if (LOG.isDebugEnabled()) {
+          LOG.debug("Added factory " + factory + " specified by " + f);
+        }
+      }
+    } catch (IOException ioe) {
+      LOG.error("Error loading ManagerFactory information from file "
+          + f + ": " + StringUtils.stringifyException(ioe));
+    } finally {
+      if (null != r) {
+        try {
+          r.close();
+        } catch (IOException ioe) {
+          LOG.warn("Error closing file " + f + ": " + ioe);
+        }
+      }
+    }
+  }
+
+  /**
+   * If $SQOOP_CONF_DIR/managers.d/ exists and sqoop.connection.factories is
+   * not set, then we look through the files in that directory; they should
+   * contain lines of the form mgr.class.name[=/path/to/containing.jar].
+   *
+   * <p>
+   * Put all mgr.class.names into the Configuration, and load any specified
+   * jars into the ClassLoader.
+   * </p>
+   *
+   * @param conf the current configuration to populate with class names.
+   * @return conf again, after possibly populating sqoop.connection.factories.
+   */
+  private Configuration loadManagersFromConfDir(Configuration conf) {
+    if (conf.get(FACTORY_CLASS_NAMES_KEY) != null) {
+      LOG.debug(FACTORY_CLASS_NAMES_KEY + " is set; ignoring managers.d");
+      return conf;
+    }
+
+    String confDirName = System.getenv("SQOOP_CONF_DIR");
+    if (null == confDirName) {
+      LOG.warn("$SQOOP_CONF_DIR has not been set in the environment. "
+          + "Cannot check for additional configuration.");
+      return conf;
+    }
+
+    File confDir = new File(confDirName);
+    File mgrDir = new File(confDir, "managers.d");
+
+    if (mgrDir.exists() && mgrDir.isDirectory()) {
+      // We have a managers.d subdirectory. Get the file list, sort it,
+      // and process them in order.
+      String [] fileNames = mgrDir.list();
+      Arrays.sort(fileNames);
+
+      for (String fileName : fileNames) {
+        File f = new File(mgrDir, fileName);
+        if (f.isFile()) {
+          addManagersFromFile(conf, f);
+        }
+      }
+
+      // Add the default MF.
+      addManager(conf, DEFAULT_FACTORY_CLASS_NAMES);
+    }
+
+    // Set the classloader in this configuration so that it will use
+    // the jars we just loaded in.
+    conf.setClassLoader(Thread.currentThread().getContextClassLoader());
+    return conf;
+  }
+}
+
diff --git a/src/java/org/apache/sqoop/Sqoop.java b/src/java/org/apache/sqoop/Sqoop.java
new file mode 100644 (file)
index 0000000..2e1725d
--- /dev/null
@@ -0,0 +1,242 @@
+/**
+ * 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;
+
+import java.util.Arrays;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.util.Tool;
+import org.apache.hadoop.util.ToolRunner;
+
+import com.cloudera.sqoop.SqoopOptions;
+import com.cloudera.sqoop.cli.ToolOptions;
+import com.cloudera.sqoop.tool.SqoopTool;
+import com.cloudera.sqoop.util.OptionsFileUtil;
+
+/**
+ * Main entry-point for Sqoop
+ * Usage: hadoop jar (this_jar_name) com.cloudera.sqoop.Sqoop (options)
+ * See the SqoopOptions class for options.
+ */
+public class Sqoop extends Configured implements Tool {
+
+  public static final Log SQOOP_LOG = LogFactory.getLog("com.cloudera.sqoop");
+  public static final Log LOG = LogFactory.getLog(Sqoop.class.getName());
+
+  /**
+   * If this System property is set, always throw an exception, do not just
+   * exit with status 1.
+   */
+  public static final String SQOOP_RETHROW_PROPERTY = "sqoop.throwOnError";
+
+  /**
+   * The option to specify an options file from which other options to the
+   * tool are read.
+   */
+  public static final String SQOOP_OPTIONS_FILE_SPECIFIER = "--options-file";
+
+  static {
+    Configuration.addDefaultResource("sqoop-site.xml");
+  }
+
+  private SqoopTool tool;
+  private SqoopOptions options;
+  private String [] childPrgmArgs;
+
+  /**
+   * Creates a new instance of Sqoop set to run the supplied SqoopTool
+   * with the default configuration.
+   * @param tool the SqoopTool to run in the main body of Sqoop.
+   */
+  public Sqoop(SqoopTool tool) {
+    this(tool, (Configuration) null);
+  }
+
+  /**
+   * Creates a new instance of Sqoop set to run the supplied SqoopTool
+   * with the provided configuration.
+   * @param tool the SqoopTool to run in the main body of Sqoop.
+   * @param conf the Configuration to use (e.g., from ToolRunner).
+   */
+  public Sqoop(SqoopTool tool, Configuration conf) {
+    this(tool, conf, new SqoopOptions());
+  }
+
+  /**
+   * Creates a new instance of Sqoop set to run the supplied SqoopTool
+   * with the provided configuration and SqoopOptions.
+   * @param tool the SqoopTool to run in the main body of Sqoop.
+   * @param conf the Configuration to use (e.g., from ToolRunner).
+   * @param opts the SqoopOptions which control the tool's parameters.
+   */
+  public Sqoop(SqoopTool tool, Configuration conf, SqoopOptions opts) {
+    if (null != conf) {
+      setConf(conf);
+    }
+
+    this.options = opts;
+    this.options.setConf(getConf());
+
+    this.tool = tool;
+  }
+
+  /**
+   * @return the SqoopOptions used in this Sqoop instance.
+   */
+  public SqoopOptions getOptions() {
+    return this.options;
+  }
+
+  /**
+   * @return the SqoopTool used in this Sqoop instance.
+   */
+  public SqoopTool getTool() {
+    return this.tool;
+  }
+
+  @Override
+  /**
+   * Actual main entry-point for the program
+   */
+  public int run(String [] args) {
+    if (options.getConf() == null) {
+      // Configuration wasn't initialized until after the ToolRunner
+      // got us to this point. ToolRunner gave Sqoop itself a Conf
+      // though.
+      options.setConf(getConf());
+    }
+
+    try {
+      options = tool.parseArguments(args, null, options, false);
+      tool.appendArgs(this.childPrgmArgs);
+      tool.validateOptions(options);
+    } catch (Exception e) {
+      // Couldn't parse arguments.
+      // Log the stack trace for this exception
+      LOG.debug(e.getMessage(), e);
+      // Print exception message.
+      System.err.println(e.getMessage());
+      // Print the tool usage message and exit.
+      ToolOptions toolOpts = new ToolOptions();
+      tool.configureOptions(toolOpts);
+      tool.printHelp(toolOpts);
+      return 1; // Exit on exception here.
+    }
+
+    return tool.run(options);
+  }
+
+  /**
+   * SqoopTools sometimes pass arguments to a child program (e.g., mysqldump).
+   * Users can specify additional args to these programs by preceeding the
+   * additional arguments with a standalone '--'; but
+   * ToolRunner/GenericOptionsParser will cull out this argument. We remove
+   * the child-program arguments in advance, and store them to be readded
+   * later.
+   * @param argv the argv in to the SqoopTool
+   * @return the argv with a "--" and any subsequent arguments removed.
+   */
+  private String [] stashChildPrgmArgs(String [] argv) {
+    for (int i = 0; i < argv.length; i++) {
+      if ("--".equals(argv[i])) {
+        this.childPrgmArgs = Arrays.copyOfRange(argv, i, argv.length);
+        return Arrays.copyOfRange(argv, 0, i);
+      }
+    }
+
+    // Didn't find child-program arguments.
+    return argv;
+  }
+
+  /**
+   * Given a Sqoop object and a set of arguments to deliver to
+   * its embedded SqoopTool, run the tool, wrapping the call to
+   * ToolRunner.
+   * This entry-point is preferred to ToolRunner.run() because
+   * it has a chance to stash child program arguments before
+   * GenericOptionsParser would remove them.
+   */
+  public static int runSqoop(Sqoop sqoop, String [] args) {
+    try {
+      String [] toolArgs = sqoop.stashChildPrgmArgs(args);
+      return ToolRunner.run(sqoop.getConf(), sqoop, toolArgs);
+    } catch (Exception e) {
+      LOG.error("Got exception running Sqoop: " + e.toString());
+      e.printStackTrace();
+      if (System.getProperty(SQOOP_RETHROW_PROPERTY) != null) {
+        throw new RuntimeException(e);
+      }
+      return 1;
+    }
+
+  }
+
+  /**
+   * Entry-point that parses the correct SqoopTool to use from the args,
+   * but does not call System.exit() as main() will.
+   */
+  public static int runTool(String [] args, Configuration conf) {
+    // Expand the options
+    String[] expandedArgs = null;
+    try {
+      expandedArgs = OptionsFileUtil.expandArguments(args);
+    } catch (Exception ex) {
+      LOG.error("Error while expanding arguments", ex);
+      System.err.println(ex.getMessage());
+      System.err.println("Try 'sqoop help' for usage.");
+      return 1;
+    }
+
+    String toolName = expandedArgs[0];
+    Configuration pluginConf = SqoopTool.loadPlugins(conf);
+    SqoopTool tool = SqoopTool.getTool(toolName);
+    if (null == tool) {
+      System.err.println("No such sqoop tool: " + toolName
+          + ". See 'sqoop help'.");
+      return 1;
+    }
+
+
+    Sqoop sqoop = new Sqoop(tool, pluginConf);
+    return runSqoop(sqoop,
+        Arrays.copyOfRange(expandedArgs, 1, expandedArgs.length));
+  }
+
+  /**
+   * Entry-point that parses the correct SqoopTool to use from the args,
+   * but does not call System.exit() as main() will.
+   */
+  public static int runTool(String [] args) {
+    return runTool(args, new Configuration());
+  }
+
+  public static void main(String [] args) {
+    if (args.length == 0) {
+      System.err.println("Try 'sqoop help' for usage.");
+      System.exit(1);
+    }
+
+    int ret = runTool(args);
+    System.exit(ret);
+  }
+}
+
diff --git a/src/java/org/apache/sqoop/SqoopOptions.java b/src/java/org/apache/sqoop/SqoopOptions.java
new file mode 100644 (file)
index 0000000..1f41fa1
--- /dev/null
@@ -0,0 +1,1961 @@
+/**
+ * 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;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+
+import com.cloudera.sqoop.lib.DelimiterSet;
+import com.cloudera.sqoop.lib.LargeObjectLoader;
+import com.cloudera.sqoop.tool.SqoopTool;
+import com.cloudera.sqoop.util.RandomHash;
+import com.cloudera.sqoop.util.StoredAsProperty;
+
+/**
+ * Configurable state used by Sqoop tools.
+ */
+public class SqoopOptions implements Cloneable {
+
+  public static final Log LOG = LogFactory.getLog(SqoopOptions.class.getName());
+
+  /**
+   * Set to true in configuration if you want to put db passwords
+   * in the metastore.
+   */
+  public static final String METASTORE_PASSWORD_KEY =
+      "sqoop.metastore.client.record.password";
+
+  public static final boolean METASTORE_PASSWORD_DEFAULT = false;
+
+  /**
+   * Thrown when invalid cmdline options are given.
+   */
+  @SuppressWarnings("serial")
+  public static class InvalidOptionsException extends Exception {
+
+    private String message;
+
+    public InvalidOptionsException(final String msg) {
+      this.message = msg;
+    }
+
+    public String getMessage() {
+      return message;
+    }
+
+    public String toString() {
+      return getMessage();
+    }
+  }
+
+  /** Selects in-HDFS destination file format. */
+  public enum FileLayout {
+    TextFile,
+    SequenceFile,
+    AvroDataFile
+  }
+
+  /**
+   * Incremental imports support two modes:
+   * <ul>
+   * <li>new rows being appended to the end of a table with an
+   * incrementing id</li>
+   * <li>new data results in a date-last-modified column being
+   * updated to NOW(); Sqoop will pull all dirty rows in the next
+   * incremental import.</li>
+   * </ul>
+   */
+  public enum IncrementalMode {
+    None,
+    AppendRows,
+    DateLastModified,
+  }
+
+
+  // TODO(aaron): Adding something here? Add a setter and a getter.  Add a
+  // default value in initDefaults() if you need one.  If this value needs to
+  // be serialized in the metastore, it should be marked with
+  // @StoredAsProperty(), if it is an int, long, boolean, String, or Enum.
+  // Arrays and other "special" types should be added directly to the
+  // loadProperties() and writeProperties() methods. Then add command-line
+  // arguments in the appropriate tools. The names of all command-line args
+  // are stored as constants in BaseSqoopTool.
+
+  @StoredAsProperty("db.connect.string") private String connectString;
+  @StoredAsProperty("db.table") private String tableName;
+  private String [] columns; // Array stored as db.column.list.
+  @StoredAsProperty("db.username") private String username;
+  @StoredAsProperty("db.export.staging.table") private String stagingTableName;
+  @StoredAsProperty("db.clear.staging.table") private boolean clearStagingTable;
+  private Properties connectionParams; //Properties stored as db.connect.params
+
+
+  // May not be serialized, based on configuration.
+  // db.require.password is used to determine whether 'some' password is
+  // used. If so, it is stored as 'db.password'.
+  private String password;
+
+  @StoredAsProperty("null.string") private String nullStringValue;
+  @StoredAsProperty("input.null.string") private String inNullStringValue;
+  @StoredAsProperty("null.non-string") private String nullNonStringValue;
+  @StoredAsProperty("input.null.non-string")
+      private String inNullNonStringValue;
+
+  @StoredAsProperty("codegen.output.dir") private String codeOutputDir;
+  @StoredAsProperty("codegen.compile.dir") private String jarOutputDir;
+  // Boolean specifying whether jarOutputDir is a nonce tmpdir (true), or
+  // explicitly set by the user (false). If the former, disregard any value
+  // for jarOutputDir saved in the metastore.
+  @StoredAsProperty("codegen.auto.compile.dir") private boolean jarDirIsAuto;
+  private String hadoopHome; // not serialized to metastore.
+  @StoredAsProperty("db.split.column") private String splitByCol;
+  @StoredAsProperty("db.where.clause") private String whereClause;
+  @StoredAsProperty("db.query") private String sqlQuery;
+  @StoredAsProperty("db.query.boundary") private String boundaryQuery;
+  @StoredAsProperty("jdbc.driver.class") private String driverClassName;
+  @StoredAsProperty("hdfs.warehouse.dir") private String warehouseDir;
+  @StoredAsProperty("hdfs.target.dir") private String targetDir;
+  @StoredAsProperty("hdfs.append.dir") private boolean append;
+  @StoredAsProperty("hdfs.file.format") private FileLayout layout;
+  @StoredAsProperty("direct.import") private boolean direct; // "direct mode."
+  @StoredAsProperty("db.batch") private boolean batchMode;
+  private String tmpDir; // where temp data goes; usually /tmp; not serialized.
+  private String hiveHome; // not serialized to metastore.
+  @StoredAsProperty("hive.import") private boolean hiveImport;
+  @StoredAsProperty("hive.overwrite.table") private boolean overwriteHiveTable;
+  @StoredAsProperty("hive.fail.table.exists")
+  private boolean failIfHiveTableExists;
+  @StoredAsProperty("hive.table.name") private String hiveTableName;
+  @StoredAsProperty("hive.drop.delims") private boolean hiveDropDelims;
+  @StoredAsProperty("hive.delims.replacement")
+  private String hiveDelimsReplacement;
+  @StoredAsProperty("hive.partition.key") private String hivePartitionKey;
+  @StoredAsProperty("hive.partition.value") private String hivePartitionValue;
+
+  // User explicit mapping of types
+  private Properties mapColumnJava; // stored as map.colum.java
+  private Properties mapColumnHive; // stored as map.column.hive
+
+  // An ordered list of column names denoting what order columns are
+  // serialized to a PreparedStatement from a generated record type.
+  // Not serialized to metastore.
+  private String [] dbOutColumns;
+
+  // package to prepend to auto-named classes.
+  @StoredAsProperty("codegen.java.packagename") private String packageName;
+
+  // package+class to apply to individual table import.
+  // also used as an *input* class with existingJarFile.
+  @StoredAsProperty("codegen.java.classname") private String className;
+
+  // Name of a jar containing existing table definition
+  // class to use.
+  @StoredAsProperty("codegen.jar.file") private String existingJarFile;
+
+  @StoredAsProperty("mapreduce.num.mappers") private int numMappers;
+  @StoredAsProperty("enable.compression") private boolean useCompression;
+  @StoredAsProperty("compression.codec") private String compressionCodec;
+
+  // In direct mode, open a new stream every X bytes.
+  @StoredAsProperty("import.direct.split.size") private long directSplitSize;
+
+  // Max size of an inline LOB; larger LOBs are written
+  // to external files on disk.
+  @StoredAsProperty("import.max.inline.lob.size") private long maxInlineLobSize;
+
+  // Max number 'n' of rows to fetch from the
+  // database when more rows are needed.
+  @StoredAsProperty("import.fetch.size") private Integer fetchSize;
+
+  // HDFS path to read from when performing an export
+  @StoredAsProperty("export.source.dir") private String exportDir;
+
+  // Column to use for the WHERE clause in an UPDATE-based export.
+  @StoredAsProperty("export.update.col") private String updateKeyCol;
+
+  /**
+   * Update mode option specifies how updates are performed when
+   * new rows are found with non-matching keys in database.
+   * It supports two modes:
+   * <ul>
+   * <li>UpdateOnly: This is the default. New rows are silently ignored.</li>
+   * <li>AllowInsert: New rows are inserted into the database.</li>
+   * </ul>
+   */
+  public enum UpdateMode {
+    UpdateOnly,
+    AllowInsert
+  }
+
+  @StoredAsProperty("export.new.update") private UpdateMode updateMode;
+
+  private DelimiterSet inputDelimiters; // codegen.input.delimiters.
+  private DelimiterSet outputDelimiters; // codegen.output.delimiters.
+  private boolean areDelimsManuallySet;
+
+  private Configuration conf;
+
+  public static final int DEFAULT_NUM_MAPPERS = 4;
+
+  private String [] extraArgs;
+
+  // HBase table to import into.
+  @StoredAsProperty("hbase.table") private String hbaseTable;
+
+  // Column family to prepend to inserted cols.
+  @StoredAsProperty("hbase.col.family") private String hbaseColFamily;
+
+  // Column of the input to use as the row key.
+  @StoredAsProperty("hbase.row.key.col") private String hbaseRowKeyCol;
+
+  // if true, create tables/col families.
+  @StoredAsProperty("hbase.create.table") private boolean hbaseCreateTable;
+
+  // col to filter on for incremental imports.
+  @StoredAsProperty("incremental.col") private String incrementalTestCol;
+  // incremental import mode we're using.
+  @StoredAsProperty("incremental.mode")
+  private IncrementalMode incrementalMode;
+  // What was the last-imported value of incrementalTestCol?
+  @StoredAsProperty("incremental.last.value")
+  private String incrementalLastValue;
+
+  // HDFS paths for "old" and "new" datasets in merge tool.
+  @StoredAsProperty("merge.old.path") private String mergeOldPath;
+  @StoredAsProperty("merge.new.path") private String mergeNewPath;
+
+  // "key" column for the merge operation.
+  @StoredAsProperty("merge.key.col") private String mergeKeyCol;
+
+
+  // These next two fields are not serialized to the metastore.
+  // If this SqoopOptions is created by reading a saved job, these will
+  // be populated by the JobStorage to facilitate updating the same
+  // job.
+  private String jobName;
+  private Map<String, String> jobStorageDescriptor;
+
+  // If we restore a job and then allow the user to apply arguments on
+  // top, we retain the version without the arguments in a reference to the
+  // 'parent' SqoopOptions instance, here.
+  private SqoopOptions parent;
+
+  // Nonce directory name. Generate one per process, lazily, if
+  // getNonceJarDir() is called. Not recorded in metadata. This is used as
+  // a temporary holding area for compilation work done by this process.
+  private static String curNonce;
+
+  // the connection manager fully qualified class name
+  @StoredAsProperty("connection.manager") private String connManagerClassName;
+
+  // The currently active tool. (Not saved in properties)
+  // Used to pass the SqoopTool instance in to mapreduce job configuration
+  // (JobBase, etc).
+  private SqoopTool activeSqoopTool;
+
+  public SqoopOptions() {
+    initDefaults(null);
+  }
+
+  public SqoopOptions(Configuration conf) {
+    initDefaults(conf);
+  }
+
+  /**
+   * Alternate SqoopOptions interface used mostly for unit testing.
+   * @param connect JDBC connect string to use
+   * @param table Table to read
+   */
+  public SqoopOptions(final String connect, final String table) {
+    initDefaults(null);
+
+    this.connectString = connect;
+    this.tableName = table;
+  }
+
+  private boolean getBooleanProperty(Properties props, String propName,
+      boolean defaultValue) {
+    String str = props.getProperty(propName,
+        Boolean.toString(defaultValue)).toLowerCase();
+    return "true".equals(str) || "yes".equals(str) || "1".equals(str);
+  }
+
+  private long getLongProperty(Properties props, String propName,
+      long defaultValue) {
+    String str = props.getProperty(propName,
+        Long.toString(defaultValue)).toLowerCase();
+    try {
+      return Long.parseLong(str);
+    } catch (NumberFormatException nfe) {
+      LOG.warn("Could not parse integer value for config parameter "
+          + propName);
+      return defaultValue;
+    }
+  }
+
+  private int getIntProperty(Properties props, String propName,
+      int defaultVal) {
+    long longVal = getLongProperty(props, propName, defaultVal);
+    return (int) longVal;
+  }
+
+  private char getCharProperty(Properties props, String propName,
+      char defaultVal) {
+    int intVal = getIntProperty(props, propName, (int) defaultVal);
+    return (char) intVal;
+  }
+
+  private DelimiterSet getDelimiterProperties(Properties props,
+      String prefix, DelimiterSet defaults) {
+
+    if (null == defaults) {
+      defaults = new DelimiterSet();
+    }
+
+    char field = getCharProperty(props, prefix + ".field",
+        defaults.getFieldsTerminatedBy());
+    char record = getCharProperty(props, prefix + ".record",
+        defaults.getLinesTerminatedBy());
+    char enclose = getCharProperty(props, prefix + ".enclose",
+        defaults.getEnclosedBy());
+    char escape = getCharProperty(props, prefix + ".escape",
+        defaults.getEscapedBy());
+    boolean required = getBooleanProperty(props, prefix +".enclose.required",
+        defaults.isEncloseRequired());
+
+    return new DelimiterSet(field, record, enclose, escape, required);
+  }
+
+  private void setDelimiterProperties(Properties props,
+      String prefix, DelimiterSet values) {
+    putProperty(props, prefix + ".field",
+        Integer.toString((int) values.getFieldsTerminatedBy()));
+    putProperty(props, prefix + ".record",
+        Integer.toString((int) values.getLinesTerminatedBy()));
+    putProperty(props, prefix + ".enclose",
+        Integer.toString((int) values.getEnclosedBy()));
+    putProperty(props, prefix + ".escape",
+        Integer.toString((int) values.getEscapedBy()));
+    putProperty(props, prefix + ".enclose.required",
+        Boolean.toString(values.isEncloseRequired()));
+  }
+
+  /** Take a comma-delimited list of input and split the elements
+   * into an output array. */
+  private String [] listToArray(String strList) {
+    return strList.split(",");
+  }
+
+  private String arrayToList(String [] array) {
+    if (null == array) {
+      return null;
+    }
+
+    StringBuilder sb = new StringBuilder();
+    boolean first = true;
+    for (String elem : array) {
+      if (!first) {
+        sb.append(",");
+      }
+      sb.append(elem);
+      first = false;
+    }
+
+    return sb.toString();
+  }
+
+  /**
+   * A put() method for Properties that is tolerent of 'null' values.
+   * If a null value is specified, the property is unset.
+   */
+  private void putProperty(Properties props, String k, String v) {
+    if (null == v) {
+      props.remove(k);
+    } else {
+      props.setProperty(k, v);
+    }
+  }
+
+  /**
+   * Given a property prefix that denotes a set of numbered properties,
+   * return an array containing all the properties.
+   *
+   * For instance, if prefix is "foo", then return properties "foo.0",
+   * "foo.1", "foo.2", and so on as an array. If no such properties
+   * exist, return 'defaults'.
+   */
+  private String [] getArgArrayProperty(Properties props, String prefix,
+      String [] defaults) {
+    int cur = 0;
+    ArrayList<String> al = new ArrayList<String>();
+    while (true) {
+      String curProp = prefix + "." + cur;
+      String curStr = props.getProperty(curProp, null);
+      if (null == curStr) {
+        break;
+      }
+
+      al.add(curStr);
+      cur++;
+    }
+
+    if (cur == 0) {
+      // Couldn't find an array here; return the defaults.
+      return defaults;
+    }
+
+    return al.toArray(new String[0]);
+  }
+
+  private void setArgArrayProperties(Properties props, String prefix,
+      String [] values) {
+    if (null == values) {
+      return;
+    }
+
+    for (int i = 0; i < values.length; i++) {
+      putProperty(props, prefix + "." + i, values[i]);
+    }
+  }
+
+  /**
+   * This method encodes the property key values found in the provided
+   * properties instance <tt>values</tt> into another properties instance
+   * <tt>props</tt>. The specified <tt>prefix</tt> is used as a namespace
+   * qualifier for keys when inserting. This allows easy introspection of the
+   * property key values in <tt>props</tt> instance to later separate out all
+   * the properties that belong to the <tt>values</tt> instance.
+   * @param props the container properties instance
+   * @param prefix the prefix for qualifying contained property keys.
+   * @param values the contained properties instance, all of whose elements will
+   *               be added to the container properties instance.
+   *
+   * @see #getPropertiesAsNetstedProperties(Properties, String)
+   */
+  private void setPropertiesAsNestedProperties(Properties props,
+          String prefix, Properties values) {
+    String nestedPropertyPrefix = prefix + ".";
+    if (null == values || values.size() == 0) {
+      Iterator<String> it = props.stringPropertyNames().iterator();
+      while (it.hasNext()) {
+        String name = it.next();
+        if (name.startsWith(nestedPropertyPrefix)) {
+          props.remove(name);
+        }
+      }
+    } else {
+      Iterator<String> it = values.stringPropertyNames().iterator();
+      while (it.hasNext()) {
+        String name = it.next();
+        putProperty(props,
+                nestedPropertyPrefix + name, values.getProperty(name));
+      }
+    }
+  }
+
+  /**
+   * This method decodes the property key values found in the provided
+   * properties instance <tt>props</tt> that have keys beginning with the
+   * given prefix. Matching elements from this properties instance are modified
+   * so that their prefix is dropped.
+   * @param props the properties container
+   * @param prefix the prefix qualifying properties that need to be removed
+   * @return a new properties instance that contains all matching elements from
+   * the container properties.
+   */
+  private Properties getPropertiesAsNetstedProperties(
+          Properties props, String prefix) {
+    Properties nestedProps = new Properties();
+    String nestedPropertyPrefix = prefix + ".";
+    int index = nestedPropertyPrefix.length();
+    if (props != null && props.size() > 0) {
+      Iterator<String> it = props.stringPropertyNames().iterator();
+      while (it.hasNext()) {
+        String name = it.next();
+        if (name.startsWith(nestedPropertyPrefix)){
+          String shortName = name.substring(index);
+          nestedProps.put(shortName, props.get(name));
+        }
+      }
+    }
+    return nestedProps;
+  }
+
+  @SuppressWarnings("unchecked")
+  /**
+   * Given a set of properties, load this into the current SqoopOptions
+   * instance.
+   */
+  public void loadProperties(Properties props) {
+
+    try {
+      Field [] fields = getClass().getDeclaredFields();
+      for (Field f : fields) {
+        if (f.isAnnotationPresent(StoredAsProperty.class)) {
+          Class typ = f.getType();
+          StoredAsProperty storedAs = f.getAnnotation(StoredAsProperty.class);
+          String propName = storedAs.value();
+
+          if (typ.equals(int.class)) {
+            f.setInt(this,
+                getIntProperty(props, propName, f.getInt(this)));
+          } else if (typ.equals(boolean.class)) {
+            f.setBoolean(this,
+                getBooleanProperty(props, propName, f.getBoolean(this)));
+          } else if (typ.equals(long.class)) {
+            f.setLong(this,
+                getLongProperty(props, propName, f.getLong(this)));
+          } else if (typ.equals(String.class)) {
+            f.set(this, props.getProperty(propName, (String) f.get(this)));
+          } else if (typ.equals(Integer.class)) {
+            String value = props.getProperty(
+                propName,
+                f.get(this) == null ? "null" : f.get(this).toString());
+            f.set(this, value.equals("null") ? null : new Integer(value));
+          } else if (typ.isEnum()) {
+            f.set(this, Enum.valueOf(typ,
+                props.getProperty(propName, f.get(this).toString())));
+          } else {
+            throw new RuntimeException("Could not retrieve property "
+                + propName + " for type: " + typ);
+          }
+        }
+      }
+    } catch (IllegalAccessException iae) {
+      throw new RuntimeException("Illegal access to field in property setter",
+          iae);
+    }
+
+    // Now load properties that were stored with special types, or require
+    // additional logic to set.
+
+    if (getBooleanProperty(props, "db.require.password", false)) {
+      // The user's password was stripped out from the metastore.
+      // Require that the user enter it now.
+      setPasswordFromConsole();
+    } else {
+      this.password = props.getProperty("db.password", this.password);
+    }
+
+    if (this.jarDirIsAuto) {
+      // We memoized a user-specific nonce dir for compilation to the data
+      // store.  Disregard that setting and create a new nonce dir.
+      String localUsername = System.getProperty("user.name", "unknown");
+      this.jarOutputDir = getNonceJarDir(tmpDir + "sqoop-" + localUsername
+          + "/compile");
+    }
+
+    String colListStr = props.getProperty("db.column.list", null);
+    if (null != colListStr) {
+      this.columns = listToArray(colListStr);
+    }
+
+    this.inputDelimiters = getDelimiterProperties(props,
+        "codegen.input.delimiters", this.inputDelimiters);
+    this.outputDelimiters = getDelimiterProperties(props,
+        "codegen.output.delimiters", this.outputDelimiters);
+
+    this.extraArgs = getArgArrayProperty(props, "tool.arguments",
+        this.extraArgs);
+
+    this.connectionParams =
+        getPropertiesAsNetstedProperties(props, "db.connect.params");
+
+    // Loading user mapping
+    this.mapColumnHive =
+            getPropertiesAsNetstedProperties(props, "map.column.hive");
+    this.mapColumnJava =
+            getPropertiesAsNetstedProperties(props, "map.column.java");
+
+    // Delimiters were previously memoized; don't let the tool override
+    // them with defaults.
+    this.areDelimsManuallySet = true;
+  }
+
+  /**
+   * Return a Properties instance that encapsulates all the "sticky"
+   * state of this SqoopOptions that should be written to a metastore
+   * to restore the job later.
+   */
+  public Properties writeProperties() {
+    Properties props = new Properties();
+
+    try {
+      Field [] fields = getClass().getDeclaredFields();
+      for (Field f : fields) {
+        if (f.isAnnotationPresent(StoredAsProperty.class)) {
+          Class typ = f.getType();
+          StoredAsProperty storedAs = f.getAnnotation(StoredAsProperty.class);
+          String propName = storedAs.value();
+
+          if (typ.equals(int.class)) {
+            putProperty(props, propName, Integer.toString(f.getInt(this)));
+          } else if (typ.equals(boolean.class)) {
+            putProperty(props, propName, Boolean.toString(f.getBoolean(this)));
+          } else if (typ.equals(long.class)) {
+            putProperty(props, propName, Long.toString(f.getLong(this)));
+          } else if (typ.equals(String.class)) {
+            putProperty(props, propName, (String) f.get(this));
+          } else if (typ.equals(Integer.class)) {
+            putProperty(
+                props,
+                propName,
+                f.get(this) == null ? "null" : f.get(this).toString());
+          } else if (typ.isEnum()) {
+            putProperty(props, propName, f.get(this).toString());
+          } else {
+            throw new RuntimeException("Could not set property "
+                + propName + " for type: " + typ);
+          }
+        }
+      }
+    } catch (IllegalAccessException iae) {
+      throw new RuntimeException("Illegal access to field in property setter",
+          iae);
+    }
+
+
+    if (this.getConf().getBoolean(
+        METASTORE_PASSWORD_KEY, METASTORE_PASSWORD_DEFAULT)) {
+      // If the user specifies, we may store the password in the metastore.
+      putProperty(props, "db.password", this.password);
+      putProperty(props, "db.require.password", "false");
+    } else if (this.password != null) {
+      // Otherwise, if the user has set a password, we just record
+      // a flag stating that the password will need to be reentered.
+      putProperty(props, "db.require.password", "true");
+    } else {
+      // No password saved or required.
+      putProperty(props, "db.require.password", "false");
+    }
+
+    putProperty(props, "db.column.list", arrayToList(this.columns));
+    setDelimiterProperties(props, "codegen.input.delimiters",
+        this.inputDelimiters);
+    setDelimiterProperties(props, "codegen.output.delimiters",
+        this.outputDelimiters);
+    setArgArrayProperties(props, "tool.arguments", this.extraArgs);
+
+    setPropertiesAsNestedProperties(props,
+            "db.connect.params", this.connectionParams);
+
+    setPropertiesAsNestedProperties(props,
+            "map.column.hive", this.mapColumnHive);
+    setPropertiesAsNestedProperties(props,
+            "map.column.java", this.mapColumnJava);
+    return props;
+  }
+
+  @Override
+  public Object clone() {
+    try {
+      SqoopOptions other = (SqoopOptions) super.clone();
+      if (null != columns) {
+        other.columns = Arrays.copyOf(columns, columns.length);
+      }
+
+      if (null != dbOutColumns) {
+        other.dbOutColumns = Arrays.copyOf(dbOutColumns, dbOutColumns.length);
+      }
+
+      if (null != inputDelimiters) {
+        other.inputDelimiters = (DelimiterSet) inputDelimiters.clone();
+      }
+
+      if (null != outputDelimiters) {
+        other.outputDelimiters = (DelimiterSet) outputDelimiters.clone();
+      }
+
+      if (null != conf) {
+        other.conf = new Configuration(conf);
+      }
+
+      if (null != extraArgs) {
+        other.extraArgs = Arrays.copyOf(extraArgs, extraArgs.length);
+      }
+
+      if (null != connectionParams) {
+        other.setConnectionParams(this.connectionParams);
+      }
+
+      if (null != mapColumnHive) {
+        other.mapColumnHive = (Properties) this.mapColumnHive.clone();
+      }
+
+      if (null != mapColumnJava) {
+        other.mapColumnJava = (Properties) this.mapColumnJava.clone();
+      }
+
+      return other;
+    } catch (CloneNotSupportedException cnse) {
+      // Shouldn't happen.
+      return null;
+    }
+  }
+
+  /**
+   * @return the temp directory to use; this is guaranteed to end with
+   * the file separator character (e.g., '/').
+   */
+  public String getTempDir() {
+    return this.tmpDir;
+  }
+
+  /**
+   * Return the name of a directory that does not exist before
+   * calling this method, and does exist afterward. We should be
+   * the only client of this directory. If this directory is not
+   * used during the lifetime of the JVM, schedule it to be removed
+   * when the JVM exits.
+   */
+  private static String getNonceJarDir(String tmpBase) {
+
+    // Make sure we don't loop forever in the event of a permission error.
+    final int MAX_DIR_CREATE_ATTEMPTS = 32;
+
+    if (null != curNonce) {
+      return curNonce;
+    }
+
+    File baseDir = new File(tmpBase);
+    File hashDir = null;
+
+    for (int attempts = 0; attempts < MAX_DIR_CREATE_ATTEMPTS; attempts++) {
+      hashDir = new File(baseDir, RandomHash.generateMD5String());
+      while (hashDir.exists()) {
+        hashDir = new File(baseDir, RandomHash.generateMD5String());
+      }
+
+      if (hashDir.mkdirs()) {
+        // We created the directory. Use it.
+        // If this directory is not actually filled with files, delete it
+        // when the JVM quits.
+        hashDir.deleteOnExit();
+        break;
+      }
+    }
+
+    if (hashDir == null || !hashDir.exists()) {
+      throw new RuntimeException("Could not create temporary directory: "
+          + hashDir + "; check for a directory permissions issue on /tmp.");
+    }
+
+    LOG.debug("Generated nonce dir: " + hashDir.toString());
+    SqoopOptions.curNonce = hashDir.toString();
+    return SqoopOptions.curNonce;
+  }
+
+  /**
+   * Reset the nonce directory and force a new one to be generated. This
+   * method is intended to be used only by multiple unit tests that want
+   * to isolate themselves from one another. It should not be called
+   * during normal Sqoop execution.
+   */
+  public static void clearNonceDir() {
+    LOG.warn("Clearing nonce directory");
+    SqoopOptions.curNonce = null;
+  }
+
+  private void initDefaults(Configuration baseConfiguration) {
+    // first, set the true defaults if nothing else happens.
+    // default action is to run the full pipeline.
+    this.hadoopHome = System.getenv("HADOOP_HOME");
+
+    // Set this with $HIVE_HOME, but -Dhive.home can override.
+    this.hiveHome = System.getenv("HIVE_HOME");
+    this.hiveHome = System.getProperty("hive.home", this.hiveHome);
+
+    this.inputDelimiters = new DelimiterSet(
+        DelimiterSet.NULL_CHAR, DelimiterSet.NULL_CHAR,
+        DelimiterSet.NULL_CHAR, DelimiterSet.NULL_CHAR, false);
+    this.outputDelimiters = new DelimiterSet();
+
+    // Set this to cwd, but -Dsqoop.src.dir can override.
+    this.codeOutputDir = System.getProperty("sqoop.src.dir", ".");
+
+    String myTmpDir = System.getProperty("test.build.data", "/tmp/");
+    if (!myTmpDir.endsWith(File.separator)) {
+      myTmpDir = myTmpDir + File.separator;
+    }
+
+    this.tmpDir = myTmpDir;
+    String localUsername = System.getProperty("user.name", "unknown");
+    this.jarOutputDir = getNonceJarDir(tmpDir + "sqoop-" + localUsername
+        + "/compile");
+    this.jarDirIsAuto = true;
+    this.layout = FileLayout.TextFile;
+
+    this.areDelimsManuallySet = false;
+
+    this.numMappers = DEFAULT_NUM_MAPPERS;
+    this.useCompression = false;
+    this.compressionCodec = null;
+    this.directSplitSize = 0;
+
+    this.maxInlineLobSize = LargeObjectLoader.DEFAULT_MAX_LOB_LENGTH;
+
+    // Don't set a default value for fetchsize. This allows a JDBCManager to
+    // provide a database-specific default, if no value is provided by the
+    // user.
+    this.fetchSize = null;
+
+    if (null == baseConfiguration) {
+      this.conf = new Configuration();
+    } else {
+      this.conf = baseConfiguration;
+    }
+
+    this.extraArgs = null;
+
+    this.dbOutColumns = null;
+
+    this.incrementalMode = IncrementalMode.None;
+
+    this.updateMode = UpdateMode.UpdateOnly;
+
+    // Creating instances for user specific mapping
+    this.mapColumnHive = new Properties();
+    this.mapColumnJava = new Properties();
+  }
+
+  /**
+   * Given a string containing a single character or an escape sequence
+   * representing a char, return that char itself.
+   *
+   * Normal literal characters return themselves: "x" -&gt; 'x', etc.
+   * Strings containing a '\' followed by one of t, r, n, or b escape to the
+   * usual character as seen in Java: "\n" -&gt; (newline), etc.
+   *
+   * Strings like "\0ooo" return the character specified by the octal sequence
+   * 'ooo'. Strings like "\0xhhh" or "\0Xhhh" return the character specified by
+   * the hex sequence 'hhh'.
+   *
+   * If the input string contains leading or trailing spaces, these are
+   * ignored.
+   */
+  public static char toChar(String charish) throws InvalidOptionsException {
+    if (null == charish || charish.length() == 0) {
+      throw new InvalidOptionsException("Character argument expected."
+          + "\nTry --help for usage instructions.");
+    }
+
+    if (charish.startsWith("\\0x") || charish.startsWith("\\0X")) {
+      if (charish.length() == 3) {
+        throw new InvalidOptionsException(
+            "Base-16 value expected for character argument."
+            + "\nTry --help for usage instructions.");
+      } else {
+        String valStr = charish.substring(3);
+        int val = Integer.parseInt(valStr, 16);
+        return (char) val;
+      }
+    } else if (charish.startsWith("\\0")) {
+      if (charish.equals("\\0")) {
+        // it's just '\0', which we can take as shorthand for nul.
+        return DelimiterSet.NULL_CHAR;
+      } else {
+        // it's an octal value.
+        String valStr = charish.substring(2);
+        int val = Integer.parseInt(valStr, 8);
+        return (char) val;
+      }
+    } else if (charish.startsWith("\\")) {
+      if (charish.length() == 1) {
+        // it's just a '\'. Keep it literal.
+        return '\\';
+      } else if (charish.length() > 2) {
+        // we don't have any 3+ char escape strings.
+        throw new InvalidOptionsException(
+            "Cannot understand character argument: " + charish
+            + "\nTry --help for usage instructions.");
+      } else {
+        // this is some sort of normal 1-character escape sequence.
+        char escapeWhat = charish.charAt(1);
+        switch(escapeWhat) {
+        case 'b':
+          return '\b';
+        case 'n':
+          return '\n';
+        case 'r':
+          return '\r';
+        case 't':
+          return '\t';
+        case '\"':
+          return '\"';
+        case '\'':
+          return '\'';
+        case '\\':
+          return '\\';
+        default:
+          throw new InvalidOptionsException(
+              "Cannot understand character argument: " + charish
+              + "\nTry --help for usage instructions.");
+        }
+      }
+    } else {
+      // it's a normal character.
+      if (charish.length() > 1) {
+        LOG.warn("Character argument " + charish + " has multiple characters; "
+            + "only the first will be used.");
+      }
+
+      return charish.charAt(0);
+    }
+  }
+
+  /**
+   * Get the temporary directory; guaranteed to end in File.separator
+   * (e.g., '/').
+   */
+  public String getTmpDir() {
+    return tmpDir;
+  }
+
+  public void setTmpDir(String tmp) {
+    this.tmpDir = tmp;
+  }
+
+  public String getConnectString() {
+    return connectString;
+  }
+
+  public void setConnectString(String connectStr) {
+    this.connectString = connectStr;
+  }
+
+  public String getTableName() {
+    return tableName;
+  }
+
+  public void setTableName(String table) {
+    this.tableName = table;
+  }
+
+  public String getStagingTableName() {
+    return stagingTableName;
+  }
+
+  public void setStagingTableName(String stagingTable) {
+    this.stagingTableName = stagingTable;
+  }
+
+  public boolean doClearStagingTable() {
+    return clearStagingTable;
+  }
+
+  public void setClearStagingTable(boolean clear) {
+    clearStagingTable = clear;
+  }
+
+  public String getExportDir() {
+    return exportDir;
+  }
+
+  public void setExportDir(String dir) {
+    this.exportDir = dir;
+  }
+
+  public String getExistingJarName() {
+    return existingJarFile;
+  }
+
+  public void setExistingJarName(String jarFile) {
+    this.existingJarFile = jarFile;
+  }
+
+  public String[] getColumns() {
+    if (null == columns) {
+      return null;
+    } else {
+      return Arrays.copyOf(columns, columns.length);
+    }
+  }
+
+  public void setColumns(String [] cols) {
+    if (null == cols) {
+      this.columns = null;
+    } else {
+      this.columns = Arrays.copyOf(cols, cols.length);
+    }
+  }
+
+  public String getSplitByCol() {
+    return splitByCol;
+  }
+
+  public void setSplitByCol(String splitBy) {
+    this.splitByCol = splitBy;
+  }
+
+  public String getWhereClause() {
+    return whereClause;
+  }
+
+  public void setWhereClause(String where) {
+    this.whereClause = where;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String user) {
+    this.username = user;
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  protected void parseColumnMapping(String mapping,
+          Properties output) {
+    output.clear();
+    String[] maps = mapping.split(",");
+    for(String map : maps) {
+      String[] details = map.split("=");
+      output.put(details[0], details[1]);
+    }
+  }
+
+  public void setMapColumnHive(String mapColumn) {
+    parseColumnMapping(mapColumn, mapColumnHive);
+  }
+
+  public void setMapColumn(String mapColumn) {
+    parseColumnMapping(mapColumn, mapColumnJava);
+  }
+
+  public Properties getMapColumnHive() {
+    return mapColumnHive;
+  }
+
+  public Properties getMapColumnJava() {
+    return mapColumnJava;
+  }
+
+  /**
+   * Allow the user to enter his password on the console without printing
+   * characters.
+   * @return the password as a string
+   */
+  private String securePasswordEntry() {
+    return new String(System.console().readPassword("Enter password: "));
+  }
+
+  /**
+   * Set the password in this SqoopOptions from the console without printing
+   * characters.
+   */
+  public void setPasswordFromConsole() {
+    this.password = securePasswordEntry();
+  }
+
+  public void setPassword(String pass) {
+    this.password = pass;
+  }
+
+  public boolean isDirect() {
+    return direct;
+  }
+
+  public void setDirectMode(boolean isDirect) {
+    this.direct = isDirect;
+  }
+
+  /**
+   * @return true if underlying statements to be executed in batch mode,
+   * or false if to be executed in a single multirow statement.
+   */
+  public boolean isBatchMode() {
+    return batchMode;
+  }
+
+  public void setBatchMode(boolean mode) {
+    this.batchMode = mode;
+  }
+
+  /**
+   * @return the number of map tasks to use for import.
+   */
+  public int getNumMappers() {
+    return this.numMappers;
+  }
+
+  public void setNumMappers(int m) {
+    this.numMappers = m;
+  }
+
+  /**
+   * @return the user-specified absolute class name for the table.
+   */
+  public String getClassName() {
+    return className;
+  }
+
+  public void setClassName(String name) {
+    this.className = name;
+  }
+
+  /**
+   * @return the user-specified package to prepend to table names via
+   * --package-name.
+   */
+  public String getPackageName() {
+    return packageName;
+  }
+
+  public void setPackageName(String name) {
+    this.packageName = name;
+  }
+
+  public String getHiveHome() {
+    return hiveHome;
+  }
+
+  public void setHiveHome(String home) {
+    this.hiveHome = home;
+  }
+
+  /** @return true if we should import the table into Hive. */
+  public boolean doHiveImport() {
+    return hiveImport;
+  }
+
+  public void setHiveImport(boolean doImport) {
+    this.hiveImport = doImport;
+  }
+
+  /**
+   * @return the user-specified option to overwrite existing table in hive.
+   */
+  public boolean doOverwriteHiveTable() {
+    return overwriteHiveTable;
+  }
+
+  public void setOverwriteHiveTable(boolean overwrite) {
+    this.overwriteHiveTable = overwrite;
+  }
+
+  /**
+   * @return the user-specified option to modify fields to drop hive delimiters
+   */
+  public boolean doHiveDropDelims() {
+    return hiveDropDelims;
+  }
+
+  public void setHiveDropDelims(boolean dropHiveDelims) {
+    this.hiveDropDelims = dropHiveDelims;
+  }
+
+  /**
+   * @return the user-specified option to specify the replacement string
+   *         for hive delimeters
+   */
+  public String getHiveDelimsReplacement() {
+    return hiveDelimsReplacement;
+  }
+
+  public void setHiveDelimsReplacement(String replacement) {
+    this.hiveDelimsReplacement = replacement;
+  }
+
+  /**
+   * @return the user-specified option to specify sqoop's behavior during
+   *         target table creation if the table exists.
+   */
+  public boolean doFailIfHiveTableExists() {
+    return failIfHiveTableExists;
+  }
+
+  public void setFailIfHiveTableExists(boolean fail) {
+    this.failIfHiveTableExists = fail;
+  }
+
+  /**
+   * @return location where .java files go; guaranteed to end with '/'.
+   */
+  public String getCodeOutputDir() {
+    if (codeOutputDir.endsWith(File.separator)) {
+      return codeOutputDir;
+    } else {
+      return codeOutputDir + File.separator;
+    }
+  }
+
+  public void setCodeOutputDir(String outputDir) {
+    this.codeOutputDir = outputDir;
+  }
+
+  /**
+   * @return location where .jar and .class files go; guaranteed to end with
+   * '/'.
+   */
+  public String getJarOutputDir() {
+    if (jarOutputDir.endsWith(File.separator)) {
+      return jarOutputDir;
+    } else {
+      return jarOutputDir + File.separator;
+    }
+  }
+
+  public void setJarOutputDir(String outDir) {
+    this.jarOutputDir = outDir;
+    this.jarDirIsAuto = false;
+  }
+
+  /**
+   * Return the value of $HADOOP_HOME.
+   * @return $HADOOP_HOME, or null if it's not set.
+   */
+  public String getHadoopHome() {
+    return hadoopHome;
+  }
+
+  public void setHadoopHome(String home) {
+    this.hadoopHome = home;
+  }
+
+  /**
+   * @return a sql command to execute and exit with.
+   */
+  public String getSqlQuery() {
+    return sqlQuery;
+  }
+
+  public void setSqlQuery(String sqlStatement) {
+    this.sqlQuery = sqlStatement;
+  }
+
+  public String getBoundaryQuery() {
+    return boundaryQuery;
+  }
+
+  public void setBoundaryQuery(String sqlStatement) {
+    boundaryQuery = sqlStatement;
+  }
+
+  /**
+   * @return The JDBC driver class name specified with --driver.
+   */
+  public String getDriverClassName() {
+    return driverClassName;
+  }
+
+  public void setDriverClassName(String driverClass) {
+    this.driverClassName = driverClass;
+  }
+
+  /**
+   * @return the base destination path for table uploads.
+   */
+  public String getWarehouseDir() {
+    return warehouseDir;
+  }
+
+  public void setWarehouseDir(String warehouse) {
+    this.warehouseDir = warehouse;
+  }
+
+  public String getTargetDir() {
+    return this.targetDir;
+  }
+
+  public void setTargetDir(String dir) {
+    this.targetDir = dir;
+  }
+
+  public void setAppendMode(boolean doAppend) {
+    this.append = doAppend;
+  }
+
+  public boolean isAppendMode() {
+    return this.append;
+  }
+
+  /**
+   * @return the destination file format
+   */
+  public FileLayout getFileLayout() {
+    return this.layout;
+  }
+
+  public void setFileLayout(FileLayout fileLayout) {
+    this.layout = fileLayout;
+  }
+
+  /**
+   * @return the field delimiter to use when parsing lines. Defaults to the
+   * field delim to use when printing lines.
+   */
+  public char getInputFieldDelim() {
+    char f = inputDelimiters.getFieldsTerminatedBy();
+    if (f == DelimiterSet.NULL_CHAR) {
+      return this.outputDelimiters.getFieldsTerminatedBy();
+    } else {
+      return f;
+    }
+  }
+
+  /**
+   * Set the field delimiter to use when parsing lines.
+   */
+  public void setInputFieldsTerminatedBy(char c) {
+    this.inputDelimiters.setFieldsTerminatedBy(c);
+  }
+
+  /**
+   * @return the record delimiter to use when parsing lines. Defaults to the
+   * record delim to use when printing lines.
+   */
+  public char getInputRecordDelim() {
+    char r = inputDelimiters.getLinesTerminatedBy();
+    if (r == DelimiterSet.NULL_CHAR) {
+      return this.outputDelimiters.getLinesTerminatedBy();
+    } else {
+      return r;
+    }
+  }
+
+  /**
+   * Set the record delimiter to use when parsing lines.
+   */
+  public void setInputLinesTerminatedBy(char c) {
+    this.inputDelimiters.setLinesTerminatedBy(c);
+  }
+
+  /**
+   * @return the character that may enclose fields when parsing lines.
+   * Defaults to the enclosing-char to use when printing lines.
+   */
+  public char getInputEnclosedBy() {
+    char c = inputDelimiters.getEnclosedBy();
+    if (c == DelimiterSet.NULL_CHAR) {
+      return this.outputDelimiters.getEnclosedBy();
+    } else {
+      return c;
+    }
+  }
+
+  /**
+   * Set the enclosed-by character to use when parsing lines.
+   */
+  public void setInputEnclosedBy(char c) {
+    this.inputDelimiters.setEnclosedBy(c);
+  }
+
+  /**
+   * @return the escape character to use when parsing lines. Defaults to the
+   * escape character used when printing lines.
+   */
+  public char getInputEscapedBy() {
+    char c = inputDelimiters.getEscapedBy();
+    if (c == DelimiterSet.NULL_CHAR) {
+      return this.outputDelimiters.getEscapedBy();
+    } else {
+      return c;
+    }
+  }
+
+  /**
+   * Set the escaped-by character to use when parsing lines.
+   */
+  public void setInputEscapedBy(char c) {
+    this.inputDelimiters.setEscapedBy(c);
+  }
+
+  /**
+   * @return true if fields must be enclosed by the --enclosed-by character
+   * when parsing.  Defaults to false. Set true when --input-enclosed-by is
+   * used.
+   */
+  public boolean isInputEncloseRequired() {
+    char c = this.inputDelimiters.getEnclosedBy();
+    if (c == DelimiterSet.NULL_CHAR) {
+      return this.outputDelimiters.isEncloseRequired();
+    } else {
+      return this.inputDelimiters.isEncloseRequired();
+    }
+  }
+
+  /**
+   * If true, then all input fields are expected to be enclosed by the
+   * enclosed-by character when parsing.
+   */
+  public void setInputEncloseRequired(boolean required) {
+    this.inputDelimiters.setEncloseRequired(required);
+  }
+
+  /**
+   * @return the character to print between fields when importing them to
+   * text.
+   */
+  public char getOutputFieldDelim() {
+    return this.outputDelimiters.getFieldsTerminatedBy();
+  }
+
+  /**
+   * Set the field delimiter to use when formatting lines.
+   */
+  public void setFieldsTerminatedBy(char c) {
+    this.outputDelimiters.setFieldsTerminatedBy(c);
+  }
+
+
+  /**
+   * @return the character to print between records when importing them to
+   * text.
+   */
+  public char getOutputRecordDelim() {
+    return this.outputDelimiters.getLinesTerminatedBy();
+  }
+
+  /**
+   * Set the record delimiter to use when formatting lines.
+   */
+  public void setLinesTerminatedBy(char c) {
+    this.outputDelimiters.setLinesTerminatedBy(c);
+  }
+
+  /**
+   * @return a character which may enclose the contents of fields when
+   * imported to text.
+   */
+  public char getOutputEnclosedBy() {
+    return this.outputDelimiters.getEnclosedBy();
+  }
+
+  /**
+   * Set the enclosed-by character to use when formatting lines.
+   */
+  public void setEnclosedBy(char c) {
+    this.outputDelimiters.setEnclosedBy(c);
+  }
+
+  /**
+   * @return a character which signifies an escape sequence when importing to
+   * text.
+   */
+  public char getOutputEscapedBy() {
+    return this.outputDelimiters.getEscapedBy();
+  }
+
+  /**
+   * Set the escaped-by character to use when formatting lines.
+   */
+  public void setEscapedBy(char c) {
+    this.outputDelimiters.setEscapedBy(c);
+  }
+
+  /**
+   * @return true if fields imported to text must be enclosed by the
+   * EnclosedBy char.  default is false; set to true if --enclosed-by is used
+   * instead of --optionally-enclosed-by.
+   */
+  public boolean isOutputEncloseRequired() {
+    return this.outputDelimiters.isEncloseRequired();
+  }
+
+  /**
+   * If true, then the enclosed-by character will be applied to all fields,
+   * even if internal characters do not need enclosed-by protection.
+   */
+  public void setOutputEncloseRequired(boolean required) {
+    this.outputDelimiters.setEncloseRequired(required);
+  }
+
+  /**
+   * @return the set of delimiters used for formatting output records.
+   */
+  public DelimiterSet getOutputDelimiters() {
+    return this.outputDelimiters.copy();
+  }
+
+  /**
+   * Set the complete set of delimiters to use for output formatting.
+   */
+  public void setOutputDelimiters(DelimiterSet delimiters) {
+    this.outputDelimiters = delimiters.copy();
+  }
+
+  /**
+   * @return the set of delimiters used for parsing the input.
+   * This may include values implicitly set by the output delimiters.
+   */
+  public DelimiterSet getInputDelimiters() {
+    return new DelimiterSet(
+        getInputFieldDelim(),
+        getInputRecordDelim(),
+        getInputEnclosedBy(),
+        getInputEscapedBy(),
+        isInputEncloseRequired());
+  }
+
+  /**
+   * @return true if the user wants imported results to be compressed.
+   */
+  public boolean shouldUseCompression() {
+    return this.useCompression || compressionCodec != null;
+  }
+
+  public void setUseCompression(boolean compress) {
+    this.useCompression = compress;
+  }
+
+  /**
+   * @return the name of the compression codec to use when importing.
+   * E.g. <code>org.apache.hadoop.io.compress.GzipCodec</code>.
+   */
+  public String getCompressionCodec() {
+    return compressionCodec;
+  }
+
+  public void setCompressionCodec(String codec) {
+    this.compressionCodec = codec;
+  }
+  /**
+   * @return the name of the destination table when importing to Hive.
+   */
+  public String getHiveTableName() {
+    if (null != this.hiveTableName) {
+      return this.hiveTableName;
+    } else {
+      return this.tableName;
+    }
+  }
+
+  public void setHiveTableName(String name) {
+    this.hiveTableName = name;
+  }
+
+  public String getHivePartitionKey() {
+    return hivePartitionKey;
+  }
+
+  public void setHivePartitionKey(String hpk) {
+    this.hivePartitionKey = hpk;
+  }
+
+  public String getHivePartitionValue() {
+    return hivePartitionValue;
+  }
+
+  public void setHivePartitionValue(String hpv) {
+    this.hivePartitionValue = hpv;
+  }
+
+  /**
+   * @return the file size to split by when using --direct mode.
+   */
+  public long getDirectSplitSize() {
+    return this.directSplitSize;
+  }
+
+  public void setDirectSplitSize(long splitSize) {
+    this.directSplitSize = splitSize;
+  }
+
+  /**
+   * @return the max size of a LOB before we spill to a separate file.
+   */
+  public long getInlineLobLimit() {
+    return this.maxInlineLobSize;
+  }
+
+  public void setInlineLobLimit(long limit) {
+    this.maxInlineLobSize = limit;
+  }
+
+  public Integer getFetchSize() {
+    return this.fetchSize;
+  }
+
+  public void setFetchSize(Integer size) {
+    this.fetchSize = size;
+  }
+
+  /**
+   * @return true if the delimiters have been explicitly set by the user.
+   */
+  public boolean explicitDelims() {
+    return areDelimsManuallySet;
+  }
+
+  /**
+   * Flag the delimiter settings as explicit user settings, or implicit.
+   */
+  public void setExplicitDelims(boolean explicit) {
+    this.areDelimsManuallySet = explicit;
+  }
+
+  public Configuration getConf() {
+    return conf;
+  }
+
+  public void setConf(Configuration config) {
+    this.conf = config;
+  }
+
+  /**
+   * @return command-line arguments after a '-'.
+   */
+  public String [] getExtraArgs() {
+    if (extraArgs == null) {
+      return null;
+    }
+
+    String [] out = new String[extraArgs.length];
+    for (int i = 0; i < extraArgs.length; i++) {
+      out[i] = extraArgs[i];
+    }
+    return out;
+  }
+
+  public void setExtraArgs(String [] args) {
+    if (null == args) {
+      this.extraArgs = null;
+      return;
+    }
+
+    this.extraArgs = new String[args.length];
+    for (int i = 0; i < args.length; i++) {
+      this.extraArgs[i] = args[i];
+    }
+  }
+
+  /**
+   * Set the name of the column to be used in the WHERE clause of an
+   * UPDATE-based export process.
+   */
+  public void setUpdateKeyCol(String colName) {
+    this.updateKeyCol = colName;
+  }
+
+  /**
+   * @return the column which is the key column in a table to be exported
+   * in update mode.
+   */
+  public String getUpdateKeyCol() {
+    return this.updateKeyCol;
+  }
+
+  /**
+   * Set "UpdateOnly" to silently ignore new rows during update export.
+   * Set "AllowInsert" to insert new rows during update export.
+   */
+  public void setUpdateMode(UpdateMode mode) {
+    this.updateMode = mode;
+  }
+
+  /**
+   * @return how to handle new rows found in update export.
+   */
+  public UpdateMode getUpdateMode() {
+    return updateMode;
+  }
+
+  /**
+   * @return an ordered list of column names. The code generator should
+   * generate the DBWritable.write(PreparedStatement) method with columns
+   * exporting in this order, if it is non-null.
+   */
+  public String [] getDbOutputColumns() {
+    if (null != dbOutColumns) {
+      return Arrays.copyOf(this.dbOutColumns, dbOutColumns.length);
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * Set the order in which columns should be serialized by the generated
+   * DBWritable.write(PreparedStatement) method. Setting this to null will use
+   * the "natural order" of the database table.
+   *
+   * TODO: Expose this setter via the command-line arguments for the codegen
+   * module. That would allow users to export to tables with columns in a
+   * different physical order than the file layout in HDFS.
+   */
+  public void setDbOutputColumns(String [] outCols) {
+    if (null == outCols) {
+      this.dbOutColumns = null;
+    } else {
+      this.dbOutColumns = Arrays.copyOf(outCols, outCols.length);
+    }
+  }
+
+  /**
+   * Set whether we should create missing HBase tables.
+   */
+  public void setCreateHBaseTable(boolean create) {
+    this.hbaseCreateTable = create;
+  }
+
+  /**
+   * Returns true if we should create HBase tables/column families
+   * that are missing.
+   */
+  public boolean getCreateHBaseTable() {
+    return this.hbaseCreateTable;
+  }
+
+  /**
+   * Sets the HBase target column family.
+   */
+  public void setHBaseColFamily(String colFamily) {
+    this.hbaseColFamily = colFamily;
+  }
+
+  /**
+   * Gets the HBase import target column family.
+   */
+  public String getHBaseColFamily() {
+    return this.hbaseColFamily;
+  }
+
+  /**
+   * Gets the column to use as the row id in an hbase import.
+   * If null, use the primary key column.
+   */
+  public String getHBaseRowKeyColumn() {
+    return this.hbaseRowKeyCol;
+  }
+
+  /**
+   * Sets the column to use as the row id in an hbase import.
+   */
+  public void setHBaseRowKeyColumn(String col) {
+    this.hbaseRowKeyCol = col;
+  }
+
+  /**
+   * Gets the target HBase table name, if any.
+   */
+  public String getHBaseTable() {
+    return this.hbaseTable;
+  }
+
+  /**
+   * Sets the target HBase table name for an import.
+   */
+  public void setHBaseTable(String table) {
+    this.hbaseTable = table;
+  }
+
+  /**
+   * Set the column of the import source table to check for incremental import
+   * state.
+   */
+  public void setIncrementalTestColumn(String colName) {
+    this.incrementalTestCol = colName;
+  }
+
+  /**
+   * Return the name of the column of the import source table
+   * to check for incremental import state.
+   */
+  public String getIncrementalTestColumn() {
+    return this.incrementalTestCol;
+  }
+
+  /**
+   * Set the incremental import mode to use.
+   */
+  public void setIncrementalMode(IncrementalMode mode) {
+    this.incrementalMode = mode;
+  }
+
+  /**
+   * Get the incremental import mode to use.
+   */
+  public IncrementalMode getIncrementalMode() {
+    return this.incrementalMode;
+  }
+
+  /**
+   * Set the last imported value of the incremental import test column.
+   */
+  public void setIncrementalLastValue(String lastVal) {
+    this.incrementalLastValue = lastVal;
+  }
+
+  /**
+   * Get the last imported value of the incremental import test column.
+   */
+  public String getIncrementalLastValue() {
+    return this.incrementalLastValue;
+  }
+
+  /**
+   * Set the name of the saved job this SqoopOptions belongs to.
+   */
+  public void setJobName(String job) {
+    this.jobName = job;
+  }
+
+  /**
+   * Get the name of the saved job this SqoopOptions belongs to.
+   */
+  public String getJobName() {
+    return this.jobName;
+  }
+
+  /**
+   * Set the JobStorage descriptor used to open the saved job
+   * this SqoopOptions belongs to.
+   */
+  public void setStorageDescriptor(Map<String, String> descriptor) {
+    this.jobStorageDescriptor = descriptor;
+  }
+
+  /**
+   * Get the JobStorage descriptor used to open the saved job
+   * this SqoopOptions belongs to.
+   */
+  public Map<String, String> getStorageDescriptor() {
+    return this.jobStorageDescriptor;
+  }
+
+  /**
+   * Return the parent instance this SqoopOptions is derived from.
+   */
+  public SqoopOptions getParent() {
+    return this.parent;
+  }
+
+  /**
+   * Set the parent instance this SqoopOptions is derived from.
+   */
+  public void setParent(SqoopOptions options) {
+    this.parent = options;
+  }
+
+  /**
+   * Set the path name used to do an incremental import of old data
+   * which will be combined with an "new" dataset.
+   */
+  public void setMergeOldPath(String path) {
+    this.mergeOldPath = path;
+  }
+
+  /**
+   * Return the path name used to do an incremental import of old data
+   * which will be combined with an "new" dataset.
+   */
+  public String getMergeOldPath() {
+    return this.mergeOldPath;
+  }
+
+  /**
+   * Set the path name used to do an incremental import of new data
+   * which will be combined with an "old" dataset.
+   */
+  public void setMergeNewPath(String path) {
+    this.mergeNewPath = path;
+  }
+
+  /**
+   * Return the path name used to do an incremental import of new data
+   * which will be combined with an "old" dataset.
+   */
+  public String getMergeNewPath() {
+    return this.mergeNewPath;
+  }
+
+  /**
+   * Set the name of the column used to merge an old and new dataset.
+   */
+  public void setMergeKeyCol(String col) {
+    this.mergeKeyCol = col;
+  }
+
+  /**
+   * Return the name of the column used to merge an old and new dataset.
+   */
+  public String getMergeKeyCol() {
+    return this.mergeKeyCol;
+  }
+
+  public void setConnManagerClassName(String connManagerClass) {
+    this.connManagerClassName = connManagerClass;
+  }
+
+  public String getConnManagerClassName() {
+    return connManagerClassName;
+  }
+
+  /** @return the SqoopTool that is operating this session. */
+  public SqoopTool getActiveSqoopTool() {
+    return activeSqoopTool;
+  }
+
+  public void setActiveSqoopTool(SqoopTool tool) {
+    activeSqoopTool = tool;
+  }
+
+  public void setNullStringValue(String nullString) {
+    this.nullStringValue = nullString;
+  }
+
+  public String getNullStringValue() {
+    return nullStringValue;
+  }
+
+  public void setInNullStringValue(String inNullString) {
+    this.inNullStringValue = inNullString;
+  }
+
+  public String getInNullStringValue() {
+    return inNullStringValue;
+  }
+
+  public void setNullNonStringValue(String nullNonString) {
+    this.nullNonStringValue = nullNonString;
+  }
+
+  public String getNullNonStringValue() {
+    return nullNonStringValue;
+  }
+
+  public void setInNullNonStringValue(String inNullNonString) {
+    this.inNullNonStringValue = inNullNonString;
+  }
+
+  public String getInNullNonStringValue() {
+    return inNullNonStringValue;
+  }
+
+  public void setConnectionParams(Properties params) {
+    connectionParams = new Properties();
+    connectionParams.putAll(params);
+  }
+
+  public Properties getConnectionParams() {
+    return connectionParams;
+  }
+}
+
index 5f01b04..efe468a 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index c79ecfd..4e9bcab 100644 (file)
@@ -17,7 +17,6 @@
  */
 package org.apache.sqoop.lib;
 
-
 /**
  * Encapsulates a set of delimiters used to encode a record.
  */
@@ -63,6 +62,19 @@ public class DelimiterSet implements Cloneable {
   }
 
   /**
+   * Identical to clone() but does not throw spurious exceptions.
+   * @return a new copy of this same set of delimiters.
+   */
+  public DelimiterSet copy() {
+    try {
+      return (DelimiterSet) clone();
+    } catch (CloneNotSupportedException cnse) {
+      // Should never happen for DelimiterSet.
+      return null;
+    }
+  }
+
+  /**
    * Sets the fields-terminated-by character.
    */
   public void setFieldsTerminatedBy(char f) {
index 4381641..667eb04 100644 (file)
@@ -150,5 +150,11 @@ public class PostgresqlManager
   private String escapeLiteral(String literal) {
     return literal.replace("'", "''");
   }
+
+  @Override
+  protected String getCurTimestampQuery() {
+    return "SELECT CURRENT_TIMESTAMP";
+  }
+
 }
 
index 959b60a..1f0cb6a 100644 (file)
@@ -58,7 +58,8 @@ public class AvroExportMapper
 
   private static final String BIG_DECIMAL_TYPE = "java.math.BigDecimal";
 
-  public static final String AVRO_COLUMN_TYPES_MAP = "sqoop.avro.column.types.map";
+  public static final String AVRO_COLUMN_TYPES_MAP =
+      "sqoop.avro.column.types.map";
 
   private MapWritable columnTypes;
   private SqoopRecord recordImpl;
index 559edd2..72068a7 100644 (file)
@@ -24,7 +24,6 @@ import org.apache.hadoop.io.NullWritable;
 import org.apache.hadoop.mapreduce.InputSplit;
 import org.apache.hadoop.mapreduce.RecordReader;
 import org.apache.hadoop.mapreduce.TaskAttemptContext;
-import com.cloudera.sqoop.mapreduce.DataDrivenImportJob;
 import com.cloudera.sqoop.mapreduce.db.DataDrivenDBInputFormat;
 
 /**
index d02a350..fec34f2 100644 (file)
@@ -32,11 +32,15 @@ import org.apache.hadoop.mapreduce.RecordWriter;
 import org.apache.hadoop.mapreduce.TaskAttemptContext;
 import org.apache.hadoop.util.*;
 
-/** An {@link OutputFormat} that writes plain text files.
+/**
+ * An {@link OutputFormat} that writes plain text files.
  * Only writes the key. Does not write any delimiter/newline after the key.
  */
 public class RawKeyTextOutputFormat<K, V> extends FileOutputFormat<K, V> {
 
+  /**
+   * RecordWriter to write to plain text files.
+   */
   public static class RawKeyRecordWriter<K, V> extends RecordWriter<K, V> {
 
     private static final String UTF8 = "UTF-8";
index 7a57d8b..8c11bd3 100644 (file)
@@ -25,7 +25,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.mapreduce.lib.db.DBWritable;
 
 import com.cloudera.sqoop.mapreduce.db.DBInputFormat.NullDBWritable;
-import com.cloudera.sqoop.mapreduce.db.DBOutputFormat;
 
 /**
  * A container for configuration property names for jobs with DB input/output.
index 1756df6..71a50d2 100644 (file)
@@ -31,6 +31,9 @@ import com.cloudera.sqoop.config.ConfigurationHelper;
 import com.cloudera.sqoop.mapreduce.db.DBSplitter;
 import com.cloudera.sqoop.mapreduce.db.DataDrivenDBInputFormat;
 
+/**
+ * Implement DBSplitter over floating-point values.
+ */
 public class FloatSplitter implements DBSplitter  {
 
   private static final Log LOG = LogFactory.getLog(FloatSplitter.class);
index 12011e7..8e7a096 100644 (file)
@@ -113,7 +113,7 @@ public class IntegerSplitter implements DBSplitter  {
      * [8, 12)
      * [12, 18] note the closed interval for the last split.
      */
-    protected List<Long> split(long numSplits, long minVal, long maxVal)
+    public List<Long> split(long numSplits, long minVal, long maxVal)
         throws SQLException {
 
       List<Long> splits = new ArrayList<Long>();
index f1d73d4..6c512aa 100644 (file)
@@ -142,7 +142,7 @@ public class TextSplitter extends BigDecimalSplitter {
     return splits;
   }
 
-  protected List<String> split(int numSplits, String minString,
+  public List<String> split(int numSplits, String minString,
       String maxString, String commonPrefix) throws SQLException {
 
     BigDecimal minVal = stringToBigDecimal(minString);
@@ -183,7 +183,7 @@ public class TextSplitter extends BigDecimalSplitter {
    * Return a BigDecimal representation of string 'str' suitable for use in a
    * numerically-sorting order.
    */
-  protected BigDecimal stringToBigDecimal(String str) {
+  public BigDecimal stringToBigDecimal(String str) {
     // Start with 1/65536 to compute the first digit.
     BigDecimal curPlace = ONE_PLACE;
     BigDecimal result = BigDecimal.ZERO;
@@ -208,7 +208,7 @@ public class TextSplitter extends BigDecimalSplitter {
    * Convert that back into a char and create a string out of these until we
    * have no data left.
    */
-  protected String bigDecimalToString(BigDecimal bd) {
+  public String bigDecimalToString(BigDecimal bd) {
     BigDecimal cur = bd.stripTrailingZeros();
     StringBuilder sb = new StringBuilder();
 
index 19fd9f7..49e3031 100644 (file)
@@ -32,7 +32,7 @@ import org.apache.hadoop.conf.Configuration;
  * JobStorage implementation that auto-configures an HSQLDB
  * local-file-based instance to hold jobs.
  */
-public class AutoHsqldbStorage 
+public class AutoHsqldbStorage
     extends com.cloudera.sqoop.metastore.hsqldb.HsqldbJobStorage {
 
   public static final Log LOG = LogFactory.getLog(
index a7719b9..0a41408 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 305be46..6d2dec5 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 5432414..ecde08c 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 6a77132..a16bb5e 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 1eb9b71..dafebb4 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index ba579ba..f6594ff 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 52bc472..76df6cf 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index b9d69b3..e6561e9 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 94e1a2b..ed66b4a 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index cd18a3a..7016826 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index fd5541a..db790ce 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index dbd53e4..fd4275d 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index b0d3b8a..dc82de2 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 0c9f88e..4020559 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index a4b85c7..0030373 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index d925dbf..893b388 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index e4bb67f..4b869e2 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 0685d8b..f5c30f3 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index dfc6f5b..3690b3a 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index d8789ae..5010cf2 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 74babd9..37c2367 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 0cac44a..ac23229 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 97e2ff3..04d6ec4 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index ee29687..8ab1eef 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index e7db0be..fcc38eb 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 4e3393e..7aad7e1 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index d3c5d78..c989d20 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 043c2e1..eeab7f3 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 6315595..36d7f3d 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 9dfd724..d5e15e8 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 48ef7f8..74eff50 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 474e06b..e019924 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index fea6acc..8e0c3ab 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 7845ce4..f2d3849 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 22fa518..f2f4039 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index d8ce17a..129b03a 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 7a9a9fa..9f0a585 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 48360ce..c00b6b3 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 78c2380..2054a9b 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 3e2b039..7449c39 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index bc24c61..8cb05e9 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 1766158..1d2d29a 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 429cc5b..46e8057 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 5faf1b4..8b11d39 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 3772d63..e11189b 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 5bac6d7..eac7836 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 897f307..b7d6284 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 33aff7a..f00cac4 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index b1c83b4..57900ee 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 0284b63..1a83948 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 5762e29..b5b9b6e 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 9a99d7c..153459e 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 16a0e5b..7ee3d94 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index cbe7df6..078b447 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 8ae4e18..70e2925 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index ecefee8..3b2c543 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 32fc0ed..d8692a0 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 633d765..d64a2cc 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 8901497..57855fa 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 6d0ee6c..3f97798 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index e996a29..6ab3b82 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index f2fcffb..07e3166 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index d0ec8fd..9f36f63 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 0844593..00fbc08 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 7523618..f222dd7 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 4e87180..4be43db 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index bc2a16d..ea4dad5 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 263ff20..c924e3c 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 20d7522..344dc6e 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index d273d28..00e7b12 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index cb5ca70..4b70e5a 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 52eabfc..9fc8eba 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 1ff2e5b..3b01d28 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 9cb245d..24d8493 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 3e476d0..07eb7d2 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 7a47155..d95afd7 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 5231789..d7a2324 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 215e30f..7e47df6 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 5858ec3..68c1ec5 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 2cab0ec..1793626 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index a705346..3f0bfb9 100644 (file)
@@ -1,6 +1,4 @@
 /**
- * Copyright 2011 The Apache Software Foundation
- *
  * 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
index 3dfb248..e3d0c0c 100644 (file)
@@ -25,6 +25,9 @@ import com.cloudera.sqoop.mapreduce.db.TextSplitter;
 
 import junit.framework.TestCase;
 
+/**
+ * Test that the TextSplitter implementation creates a sane set of splits.
+ */
 public class TestTextSplitter extends TestCase {
 
   public String formatArray(Object [] ar) {