Update JPQL query Hermes refactoring API - Patch from Pascal
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/property_files/jpa_jpql_validation.properties b/jpa/plugins/org.eclipse.jpt.jpa.core/property_files/jpa_jpql_validation.properties
index 385981b..58cf483 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/property_files/jpa_jpql_validation.properties
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/property_files/jpa_jpql_validation.properties
@@ -200,10 +200,14 @@
 EXISTS_EXPRESSION_MISSING_RIGHT_PARENTHESIS = The right parenthesis is missing from the EXISTS expression.
 
 # FunctionExpression - Grammar
-FUNCTION_EXPRESSION_INVALID_EXPRESSION = The argument is not valid.
-FUNCTION_EXPRESSION_MISSING_FUNCTION_NAME = The SQL function name must be specified.
-FUNCTION_EXPRESSION_MISSING_LEFT_PARENTHESIS = The left parenthesis is missing from the expression.
-FUNCTION_EXPRESSION_MISSING_RIGHT_PARENTHESIS = The right parenthesis is missing from the expression.
+FUNCTION_EXPRESSION_HAS_EXPRESSION = The function {0} should not have any argument.
+FUNCTION_EXPRESSION_INVALID_EXPRESSION = The function {0}''s argument is not valid.
+FUNCTION_EXPRESSION_MISSING_EXPRESSION = The function {0}''s argument must be specified.
+FUNCTION_EXPRESSION_MISSING_FUNCTION_NAME = The function name must be specified.
+FUNCTION_EXPRESSION_MISSING_LEFT_PARENTHESIS = The left parenthesis is missing from the function {0}.
+FUNCTION_EXPRESSION_MISSING_ONE_EXPRESSION = The function {0} must have one argument specified.
+FUNCTION_EXPRESSION_MISSING_RIGHT_PARENTHESIS = The right parenthesis is missing from the function {0}.
+FUNCTION_EXPRESSION_MORE_THAN_ONE_EXPRESSION = The function {0} has more than one argument, can only specify one argument.
 
 # GroupByClause - Grammar
 GROUP_BY_CLAUSE_GROUP_BY_ITEM_ENDS_WITH_COMMA = The select expression cannot end with a comma.
@@ -401,9 +405,6 @@
 RESULT_VARIABLE_MISSING_SELECT_EXPRESSION = The select item is missing from the result variable declaration.
 RESULT_VARIABLE_MISSING_RESULT_VARIABLE = The result variable is missing from the select item declaration.
 
-# SelectStatement - Semantic
-SELECT_STATEMENT_SELECT_CLAUSE_HAS_NON_AGGREGATE_FUNCTIONS = The select list can only consist of aggregate functions because there is no GROUP BY clause and the HAVING clause is used.
-
 # SimpleSelectClause - Grammar
 SIMPLE_SELECT_CLAUSE_NOT_SINGLE_EXPRESSION = Only one expression can be declared in a SELECT clause of a subquery.
 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaJpqlQueryHelper.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaJpqlQueryHelper.java
index da1d382..7c0e962 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaJpqlQueryHelper.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/GenericJpaJpqlQueryHelper.java
@@ -24,10 +24,17 @@
 import org.eclipse.persistence.jpa.jpql.DefaultContentAssistVisitor;
 import org.eclipse.persistence.jpa.jpql.DefaultGrammarValidator;
 import org.eclipse.persistence.jpa.jpql.DefaultJPQLQueryContext;
+import org.eclipse.persistence.jpa.jpql.DefaultRefactoringTool;
 import org.eclipse.persistence.jpa.jpql.DefaultSemanticValidator;
 import org.eclipse.persistence.jpa.jpql.JPQLQueryContext;
+import org.eclipse.persistence.jpa.jpql.RefactoringTool;
+import org.eclipse.persistence.jpa.jpql.model.IJPQLQueryBuilder;
+import org.eclipse.persistence.jpa.jpql.model.JPQLQueryBuilder1_0;
+import org.eclipse.persistence.jpa.jpql.model.JPQLQueryBuilder2_0;
+import org.eclipse.persistence.jpa.jpql.model.JPQLQueryBuilder2_1;
 import org.eclipse.persistence.jpa.jpql.parser.JPQLGrammar;
 import org.eclipse.persistence.jpa.jpql.spi.IMappingBuilder;
