Return-Path: Delivered-To: apmail-felix-commits-archive@www.apache.org Received: (qmail 55158 invoked from network); 6 Oct 2008 17:09:10 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 Oct 2008 17:09:10 -0000 Received: (qmail 1516 invoked by uid 500); 6 Oct 2008 17:09:09 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 1494 invoked by uid 500); 6 Oct 2008 17:09:09 -0000 Mailing-List: contact commits-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list commits@felix.apache.org Received: (qmail 1485 invoked by uid 99); 6 Oct 2008 17:09:09 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 06 Oct 2008 10:09:09 -0700 X-ASF-Spam-Status: No, hits=-1999.9 required=10.0 tests=ALL_TRUSTED,DNS_FROM_SECURITYSAGE X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 06 Oct 2008 17:08:11 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 1F47223889A0; Mon, 6 Oct 2008 10:08:47 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r702202 [2/4] - in /felix/trunk/ipojo: ant/src/main/java/org/apache/felix/ipojo/task/ core/src/main/java/org/apache/felix/ipojo/ handler/eventadmin/src/main/java/org/apache/felix/ipojo/handlers/event/ handler/eventadmin/src/main/java/org/ap... Date: Mon, 06 Oct 2008 17:08:45 -0000 To: commits@felix.apache.org From: clement@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081006170847.1F47223889A0@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanWRegisterImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanWRegisterImpl.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanWRegisterImpl.java (original) +++ felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanWRegisterImpl.java Mon Oct 6 10:08:45 2008 @@ -38,41 +38,35 @@ MBeanRegistration { /** - * preRegister method of MBeanRegistration interface. + * The preRegister method of MBeanRegistration interface. */ private MethodMetadata m_preRegisterMeth; /** - * postRegister method of MBeanRegistration interface. + * The postRegister method of MBeanRegistration interface. */ private MethodMetadata m_postRegisterMeth; /** - * preDeregister method of MBeanRegistration interface. + * The preDeregister method of MBeanRegistration interface. */ private MethodMetadata m_preDeregisterMeth; /** - * postDeregister method of MBeanRegistration interface. + * The postDeregister method of MBeanRegistration interface. */ private MethodMetadata m_postDeregisterMeth; /** - * Effective name of the MBean. + * The effective name of the MBean. */ private ObjectName m_objName; /** * Constructs a new DynamicMBeanWRegisterImpl. * - * @param properties - * data extracted from the metadata.xml - * @param instanceManager - * the instance manager - * @param preRegisterMeth - * the method to call before MBean registration - * @param postRegisterMeth - * the method to call after MBean registration - * @param preDeregisterMeth - * the method to call before MBean deregistration - * @param postDeregisterMeth - * the method to call after MBean registration + * @param properties the data extracted from the metadata.xml + * @param instanceManager the instance manager + * @param preRegisterMeth the method to call before MBean registration + * @param postRegisterMeth the method to call after MBean registration + * @param preDeregisterMeth the method to call before MBean deregistration + * @param postDeregisterMeth the method to call after MBean registration */ public DynamicMBeanWRegisterImpl(JmxConfigFieldMap properties, InstanceManager instanceManager, MethodMetadata preRegisterMeth, @@ -87,7 +81,7 @@ } /** - * Return the MBean name used to register it. + * Returns the MBean name used to register it. * * @return the MBean name used to register it. */ @@ -98,13 +92,9 @@ /** * This method is executed before the MBean registration. * - * @param server - * the server on which the MBean will be registered - * @param name - * the name of the MBean to expose - * @throws Exception - * This exception will be caught by the MBean server and - * re-thrown as an MBeanRegistrationException. + * @param server the server on which the MBean will be registered + * @param name the name of the MBean to expose + * @throws Exception This exception will be caught by the MBean server and re-thrown as an MBeanRegistrationException. * @return the name with which the MBean will be registered */ public ObjectName preRegister(MBeanServer server, ObjectName name) @@ -117,9 +107,7 @@ /** * This method is executed after the MBean registration. * - * @param registrationDone - * Indicates whether or not the MBean has been successfully - * registered in the MBean server. + * @param registrationDone indicates whether or not the MBean has been successfully registered in the MBean server. */ public void postRegister(Boolean registrationDone) { callMethod(m_postRegisterMeth, MBeanHandler.POST_REGISTER_METH_NAME, @@ -129,9 +117,7 @@ /** * This method is before after the MBean deregistration. * - * @throws Exception - * This exception will be caught by the MBean server and - * re-thrown as an MBeanRegistrationException. + * @throws Exception This exception will be caught by the MBean server and re-thrown as an MBeanRegistrationException. */ public void preDeregister() throws Exception { callMethod(m_preDeregisterMeth, MBeanHandler.PRE_DEREGISTER_METH_NAME, @@ -149,14 +135,10 @@ /** * Private method used to execute a given callback. * - * @param methodMetadata - * the metadata description of the callback - * @param methodName - * the name of the callback - * @param params - * the parameters of the callback - * @return the object eventually returned by the callback, or null if - * nothing's returned + * @param methodMetadata the metadata description of the callback + * @param methodName the name of the callback + * @param params the parameters of the callback + * @return the object eventually returned by the callback, or null if nothing's returned */ private Object callMethod(MethodMetadata methodMetadata, String methodName, Object[] params) { @@ -169,7 +151,7 @@ } } catch (NoSuchMethodException e) { // should never happen : method exists - System.err.println("No such method!: " + methodName); + System.err.println("No such method : " + methodName); e.printStackTrace(); } catch (IllegalAccessException e) { System.err.println("Illegal Access Exception"); Modified: felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JMXHandlerDescription.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JMXHandlerDescription.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JMXHandlerDescription.java (original) +++ felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JMXHandlerDescription.java Mon Oct 6 10:08:45 2008 @@ -35,10 +35,9 @@ private MBeanHandler m_handler; /** - * Construct a new handler description for the given handler. + * Constructs a new handler description for the given handler. * - * @param handler - * the handler to describe + * @param handler the handler to describe */ public JMXHandlerDescription(MBeanHandler handler) { super(handler); @@ -46,7 +45,7 @@ } /** - * Get handler information. + * Gets handler information. * * @return the handler information. */ Modified: felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java (original) +++ felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java Mon Oct 6 10:08:45 2008 @@ -33,64 +33,61 @@ public class JmxConfigFieldMap { /** - * m_properties : use to store the attributes exposed. + * The exposed attributes. */ private Map < String, PropertyField > m_properties = new HashMap < String, PropertyField >(); /** - * m_methods : use to store the methods exposed. + * The exposed methods. */ private Map < String, MethodField[] > m_methods = new HashMap < String, MethodField[] >(); /** - * m_notification : use to store the notification allowed. + * The allowed notifications. */ private Map < String, NotificationField > m_notifications = new HashMap < String, NotificationField >(); /** - * m_description : description of the Mbean. + * The description of the Mbean. */ private String m_description; /** - * JmxConfigFieldMap : constructor. + * Constructor. */ public JmxConfigFieldMap() { } /** - * getDescription : get the descritpion of the MBean. + * Gets the description of the MBean. * - * @return String : Decription of the MBean + * @return the description of the MBean */ public String getDecription() { return m_description; } /** - * setDescription : set the descritpion of the MBean. + * Sets the description of the MBean. * - * @param description - * : String which describe the Mbean + * @param description a String which describes the Mbean */ public void setDescription(String description) { this.m_description = description; } /** - * addPropertyFromName : add a new attribute exposed in the Mbean. + * Adds a new attribute exposed in the Mbean. * - * @param name - * : name of the new property - * @param propertyField - * : Field which describe the property + * @param name the name of the new property + * @param propertyField the field which describes the property */ public void addPropertyFromName(String name, PropertyField propertyField) { m_properties.put(name, propertyField); } /** - * getProperties : get all of the properties exposed. + * Gets all of the properties exposed. * - * @return : collection of all properties + * @return the collection of all properties */ public Collection < PropertyField > getProperties() { if (m_properties != null) { @@ -101,11 +98,10 @@ } /** - * getPropertyFromName : get the property by the name. + * Gets the property by the name. * - * @param name - * : name of the requiered property - * @return PropertyField : the field requiered or null if is not found + * @param name the name of the required property + * @return the field required or null if is not found */ public PropertyField getPropertyFromName(String name) { PropertyField prop = m_properties.get(name); @@ -113,11 +109,10 @@ } /** - * getPropertyFromField : get the property by the field. + * Gets the property by the field. * - * @param field - * : the requiered field - * @return PropertyField : + * @param field the required field + * @return the property by the field */ public PropertyField getPropertyFromField(String field) { PropertyField property = null; @@ -126,7 +121,7 @@ PropertyField p = it.next(); if (p.getField().compareTo(field) == 0) { if (property != null) { - System.err.println("a field already exist"); + System.err.println("a field already exists"); } else { property = p; } @@ -136,12 +131,10 @@ } /** - * addMethodFromName : add a new method descriptor from its name. + * Adds a new method descriptor from its name. * - * @param name - * : name of the method - * @param methodField - * : descritpion of the method + * @param name the name of the method + * @param methodField the description of the method */ public void addMethodFromName(String name, MethodField methodField) { MethodField[] mf; @@ -160,13 +153,10 @@ } /** - * addMethodFromName : add new methods descriptors from one name. (the - * method muste have the same name but different signature). + * Adds new methods descriptors from one name. (the method must have the same name but different signature). * - * @param name - * : name of the method - * @param methodsField - * : descritpion of the methods + * @param name the name of the method + * @param methodsField the description of the methods */ public void addMethodFromName(String name, MethodField[] methodsField) { MethodField[] mf; @@ -186,12 +176,10 @@ } /** - * DynamicMBeanImpl : add methods from name and erase the older if exist. + * Adds a method from name and erases the older if exists. * - * @param name - * : name of the method - * @param methodField - * : method to be added + * @param name the name of the method + * @param methodField the method to be added */ public void overrideMethodFromName(String name, MethodField methodField) { MethodField[] mf = new MethodField[1]; @@ -200,23 +188,20 @@ } /** - * DynamicMBeanImpl : add methods from name and erase the older if exist. + * Add methods from name and erases the olders if exists. * - * @param name - * : name of the method - * @param methodsField - * : array of methods to be added + * @param name the name of the method + * @param methodsField the array of methods to be added */ public void overrideMethodFromName(String name, MethodField[] methodsField) { m_methods.put(name, methodsField); } /** - * getMethodFromName : return the metod(s) which are similar. + * Returns the method(s) with the given name. * - * @param name - * : name of requiered method - * @return MethodField[] : list of returned methods + * @param name the name of the methods + * @return the list of methods with the given name */ public MethodField[] getMethodFromName(String name) { MethodField[] prop = m_methods.get(name); @@ -224,14 +209,11 @@ } /** - * getMethodFromName : get the method which the good signature. + * Gets the method with the good signature. * - * @param operationName - * : name of the method requiered - * @param signature - * : signature requiered - * @return MethodField : the method which the same signature or null if not - * found + * @param operationName the name of the method requiered + * @param signature the required signature + * @return the method which the same signature or null if not found */ public MethodField getMethodFromName(String operationName, String[] signature) { @@ -245,13 +227,11 @@ } /** - * isSameSignature : compare two method signature. + * Compares two method signature. * - * @param sig1 - * : first signature - * @param sig2 - * : second signature - * @return boolean : return true if the signature are similar fale else + * @param sig1 the first signature + * @param sig2 the second signature + * @return true if the signature are similar false otherwise */ private boolean isSameSignature(String[] sig1, String[] sig2) { if (sig1.length != sig2.length) { @@ -268,9 +248,9 @@ } /** - * getMethods : return all methods store. + * Returns all methods store. * - * @return Collection : collection of methodField[] + * @return the collection of methodField[] */ public Collection < MethodField[] > getMethods() { if (m_methods != null) { @@ -281,12 +261,10 @@ } /** - * addNotificationFromName : add a notification . + * Adds a notification. * - * @param name - * : - * @param notificationField - * : + * @param name the name of the notification + * @param notificationField the field involved with the notification. */ public void addNotificationFromName(String name, NotificationField notificationField) { @@ -294,11 +272,10 @@ } /** - * getNotificationFromName : return the notification with requiered name. + * Returns the notification with the given name. * - * @param name - * : name requiered - * @return NotificationField : return the notification if exist, null else + * @param name the name of the notification to return + * @return the notification if it exists, {@code null} otherwise */ public NotificationField getNotificationFromName(String name) { NotificationField prop = m_notifications.get(name); @@ -306,9 +283,9 @@ } /** - * getNotification : get all notifications define. + * Gets all notifications defined. * - * @return Collection : return collection of NotificationField + * @return the collection of NotificationField */ public Collection < NotificationField > getNotifications() { if (m_notifications != null) { Modified: felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java (original) +++ felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java Mon Oct 6 10:08:45 2008 @@ -28,6 +28,7 @@ import javax.management.ObjectInstance; import javax.management.ObjectName; +import org.apache.felix.ipojo.FieldInterceptor; import org.apache.felix.ipojo.InstanceManager; import org.apache.felix.ipojo.PrimitiveHandler; import org.apache.felix.ipojo.architecture.HandlerDescription; @@ -48,164 +49,156 @@ public class MBeanHandler extends PrimitiveHandler { /** - * Name of the MBeanRegistration postDeregister method. + * The name of the MBeanRegistration postDeregister method. */ public static final String POST_DEREGISTER_METH_NAME = "postDeregister"; /** - * Name of the MBeanRegistration preDeregister method. + * The name of the MBeanRegistration preDeregister method. */ public static final String PRE_DEREGISTER_METH_NAME = "preDeregister"; /** - * Name of the MBeanRegistration postRegister method. + * The name of the MBeanRegistration postRegister method. */ public static final String POST_REGISTER_METH_NAME = "postRegister"; /** - * Name of the MBeanRegistration preRegister method. + * The name of the MBeanRegistration preRegister method. */ public static final String PRE_REGISTER_METH_NAME = "preRegister"; /** - * Name of the global configuration element. + * The name of the global configuration element. */ private static final String JMX_CONFIG_ELT = "config"; /** - * Name of the component object full name attribute. + * The name of the component object full name attribute. */ private static final String JMX_OBJ_NAME_ELT = "objectName"; /** - * Name of the component object name domain attribute. + * The name of the component object name domain attribute. */ private static final String JMX_OBJ_NAME_DOMAIN_ELT = "domain"; /** - * Name of the component object name attribute. + * The name of the component object name attribute. */ private static final String JMX_OBJ_NAME_WO_DOMAIN_ELT = "name"; /** - * Name of the attribute indicating if the handler uses MOSGi MBean server. + * The name of the attribute indicating if the handler uses MOSGi MBean server. */ private static final String JMX_USES_MOSGI_ELT = "usesMOSGi"; /** - * Name of a method element. + * The name of a method element. */ private static final String JMX_METHOD_ELT = "method"; /** - * Name of the property or method name attribute. + * The name of the property or method name attribute. */ private static final String JMX_NAME_ELT = "name"; /** - * Name of a method description attribute. + * The name of a method description attribute. */ private static final String JMX_DESCRIPTION_ELT = "description"; /** - * Name of a property element. + * The name of a property element. */ private static final String JMX_PROPERTY_ELT = "property"; /** - * Name of the field attribute. + * The name of the field attribute. */ private static final String JMX_FIELD_ELT = "field"; /** - * Name of the notification attribute. + * The name of the notification attribute. */ private static final String JMX_NOTIFICATION_ELT = "notification"; /** - * Name of the rights attribute. + * The name of the rights attribute. */ private static final String JMX_RIGHTS_ELT = "rights"; /** - * InstanceManager: use to store the InstanceManager instance. + * The instance manager. Used to store the InstanceManager instance. */ private InstanceManager m_instanceManager; /** - * ServiceRegistration : use to register and unregister the Dynamic MBean. + * The service registration. Used to register and unregister the Dynamic MBean. */ private ServiceRegistration m_serviceRegistration; /** - * JmxConfigFieldMap : use to store data when parsing metadata.xml. + * Stores data when parsing metadata.xml. */ private JmxConfigFieldMap m_jmxConfigFieldMap; /** - * DynamicMBeanImpl : store the Dynamic MBean. + * Stores the Dynamic MBean. */ private DynamicMBeanImpl m_MBean; /** - * String : constant which store the name of the class. + * Constant storing the name of the class. */ private String m_namespace = "org.apache.felix.ipojo.handlers.jmx"; /** - * Flag used to say if we use MOSGi framework. + * The flag used to inform if we use the MOSGi framework. */ private boolean m_usesMOSGi = false; /** - * ObjectName used to register the MBean. + * The ObjectName used to register the MBean. */ private ObjectName m_objectName; /** - * Flag used to say if the MBean is registered. + * The flag used to inform if the MBean is registered. */ private boolean m_registered = false; /** - * object name specified in handler configuration. It can be null. + * The ObjectName specified in handler configuration. It can be null. */ private String m_completeObjNameElt; /** - * object name without domain specified in handler configuration. It can be - * null. + * The ObjectName without domain specified in handler configuration. It can be null. */ private String m_objNameWODomainElt; /** - * object name domain specified in handler configuration. It can be null. + * The ObjectName domain specified in handler configuration. It can be null. */ private String m_domainElt; /** - * flag representing if the Pojo implements MBeanRegistration interface. + * The flag informing if the POJO implements the MBeanRegistration interface. */ private boolean m_registerCallbacks; /** - * preRegister method of MBeanRegistration interface. It is null if pojo - * doesn't implement MBeanRegistration interface. + * The preRegister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface. */ private MethodMetadata m_preRegisterMeth; /** - * postRegister method of MBeanRegistration interface. It is null if pojo - * doesn't implement MBeanRegistration interface. + * The postRegister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface. */ private MethodMetadata m_postRegisterMeth; /** - * preDeregister method of MBeanRegistration interface. It is null if pojo - * doesn't implement MBeanRegistration interface. + * The preDeregister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface. */ private MethodMetadata m_preDeregisterMeth; /** - * postDeregister method of MBeanRegistration interface. It is null if pojo - * doesn't implement MBeanRegistration interface. + * The postDeregister method of MBeanRegistration interface. It is null if POJO doesn't implement MBeanRegistration interface. */ private MethodMetadata m_postDeregisterMeth; /** - * configure : construct the structure JmxConfigFieldMap.and the Dynamic - * Mbean. + * Constructs the structure JmxConfigFieldMap and the Dynamic Mbean. * - * @param metadata - * Element - * @param dict - * Dictionary + * @param metadata the component metadata + * @param dict the instance configuration */ public void configure(Element metadata, Dictionary dict) { @@ -325,7 +318,7 @@ } /** - * start : register the Dynamic Mbean. + * Registers the Dynamic Mbean. */ public void start() { // create the corresponding MBean @@ -383,7 +376,7 @@ } /** - * Return the object name of the exposed component. + * Returns the object name of the exposed component. * * @return the object name of the exposed component. */ @@ -415,10 +408,9 @@ } /** - * Extract the package name from of given type. + * Extracts the package name from of given type. * - * @param className - * the type. + * @param className the type name. * @return the package name of the given type. */ private String getPackageName(String className) { @@ -433,7 +425,7 @@ } /** - * stop : unregister the Dynamic Mbean. + * Unregisters the Dynamic Mbean. */ public void stop() { if (m_usesMOSGi) { @@ -457,14 +449,12 @@ } /** - * setterCallback : call when a POJO member is modified externally. + * Called when a POJO member is modified externally. * - * @param pojo - * : the POJO object - * @param fieldName - * : name of the modified field - * @param value - * : new value of the field + * @param pojo the modified POJO object + * @param fieldName the name of the modified field + * @param value the new value of the field + * @see FieldInterceptor#onSet(Object, String, Object) */ public void onSet(Object pojo, String fieldName, Object value) { // Check if the field is a configurable property @@ -484,15 +474,13 @@ } /** - * getterCallback : call when a POJO member is modified by the MBean. + * Called when a POJO member is read by the MBean. * - * @param pojo - * : pojo object. - * @param fieldName - * : name of the modified field - * @param value - * : old value of the field - * @return : new value of the field + * @param pojo the read POJO object. + * @param fieldName the name of the modified field + * @param value the old value of the field + * @return the (injected) value of the field + * @see FieldInterceptor#onGet(Object, String, Object) */ public Object onGet(Object pojo, String fieldName, Object value) { @@ -503,18 +491,15 @@ m_instanceManager.onSet(pojo, fieldName, propertyField.getValue()); return propertyField.getValue(); } - // m_instanceManager.onSet(pojo, fieldName, value); return value; } /** - * getTypeFromAttributeField : get the type from a field name. + * Gets the type from a field name. * - * @param fieldRequire - * : name of the requiered field - * @param manipulation - * : metadata extract from metadata.xml file - * @return : type of the field or null if it wasn't found + * @param fieldRequire the name of the required field + * @param manipulation the metadata extracted from metadata.xml file + * @return the type of the field or {@code null} if it wasn't found */ private static String getTypeFromAttributeField(String fieldRequire, PojoMetadata manipulation) { @@ -528,15 +513,12 @@ } /** - * getMethodsFromName : get all the methods available which get this name. + * Gets all the methods available which get this name. * - * @param methodName - * : name of the requiered methods - * @param manipulation - * : metadata extract from metadata.xml file - * @param description - * : description which appears in jmx console - * @return : array of methods with the right name + * @param methodName the name of the required methods + * @param manipulation the metadata extract from metadata.xml file + * @param description the description which appears in JMX console + * @return the array of methods with the right name */ private MethodField[] getMethodsFromName(String methodName, PojoMetadata manipulation, String description) { @@ -560,9 +542,9 @@ } /** - * Get the jmx handler description. + * Gets the JMX handler description. * - * @return the jmx handler description. + * @return the JMX handler description. * @see org.apache.felix.ipojo.Handler#getDescription() */ public HandlerDescription getDescription() { @@ -570,8 +552,7 @@ } /** - * Return the objectName used to register the MBean. If the MBean is not - * registered, return an empty string. + * Returns the objectName used to register the MBean. If the MBean is not registered, return an empty string. * * @return the objectName used to register the MBean. * @see org.apache.felix.ipojo.Handler#getDescription() @@ -585,7 +566,7 @@ } /** - * Return true if the MBean is registered. + * Returns true if the MBean is registered. * * @return true if the MBean is registered. */ @@ -594,20 +575,18 @@ } /** - * Return true if the MBean must be registered thanks to whiteboard pattern - * of MOSGi. + * Returns true if the MBean must be registered thanks to white board pattern of MOSGi. * - * @return true if the MBean must be registered thanks to whiteboard pattern - * of MOSGi. + * @return {@code true} if the MBean must be registered thanks to white board pattern of MOSGi, false otherwise. */ public boolean isUsesMOSGi() { return m_usesMOSGi; } /** - * Return true if the MOSGi framework is present on the OSGi plateforme. + * Returns true if the MOSGi framework is present on the OSGi platform. * - * @return true if the MOSGi framework is present on the OSGi plateforme. + * @return {@code true} if the MOSGi framework is present on the OSGi platform, false otherwise. */ public boolean isMOSGiExists() { for (Bundle bundle : m_instanceManager.getContext().getBundles()) { Modified: felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MethodField.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MethodField.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MethodField.java (original) +++ felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/MethodField.java Mon Oct 6 10:08:45 2008 @@ -24,28 +24,26 @@ import org.apache.felix.ipojo.parser.MethodMetadata; /** - * this class build a method JMX description. + * This class builds a method JMX description. * * @author Felix Project Team */ public class MethodField { /** - * m_description : store the method descritpion. + * Stores the method description. */ private String m_description; /** - * m_method : store the method properties. + * Stores the method properties. */ private MethodMetadata m_method; /** - * MethodField : constructor. + * Constructor. * - * @param method - * : the metod properties - * @param description - * : thes method description + * @param method the method properties + * @param description the method description */ public MethodField(MethodMetadata method, String description) { this.m_method = method; @@ -53,22 +51,34 @@ } + /** + * Gets the method + * @return the method + */ public MethodMetadata getMethod() { return m_method; } + /** + * Gets the description + * @return the description + */ public String getDescription() { return m_description; } + /** + * Gets the name + * @return the name + */ public String getName() { return m_method.getMethodName(); } /** - * getParams : get the parameter in JMX format. + * Gets the parameter in JMX format. * - * @return MBeanParameterInfo : return info on JMX format + * @return info on JMX format */ public MBeanParameterInfo[] getParams() { MBeanParameterInfo[] mbean = new MBeanParameterInfo[m_method Modified: felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/NotificationField.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/NotificationField.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/NotificationField.java (original) +++ felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/NotificationField.java Mon Oct 6 10:08:45 2008 @@ -22,33 +22,30 @@ import javax.management.MBeanNotificationInfo; /** - * this calss build the notification descritpion structure. + * This class builds the notification description structure. * * @author Felix Project Team */ public class NotificationField { /** - * m_name : name of the notification. + * The name of the notification. */ private String m_name; /** - * m_description : description of the notification. + * The description of the notification. */ private String m_description; /** - * m_description : field of the notification. + * The field of the notification. */ private String m_field; /** - * NotificationField : constructor. + * Constructor. * - * @param name - * : name of the notification - * @param field - * : field which send a notification when it is modified - * @param description - * : descritpion which appears in jmx console + * @param name the name of the notification + * @param field the field which send a notification when it is modified + * @param description the description which appears in JMX console */ public NotificationField(String name, String field, String description) { @@ -58,9 +55,9 @@ } /** - * getNotificationInfo : return the MBeanNotificationInfo from this class. + * Returns the MBeanNotificationInfo from this class. * - * @return : type of the field or null if it wasn't found + * @return the type of the field or {@code null} if it wasn't found */ public MBeanNotificationInfo getNotificationInfo() { String[] notificationTypes = new String[1]; Modified: felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/PropertyField.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/PropertyField.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/PropertyField.java (original) +++ felix/trunk/ipojo/handler/jmx/src/main/java/org/apache/felix/ipojo/handlers/jmx/PropertyField.java Mon Oct 6 10:08:45 2008 @@ -20,48 +20,44 @@ package org.apache.felix.ipojo.handlers.jmx; /** - * this calss build the notification descritpion structure. + * This class build the notification description structure. * * @author Felix Project Team */ public class PropertyField { /** - * m_name : name of the notification. + * The name of the notification. */ private String m_name; /** - * m_name : name of the notification. + * The name of the notification. */ private String m_field; /** - * m_name : name of the notification. + * The name of the notification. */ private String m_rights; /** - * m_name : name of the notification. + * The name of the notification. */ private String m_type; /** - * m_name : name of the notification. + * The name of the notification. */ private Object m_value; /** - * m_name : name of the notification. + * The name of the notification. */ private boolean m_notification = false; /** - * PropertyField : constructor. + * Constructor. * - * @param name - * : name of the properety - * @param field - * : field which send a notification when it is modified - * @param rights - * : the rights of the attribute (ie: 'r' or 'w') - * @param type - * : the type of the attribute + * @param name the name of the properety + * @param field the field which send a notification when it is modified + * @param rights the rights of the attribute (ie: 'r' or 'w') + * @param type the type of the attribute */ public PropertyField(String name, String field, String rights, String type) { this.setName(name); @@ -74,69 +70,124 @@ } } + /** + * Returns the field + * @return the field + */ public String getField() { return m_field; } + /** + * Modify the field + * @param field the new field + */ public void setField(String field) { this.m_field = field; } + /** + * Returns the name + * @return the name + */ public String getName() { return m_name; } + /** + * Modify the name + * @param name the new name + */ public void setName(String name) { this.m_name = name; } + /** + * Returns the rights + * @return the rights + */ public String getRights() { return m_rights; } + /** + * Modify the rights + * @param rights the new rights + */ public void setRights(String rights) { this.m_rights = rights; } + /** + * Returns the value + * @return the value + */ public Object getValue() { return m_value; } + /** + * Modify the value + * @param value the new value + */ public void setValue(Object value) { this.m_value = value; } + /** + * Returns the type + * @return the type + */ public String getType() { return this.m_type; } + /** + * Returns the description + * @return the description + */ public String getDescription() { // TODO Auto-generated method stub return null; } + /** + * Returns true if this property field is readable, false otherwise. + * @return {@code true} if this property field is readable, {@code false} otherwise. + */ public boolean isReadable() { return this.getRights().equals("r") || this.getRights().equals("w"); } + /** + * Returns true if this property field is writable, false otherwise. + * @return {@code true} if this property field is writable, {@code false} otherwise. + */ public boolean isWritable() { return this.getRights().equals("w"); } + /** + * Returns true if this property field is notifiable, false otherwise. + * @return {@code true} if this property field is notifiable, {@code false} otherwise. + */ public boolean isNotifiable() { return this.m_notification; } + /** + * Modify the notifiability of this property field. + * @param value the new notifiability of this property field. + */ public void setNotifiable(boolean value) { this.m_notification = value; } /** - * isRightsValid : return is the rights is valid or not (ie = 'r' || 'w'). + * Is the rights is valid or not ? (ie = 'r' || 'w'). * - * @param rights - * : string represents the rights - * @return boolean : return true if rights = 'r' or 'w' + * @param rights string representing the rights + * @return boolean : return {@code true} if rights = 'r' or 'w' */ public static boolean isRightsValid(String rights) { return rights != null && (rights.equals("r") || rights.equals("w")); Modified: felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java (original) +++ felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalDependency.java Mon Oct 6 10:08:45 2008 @@ -1,297 +1,293 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, 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.apache.felix.ipojo.handler.temporal; - -import java.lang.reflect.Array; -import java.lang.reflect.Proxy; - -import org.apache.felix.ipojo.FieldInterceptor; -import org.apache.felix.ipojo.Nullable; -import org.apache.felix.ipojo.PrimitiveHandler; -import org.apache.felix.ipojo.handlers.dependency.NullableObject; -import org.apache.felix.ipojo.util.DependencyModel; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Filter; -import org.osgi.framework.ServiceReference; - -/** - * Temporal dependency. A temporal dependency waits (block) for the availability - * of the service. If no provider arrives in the specified among of time, a - * runtime exception is thrown. - * @author Felix Project Team - */ -public class TemporalDependency extends DependencyModel implements - FieldInterceptor { - - /** - * Timeout. - */ - private long m_timeout; - - /** - * Default-Implementation. - */ - private String m_di; - - /** - * Nullable object / Default-Implementation instance if used. - */ - private Object m_nullableObject; - - /** - * Handler managing this dependency. - */ - private PrimitiveHandler m_handler; - - /** - * Timetout policy. Null inject null Nullable injects a nullable object or - * an array with a nullable object Default-Implementation inject an object - * created from the specified injected implementation or an array with it - * Empty array inject an empty array (must be an aggregate dependency) No - * policy (0) throw a runtime exception when the timeout occurs * - */ - private int m_policy; - - /** - * Constructor. - * @param spec : service specification - * @param agg : is the dependency aggregate ? - * @param filter : LDAP filter - * @param context : service context - * @param timeout : timeout - * @param handler : Handler managing this dependency - * @param defaultImpl : class used as default-implementation - * @param policy : onTimeout policy - */ - public TemporalDependency(Class spec, boolean agg, Filter filter, - BundleContext context, long timeout, int policy, - String defaultImpl, TemporalHandler handler) { - super(spec, agg, true, filter, null, - DependencyModel.DYNAMIC_BINDING_POLICY, context, handler); - m_di = defaultImpl; - m_policy = policy; - m_timeout = timeout; - m_handler = handler; - } - - /** - * The dependency has been reconfigured. - * @param arg0 : new service references - * @param arg1 : old service references - * @see org.apache.felix.ipojo.util.DependencyModel#onDependencyReconfiguration(org.osgi.framework.ServiceReference[], - * org.osgi.framework.ServiceReference[]) - */ - public void onDependencyReconfiguration(ServiceReference[] arg0, - ServiceReference[] arg1) { - throw new UnsupportedOperationException( - "Reconfiguration not yet supported"); - } - - /** - * A provider arrives. - * @param arg0 : service reference of the new provider. - * @see org.apache.felix.ipojo.util.DependencyModel#onServiceArrival(org.osgi.framework.ServiceReference) - */ - public void onServiceArrival(ServiceReference arg0) { - // Notify if a thread is waiting. - synchronized (this) { - notifyAll(); - } - } - - /** - * A provider leaves. Nothing to do. - * @param arg0 : leaving service references. - * @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference) - */ - public synchronized void onServiceDeparture(ServiceReference arg0) { - } - - /** - * The code require a value of the monitored field. If providers are - * available, the method return service object(s) immediately. Else, the - * thread is blocked until an arrival. If no provider arrives during the - * among of time specified, the method throws a Runtime Exception. - * @param arg0 : POJO instance asking for the service - * @param arg1 : field name - * @param arg2 : previous value - * @return the object to inject. - * @see org.apache.felix.ipojo.FieldInterceptor#onGet(java.lang.Object, - * java.lang.String, java.lang.Object) - */ - public synchronized Object onGet(Object arg0, String arg1, Object arg2) { - ServiceReference[] refs = getServiceReferences(); - if (refs != null) { - // Immediate return. - if (isAggregate()) { - Object[] svc = (Object[]) Array.newInstance(getSpecification(), - refs.length); - for (int i = 0; i < svc.length; i++) { - svc[i] = getService(refs[i]); - } - return svc; - } else { - return getService(refs[0]); - } - } else { - // Begin to wait ... - long enter = System.currentTimeMillis(); - boolean exhausted = false; - ServiceReference ref = null; - synchronized (this) { - while (getServiceReference() == null && !exhausted) { - try { - wait(1); - } catch (InterruptedException e) { - // We was interrupted .... - } finally { - long end = System.currentTimeMillis(); - exhausted = (end - enter) > m_timeout; - } - } - } - // Check - if (exhausted) { - return onTimeout(); - } else { - ref = getServiceReference(); - if (isAggregate()) { - Object[] svc = (Object[]) Array.newInstance( - getSpecification(), 1); - svc[0] = getService(ref); - return svc; - } else { - return getService(ref); - } - } - } - } - - /** - * Start method. - * Initializes the nullable object. - * @see org.apache.felix.ipojo.util.DependencyModel#start() - */ - public void start() { - super.start(); - switch (m_policy) { - case TemporalHandler.NULL: - m_nullableObject = null; - break; - case TemporalHandler.NULLABLE: - // To load the proxy we use the POJO class loader. Indeed, this - // classloader imports iPOJO (so can access to Nullable) and has - // access to the service specification. - try { - m_nullableObject = Proxy.newProxyInstance(m_handler - .getInstanceManager().getClazz().getClassLoader(), - new Class[] { getSpecification(), Nullable.class }, - new NullableObject()); // NOPMD - if (isAggregate()) { - Object[] array = (Object[]) Array.newInstance( - getSpecification(), 1); - array[0] = m_nullableObject; - m_nullableObject = array; - } - } catch (NoClassDefFoundError e) { - // A NoClassDefFoundError is thrown if the specification - // uses a - // class not accessible by the actual instance. - // It generally comes from a missing import. - throw new IllegalStateException( - "Cannot create the Nullable object, a referenced class cannot be loaded: " - + e.getMessage()); - } - - break; - case TemporalHandler.DEFAULT_IMPLEMENTATION: - // Create the default-implementation object. - try { - Class clazz = m_handler.getInstanceManager().getContext() - .getBundle().loadClass(m_di); - m_nullableObject = clazz.newInstance(); - } catch (IllegalAccessException e) { - throw new IllegalStateException( - "Cannot load the default-implementation " + m_di - + " : " + e.getMessage()); - } catch (InstantiationException e) { - throw new IllegalStateException( - "Cannot load the default-implementation " + m_di - + " : " + e.getMessage()); - } catch (ClassNotFoundException e) { - throw new IllegalStateException( - "Cannot load the default-implementation " + m_di - + " : " + e.getMessage()); - } - if (isAggregate()) { - Object[] array = (Object[]) Array.newInstance( - getSpecification(), 1); - array[0] = m_nullableObject; - m_nullableObject = array; - } - break; - case TemporalHandler.EMPTY_ARRAY: - m_nullableObject = Array.newInstance(getSpecification(), 0); - break; - default: // Cannot occurs - break; - } - } - - /** - * Stop method. - * Just release the reference on the nullable object. - * @see org.apache.felix.ipojo.util.DependencyModel#stop() - */ - public void stop() { - super.stop(); - m_nullableObject = null; - } - - /** - * The monitored field receives a value. Nothing to do. - * @param arg0 : POJO setting the value. - * @param arg1 : field name - * @param arg2 : received value - * @see org.apache.felix.ipojo.FieldInterceptor#onSet(java.lang.Object, - * java.lang.String, java.lang.Object) - */ - public void onSet(Object arg0, String arg1, Object arg2) { - } - - /** - * Implements the timeout policy according to the specified configuration. - * @return the object to return when the timeout occurs. - */ - private Object onTimeout() { - switch (m_policy) { - case TemporalHandler.NULL: - case TemporalHandler.NULLABLE: - case TemporalHandler.DEFAULT_IMPLEMENTATION: - case TemporalHandler.EMPTY_ARRAY: - return m_nullableObject; - default: - // Throws a runtime exception - throw new RuntimeException("Service " - + getSpecification().getName() - + " unavailable : timeout"); - } - } - -} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, 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.apache.felix.ipojo.handler.temporal; + +import java.lang.reflect.Array; +import java.lang.reflect.Proxy; + +import org.apache.felix.ipojo.FieldInterceptor; +import org.apache.felix.ipojo.Nullable; +import org.apache.felix.ipojo.PrimitiveHandler; +import org.apache.felix.ipojo.handlers.dependency.NullableObject; +import org.apache.felix.ipojo.util.DependencyModel; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Filter; +import org.osgi.framework.ServiceReference; + +/** + * Temporal dependency. A temporal dependency waits (block) for the availability + * of the service. If no provider arrives in the specified among of time, a + * runtime exception is thrown. + * @author Felix Project Team + */ +public class TemporalDependency extends DependencyModel implements + FieldInterceptor { + + /** + * The timeout. + */ + private long m_timeout; + + /** + * The default implementation. + */ + private String m_di; + + /** + * The {@link Nullable} object or Default-Implementation instance if used. + */ + private Object m_nullableObject; + + /** + * The handler managing this dependency. + */ + private PrimitiveHandler m_handler; + + /** + * The timeout policy. Null injects null, {@link Nullable} injects a nullable object or + * an array with a nullable object, Default-Implementation injects an object + * created from the specified injected implementation or an array with it + * Empty array inject an empty array (must be an aggregate dependency) No + * policy (0) throw a runtime exception when the timeout occurs * + */ + private int m_policy; + + /** + * Constructor. + * @param spec service specification + * @param agg is the dependency aggregate ? + * @param filter LDAP filter + * @param context service context + * @param timeout timeout + * @param handler Handler managing this dependency + * @param defaultImpl class used as default-implementation + * @param policy onTimeout policy + */ + public TemporalDependency(Class spec, boolean agg, Filter filter, + BundleContext context, long timeout, int policy, + String defaultImpl, TemporalHandler handler) { + super(spec, agg, true, filter, null, + DependencyModel.DYNAMIC_BINDING_POLICY, context, handler); + m_di = defaultImpl; + m_policy = policy; + m_timeout = timeout; + m_handler = handler; + } + + /** + * The dependency has been reconfigured. + * @param arg0 new service references + * @param arg1 old service references + * @see org.apache.felix.ipojo.util.DependencyModel#onDependencyReconfiguration(org.osgi.framework.ServiceReference[], + * org.osgi.framework.ServiceReference[]) + */ + public void onDependencyReconfiguration(ServiceReference[] arg0, + ServiceReference[] arg1) { + throw new UnsupportedOperationException( + "Reconfiguration not yet supported"); + } + + /** + * A provider arrives. + * @param arg0 service reference of the new provider. + * @see org.apache.felix.ipojo.util.DependencyModel#onServiceArrival(org.osgi.framework.ServiceReference) + */ + public void onServiceArrival(ServiceReference arg0) { + // Notify if a thread is waiting. + synchronized (this) { + notifyAll(); + } + } + + /** + * A provider leaves. Nothing to do. + * @param arg0 leaving service references. + * @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference) + */ + public synchronized void onServiceDeparture(ServiceReference arg0) { + } + + /** + * The code require a value of the monitored field. If providers are + * available, the method return service object(s) immediately. Else, the + * thread is blocked until an arrival. If no provider arrives during the + * among of time specified, the method throws a Runtime Exception. + * @param arg0 POJO instance asking for the service + * @param arg1 field name + * @param arg2 previous value + * @return the object to inject. + * @see org.apache.felix.ipojo.FieldInterceptor#onGet(java.lang.Object, java.lang.String, java.lang.Object) + */ + public synchronized Object onGet(Object arg0, String arg1, Object arg2) { + ServiceReference[] refs = getServiceReferences(); + if (refs != null) { + // Immediate return. + if (isAggregate()) { + Object[] svc = (Object[]) Array.newInstance(getSpecification(), + refs.length); + for (int i = 0; i < svc.length; i++) { + svc[i] = getService(refs[i]); + } + return svc; + } else { + return getService(refs[0]); + } + } else { + // Begin to wait ... + long enter = System.currentTimeMillis(); + boolean exhausted = false; + ServiceReference ref = null; + synchronized (this) { + while (getServiceReference() == null && !exhausted) { + try { + wait(1); + } catch (InterruptedException e) { + // We was interrupted .... + } finally { + long end = System.currentTimeMillis(); + exhausted = (end - enter) > m_timeout; + } + } + } + // Check + if (exhausted) { + return onTimeout(); + } else { + ref = getServiceReference(); + if (isAggregate()) { + Object[] svc = (Object[]) Array.newInstance( + getSpecification(), 1); + svc[0] = getService(ref); + return svc; + } else { + return getService(ref); + } + } + } + } + + /** + * Start method. Initializes the nullable object. + * @see org.apache.felix.ipojo.util.DependencyModel#start() + */ + public void start() { + super.start(); + switch (m_policy) { + case TemporalHandler.NULL: + m_nullableObject = null; + break; + case TemporalHandler.NULLABLE: + // To load the proxy we use the POJO class loader. Indeed, this + // classloader imports iPOJO (so can access to Nullable) and has + // access to the service specification. + try { + m_nullableObject = Proxy.newProxyInstance(m_handler + .getInstanceManager().getClazz().getClassLoader(), + new Class[] { getSpecification(), Nullable.class }, + new NullableObject()); // NOPMD + if (isAggregate()) { + Object[] array = (Object[]) Array.newInstance( + getSpecification(), 1); + array[0] = m_nullableObject; + m_nullableObject = array; + } + } catch (NoClassDefFoundError e) { + // A NoClassDefFoundError is thrown if the specification + // uses a + // class not accessible by the actual instance. + // It generally comes from a missing import. + throw new IllegalStateException( + "Cannot create the Nullable object, a referenced class cannot be loaded: " + + e.getMessage()); + } + + break; + case TemporalHandler.DEFAULT_IMPLEMENTATION: + // Create the default-implementation object. + try { + Class clazz = m_handler.getInstanceManager().getContext() + .getBundle().loadClass(m_di); + m_nullableObject = clazz.newInstance(); + } catch (IllegalAccessException e) { + throw new IllegalStateException( + "Cannot load the default-implementation " + m_di + + " : " + e.getMessage()); + } catch (InstantiationException e) { + throw new IllegalStateException( + "Cannot load the default-implementation " + m_di + + " : " + e.getMessage()); + } catch (ClassNotFoundException e) { + throw new IllegalStateException( + "Cannot load the default-implementation " + m_di + + " : " + e.getMessage()); + } + if (isAggregate()) { + Object[] array = (Object[]) Array.newInstance( + getSpecification(), 1); + array[0] = m_nullableObject; + m_nullableObject = array; + } + break; + case TemporalHandler.EMPTY_ARRAY: + m_nullableObject = Array.newInstance(getSpecification(), 0); + break; + default: // Cannot occurs + break; + } + } + + /** + * Stop method. Just releases the reference on the nullable object. + * @see org.apache.felix.ipojo.util.DependencyModel#stop() + */ + public void stop() { + super.stop(); + m_nullableObject = null; + } + + /** + * The monitored field receives a value. Nothing to do. + * @param arg0 POJO setting the value. + * @param arg1 field name + * @param arg2 received value + * @see org.apache.felix.ipojo.FieldInterceptor#onSet(java.lang.Object, java.lang.String, java.lang.Object) + */ + public void onSet(Object arg0, String arg1, Object arg2) { + } + + /** + * Implements the timeout policy according to the specified configuration. + * @return the object to return when the timeout occurs. + */ + private Object onTimeout() { + switch (m_policy) { + case TemporalHandler.NULL: + case TemporalHandler.NULLABLE: + case TemporalHandler.DEFAULT_IMPLEMENTATION: + case TemporalHandler.EMPTY_ARRAY: + return m_nullableObject; + default: + // Throws a runtime exception + throw new RuntimeException("Service " + + getSpecification().getName() + + " unavailable : timeout"); + } + } + +} Modified: felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalHandler.java URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalHandler.java?rev=702202&r1=702201&r2=702202&view=diff ============================================================================== --- felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalHandler.java (original) +++ felix/trunk/ipojo/handler/temporal/src/main/java/org/apache/felix/ipojo/handler/temporal/TemporalHandler.java Mon Oct 6 10:08:45 2008 @@ -1,197 +1,196 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, 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.apache.felix.ipojo.handler.temporal; - -import java.util.ArrayList; -import java.util.Dictionary; -import java.util.List; - -import org.apache.felix.ipojo.ConfigurationException; -import org.apache.felix.ipojo.PrimitiveHandler; -import org.apache.felix.ipojo.metadata.Element; -import org.apache.felix.ipojo.parser.FieldMetadata; -import org.apache.felix.ipojo.parser.PojoMetadata; -import org.apache.felix.ipojo.util.DependencyModel; -import org.apache.felix.ipojo.util.DependencyStateListener; -import org.osgi.framework.Filter; -import org.osgi.framework.InvalidSyntaxException; - -/** -* Temporal dependency handler. -* A temporal dependency waits (block) for the availability of the service. -* If no provider arrives in the specified among of time, a runtime exception is thrown. -* @author Felix Project Team -*/ -public class TemporalHandler extends PrimitiveHandler implements DependencyStateListener { - - /** - * Default timeout if not specified. - */ - public static final int DEFAULT_TIMEOUT = 3000; - - /** - * No policy. - */ - public static final int NO_POLICY = 0; - /** - * Use a nullable object. - */ - public static final int NULLABLE = 1; - /** - * Use a default-implementation object. - */ - public static final int DEFAULT_IMPLEMENTATION = 2; - /** - * Use an empty array. - */ - public static final int EMPTY_ARRAY = 3; - /** - * Use null. - */ - public static final int NULL = 4; - - /** - * Handler namespace. - */ - public static final String NAMESPACE = "org.apache.felix.ipojo.handler.temporal"; - - /** - * List of managed dependencies. - */ - private List/**/ m_dependencies = new ArrayList(1); - - /** - * Start method. Starts managed dependencies. - * @see org.apache.felix.ipojo.Handler#start() - */ - public void start() { - for (int i = 0; i < m_dependencies.size(); i++) { - ((TemporalDependency) m_dependencies.get(i)).start(); - } - } - - /** - * Stop method. Stops managed dependencies. - * @see org.apache.felix.ipojo.Handler#stop() - */ - public void stop() { - for (int i = 0; i < m_dependencies.size(); i++) { - ((TemporalDependency) m_dependencies.get(i)).stop(); - } - m_dependencies.clear(); - } - - /** - * Configure method. - * Create managed dependencies. - * @param meta : component type metadata. - * @param dictionary : instance configuration. - * @throws ConfigurationException : the dependency is not configured correctly - * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary) - */ - public void configure(Element meta, Dictionary dictionary) throws ConfigurationException { - PojoMetadata manipulation = getFactory().getPojoMetadata(); - Element[] deps = meta.getElements("requires", NAMESPACE); - for (int i = 0; i < deps.length; i++) { - if (!deps[i].containsAttribute("field") || m_dependencies.contains(deps[i].getAttribute("field"))) { - error("One temporal dependency must be attached to a field or the field is already used"); - return; - } - String field = deps[i].getAttribute("field"); - - FieldMetadata fieldmeta = manipulation.getField(field); - if (fieldmeta == null) { - error("The field " + field + " does not exist in the class " + getInstanceManager().getClassName()); - return; - } - - String fil = deps[i].getAttribute("filter"); - Filter filter = null; - if (fil != null) { - try { - filter = getInstanceManager().getContext().createFilter(fil); - } catch (InvalidSyntaxException e) { - error("Cannot create the field from " + fil + ": " + e.getMessage()); - return; - } - } - - boolean agg = false; - String spec = fieldmeta.getFieldType(); - if (spec.endsWith("[]")) { - agg = true; - spec = spec.substring(0, spec.length() - 2); - } - - long timeout = DEFAULT_TIMEOUT; - if (deps[i].containsAttribute("timeout")) { - String to = deps[i].getAttribute("timeout"); - if (to.equalsIgnoreCase("infinite") || to.equalsIgnoreCase("-1")) { - timeout = Long.MAX_VALUE; // Infinite wait time ... - } else { - timeout = new Long(deps[i].getAttribute("timeout")).longValue(); - } - } - - int policy = NO_POLICY; - String di = null; - String onTimeout = deps[i].getAttribute("onTimeout"); - if (onTimeout != null) { - if (onTimeout.equalsIgnoreCase("nullable")) { - policy = NULLABLE; - } else if (onTimeout.equalsIgnoreCase("empty-array")) { - policy = EMPTY_ARRAY; - if (! agg) { - // The empty array policy can only be used on aggregate dependencies - error("Cannot use the empty array policy for " + field + " : non aggregate dependency."); - } - } else if (onTimeout.equalsIgnoreCase("null")) { - policy = NULL; - } else if (onTimeout.length() > 0) { - di = onTimeout; - policy = DEFAULT_IMPLEMENTATION; - } - } - - Class specification = DependencyModel.loadSpecification(spec, getInstanceManager().getContext()); - TemporalDependency dep = new TemporalDependency(specification, agg, filter, getInstanceManager().getContext(), timeout, policy, di, this); - m_dependencies.add(dep); - - getInstanceManager().register(fieldmeta, dep); - } - } - - /** - * Nothing to do. - * A temporal dependency is always valid. - * @param dependencymodel : dependency. - * @see org.apache.felix.ipojo.util.DependencyStateListener#invalidate(org.apache.felix.ipojo.util.DependencyModel) - */ - public void invalidate(DependencyModel dependencymodel) { } - - /** - * Nothing to do. - * A temporal dependency is always valid. - * @param dependencymodel : dependency. - * @see org.apache.felix.ipojo.util.DependencyStateListener#validate(org.apache.felix.ipojo.util.DependencyModel) - */ - public void validate(DependencyModel dependencymodel) { } - - -} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, 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.apache.felix.ipojo.handler.temporal; + +import java.util.ArrayList; +import java.util.Dictionary; +import java.util.List; + +import org.apache.felix.ipojo.ConfigurationException; +import org.apache.felix.ipojo.PrimitiveHandler; +import org.apache.felix.ipojo.metadata.Element; +import org.apache.felix.ipojo.parser.FieldMetadata; +import org.apache.felix.ipojo.parser.PojoMetadata; +import org.apache.felix.ipojo.util.DependencyModel; +import org.apache.felix.ipojo.util.DependencyStateListener; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; + +/** +* Temporal dependency handler. +* A temporal dependency waits (block) for the availability of the service. +* If no provider arrives in the specified among of time, a runtime exception is thrown. +* @author Felix Project Team +*/ +public class TemporalHandler extends PrimitiveHandler implements DependencyStateListener { + + /** + * Default timeout if not specified. + */ + public static final int DEFAULT_TIMEOUT = 3000; + + /** + * No policy. + */ + public static final int NO_POLICY = 0; + /** + * Uses a nullable object. + */ + public static final int NULLABLE = 1; + /** + * Uses a default-implementation object. + */ + public static final int DEFAULT_IMPLEMENTATION = 2; + /** + * Uses an empty array. + */ + public static final int EMPTY_ARRAY = 3; + /** + * Uses {@code null}. + */ + public static final int NULL = 4; + + /** + * The handler namespace. + */ + public static final String NAMESPACE = "org.apache.felix.ipojo.handler.temporal"; + + /** + * The list of managed dependencies. + */ + private List/**/ m_dependencies = new ArrayList(1); + + /** + * Start method. Starts managed dependencies. + * @see org.apache.felix.ipojo.Handler#start() + */ + public void start() { + for (int i = 0; i < m_dependencies.size(); i++) { + ((TemporalDependency) m_dependencies.get(i)).start(); + } + } + + /** + * Stop method. Stops managed dependencies. + * @see org.apache.felix.ipojo.Handler#stop() + */ + public void stop() { + for (int i = 0; i < m_dependencies.size(); i++) { + ((TemporalDependency) m_dependencies.get(i)).stop(); + } + m_dependencies.clear(); + } + + /** + * Configure method. Creates managed dependencies. + * @param meta the component type metadata. + * @param dictionary the instance configuration. + * @throws ConfigurationException if the dependency is not configured correctly + * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary) + */ + public void configure(Element meta, Dictionary dictionary) throws ConfigurationException { + PojoMetadata manipulation = getFactory().getPojoMetadata(); + Element[] deps = meta.getElements("requires", NAMESPACE); + for (int i = 0; i < deps.length; i++) { + if (!deps[i].containsAttribute("field") || m_dependencies.contains(deps[i].getAttribute("field"))) { + error("One temporal dependency must be attached to a field or the field is already used"); + return; + } + String field = deps[i].getAttribute("field"); + + FieldMetadata fieldmeta = manipulation.getField(field); + if (fieldmeta == null) { + error("The field " + field + " does not exist in the class " + getInstanceManager().getClassName()); + return; + } + + String fil = deps[i].getAttribute("filter"); + Filter filter = null; + if (fil != null) { + try { + filter = getInstanceManager().getContext().createFilter(fil); + } catch (InvalidSyntaxException e) { + error("Cannot create the field from " + fil + ": " + e.getMessage()); + return; + } + } + + boolean agg = false; + String spec = fieldmeta.getFieldType(); + if (spec.endsWith("[]")) { + agg = true; + spec = spec.substring(0, spec.length() - 2); + } + + long timeout = DEFAULT_TIMEOUT; + if (deps[i].containsAttribute("timeout")) { + String to = deps[i].getAttribute("timeout"); + if (to.equalsIgnoreCase("infinite") || to.equalsIgnoreCase("-1")) { + timeout = Long.MAX_VALUE; // Infinite wait time ... + } else { + timeout = new Long(deps[i].getAttribute("timeout")).longValue(); + } + } + + int policy = NO_POLICY; + String di = null; + String onTimeout = deps[i].getAttribute("onTimeout"); + if (onTimeout != null) { + if (onTimeout.equalsIgnoreCase("nullable")) { + policy = NULLABLE; + } else if (onTimeout.equalsIgnoreCase("empty-array")) { + policy = EMPTY_ARRAY; + if (! agg) { + // The empty array policy can only be used on aggregate dependencies + error("Cannot use the empty array policy for " + field + " : non aggregate dependency."); + } + } else if (onTimeout.equalsIgnoreCase("null")) { + policy = NULL; + } else if (onTimeout.length() > 0) { + di = onTimeout; + policy = DEFAULT_IMPLEMENTATION; + } + } + + Class specification = DependencyModel.loadSpecification(spec, getInstanceManager().getContext()); + TemporalDependency dep = new TemporalDependency(specification, agg, filter, getInstanceManager().getContext(), timeout, policy, di, this); + m_dependencies.add(dep); + + getInstanceManager().register(fieldmeta, dep); + } + } + + /** + * Nothing to do. + * A temporal dependency is always valid. + * @param dependencymodel dependency. + * @see org.apache.felix.ipojo.util.DependencyStateListener#invalidate(org.apache.felix.ipojo.util.DependencyModel) + */ + public void invalidate(DependencyModel dependencymodel) { } + + /** + * Nothing to do. + * A temporal dependency is always valid. + * @param dependencymodel dependency. + * @see org.apache.felix.ipojo.util.DependencyStateListener#validate(org.apache.felix.ipojo.util.DependencyModel) + */ + public void validate(DependencyModel dependencymodel) { } + + +}