/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.blueprint.reflect; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.gemini.blueprint.blueprint.container.support.internal.config.CycleOrderingProcessor; import org.osgi.service.blueprint.reflect.ComponentMetadata; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; /** * Default {@link ComponentMetadata} implementation based on Spring's {@link BeanDefinition}. * * @author Costin Leau * */ class SimpleComponentMetadata implements ComponentMetadata { private final String name; protected final AbstractBeanDefinition beanDefinition; private final List<String> dependsOn; private final int activation; public SimpleComponentMetadata(String name, BeanDefinition definition) { if (!(definition instanceof AbstractBeanDefinition)) { throw new IllegalArgumentException("Unknown bean definition passed in" + definition); } this.name = name; this.beanDefinition = (AbstractBeanDefinition) definition; String[] dpdOn = beanDefinition.getDependsOn(); if (ObjectUtils.isEmpty(dpdOn)) { dependsOn = Collections.<String> emptyList(); } else { List<String> dependencies = new ArrayList<String>(dpdOn.length); CollectionUtils.mergeArrayIntoCollection(dpdOn, dependencies); Collection<String> syntheticDependsOn = (Collection<String>) beanDefinition.getAttribute(CycleOrderingProcessor.SYNTHETIC_DEPENDS_ON); if (syntheticDependsOn != null) { dependencies.removeAll(syntheticDependsOn); } dependsOn = Collections.unmodifiableList(dependencies); } if (!StringUtils.hasText(name)) { // nested components are always lazy activation = ACTIVATION_LAZY; } else { activation = beanDefinition.isSingleton() ? (beanDefinition.isLazyInit() ? ACTIVATION_LAZY : ACTIVATION_EAGER) : ACTIVATION_LAZY; } } public BeanDefinition getBeanDefinition() { return beanDefinition; } public String getId() { return name; } public List<String> getDependsOn() { return dependsOn; } public int getActivation() { return activation; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((beanDefinition == null) ? 0 : beanDefinition.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj instanceof SimpleComponentMetadata) { SimpleComponentMetadata other = (SimpleComponentMetadata) obj; if (beanDefinition == null) { if (other.beanDefinition != null) return false; } return beanDefinition == other.beanDefinition; } return false; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("ComponentMetadata for bean name="); sb.append(name); sb.append("; activation="); sb.append(activation); sb.append("; dependsOn="); sb.append(dependsOn); sb.append("; target definition"); sb.append(beanDefinition); return sb.toString(); } }