@Override public boolean addDestructionCallback(final Object instance, final DestructionCallback<?> callback) { boolean success = false; for (final Context context : contexts) { success = success || context.addDestructionCallback(instance, callback); } return success; }
@Override public void destroy(final Object instance) { for (final Context context : contexts) { context.destroyInstance(instance); } }
private void trySettingInstance() { assertContextIsSet(); if (context.isActive()) { instance = context.getActiveNonProxiedInstance(factoryName); } else { throw new RuntimeException("Cannot access a bean from the inactive " + context.getScope().getSimpleName() + " context."); } }
@Override public <P> P getInstanceProperty(final Object instance, final String propertyName, final Class<P> type) { for (final Context context : contexts) { if (context.isManaged(instance)) { return context.getInstanceProperty(instance, propertyName, type); } } throw new RuntimeException("The given instance, " + instance + ", is not managed."); }
@Override public void addContext(final Context context) { if (!contexts.contains(context)) { contexts.add(context); context.setContextManager(this); for (final Factory<?> factory : context.getAllFactories()) { contextsByFactoryName.put(factory.getHandle().getFactoryName(), context); } } }
@Override public void finishInit() { for (final Context context : contexts) { for (final Factory<?> factory : context.getAllFactories()) { factory.init(context); } } }
@Override public <T> T getInstance(final String factoryName) { return getContext(factoryName).getInstance(factoryName); }
private Context getContextForScope(final Class<? extends Annotation> scope) { for (final Context context : contexts) { if (context.handlesScope(scope)) { return context; } } throw new RuntimeException("Could not find context for the scope " + scope.getName()); }
@Override public <T> T getNewInstance(final String factoryName) { return getContext(factoryName).getNewInstance(factoryName); }
@Override public Collection<FactoryHandle> getAllFactoryHandles() { final Collection<FactoryHandle> allHandles = new ArrayList<FactoryHandle>(); for (final Context context : contexts) { for (final Factory<?> factory : context.getAllFactories()) { allHandles.add(factory.getHandle()); } } return allHandles; }
@SuppressWarnings("unchecked") @Override public <T> T getEagerInstance(final String factoryName) { final T instance = getContext(factoryName).<T>getInstance(factoryName); if ((instance instanceof Proxy)) { ((Proxy<T>) instance).unwrap(); } return instance; }