You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ro...@apache.org on 2017/09/05 22:01:15 UTC
svn commit: r1807424 [2/8] - in /aries/trunk/cdi: ./ cdi-extender/
cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/
cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/
cdi-extender/src/main/java/org/apache/aries/...
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;
+ }
+}