blob: 964baf5abe791d145bc2e7d426e86740abec00f7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.openejb.cdi;
import org.apache.openejb.assembler.classic.BeansInfo;
import org.apache.openejb.loader.SystemInstance;
import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.spi.BeanArchiveService;
import org.apache.webbeans.xml.DefaultBeanArchiveInformation;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
public class OpenEJBBeanInfoService implements BeanArchiveService {
private Map<URL, BeanArchiveInformation> beanArchiveInfo = new HashMap<>();
public Map<URL, BeanArchiveInformation> getBeanArchiveInfo() {
return beanArchiveInfo;
}
public DefaultBeanArchiveInformation createBeanArchiveInformation(final BeansInfo.BDAInfo bda, final BeansInfo info, final ClassLoader loader) {
String mode = bda.discoveryMode == null? "ALL" : bda.discoveryMode;
if (info != null && info.version != null && !"1.0".equals(info.version) && info.discoveryMode == null) {
throw new WebBeansConfigurationException("beans.xml with version 1.1 and higher must declare a bean-discovery-mode!");
}
if ("ALL".equalsIgnoreCase(mode) && bda.trim) {
mode = "TRIM";
}
final DefaultBeanArchiveInformation information = new DefaultBeanArchiveInformation(bda.uri.toASCIIString());
information.setVersion(info == null ? "1.1" : info.version);
information.setBeanDiscoveryMode(BeanDiscoveryMode.valueOf(mode.trim().toUpperCase(Locale.ENGLISH)));
information.setDecorators(bda.decorators);
information.setInterceptors(bda.interceptors);
if (info != null) {
information.getAlternativeClasses().addAll(bda.alternatives);
information.getAlternativeStereotypes().addAll(bda.stereotypeAlternatives);
for (final BeansInfo.ExclusionEntryInfo exclusionInfo : info.excludes) {
boolean skip = false;
for (final String n : exclusionInfo.exclusion.availableClasses) {
if (!isClassAvailable(loader, n)) {
skip = true;
break;
}
}
if (!skip) {
for (final String n : exclusionInfo.exclusion.notAvailableClasses) {
if (isClassAvailable(loader, n)) {
skip = true;
break;
}
}
}
if (!skip) {
for (final String n : exclusionInfo.exclusion.systemPropertiesPresence) {
// our system instance is more powerful here
if (SystemInstance.get().getProperty(n) == null) {
skip = true;
break;
}
}
}
if (!skip) {
for (final String n : exclusionInfo.exclusion.systemProperties.stringPropertyNames()) {
// our system instance is more powerful here
if (!exclusionInfo.exclusion.systemProperties.getProperty(n).equals(SystemInstance.get().getProperty(n))) {
skip = true;
break;
}
}
}
if (skip) {
continue;
}
final String name = exclusionInfo.name;
if (name.endsWith(".*")) {
information.addClassExclude(name.substring(0, name.length() - 2));
}
else if (name.endsWith(".**")) {
information.addPackageExclude(name.substring(0, name.length() - 3));
}
else {
information.addClassExclude(name);
}
}
}
return information;
}
private static boolean isClassAvailable(final ClassLoader loader, final String name) {
try {
loader.loadClass(name);
return true;
} catch (final Throwable e) {
return false;
}
}
@Override
public BeanArchiveInformation getBeanArchiveInformation(final URL beanArchiveUrl) {
return beanArchiveInfo.get(beanArchiveUrl);
}
@Override
public Set<URL> getRegisteredBeanArchives() {
return Collections.emptySet(); // avoid to register twice decorators/interceptors/stereotypes/...
}
@Override
public void release() {
// no-op
}
}