blob: e404c07b6eabb7b2b34d1e4e4b9be7f0869ad319 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0, which accompanies this distribution
* and is available at https://www.eclipse.org/legal/epl-2.0/.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.jpa.core.tests.internal.jpa2_1.resource.java;
import java.util.Iterator;
import java.util.ListIterator;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
import org.eclipse.jpt.common.core.resource.java.NestableAnnotation;
import org.eclipse.jpt.common.utility.internal.iterator.IteratorTools;
import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.JPA2_1;
import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.NamedStoredProcedureQueryAnnotation2_1;
import org.eclipse.jpt.jpa.core.jpa2_1.resource.java.StoredProcedureParameterAnnotation2_1;
import org.eclipse.jpt.jpa.core.resource.java.JPA;
import org.eclipse.jpt.jpa.core.resource.java.QueryHintAnnotation;
@SuppressWarnings("nls")
public class NamedStoredProcedureQueries2_1AnnotationTests
extends JavaResourceModel2_1TestCase
{
private static final String QUERY_NAME = "myQuery";
private static final String QUERY_PROCEDURE_NAME = "myProcedure";
public NamedStoredProcedureQueries2_1AnnotationTests(String name) {
super(name);
}
private ICompilationUnit createTestNamedStoredProcedureQueries() throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery)");
}
});
}
private ICompilationUnit createTestNamedStoredProcedureQueryWithName() throws Exception {
return createTestQueryWithStringElement("name", QUERY_NAME);
}
private ICompilationUnit createTestNamedStoredProcedureQueryWithProcedureName() throws Exception {
return createTestQueryWithStringElement("procedureName", QUERY_PROCEDURE_NAME);
}
private ICompilationUnit createTestQueryWithStringElement(final String elementName, final String value) throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(" + elementName + " = \"" + value + "\"))");
}
});
}
private ICompilationUnit createTestNamedStoredProcedureQueryWithParameters() throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY, JPA2_1.NAMED_STORED_PROCEDURE_PARAMETER, JPA2_1.PARAMETER_MODE);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(parameters = {@StoredProcedureParameter(name = \"BAR\", " +
"mode=ParameterMode.IN, type=Integer.class), @StoredProcedureParameter}))");
}
});
}
private ICompilationUnit createTestNamedStoredProcedureQueryWithResultClasses() throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(resultClasses={Employee.class, Address.class})");
}
});
}
private ICompilationUnit createTestNamedStoredProcedureQueryWithResultSetMappings() throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(resultSetMappings={\"EmployeeResultSetMapping\", \"AddressResultSetMapping\"})");
}
});
}
private ICompilationUnit createTestNamedStoredProcedureQueryWithHints() throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES, JPA2_1.NAMED_STORED_PROCEDURE_QUERY, JPA.QUERY_HINT);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@NamedStoredProcedureQueries(@NamedStoredProcedureQuery(hints = {@QueryHint(name = \"BAR\", value = \"FOO\"), @QueryHint}))");
}
});
}
private ICompilationUnit createTestNamedStoredProcedureQuery() throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return IteratorTools.iterator(JPA2_1.NAMED_STORED_PROCEDURE_QUERY, JPA.QUERY_HINT);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\"))");
}
});
}
public void testNamedStoredProcedureQuery() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertNotNull(namedQuery);
}
// ******** name *********
public void testGetName() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithName();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(QUERY_NAME, namedQuery.getName());
}
public void testSetName() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithName();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(QUERY_NAME, namedQuery.getName());
namedQuery.setName("foo");
assertEquals("foo", namedQuery.getName());
assertSourceContains("@NamedStoredProcedureQuery(name = \"foo\")", cu);
namedQuery.setName(null);
assertNull(namedQuery.getName());
assertSourceDoesNotContain("@NamedStoredProcedureQuery(", cu);
}
// ********** procedure name ************
public void testGetProcedureName() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithProcedureName();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(QUERY_PROCEDURE_NAME, namedQuery.getProcedureName());
}
public void testSetProcedureName() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithProcedureName();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(QUERY_PROCEDURE_NAME, namedQuery.getProcedureName());
namedQuery.setProcedureName("foo");
assertEquals("foo", namedQuery.getProcedureName());
assertSourceContains("@NamedStoredProcedureQuery(procedureName = \"foo\")", cu);
namedQuery.setProcedureName(null);
assertNull(namedQuery.getProcedureName());
assertSourceDoesNotContain("@NamedStoredProcedureQuery(", cu);
}
// *********** parameters *********
public void testParameters1() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(0, namedQuery.getParametersSize());
}
public void testParameters2() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithParameters();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(2, namedQuery.getParametersSize());
ListIterator<StoredProcedureParameterAnnotation2_1> iterator = namedQuery.getParameters().iterator();
assertEquals("BAR", iterator.next().getName());
assertNull(iterator.next().getName());
}
// *********** result classes *******
public void testResultClasses1() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(0, namedQuery.getResultClassesSize());
}
public void testResultClasses2() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithResultClasses();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(2, namedQuery.getResultClassesSize());
ListIterator<String> iterator = namedQuery.getResultClasses().iterator();
assertEquals("Employee", iterator.next());
assertEquals("Address", iterator.next());
}
// ********** result set mappings ********
public void testResultSetMappings1() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(0, namedQuery.getResultSetMappingsSize());
}
public void testResultSetMappings2() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithResultSetMappings();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(2, namedQuery.getResultSetMappingsSize());
ListIterator<String> iterator = namedQuery.getResultSetMappings().iterator();
assertEquals("EmployeeResultSetMapping", iterator.next());
assertEquals("AddressResultSetMapping", iterator.next());
}
// *********** hints ********
public void testHints1() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueries();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(0, namedQuery.getHintsSize());
}
public void testHints2() throws Exception {
ICompilationUnit cu = this.createTestNamedStoredProcedureQueryWithHints();
JavaResourceType resourceType = buildJavaResourceType(cu);
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertEquals(2, namedQuery.getHintsSize());
ListIterator<QueryHintAnnotation> iterator = namedQuery.getHints().iterator();
assertEquals("BAR", iterator.next().getName());
assertNull(iterator.next().getName());
}
// ********** other tests ********
public void testAddNamedQueryCopyExisting() throws Exception {
ICompilationUnit cu = createTestNamedStoredProcedureQuery();
JavaResourceType resourceType = buildJavaResourceType(cu);
String expected1 = "@NamedStoredProcedureQueries({";
String expected2 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")),";
String expected3 = "@NamedStoredProcedureQuery(name = \"BAR\") })";
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
namedQuery.setName("BAR");
assertSourceContains(expected1, cu);
assertSourceContains(expected2, cu);
assertSourceContains(expected3, cu);
assertNull(resourceType.getAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
assertNotNull(resourceType.getContainerAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES));
assertNotNull(resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
assertEquals(2, resourceType.getAnnotationsSize(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
}
public void testAddNamedQueryToBeginningOfList() throws Exception {
ICompilationUnit cu = createTestNamedStoredProcedureQuery();
JavaResourceType resourceType = buildJavaResourceType(cu);
String expected1 = "@NamedStoredProcedureQueries({";
String expected2 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")),";
String expected3 = "@NamedStoredProcedureQuery(name = \"BAR\") })";
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
namedQuery.setName("BAR");
assertSourceContains(expected1, cu);
assertSourceContains(expected2, cu);
assertSourceContains(expected3, cu);
expected2 = "@NamedStoredProcedureQuery(name = \"BAZ\"),";
expected3 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")), @NamedStoredProcedureQuery(name = \"BAR\") })";
namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
namedQuery.setName("BAZ");
assertSourceContains(expected1, cu);
assertSourceContains(expected2, cu);
assertSourceContains(expected3, cu);
Iterator<NestableAnnotation> namedQueries = resourceType.getAnnotations(JPA2_1.NAMED_STORED_PROCEDURE_QUERY).iterator();
assertEquals("BAZ", ((NamedStoredProcedureQueryAnnotation2_1) namedQueries.next()).getName());
assertEquals("foo", ((NamedStoredProcedureQueryAnnotation2_1) namedQueries.next()).getName());
assertEquals("BAR", ((NamedStoredProcedureQueryAnnotation2_1) namedQueries.next()).getName());
assertNull(resourceType.getAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
assertNotNull(resourceType.getContainerAnnotation(JPA2_1.NAMED_STORED_PROCEDURE_QUERIES));
assertNotNull(resourceType.getAnnotation(0, JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
assertEquals(3, resourceType.getAnnotationsSize(JPA2_1.NAMED_STORED_PROCEDURE_QUERY));
}
public void testRemoveNamedQueryCopyExisting() throws Exception {
ICompilationUnit cu = createTestNamedStoredProcedureQuery();
JavaResourceType resourceType = buildJavaResourceType(cu);
String expected1 = "@NamedStoredProcedureQueries({";
String expected2 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\")),";
String expected3 = "@NamedStoredProcedureQuery(name = \"BAR\") })";
NamedStoredProcedureQueryAnnotation2_1 namedQuery = (NamedStoredProcedureQueryAnnotation2_1) resourceType.addAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
namedQuery.setName("BAR");
assertSourceContains(expected1, cu);
assertSourceContains(expected2, cu);
assertSourceContains(expected3, cu);
expected1 = "@NamedStoredProcedureQuery(name = \"foo\", hints = @QueryHint(name = \"BAR\", value = \"FOO\"))";
resourceType.removeAnnotation(1, JPA2_1.NAMED_STORED_PROCEDURE_QUERY);
assertSourceContains(expected1, cu);
assertSourceDoesNotContain("@NamedStoredProcedureQueries", cu);
}
}