Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/component/MarkedInjectionPoint.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,56 @@ +/** + * Licensed 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.aries.cdi.container.internal.component; + +import java.lang.annotation.Annotation; +import java.util.Set; + +import javax.enterprise.inject.spi.InjectionPoint; + +import org.apache.aries.cdi.container.internal.literal.CdiMarkLiteral; +import org.apache.aries.cdi.container.internal.util.Sets; +import org.jboss.weld.injection.ForwardingInjectionPoint; + +public class MarkedInjectionPoint extends ForwardingInjectionPoint { + + public MarkedInjectionPoint(InjectionPoint injectionPoint, Annotation annotation, int mark) { + _delegate = injectionPoint; + _mark = mark; + _qualifiers = Sets.hashSet(injectionPoint.getQualifiers(), annotation, CdiMarkLiteral.from(_mark)); + } + + @Override + protected InjectionPoint delegate() { + return _delegate; + } + + public InjectionPoint getDelegate() { + return _delegate; + } + + public int getMark() { + return _mark; + } + + @Override + public Set<Annotation> getQualifiers() { + return _qualifiers; + } + + private final InjectionPoint _delegate; + private final int _mark; + private final Set<Annotation> _qualifiers; + +} \ No newline at end of file
Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ConfigurationBean.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationBean.java Tue Sep 5 22:01:11 2017 @@ -12,16 +12,16 @@ * limitations under the License. */ -package org.apache.aries.cdi.container.internal.bean; +package org.apache.aries.cdi.container.internal.configuration; import static org.apache.aries.cdi.container.internal.util.Reflection.cast; import java.lang.annotation.Annotation; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.AbstractMap; import java.util.Collections; +import java.util.Dictionary; import java.util.List; -import java.util.Map; import java.util.Set; import javax.enterprise.context.Dependent; @@ -29,13 +29,11 @@ import javax.enterprise.context.spi.Crea import javax.enterprise.inject.spi.Bean; import javax.enterprise.inject.spi.Decorator; import javax.enterprise.inject.spi.InjectionPoint; -import javax.inject.Named; -import org.apache.aries.cdi.container.internal.container.ConfigurationDependency; -import org.apache.aries.cdi.container.internal.literal.AnyLiteral; -import org.apache.aries.cdi.container.internal.literal.DefaultLiteral; +import org.apache.aries.cdi.container.internal.component.ComponentModel; +import org.apache.aries.cdi.container.internal.component.ComponentProperties; +import org.apache.aries.cdi.container.internal.container.ContainerState; import org.apache.aries.cdi.container.internal.util.Conversions; -import org.apache.aries.cdi.container.internal.util.Sets; import org.jboss.weld.injection.CurrentInjectionPoint; import org.jboss.weld.injection.EmptyInjectionPoint; import org.jboss.weld.manager.BeanManagerImpl; @@ -44,34 +42,48 @@ import org.jboss.weld.util.Decorators; public class ConfigurationBean implements Bean<Object> { public ConfigurationBean( - ConfigurationDependency configurationDependency, BeanManagerImpl beanManagerImpl, Type injectionPointType, - Set<Annotation> qualifiers) { - - _configurationDependency = configurationDependency; + ContainerState containerState, + ConfigurationModel configurationModel, + ComponentModel componentModel, + InjectionPoint injectionPoint, + BeanManagerImpl beanManagerImpl) { + + _containerState = containerState; + _configurationModel = configurationModel; + _componentModel = componentModel; + _injectionPoint = injectionPoint; _beanManagerImpl = beanManagerImpl; - _typesForMatchingBeansToInjectionPoints = Sets.immutableHashSet(injectionPointType, Object.class); - _currentInjectionPoint = _beanManagerImpl.getServices().get(CurrentInjectionPoint.class); - _qualifiers = Sets.hashSet(qualifiers, DefaultLiteral.INSTANCE, AnyLiteral.INSTANCE); - - for (Annotation qualifier : _qualifiers) { - if (qualifier.annotationType().equals(Named.class)) { - _name = ((Named)qualifier).value(); - } + + Type type = _injectionPoint.getType(); + + if (type instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType)type; + + type = pt.getRawType(); } + + _beanClass = cast(type); } @Override public Object create(CreationalContext<Object> creationalContext) { - return create0(creationalContext); + Object instance = _getInjectedInstance(); + InjectionPoint ip = _getInjectionPoint(); + List<Decorator<?>> decorators = _getDecorators(ip); + if (decorators.isEmpty()) { + return instance; + } + return Decorators.getOuterDelegate( + this, instance, creationalContext, cast(_beanClass), ip, _beanManagerImpl, decorators); } @Override - public void destroy(Object arg0, CreationalContext<Object> arg1) { + public void destroy(Object instance, CreationalContext<Object> creationalContext) { } @Override public Class<?> getBeanClass() { - return _configurationDependency.getBeanClass(); + return _beanClass; } @Override @@ -81,12 +93,12 @@ public class ConfigurationBean implement @Override public String getName() { - return _name; + return null; } @Override public Set<Annotation> getQualifiers() { - return _qualifiers; + return _injectionPoint.getQualifiers(); } @Override @@ -101,7 +113,7 @@ public class ConfigurationBean implement @Override public Set<Type> getTypes() { - return _typesForMatchingBeansToInjectionPoints; + return Collections.singleton(_injectionPoint.getType()); } @Override @@ -116,46 +128,43 @@ public class ConfigurationBean implement @Override public String toString() { - return "ConfigurationBean[" + _currentInjectionPoint + "]"; - } - - protected <T> T create0(CreationalContext<T> creationalContext) { - Map<String, Object> map = new AbstractMap<String, Object>() { - - @Override - public Set<java.util.Map.Entry<String, Object>> entrySet() { - return _configurationDependency.getConfiguration().entrySet(); - } - - }; - - T instance = cast(Conversions.c().convert(map).to(_configurationDependency.getBeanClass())); - InjectionPoint ip = getInjectionPoint(_currentInjectionPoint); - if (ip == null) { - return instance; - } - List<Decorator<?>> decorators = getDecorators(ip); - if (decorators.isEmpty()) { - return instance; + if (_string == null) { + _string = "ConfigurationBean[" + _configurationModel + "]"; } - return Decorators.getOuterDelegate( - cast(this), instance, creationalContext, cast(getBeanClass()), ip, _beanManagerImpl, decorators); + + return _string; } - protected List<Decorator<?>> getDecorators(InjectionPoint ip) { + private List<Decorator<?>> _getDecorators(InjectionPoint ip) { return _beanManagerImpl.resolveDecorators(Collections.singleton(ip.getType()), getQualifiers()); } - protected InjectionPoint getInjectionPoint(CurrentInjectionPoint currentInjectionPoint) { + private Object _getInjectedInstance() { + Dictionary<String,?> dictionary = new ComponentProperties().bean( + _injectionPoint.getBean() + ).componentModel( + _componentModel + ).containerState( + _containerState + ).pid( + _configurationModel.getPid() + ).build(); + + return Conversions.convert(dictionary).to(_injectionPoint.getType()); + } + + private InjectionPoint _getInjectionPoint() { + CurrentInjectionPoint currentInjectionPoint = _beanManagerImpl.getServices().get(CurrentInjectionPoint.class); InjectionPoint ip = currentInjectionPoint.peek(); return EmptyInjectionPoint.INSTANCE.equals(ip) ? null : ip; } + private final Class<?> _beanClass; private final BeanManagerImpl _beanManagerImpl; - private final ConfigurationDependency _configurationDependency; - private final CurrentInjectionPoint _currentInjectionPoint; - private String _name; - private final Set<Annotation> _qualifiers; - private final Set<Type> _typesForMatchingBeansToInjectionPoints; + private final ComponentModel _componentModel; + private final ConfigurationModel _configurationModel; + private final ContainerState _containerState; + private final InjectionPoint _injectionPoint; + private String _string; } Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationCallback.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,186 @@ +/** + * Licensed 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.aries.cdi.container.internal.configuration; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Objects; +import java.util.Optional; +import java.util.function.Consumer; + +import org.osgi.service.cdi.annotations.ConfigurationPolicy; + +public class ConfigurationCallback { + + public static enum State {STARTED, ADDED, UPDATED, REMOVED} + + public static class Builder { + + public ConfigurationCallback build() { + //Objects.requireNonNull(_pid); + Objects.requireNonNull(_policy); + return new ConfigurationCallback(_pid, _policy, _onAdd, _onUpdate, _onRemove); + } + + public Builder onAdd(Consumer<ConfigurationCallback> onAdd) { + _onAdd = onAdd; + return this; + } + + public Builder onRemove(Consumer<ConfigurationCallback> onRemove) { + _onRemove = onRemove; + return this; + } + + public Builder onUpdate(Consumer<ConfigurationCallback> onUpdate) { + _onUpdate = onUpdate; + return this; + } + + public Builder pid(String pid) { + _pid = pid; + return this; + } + + public Builder policy(ConfigurationPolicy policy) { + _policy = policy; + return this; + } + + private String _pid; + private ConfigurationPolicy _policy; + private Consumer<ConfigurationCallback> _onAdd; + private Consumer<ConfigurationCallback> _onRemove; + private Consumer<ConfigurationCallback> _onUpdate; + + } + + private ConfigurationCallback( + String pid, + ConfigurationPolicy policy, + Consumer<ConfigurationCallback> onAdd, + Consumer<ConfigurationCallback> onUpdate, + Consumer<ConfigurationCallback> onRemove) { + + _pid = pid; + _policy = policy; + _onAdd = Optional.ofNullable(onAdd); + _onRemove = Optional.ofNullable(onRemove); + _onUpdate = Optional.ofNullable(onUpdate); + _state = State.STARTED; + } + + public void added(Dictionary<String, ?> properties) { + if (_policy == ConfigurationPolicy.IGNORE) return; + assertNotEmpty(properties); + switch (_state) { + case STARTED: + case REMOVED: + _properties = properties; + _state = State.ADDED; + _onAdd.ifPresent(f -> f.accept(this)); + break; + default: + throw new IllegalStateException(_state.toString()); + } + } + + @SuppressWarnings("incomplete-switch") + public void init() { + switch (_policy) { + case DEFAULT: + case IGNORE: + case OPTIONAL: + _onAdd.ifPresent(f -> f.accept(this)); + break; + } + } + + public ConfigurationPolicy policy() { + return _policy; + } + + public Dictionary<String, ?> properties() { + if (_policy == ConfigurationPolicy.IGNORE) return NULL_PROPERTIES; + return _properties; + } + + public void removed() { + if (_policy == ConfigurationPolicy.IGNORE) return; + switch (_state) { + case ADDED: + case UPDATED: + _properties = NULL_PROPERTIES; + _state = State.REMOVED; + _onRemove.ifPresent(f -> f.accept(this)); + break; + default: + throw new IllegalStateException(_state.toString()); + } + } + + public boolean resolved() { + if ((_policy == ConfigurationPolicy.REQUIRE) && (_properties == NULL_PROPERTIES)) { + return false; + } + + return true; + } + + public State state() { + return _state; + } + + @Override + public String toString() { + if (_string == null) { + _string = String.format("ConfigurationCallback[pid='%s', policy='%s', state='%s', properties='%s']", _pid, _policy, _state, properties()); + } + return _string; + } + + public void updated(Dictionary<String, ?> properties) { + if (_policy == ConfigurationPolicy.IGNORE) return; + assertNotEmpty(properties); + switch (_state) { + case ADDED: + case UPDATED: + _properties = properties; + _state = State.UPDATED; + _onUpdate.ifPresent(f -> f.accept(this)); + break; + default: + throw new IllegalStateException(_state.toString()); + } + } + + private static final void assertNotEmpty(Dictionary<String, ?> dictionary) { + if ((dictionary == null) || dictionary.isEmpty()) { + throw new IllegalArgumentException("Empty properties"); + } + } + + private static final Dictionary<String, ?> NULL_PROPERTIES = new Hashtable<>(); + + private final String _pid; + private final ConfigurationPolicy _policy; + private volatile Dictionary<String, ?> _properties = NULL_PROPERTIES; + private final Optional<Consumer<ConfigurationCallback>> _onAdd; + private final Optional<Consumer<ConfigurationCallback>> _onUpdate; + private final Optional<Consumer<ConfigurationCallback>> _onRemove; + private volatile State _state; + private volatile String _string; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationManagedService.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,63 @@ +/** + * Licensed 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.aries.cdi.container.internal.configuration; + +import java.util.Dictionary; + +import org.osgi.service.cm.ConfigurationException; +import org.osgi.service.cm.ManagedService; + +public class ConfigurationManagedService implements ManagedService { + + public ConfigurationManagedService(String pid, ConfigurationCallback callback) { + _pid = pid; + _callback = callback; + } + + @Override + public synchronized void updated(Dictionary<String, ?> properties) throws ConfigurationException { + if ((_properties == null) && (properties != null)) { + _properties = properties; + _callback.added(properties); + } + else if ((_properties != null) && (properties != null)) { + _properties = properties; + _callback.updated(properties); + } + else if ((_properties == null) && (properties == null)) { + // ignore this + } + else { + _properties = null; + _callback.removed(); + } + } + + @Override + public String toString() { + if (_string == null) { + _string = String.format( + "ConfigurationManagedService[%s, %s]", _pid, _callback.policy()); + } + + return _string; + } + + private final ConfigurationCallback _callback; + private final String _pid; + private volatile Dictionary<String, ?> _properties; + private volatile String _string; + +} \ No newline at end of file Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/configuration/ConfigurationModel.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,182 @@ +/** + * Licensed 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.aries.cdi.container.internal.configuration; + +import static org.apache.aries.cdi.container.internal.model.Model.*; +import static org.apache.aries.cdi.container.internal.model.Constants.CDI10_URI; +import static org.apache.aries.cdi.container.internal.model.Constants.CONFIGURATION_PID_ATTRIBUTE; +import static org.apache.aries.cdi.container.internal.model.Constants.CONFIGURATION_POLICY_ATTRIBUTE; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.enterprise.inject.spi.InjectionPoint; + +import org.osgi.service.cdi.annotations.Configuration; +import org.osgi.service.cdi.annotations.ConfigurationPolicy; +import org.xml.sax.Attributes; + +public class ConfigurationModel { + + public static class Builder { + + public Builder(Type type) { + Objects.requireNonNull(type); + _type = type; + } + + public Builder attributes(Attributes attributes) { + _policy = ConfigurationPolicy.get(getValue( + CDI10_URI, CONFIGURATION_POLICY_ATTRIBUTE, attributes, ConfigurationPolicy.DEFAULT.toString())); + _pid = getValues(CDI10_URI, CONFIGURATION_PID_ATTRIBUTE, attributes, new String[] {Configuration.NAME}); + return this; + } + + public ConfigurationModel build() { + _pid = ((_pid == null) || (_pid.length == 0))? new String[] {Configuration.NAME}: _pid; + + if (_policy == null) { + _policy = ConfigurationPolicy.OPTIONAL; + } + + return new ConfigurationModel(_type, _pid, _policy, _qualifiers); + } + + public Builder injectionPoint(InjectionPoint injectionPoint) { + _qualifiers = injectionPoint.getQualifiers(); + Configuration configuration = injectionPoint.getAnnotated().getAnnotation(Configuration.class); + if (configuration != null) { + _policy = configuration.configurationPolicy(); + _pid = configuration.value(); + } + return this; + } + + public Builder pid(String[] pid) { + _pid = pid; + return this; + } + + public Builder policy(ConfigurationPolicy policy) { + _policy = policy; + return this; + } + + public Builder qualifiers(Set<Annotation> qualifiers) { + _qualifiers = qualifiers; + return this; + } + + private String[] _pid; + private ConfigurationPolicy _policy; + private Set<Annotation> _qualifiers; + private Type _type; + + } + + private ConfigurationModel(Type type, String[] pids, ConfigurationPolicy policy, Set<Annotation> qualifiers) { + _type = type; + _pid = pids; + _policy = policy; + _qualifiers = new LinkedHashSet<>(); + if (qualifiers != null) { + _qualifiers.addAll(qualifiers); + } + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((_policy == null) ? 0 : _policy.hashCode()); + result = prime * result + ((_qualifiers == null) ? 0 : _qualifiers.hashCode()); + result = prime * result + ((_type == null) ? 0 : _type.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ConfigurationModel other = (ConfigurationModel) obj; + if (_policy != other._policy) + return false; + if (_qualifiers == null) { + if (other._qualifiers != null) + return false; + } else if (!_qualifiers.equals(other._qualifiers)) + return false; + if (_type == null) { + if (other._type != null) + return false; + } else if (!_type.equals(other._type)) + return false; + return true; + } + + public ConfigurationPolicy getConfigurationPolicy() { + return _policy; + } + + public boolean found() { + return _found.get(); + } + + public void found(boolean found) { + _found.set(found); + } + + public String[] getPid() { + return _pid; + } + + public Set<Annotation> getQualifiers() { + return _qualifiers; + } + + public Type getType() { + return _type; + } + + public void setQualifiers(Set<Annotation> qualifiers) { + _qualifiers.clear(); + _qualifiers.addAll(qualifiers); + } + + @Override + public String toString() { + if (_string == null) { + _string = String.format("configuration[type='%s', policy='%s', pid='%s']", _type, _policy, Arrays.toString(_pid)); + } + return _string; + } + + private final AtomicBoolean _found = new AtomicBoolean(); + private final String[] _pid; + private final ConfigurationPolicy _policy; + private final Set<Annotation> _qualifiers; + private volatile String _string; + private final Type _type; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,102 @@ +/** + * Licensed 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.aries.cdi.container.internal.container; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.enterprise.inject.spi.Extension; + +import org.apache.aries.cdi.container.internal.component.ComponentRuntimeExtension; +import org.apache.aries.cdi.container.internal.context.BundleContextExtension; +import org.apache.aries.cdi.container.internal.extension.ExtensionMetadata; +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.jboss.weld.bootstrap.WeldBootstrap; +import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; +import org.jboss.weld.bootstrap.spi.Deployment; +import org.jboss.weld.bootstrap.spi.Metadata; +import org.jboss.weld.manager.BeanManagerImpl; +import org.jboss.weld.util.ServiceLoader; + +public class ContainerBootstrap { + + public ContainerBootstrap( + ContainerState containerState, + Collection<Metadata<Extension>> externalExtensions) { + + _containerState = containerState; + _externalExtensions = externalExtensions; + + BeansModel beansModel = _containerState.beansModel(); + + List<Metadata<Extension>> extensions = new CopyOnWriteArrayList<>(); + + // Add the internal extensions + extensions.add( + new ExtensionMetadata( + new BundleContextExtension(_containerState.bundleContext()), + _containerState.id())); + extensions.add( + new ExtensionMetadata( + new ComponentRuntimeExtension(_containerState), + _containerState.id())); + + // Add extensions found from the bundle's classloader, such as those in the Bundle-ClassPath + for (Metadata<Extension> meta : ServiceLoader.load(Extension.class, _containerState.classLoader())) { + extensions.add(meta); + } + + // Add external extensions + for (Metadata<Extension> meta : _externalExtensions) { + extensions.add(meta); + } + + BeanDeploymentArchive beanDeploymentArchive = new ContainerDeploymentArchive( + _containerState.loader(), _containerState.id(), beansModel.getBeanClassNames(), + beansModel.getBeansXml()); + + Deployment deployment = new ContainerDeployment(extensions, beanDeploymentArchive); + + _bootstrap = new WeldBootstrap(); + + _bootstrap.startExtensions(extensions); + _bootstrap.startContainer(_containerState.id(), new ContainerEnvironment(), deployment); + + _beanManagerImpl = _bootstrap.getManager(beanDeploymentArchive); + _containerState.setBeanManager(_beanManagerImpl); + + _bootstrap.startInitialization(); + _bootstrap.deployBeans(); + } + + public BeanManagerImpl getBeanManagerImpl() { + return _beanManagerImpl; + } + + public WeldBootstrap getBootstrap() { + return _bootstrap; + } + + public void shutdown() { + _bootstrap.shutdown(); + } + + private final BeanManagerImpl _beanManagerImpl; + private final WeldBootstrap _bootstrap; + private final ContainerState _containerState; + private final Collection<Metadata<Extension>> _externalExtensions; + +} \ No newline at end of file Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeployment.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeployment.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeployment.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeployment.java Tue Sep 5 22:01:11 2017 @@ -24,9 +24,9 @@ import org.jboss.weld.bootstrap.spi.Bean import org.jboss.weld.bootstrap.spi.CDI11Deployment; import org.jboss.weld.bootstrap.spi.Metadata; -public class BundleDeployment implements CDI11Deployment { +public class ContainerDeployment implements CDI11Deployment { - public BundleDeployment(Iterable<Metadata<Extension>> extensions, BeanDeploymentArchive beanDeploymentArchive) { + public ContainerDeployment(Iterable<Metadata<Extension>> extensions, BeanDeploymentArchive beanDeploymentArchive) { _extensions = extensions; _beanDeploymentArchive = beanDeploymentArchive; Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/BundleDeploymentArchive.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDeploymentArchive.java Tue Sep 5 22:01:11 2017 @@ -17,7 +17,6 @@ package org.apache.aries.cdi.container.i import java.util.Collection; import java.util.Collections; -import org.apache.aries.cdi.container.internal.loader.BundleResourcesLoader; import org.jboss.weld.bootstrap.api.ServiceRegistry; import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry; import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; @@ -25,14 +24,12 @@ import org.jboss.weld.bootstrap.spi.Bean import org.jboss.weld.ejb.spi.EjbDescriptor; import org.jboss.weld.resources.spi.ResourceLoader; import org.jboss.weld.serialization.spi.ProxyServices; -import org.osgi.framework.Bundle; -import org.osgi.framework.wiring.BundleWiring; -public class BundleDeploymentArchive implements BeanDeploymentArchive { +public class ContainerDeploymentArchive + implements BeanDeploymentArchive { - public BundleDeploymentArchive( - BundleWiring bundleWiring, String id, Collection<String> beanClassNames, BeansXml beansXml, - Bundle extenderBundle) { + public <T extends ResourceLoader & ProxyServices> ContainerDeploymentArchive( + T loader, String id, Collection<String> beanClassNames, BeansXml beansXml) { _id = id; _beanClassNames = beanClassNames; @@ -41,10 +38,10 @@ public class BundleDeploymentArchive imp _ejbs = Collections.emptyList(); _services = new SimpleServiceRegistry(); - BundleResourcesLoader loader = new BundleResourcesLoader(bundleWiring, extenderBundle); - - _services.add(ResourceLoader.class, loader); - _services.add(ProxyServices.class, loader); + if (loader != null) { + _services.add(ResourceLoader.class, loader); + _services.add(ProxyServices.class, loader); + } } @Override Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerDiscovery.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,98 @@ +/** + * Licensed 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.aries.cdi.container.internal.container; + +import java.util.Collections; +import java.util.List; + +import javax.enterprise.inject.spi.DefinitionException; +import javax.enterprise.inject.spi.Extension; + +import org.apache.aries.cdi.container.internal.component.ComponentDiscoveryExtension; +import org.apache.aries.cdi.container.internal.extension.ExtensionMetadata; +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.jboss.weld.bootstrap.WeldBootstrap; +import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; +import org.jboss.weld.bootstrap.spi.Deployment; +import org.jboss.weld.bootstrap.spi.Metadata; + +public class ContainerDiscovery { + + public static void discover(ContainerState containerState) { + String id = containerState.id() + "-discovery"; + + BeansModel beansModel = containerState.beansModel(); + + BeanDeploymentArchive beanDeploymentArchive = new ContainerDeploymentArchive( + containerState.loader(), id, beansModel.getBeanClassNames(), + beansModel.getBeansXml()); + + ExtensionMetadata extension = new ExtensionMetadata( + new ComponentDiscoveryExtension(beansModel), id); + + List<Metadata<Extension>> extensions = Collections.singletonList(extension); + + Deployment deployment = new ContainerDeployment( + Collections.singletonList(extension), beanDeploymentArchive); + + WeldBootstrap _bootstrap = new WeldBootstrap(); + + _bootstrap.startExtensions(extensions); + _bootstrap.startContainer(id, new ContainerEnvironment(), deployment); + _bootstrap.startInitialization(); + _bootstrap.deployBeans(); + //_bootstrap.validateBeans(); + //_bootstrap.endInitialization(); + _bootstrap.shutdown(); + + validate(containerState); + } + + private static void validate(ContainerState containerState) { + containerState.beansModel().getComponentModels().stream().forEach( + componentModel -> { + if (!componentModel.found()) { + throw new DefinitionException( + String.format( + "Did not find bean for <component> description %s", + componentModel)); + } + + componentModel.getReferences().stream().forEach( + referenceModel -> { + if (!referenceModel.found()) { + throw new DefinitionException( + String.format( + "Did not find injection point for <reference> description %s", + referenceModel)); + } + } + ); + + componentModel.getConfigurations().stream().forEach( + configurationModel -> { + if (!configurationModel.found()) { + throw new DefinitionException( + String.format( + "Did not find injection point for <configuration> description %s", + configurationModel)); + } + } + ); + } + ); + } + +} \ No newline at end of file Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/SimpleEnvironment.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerEnvironment.java Tue Sep 5 22:01:11 2017 @@ -20,9 +20,9 @@ import java.util.Set; import org.jboss.weld.bootstrap.api.Environment; import org.jboss.weld.bootstrap.api.Service; -public class SimpleEnvironment implements Environment { +public class ContainerEnvironment implements Environment { - public SimpleEnvironment() { + public ContainerEnvironment() { _requiredBeanDeploymentArchiveServices = new HashSet<Class<? extends Service>>(); _requiredDeploymentServices = new HashSet<Class<? extends Service>>(); } Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,339 @@ +/** + * Licensed 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.aries.cdi.container.internal.container; + +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +import javax.enterprise.inject.Any; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.ObserverMethod; +import javax.enterprise.util.AnnotationLiteral; + +import org.apache.aries.cdi.container.internal.component.ComponentModel; +import org.apache.aries.cdi.container.internal.configuration.ConfigurationCallback; +import org.apache.aries.cdi.container.internal.extension.ExtensionDependency; +import org.apache.aries.cdi.container.internal.loader.BundleClassLoader; +import org.apache.aries.cdi.container.internal.loader.BundleResourcesLoader; +import org.apache.aries.cdi.container.internal.model.BeansModel; +import org.apache.aries.cdi.container.internal.model.Context; +import org.apache.aries.cdi.container.internal.model.Registrator; +import org.apache.aries.cdi.container.internal.model.Tracker; +import org.apache.aries.cdi.container.internal.reference.ReferenceCallback; +import org.apache.aries.cdi.container.internal.service.ServiceDeclaration; +import org.jboss.weld.manager.BeanManagerImpl; +import org.jboss.weld.resources.spi.ResourceLoader; +import org.jboss.weld.serialization.spi.ProxyServices; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Filter; +import org.osgi.framework.InvalidSyntaxException; +import org.osgi.framework.ServiceObjects; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.ServiceRegistration; +import org.osgi.framework.wiring.BundleWiring; +import org.osgi.service.cdi.CdiConstants; +import org.osgi.service.cdi.CdiContainer; +import org.osgi.service.cdi.CdiEvent; +import org.osgi.service.cdi.CdiEvent.Type; +import org.osgi.service.cdi.annotations.ServiceEvent; +import org.osgi.service.cm.ManagedService; +import org.osgi.util.tracker.ServiceTracker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ContainerState implements CdiContainer { + + public static final AnnotationLiteral<Any> ANY = new AnnotationLiteral<Any>() { + private static final long serialVersionUID = 1L; + }; + + public ContainerState( + Bundle bundle, Bundle extenderBundle) { + + _bundle = Optional.ofNullable(bundle); + _extenderBundle = extenderBundle; + + Hashtable<String, Object> properties = new Hashtable<>(); + + properties.put(CdiConstants.CDI_CONTAINER_STATE, CdiEvent.Type.CREATING); + + _bundle.ifPresent( + b -> { + _classLoader = new BundleClassLoader( + BundleResourcesLoader.getBundles(bundle, extenderBundle)); + _registration = b.getBundleContext().registerService(CdiContainer.class, this, properties); + } + ); + + _context = new Context() { + + @Override + public <T> T getService(ServiceReference<T> reference) { + return bundleContext().getService(reference); + } + + @Override + public <T> ServiceObjects<T> getServiceObjects(ServiceReference<T> reference) { + return bundleContext().getServiceObjects(reference); + } + + @Override + public <T> boolean ungetService(ServiceReference<T> reference) { + return bundleContext().ungetService(reference); + } + + }; + + _msRegistrator = new Registrator<ManagedService>() { + + public void registerService(String[] classNames, ManagedService service, Dictionary<String, ?> properties) { + registrations.add(bundleContext().registerService(ManagedService.class, service, properties)); + } + + }; + + _bmRegistrator = new Registrator<BeanManager>() { + + @Override + public void registerService(String[] classNames, BeanManager service, Dictionary<String, ?> properties) { + registrations.add(bundleContext().registerService(BeanManager.class, service, properties)); + } + + }; + + _serviceRegistrator = new Registrator<Object>() { + + @Override + public void registerService(String[] classNames, Object service, Dictionary<String, ?> properties) { + registrations.add(bundleContext().registerService(classNames, service, properties)); + } + + }; + + _tracker = new Tracker() { + + @Override + public <T> void track(String targetFilter, ReferenceCallback callback) { + try { + Filter filter = bundleContext().createFilter(targetFilter); + + trackers.add(new ServiceTracker<>(bundleContext(), filter, callback)); + } + catch (InvalidSyntaxException ise) { + if (_log.isErrorEnabled()) { + _log.error("CDIe - Invalid filter syntax in {}", targetFilter, ise); + } + } + } + + }; + } + + public Registrator<BeanManager> beanManagerRegistrator() { + return _bmRegistrator; + } + + public BeansModel beansModel() { + return _beansModel; + } + + public Bundle bundle() { + return _bundle.orElse(null); + } + + public ClassLoader bundleClassLoader() { + return _bundle.map(b -> b.adapt(BundleWiring.class).getClassLoader()).orElse(getClass().getClassLoader()); + } + + public BundleContext bundleContext() { + return _bundle.map(b -> b.getBundleContext()).orElse(null); + } + + public ClassLoader classLoader() { + return _bundle.map(b -> _classLoader).orElse(getClass().getClassLoader()); + } + + public synchronized void close() { + try { + if (_registration != null) { + _registration.unregister(); + } + } + catch (Exception e) { + if (_log.isTraceEnabled()) { + _log.trace("Service already unregistered {}", _registration); + } + } + } + + public Map<ComponentModel, Map<String, ConfigurationCallback>> configurationCallbacks() { + return _configurationCallbacksMap; + } + + public Context context() { + return _context; + } + + public Bundle extenderBundle() { + return _extenderBundle; + } + + public List<ExtensionDependency> extensionDependencies() { + return _extensionDependencies; + } + + public synchronized void fire(CdiEvent event) { + Type type = event.getType(); + + if ((_lastState == CdiEvent.Type.DESTROYING) && + ((type == CdiEvent.Type.WAITING_FOR_CONFIGURATIONS) || + (type == CdiEvent.Type.WAITING_FOR_EXTENSIONS) || + (type == CdiEvent.Type.WAITING_FOR_SERVICES))) { + + return; + } + + if (_log.isErrorEnabled() && (event.getCause() != null)) { + _log.error("CDIe - Event {}", event, event.getCause()); + } + else if (_log.isDebugEnabled()) { + _log.debug("CDIe - Event {}", event); + } + + updateState(event); + + if (_beanManagerImpl != null) { + _beanManagerImpl.fireEvent(event); + } + } + + public void fire(CdiEvent.Type state) { + fire(new CdiEvent(state, _bundle.orElse(null), _extenderBundle)); + } + + public void fire(CdiEvent.Type state, String payload) { + fire(new CdiEvent(state, _bundle.orElse(null), _extenderBundle, payload, null)); + } + + public void fire(CdiEvent.Type state, Throwable cause) { + fire(new CdiEvent(state, _bundle.orElse(null), _extenderBundle, null, cause)); + } + + @Override + public BeanManagerImpl getBeanManager() { + return _beanManagerImpl; + } + + public String id() { + return _bundle.map(b -> b.getSymbolicName() + ":" + b.getBundleId()).orElse("null"); + } + + public CdiEvent.Type lastState() { + return _lastState; + } + + @SuppressWarnings("unchecked") + public <T extends ResourceLoader & ProxyServices> T loader() { + return (T)_bundle.map(b -> new BundleResourcesLoader(b, _extenderBundle)).orElse(null); + } + + public Registrator<ManagedService> managedServiceRegistrator() { + return _msRegistrator; + } + + public Map<ComponentModel, Map<String, ReferenceCallback>> referenceCallbacks() { + return _referenceCallbacksMap; + } + + public Map<ComponentModel, Map<String, ObserverMethod<ServiceEvent<?>>>> referenceObservers() { + return _referenceObserversMap; + } + + public Map<ComponentModel, ServiceDeclaration> serviceComponents() { + return _serviceComponents; + } + + public Registrator<Object> serviceRegistrator() { + return _serviceRegistrator; + } + + public void setBeanManager(BeanManagerImpl beanManagerImpl) { + _beanManagerImpl = beanManagerImpl; + } + + public void setBeansModel(BeansModel beansModel) { + _beansModel = beansModel; + } + + public void setExtensionDependencies(List<ExtensionDependency> extensionDependencies) { + _extensionDependencies = extensionDependencies; + } + + public Tracker tracker() { + return _tracker; + } + + private synchronized void updateState(CdiEvent event) { + Type type = event.getType(); + + _lastState = type; + + if (_registration == null) { + return; + } + + ServiceReference<CdiContainer> reference = _registration.getReference(); + + if (type == reference.getProperty(CdiConstants.CDI_CONTAINER_STATE)) { + return; + } + + Hashtable<String, Object> properties = new Hashtable<>(); + + for (String key : reference.getPropertyKeys()) { + properties.put(key, reference.getProperty(key)); + } + + properties.put(CdiConstants.CDI_CONTAINER_STATE, type); + + _registration.setProperties(properties); + } + + private static final Logger _log = LoggerFactory.getLogger(ContainerState.class); + + private volatile BeanManagerImpl _beanManagerImpl; + private BeansModel _beansModel; + private final Registrator<BeanManager> _bmRegistrator; + private final Optional<Bundle> _bundle; + private ClassLoader _classLoader; + private final Map<ComponentModel, Map<String, ConfigurationCallback>> _configurationCallbacksMap = new ConcurrentHashMap<>(); + private final Context _context; + private final Bundle _extenderBundle; + private List<ExtensionDependency> _extensionDependencies; + private CdiEvent.Type _lastState = CdiEvent.Type.CREATING; + private final Registrator<ManagedService> _msRegistrator; + private final Map<ComponentModel, Map<String, ReferenceCallback>> _referenceCallbacksMap = new ConcurrentHashMap<>(); + private final Map<ComponentModel, Map<String, ObserverMethod<ServiceEvent<?>>>> _referenceObserversMap = new ConcurrentHashMap<>(); + private ServiceRegistration<CdiContainer> _registration; + private final Map<ComponentModel, ServiceDeclaration> _serviceComponents = new ConcurrentHashMap<>(); + private final Registrator<Object> _serviceRegistrator; + private final Tracker _tracker; + +} \ No newline at end of file Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/BundleContextBean.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextBean.java Tue Sep 5 22:01:11 2017 @@ -12,7 +12,7 @@ * limitations under the License. */ -package org.apache.aries.cdi.container.internal.bean; +package org.apache.aries.cdi.container.internal.context; import java.lang.annotation.Annotation; import java.lang.reflect.Type; @@ -91,7 +91,11 @@ public class BundleContextBean implement @Override public String toString() { - return "BundleContextBean[bundleContext]"; + if (_string == null) { + _string = String.format("BundleContext[%s]", _bundleContext); + } + + return _string; } private static final Set<Annotation> DEFAULT_QUALIFIERS = Sets.hashSet( @@ -99,5 +103,6 @@ public class BundleContextBean implement private static final Set<Type> TYPES = Sets.immutableHashSet(BundleContext.class, Object.class); private final BundleContext _bundleContext; + private volatile String _string; } \ No newline at end of file Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/context/BundleContextExtension.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,47 @@ +/** + * Licensed 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.aries.cdi.container.internal.context; + +import javax.enterprise.event.Observes; +import javax.enterprise.inject.spi.AfterBeanDiscovery; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.Extension; + +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class BundleContextExtension implements Extension { + + public BundleContextExtension(BundleContext bundleContext) { + _bundleContext = bundleContext; + } + + void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager manager) { + if (_log.isDebugEnabled()) { + _log.debug("CDIe - Adding BundleContext {}", _bundleContext); + } + + abd.addBean(new BundleContextBean(_bundleContext)); + + if (_log.isDebugEnabled()) { + _log.debug("CDIe - BundleContext added {}", _bundleContext); + } + } + + private static final Logger _log = LoggerFactory.getLogger(BundleContextExtension.class); + + private final BundleContext _bundleContext; +} Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionDependency.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionDependency.java Tue Sep 5 22:01:11 2017 @@ -12,7 +12,7 @@ * limitations under the License. */ -package org.apache.aries.cdi.container.internal.container; +package org.apache.aries.cdi.container.internal.extension; import javax.enterprise.inject.spi.Extension; Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionMetadata.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/extension/ExtensionMetadata.java Tue Sep 5 22:01:11 2017 @@ -12,7 +12,7 @@ * limitations under the License. */ -package org.apache.aries.cdi.container.internal.container; +package org.apache.aries.cdi.container.internal.extension; import javax.enterprise.inject.spi.Extension; Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CdiContainerService.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMark.java Tue Sep 5 22:01:11 2017 @@ -12,23 +12,20 @@ * limitations under the License. */ -package org.apache.aries.cdi.container.internal.container; +package org.apache.aries.cdi.container.internal.literal; -import javax.enterprise.inject.spi.BeanManager; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; -import org.osgi.service.cdi.CdiContainer; +import javax.inject.Qualifier; -public class CdiContainerService implements CdiContainer { +@Qualifier +@Target(value = {ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE}) +@Retention(value = RetentionPolicy.RUNTIME) +public @interface CdiMark { - @Override - public BeanManager getBeanManager() { - return _beanManager; - } + int value(); - public void setBeanManager(BeanManager beanManager) { - _beanManager = beanManager; - } - - private volatile BeanManager _beanManager; - -} \ No newline at end of file +} Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/Entry.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/CdiMarkLiteral.java Tue Sep 5 22:01:11 2017 @@ -12,18 +12,27 @@ * limitations under the License. */ -package org.apache.aries.cdi.container.internal.container; +package org.apache.aries.cdi.container.internal.literal; -import java.util.AbstractMap.SimpleImmutableEntry; +import javax.enterprise.util.AnnotationLiteral; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.cm.ManagedService; - -class Entry extends SimpleImmutableEntry<ConfigurationManagedService, ServiceRegistration<ManagedService>> { +public class CdiMarkLiteral extends AnnotationLiteral<CdiMark> implements CdiMark { private static final long serialVersionUID = 1L; - public Entry(ConfigurationManagedService key, ServiceRegistration<ManagedService> value) { - super(key, value); + public static CdiMark from(int i) { + return new CdiMarkLiteral(i); + } + + public CdiMarkLiteral(int i) { + _value = i; } -} \ No newline at end of file + + @Override + public int value() { + return _value; + } + + private final int _value; + +} Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ComponentLiteral.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,79 @@ +/** + * Licensed 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.aries.cdi.container.internal.literal; + +import javax.enterprise.util.AnnotationLiteral; + +import org.apache.aries.cdi.container.internal.util.Strings; +import org.osgi.service.cdi.annotations.Component; +import org.osgi.service.cdi.annotations.ServiceScope; + +public class ComponentLiteral extends AnnotationLiteral<Component> implements Component { + + private static final long serialVersionUID = 1L; + + /** + * @param name the name of the component bean + * @return a literal instance of {@link Component} + */ + public static ComponentLiteral from(String name) { + return new ComponentLiteral(name, new Class<?>[0], Strings.EMPTY_ARRAY, ServiceScope.DEFAULT); + } + + /** + * @param name the name of the component bean + * @param types an array of types under which to publish the service + * @param properties the set of properties for the service + * @return a literal instance of {@link Component} + */ + public static ComponentLiteral from(String name, Class<?>[] types, String[] properties, ServiceScope scope) { + return new ComponentLiteral(name, types, properties, scope); + } + + public ComponentLiteral( + String name, Class<?>[] types, String[] properties, ServiceScope scope) { + + _name = name; + _types = types; + _properties = properties; + _scope = scope; + } + + @Override + public Class<?>[] service() { + return _types; + } + + @Override + public String[] property() { + return _properties; + } + + @Override + public String name() { + return _name; + } + + @Override + public ServiceScope serviceScope() { + return _scope; + } + + private final String _name; + private final String[] _properties; + private final ServiceScope _scope; + private final Class<?>[] _types; + +} Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ConfigurationLiteral.java Tue Sep 5 22:01:11 2017 @@ -17,29 +17,21 @@ package org.apache.aries.cdi.container.i import javax.enterprise.util.AnnotationLiteral; import org.osgi.service.cdi.annotations.Configuration; +import org.osgi.service.cdi.annotations.ConfigurationPolicy; public class ConfigurationLiteral extends AnnotationLiteral<Configuration> implements Configuration { - private static final long serialVersionUID = 1L; - - /** - * @param pids an array of configuration pids - * @return a literal instance of {@link Configuration} - */ - public static ConfigurationLiteral from(String[] pids) { - return new ConfigurationLiteral(pids); - } + public static final Configuration INSTANCE = new ConfigurationLiteral( + new String[] {Configuration.NAME}, ConfigurationPolicy.OPTIONAL); - /** - * @param pids an array of configuration pids - */ - public ConfigurationLiteral(String[] pids) { + public ConfigurationLiteral(String[] pids, ConfigurationPolicy configurationPolicy) { _pids = pids; + _configurationPolicy = configurationPolicy; } @Override - public boolean required() { - return true; + public ConfigurationPolicy configurationPolicy() { + return _configurationPolicy; } @Override @@ -47,6 +39,9 @@ public class ConfigurationLiteral extend return _pids; } + private static final long serialVersionUID = 1L; + + private final ConfigurationPolicy _configurationPolicy; private final String[] _pids; } Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/literal/ReferenceLiteral.java Tue Sep 5 22:01:11 2017 @@ -14,9 +14,14 @@ package org.apache.aries.cdi.container.internal.literal; +import java.util.Objects; + import javax.enterprise.util.AnnotationLiteral; import org.osgi.service.cdi.annotations.Reference; +import org.osgi.service.cdi.annotations.ReferenceCardinality; +import org.osgi.service.cdi.annotations.ReferencePolicy; +import org.osgi.service.cdi.annotations.ReferencePolicyOption; import org.osgi.service.cdi.annotations.ReferenceScope; public class ReferenceLiteral extends AnnotationLiteral<Reference> implements Reference { @@ -32,24 +37,79 @@ public class ReferenceLiteral extends An } public ReferenceLiteral(String target) { + this( + _blank, + Object.class, + ReferenceCardinality.DEFAULT, + ReferencePolicy.DEFAULT, + ReferencePolicyOption.DEFAULT, + ReferenceScope.DEFAULT, + target); + } + + public ReferenceLiteral( + String name, + Class<?> service, + ReferenceCardinality cardinality, + ReferencePolicy policy, + ReferencePolicyOption option, + ReferenceScope scope, + String target) { + + Objects.requireNonNull(target); + + _name = name; + _service = service; + _cardinality = cardinality; + _policy = policy; + _option = option; + _scope = scope; _target = target; } @Override - public ReferenceScope scope() { - return ReferenceScope.BUNDLE; + public ReferenceCardinality cardinality() { + return _cardinality; } @Override - public String target() { - return _target; + public String name() { + return _name; + } + + @Override + public ReferencePolicy policy() { + return _policy; + } + + @Override + public ReferencePolicyOption policyOption() { + return _option; + } + + @Override + public ReferenceScope scope() { + return _scope; } @Override public Class<?> service() { - return Object.class; + return _service; } + @Override + public String target() { + return _target; + } + + private final static String _blank = ""; + + private final ReferenceCardinality _cardinality; + private final String _name; + private final ReferencePolicyOption _option; + private final ReferencePolicy _policy; + private final ReferenceScope _scope; + private final Class<?> _service; private final String _target; -} +} \ No newline at end of file Copied: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java (from r1806482, aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java) URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java?p2=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java&p1=aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java&r1=1806482&r2=1807424&rev=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/AbstractLoader.java Tue Sep 5 22:01:11 2017 @@ -16,48 +16,17 @@ package org.apache.aries.cdi.container.i import java.io.IOException; import java.net.URL; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.List; -import java.util.Map; import org.jboss.weld.resources.spi.ResourceLoader; import org.jboss.weld.resources.spi.ResourceLoadingException; import org.jboss.weld.serialization.spi.ProxyServices; -import org.osgi.framework.Bundle; -import org.osgi.framework.namespace.PackageNamespace; -import org.osgi.framework.wiring.BundleCapability; -import org.osgi.framework.wiring.BundleWire; -import org.osgi.framework.wiring.BundleWiring; -public class BundleResourcesLoader implements ProxyServices, ResourceLoader { +public class AbstractLoader implements ProxyServices, ResourceLoader { - public BundleResourcesLoader(BundleWiring bundleWiring, Bundle extenderBundle) { - BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class); - - List<Bundle> bundles = new ArrayList<>(); - - bundles.add(bundleWiring.getBundle()); - bundles.add(extenderBundle); - - List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE); - - for (BundleWire bundleWire : requiredWires) { - BundleCapability capability = bundleWire.getCapability(); - Map<String, Object> attributes = capability.getAttributes(); - String packageName = (String)attributes.get(PackageNamespace.PACKAGE_NAMESPACE); - if (!packageName.startsWith("org.jboss.weld.")) { - continue; - } - - Bundle wireBundle = bundleWire.getProvider().getBundle(); - if (!bundles.contains(wireBundle)) { - bundles.add(wireBundle); - } - } - - _classLoader = new BundleClassLoader(bundles.toArray(new Bundle[0])); + public AbstractLoader(ClassLoader classLoader) { + _classLoader = classLoader; } @Override Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java Tue Sep 5 22:01:11 2017 @@ -26,7 +26,7 @@ import org.osgi.framework.Bundle; public class BundleClassLoader extends URLClassLoader { - public BundleClassLoader(Bundle... bundles) { + public BundleClassLoader(Bundle[] bundles) { super(new URL[0]); if (bundles.length == 0) { @@ -83,41 +83,43 @@ public class BundleClassLoader extends U @Override protected Class<?> findClass(String name) throws ClassNotFoundException { - for (Bundle bundle : _bundles) { - try { - return bundle.loadClass(name); - } - catch (ClassNotFoundException cnfe) { - continue; + Object classLoadingLock = getClassLoadingLock(name); + + synchronized (classLoadingLock) { + for (Bundle bundle : _bundles) { + try { + return bundle.loadClass(name); + } + catch (ClassNotFoundException cnfe) { + continue; + } } - } - throw new ClassNotFoundException(name); + throw new ClassNotFoundException(name); + } } @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { - Class<?> clazz = _cache.get(name); + Object classLoadingLock = getClassLoadingLock(name); + + synchronized (classLoadingLock) { + Class<?> clazz = _cache.get(name); - if (clazz == null) { - synchronized (this) { + if (clazz == null) { clazz = findClass(name); if (resolve) { resolveClass(clazz); } - Class<?> existing = _cache.putIfAbsent(name, clazz); - - if (existing != null) { - clazz = existing; - } + _cache.put(name, clazz); } - } - return clazz; + return clazz; + } } private final Bundle[] _bundles; Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleResourcesLoader.java Tue Sep 5 22:01:11 2017 @@ -33,12 +33,12 @@ import org.osgi.framework.wiring.BundleW public class BundleResourcesLoader implements ProxyServices, ResourceLoader { - public BundleResourcesLoader(BundleWiring bundleWiring, Bundle extenderBundle) { + public BundleResourcesLoader(Bundle bundle, Bundle extenderBundle) { BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class); List<Bundle> bundles = new ArrayList<>(); - bundles.add(bundleWiring.getBundle()); + bundles.add(bundle); bundles.add(extenderBundle); List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE); @@ -60,6 +60,7 @@ public class BundleResourcesLoader imple _classLoader = new BundleClassLoader(bundles.toArray(new Bundle[0])); } + @Override public void cleanup() { } @@ -109,4 +110,30 @@ public class BundleResourcesLoader imple private final ClassLoader _classLoader; + public static Bundle[] getBundles(Bundle bundle, Bundle extenderBundle) { + List<Bundle> bundles = new ArrayList<>(); + + bundles.add(bundle); + bundles.add(extenderBundle); + + BundleWiring extenderWiring = extenderBundle.adapt(BundleWiring.class); + + List<BundleWire> requiredWires = extenderWiring.getRequiredWires(PackageNamespace.PACKAGE_NAMESPACE); + + for (BundleWire bundleWire : requiredWires) { + BundleCapability capability = bundleWire.getCapability(); + Map<String, Object> attributes = capability.getAttributes(); + String packageName = (String)attributes.get(PackageNamespace.PACKAGE_NAMESPACE); + if (!packageName.startsWith("org.jboss.weld.")) { + continue; + } + + Bundle wireBundle = bundleWire.getProvider().getBundle(); + if (!bundles.contains(wireBundle)) { + bundles.add(wireBundle); + } + } + + return bundles.toArray(new Bundle[0]); + } } Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/AbstractModelBuilder.java Tue Sep 5 22:01:11 2017 @@ -30,6 +30,8 @@ import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.aries.cdi.container.internal.util.Throw; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; @@ -37,6 +39,10 @@ import org.xml.sax.SAXNotSupportedExcept public abstract class AbstractModelBuilder { + static final String SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; + static final String SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource"; + static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema"; + public BeansModel build() { List<URL> beanDescriptorURLs = new ArrayList<URL>(); List<URL> osgiBeanDescriptorURLs = new ArrayList<URL>(); @@ -73,21 +79,21 @@ public abstract class AbstractModelBuild return parse(osgiBeanDescriptorURLs, beanDescriptorURLs); } - abstract Map<String, Object> getAttributes(); + public abstract Map<String, Object> getAttributes(); - abstract ClassLoader getClassLoader(); + public abstract ClassLoader getClassLoader(); - abstract URL getResource(String resource); + public abstract URL getResource(String resource); - abstract List<String> getDefaultResources(); + public abstract List<String> getDefaultResources(); private OSGiBeansHandler getHandler(List<URL> beanDescriptorURLs) { - return new OSGiBeansHandler(beanDescriptorURLs); + return new OSGiBeansHandler(beanDescriptorURLs, getClassLoader()); } private BeansModel parse(List<URL> osgiBeansDescriptorURLs, List<URL> beanDescriptorURLs) { SAXParserFactory factory = SAXParserFactory.newInstance(); - factory.setValidating(false); + factory.setValidating(true); factory.setNamespaceAware(true); if (osgiBeansDescriptorURLs.isEmpty()) { @@ -98,6 +104,14 @@ public abstract class AbstractModelBuild try { parser = factory.newSAXParser(); + + try { + parser.setProperty(SCHEMA_LANGUAGE, XML_SCHEMA); + parser.setProperty(SCHEMA_SOURCE, loadXsds()); + } + catch (SAXNotRecognizedException | SAXNotSupportedException e) { + // No op, we just don't validate the XML + } } catch (ParserConfigurationException | SAXException e) { return Throw.exception(e); @@ -110,17 +124,9 @@ public abstract class AbstractModelBuild InputSource source = new InputSource(inputStream); if (source.getByteStream().available() == 0) { - throw new IllegalArgumentException( - "Specified osgi-beans descriptor is empty: " + osgiBeansDescriptorURL); - } + _log.warn("CDIe - Ignoring {} because it contains 0 bytes", osgiBeansDescriptorURL); - try { - parser.setProperty( - "http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); - parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", loadXsds()); - } - catch (IllegalArgumentException | SAXNotRecognizedException | SAXNotSupportedException e) { - // No op, we just don't validate the XML + continue; } parser.parse(source, handler); @@ -156,4 +162,6 @@ public abstract class AbstractModelBuild return xsds.toArray(new InputSource[0]); } + private static final Logger _log = LoggerFactory.getLogger(AbstractModelBuilder.class); + } Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModel.java Tue Sep 5 22:01:11 2017 @@ -16,21 +16,19 @@ package org.apache.aries.cdi.container.i import java.net.URL; import java.util.Collection; +import java.util.Map; +import org.apache.aries.cdi.container.internal.component.ComponentModel; import org.jboss.weld.bootstrap.spi.BeansXml; import org.jboss.weld.xml.BeansXmlParser; public class BeansModel { public BeansModel( - Collection<String> beanClasses, Collection<ConfigurationModel> configurationModels, - Collection<ReferenceModel> referenceModels, Collection<ServiceModel> serviceModels, + Map<String, ComponentModel> components, Collection<URL> beanDescriptorURLs) { - _beanClasses = beanClasses; - _configurationModels = configurationModels; - _referenceModels = referenceModels; - _serviceModels = serviceModels; + _components = components; BeansXml beansXml = BeansXml.EMPTY_BEANS_XML; @@ -42,30 +40,31 @@ public class BeansModel { _beansXml = beansXml; } + public void addComponentModel(String componentClass, ComponentModel componentModel) { + _components.put(componentClass, componentModel); + } + public Collection<String> getBeanClassNames() { - return _beanClasses; + return _components.keySet(); } public BeansXml getBeansXml() { return _beansXml; } - public Collection<ConfigurationModel> getConfigurationModels() { - return _configurationModels; + public ComponentModel getComponentModel(String componentClass) { + return _components.get(componentClass); } - public Collection<ReferenceModel> getReferenceModels() { - return _referenceModels; + public Collection<ComponentModel> getComponentModels() { + return _components.values(); } - public Collection<ServiceModel> getServiceModels() { - return _serviceModels; + public void removeComponentModel(String beanClassName) { + _components.remove(beanClassName); } - private final Collection<String> _beanClasses; private final BeansXml _beansXml; - private final Collection<ConfigurationModel> _configurationModels; - private final Collection<ReferenceModel> _referenceModels; - private final Collection<ServiceModel> _serviceModels; + private final Map<String, ComponentModel> _components; } \ No newline at end of file Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java?rev=1807424&r1=1807423&r2=1807424&view=diff ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java (original) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/BeansModelBuilder.java Tue Sep 5 22:01:11 2017 @@ -31,9 +31,9 @@ import org.osgi.framework.wiring.BundleW public class BeansModelBuilder extends AbstractModelBuilder { - public BeansModelBuilder(BundleWiring bundleWiring, Bundle extenderBundle) { + public BeansModelBuilder(ClassLoader classLoader, BundleWiring bundleWiring) { + _classLoader = classLoader; _bundleWiring = bundleWiring; - _extenderBundle = extenderBundle; _bundle = _bundleWiring.getBundle(); List<BundleWire> wires = bundleWiring.getRequiredWires(EXTENDER_NAMESPACE); @@ -56,28 +56,28 @@ public class BeansModelBuilder extends A } @Override - Map<String, Object> getAttributes() { + public Map<String, Object> getAttributes() { return _attributes; } @Override - ClassLoader getClassLoader() { - return _extenderBundle.adapt(BundleWiring.class).getClassLoader(); + public ClassLoader getClassLoader() { + return _classLoader; } @Override - URL getResource(String resource) { + public URL getResource(String resource) { return _bundle.getResource(resource); } @Override - List<String> getDefaultResources() { + public List<String> getDefaultResources() { return new ArrayList<>(_bundleWiring.listResources("OSGI-INF/cdi", "*.xml", BundleWiring.LISTRESOURCES_LOCAL)); } private final Map<String, Object> _attributes; private final Bundle _bundle; + private final ClassLoader _classLoader; private final BundleWiring _bundleWiring; - private final Bundle _extenderBundle; } Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java?rev=1807424&view=auto ============================================================================== --- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java (added) +++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/CollectionType.java Tue Sep 5 22:01:11 2017 @@ -0,0 +1,73 @@ +/** + * Licensed 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.aries.cdi.container.internal.model; + +public enum CollectionType { + /** + * The service collection type is used to indicate the collection holds the + * bound service objects. + * <p> + * This is the default collection type. + */ + SERVICE("service"), + + /** + * The reference collection type is used to indicate the collection holds + * Service References for the bound services. + */ + REFERENCE("reference"), + + /** + * The serviceobjects collection type is used to indicate the collection + * holds Component Service Objects for the bound services. + */ + SERVICEOBJECTS("serviceobjects"), + + /** + * The properties collection type is used to indicate the collection holds + * unmodifiable Maps containing the service properties of the bound + * services. + * <p> + * The Maps must implement {@code Comparable} with the {@code compareTo} + * method comparing service property maps using the same ordering as + * {@code ServiceReference.compareTo} based upon service ranking and service + * id. + */ + PROPERTIES("properties"), + + /** + * The tuple collection type is used to indicate the collection holds + * unmodifiable Map.Entries whose key is an unmodifiable Map containing the + * service properties of the bound service, as specified in + * {@link #PROPERTIES}, and whose value is the bound service object. + * <p> + * The Map.Entries must implement {@code Comparable} with the + * {@code compareTo} method comparing service property maps using the same + * ordering as {@code ServiceReference.compareTo} based upon service ranking + * and service id. + */ + TUPLE("tuple"); + + private final String value; + + CollectionType(String value) { + this.value = value; + } + + @Override + public String toString() { + return value; + } +}
