/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.seam.text.ext.hyperlink; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.jboss.tools.cdi.core.CDICoreNature; import org.jboss.tools.cdi.core.IBean; import org.jboss.tools.cdi.core.IBeanMember; import org.jboss.tools.cdi.core.IInjectionPoint; import org.jboss.tools.cdi.core.IProducer; import org.jboss.tools.cdi.core.extension.ICDIExtension; import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderDefaultBeanExtension; import org.jboss.tools.cdi.text.ext.hyperlink.AssignableBeanFilters; import org.jboss.tools.cdi.text.ext.hyperlink.AssignableBeanFilters.Filter; import org.jboss.tools.cdi.text.ext.hyperlink.AssignableBeanFilters.FilterContributor; /** * * @author Viacheslav Kabanovich * */ public class SolderDefaultBeanFilterContributor implements FilterContributor { public static final int OPTION_DEFAULT_BEAN = 21; @Override public void contribute(AssignableBeanFilters filters, IInjectionPoint injectionPoint) { ICDIExtension ext = CDISeamSolderDefaultBeanExtension.getExtension(injectionPoint.getCDIProject().getNature()); if(ext == null) { return; } CDISeamSolderDefaultBeanExtension defaultBeanExtension = (CDISeamSolderDefaultBeanExtension)ext; filters.add(0, OPTION_DEFAULT_BEAN, "Eliminated @DefaultBean", new DefaultBeanFilter(filters, injectionPoint, defaultBeanExtension)); } class DefaultBeanFilter implements Filter { AssignableBeanFilters filters; IInjectionPoint injectionPoint; CDISeamSolderDefaultBeanExtension defaultBeanExtension; DefaultBeanFilter(AssignableBeanFilters filters, IInjectionPoint injectionPoint, CDISeamSolderDefaultBeanExtension defaultBeanExtension) { this.filters = filters; this.injectionPoint = injectionPoint; this.defaultBeanExtension = defaultBeanExtension; } @Override public void filter(Set<IBean> beans) { Set<IBean> eligible = new HashSet<IBean>(beans); for (int i = AssignableBeanFilters.OPTION_UNAVAILABLE_BEANS + 1; i < AssignableBeanFilters.OPTION_ELIMINATED_AMBIGUOUS; i++) { Filter f = filters.getFilter(i); if(f != null) { f.filter(eligible); } } boolean hasNonDefault = false; for (IBean b: eligible) { if(b.isEnabled() && !defaultBeanExtension.isBeanDefault(b)) { hasNonDefault = true; } } if(hasNonDefault) { Iterator<IBean> it = beans.iterator(); while(it.hasNext()) { IBean bean = it.next(); if(!eligible.contains(bean) || !defaultBeanExtension.isBeanDefault(bean)) continue; it.remove(); } } } } }