You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sqoop.apache.org by ar...@apache.org on 2012/01/10 04:37:25 UTC

svn commit: r1229465 - in /incubator/sqoop/branches/sqoop2: common/src/main/java/org/apache/sqoop/model/ connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/ connector/connector-mysql-jdbc/src/main/java/org/apache/sqoop/conne...

Author: arvind
Date: Tue Jan 10 03:37:24 2012
New Revision: 1229465

URL: http://svn.apache.org/viewvc?rev=1229465&view=rev
Log:
SQOOP-365. Ability to register and retrieve connector metadata.

Added:
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MFormType.java   (with props)
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInputType.java   (with props)
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MPersistableEntity.java   (with props)
    incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/
    incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/spi/
    incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/spi/SqoopConnector.java   (with props)
Removed:
    incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/spi/
Modified:
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MConnector.java
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MForm.java
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInput.java
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MMapInput.java
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MNamedElement.java
    incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MStringInput.java
    incubator/sqoop/branches/sqoop2/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java
    incubator/sqoop/branches/sqoop2/connector/connector-mysql-jdbc/src/main/java/org/apache/sqoop/connector/mysqljdbc/MySqlJdbcConnector.java
    incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java
    incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepository.java
    incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryHandler.java
    incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/RepositoryError.java
    incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepoError.java
    incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java
    incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java
    incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java
    incubator/sqoop/branches/sqoop2/server/src/main/webapp/WEB-INF/web.xml

Modified: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MConnector.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MConnector.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MConnector.java (original)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MConnector.java Tue Jan 10 03:37:24 2012
@@ -20,7 +20,7 @@ package org.apache.sqoop.model;
 import java.util.ArrayList;
 import java.util.List;
 
-public final class MConnector {
+public final class MConnector extends MPersistableEntity {
 
   private final String uniqueName;
   private final String className;
@@ -54,8 +54,8 @@ public final class MConnector {
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder("connector-");
-    sb.append(uniqueName).append(":").append(className);
-    sb.append("; conn-forms:").append(connectionForms);
+    sb.append(uniqueName).append(":").append(getPersistenceId()).append(":");
+    sb.append(className).append("; conn-forms:").append(connectionForms);
     sb.append("; job-forms:").append(jobForms);
 
     return sb.toString();
@@ -72,8 +72,10 @@ public final class MConnector {
     }
 
     MConnector mc = (MConnector) other;
-    return (uniqueName.equals(mc.uniqueName) &&
-        className.equals(mc.className));
+    return (uniqueName.equals(mc.uniqueName)
+        && className.equals(mc.className))
+        && connectionForms.equals(mc.connectionForms)
+        && jobForms.equals(mc.jobForms);
   }
 
   @Override
@@ -81,6 +83,12 @@ public final class MConnector {
     int result = 23;
     result = 31 * result + uniqueName.hashCode();
     result = 31 * result + className.hashCode();
+    for (MForm cmf : connectionForms) {
+      result = 31 * result + cmf.hashCode();
+    }
+    for (MForm jmf : jobForms) {
+      result = 31 * result + jmf.hashCode();
+    }
 
     return result;
   }
@@ -92,5 +100,4 @@ public final class MConnector {
   public List<MForm> getJobForms() {
     return jobForms;
   }
-
 }

Modified: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MForm.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MForm.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MForm.java (original)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MForm.java Tue Jan 10 03:37:24 2012
@@ -41,8 +41,34 @@ public final class MForm extends MNamedE
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder("form-").append(getName());
-    sb.append(":").append(inputs);
+    sb.append(":").append(getPersistenceId()).append(":").append(inputs);
 
     return sb.toString();
   }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == this) {
+      return true;
+    }
+
+    if (!(other instanceof MForm)) {
+      return false;
+    }
+
+    MForm mf = (MForm) other;
+    return getName().equals(mf.getName())
+        && inputs.equals(mf.inputs);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = 17;
+    result = 31 * result + getName().hashCode();
+    for (MInput<?> mi : inputs) {
+      result = 31 * result + mi.hashCode();
+    }
+
+    return result;
+  }
 }

Added: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MFormType.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MFormType.java?rev=1229465&view=auto
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MFormType.java (added)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MFormType.java Tue Jan 10 03:37:24 2012
@@ -0,0 +1,34 @@
+/**
+ * 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.model;
+
+/**
+ * Represents the various form types supported by the system.
+ */
+public enum MFormType {
+
+  /** Unknown form type */
+  OTHER,
+
+  /** Connection form type */
+  CONNECTION,
+
+  /** Job form type */
+  JOB;
+
+}

Propchange: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MFormType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInput.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInput.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInput.java (original)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInput.java Tue Jan 10 03:37:24 2012
@@ -56,10 +56,46 @@ public abstract class MInput<T> extends 
    */
   public abstract void restoreFromUrlSafeValueString(String valueString);
 
