in odps-sqoop/src/java/org/apache/sqoop/orm/ClassWriter.java [1680:1829]
public void generate() throws IOException {
Map<String, Integer> columnTypes = getColumnTypes();
if (connManager.isORMFacilitySelfManaged()) {
logORMSelfGenerationMessage();
return;
}
if (columnTypes == null) {
throw new IOException("No columns to generate for ClassWriter");
}
String[] colNames = getColumnNames(columnTypes);
// Column number should be more than 0
if (colNames == null || colNames.length == 0) {
throw new IllegalArgumentException("There is no column found in the "
+ "target table " + tableName
+ ". Please ensure that your table name is correct.");
}
// Translate all the column names into names that are safe to
// use as identifiers.
String [] cleanedColNames = cleanColNames(colNames);
Set<String> uniqColNames = new HashSet<String>();
for (int i = 0; i < colNames.length; i++) {
String identifier = cleanedColNames[i];
if (identifier.isEmpty()) { // Name can't be blank
throw new IllegalArgumentException("We found column without column "
+ "name. Please verify that you've entered all column names "
+ "in your query if using free form query import (consider "
+ "adding clause AS if you're using column transformation)");
}
// Guarantee uniq col identifier
if (uniqColNames.contains(identifier)) {
throw new IllegalArgumentException("Duplicate Column identifier "
+ "specified: '" + identifier + "'");
}
uniqColNames.add(identifier);
// Make sure the col->type mapping holds for the new identifier name, too
String col = colNames[i];
Integer type = columnTypes.get(col);
if (type == null) {
// column doesn't have a type, means that is illegal column name!
throw new IllegalArgumentException("Column name '" + col
+ "' not in table");
}
columnTypes.put(identifier, type);
}
// Check that all explicitly mapped columns are present in result set
Properties mapping = options.getMapColumnJava();
if (mapping != null && !mapping.isEmpty()) {
for(Object column : mapping.keySet()) {
if (!uniqColNames.contains((String)column)) {
throw new IllegalArgumentException(
"No column by the name "
+ column
+ "found while importing data; expecting one of "
+ uniqColNames);
}
}
}
// The db write() method may use column names in a different
// order. If this is set in the options, pull it out here and
// make sure we format the column names to identifiers in the same way
// as we do for the ordinary column list.
String [] dbWriteColNames = options.getDbOutputColumns();
String [] cleanedDbWriteColNames = null;
if (null == dbWriteColNames) {
cleanedDbWriteColNames = cleanedColNames;
} else {
cleanedDbWriteColNames = cleanColNames(dbWriteColNames);
}
if (LOG.isDebugEnabled()) {
LOG.debug("selected columns:");
for (String col : cleanedColNames) {
LOG.debug(" " + col);
}
if (cleanedDbWriteColNames != cleanedColNames) {
// dbWrite() has a different set of columns than the rest of the
// generators.
LOG.debug("db write column order:");
for (String dbCol : cleanedDbWriteColNames) {
LOG.debug(" " + dbCol);
}
}
}
// Generate the Java code.
StringBuilder sb = generateClassForColumns(columnTypes,
cleanedColNames, cleanedDbWriteColNames, colNames);
// Write this out to a file in the jar output directory.
// We'll move it to the user-visible CodeOutputDir after compiling.
String codeOutDir = options.getJarOutputDir();
// Get the class name to generate, which includes package components.
String className = new TableClassName(options).getClassForTable(tableName);
// Convert the '.' characters to '/' characters.
String sourceFilename = className.replace('.', File.separatorChar)
+ ".java";
String filename = codeOutDir + sourceFilename;
if (LOG.isDebugEnabled()) {
LOG.debug("Writing source file: " + filename);
LOG.debug("Table name: " + tableName);
StringBuilder sbColTypes = new StringBuilder();
for (String col : colNames) {
Integer colType = columnTypes.get(col);
sbColTypes.append(col + ":" + colType + ", ");
}
String colTypeStr = sbColTypes.toString();
LOG.debug("Columns: " + colTypeStr);
LOG.debug("sourceFilename is " + sourceFilename);
}
compileManager.addSourceFile(sourceFilename);
// Create any missing parent directories.
File file = new File(filename);
File dir = file.getParentFile();
if (null != dir && !dir.exists()) {
boolean mkdirSuccess = dir.mkdirs();
if (!mkdirSuccess) {
LOG.debug("Could not create directory tree for " + dir);
}
}
OutputStream ostream = null;
Writer writer = null;
try {
ostream = new FileOutputStream(filename);
writer = new OutputStreamWriter(ostream);
writer.append(sb.toString());
} finally {
if (null != writer) {
try {
writer.close();
} catch (IOException ioe) { // ignored because we're closing.
}
}
if (null != ostream) {
try {
ostream.close();
} catch (IOException ioe) { // ignored because we're closing.
}
}
}
}