if (infoType == null) throw new NullPointerException("type");
if (service == null) {
service = getDefaultService(infoType);
if (service == null){
throw new OpenEJBException(messages.format("configureService.noDefaultService", infoType.getName()));
}
}
String providerType = service.getClass().getSimpleName();
ServiceProvider provider = resolveServiceProvider(service, infoType);
if (provider == null){
List<ServiceProvider> providers = ServiceUtils.getServiceProvidersByServiceType(providerType);
StringBuilder sb = new StringBuilder();
// for (ServiceProvider p : providers) {
// sb.append(System.getProperty("line.separator"));
// sb.append(" <").append(p.getService());
// sb.append(" id=\"").append(service.getId()).append('"');
// sb.append(" provider=\"").append(p.getId()).append("\"/>");
// }
List<String> types = new ArrayList<String>();
for (ServiceProvider p : providers) {
for (String type : p.getTypes()) {
if (types.contains(type)) continue;
types.add(type);
sb.append(System.getProperty("line.separator"));
sb.append(" <").append(p.getService());
sb.append(" id=\"").append(service.getId()).append('"');
sb.append(" type=\"").append(type).append("\"/>");
}
}
String noProviderMessage = messages.format("configureService.noProviderForService", providerType, service.getId(), service.getType(), service.getProvider(), sb.toString());
throw new NoSuchProviderException(noProviderMessage);
}
if (service.getId() == null) service.setId(provider.getId());
logger.info("configureService.configuring", service.getId(), provider.getService(), provider.getId());
Properties props = new SuperProperties();
props.putAll(provider.getProperties());
props.putAll(service.getProperties());
props.putAll(getSystemProperties(service.getId(), provider.getService()));
if (providerType != null && !provider.getService().equals(providerType)) {
throw new OpenEJBException(messages.format("configureService.wrongProviderType", service.getId(), providerType));
}
T info;
try {
info = infoType.newInstance();
} catch (Exception e) {
throw new OpenEJBException(messages.format("configureService.cannotInstantiateClass", infoType.getName()), e);
}
info.service = provider.getService();
info.types.addAll(provider.getTypes());
info.description = provider.getDescription();
info.displayName = provider.getDisplayName();
info.className = provider.getClassName();
info.factoryMethod = provider.getFactoryName();
info.id = service.getId();
info.properties = props;
info.constructorArgs.addAll(parseConstructorArgs(provider));
specialProcessing(info);
return info;
} catch (NoSuchProviderException e) {
String message = logger.fatal("configureService.failed", e, service.getId());
throw new OpenEJBException(message + ": " + e.getMessage());
} catch (Throwable e) {
String message = logger.fatal("configureService.failed", e, service.getId());
throw new OpenEJBException(message, e);
}
}