+import org.eclipse.persistence.jpa.jpql.spi.IQuery;
 
 /**
  * The default implementation of {@link JpaJpqlQueryHelper} that provides support based on the Java
@@ -61,7 +68,7 @@
 	 */
 	@Override
 	protected AbstractGrammarValidator buildGrammarValidator(JPQLQueryContext queryContext) {
-		return new DefaultGrammarValidator(queryContext);
+		return new DefaultGrammarValidator(queryContext.getGrammar());
 	}
 
 	/**
@@ -89,6 +96,34 @@
 	}
 
 	/**
+	 * Creates the right {@link IJPQLQueryBuilder} based on the JPQL grammar.
+	 *
+	 * @return A new concrete instance of {@link IJPQLQueryBuilder}
+	 */
+	protected IJPQLQueryBuilder buildQueryBuilder() {
+		switch (getGrammar().getJPAVersion()) {
+			case VERSION_1_0: return new JPQLQueryBuilder1_0();
+			case VERSION_2_0: return new JPQLQueryBuilder2_0();
+			default:          return new JPQLQueryBuilder2_1();
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public RefactoringTool buildRefactoringTool() {
+
+		IQuery query = getQuery();
+
+		return new DefaultRefactoringTool(
+			query.getProvider(),
+			buildQueryBuilder(),
+			query.getExpression()
+		);
+	}
+
+	/**
 	 * {@inheritDoc}
 	 */
 	@Override
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/internal/EclipseLinkJpaJpqlQueryHelper.java b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/internal/EclipseLinkJpaJpqlQueryHelper.java
index 82ebbb2..6af4aa7 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/internal/EclipseLinkJpaJpqlQueryHelper.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/internal/EclipseLinkJpaJpqlQueryHelper.java
@@ -21,13 +21,18 @@
 import org.eclipse.persistence.jpa.jpql.AbstractContentAssistVisitor;
 import org.eclipse.persistence.jpa.jpql.AbstractGrammarValidator;
 import org.eclipse.persistence.jpa.jpql.AbstractSemanticValidator;
+import org.eclipse.persistence.jpa.jpql.DefaultRefactoringTool;
 import org.eclipse.persistence.jpa.jpql.EclipseLinkContentAssistVisitor;
 import org.eclipse.persistence.jpa.jpql.EclipseLinkGrammarValidator;
 import org.eclipse.persistence.jpa.jpql.EclipseLinkJPQLQueryContext;
 import org.eclipse.persistence.jpa.jpql.EclipseLinkSemanticValidator;
 import org.eclipse.persistence.jpa.jpql.JPQLQueryContext;
+import org.eclipse.persistence.jpa.jpql.RefactoringTool;
+import org.eclipse.persistence.jpa.jpql.model.EclipseLinkJPQLQueryBuilder;
+import org.eclipse.persistence.jpa.jpql.model.IJPQLQueryBuilder;
 import org.eclipse.persistence.jpa.jpql.parser.JPQLGrammar;
 import org.eclipse.persistence.jpa.jpql.spi.IMappingBuilder;
+import org.eclipse.persistence.jpa.jpql.spi.IQuery;
 
 /**
  * The abstract implementation of {@link JpaJpqlQueryHelper} that supports EclipseLink.
@@ -60,7 +65,7 @@
 	 */
 	@Override
 	protected AbstractGrammarValidator buildGrammarValidator(JPQLQueryContext queryContext) {
-		return new EclipseLinkGrammarValidator(queryContext);
+		return new EclipseLinkGrammarValidator(queryContext.getGrammar());
 	}
 
 	/**
@@ -88,6 +93,30 @@
 	}
 
 	/**
+	 * Creates the right {@link IJPQLQueryBuilder} based on the JPQL grammar.
+	 *
+	 * @return A new concrete instance of {@link IJPQLQueryBuilder}
+	 */
+	protected IJPQLQueryBuilder buildQueryBuilder() {
+		return new EclipseLinkJPQLQueryBuilder(getGrammar());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public RefactoringTool buildRefactoringTool() {
+
+		IQuery query = getQuery();
+
+		return new DefaultRefactoringTool(
+			query.getProvider(),
+			buildQueryBuilder(),
+			query.getExpression()
+		);
+	}
+
+	/**
 	 * {@inheritDoc}
 	 */
 	@Override