X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=system%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fsystem%2Fcore%2FDefaultRequiredInterface.java;h=9810d79f2d6d43e133533367a34bb71715aabf2a;hb=49ce7cb8387601982d5e6ef186ce206d38f6e3d7;hp=01575db2c0dbc4e78b9bc53ac989b9cd22f0e2a6;hpb=ad6e06e3c1ba0c4ae0dea100596b1c5503bfe1c6;p=utils diff --git a/system/general/src/main/java/org/wamblee/system/core/DefaultRequiredInterface.java b/system/general/src/main/java/org/wamblee/system/core/DefaultRequiredInterface.java index 01575db2..9810d79f 100644 --- a/system/general/src/main/java/org/wamblee/system/core/DefaultRequiredInterface.java +++ b/system/general/src/main/java/org/wamblee/system/core/DefaultRequiredInterface.java @@ -1,5 +1,5 @@ /* - * Copyright 2007 the original author or authors. + * Copyright 2005-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,127 +12,172 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */ package org.wamblee.system.core; +import org.wamblee.reflection.ReflectionUtils; + import java.util.Arrays; +/** + * + * @author $author$ + * @version $Revision$ + */ public class DefaultRequiredInterface implements RequiredInterface { + private String name; + + private boolean optional; + + private Class[] required; + + private ProvidedInterface provider; + + /** + * Creates a new DefaultRequiredInterface object. + * + */ + public DefaultRequiredInterface(String aName, Class aInterface) { + this(aName, new Class[] { aInterface }); + } + + /** + * Creates a new DefaultRequiredInterface object. + * + */ + public DefaultRequiredInterface(String aName, Class[] aInterfaces) { + this(aName, aInterfaces, false); + } + + /** + * Creates a new DefaultRequiredInterface object. + * + */ + public DefaultRequiredInterface(String aName, Class aInterface, + boolean aIsOptional) { + this(aName, new Class[] { aInterface }, aIsOptional); + } + + /** + * Creates a new DefaultRequiredInterface object. + * + */ + public DefaultRequiredInterface(String aName, Class[] aInterfaces, + boolean aIsOptional) { + name = aName; + optional = aIsOptional; + required = aInterfaces; + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean isOptional() { + return optional; + } + + @Override + public boolean implementedBy(ProvidedInterface aDescriptor) { + Class[] provided = aDescriptor.getInterfaceTypes(); + + for (Class requiredIntf : required) { + if (!serviceProvided(requiredIntf, provided)) { + return false; + } + } + + // all required interfaces are provided. + return true; + } + + /** + * Check if the required interface is implemented by one of the provided + * interfaces. + * + * @param aRequired + * required interface + * @param aProvided + * Provided interfaces. + * + * @return + */ + private boolean serviceProvided(Class aRequired, Class[] aProvided) { + for (Class provided : aProvided) { + try { + provided = ReflectionUtils.wrapIfNeeded(provided); + aRequired = ReflectionUtils.wrapIfNeeded(aRequired); + provided.asSubclass(aRequired); + + return true; + } catch (ClassCastException e) { + // No match, try the next one. + } + } + + return false; + } + + @Override + public ProvidedInterface getProvider() { + return provider; + } + + @Override + public void setProvider(ProvidedInterface aProvider) { + assert aProvider != null; + assert implementedBy(aProvider); + provider = aProvider; + } + + @Override + public boolean equals(Object aObject) { + return this == aObject; + } + + @Override + public boolean covers(RequiredInterface aObject) { + // TODO do more than equals. + if (!(aObject instanceof DefaultRequiredInterface)) { + return false; + } + + DefaultRequiredInterface descr = (DefaultRequiredInterface) aObject; + + if (required.length != descr.required.length) { + return false; + } + + String[] interfaces1 = new String[required.length]; + String[] interfaces2 = new String[required.length]; + + for (int i = 0; i < required.length; i++) { + interfaces1[i] = required[i].getName(); + interfaces2[i] = descr.required[i].getName(); + } + + Arrays.sort(interfaces1); + Arrays.sort(interfaces2); + + return Arrays.equals(interfaces1, interfaces2); + } + + @Override + public int hashCode() { + return Arrays.hashCode(required); + } + + @Override + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append("." + getName() + ":"); + + for (Class intf : required) { + buf.append("." + intf.getName()); + } - private String _name; - private boolean _optional; - private Class[] _required; - private ProvidedInterface _provider; - - public DefaultRequiredInterface(String aName, Class aInterface) { - this(aName, new Class[] { aInterface }); - } - - public DefaultRequiredInterface(String aName, Class[] aInterfaces) { - this(aName, aInterfaces, false); - } - - public DefaultRequiredInterface(String aName, Class aInterface, boolean aIsOptional) { - this(aName, new Class[] { aInterface }, aIsOptional ); - } - - - public DefaultRequiredInterface(String aName, Class[] aInterfaces, boolean aIsOptional) { - _name = aName; - _optional = aIsOptional; - _required = aInterfaces; - } - - @Override - public String getName() { - return _name; - } - - @Override - public boolean isOptional() { - return _optional; - } - - @Override - public boolean implementedBy(ProvidedInterface aDescriptor) { - Class[] provided = aDescriptor.getInterfaceTypes(); - for (Class required : _required) { - if ( !serviceProvided(required, provided)) { - return false; - } - } - // all required interfaces are provided. - return true; - } - - /** - * Check if the required interface is implemented by one of the provided interfaces. - * @param aRequired required interface - * @param aProvided Provided interfaces. - * @return - */ - private boolean serviceProvided(Class aRequired, Class[] aProvided) { - for (Class provided: aProvided) { - try { - provided.asSubclass(aRequired); - return true; - } catch (ClassCastException e) { - // No match, try the next one. - } - } - return false; - } - - @Override - public ProvidedInterface getProvider() { - return _provider; - } - - @Override - public void setProvider(ProvidedInterface aProvider) { - assert aProvider != null; - assert implementedBy(aProvider); - _provider = aProvider; - } - - @Override - public boolean equals(Object obj) { - return this == obj; - } - - @Override - public boolean covers(RequiredInterface obj) { - // TODO do more than equals. - if ( !(obj instanceof DefaultRequiredInterface)) { - return false; - } - DefaultRequiredInterface descr = (DefaultRequiredInterface)obj; - if ( _required.length != descr._required.length ) { - return false; - } - String[] interfaces1 = new String[_required.length]; - String[] interfaces2 = new String[_required.length]; - for (int i = 0; i < _required.length; i++) { - interfaces1[i] = _required[i].getName(); - interfaces2[i] = descr._required[i].getName(); - } - Arrays.sort(interfaces1); - Arrays.sort(interfaces2); - return Arrays.equals(interfaces1, interfaces2); - } - - @Override - public int hashCode() { - return _required.hashCode(); - } - - @Override - public String toString() { - StringBuffer buf = new StringBuffer(); - buf.append("." + getName() + ":"); - for (Class intf: _required) { - buf.append("." + intf.getName()); - } - return buf.toString(); - } + return buf.toString(); + } }