001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.commons.discovery.tools;
018:
019: import java.lang.reflect.InvocationTargetException;
020:
021: import org.apache.commons.discovery.DiscoveryException;
022:
023: /**
024: * Represents a Service Programming Interface (spi).
025: * - SPI's name
026: * - SPI's (provider) class
027: * - SPI's (alternate) override property name
028: *
029: * In addition, while there are many cases where this is NOT
030: * usefull, for those in which it is:
031: *
032: * - expected constructor argument types and parameters values.
033: *
034: * @author Richard A. Sitze
035: */
036: public class SPInterface {
037: /**
038: * The service programming interface: intended to be
039: * an interface or abstract class, but not limited
040: * to those two.
041: */
042: private final Class spi;
043:
044: /**
045: * The property name to be used for finding the name of
046: * the SPI implementation class.
047: */
048: private final String propertyName;
049:
050: private Class paramClasses[] = null;
051: private Object params[] = null;
052:
053: /**
054: * Construct object representing Class <code>provider</code>.
055: *
056: * @param provider The SPI class
057: */
058: public SPInterface(Class provider) {
059: this (provider, provider.getName());
060: }
061:
062: /**
063: * Construct object representing Class <code>provider</code>.
064: *
065: * @param spi The SPI class
066: *
067: * @param propertyName when looking for the name of a class implementing
068: * the provider class, a discovery strategy may involve looking for
069: * (system or other) properties having either the name of the class
070: * (provider) or the <code>propertyName</code>.
071: */
072: public SPInterface(Class spi, String propertyName) {
073: this .spi = spi;
074: this .propertyName = propertyName;
075: }
076:
077: /**
078: * Construct object representing Class <code>provider</code>.
079: *
080: * @param provider The SPI class
081: *
082: * @param constructorParamClasses classes representing the
083: * constructor argument types.
084: *
085: * @param constructorParams objects representing the
086: * constructor arguments.
087: */
088: public SPInterface(Class provider, Class constructorParamClasses[],
089: Object constructorParams[]) {
090: this (provider, provider.getName(), constructorParamClasses,
091: constructorParams);
092: }
093:
094: /**
095: * Construct object representing Class <code>provider</code>.
096: *
097: * @param spi The SPI class
098: *
099: * @param propertyName when looking for the name of a class implementing
100: * the provider class, a discovery strategy may involve looking for
101: * (system or other) properties having either the name of the class
102: * (provider) or the <code>propertyName</code>.
103: *
104: * @param constructorParamClasses classes representing the
105: * constructor argument types.
106: *
107: * @param constructorParams objects representing the
108: * constructor arguments.
109: */
110: public SPInterface(Class spi, String propertyName,
111: Class constructorParamClasses[], Object constructorParams[]) {
112: this .spi = spi;
113: this .propertyName = propertyName;
114: this .paramClasses = constructorParamClasses;
115: this .params = constructorParams;
116: }
117:
118: public String getSPName() {
119: return spi.getName();
120: }
121:
122: public Class getSPClass() {
123: return spi;
124: }
125:
126: public String getPropertyName() {
127: return propertyName;
128: }
129:
130: /**
131: * Instantiate a new
132: */
133: public Object newInstance(Class impl) throws DiscoveryException,
134: InstantiationException, IllegalAccessException,
135: NoSuchMethodException, InvocationTargetException {
136: verifyAncestory(impl);
137:
138: return ClassUtils.newInstance(impl, paramClasses, params);
139: }
140:
141: public void verifyAncestory(Class impl) {
142: ClassUtils.verifyAncestory(spi, impl);
143: }
144: }
|