[teiid-commits] teiid SVN: r1774 - in trunk: connector-api/src/main/java/org/teiid/connector/visitor/util and 6 other directories.
teiid-commits at lists.jboss.org
teiid-commits at lists.jboss.org
Fri Jan 22 12:24:27 EST 2010
Author: jdoyle
Date: 2010-01-22 12:24:27 -0500 (Fri, 22 Jan 2010)
New Revision: 1774
Added:
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java
Modified:
trunk/build/kit-runtime/deploy/log4j.xml
trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLReservedWords.java
trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/ConnectorState.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/impl/ConnectionImpl.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java
trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/SelectVisitor.java
trunk/connectors/sandbox/connector-object/src/main/java/com/metamatrix/connector/object/util/ObjectExecutionHelper.java
Log:
TEIID-844
Implement metadata creation in the SalesForce connector.
Added isReservedWord to SQLReservedWords
Added logging filter for Axis
Modified: trunk/build/kit-runtime/deploy/log4j.xml
===================================================================
--- trunk/build/kit-runtime/deploy/log4j.xml 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/build/kit-runtime/deploy/log4j.xml 2010-01-22 17:24:27 UTC (rev 1774)
@@ -81,6 +81,10 @@
<logger name="org.teiid">
<level value="WARN" />
</logger>
+
+ <logger name="org.apache.axis">
+ <level value="WARN" />
+ </logger>
<!-- un-comment to enable COMMAND log
<logger name="org.teiid.COMMAND_LOG" additivity="false">
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLReservedWords.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLReservedWords.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLReservedWords.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -22,8 +22,11 @@
package org.teiid.connector.visitor.util;
-public interface SQLReservedWords {
+import java.util.HashSet;
+import java.util.Set;
+public class SQLReservedWords {
+
public static final String ANY = "ANY"; //$NON-NLS-1$
public static final String ALL = "ALL"; //$NON-NLS-1$
public static final String ALL_COLS = "*"; //$NON-NLS-1$
@@ -145,4 +148,44 @@
public static final String LPAREN = "("; //$NON-NLS-1$
public static final String RPAREN = ")"; //$NON-NLS-1$
+
+ public static final String[] ALL_WORDS = new String[] {ALL, ALL_COLS, AND, ANY, AS, ASC, AVG, BEGIN, BETWEEN, BIGINTEGER,
+ BIGDECIMAL, BREAK, BY, BYTE, CASE, CAST, CHAR, CONVERT, CONTINUE, COUNT, CREATE, CRITERIA, CROSS, DATE, DEBUG, DECLARE,
+ DELETE, DESC, DISTINCT, DOUBLE, ELSE, END, ERROR, ESCAPE, EXCEPT, EXEC, EXECUTE, EXISTS, FALSE, FLOAT, FOR, FROM, FULL,
+ GROUP, HAS, HAVING, IF, IN, INNER, INSERT, INTEGER, INTERSECT, INTO, IS, JOIN, LEFT, LIKE, LONG, LOOP, MAKEDEP, MIN, MAX,
+ NOT, NULL, OBJECT, ON, OR, ORDER, OPTION, OUTER, PROCEDURE, RIGHT, SELECT, SET, SHORT, SHOWPLAN, SOME,
+ SQL_TSI_FRAC_SECOND, SQL_TSI_SECOND, SQL_TSI_MINUTE, SQL_TSI_HOUR, SQL_TSI_DAY, SQL_TSI_WEEK, SQL_TSI_MONTH,
+ SQL_TSI_QUARTER, SQL_TSI_YEAR, STRING, SUM, THEN, TIME, TIMESTAMP, TIMESTAMPADD, TIMESTAMPDIFF, TRANSLATE, TRUE, UNION,
+ UNKNOWN, UPDATE, USING, VALUES, VIRTUAL, WHEN, WITH, WHERE, WHILE,};
+
+ /**
+ * Set of CAPITALIZED reserved words for checking whether a string is a reserved word.
+ */
+ private static final Set RESERVED_WORDS = new HashSet();
+
+ // Initialize RESERVED_WORDS set
+ static {
+ // Iterate through the reserved words and capitalize all of them
+ for (int i = 0; i != SQLReservedWords.ALL_WORDS.length; ++i) {
+ String reservedWord = SQLReservedWords.ALL_WORDS[i];
+ SQLReservedWords.RESERVED_WORDS.add(reservedWord.toUpperCase());
+ }
+ }
+
+ /** Can't construct */
+ private SQLReservedWords() {
+ }
+
+ /**
+ * Check whether a string is a reserved word.
+ *
+ * @param str String to check
+ * @return True if reserved word, false if not or null
+ */
+ public static final boolean isReservedWord( String str ) {
+ if (str == null) {
+ return false;
+ }
+ return RESERVED_WORDS.contains(str.toUpperCase());
+ }
}
Modified: trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java
===================================================================
--- trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connector-api/src/main/java/org/teiid/connector/visitor/util/SQLStringVisitor.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -82,7 +82,7 @@
* Creates a SQL string for a LanguageObject subtree. Instances of this class
* are not reusable, and are not thread-safe.
*/
-public class SQLStringVisitor extends AbstractLanguageVisitor implements SQLReservedWords {
+public class SQLStringVisitor extends AbstractLanguageVisitor {
private Set<String> infixFunctions = new HashSet<String>(Arrays.asList("%", "+", "-", "*", "+", "/", "||", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
"&", "|", "^", "#")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
@@ -130,8 +130,8 @@
if (items != null && items.size() != 0) {
append(items.get(0));
for (int i = 1; i < items.size(); i++) {
- buffer.append(COMMA)
- .append(SPACE);
+ buffer.append(SQLReservedWords.COMMA)
+ .append(SQLReservedWords.SPACE);
append(items.get(i));
}
}
@@ -146,8 +146,8 @@
if (items != null && items.length != 0) {
append(items[0]);
for (int i = 1; i < items.length; i++) {
- buffer.append(COMMA)
- .append(SPACE);
+ buffer.append(SQLReservedWords.COMMA)
+ .append(SQLReservedWords.SPACE);
append(items[i]);
}
}
@@ -171,19 +171,19 @@
*/
public void visit(IAggregate obj) {
buffer.append(obj.getName())
- .append(LPAREN);
+ .append(SQLReservedWords.LPAREN);
if ( obj.isDistinct()) {
- buffer.append(DISTINCT)
- .append(SPACE);
+ buffer.append(SQLReservedWords.DISTINCT)
+ .append(SQLReservedWords.SPACE);
}
if (obj.getExpression() == null) {
- buffer.append(ALL_COLS);
+ buffer.append(SQLReservedWords.ALL_COLS);
} else {
append(obj.getExpression());
}
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/**
@@ -191,18 +191,18 @@
*/
public void visit(ICompareCriteria obj) {
append(obj.getLeftExpression());
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
switch(obj.getOperator()) {
- case EQ: buffer.append(EQ); break;
- case GE: buffer.append(GE); break;
- case GT: buffer.append(GT); break;
- case LE: buffer.append(LE); break;
- case LT: buffer.append(LT); break;
- case NE: buffer.append(NE); break;
+ case EQ: buffer.append(SQLReservedWords.EQ); break;
+ case GE: buffer.append(SQLReservedWords.GE); break;
+ case GT: buffer.append(SQLReservedWords.GT); break;
+ case LE: buffer.append(SQLReservedWords.LE); break;
+ case LT: buffer.append(SQLReservedWords.LT); break;
+ case NE: buffer.append(SQLReservedWords.NE); break;
default: buffer.append(UNDEFINED);
}
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(obj.getRightExpression());
}
@@ -212,8 +212,8 @@
public void visit(ICompoundCriteria obj) {
String opString = null;
switch(obj.getOperator()) {
- case AND: opString = AND; break;
- case OR: opString = OR; break;
+ case AND: opString = SQLReservedWords.AND; break;
+ case OR: opString = SQLReservedWords.OR; break;
default: opString = UNDEFINED;
}
@@ -224,16 +224,16 @@
// Special case - should really never happen, but we are tolerant
append((ILanguageObject)criteria.get(0));
} else {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
append((ILanguageObject)criteria.get(0));
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
for (int i = 1; i < criteria.size(); i++) {
- buffer.append(SPACE)
+ buffer.append(SQLReservedWords.SPACE)
.append(opString)
- .append(SPACE)
- .append(LPAREN);
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.LPAREN);
append((ILanguageObject)criteria.get(i));
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
}
@@ -243,16 +243,16 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IDelete)
*/
public void visit(IDelete obj) {
- buffer.append(DELETE)
- .append(SPACE);
+ buffer.append(SQLReservedWords.DELETE)
+ .append(SQLReservedWords.SPACE);
buffer.append(getSourceComment(obj));
- buffer.append(FROM)
- .append(SPACE);
+ buffer.append(SQLReservedWords.FROM)
+ .append(SQLReservedWords.SPACE);
append(obj.getGroup());
if (obj.getCriteria() != null) {
- buffer.append(SPACE)
- .append(WHERE)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.WHERE)
+ .append(SQLReservedWords.SPACE);
append(obj.getCriteria());
}
}
@@ -319,7 +319,7 @@
// If not, do normal logic: [group + "."] + element
if(groupName != null) {
elementName.append(groupName);
- elementName.append(DOT);
+ elementName.append(SQLReservedWords.DOT);
}
elementName.append(elemShortName);
return elementName.toString();
@@ -342,8 +342,8 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(com.metamatrix.data.language.IExecute)
*/
public void visit(IProcedure obj) {
- buffer.append(EXEC)
- .append(SPACE);
+ buffer.append(SQLReservedWords.EXEC)
+ .append(SQLReservedWords.SPACE);
if(obj.getMetadataObject() != null) {
buffer.append(getName(obj.getMetadataObject()));
@@ -351,7 +351,7 @@
buffer.append(obj.getProcedureName());
}
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
final List params = obj.getParameters();
if (params != null && params.size() != 0) {
IParameter param = null;
@@ -359,8 +359,8 @@
param = (IParameter)params.get(i);
if (param.getDirection() == Direction.IN || param.getDirection() == Direction.INOUT) {
if (i != 0) {
- buffer.append(COMMA)
- .append(SPACE);
+ buffer.append(SQLReservedWords.COMMA)
+ .append(SQLReservedWords.SPACE);
}
if (param.getValue() != null) {
buffer.append(param.getValue().toString());
@@ -370,26 +370,26 @@
}
}
}
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/*
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(com.metamatrix.data.language.IExistsCriteria)
*/
public void visit(IExistsCriteria obj) {
- buffer.append(EXISTS)
- .append(SPACE)
- .append(LPAREN);
+ buffer.append(SQLReservedWords.EXISTS)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.LPAREN);
append(obj.getQuery());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/**
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IFrom)
*/
public void visit(IFrom obj) {
- buffer.append(FROM)
- .append(SPACE);
+ buffer.append(SQLReservedWords.FROM)
+ .append(SQLReservedWords.SPACE);
append(obj.getItems());
}
@@ -404,61 +404,61 @@
String name = obj.getName();
List<IExpression> args = obj.getParameters();
- if(name.equalsIgnoreCase(CONVERT) || name.equalsIgnoreCase(CAST)) {
+ if(name.equalsIgnoreCase(SQLReservedWords.CONVERT) || name.equalsIgnoreCase(SQLReservedWords.CAST)) {
Object typeValue = ((ILiteral)args.get(1)).getValue();
buffer.append(name);
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
append(args.get(0));
- if(name.equalsIgnoreCase(CONVERT)) {
- buffer.append(COMMA);
- buffer.append(SPACE);
+ if(name.equalsIgnoreCase(SQLReservedWords.CONVERT)) {
+ buffer.append(SQLReservedWords.COMMA);
+ buffer.append(SQLReservedWords.SPACE);
} else {
- buffer.append(SPACE);
- buffer.append(AS);
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
+ buffer.append(SQLReservedWords.AS);
+ buffer.append(SQLReservedWords.SPACE);
}
buffer.append(typeValue);
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
} else if(isInfixFunction(name)) {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
if(args != null) {
for(int i=0; i<args.size(); i++) {
append(args.get(i));
if(i < (args.size()-1)) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
buffer.append(name);
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
}
}
}
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
- } else if(name.equalsIgnoreCase(TIMESTAMPADD) || name.equalsIgnoreCase(TIMESTAMPDIFF)) {
+ } else if(name.equalsIgnoreCase(SQLReservedWords.TIMESTAMPADD) || name.equalsIgnoreCase(SQLReservedWords.TIMESTAMPDIFF)) {
buffer.append(name);
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
if(args != null && args.size() > 0) {
buffer.append(((ILiteral)args.get(0)).getValue());
for(int i=1; i<args.size(); i++) {
- buffer.append(COMMA);
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.COMMA);
+ buffer.append(SQLReservedWords.SPACE);
append(args.get(i));
}
}
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
} else {
buffer.append(obj.getName())
- .append(LPAREN);
+ .append(SQLReservedWords.LPAREN);
append(obj.getParameters());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
}
@@ -478,10 +478,10 @@
}
if (obj.getDefinition() != null) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
if (useAsInGroupAlias()){
- buffer.append(AS)
- .append(SPACE);
+ buffer.append(SQLReservedWords.AS)
+ .append(SQLReservedWords.SPACE);
}
buffer.append(obj.getContext());
}
@@ -502,10 +502,10 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IGroupBy)
*/
public void visit(IGroupBy obj) {
- buffer.append(GROUP)
- .append(SPACE)
- .append(BY)
- .append(SPACE);
+ buffer.append(SQLReservedWords.GROUP)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.BY)
+ .append(SQLReservedWords.SPACE);
append(obj.getElements());
}
@@ -515,29 +515,29 @@
public void visit(IInCriteria obj) {
append(obj.getLeftExpression());
if (obj.isNegated()) {
- buffer.append(SPACE)
- .append(NOT);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.NOT);
}
- buffer.append(SPACE)
- .append(IN)
- .append(SPACE)
- .append(LPAREN);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.IN)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.LPAREN);
append(obj.getRightExpressions());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
public void visit(IInlineView obj) {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
if (obj.getOutput() != null) {
buffer.append(obj.getOutput());
} else {
append(obj.getQuery());
}
- buffer.append(RPAREN);
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.RPAREN);
+ buffer.append(SQLReservedWords.SPACE);
if(useAsInGroupAlias()) {
- buffer.append(AS);
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.AS);
+ buffer.append(SQLReservedWords.SPACE);
}
buffer.append(obj.getContext());
}
@@ -546,33 +546,33 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IInsert)
*/
public void visit(IInsert obj) {
- buffer.append(INSERT).append(SPACE);
+ buffer.append(SQLReservedWords.INSERT).append(SQLReservedWords.SPACE);
buffer.append(getSourceComment(obj));
- buffer.append(INTO).append(SPACE);
+ buffer.append(SQLReservedWords.INTO).append(SQLReservedWords.SPACE);
append(obj.getGroup());
if (obj.getElements() != null && obj.getElements().size() != 0) {
- buffer.append(SPACE).append(LPAREN);
+ buffer.append(SQLReservedWords.SPACE).append(SQLReservedWords.LPAREN);
int elementCount = obj.getElements().size();
for (int i = 0; i < elementCount; i++) {
buffer.append(getElementName(obj.getElements().get(i), false));
if (i < elementCount - 1) {
- buffer.append(COMMA);
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.COMMA);
+ buffer.append(SQLReservedWords.SPACE);
}
}
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(obj.getValueSource());
}
@Override
public void visit(IInsertExpressionValueSource obj) {
- buffer.append(VALUES).append(SPACE).append(LPAREN);
+ buffer.append(SQLReservedWords.VALUES).append(SQLReservedWords.SPACE).append(SQLReservedWords.LPAREN);
append(obj.getValues());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/**
@@ -580,14 +580,14 @@
*/
public void visit(IIsNullCriteria obj) {
append(obj.getExpression());
- buffer.append(SPACE)
- .append(IS)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.IS)
+ .append(SQLReservedWords.SPACE);
if (obj.isNegated()) {
- buffer.append(NOT)
- .append(SPACE);
+ buffer.append(SQLReservedWords.NOT)
+ .append(SQLReservedWords.SPACE);
}
- buffer.append(NULL);
+ buffer.append(SQLReservedWords.NULL);
}
/**
@@ -596,56 +596,56 @@
public void visit(IJoin obj) {
IFromItem leftItem = obj.getLeftItem();
if(useParensForJoins() && leftItem instanceof IJoin) {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
append(leftItem);
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
} else {
append(leftItem);
}
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
switch(obj.getJoinType()) {
case CROSS_JOIN:
- buffer.append(CROSS);
+ buffer.append(SQLReservedWords.CROSS);
break;
case FULL_OUTER_JOIN:
- buffer.append(FULL)
- .append(SPACE)
- .append(OUTER);
+ buffer.append(SQLReservedWords.FULL)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.OUTER);
break;
case INNER_JOIN:
- buffer.append(INNER);
+ buffer.append(SQLReservedWords.INNER);
break;
case LEFT_OUTER_JOIN:
- buffer.append(LEFT)
- .append(SPACE)
- .append(OUTER);
+ buffer.append(SQLReservedWords.LEFT)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.OUTER);
break;
case RIGHT_OUTER_JOIN:
- buffer.append(RIGHT)
- .append(SPACE)
- .append(OUTER);
+ buffer.append(SQLReservedWords.RIGHT)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.OUTER);
break;
default: buffer.append(UNDEFINED);
}
- buffer.append(SPACE)
- .append(JOIN)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.JOIN)
+ .append(SQLReservedWords.SPACE);
IFromItem rightItem = obj.getRightItem();
if(rightItem instanceof IJoin && (useParensForJoins() || obj.getJoinType() == IJoin.JoinType.CROSS_JOIN)) {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
append(rightItem);
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
} else {
append(rightItem);
}
final List criteria = obj.getCriteria();
if (criteria != null && criteria.size() != 0) {
- buffer.append(SPACE)
- .append(ON)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.ON)
+ .append(SQLReservedWords.SPACE);
Iterator critIter = criteria.iterator();
while(critIter.hasNext()) {
@@ -653,15 +653,15 @@
if(crit instanceof IPredicateCriteria) {
append(crit);
} else {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
append(crit);
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
if(critIter.hasNext()) {
- buffer.append(SPACE)
- .append(AND)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.AND)
+ .append(SQLReservedWords.SPACE);
}
}
}
@@ -673,31 +673,31 @@
public void visit(ILikeCriteria obj) {
append(obj.getLeftExpression());
if (obj.isNegated()) {
- buffer.append(SPACE)
- .append(NOT);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.NOT);
}
- buffer.append(SPACE)
- .append(LIKE)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.LIKE)
+ .append(SQLReservedWords.SPACE);
append(obj.getRightExpression());
if (obj.getEscapeCharacter() != null) {
- buffer.append(SPACE)
- .append(ESCAPE)
- .append(SPACE)
- .append(QUOTE)
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.ESCAPE)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.QUOTE)
.append(obj.getEscapeCharacter().toString())
- .append(QUOTE);
+ .append(SQLReservedWords.QUOTE);
}
}
public void visit(ILimit obj) {
- buffer.append(LIMIT)
- .append(SPACE);
+ buffer.append(SQLReservedWords.LIMIT)
+ .append(SQLReservedWords.SPACE);
if (obj.getRowOffset() > 0) {
buffer.append(obj.getRowOffset())
- .append(COMMA)
- .append(SPACE);
+ .append(SQLReservedWords.COMMA)
+ .append(SQLReservedWords.SPACE);
}
buffer.append(obj.getRowLimit());
}
@@ -709,7 +709,7 @@
if (obj.isBindValue()) {
buffer.append("?"); //$NON-NLS-1$
} else if (obj.getValue() == null) {
- buffer.append(NULL);
+ buffer.append(SQLReservedWords.NULL);
} else {
Class type = obj.getType();
String val = obj.getValue().toString();
@@ -732,9 +732,9 @@
.append(val)
.append("'}"); //$NON-NLS-1$
} else {
- buffer.append(QUOTE)
- .append(escapeString(val, QUOTE))
- .append(QUOTE);
+ buffer.append(SQLReservedWords.QUOTE)
+ .append(escapeString(val, SQLReservedWords.QUOTE))
+ .append(SQLReservedWords.QUOTE);
}
}
}
@@ -743,21 +743,21 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.INotCriteria)
*/
public void visit(INotCriteria obj) {
- buffer.append(NOT)
- .append(SPACE)
- .append(LPAREN);
+ buffer.append(SQLReservedWords.NOT)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.LPAREN);
append(obj.getCriteria());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/**
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IOrderBy)
*/
public void visit(IOrderBy obj) {
- buffer.append(ORDER)
- .append(SPACE)
- .append(BY)
- .append(SPACE);
+ buffer.append(SQLReservedWords.ORDER)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.BY)
+ .append(SQLReservedWords.SPACE);
append(obj.getItems());
}
@@ -774,8 +774,8 @@
buffer.append(UNDEFINED);
}
if (obj.getDirection() == IOrderByItem.DESC) {
- buffer.append(SPACE)
- .append(DESC);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.DESC);
} // Don't print default "ASC"
}
@@ -786,7 +786,7 @@
if (obj.getValue() == null) {
buffer.append(UNDEFINED_PARAM);
} else if (obj.getValue() == null) {
- buffer.append(NULL);
+ buffer.append(SQLReservedWords.NULL);
} else {
buffer.append(obj.getValue().toString());
}
@@ -798,31 +798,31 @@
public void visit(IQuery obj) {
visitSelect(obj.getSelect(), obj);
if (obj.getFrom() != null) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(obj.getFrom());
}
if (obj.getWhere() != null) {
- buffer.append(SPACE)
- .append(WHERE)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.WHERE)
+ .append(SQLReservedWords.SPACE);
append(obj.getWhere());
}
if (obj.getGroupBy() != null) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(obj.getGroupBy());
}
if (obj.getHaving() != null) {
- buffer.append(SPACE)
- .append(HAVING)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.HAVING)
+ .append(SQLReservedWords.SPACE);
append(obj.getHaving());
}
if (obj.getOrderBy() != null) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(obj.getOrderBy());
}
if (obj.getLimit() != null) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(obj.getLimit());
}
}
@@ -831,26 +831,26 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.ISearchedCaseExpression)
*/
public void visit(ISearchedCaseExpression obj) {
- buffer.append(CASE);
+ buffer.append(SQLReservedWords.CASE);
final int whenCount = obj.getWhenCount();
for (int i = 0; i < whenCount; i++) {
- buffer.append(SPACE)
- .append(WHEN)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.WHEN)
+ .append(SQLReservedWords.SPACE);
append(obj.getWhenCriteria(i));
- buffer.append(SPACE)
- .append(THEN)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.THEN)
+ .append(SQLReservedWords.SPACE);
append(obj.getThenExpression(i));
}
if (obj.getElseExpression() != null) {
- buffer.append(SPACE)
- .append(ELSE)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.ELSE)
+ .append(SQLReservedWords.SPACE);
append(obj.getElseExpression());
}
- buffer.append(SPACE)
- .append(END);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.END);
}
/**
@@ -861,10 +861,10 @@
}
private void visitSelect(ISelect obj, ICommand command) {
- buffer.append(SELECT).append(SPACE);
+ buffer.append(SQLReservedWords.SELECT).append(SQLReservedWords.SPACE);
buffer.append(getSourceComment(command));
if (obj.isDistinct()) {
- buffer.append(DISTINCT).append(SPACE);
+ buffer.append(SQLReservedWords.DISTINCT).append(SQLReservedWords.SPACE);
}
append(obj.getSelectSymbols());
}
@@ -877,9 +877,9 @@
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(com.metamatrix.data.language.IScalarSubquery)
*/
public void visit(IScalarSubquery obj) {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
append(obj.getQuery());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/**
@@ -888,9 +888,9 @@
public void visit(ISelectSymbol obj) {
append(obj.getExpression());
if (obj.hasAlias()) {
- buffer.append(SPACE)
- .append(AS)
- .append(SPACE)
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.AS)
+ .append(SQLReservedWords.SPACE)
.append(obj.getOutputName());
}
}
@@ -900,27 +900,27 @@
*/
public void visit(ISubqueryCompareCriteria obj) {
append(obj.getLeftExpression());
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
switch(obj.getOperator()) {
- case EQ: buffer.append(EQ); break;
- case GE: buffer.append(GE); break;
- case GT: buffer.append(GT); break;
- case LE: buffer.append(LE); break;
- case LT: buffer.append(LT); break;
- case NE: buffer.append(NE); break;
+ case EQ: buffer.append(SQLReservedWords.EQ); break;
+ case GE: buffer.append(SQLReservedWords.GE); break;
+ case GT: buffer.append(SQLReservedWords.GT); break;
+ case LE: buffer.append(SQLReservedWords.LE); break;
+ case LT: buffer.append(SQLReservedWords.LT); break;
+ case NE: buffer.append(SQLReservedWords.NE); break;
default: buffer.append(UNDEFINED);
}
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
switch(obj.getQuantifier()) {
- case ALL: buffer.append(ALL); break;
- case SOME: buffer.append(SOME); break;
+ case ALL: buffer.append(SQLReservedWords.ALL); break;
+ case SOME: buffer.append(SQLReservedWords.SOME); break;
default: buffer.append(UNDEFINED);
}
- buffer.append(SPACE);
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.SPACE);
+ buffer.append(SQLReservedWords.LPAREN);
append(obj.getQuery());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/*
@@ -929,33 +929,33 @@
public void visit(ISubqueryInCriteria obj) {
append(obj.getLeftExpression());
if (obj.isNegated()) {
- buffer.append(SPACE)
- .append(NOT);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.NOT);
}
- buffer.append(SPACE)
- .append(IN)
- .append(SPACE)
- .append(LPAREN);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.IN)
+ .append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.LPAREN);
append(obj.getQuery());
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
}
/**
* @see com.metamatrix.data.visitor.LanguageObjectVisitor#visit(org.teiid.connector.language.IUpdate)
*/
public void visit(IUpdate obj) {
- buffer.append(UPDATE)
- .append(SPACE);
+ buffer.append(SQLReservedWords.UPDATE)
+ .append(SQLReservedWords.SPACE);
buffer.append(getSourceComment(obj));
append(obj.getGroup());
- buffer.append(SPACE)
- .append(SET)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.SET)
+ .append(SQLReservedWords.SPACE);
append(obj.getChanges());
if (obj.getCriteria() != null) {
- buffer.append(SPACE)
- .append(WHERE)
- .append(SPACE);
+ buffer.append(SQLReservedWords.SPACE)
+ .append(SQLReservedWords.WHERE)
+ .append(SQLReservedWords.SPACE);
append(obj.getCriteria());
}
}
@@ -966,34 +966,34 @@
public void visit(ISetClause clause) {
buffer.append(getElementName(clause.getSymbol(), false));
- buffer.append(SPACE).append(EQ).append(SPACE);
+ buffer.append(SQLReservedWords.SPACE).append(SQLReservedWords.EQ).append(SQLReservedWords.SPACE);
append(clause.getValue());
}
public void visit(ISetQuery obj) {
appendSetQuery(obj.getLeftQuery());
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
appendSetOperation(obj.getOperation());
if(obj.isAll()) {
- buffer.append(SPACE);
- buffer.append(ALL);
+ buffer.append(SQLReservedWords.SPACE);
+ buffer.append(SQLReservedWords.ALL);
}
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
appendSetQuery(obj.getRightQuery());
IOrderBy orderBy = obj.getOrderBy();
if(orderBy != null) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(orderBy);
}
ILimit limit = obj.getLimit();
if(limit != null) {
- buffer.append(SPACE);
+ buffer.append(SQLReservedWords.SPACE);
append(limit);
}
}
@@ -1008,9 +1008,9 @@
protected void appendSetQuery(IQueryCommand obj) {
if(obj instanceof ISetQuery || useParensForSetQueries()) {
- buffer.append(LPAREN);
+ buffer.append(SQLReservedWords.LPAREN);
append(obj);
- buffer.append(RPAREN);
+ buffer.append(SQLReservedWords.RPAREN);
} else {
append(obj);
}
Modified: trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java
===================================================================
--- trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/connector-jdbc/src/main/java/org/teiid/connector/jdbc/translator/SQLConversionVisitor.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -53,6 +53,7 @@
import org.teiid.connector.language.ISetClause;
import org.teiid.connector.language.IParameter.Direction;
import org.teiid.connector.language.ISetQuery.Operation;
+import org.teiid.connector.visitor.util.SQLReservedWords;
import org.teiid.connector.visitor.util.SQLStringVisitor;
@@ -138,7 +139,7 @@
*/
private void translateSQLType(Class type, Object obj, StringBuilder valuesbuffer) {
if (obj == null) {
- valuesbuffer.append(NULL);
+ valuesbuffer.append(SQLReservedWords.NULL);
} else {
if(Number.class.isAssignableFrom(type)) {
boolean useFormatting = false;
@@ -173,9 +174,9 @@
} else {
// If obj is string, toSting() will not create a new String
// object, it returns it self, so new object creation.
- valuesbuffer.append(QUOTE)
- .append(escapeString(obj.toString(), QUOTE))
- .append(QUOTE);
+ valuesbuffer.append(SQLReservedWords.QUOTE)
+ .append(escapeString(obj.toString(), SQLReservedWords.QUOTE))
+ .append(SQLReservedWords.QUOTE);
}
}
}
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Connector.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -33,13 +33,17 @@
import org.teiid.connector.api.ConnectorLogger;
import org.teiid.connector.api.CredentialMap;
import org.teiid.connector.api.ExecutionContext;
+import org.teiid.connector.api.MetadataProvider;
import org.teiid.connector.api.ConnectorAnnotations.ConnectionPooling;
+import org.teiid.connector.metadata.runtime.MetadataFactory;
import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
@ConnectionPooling
-public class Connector extends org.teiid.connector.basic.BasicConnector {
+public class Connector extends org.teiid.connector.basic.BasicConnector implements MetadataProvider {
+ private static Connector connector;
+
private ConnectorLogger logger;
private ConnectorEnvironment connectorEnv;
@@ -50,6 +54,10 @@
private URL url;
private SalesforceCapabilities salesforceCapabilites;
+ public Connector() {
+ connector = this;
+ }
+
// ///////////////////////////////////////////////////////////
// Connector implementation
// ///////////////////////////////////////////////////////////
@@ -157,4 +165,15 @@
public ConnectorCapabilities getCapabilities() {
return salesforceCapabilites;
}
+
+ @Override
+ public void getConnectorMetadata(MetadataFactory metadataFactory)
+ throws ConnectorException {
+ MetadataProcessor processor = new MetadataProcessor((SalesforceConnection)getConnection(null),metadataFactory, logger);
+ processor.processMetadata();
+ }
+
+ public static Connector getConnector() {
+ return connector;
+ }
}
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/ConnectorState.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/ConnectorState.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/ConnectorState.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -34,12 +34,13 @@
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
public static final String URL = "URL";
+ public static final String MODEL_AUDIT_FIELDS = "ModelAuditFields";
String username;
String password;
URL url;
+ boolean modelAuditFields;
-
public ConnectorState(Properties props, ConnectorLogger logger) throws ConnectorException {
if (logger == null) {
throw new ConnectorException("Internal Exception: logger is null");
@@ -65,6 +66,11 @@
}
setUrl(salesforceURL);
}
+
+ Boolean modelAudits = Boolean.valueOf(props.getProperty(MODEL_AUDIT_FIELDS));
+ if (modelAudits) {
+ setModelAuditFields(modelAudits);
+ }
}
private void setUrl(URL salesforceURL) {
@@ -90,5 +96,12 @@
public String getPassword() {
return password;
}
+
+ public void setModelAuditFields(boolean modelAuditFields) {
+ this.modelAuditFields = modelAuditFields;
+ }
+ public boolean isModelAuditFields() {
+ return modelAuditFields;
+ }
}
Added: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java (rev 0)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -0,0 +1,298 @@
+package com.metamatrix.connector.salesforce;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.connector.api.ConnectorException;
+import org.teiid.connector.api.ConnectorLogger;
+import org.teiid.connector.metadata.runtime.Column;
+import org.teiid.connector.metadata.runtime.KeyRecord;
+import org.teiid.connector.metadata.runtime.MetadataFactory;
+import org.teiid.connector.metadata.runtime.Table;
+import org.teiid.connector.metadata.runtime.BaseColumn.NullType;
+import org.teiid.connector.metadata.runtime.Column.SearchType;
+import org.teiid.connector.visitor.util.SQLReservedWords;
+
+import com.metamatrix.common.types.DataTypeManager;
+import com.metamatrix.connector.salesforce.connection.SalesforceConnection;
+import com.sforce.soap.partner.ChildRelationship;
+import com.sforce.soap.partner.DescribeGlobalResult;
+import com.sforce.soap.partner.DescribeGlobalSObjectResult;
+import com.sforce.soap.partner.DescribeSObjectResult;
+import com.sforce.soap.partner.Field;
+import com.sforce.soap.partner.FieldType;
+import com.sforce.soap.partner.PicklistEntry;
+
+public class MetadataProcessor {
+ private MetadataFactory metadataFactory;
+ private SalesforceConnection connection;
+ private ConnectorLogger logger;
+
+ private Map<String, Table> tableMap = new HashMap<String, Table>();
+ private List<Relationship> relationships = new ArrayList<Relationship>();
+ private boolean hasUpdateableColumn = false;
+ private List<Column> columns;
+
+ // Audit Fields
+ public static final String AUDIT_FIELD_CREATED_BY_ID = "CreatedById"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_CREATED_DATE = "CreatedDate"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_LAST_MODIFIED_BY_ID = "LastModifiedById"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_LAST_MODIFIED_DATE = "LastModifiedDate"; //$NON-NLS-1$
+ public static final String AUDIT_FIELD_SYSTEM_MOD_STAMP = "SystemModstamp"; //$NON-NLS-1$
+
+ // Model Extensions
+ static final String TABLE_SUPPORTS_CREATE = "Supports Create"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_DELETE = "Supports Delete"; //$NON-NLS-1$
+ static final String TABLE_CUSTOM = "Custom"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_LOOKUP = "Supports ID Lookup"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_MERGE = "Supports Merge"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_QUERY = "Supports Query"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_REPLICATE = "Supports Replicate"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_RETRIEVE = "Supports Retrieve"; //$NON-NLS-1$
+ static final String TABLE_SUPPORTS_SEARCH = "Supports Search"; //$NON-NLS-1$
+
+ static final String COLUMN_DEFAULTED = "Defaulted on Create"; //$NON-NLS-1$
+ static final String COLUMN_CUSTOM = "Custom"; //$NON-NLS-1$
+ static final String COLUMN_CALCULATED = "Calculated"; //$NON-NLS-1$
+ static final String COLUMN_PICKLIST_VALUES = "Picklist Values"; //$NON-NLS-1$
+
+ public MetadataProcessor(SalesforceConnection connection, MetadataFactory metadataFactory, ConnectorLogger logger) {
+ this.connection = connection;
+ this.metadataFactory = metadataFactory;
+ this.logger = logger;
+ }
+
+ public void processMetadata() throws ConnectorException {
+ DescribeGlobalResult globalResult = connection.getObjects();
+ DescribeGlobalSObjectResult[] objects = globalResult.getSobjects();
+ for (int i=0;i < objects.length;i++) {
+ DescribeGlobalSObjectResult object = objects[i];
+ addTable(object);
+ }
+ addRelationships();
+ }
+
+ private void addRelationships() throws ConnectorException {
+ for (Iterator<Relationship> iterator = relationships.iterator(); iterator.hasNext();) {
+ Relationship relationship = iterator.next();
+ ConnectorState state = Connector.getConnector().getState();
+ if (!state.isModelAuditFields() && isAuditField(relationship.getForeignKeyField())) {
+ continue;
+ }
+
+ Table parent = tableMap.get(NameUtil.normalizeName(relationship.getParentTable()));
+ KeyRecord pk = parent.getPrimaryKey();
+ if (null == pk) {
+ throw new RuntimeException("ERROR !!primary key column not found!!"); //$NON-NLS-1$
+ }
+ ArrayList<String> columnNames = new ArrayList<String>();
+ columnNames.add(pk.getName());
+
+
+ Table child = tableMap.get(NameUtil.normalizeName(relationship.getChildTable()));
+
+ Column col = null;
+ columns = child.getColumns();
+ for (Iterator colIter = columns.iterator(); colIter.hasNext();) {
+ Column column = (Column) colIter.next();
+ if(column.getName().equals(relationship.getForeignKeyField())) {
+ col = column;
+ }
+ }
+ if (null == col) throw new RuntimeException(
+ "ERROR !!foreign key column not found!! " + child.getName() + relationship.getForeignKeyField()); //$NON-NLS-1$
+
+
+ String columnName = "FK_" + parent.getName() + "_" + col.getName();
+ ArrayList<String> columnNames2 = new ArrayList<String>();
+ columnNames2.add(col.getName());
+ metadataFactory.addForiegnKey(columnName, columnNames2, parent, child);
+
+ }
+
+
+ }
+
+ public static boolean isAuditField(String name) {
+ boolean result = false;
+ if(name.equals(AUDIT_FIELD_CREATED_BY_ID) ||
+ name.equals(AUDIT_FIELD_CREATED_DATE) ||
+ name.equals(AUDIT_FIELD_LAST_MODIFIED_BY_ID) ||
+ name.equals(AUDIT_FIELD_LAST_MODIFIED_DATE) ||
+ name.equals(AUDIT_FIELD_SYSTEM_MOD_STAMP)) {
+ result = true;
+ }
+ return result;
+ }
+
+ private void addTable(DescribeGlobalSObjectResult object) throws ConnectorException {
+ DescribeSObjectResult objectMetadata = connection.getObjectMetaData(object.getName());
+ String name = NameUtil.normalizeName(objectMetadata.getName());
+ Table table = metadataFactory.addTable(name);
+
+ table.setNameInSource(objectMetadata.getName());
+ tableMap.put(name, table);
+ getRelationships(objectMetadata);
+
+ table.setProperty(TABLE_CUSTOM, String.valueOf(objectMetadata.isCustom()));
+ table.setProperty(TABLE_SUPPORTS_CREATE, String.valueOf(objectMetadata.isCreateable()));
+ table.setProperty(TABLE_SUPPORTS_DELETE, String.valueOf(objectMetadata.isDeletable()));
+ table.setProperty(TABLE_SUPPORTS_MERGE, String.valueOf(objectMetadata.isMergeable()));
+ table.setProperty(TABLE_SUPPORTS_QUERY, String.valueOf(objectMetadata.isQueryable()));
+ table.setProperty(TABLE_SUPPORTS_REPLICATE, String.valueOf(objectMetadata.isReplicateable()));
+ table.setProperty(TABLE_SUPPORTS_RETRIEVE, String.valueOf(objectMetadata.isRetrieveable()));
+ table.setProperty(TABLE_SUPPORTS_SEARCH, String.valueOf(objectMetadata.isSearchable()));
+
+ hasUpdateableColumn = false;
+ addColumns(objectMetadata, table);
+
+ // Some SF objects return true for isUpdateable() but have no updateable columns.
+ if(hasUpdateableColumn && objectMetadata.isUpdateable()) {
+ table.setSupportsUpdate(true);
+ }
+ }
+
+ private void getRelationships(DescribeSObjectResult objectMetadata) {
+ ChildRelationship[] children = objectMetadata.getChildRelationships();
+ if(children != null && children.length != 0) {
+ for (int i = 0; i < children.length; i++) {
+ ChildRelationship childRelation = children[i];
+ Relationship newRelation = new RelationshipImpl();
+ newRelation.setParentTable(objectMetadata.getName());
+ newRelation.setChildTable(childRelation.getChildSObject());
+ newRelation.setForeignKeyField(childRelation.getField());
+ newRelation.setCascadeDelete(childRelation.isCascadeDelete());
+ relationships.add(newRelation);
+ }
+ }
+ }
+
+ private void addColumns(DescribeSObjectResult objectMetadata, Table table) throws ConnectorException {
+ Field[] fields = objectMetadata.getFields();
+ for (int i=0;i < fields.length;i++) {
+ Field field = fields[i];
+ String normalizedName = NameUtil.normalizeName(field.getName());
+ FieldType fieldType = field.getType();
+ if(!Connector.getConnector().getState().isModelAuditFields() && isAuditField(field.getName())) {
+ continue;
+ }
+ String sfTypeName = fieldType.getValue();
+ Column column = null;
+ if(sfTypeName.equals(FieldType._value1) || //string
+ sfTypeName.equals(FieldType._value4) || //"combobox"
+ sfTypeName.equals(FieldType._value5) || //"reference"
+ sfTypeName.equals(FieldType._value13) || //"phone"
+ sfTypeName.equals(FieldType._value14) || //"id"
+ sfTypeName.equals(FieldType._value18) || //"url"
+ sfTypeName.equals(FieldType._value19) || //"email"
+ sfTypeName.equals(FieldType._value20) || //"encryptedstring"
+ sfTypeName.equals(FieldType._value21)) { //"anytype"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ column.setNativeType(sfTypeName);
+ if(sfTypeName.equals(FieldType._value14)) {
+ column.setNullType(NullType.No_Nulls);
+ ArrayList<String> columnNames = new ArrayList<String>();
+ columnNames.add(field.getName());
+ metadataFactory.addPrimaryKey(field.getName()+"_PK", columnNames, table);
+ }
+ }
+ else if(sfTypeName.equals(FieldType._value2)) { // "picklist"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ if(field.isRestrictedPicklist()) {
+ column.setNativeType("restrictedpicklist");
+ } else {
+ column.setNativeType(FieldType._value2);
+ }
+
+ column.setProperty(COLUMN_PICKLIST_VALUES, getPicklistValues(field));
+ }
+ else if(sfTypeName.equals(FieldType._value3)) { //"multipicklist"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ if(field.isRestrictedPicklist()) {
+ column.setNativeType("restrictedmultiselectpicklist");
+ } else {
+ column.setNativeType(FieldType._value3);
+ }
+ column.setProperty(COLUMN_PICKLIST_VALUES, getPicklistValues(field));
+ }
+ else if(sfTypeName.equals(FieldType._value6)) { //"base64"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.BLOB, table);
+ column.setNativeType(FieldType._value6);
+ }
+ else if(sfTypeName.equals(FieldType._value7)) { //"boolean"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.BOOLEAN, table);
+ column.setNativeType(FieldType._value7);
+ }
+ else if(sfTypeName.equals(FieldType._value8)) { //"currency"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DOUBLE, table);
+ column.setNativeType(FieldType._value8);
+ column.setCurrency(true);
+ column.setScale(field.getScale());
+ column.setPrecision(field.getPrecision());
+ }
+ else if(sfTypeName.equals(FieldType._value9)) { //"textarea"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.STRING, table);
+ column.setNativeType(FieldType._value9);
+ column.setSearchType(SearchType.Unsearchable);
+ }
+ else if(sfTypeName.equals(FieldType._value10)) { //"int"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.INTEGER, table);
+ column.setNativeType(FieldType._value10);
+ column.setPrecision(field.getPrecision());
+ }
+ else if(sfTypeName.equals(FieldType._value11) || //"double"
+ sfTypeName.equals(FieldType._value12)) { //"percent"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DOUBLE, table);
+ column.setNativeType(sfTypeName);
+ column.setScale(field.getScale());
+ column.setPrecision(field.getPrecision());
+ }
+ else if(sfTypeName.equals(FieldType._value15)) { //"date"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.DATE, table);
+ column.setNativeType(FieldType._value15);
+ }
+ else if(sfTypeName.equals(FieldType._value16)) { //"datetime"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.TIMESTAMP, table);
+ column.setNativeType(FieldType._value16);
+ }
+ else if(sfTypeName.equals(FieldType._value17)) { //"time"
+ column = metadataFactory.addColumn(normalizedName, DataTypeManager.DefaultDataTypes.TIME, table);
+ column.setNativeType(FieldType._value17);
+ }
+ if(null == column) {
+ logger.logError("Unknown type returned by SalesForce: " + sfTypeName);
+ continue;
+ } else {
+ column.setNameInSource(field.getName());
+ column.setLength(field.getLength());
+ if(field.isUpdateable()) {
+ column.setUpdatable(true);
+ hasUpdateableColumn = true;
+ }
+ column.setProperty(COLUMN_CALCULATED, String.valueOf(field.isCalculated()));
+ column.setProperty(COLUMN_CUSTOM, String.valueOf(field.isCustom()));
+ column.setProperty(COLUMN_DEFAULTED, String.valueOf(field.isDefaultedOnCreate()));
+ }
+
+ }
+ }
+
+ private String getPicklistValues(Field field) {
+ StringBuffer picklistValues = new StringBuffer();
+ if(null != field.getPicklistValues() && 0 != field.getPicklistValues().length) {
+ List<PicklistEntry> entries = Arrays.asList(field.getPicklistValues());
+ for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
+ PicklistEntry entry = (PicklistEntry) iterator.next();
+ picklistValues.append(entry.getValue());
+ if(iterator.hasNext()) {
+ picklistValues.append(',');
+ }
+ }
+ }
+ return picklistValues.toString();
+ }
+}
Property changes on: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/MetadataProcessor.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java (rev 0)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -0,0 +1,85 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ *
+ * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
+ *
+ * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
+ */
+package com.metamatrix.connector.salesforce;
+
+import org.teiid.connector.visitor.util.SQLReservedWords;
+
+public class NameUtil {
+
+ public static String normalizeName( String nameIn ) {
+ String normal = nameIn.trim();
+ normal = removeDuplicate(normal);
+ normal = removeSpaces(normal);
+ normal = removeIllegalChars(normal);
+ normal = removeTrailingUnderscore(normal);
+ normal = removeLeadingUnderscore(normal);
+ normal = checkReservedWords(normal);
+ return normal;
+
+ }
+
+ /**
+ * @param normal
+ * @return
+ */
+ private static String checkReservedWords( String normal ) {
+ if (SQLReservedWords.isReservedWord(normal)) {
+ normal = normal + "_"; //$NON-NLS-1$
+ }
+ return normal;
+ }
+
+ private static String removeTrailingUnderscore( String normal ) {
+ if (normal.endsWith("_")) { //$NON-NLS-1$
+ return normal.substring(0, normal.lastIndexOf('_'));
+ }
+ return normal;
+ }
+
+ private static String removeIllegalChars( String normal ) {
+ String edit = normal;
+ edit = edit.replace('.', '_');
+ edit = edit.replace('(', '_');
+ edit = edit.replace(')', '_');
+ edit = edit.replace('/', '_');
+ edit = edit.replace('\\', '_');
+ edit = edit.replace(':', '_');
+ edit = edit.replace('\'', '_');
+ edit = edit.replace('-', '_');
+ edit = edit.replace("%", "percentage");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("#", "number");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("$", "_");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("{", "_");//$NON-NLS-1$ //$NON-NLS-2$
+ edit = edit.replace("}", "_");//$NON-NLS-1$ //$NON-NLS-2$
+ return edit;
+ }
+
+ private static String removeSpaces( String normal ) {
+ return normal.replace(' ', '_');
+ }
+
+ private static String removeDuplicate( String normal ) {
+ if (normal.indexOf('(') < 0 || normal.indexOf(')') != normal.length() - 1) return normal;
+ String firstPart = normal.substring(0, normal.indexOf('(')).trim();
+ String secondPart = normal.substring(normal.indexOf('(') + 1, normal.length() - 1).trim();
+ if (firstPart.equals(secondPart) || secondPart.equals("null")) return firstPart; //$NON-NLS-1$
+ return normal;
+ }
+
+ /**
+ * @param normal
+ * @return
+ */
+ private static String removeLeadingUnderscore( String normal ) {
+ while (normal.indexOf('_') == 0) {
+ normal = normal.substring(1);
+ }
+ return normal;
+ }
+
+}
\ No newline at end of file
Property changes on: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/NameUtil.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java (rev 0)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -0,0 +1,21 @@
+package com.metamatrix.connector.salesforce;
+
+public interface Relationship {
+
+ void setParentTable(String name);
+
+ void setChildTable(String childSObject);
+
+ void setForeignKeyField(String field);
+
+ void setCascadeDelete(boolean cascadeDelete);
+
+ public boolean isCascadeDelete();
+
+ public String getChildTable();
+
+ public String getForeignKeyField();
+
+ public String getParentTable();
+
+}
Property changes on: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/Relationship.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java (rev 0)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -0,0 +1,40 @@
+package com.metamatrix.connector.salesforce;
+
+public class RelationshipImpl implements Relationship {
+ boolean cascadeDelete;
+ public String childTablename;
+ public String parentTableName;
+ public String foreignKeyField;
+
+ public void setCascadeDelete(boolean delete) {
+ cascadeDelete = delete;
+ }
+
+ public boolean isCascadeDelete() {
+ return cascadeDelete;
+ }
+
+ public void setChildTable(String childTable) {
+ childTablename = childTable;
+ }
+
+ public String getChildTable() {
+ return childTablename;
+ }
+
+ public String getForeignKeyField() {
+ return foreignKeyField;
+ }
+
+ public void setForeignKeyField(String foreignKeyField) {
+ this.foreignKeyField = foreignKeyField;
+ }
+
+ public String getParentTable() {
+ return parentTableName;
+ }
+
+ public void setParentTable(String parentTableName) {
+ this.parentTableName = parentTableName;
+ }
+}
Property changes on: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/RelationshipImpl.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/SalesforceConnection.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -47,6 +47,8 @@
import com.metamatrix.connector.salesforce.execution.QueryExecutionImpl;
import com.metamatrix.connector.salesforce.execution.UpdateExecutionImpl;
import com.metamatrix.connector.salesforce.execution.UpdatedResult;
+import com.sforce.soap.partner.DescribeGlobalResult;
+import com.sforce.soap.partner.DescribeSObjectResult;
import com.sforce.soap.partner.QueryResult;
import com.sforce.soap.partner.sobject.SObject;
@@ -176,4 +178,12 @@
objects, objects.length);
return result;
}
+
+ public DescribeGlobalResult getObjects() throws ConnectorException {
+ return connection.getObjects();
+ }
+
+ public DescribeSObjectResult getObjectMetaData(String objectName) throws ConnectorException {
+ return connection.getObjectMetaData(objectName);
+ }
}
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/impl/ConnectionImpl.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/impl/ConnectionImpl.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/connection/impl/ConnectionImpl.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -48,6 +48,8 @@
import com.sforce.soap.partner.CallOptions;
import com.sforce.soap.partner.DeleteResult;
import com.sforce.soap.partner.DeletedRecord;
+import com.sforce.soap.partner.DescribeGlobalResult;
+import com.sforce.soap.partner.DescribeSObjectResult;
import com.sforce.soap.partner.GetDeletedResult;
import com.sforce.soap.partner.GetUpdatedResult;
import com.sforce.soap.partner.LoginResult;
@@ -340,4 +342,26 @@
throw new ConnectorException(e, e.getMessage());
}
}
+
+ public DescribeGlobalResult getObjects() throws ConnectorException {
+ try {
+ return binding.describeGlobal();
+ } catch (RemoteException e) {
+ ConnectorException ce = new ConnectorException(e.getCause().getMessage());
+ ce.initCause(e.getCause());
+ throw ce;
+ }
+ }
+
+ public DescribeSObjectResult getObjectMetaData(String objectName) throws ConnectorException {
+ try {
+ return binding.describeSObject(objectName);
+ } catch (InvalidSObjectFault e) {
+ throw new ConnectorException(e.getExceptionMessage());
+ } catch (UnexpectedErrorFault e) {
+ throw new ConnectorException(e.getMessage());
+ } catch (RemoteException e) {
+ throw new ConnectorException(e, e.getMessage());
+ }
+ }
}
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/InsertVisitor.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -64,7 +64,10 @@
String val;
if(value instanceof ILiteral) {
ILiteral literalValue = (ILiteral)value;
- val = this.stripQutes(literalValue.getValue().toString());
+ val = literalValue.getValue().toString();
+ if(null != val && !val.isEmpty()) {
+ val = this.stripQutes(val);
+ }
} else {
val = value.toString();
}
Modified: trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/SelectVisitor.java
===================================================================
--- trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/SelectVisitor.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/connector-salesforce/src/main/java/com/metamatrix/connector/salesforce/execution/visitors/SelectVisitor.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -51,7 +51,7 @@
private int idIndex = -1; // index of the ID select symbol.
protected List<ISelectSymbol> selectSymbols;
protected StringBuffer limitClause = new StringBuffer();
- private Boolean supportsRetrieve;
+ private Boolean objectSupportsRetrieve;
public SelectVisitor(RuntimeMetadata metadata) {
super(metadata);
@@ -113,7 +113,7 @@
if(fromItem instanceof IGroup) {
table = ((IGroup)fromItem).getMetadataObject();
String supportsQuery = (String)table.getProperties().get(Constants.SUPPORTS_QUERY);
- supportsRetrieve = Boolean.valueOf((String)table.getProperties().get(Constants.SUPPORTS_RETRIEVE));
+ objectSupportsRetrieve = Boolean.valueOf((String)table.getProperties().get(Constants.SUPPORTS_RETRIEVE));
if (!Boolean.valueOf(supportsQuery)) {
throw new ConnectorException(table.getNameInSource() + " "
+ Messages.getString("CriteriaVisitor.query.not.supported"));
@@ -230,7 +230,7 @@
}
public boolean canRetrieve() {
- return supportsRetrieve && hasOnlyIDCriteria();
+ return objectSupportsRetrieve && hasOnlyIDCriteria();
}
}
Modified: trunk/connectors/sandbox/connector-object/src/main/java/com/metamatrix/connector/object/util/ObjectExecutionHelper.java
===================================================================
--- trunk/connectors/sandbox/connector-object/src/main/java/com/metamatrix/connector/object/util/ObjectExecutionHelper.java 2010-01-22 15:35:49 UTC (rev 1773)
+++ trunk/connectors/sandbox/connector-object/src/main/java/com/metamatrix/connector/object/util/ObjectExecutionHelper.java 2010-01-22 17:24:27 UTC (rev 1774)
@@ -47,7 +47,7 @@
/**
*/
-public class ObjectExecutionHelper implements SQLReservedWords {
+public class ObjectExecutionHelper {
private static final String ESCAPED_QUOTE = "''"; //$NON-NLS-1$
private static final TimeZone LOCAL_TIME_ZONE = TimeZone.getDefault();
@@ -58,7 +58,7 @@
* @return a SQL-safe string
*/
protected String escapeString(String str) {
- return StringUtil.replaceAll(str, QUOTE, ESCAPED_QUOTE);
+ return StringUtil.replaceAll(str, SQLReservedWords.QUOTE, ESCAPED_QUOTE);
}
/**
More information about the teiid-commits
mailing list