+  public abstract MInputType getType();
+
+  /**
+   * @return <tt>true</tt> if this type maintains more state than what is
+   * stored in the <tt>MInput</tt> base class.
+   */
+  protected abstract boolean hasExtraInfo();
+
+  /**
+   * @return the string representation of state stored in this type if
+   * applicable or an empty string.
+   */
+  protected abstract String getExtraInfoToString();
+
+  /**
+   * All input types must override the <tt>equals()</tt> method such that the
+   * test for equality is based on static metadata only. As a result any
+   * set value, error message and other dynamic value data is not considered
+   * as part of the equality comparison.
+   */
+  @Override
+  public abstract boolean equals(Object other);
+
+  /**
+   * All input types must override the <tt>hashCode()</tt> method such that
+   * the hash code computation is solely based on static metadata. As a result
+   * any set value, error message and other dynamic value data is not
+   * considered as part of the hash code computation.
+   */
+  @Override
+  public abstract int hashCode();
+
   @Override
   public final String toString() {
-    StringBuilder sb = new StringBuilder("input-");
-    sb.append(getClass().getSimpleName()).append(":").append(getName());
+    StringBuilder sb = new StringBuilder("input-").append(getName());
+    sb.append(":").append(getPersistenceId()).append(":");
+    sb.append(getType());
+    if (hasExtraInfo()) {
+      sb.append(":").append(getExtraInfoToString());
+    }
 
     return sb.toString();
   }

Added: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInputType.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInputType.java?rev=1229465&view=auto
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInputType.java (added)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInputType.java Tue Jan 10 03:37:24 2012
@@ -0,0 +1,33 @@
+/**
+ * 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.model;
+
+/**
+ * Represents the various input types supported by the system.
+ */
+public enum MInputType {
+
+  /** Unknown input type */
+  OTHER,
+
+  /** String input type */
+  STRING,
+
+  /** Map input type */
+  MAP;
+}

Propchange: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MInputType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MMapInput.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MMapInput.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MMapInput.java (original)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MMapInput.java Tue Jan 10 03:37:24 2012
@@ -70,4 +70,38 @@ public final class MMapInput extends MIn
     }
     setValue(valueMap);
   }
+
+  @Override
+  public MInputType getType() {
+    return MInputType.MAP;
+  }
+
+  @Override
+  protected boolean hasExtraInfo() {
+    return false;
+  }
+
+  @Override
+  protected String getExtraInfoToString() {
+    return "";
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == this) {
+      return true;
+    }
+
+    if (!(other instanceof MMapInput)) {
+      return false;
+    }
+
+    MMapInput mmi = (MMapInput) other;
+    return getName().equals(mmi.getName());
+  }
+
+  @Override
+  public int hashCode() {
+    return 23 + 31 * getName().hashCode();
+  }
 }

Modified: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MNamedElement.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MNamedElement.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MNamedElement.java (original)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MNamedElement.java Tue Jan 10 03:37:24 2012
@@ -20,7 +20,7 @@ package org.apache.sqoop.model;
 /**
  * Represents an element of metadata used by the connector.
  */
