[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