001 /****************************************************************
002 * Licensed to the Apache Software Foundation (ASF) under one *
003 * or more contributor license agreements. See the NOTICE file *
004 * distributed with this work for additional information *
005 * regarding copyright ownership. The ASF licenses this file *
006 * to you under the Apache License, Version 2.0 (the *
007 * "License"); you may not use this file except in compliance *
008 * with the License. You may obtain a copy of the License at *
009 * *
010 * http://www.apache.org/licenses/LICENSE-2.0 *
011 * *
012 * Unless required by applicable law or agreed to in writing, *
013 * software distributed under the License is distributed on an *
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
015 * KIND, either express or implied. See the License for the *
016 * specific language governing permissions and limitations *
017 * under the License. *
018 ****************************************************************/
019
020 package org.apache.james.jspf.wiring;
021
022
023 import java.lang.reflect.InvocationTargetException;
024 import java.lang.reflect.Method;
025 import java.util.Hashtable;
026 import java.util.Iterator;
027
028 /**
029 * This class associates "Enabling interfaces" to the service that provides the
030 * dependency.
031 */
032 public class WiringServiceTable extends Hashtable<Class<?>,Object> implements WiringService {
033
034 private static final long serialVersionUID = -9151935136150279119L;
035
036 /**
037 * @see org.apache.james.jspf.wiring.WiringService#wire(java.lang.Object)
038 */
039 public void wire(Object component) throws WiringServiceException {
040 Iterator<Class<?>> i = keySet().iterator();
041 while (i.hasNext()) {
042 Class<?> enablingClass = i.next();
043 if (enablingClass.isInstance(component)) {
044 Method[] m = enablingClass.getDeclaredMethods();
045 if (m!=null && m.length == 1 && m[0] != null) {
046 try {
047 m[0].invoke(component, new Object[] {get(enablingClass)});
048 } catch (IllegalArgumentException e) {
049 throw new WiringServiceException("Illegal argument invoking enabled service: "+enablingClass.toString(), e);
050 } catch (InvocationTargetException e) {
051 throw new WiringServiceException("Unable to invoke enabled service: "+enablingClass.toString(), e);
052 } catch (IllegalAccessException e) {
053 throw new WiringServiceException("Unable to invoke enabled service: "+enablingClass.toString(), e);
054 }
055 }
056 }
057 }
058
059 }
060
061 }