I guess no need of any new method, simple check like interfaze.isAssignableFrom(clazz) - will do the same.
Regards, Amita On 8/21/07, Amita Vadhavkar <[EMAIL PROTECTED]> wrote: > > I was debugging JIRA-1517 when came up with the below findings. Please see > if this > is the right way to fix it or any alternatives. > > From spec:- > 1) All methods from interface @Service(interfaceName/s) should be present > in the > implementation class. > 2)If a Java implementation needs to realize two services with the same > interface, then this is achieved > through subclassing of the interface. The subinterface must not add any > methods. Both interfaces are > listed in the @Service annotation of the Java implementation class. > > Problem: > ________ > Now, take for example sample-calculator, below is changed in ServiceImpl > (introduced wrong interface name) > > @Service(Calculator3Service.class) > public class CalculatorServiceImpl implements CalculatorService { > > Also there is an interface Calculator3Service which has String > myService(); and nothing else. > Whereas CalculatorService interface has add(), subtract(), multiply(), > divide(). > > So 1) above is violated. > > When client calls, > scaDomain = SCADomain.newInstance("Calculator.composite"); > calculatorService = scaDomain.getService(CalculatorService.class, > "CalculatorServiceComponent"); > calculatorService.add(3, 2); > > During invokation when > org.apache.tuscany.sca.interfacedef.impl.InterfaceContractMapperImpl.map(Interface > target, Operation source) > is called, as target has only operation myService() which does not match > source, returns null and > then > org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceUtil.findMethod() > throws NPE. > > Solution: > ________ > To avoid this, can @Service processor be more strict and check if there is > a mismatch > in @Service(interface/s) and what is there in implements of the > serviceImpl - for the methods > in them? It may not be correct to match names of the interfaces, as in > case of rule 2) these > may not match. So, the safest way will be, in ServiceProcessor.visitClass(), > call a new method > for this check say like below and for any mismatch found > throw IllegalServiceDefinitionException("Interface "+interfaceName+" is > not implemented by " + className) > > New method: in ServiceProcessor > ___________ > public <T> boolean checkMethodsImplemented(Class<T> clazz, Class<?> > interfaze) { > Method[] interfaceMethods = interfaze.getMethods(); > Method[] classMethods = clazz.getMethods(); > List <Method>classMethodsList = Arrays.asList(classMethods); > > for(Method interfaceMethod : interfaceMethods) { > if(!classMethodsList.contains(interfaceMethod)) { > return false; > } > } > return true; > } > > Use in: ServiceProcessor.visitClass()... > _______............... > for (Class<?> interfaze : interfaces) { > if (!interfaze.isInterface()) { > throw new InvalidServiceType("Service must be an interface", > interfaze); > } > > if(!checkMethodsImplemented(clazz, interfaze)) { > throw IllegalServiceDefinitionException("Interface > "+interfaze.getName()+" is not implemented by " + clazz.getName()); > } > > Service service; > try { > service = createService(interfaze); > } catch (InvalidInterfaceException e) { > throw new IntrospectionException(e); > } > type.getServices().add(service); > } > ......... > > Regards, > Amita >