-public abstract class MNamedElement {
+public abstract class MNamedElement extends MPersistableEntity {
   private static final String LABEL_KEY_SUFFIX = "-label";
   private static final String HELP_KEY_SUFFIX = "-help";
 

Added: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MPersistableEntity.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MPersistableEntity.java?rev=1229465&view=auto
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MPersistableEntity.java (added)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MPersistableEntity.java Tue Jan 10 03:37:24 2012
@@ -0,0 +1,41 @@
+/**
+ * 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.model;
+
+/**
+ * Represents a persistable metadata entity.
+ */
+public abstract class MPersistableEntity {
+
+  private long persistenceId = -1L;
+
+  protected MPersistableEntity() {
+    // Default constructor
+  }
+
+  public void setPersistenceId(long persistenceId) {
+    this.persistenceId = persistenceId;
+  }
+
+  public long getPersistenceId() {
+    return persistenceId;
+  }
+
+  @Override
+  public abstract String toString();
+}

Propchange: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MPersistableEntity.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MStringInput.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MStringInput.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MStringInput.java (original)
+++ incubator/sqoop/branches/sqoop2/common/src/main/java/org/apache/sqoop/model/MStringInput.java Tue Jan 10 03:37:24 2012
@@ -28,7 +28,7 @@ import org.apache.sqoop.utils.UrlSafeUti
 public final class MStringInput extends MInput<String> {
 
   private final boolean mask;
-  private final int maxLength;
+  private final short maxLength;
 
   /**
    * @param name the parameter name
@@ -36,7 +36,7 @@ public final class MStringInput extends 
    * @param mask a flag indicating if the string should be masked
    * @param maxLength the maximum length of the string
    */
-  public MStringInput(String name, boolean mask, int maxLength) {
+  public MStringInput(String name, boolean mask, short maxLength) {
     super(name);
     this.mask = mask;
     this.maxLength = maxLength;
@@ -53,7 +53,7 @@ public final class MStringInput extends 
   /**
    * @return the maximum length of this string type
    */
-  public int getMaxLength() {
+  public short getMaxLength() {
     return maxLength;
   }
 
@@ -66,4 +66,43 @@ public final class MStringInput extends 
   public void restoreFromUrlSafeValueString(String valueString) {
     setValue(UrlSafeUtils.urlDecode(valueString));
   }
+
+  @Override
+  public MInputType getType() {
+    return MInputType.STRING;
+  }
+
+  @Override
+  protected boolean hasExtraInfo() {
+    return true;
+  }
+
+  @Override
+  protected String getExtraInfoToString() {
+    return isMasked() + ":" + getMaxLength();
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (other == this) {
+      return true;
+    }
+
+    if (!(other instanceof MStringInput)) {
+      return false;
+    }
+
+    MStringInput msi = (MStringInput) other;
+    return getName().equals(msi.getName())
+        && (mask == msi.mask)
+        && (maxLength == msi.maxLength);
+  }
+
+  @Override
+  public int hashCode() {
+    int result = 23 + 31 * getName().hashCode();
+    result = 31 * result + (mask ? 1 : 0);
+    result = 31 * result + maxLength;
+    return result;
+  }
 }

Modified: incubator/sqoop/branches/sqoop2/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java (original)
+++ incubator/sqoop/branches/sqoop2/connector/connector-generic-jdbc/src/main/java/org/apache/sqoop/connector/jdbc/GenericJdbcConnector.java Tue Jan 10 03:37:24 2012
@@ -26,30 +26,33 @@ import org.apache.sqoop.model.MForm;
 import org.apache.sqoop.model.MInput;
 import org.apache.sqoop.model.MMapInput;
 import org.apache.sqoop.model.MStringInput;
-import org.apache.sqoop.spi.SqoopConnector;
+import org.apache.sqoop.connector.spi.SqoopConnector;
 
 public class GenericJdbcConnector implements SqoopConnector {
 
   private static final List<MForm> CONNECTION_FORMS = new ArrayList<MForm>();
+  private static final List<MForm> JOB_FORMS = new ArrayList<MForm>();
 
   static {
     // Build the connection form
     List<MInput<?>> connFormInputs = new ArrayList<MInput<?>>();
 
     MStringInput jdbcDriver = new MStringInput(
-        GenericJdbcConnectorConstants.INPUT_CONN_JDBCDRIVER, false, 128);
+        GenericJdbcConnectorConstants.INPUT_CONN_JDBCDRIVER, false,
+        (short) 128);
     connFormInputs.add(jdbcDriver);
 
     MStringInput connectString = new MStringInput(
-        GenericJdbcConnectorConstants.INPUT_CONN_CONNECTSTRING, false, 128);
+        GenericJdbcConnectorConstants.INPUT_CONN_CONNECTSTRING, false,
+        (short) 128);
     connFormInputs.add(connectString);
 
     MStringInput username = new MStringInput(
-        GenericJdbcConnectorConstants.INPUT_CONN_USERNAME, false, 36);
+        GenericJdbcConnectorConstants.INPUT_CONN_USERNAME, false, (short) 36);
     connFormInputs.add(username);
 
     MStringInput password = new MStringInput(
-        GenericJdbcConnectorConstants.INPUT_CONN_PASSWORD, true, 10);
+        GenericJdbcConnectorConstants.INPUT_CONN_PASSWORD, true, (short) 10);
     connFormInputs.add(password);
 
     MMapInput jdbcProperties = new MMapInput(
@@ -73,4 +76,9 @@ public class GenericJdbcConnector implem
     return CONNECTION_FORMS;
   }
 
+  @Override
+  public List<MForm> getJobForms() {
+    return JOB_FORMS;
+  }
+
 }

Modified: incubator/sqoop/branches/sqoop2/connector/connector-mysql-jdbc/src/main/java/org/apache/sqoop/connector/mysqljdbc/MySqlJdbcConnector.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/connector/connector-mysql-jdbc/src/main/java/org/apache/sqoop/connector/mysqljdbc/MySqlJdbcConnector.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/connector/connector-mysql-jdbc/src/main/java/org/apache/sqoop/connector/mysqljdbc/MySqlJdbcConnector.java (original)
+++ incubator/sqoop/branches/sqoop2/connector/connector-mysql-jdbc/src/main/java/org/apache/sqoop/connector/mysqljdbc/MySqlJdbcConnector.java Tue Jan 10 03:37:24 2012
@@ -17,15 +17,19 @@
  */
 package org.apache.sqoop.connector.mysqljdbc;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.ResourceBundle;
 
 import org.apache.sqoop.model.MForm;
-import org.apache.sqoop.spi.SqoopConnector;
+import org.apache.sqoop.connector.spi.SqoopConnector;
 
 public class MySqlJdbcConnector implements SqoopConnector {
 
+  private static final List<MForm> CONNECTION_FORMS = new ArrayList<MForm>();
+  private static final List<MForm> JOB_FORMS = new ArrayList<MForm>();
+
   @Override
   public ResourceBundle getBundle(Locale locale) {
     // TODO Auto-generated method stub
@@ -34,8 +38,12 @@ public class MySqlJdbcConnector implemen
 
   @Override
   public List<MForm> getConnectionForms() {
-    // TODO Auto-generated method stub
-    return null;
+    return CONNECTION_FORMS;
   }
 
+  @Override
+  public List<MForm> getJobForms() {
+    // TODO Auto-generated method stub
+    return JOB_FORMS;
+  }
 }

Modified: incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java (original)
+++ incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/connector/ConnectorHandler.java Tue Jan 10 03:37:24 2012
@@ -27,7 +27,7 @@ import org.apache.sqoop.core.Configurati
 import org.apache.sqoop.core.SqoopException;
 import org.apache.sqoop.model.MConnector;
 import org.apache.sqoop.model.MForm;
-import org.apache.sqoop.spi.SqoopConnector;
+import org.apache.sqoop.connector.spi.SqoopConnector;
 
 public final class ConnectorHandler {
 
@@ -90,7 +90,7 @@ public final class ConnectorHandler {
 
     // Initialize Metadata
     mConnector = new MConnector(connectorUniqueName, connectorClassName,
-        new ArrayList<MForm>(), new ArrayList<MForm>());
+        connector.getConnectionForms(), connector.getJobForms());
 
     if (LOG.isInfoEnabled()) {
       LOG.info("Connector [" + connectorClassName + "] initialized.");

Modified: incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepository.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepository.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepository.java (original)
+++ incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepository.java Tue Jan 10 03:37:24 2012
@@ -54,9 +54,12 @@ public class JdbcRepository implements R
       Connection conn = tx.getConnection();
       result = handler.findConnector(connectorUniqueName, conn);
       if (result == null) {
-        // Insert (Register) connector FIXME
-
-
+        handler.registerConnector(mConnector, conn);
+      } else {
+        if (!result.equals(mConnector)) {
+          throw new SqoopException(RepositoryError.JDBCREPO_0013,
+              "given[" + mConnector + "] found[" + result + "]");
+        }
       }
       tx.commit();
     } catch (Exception ex) {

Modified: incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryHandler.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryHandler.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryHandler.java (original)
+++ incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryHandler.java Tue Jan 10 03:37:24 2012
@@ -27,6 +27,8 @@ public interface JdbcRepositoryHandler {
 
   public MConnector findConnector(String shortName, Connection conn);
 
+  public void registerConnector(MConnector mc, Connection conn);
+
   public boolean schemaExists();
 
   public void createSchema();

Modified: incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/RepositoryError.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/RepositoryError.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/RepositoryError.java (original)
+++ incubator/sqoop/branches/sqoop2/core/src/main/java/org/apache/sqoop/repository/RepositoryError.java Tue Jan 10 03:37:24 2012
@@ -74,7 +74,10 @@ public enum RepositoryError implements E
   JDBCREPO_0011("Attempt to reinitialize JDBC repository context"),
 
   /** The system was unable to register the connector in its repository. */
-  JDBCREPO_0012("Failed to register connector in repository");
+  JDBCREPO_0012("Failed to register connector in repository"),
+
+  /** The system found a change in connector metadata that requires upgrade. */
+  JDBCREPO_0013("Connector metadata changed - upgrade may be required");
 
 
   private final String message;

Modified: incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepoError.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepoError.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepoError.java (original)
+++ incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepoError.java Tue Jan 10 03:37:24 2012
@@ -31,7 +31,79 @@ public enum DerbyRepoError implements Er
   DERBYREPO_0002("Unable to shutdown embedded  Derby instance"),
 
   /** The system was unable to run the specified query. */
-  DERBYREPO_0003("Unable to run specified query");
+  DERBYREPO_0003("Unable to run specified query"),
+
+  /** The system was unable to query the repository for connector metadata. */
+  DERBYREPO_0004("Unable to retrieve connector metadata"),
+
+  /** The metadata repository contains more than one connector with same name */
+  DERBYREPO_0005("Invalid metadata state - multiple connectors with name"),
+
+  /** The system does not support the given input type.*/
+  DERBYREPO_0006("Unknown input type encountered"),
+
+  /** The system does not support the given form type.*/
+  DERBYREPO_0007("Unknown form type encountered"),
+
+  /** No input metadata was found for the given form. */
+  DERBYREPO_0008("The form contains no input metadata"),
+
+  /** The system could not load the form due to unexpected position of input.*/
+  DERBYREPO_0009("The form input retrieved does not match expected position"),
+
+  /**
+   * The system could not load the connector due to unexpected position
+   * of form.
+   */
+  DERBYREPO_0010("The form retrieved does not match expteced position"),
+
+  /**
+   * The system was not able to register connector metadata due to a
+   * pre-assigned persistence identifier.
+   */
+  DERBYREPO_0011("Connector metadata cannot have preassigned persistence id"),
+
+  /**
+   * The system was unable to register connector metadata due to an unexpected
+   * update count.
+   */
+  DERBYREPO_0012("Unexpected update count on connector registration"),
+
+  /**
+   * The system was unable to register connector metadata due to a failure to
+   * retrieve the generated identifier.
+   */
+  DERBYREPO_0013("Unable to retrieve generated identifier for new connector"),
+
+  /**
+   * The system was unable to register connector metadata due to a server
+   * error.
+   */
+  DERBYREPO_0014("Registration of connector metadata failed"),
+
+  /**
+   * The system was not able to register connector metadata due to an unexpected
+   * update count.
+   */
+  DERBYREPO_0015("Unexpected update count on form registration"),
+
+  /**
+   * The system was unable to register connector metadata due to a failure to
+   * retrieve the generated identifier for a form.
+   */
+  DERBYREPO_0016("Unable to retrieve generated identifier for form"),
+
+  /**
+   * The system was unable to register connector metadata due to an unexpected
+   * update count for form input registration.
+   */
+  DERBYREPO_0017("Unexpected update count for form input"),
+
+  /**
+   * The system was unable to register connector metadata due to a failure to
+   * retrieve the generated identifier for a form input.
+   */
+  DERBYREPO_0018("Unable to retrieve generated identifier for form input");
 
 
   private final String message;

Modified: incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java (original)
+++ incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java Tue Jan 10 03:37:24 2012
@@ -18,18 +18,32 @@
 package org.apache.sqoop.repository.derby;
 
 import static org.apache.sqoop.repository.derby.DerbySchemaQuery.*;
+import static org.apache.sqoop.repository.derby.DerbySchemaQuery.QUERY_CREATE_TABLE_SQ_CONNECTOR;
+import static org.apache.sqoop.repository.derby.DerbySchemaQuery.QUERY_CREATE_TABLE_SQ_FORM;
+import static org.apache.sqoop.repository.derby.DerbySchemaQuery.QUERY_CREATE_TABLE_SQ_INPUT;
+import static org.apache.sqoop.repository.derby.DerbySchemaQuery.STMT_FETCH_BASE_CONNECTOR;
+import static org.apache.sqoop.repository.derby.DerbySchemaQuery.STMT_FETCH_FORM;
 
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.sql.DataSource;
 
 import org.apache.log4j.Logger;
 import org.apache.sqoop.core.SqoopException;
 import org.apache.sqoop.model.MConnector;
+import org.apache.sqoop.model.MForm;
+import org.apache.sqoop.model.MFormType;
+import org.apache.sqoop.model.MInput;
+import org.apache.sqoop.model.MInputType;
+import org.apache.sqoop.model.MMapInput;
+import org.apache.sqoop.model.MStringInput;
 import org.apache.sqoop.repository.JdbcRepositoryContext;
 import org.apache.sqoop.repository.JdbcRepositoryHandler;
 import org.apache.sqoop.repository.JdbcRepositoryTransactionFactory;
@@ -54,6 +68,136 @@ public class DerbyRepositoryHandler impl
   private JdbcRepositoryTransactionFactory txFactory;
 
   @Override
+  public void registerConnector(MConnector mc, Connection conn) {
+    if (mc.getPersistenceId() != -1L) {
+      throw new SqoopException(DerbyRepoError.DERBYREPO_0011,
+          mc.getUniqueName());
+    }
+
+    PreparedStatement baseConnectorStmt = null;
+    PreparedStatement baseFormStmt = null;
+    PreparedStatement baseInputStmt = null;
+    try {
+      baseConnectorStmt = conn.prepareStatement(STMT_INSERT_CONNECTOR_BASE,
+          Statement.RETURN_GENERATED_KEYS);
+      baseConnectorStmt.setString(1, mc.getUniqueName());
+      baseConnectorStmt.setString(2, mc.getClassName());
+
+      int baseConnectorCount = baseConnectorStmt.executeUpdate();
+      if (baseConnectorCount != 1) {
+        throw new SqoopException(DerbyRepoError.DERBYREPO_0012,
+            new Integer(baseConnectorCount).toString());
+      }
+
+      ResultSet rsetConnectorId = baseConnectorStmt.getGeneratedKeys();
+
+      if (!rsetConnectorId.next()) {
+        throw new SqoopException(DerbyRepoError.DERBYREPO_0013);
+      }
+
+      long connectorId = rsetConnectorId.getLong(1);
+      mc.setPersistenceId(connectorId);
+
+      baseFormStmt = conn.prepareStatement(STMT_INSERT_FORM_BASE,
+          Statement.RETURN_GENERATED_KEYS);
+
+      baseInputStmt = conn.prepareStatement(STMT_INSERT_INPUT_BASE,
+          Statement.RETURN_GENERATED_KEYS);
+
+      // Insert connection forms
+      registerForms(connectorId, mc.getConnectionForms(),
+          MFormType.CONNECTION.name(), baseFormStmt, baseInputStmt);
+
+      registerForms(connectorId, mc.getJobForms(),
+          MFormType.JOB.name(), baseFormStmt, baseInputStmt);
+
+    } catch (SQLException ex) {
+      throw new SqoopException(DerbyRepoError.DERBYREPO_0014,
+          mc.toString(), ex);
+    } finally {
+      if (baseConnectorStmt != null) {
+        try {
+          baseConnectorStmt.close();
+        } catch (SQLException ex) {
+          LOG.error("Unable to close base connector statement", ex);
+        }
+      }
+      if (baseFormStmt != null) {
+        try {
+          baseFormStmt.close();
+        } catch (SQLException ex) {
+          LOG.error("Unable to close base form statement", ex);
+        }
+      }
+      if (baseInputStmt != null) {
+        try {
+          baseInputStmt.close();
+        } catch (SQLException ex) {
+          LOG.error("Unable to close base input statement", ex);
+        }
+      }
+    }
+  }
+
+  private void registerForms(long connectorId, List<MForm> forms, String type,
+      PreparedStatement baseFormStmt, PreparedStatement baseInputStmt)
+          throws SQLException {
+    short formIndex = 0;
+    for (MForm form : forms) {
+      baseFormStmt.setLong(1, connectorId);
+      baseFormStmt.setString(2, form.getName());
+      baseFormStmt.setString(3, type);
+      baseFormStmt.setShort(4, formIndex++);
+
+      int baseFormCount = baseFormStmt.executeUpdate();
+      if (baseFormCount != 1) {
+        throw new SqoopException(DerbyRepoError.DERBYREPO_0015,
+            new Integer(baseFormCount).toString());
+      }
+      ResultSet rsetFormId = baseFormStmt.getGeneratedKeys();
+      if (!rsetFormId.next()) {
+        throw new SqoopException(DerbyRepoError.DERBYREPO_0016);
+      }
+
+      long formId = rsetFormId.getLong(1);
+      form.setPersistenceId(formId);
+
+      // Insert all the inputs
+      List<MInput<?>> inputs = form.getInputs();
+      registerFormInputs(formId, inputs, baseInputStmt);
+    }
+  }
+
+  private void registerFormInputs(long formId, List<MInput<?>> inputs,
+      PreparedStatement baseInputStmt) throws SQLException {
+    short inputIndex = 0;
+    for (MInput<?> input : inputs) {
+      baseInputStmt.setString(1, input.getName());
+      baseInputStmt.setLong(2, formId);
+      baseInputStmt.setShort(3, inputIndex++);
+      baseInputStmt.setString(4, input.getType().name());
+      if (input.getType().equals(MInputType.STRING)) {
+        MStringInput	strInput = (MStringInput) input;
+        baseInputStmt.setBoolean(5, strInput.isMasked());
+        baseInputStmt.setShort(6, strInput.getMaxLength());
+      }
+      int baseInputCount = baseInputStmt.executeUpdate();
+      if (baseInputCount != 1) {
+        throw new SqoopException(DerbyRepoError.DERBYREPO_0017,
+            new Integer(baseInputCount).toString());
+      }
+
+      ResultSet rsetInputId = baseInputStmt.getGeneratedKeys();
+      if (!rsetInputId.next()) {
+        throw new SqoopException(DerbyRepoError.DERBYREPO_0018);
+      }
+
+      long inputId = rsetInputId.getLong(1);
+      input.setPersistenceId(inputId);
+    }
+  }
+
+  @Override
   public synchronized void initialize(JdbcRepositoryContext ctx) {
     repoContext = ctx;
     dataSource = repoContext.getDataSource();
@@ -199,7 +343,146 @@ public class DerbyRepositoryHandler impl
 
   @Override
   public MConnector findConnector(String shortName, Connection conn) {
-    // FIXME Auto-generated method stub
-    return null;
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("Looking up connector: " + shortName);
+    }
+    MConnector mc = null;
+    PreparedStatement baseConnectorFetchStmt = null;
+    PreparedStatement formFetchStmt = null;
+    PreparedStatement inputFetchStmt = null;
+    try {
+      baseConnectorFetchStmt = conn.prepareStatement(STMT_FETCH_BASE_CONNECTOR);
+      baseConnectorFetchStmt.setString(1, shortName);
+      ResultSet rsetBaseConnector = baseConnectorFetchStmt.executeQuery();
+
+      if (!rsetBaseConnector.next()) {
+        LOG.debug("No connector found by name: " + shortName);
+        return null;
+      }
+
+      long connectorId = rsetBaseConnector.getLong(1);
+      String connectorName = rsetBaseConnector.getString(2);
+      String connectorClassName = rsetBaseConnector.getString(3);
+
+      List<MForm> connectionForms = new ArrayList<MForm>();
+      List<MForm> jobForms = new ArrayList<MForm>();
+
+      mc = new MConnector(connectorName, connectorClassName,
+          connectionForms, jobForms);
+      mc.setPersistenceId(connectorId);
+
+      if (rsetBaseConnector.next()) {
+        throw new SqoopException(DerbyRepoError.DERBYREPO_0005, shortName);
+      }
+
+      formFetchStmt = conn.prepareStatement(STMT_FETCH_FORM);
+      formFetchStmt.setLong(1, connectorId);
+
+      inputFetchStmt = conn.prepareStatement(STMT_FETCH_INPUT);
+
+      ResultSet rsetForm = formFetchStmt.executeQuery();
+      while (rsetForm.next()) {
+        long formId = rsetForm.getLong(1);
+        long formConnectorId = rsetForm.getLong(2);
+        String formName = rsetForm.getString(3);
+        String formType = rsetForm.getString(4);
+        int formIndex = rsetForm.getInt(5);
+        List<MInput<?>> formInputs = new ArrayList<MInput<?>>();
+
+        MForm mf = new MForm(formName, formInputs);
+        mf.setPersistenceId(formId);
+
+        inputFetchStmt.setLong(1, formId);
+
+        ResultSet rsetInput = inputFetchStmt.executeQuery();
+        while (rsetInput.next()) {
+          long inputId = rsetInput.getLong(1);
+          String inputName = rsetInput.getString(2);
+          long inputForm = rsetInput.getLong(3);
+          short inputIndex = rsetInput.getShort(4);
+          String inputType = rsetInput.getString(5);
+          boolean inputStrMask = rsetInput.getBoolean(6);
+          short inputStrLength = rsetInput.getShort(7);
+
+          MInputType mit = MInputType.valueOf(inputType);
+
+          MInput input = null;
+          switch (mit) {
+          case STRING:
+            input = new MStringInput(inputName, inputStrMask, inputStrLength);
+            break;
+          case MAP:
+            input = new MMapInput(inputName);
+            break;
+          default:
+            throw new SqoopException(DerbyRepoError.DERBYREPO_0006,
+                "input-" + inputName + ":" + inputId + ":"
+                + "form-" + inputForm + ":" + mit.name());
+          }
+          input.setPersistenceId(inputId);
+
+          if (mf.getInputs().size() != inputIndex) {
+            throw new SqoopException(DerbyRepoError.DERBYREPO_0009,
+                "form: " + mf + "; input: " + input);
+          }
+
+          mf.getInputs().add(input);
+        }
+
+        if (mf.getInputs().size() == 0) {
+          throw new SqoopException(DerbyRepoError.DERBYREPO_0008,
+              "connector-" + formConnectorId + ":" + mf);
+        }
+
+        MFormType mft = MFormType.valueOf(formType);
+        switch (mft) {
+        case CONNECTION:
+          if (mc.getConnectionForms().size() != formIndex) {
+            throw new SqoopException(DerbyRepoError.DERBYREPO_0010,
+                "connector: " + mc + "; form: " + mf);
+          }
+          mc.getConnectionForms().add(mf);
+          break;
+        case JOB:
+          if (mc.getConnectionForms().size() != formIndex) {
+            throw new SqoopException(DerbyRepoError.DERBYREPO_0010,
+                "connector: " + mc + "; form: " + mf);
+          }
+          mc.getJobForms().add(mf);
+          break;
+        default:
+          throw new SqoopException(DerbyRepoError.DERBYREPO_0007,
+              "connector-" + formConnectorId + ":" + mf);
+        }
+      }
+    } catch (SQLException ex) {
+      throw new SqoopException(DerbyRepoError.DERBYREPO_0004, shortName, ex);
+    } finally {
+      if (baseConnectorFetchStmt != null) {
+        try {
+          baseConnectorFetchStmt.close();
+        } catch (SQLException ex) {
+          LOG.error("Unable to close base connector fetch statement", ex);
+        }
+      }
+      if (formFetchStmt != null) {
+        try {
+          formFetchStmt.close();
+        } catch (SQLException ex) {
+          LOG.error("Unable to close form fetch statement", ex);
+        }
+      }
+      if (inputFetchStmt != null) {
+        try {
+          inputFetchStmt.close();
+        } catch (SQLException ex) {
+          LOG.error("Unable to close input fetch statement", ex);
+        }
+      }
+    }
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("Looking up connector: " + shortName + ", found: " + mc);
+    }
+    return mc;
   }
 }

Modified: incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java (original)
+++ incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java Tue Jan 10 03:37:24 2012
@@ -28,6 +28,8 @@ public final class DerbySchemaConstants 
   public static final String TABLE_SQ_CONNECTOR = SCHEMA_PREFIX
       + TABLE_SQ_CONNECTOR_NAME;
 
+  public static final String COLUMN_SQC_ID = "SQC_ID";
+
   public static final String COLUMN_SQC_NAME = "SQC_NAME";
 
   public static final String COLUMN_SQC_CLASS = "SQC_CLASS";

Modified: incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java (original)
+++ incubator/sqoop/branches/sqoop2/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java Tue Jan 10 03:37:24 2012
@@ -26,12 +26,13 @@ import static org.apache.sqoop.repositor
  * <p>
  * <strong>SQ_CONNECTOR</strong>: Connector registration.
  * <pre>
- *    +--------------------------+
- *    | SQ_CONNECTOR             |
- *    +--------------------------+
- *    | SQC_NAME: VARCHAR(64) PK |
- *    | SQC_CLASS: VARCHAR(255)  |
- *    +--------------------------+
+ *    +----------------------------+
+ *    | SQ_CONNECTOR               |
+ *    +----------------------------+
+ *    | SQC_ID: BIGINT PK AUTO-GEN |
+ *    | SQC_NAME: VARCHAR(64)      |
+ *    | SQC_CLASS: VARCHAR(255)    |
+ *    +----------------------------+
  * </pre>
  * </p>
  * <p>
@@ -41,7 +42,7 @@ import static org.apache.sqoop.repositor
  *    | SQ_FORM                     |
  *    +-----------------------------+
  *    | SQF_ID: BIGINT PK AUTO-GEN  |
- *    | SQF_CONNECTOR: VARCHAR(64)  | FK SQ_CONNECTOR(SQC_NAME)
+ *    | SQF_CONNECTOR: BIGINT       | FK SQ_CONNECTOR(SQC_ID)
  *    | SQF_NAME: VARCHAR(64)       |
  *    | SQF_TYPE: VARCHAR(32)       | "CONNECTION"|"JOB"
  *    | SQF_INDEX: SMALLINT         |
@@ -67,22 +68,29 @@ import static org.apache.sqoop.repositor
  */
 public final class DerbySchemaQuery {
 
+  // DDL: Create schema
   public static final String QUERY_CREATE_SCHEMA_SQOOP =
       "CREATE SCHEMA " + SCHEMA_SQOOP;
 
+  // DDL: Create table SQ_CONNECTOR
   public static final String QUERY_CREATE_TABLE_SQ_CONNECTOR =
-      "CREATE TABLE " + TABLE_SQ_CONNECTOR + " (" + COLUMN_SQC_NAME
-      + " VARCHAR(64) PRIMARY KEY, " + COLUMN_SQC_CLASS + " VARCHAR(255))";
+      "CREATE TABLE " + TABLE_SQ_CONNECTOR + " (" + COLUMN_SQC_ID
+      + " BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) "
+      + "PRIMARY KEY, " + COLUMN_SQC_NAME + " VARCHAR(64), " + COLUMN_SQC_CLASS
+      + " VARCHAR(255))";
 
+  // DDL: Create table SQ_FORM
   public static final String QUERY_CREATE_TABLE_SQ_FORM =
       "CREATE TABLE " + TABLE_SQ_FORM + " (" + COLUMN_SQF_ID
       + " BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) "
-      + "PRIMARY KEY, " + COLUMN_SQF_CONNECTOR + " VARCHAR(64), "
+      + "PRIMARY KEY, " + COLUMN_SQF_CONNECTOR + " BIGINT, "
       + COLUMN_SQF_NAME + " VARCHAR(64), " + COLUMN_SQF_TYPE + " VARCHAR(32), "
       + COLUMN_SQF_INDEX + " SMALLINT, " + " FOREIGN KEY ("
       + COLUMN_SQF_CONNECTOR+ ") REFERENCES " + TABLE_SQ_CONNECTOR + " ("
-      + COLUMN_SQC_NAME + "))";
+      + COLUMN_SQC_ID + "))";
+
 
+  // DDL: Create table SQ_INPUT
   public static final String QUERY_CREATE_TABLE_SQ_INPUT =
       "CREATE TABLE " + TABLE_SQ_INPUT + " (" + COLUMN_SQI_ID
       + " BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) "
@@ -92,6 +100,46 @@ public final class DerbySchemaQuery {
       + COLUMN_SQI_STRLENGTH + " SMALLINT, FOREIGN KEY (" + COLUMN_SQI_FORM
       + ") REFERENCES " + TABLE_SQ_FORM + " (" + COLUMN_SQF_ID + "))";
 
+  // DML: Fetch connector Given Name
+  public static final String STMT_FETCH_BASE_CONNECTOR =
+      "SELECT " + COLUMN_SQC_ID + ", " + COLUMN_SQC_NAME + ", "
+      + COLUMN_SQC_CLASS + " FROM " + TABLE_SQ_CONNECTOR + " WHERE "
+      + COLUMN_SQC_NAME + " = ?";
+
+
+  // DML: Fetch all forms for a given connector
+  public static final String STMT_FETCH_FORM =
+      "SELECT " + COLUMN_SQF_ID + ", " + COLUMN_SQF_CONNECTOR + ", "
+      + COLUMN_SQF_NAME + ", " + COLUMN_SQF_TYPE + ", " + COLUMN_SQF_INDEX
+      + " FROM " + TABLE_SQ_FORM + " WHERE " + COLUMN_SQF_CONNECTOR
+      + " = ? ORDER BY " + COLUMN_SQF_INDEX;
+
+  // DML: Fetch inputs for a given form
+  public static final String STMT_FETCH_INPUT =
+      "SELECT " + COLUMN_SQI_ID + ", " + COLUMN_SQI_NAME + ", "
+      + COLUMN_SQI_FORM + ", " + COLUMN_SQI_INDEX + ", " + COLUMN_SQI_TYPE
+      + ", " + COLUMN_SQI_STRMASK + ", " + COLUMN_SQI_STRLENGTH + " FROM "
+      + TABLE_SQ_INPUT + " WHERE " + COLUMN_SQI_FORM + " = ? ORDER BY "
+      + COLUMN_SQI_INDEX;
+
+  // DML: Insert connector base
+  public static final String STMT_INSERT_CONNECTOR_BASE =
+      "INSERT INTO " + TABLE_SQ_CONNECTOR + " (" + COLUMN_SQC_NAME
+      + ", " + COLUMN_SQC_CLASS + ") VALUES ( ?, ?)";
+
+  // DML: Insert form base
+  public static final String STMT_INSERT_FORM_BASE =
+      "INSERT INTO " + TABLE_SQ_FORM + " (" + COLUMN_SQF_CONNECTOR
+      + ", " + COLUMN_SQF_NAME + ", " + COLUMN_SQF_TYPE + ", "
+      + COLUMN_SQF_INDEX + ") VALUES ( ?, ?, ?, ?)";
+
+  // DML: Insert form input
+  public static final String STMT_INSERT_INPUT_BASE =
+      "INSERT INTO " + TABLE_SQ_INPUT + " (" + COLUMN_SQI_NAME + ", "
+      + COLUMN_SQI_FORM + ", " + COLUMN_SQI_INDEX + ", " + COLUMN_SQI_TYPE
+      + ", " + COLUMN_SQI_STRMASK + ", " + COLUMN_SQI_STRLENGTH + ") "
+      + "VALUES (?, ?, ?, ?, ?, ?)";
+
   private DerbySchemaQuery() {
     // Disable explicit object creation
   }

Modified: incubator/sqoop/branches/sqoop2/server/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/server/src/main/webapp/WEB-INF/web.xml?rev=1229465&r1=1229464&r2=1229465&view=diff
==============================================================================
--- incubator/sqoop/branches/sqoop2/server/src/main/webapp/WEB-INF/web.xml (original)
+++ incubator/sqoop/branches/sqoop2/server/src/main/webapp/WEB-INF/web.xml Tue Jan 10 03:37:24 2012
@@ -29,7 +29,6 @@ limitations under the License.
 
   <servlet>
     <servlet-name>VersionServlet</servlet-name>
-    <display-name>Version Servlet</display-name>
     <servlet-class>org.apache.sqoop.server.VersionServlet</servlet-class>
     <load-on-startup>1</load-on-startup>
   </servlet>

Added: incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/spi/SqoopConnector.java
URL: http://svn.apache.org/viewvc/incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/spi/SqoopConnector.java?rev=1229465&view=auto
==============================================================================
--- incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/spi/SqoopConnector.java (added)
+++ incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/spi/SqoopConnector.java Tue Jan 10 03:37:24 2012
@@ -0,0 +1,49 @@
+/**
+ * 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.connector.spi;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import org.apache.sqoop.model.MForm;
+
+/**
+ * Service provider interface for Sqoop Connectors.
+ */
+public interface SqoopConnector {
+
+  /**
+   * @param locale
+   * @return the resource bundle associated with the given locale.
+   */
+  public ResourceBundle getBundle(Locale locale);
+
+  /**
+   * @return a list of <tt>MForm</tt> that provide metadata about input needed
+   * by Sqoop to create a connection object using this connector.
+   */
+  public List<MForm> getConnectionForms();
+
+
+  /**
+   * @return a list of <tt>MForm</tt> that provide metadata about input needed
+   * by Sqoop to create a job object using this connector.
+   */
+  public List<MForm> getJobForms();
+}

Propchange: incubator/sqoop/branches/sqoop2/spi/src/main/java/org/apache/sqoop/connector/spi/SqoopConnector.java
------------------------------------------------------------------------------
    svn:eol-style = native