/** * OpenSpotLight - Open Source IT Governance Platform * * Copyright (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA * or third-party contributors as indicated by the @author tags or express * copyright attribution statements applied by the authors. All third-party * contributions are distributed under license by CARAVELATECH CONSULTORIA E * TECNOLOGIA EM INFORMATICA LTDA. * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * See the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA * *********************************************************************** * OpenSpotLight - Plataforma de Governança de TI de Código Aberto * * Direitos Autorais Reservados (c) 2009, CARAVELATECH CONSULTORIA E TECNOLOGIA * EM INFORMATICA LTDA ou como contribuidores terceiros indicados pela etiqueta * @author ou por expressa atribuição de direito autoral declarada e atribuída pelo autor. * Todas as contribuições de terceiros estão distribuídas sob licença da * CARAVELATECH CONSULTORIA E TECNOLOGIA EM INFORMATICA LTDA. * * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo sob os * termos da Licença Pública Geral Menor do GNU conforme publicada pela Free Software * Foundation. * * Este programa é distribuído na expectativa de que seja útil, porém, SEM NENHUMA * GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU ADEQUAÇÃO A UMA * FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral Menor do GNU para mais detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral Menor do GNU junto com este * programa; se não, escreva para: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.openspotlight.bundle.language.java.resolver; import org.junit.Ignore; import org.junit.Test; import org.openspotlight.bundle.common.SLBundleException; import org.openspotlight.bundle.language.java.metamodel.link.MethodParameterDefinition; import org.openspotlight.bundle.language.java.metamodel.link.TypeDeclares; import org.openspotlight.bundle.language.java.metamodel.node.JavaMethod; import org.openspotlight.bundle.language.java.metamodel.node.JavaMethodMethod; import org.openspotlight.bundle.language.java.metamodel.node.JavaType; import org.openspotlight.bundle.language.java.metamodel.node.JavaTypePrimitive; import org.openspotlight.common.Pair; import org.openspotlight.graph.SLLink; import org.openspotlight.graph.annotation.SLVisibility.VisibilityLevel; import java.util.LinkedList; import java.util.List; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNot.not; import static org.hamcrest.core.IsNull.notNullValue; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.assertThat; @SuppressWarnings( "unused" ) public class TestIntegratedMethodResolution extends AbstractMethodResolutionTest { @Test( ) public void getMethodBetween2Matches() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, false); final JavaType longType = createType("java.lang", "Long", numberType, false); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(objectType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( objectType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodBetween5Matches() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, false); final JavaType longType = createType("java.lang", "Long", numberType, false); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(objectType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(objectType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( objectType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); this.createMethod(objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodBetween5Matches2() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, false); final JavaType longType = createType("java.lang", "Long", numberType, false); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(objectType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(objectType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(objectType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodBetween5Matches3() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaType longType = createType("java.lang", "Long", numberType, true); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(integerType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(integerType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(integerType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(integerType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( integerType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodBetween5Matches4() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaType longType = createType("java.lang", "Long", numberType, true); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(numberType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(numberType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(numberType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(numberType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( numberType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodBetween5Matches5() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaType longType = createType("java.lang", "Long", numberType, true); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(numberType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(numberType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(integerType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(numberType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(numberType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); this.createMethod(objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); this.createMethod(numberType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( integerType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodBetween5Matches6() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, false); final JavaType longType = createType("java.lang", "Long", numberType, false); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); parameterList.add(longType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(numberType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(numberType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(integerType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(numberType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(numberType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); this.createMethod(objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( numberType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodBetween5MatchesBoxing() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, false); final JavaType longType = createType("java.lang", "Long", numberType, false); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(longTypePrimitive); parameterList.add(longTypePrimitive); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(objectType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( objectType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(objectType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); this.createMethod(objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( expected = SLBundleException.class ) public void getMethodBetween5MatchesBoxingNotAllowed() throws Exception { setupMethodResolverDisablingAutoboxing(); final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaType longType = createType("java.lang", "Long", numberType, true); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(longTypePrimitive); parameterList.add(longTypePrimitive); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(objectType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(objectType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(objectType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); this.createMethod(objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); methodResolver.getMethod(integerType, "wait", parameterList); } @Test( expected = SLBundleException.class ) public void getMethodInfinitiLooping() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaType longType = createType("java.lang", "Long", numberType, true); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(objectType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); this.createMethod(objectType, "wait", "wait(java.lang.Integer, java.lang.String, long)", numberType, stringType, longType); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(nullValue())); } @Test( ) public void getMethodOneSimpleTypeParameterWithHierarchy() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaTypePrimitive longType = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod(objectType, "wait", "wait(java.lang.Number)", numberType); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test @Ignore( value = "needs to review how to address ParameterizedTypes at TypeResolution (its bases on instanced classes)" ) public void getMethodParameterizedByClass() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, false); final JavaType longType = createType("java.lang", "Long", numberType, false); final JavaType parameterizedType = createTypeParameterized("java.lang", "Long$T", longType, objectType, true); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( numberType, "wait", "wait(java.lang.Long$T, java.lang.String, java.lang.Long)", parameterizedType, stringType, longType); this.createMethod(numberType, "xait", "xait(java.lang.Long$T, java.lang.String, java.lang.Long)", parameterizedType, stringType, longType); this.createMethod(numberType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(integerType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(numberType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(numberType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); this.createMethod(objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); this.createMethod(numberType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test @Ignore( value = "needs to review how to address ParameterizedTypes at TypeResolution (its bases on instanced classes)" ) public void getMethodParameterizedByMethod() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, false); final JavaType longType = createType("java.lang", "Long", numberType, false); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); // Start code to build Method Parameterized Type final JavaMethodMethod method = numberType.addChildNode(JavaMethodMethod.class, "wait(java.lang.Long$this$T, java.lang.String, java.lang.Long)"); method.setSimpleName("wait"); graphSession.addLink(TypeDeclares.class, numberType, method, false); final JavaType parameterizedType = createTypeParameterized("java.lang", "Long$this$T", method, objectType, true); SLLink link = graphSession.addLink(MethodParameterDefinition.class, method, parameterizedType, false); link.setProperty(Integer.class, VisibilityLevel.PUBLIC, "Order", 0); link = graphSession.addLink(MethodParameterDefinition.class, method, stringType, false); link.setProperty(Integer.class, VisibilityLevel.PUBLIC, "Order", 1); link = graphSession.addLink(MethodParameterDefinition.class, method, longType, false); link.setProperty(Integer.class, VisibilityLevel.PUBLIC, "Order", 2); final Pair<JavaType, JavaMethod> correctTypeAndMethod = new Pair<JavaType, JavaMethod>(numberType, method); // Method End this.createMethod(numberType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(objectType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(integerType, "wait", "wait(java.lang.String, java.lang.String, java.lang.String)", stringType, stringType, stringType); this.createMethod(numberType, "wait", "wait(java.lang.Long, java.lang.Long, java.lang.Long)", longType, longType, longType); this.createMethod(numberType, "wait", "wait(java.lang.Integer, java.lang.String, long)", integerType, stringType, longTypePrimitive); this.createMethod(objectType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); this.createMethod(numberType, "wait", "wait(java.lang.Object, java.lang.Object, long)", objectType, objectType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodSeveralTypeParameter() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaTypePrimitive longType = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); parameterList.add(stringType); parameterList.add(longType); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( objectType, "wait", "wait(java.lang.Number, java.lang.String, long)", numberType, stringType, longType); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(objectType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void getMethodSeveralTypeParameterHierarchy() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaTypePrimitive longType = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); parameterList.add(stringType); parameterList.add(longType); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( objectType, "wait", "wait(java.lang.Number, java.lang.String, long)", numberType, stringType, longType); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( expected = SLBundleException.class ) public void notFoundMethodOneSimpleTypeParameterWithHierarchy() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaTypePrimitive longType = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(stringType); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod(objectType, "wait", "wait(java.lang.Number)", numberType); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(objectType, "wait", parameterList); assertThat(foundMethod, is(nullValue())); } @Test( ) public void resolveExtendedMethod() throws Exception { final Pair<JavaType, JavaMethod> typeAndMethodObject = this.createMethod("java.lang", "Object", "toString", "toString()"); final Pair<JavaType, JavaMethod> typeAndMethodSLObject = this.createMethod("org.openspotlight", "SLObject", "toString", "toString()"); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeAndMethodSLObject.getK1(), "toString"); assertThat(foundMethod, is(notNullValue())); // assertThat(foundMethod.getID(), // is(not(typeAndMethodObject.getK2().getID()))); assertThat(foundMethod.getID(), is(typeAndMethodSLObject.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOnePrimitiveParameter() throws Exception { final List<JavaType> parameterList = new LinkedList<JavaType>(); final JavaTypePrimitive typeParameter = createPrimitiveType("long"); parameterList.add(typeParameter); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> typeAndMethod = this.createMethod("java.lang", "Object", "wait", "wait(long)", typeParameter); final JavaType stringParameter = createType("java.lang", "String", typeAndMethod.getK1(), true); final Pair<JavaType, JavaMethod> wrongTypeAndMethod = this.createMethod("java.lang", "Object", "wait", "wait(java.lang.String)", stringParameter); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeAndMethod.getK1(), "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(not(wrongTypeAndMethod.getK2().getID()))); assertThat(foundMethod.getID(), is(typeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOneSimpleTypeParameter() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaTypePrimitive longType = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod("java.lang", "Object", "wait", "wait(java.lang.Integer)", parameterList.get(0)); final Pair<JavaType, JavaMethod> wrongTypeAndMethod = this.createMethod("java.lang", "Object", "wait", "wait(java.lang.String)", stringType); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(objectType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(not(wrongTypeAndMethod.getK2().getID()))); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOneSimpleTypeParameterWithHierarchy() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaTypePrimitive longType = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); this.createMethod("java.lang", "Object", "wait", "wait()"); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod("java.lang", "Object", "wait", "wait(java.lang.Number)", numberType); final Pair<JavaType, JavaMethod> wrongTypeAndMethod = this.createMethod("java.lang", "Object", "wait", "wait(java.lang.String)", stringType); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(objectType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(not(wrongTypeAndMethod.getK2().getID()))); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOnParent() throws Exception { final Pair<JavaType, JavaMethod> typeAndMethodObject = this.createMethod("java.lang", "Object", "toString", "toString()"); final JavaType typeSLObject = createType("org.openspotlight", "SLObject", typeAndMethodObject.getK1(), true); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeSLObject, "toString"); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(typeAndMethodObject.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOnParentFiveLevels() throws Exception { final Pair<JavaType, JavaMethod> typeAndMethodObject = this.createMethod("java.lang", "Object", "toString", "toString()"); final JavaType typeSLObject = createType("org.openspotlight", "SLObject", typeAndMethodObject.getK1(), true); final JavaType typeSLObject2 = createType("org.openspotlight", "SLObject2", typeSLObject, true); final JavaType typeSLObject3 = createType("org.openspotlight", "SLObject3", typeSLObject2, true); final JavaType typeSLObject4 = createType("org.openspotlight", "SLObject4", typeSLObject3, true); final JavaType typeSLObject5 = createType("org.openspotlight", "SLObject5", typeSLObject4, true); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeSLObject5, "toString"); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(typeAndMethodObject.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOnParentFiveLevelsFoundOnFirstLevel() throws Exception { final Pair<JavaType, JavaMethod> typeAndMethodObject = this.createMethod("java.lang", "Object", "toString", "toString()"); final JavaType typeSLObject = createType("org.openspotlight", "SLObject", typeAndMethodObject.getK1(), true); final Pair<JavaType, JavaMethod> typeAndMethodObject2 = this.createMethod("org.openspotlight", "SLObject2", "toString", "toString()"); final JavaType typeSLObject3 = createType("org.openspotlight", "SLObject3", typeAndMethodObject2.getK1(), true); final JavaType typeSLObject4 = createType("org.openspotlight", "SLObject4", typeSLObject3, true); final Pair<JavaType, JavaMethod> typeAndMethodObject5 = this.createMethod("org.openspotlight", "SLObject5", "toString", "toString()"); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeAndMethodObject5.getK1(), "toString"); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(typeAndMethodObject5.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOnParentFiveLevelsFoundOnThirdLevel() throws Exception { final Pair<JavaType, JavaMethod> typeObject = this.createMethod("java.lang", "Object", "toString", "toString()"); createType("org.openspotlight", "SLObject", typeObject.getK1(), true); final Pair<JavaType, JavaMethod> typeAndMethodObject2 = this.createMethod("org.openspotlight", "SLObject2", "toString", "toString()"); final JavaType typeSLObject3 = createType("org.openspotlight", "SLObject3", typeAndMethodObject2.getK1(), false); final JavaType typeSLObject4 = createType("org.openspotlight", "SLObject4", typeSLObject3, false); final JavaType typeSLObject5 = createType("org.openspotlight", "SLObject5", typeSLObject4, false); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeSLObject5, "toString"); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(typeAndMethodObject2.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveMethodOnParentSecondLevel() throws Exception { final Pair<JavaType, JavaMethod> typeAndMethodObject = this.createMethod("java.lang", "Object", "toString", "toString()"); final JavaType typeSLObject = createType("org.openspotlight", "SLObject", typeAndMethodObject.getK1(), true); final JavaType typeSLObject2 = createType("org.openspotlight", "SLObject2", typeSLObject, true); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeSLObject2, "toString"); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(typeAndMethodObject.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void resolveSimpleMethod() throws Exception { final Pair<JavaType, JavaMethod> typeAndMethod = this.createMethod("java.lang", "Object", "toString", "toString()"); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(typeAndMethod.getK1(), "toString"); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(typeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); } @Test( ) public void testCache() throws Exception { final JavaType objectType = createType("java.lang", "Object", null, false); final JavaType stringType = createType("java.lang", "String", objectType, true); final JavaType numberType = createType("java.lang", "Number", objectType, true); final JavaType integerType = createType("java.lang", "Integer", numberType, true); final JavaType longType = createType("java.lang", "Long", numberType, true); final JavaTypePrimitive longTypePrimitive = createPrimitiveType("long"); final List<JavaType> parameterList = new LinkedList<JavaType>(); parameterList.add(integerType); parameterList.add(stringType); parameterList.add(longTypePrimitive); this.createMethod("java.lang", "Object", "wait", "wait()"); this.createMethod(objectType, "wait", "wait(java.lang.Number, java.lang.String, java.lang.Long)", numberType, stringType, longType); final Pair<JavaType, JavaMethod> correctTypeAndMethod = this.createMethod( objectType, "wait", "wait(java.lang.Integer, java.lang.String, long)", numberType, stringType, longTypePrimitive); final JavaMethodMethod foundMethod = (JavaMethodMethod)methodResolver.getMethod(integerType, "wait", parameterList); final String uniqueId = methodResolver.getUniqueId(integerType, "wait", parameterList); assertThat(foundMethod, is(notNullValue())); assertThat(foundMethod.getID(), is(correctTypeAndMethod.getK2().getID())); assertThat(foundMethod.getContext(), is(not(abstractContex))); assertThat(methodResolver.getCache().get(uniqueId), is(notNullValue())); assertThat(methodResolver.getCache().get(uniqueId), is(foundMethod.getID())); } @Test( expected = IllegalArgumentException.class ) public void testInvalidParams() throws Exception { this.createMethod("java.lang", "Object", "toString", "toString()"); final JavaType abstractType = getAbstractType("java.lang", "Object"); methodResolver.getMethod(abstractType, "toString"); } @Test( expected = IllegalArgumentException.class ) public void testInvalidParamsNullParams() throws Exception { methodResolver.getMethod(null, null); } }