in container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java [556:818]
public ConnectorModule deploy(final ConnectorModule connectorModule) throws OpenEJBException {
org.apache.openejb.jee.Connector connector = connectorModule.getConnector();
if (connector == null) {
connector = new org.apache.openejb.jee.Connector();
}
// JCA 1.6 - 18.3.1 do not look at annotations if the provided connector
// deployment descriptor is "meta-data complete".
float specVersion = 0;
try {
specVersion = Float.parseFloat(connector.getVersion());
} catch (final Exception e) {
// no-op
}
if (specVersion < 1.6 || Boolean.TRUE.equals(connector.isMetadataComplete())) {
return connectorModule;
}
IAnnotationFinder finder = connectorModule.getFinder();
if (finder == null) {
try {
finder = FinderFactory.createFinder(connectorModule);
connectorModule.setFinder(finder);
} catch (final Exception e) {
// TODO: some sort of error
return connectorModule;
}
}
final List<Class<?>> connectorClasses = finder.findAnnotatedClasses(Connector.class);
// are we allowed to have more than one connector class? Not without a deployment descriptor
if (connector.getResourceAdapter() == null || connector.getResourceAdapter().getResourceAdapterClass() == null || connector.getResourceAdapter().getResourceAdapterClass().length() == 0) {
if (connectorClasses.size() == 0) { //NOPMD
// TODO: fail some validation here too
}
if (connectorClasses.size() > 1) { //NOPMD
// too many connector classes, this is against the spec
// TODO: something like connectorModule.getValidation().fail(ejbName, "abstractAnnotatedAsBean", annotationClass.getSimpleName(), beanClass.get().getName());
}
}
Class<?> connectorClass = null;
if (connectorClasses.size() == 1) {
connectorClass = connectorClasses.get(0);
}
if (connectorClasses.size() > 1) {
for (final Class<?> cls : connectorClasses) {
if (cls.getName().equals(connector.getResourceAdapter().getResourceAdapterClass())) {
connectorClass = cls;
break;
}
}
}
if (connectorClass != null) {
if (connector.getResourceAdapter() == null) {
connector.setResourceAdapter(new ResourceAdapter());
}
if (connector.getResourceAdapter().getResourceAdapterClass() == null || connector.getResourceAdapter().getResourceAdapterClass().length() == 0) {
connector.getResourceAdapter().setResourceAdapterClass(connectorClass.getName());
}
final Connector connectorAnnotation = connectorClass.getAnnotation(Connector.class);
connector.setDisplayNames(getTexts(connector.getDisplayNames(), connectorAnnotation.displayName()));
connector.setDescriptions(getTexts(connector.getDescriptions(), connectorAnnotation.description()));
connector.setEisType(getString(connector.getEisType(), connectorAnnotation.eisType()));
connector.setVendorName(getString(connector.getVendorName(), connectorAnnotation.vendorName()));
connector.setResourceAdapterVersion(getString(connector.getResourceAdapterVersion(), connectorAnnotation.version()));
if (connector.getIcons().isEmpty()) {
final int smallIcons = connectorAnnotation.smallIcon().length;
final int largeIcons = connectorAnnotation.largeIcon().length;
for (int i = 0; i < smallIcons && i < largeIcons; i++) {
final Icon icon = new Icon();
// locale can't be specified in the annotation and it is en by default
// so on other systems it doesn't work because Icon return the default locale
icon.setLang(Locale.getDefault().getLanguage());
if (i < smallIcons) {
icon.setSmallIcon(connectorAnnotation.smallIcon()[i]);
}
if (i < largeIcons) {
icon.setLargeIcon(connectorAnnotation.largeIcon()[i]);
}
connector.getIcons().add(icon);
}
}
if (connector.getLicense() == null) {
final License license = new License();
connector.setLicense(license);
license.setLicenseRequired(connectorAnnotation.licenseRequired());
}
connector.getLicense().setDescriptions(getTexts(connector.getLicense().getDescriptions(), connectorAnnotation.licenseDescription()));
final SecurityPermission[] annotationSecurityPermissions = connectorAnnotation.securityPermissions();
final List<org.apache.openejb.jee.SecurityPermission> securityPermission = connector.getResourceAdapter().getSecurityPermission();
if (securityPermission == null || securityPermission.size() == 0) {
for (final SecurityPermission sp : annotationSecurityPermissions) {
final org.apache.openejb.jee.SecurityPermission permission = new org.apache.openejb.jee.SecurityPermission();
permission.setSecurityPermissionSpec(sp.permissionSpec());
permission.setDescriptions(stringsToTexts(sp.description()));
securityPermission.add(permission);
}
}
final Class<? extends WorkContext>[] annotationRequiredWorkContexts = connectorAnnotation.requiredWorkContexts();
final List<String> requiredWorkContext = connector.getRequiredWorkContext();
if (requiredWorkContext.size() == 0) {
for (final Class<? extends WorkContext> cls : annotationRequiredWorkContexts) {
requiredWorkContext.add(cls.getName());
}
}
OutboundResourceAdapter outboundResourceAdapter = connector.getResourceAdapter().getOutboundResourceAdapter();
if (outboundResourceAdapter == null) {
outboundResourceAdapter = new OutboundResourceAdapter();
connector.getResourceAdapter().setOutboundResourceAdapter(outboundResourceAdapter);
}
final List<AuthenticationMechanism> authenticationMechanisms = outboundResourceAdapter.getAuthenticationMechanism();
final jakarta.resource.spi.AuthenticationMechanism[] authMechanisms = connectorAnnotation.authMechanisms();
if (authenticationMechanisms.size() == 0) {
for (final jakarta.resource.spi.AuthenticationMechanism am : authMechanisms) {
final AuthenticationMechanism authMechanism = new AuthenticationMechanism();
authMechanism.setAuthenticationMechanismType(am.authMechanism());
authMechanism.setCredentialInterface(am.credentialInterface().toString());
authMechanism.setDescriptions(stringsToTexts(am.description()));
authenticationMechanisms.add(authMechanism);
}
}
if (outboundResourceAdapter.getTransactionSupport() == null) {
outboundResourceAdapter.setTransactionSupport(TransactionSupportType.fromValue(connectorAnnotation.transactionSupport().toString()));
}
if (outboundResourceAdapter.isReauthenticationSupport() == null) {
outboundResourceAdapter.setReauthenticationSupport(connectorAnnotation.reauthenticationSupport());
}
}
// process @ConnectionDescription(s)
List<Class<?>> classes = finder.findAnnotatedClasses(ConnectionDefinitions.class);
for (final Class<?> cls : classes) {
final ConnectionDefinitions connectionDefinitionsAnnotation = cls.getAnnotation(ConnectionDefinitions.class);
final ConnectionDefinition[] definitions = connectionDefinitionsAnnotation.value();
for (final ConnectionDefinition definition : definitions) {
processConnectionDescription(connector.getResourceAdapter(), definition, cls);
}
}
classes = finder.findAnnotatedClasses(ConnectionDefinition.class);
for (final Class<?> cls : classes) {
final ConnectionDefinition connectionDefinitionAnnotation = cls.getAnnotation(ConnectionDefinition.class);
processConnectionDescription(connector.getResourceAdapter(), connectionDefinitionAnnotation, cls);
}
InboundResourceadapter inboundResourceAdapter = connector.getResourceAdapter().getInboundResourceAdapter();
if (inboundResourceAdapter == null) {
inboundResourceAdapter = new InboundResourceadapter();
connector.getResourceAdapter().setInboundResourceAdapter(inboundResourceAdapter);
}
MessageAdapter messageAdapter = inboundResourceAdapter.getMessageAdapter();
if (messageAdapter == null) {
messageAdapter = new MessageAdapter();
inboundResourceAdapter.setMessageAdapter(messageAdapter);
}
classes = finder.findAnnotatedClasses(Activation.class);
for (final Class<?> cls : classes) {
MessageListener messageListener = null;
final Activation activationAnnotation = cls.getAnnotation(Activation.class);
final List<MessageListener> messageListeners = messageAdapter.getMessageListener();
for (final MessageListener ml : messageListeners) {
if (cls.getName().equals(ml.getActivationSpec().getActivationSpecClass())) {
messageListener = ml;
break;
}
}
if (messageListener == null) {
final Class<?>[] listeners = activationAnnotation.messageListeners();
for (final Class<?> listener : listeners) {
messageAdapter.addMessageListener(new MessageListener(listener.getName(), cls.getName()));
}
}
}
classes = finder.findAnnotatedClasses(AdministeredObject.class);
final List<AdminObject> adminObjects = connector.getResourceAdapter().getAdminObject();
for (final Class<?> cls : classes) {
final AdministeredObject administeredObjectAnnotation = cls.getAnnotation(AdministeredObject.class);
final Class[] adminObjectInterfaces = administeredObjectAnnotation.adminObjectInterfaces();
AdminObject adminObject = null;
for (final AdminObject admObj : adminObjects) {
if (admObj.getAdminObjectClass().equals(cls.getName())) {
adminObject = admObj;
}
}
if (adminObject == null) {
for (final Class iface : adminObjectInterfaces) {
final AdminObject newAdminObject = new AdminObject();
newAdminObject.setAdminObjectClass(cls.getName());
newAdminObject.setAdminObjectInterface(iface.getName());
adminObjects.add(newAdminObject);
}
}
}
// need to make a list of classes to process for config properties
// resource adapter
final String raCls = connector.getResourceAdapter().getResourceAdapterClass();
process(connectorModule.getClassLoader(), raCls, connector.getResourceAdapter());
// managedconnectionfactory
if (connector.getResourceAdapter() != null && connector.getResourceAdapter().getOutboundResourceAdapter() != null) {
final List<org.apache.openejb.jee.ConnectionDefinition> connectionDefinitions = connector.getResourceAdapter().getOutboundResourceAdapter().getConnectionDefinition();
for (final org.apache.openejb.jee.ConnectionDefinition connectionDefinition : connectionDefinitions) {
process(connectorModule.getClassLoader(), connectionDefinition.getManagedConnectionFactoryClass(), connectionDefinition);
}
}
// administeredobject
if (connector.getResourceAdapter() != null) {
final List<AdminObject> raAdminObjects = connector.getResourceAdapter().getAdminObject();
for (final AdminObject raAdminObject : raAdminObjects) {
process(connectorModule.getClassLoader(), raAdminObject.getAdminObjectClass(), raAdminObject);
}
}
// activationspec
if (connector.getResourceAdapter() != null && connector.getResourceAdapter().getInboundResourceAdapter() != null && connector.getResourceAdapter().getInboundResourceAdapter().getMessageAdapter() != null) {
final List<MessageListener> messageListeners = connector.getResourceAdapter().getInboundResourceAdapter().getMessageAdapter().getMessageListener();
for (final MessageListener messageListener : messageListeners) {
final ActivationSpec activationSpec = messageListener.getActivationSpec();
process(connectorModule.getClassLoader(), activationSpec.getActivationSpecClass(), activationSpec);
}
}
return connectorModule;
}