| /** |
| * 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.lib; |
| |
| import java.io.IOException; |
| import java.nio.ByteBuffer; |
| import java.nio.CharBuffer; |
| import java.sql.PreparedStatement; |
| import java.sql.SQLException; |
| import java.util.Map; |
| |
| import org.apache.hadoop.io.Text; |
| import org.apache.hadoop.io.Writable; |
| import org.apache.sqoop.mapreduce.DBWritable; |
| |
| /** |
| * Interface implemented by the classes generated by sqoop's orm.ClassWriter. |
| */ |
| public abstract class SqoopRecord implements Cloneable, DBWritable, |
| com.cloudera.sqoop.lib.FieldMappable, Writable { |
| |
| public SqoopRecord() { |
| } |
| |
| |
| public abstract void parse(CharSequence s) |
| throws com.cloudera.sqoop.lib.RecordParser.ParseError; |
| public abstract void parse(Text s) |
| throws com.cloudera.sqoop.lib.RecordParser.ParseError; |
| public abstract void parse(byte [] s) |
| throws com.cloudera.sqoop.lib.RecordParser.ParseError; |
| public abstract void parse(char [] s) |
| throws com.cloudera.sqoop.lib.RecordParser.ParseError; |
| public abstract void parse(ByteBuffer s) |
| throws com.cloudera.sqoop.lib.RecordParser.ParseError; |
| public abstract void parse(CharBuffer s) |
| throws com.cloudera.sqoop.lib.RecordParser.ParseError; |
| public abstract void loadLargeObjects( |
| com.cloudera.sqoop.lib.LargeObjectLoader objLoader) |
| throws SQLException, IOException, InterruptedException; |
| |
| /** |
| * Inserts the data in this object into the PreparedStatement, starting |
| * at parameter 'offset'. |
| * @return the number of fields written to the statement. |
| */ |
| public abstract int write(PreparedStatement stmt, int offset) |
| throws SQLException; |
| |
| /** |
| * Format output data according to the specified delimiters. |
| */ |
| public abstract String toString( |
| com.cloudera.sqoop.lib.DelimiterSet delimiters); |
| |
| /** |
| * Use the default delimiters, but only append an end-of-record delimiter |
| * if useRecordDelim is true. |
| */ |
| public String toString(boolean useRecordDelim) { |
| // Method body should be overridden by generated classes in 1.3.0+ |
| if (useRecordDelim) { |
| // This is the existing functionality. |
| return toString(); |
| } else { |
| // Setting this to false requires behavior in the generated class. |
| throw new RuntimeException( |
| "toString(useRecordDelim=false) requires a newer SqoopRecord. " |
| + "Please regenerate your record class to use this function."); |
| } |
| } |
| |
| /** |
| * Format the record according to the specified delimiters. An end-of-record |
| * delimiter is optional, and only used if useRecordDelim is true. For |
| * use with TextOutputFormat, calling this with useRecordDelim=false may |
| * make more sense. |
| */ |
| public String toString( |
| com.cloudera.sqoop.lib.DelimiterSet delimiters, boolean useRecordDelim) { |
| if (useRecordDelim) { |
| return toString(delimiters); |
| } else { |
| // Setting this to false requires behavior in the generated class. |
| throw new RuntimeException( |
| "toString(delimiters, useRecordDelim=false) requires a newer " |
| + "SqoopRecord. Please regenerate your record class to use this " |
| + "function."); |
| } |
| } |
| |
| @Override |
| public Object clone() throws CloneNotSupportedException { |
| return super.clone(); |
| } |
| |
| /** |
| * Returns an integer specifying which API format version the |
| * generated class conforms to. Used by internal APIs for backwards |
| * compatibility. |
| * @return the API version this class was generated against. |
| */ |
| public abstract int getClassFormatVersion(); |
| |
| /** |
| * Use the delegate pattern to allow arbitrary processing of the |
| * fields of this record. |
| * @param processor A delegate that operates on this object. |
| * @throws IOException if the processor encounters an IO error when |
| * operating on this object. |
| * @throws com.cloudera.sqoop.lib.ProcessingException if the FieldMapProcessor |
| * encounters a general processing error when operating on this object. |
| */ |
| public void delegate(com.cloudera.sqoop.lib.FieldMapProcessor processor) |
| throws IOException, com.cloudera.sqoop.lib.ProcessingException { |
| processor.accept(this); |
| } |
| |
| @Override |
| /** |
| * {@inheriDoc} |
| * @throws RuntimeException if used with a record that was generated |
| * before this capability was added (1.1.0). |
| */ |
| public Map<String, Object> getFieldMap() { |
| // Default implementation does not support field iteration. |
| // ClassWriter should provide an overriding version. |
| throw new RuntimeException( |
| "Got null field map from record. Regenerate your record class."); |
| } |
| |
| /** |
| * Allows an arbitrary field to be set programmatically to the |
| * specified value object. The value object must match the |
| * type expected for the particular field or a RuntimeException |
| * will result. |
| * @throws RuntimeException if the specified field name does not exist. |
| */ |
| public void setField(String fieldName, Object fieldVal) { |
| throw new RuntimeException("This SqoopRecord does not support setField(). " |
| + "Regenerate your record class."); |
| } |
| |
| } |