use of org.apache.openejb.OpenEJBException in project tomee by apache.
the class OpenEJBArchiveProcessor method analyzeLibs.
private static CompositeArchive analyzeLibs(final ClassLoader parent, final List<URL> additionalPaths, final Map<URL, List<String>> earMap, final List<Archive> earLibsArchives, final CompositeBeans earBeans, final Map<ArchivePath, Node> jars, final Map<String, Object> altDD) {
final List<org.apache.xbean.finder.archive.Archive> archives = new ArrayList<>(jars.size());
for (final Map.Entry<ArchivePath, Node> node : jars.entrySet()) {
final Asset asset = node.getValue().getAsset();
if (ArchiveAsset.class.isInstance(asset)) {
final Archive<?> libArchive = ArchiveAsset.class.cast(asset).getArchive();
if (!isExcluded(libArchive.getName())) {
earLibsArchives.add(libArchive);
final List<Class<?>> earClasses = new ArrayList<>();
final List<String> earClassNames = new ArrayList<>();
final Map<ArchivePath, Node> content = libArchive.getContent(new IncludeRegExpPaths(".*.class"));
for (final Map.Entry<ArchivePath, Node> classNode : content.entrySet()) {
final String classname = name(classNode.getKey().get());
try {
earClasses.add(parent.loadClass(classname));
earClassNames.add(classname);
} catch (final ClassNotFoundException e) {
LOGGER.fine("Can't load class " + classname);
} catch (final NoClassDefFoundError ncdfe) {
// no-op
}
}
try {
// ends with !/META-INF/beans.xml to force it to be used as a cdi module *with bda*
final Node beansNode = libArchive.get(META_INF + BEANS_XML);
final URL arUrl = new URL("jar:file://!/lib/" + libArchive.getName() + (beansNode != null ? "!/META-INF/beans.xml" : ""));
if (beansNode != null) {
try {
DeploymentLoader.doMerge(arUrl, earBeans, ReadDescriptors.readBeans(beansNode.getAsset().openStream()));
} catch (final OpenEJBException e) {
throw new IllegalArgumentException(e);
}
}
earMap.put(arUrl, earClassNames);
} catch (final MalformedURLException e) {
// no-op
}
archives.add(new ClassesArchive(earClasses));
}
final Node ejbJarXml = libArchive.get(META_INF + EJB_JAR_XML);
if (ejbJarXml != null) {
// not super, we should merge them surely but ok for use cases we met until today
altDD.put("ejb-jar.xml", new AssetSource(ejbJarXml.getAsset(), null));
}
}
if (UrlAsset.class.isInstance(asset) || FileAsset.class.isInstance(asset)) {
try {
final URL url = UrlAsset.class.isInstance(asset) ? get(URL.class, "url", asset) : get(File.class, "file", asset).toURI().toURL();
final List<String> classes = new ArrayList<String>();
archives.add(new FilteredArchive(new JarArchive(parent, url), new WebappAggregatedArchive.ScanXmlSaverFilter(false, null, classes, null)));
additionalPaths.add(url);
final URLClassLoader loader = new URLClassLoader(new URL[] { url }, EMPTY_LOADER);
for (final String beans : asList("META-INF/beans.xml", "/META-INF/beans.xml")) {
final URL u = loader.getResource(beans);
if (u != null) {
try {
DeploymentLoader.doMerge(u, earBeans, ReadDescriptors.readBeans(u.openStream()));
} catch (final OpenEJBException e) {
throw new IllegalArgumentException(e);
} catch (final IOException e) {
// no-op
}
earMap.put(u, classes);
}
}
try {
loader.close();
} catch (final IOException e) {
// no-op
}
} catch (final MalformedURLException e) {
throw new IllegalArgumentException(e);
}
}
}
return new CompositeArchive(archives);
}
use of org.apache.openejb.OpenEJBException in project tomee by apache.
the class OpenEJBArchiveProcessor method createEjbJar.
private static EjbJar createEjbJar(final String prefix, final Archive<?> webArchive) {
final EjbJar webEjbJar;
final Node webEjbJarXml = webArchive.get(prefix.concat(EJB_JAR_XML));
if (webEjbJarXml != null) {
try {
webEjbJar = ReadDescriptors.readEjbJar(webEjbJarXml.getAsset().openStream());
} catch (final OpenEJBException e) {
throw new OpenEJBRuntimeException(e);
}
} else {
webEjbJar = new EjbJar();
}
return webEjbJar;
}
use of org.apache.openejb.OpenEJBException in project tomee by apache.
the class OpenEJBArchiveProcessor method finderArchive.
private static org.apache.xbean.finder.archive.Archive finderArchive(final Node beansXml, final Archive<?> archive, final ClassLoader cl, final CompositeArchive libs, final Map<URL, List<String>> webAppClassesByUrl, final CompositeBeans compositeBeans) {
final List<Class<?>> classes = new ArrayList<>();
final Map<ArchivePath, Node> content = archive.getContent(new IncludeRegExpPaths(".*.class"));
for (final Map.Entry<ArchivePath, Node> node : content.entrySet()) {
final String classname = name(node.getKey().get());
try {
classes.add(cl.loadClass(classname));
} catch (final ClassNotFoundException e) {
LOGGER.fine("Can't load class " + classname);
if (LOGGER.isLoggable(Level.FINEST)) {
e.printStackTrace(System.err);
}
} catch (final NoClassDefFoundError ncdfe) {
// no-op
}
}
final List<org.apache.xbean.finder.archive.Archive> archives = new ArrayList<>();
archives.add(new ClassesArchive(classes));
if (beansXml != null) {
try {
// no host avoid host resolution in hashcode()
final URL key = new URL("jar:file://!/WEB-INF/beans.xml");
try {
DeploymentLoader.doMerge(key, compositeBeans, ReadDescriptors.readBeans(beansXml.getAsset().openStream()));
} catch (final OpenEJBException e) {
throw new IllegalArgumentException(e);
}
final List<String> mainClasses = new ArrayList<>();
for (final Class<?> clazz : classes) {
mainClasses.add(clazz.getName());
}
webAppClassesByUrl.put(key, mainClasses);
} catch (final MalformedURLException mue) {
// no-op
}
}
if (libs != null) {
archives.add(libs);
}
return new SimpleWebappAggregatedArchive(cl, new CompositeArchive(archives), webAppClassesByUrl);
}
use of org.apache.openejb.OpenEJBException in project tomee by apache.
the class ConfigurationFactory method configureApplication.
/**
* embedded usage
*
* @param classLoader classloader
* @param id id supplied from embedded properties or null
* @param jarFiles list of ejb modules
* @return configured AppInfo
* @throws OpenEJBException on error
*/
public AppInfo configureApplication(final ClassLoader classLoader, final String id, final List<File> jarFiles) throws OpenEJBException {
final AppModule collection = loadApplication(classLoader, id, jarFiles);
final AppInfo appInfo;
try {
appInfo = configureApplication(collection);
} catch (final ValidationFailedException e) {
// DO not include the stacktrace in the message
logger.warning("configureApplication.loadFailed", collection.getModuleId(), e.getMessage());
throw e;
} catch (final OpenEJBException e) {
// DO NOT REMOVE THE EXCEPTION FROM THIS LOG MESSAGE
// removing this message causes NO messages to be printed when embedded
logger.warning("configureApplication.loadFailed", e, collection.getModuleId(), e.getMessage());
throw e;
}
return appInfo;
}
use of org.apache.openejb.OpenEJBException in project tomee by apache.
the class ConfigurationFactory method getServiceProvider.
private <T extends ServiceInfo> ServiceProvider getServiceProvider(final org.apache.openejb.config.Service service, final Class<? extends T> infoType) throws OpenEJBException {
final String providerType = getProviderType(service);
final ServiceProvider provider = resolveServiceProvider(service, infoType);
if (provider == null) {
final List<ServiceProvider> providers = ServiceUtils.getServiceProvidersByServiceType(providerType);
final StringBuilder sb = new StringBuilder();
final List<String> types = new ArrayList<String>();
for (final ServiceProvider p : providers) {
for (final String type : p.getTypes()) {
if (types.contains(type)) {
continue;
}
types.add(type);
sb.append(JavaSecurityManagers.getSystemProperty("line.separator"));
sb.append(" <").append(p.getService());
sb.append(" id=\"").append(service.getId()).append('"');
sb.append(" type=\"").append(type).append("\"/>");
}
}
final String noProviderMessage = messages.format("configureService.noProviderForService", providerType, service.getId(), service.getType(), service.getProvider(), sb.toString());
throw new NoSuchProviderException(noProviderMessage);
}
if (!provider.getService().equals(providerType)) {
throw new OpenEJBException(messages.format("configureService.wrongProviderType", service.getId(), providerType));
}
return provider;
}
Aggregations