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
>

Reply via email to