/******************************************************************************* * Copyright (c) 2010 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.internal.core.ca; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.internal.ui.JavaPluginImages; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.jboss.tools.cdi.core.CDICoreNature; import org.jboss.tools.cdi.core.CDICorePlugin; import org.jboss.tools.cdi.core.CDIImages; import org.jboss.tools.cdi.core.IBean; import org.jboss.tools.cdi.core.ICDIProject; import org.jboss.tools.cdi.core.IClassBean; import org.jboss.tools.cdi.core.IDecorator; import org.jboss.tools.cdi.core.IInterceptor; import org.jboss.tools.cdi.core.IStereotype; import org.jboss.tools.common.text.TextProposal; import org.jboss.tools.jst.web.kb.KbQuery; /** * @author Alexey Kazakov */ public class BeansXmlProcessor { private static final BeansXmlProcessor INSTANCE = new BeansXmlProcessor(); public static final Image CLASS_PROPOSAL_IMAGE = JavaPluginImages.DESC_OBJS_CLASS.createImage(); public static final Image ANNOTATION_PROPOSAL_IMAGE = JavaPluginImages.DESC_OBJS_ANNOTATION.createImage(); /** * @return instance of PageProcessor */ public static BeansXmlProcessor getInstance() { return INSTANCE; } private BeansXmlProcessor() { } private final static TextProposal[] EMPTY_ARRAY = new TextProposal[0]; private final static String ALTERNATIVES_ELEMENT = "alternatives"; //$NON-NLS-1$ private final static String CLASS_ELEMENT = "class"; //$NON-NLS-1$ private final static String STEREOTYPE_ELEMENT = "stereotype"; //$NON-NLS-1$ private final static String DECORATORS_ELEMENT = "decorators"; //$NON-NLS-1$ private final static String INTERCEPTOR_ELEMENT = "interceptors"; //$NON-NLS-1$ /** * Returns proposals for the query * @param query * @return */ public TextProposal[] getProposals(KbQuery query, IProject project) { String[] parents = query.getParentTags(); if(parents.length>1) { CDICoreNature nature = CDICorePlugin.getCDI(project, false); if(nature!=null) { ICDIProject cdiProject = nature.getDelegate(); int lastIndex = parents.length-1; int firstIndex = parents.length-2; if(CLASS_ELEMENT.equals(parents[lastIndex])) { if(ALTERNATIVES_ELEMENT.equals(parents[firstIndex])) { return getAlternativeBeans(query, cdiProject); } else if(DECORATORS_ELEMENT.equals(parents[firstIndex])) { return getDecorators(query, cdiProject); } else if(INTERCEPTOR_ELEMENT.equals(parents[firstIndex])) { return getInterceptors(query, cdiProject); } } else if(STEREOTYPE_ELEMENT.equals(parents[lastIndex]) && ALTERNATIVES_ELEMENT.equals(parents[firstIndex])) { return getAlternativeStereotypes(query, cdiProject); } } } return EMPTY_ARRAY; } private TextProposal[] getAlternativeBeans(KbQuery query, ICDIProject cdiProject) { List<TextProposal> proposals = new ArrayList<TextProposal>(); String value = removeLeadingWhitespace(query.getValue()); IBean[] alternatives = cdiProject.getAlternatives(); for (IBean bean : alternatives) { if(bean instanceof IClassBean) { IType type = bean.getBeanClass(); addMatchedType(type, value, proposals, CDIImages.getImageDescriptorByElement(bean)); } } return proposals.toArray(new TextProposal[0]); } private TextProposal[] getAlternativeStereotypes(KbQuery query, ICDIProject cdiProject) { List<TextProposal> proposals = new ArrayList<TextProposal>(); String value = removeLeadingWhitespace(query.getValue()); IStereotype[] alternatives = cdiProject.getStereotypes(); for (IStereotype stereotype : alternatives) { if(stereotype.isAlternative()) { IType type = stereotype.getSourceType(); addMatchedType(type, value, proposals, CDIImages.getImageDescriptorByElement(stereotype)); } } return proposals.toArray(new TextProposal[0]); } private TextProposal[] getDecorators(KbQuery query, ICDIProject cdiProject) { List<TextProposal> proposals = new ArrayList<TextProposal>(); String value = removeLeadingWhitespace(query.getValue()); IDecorator[] decorators = cdiProject.getDecorators(); for (IDecorator bean : decorators) { IType type = bean.getBeanClass(); addMatchedType(type, value, proposals, CDIImages.getImageDescriptorByElement(bean)); } return proposals.toArray(new TextProposal[0]); } private TextProposal[] getInterceptors(KbQuery query, ICDIProject cdiProject) { List<TextProposal> proposals = new ArrayList<TextProposal>(); String value = removeLeadingWhitespace(query.getValue()); IInterceptor[] interceptors = cdiProject.getInterceptors(); for (IInterceptor bean : interceptors) { IType type = bean.getBeanClass(); addMatchedType(type, value, proposals, CDIImages.getImageDescriptorByElement(bean)); } return proposals.toArray(new TextProposal[0]); } private String removeLeadingWhitespace(String value) { int len = value.length(); int st = 0; char[] val = value.toCharArray(); while ((st < len) && (val[st] <= ' ')) { st++; } return (st > 0) ? value.substring(st) : value; } private void addMatchedType(IType type, String value, List<TextProposal> proposals, ImageDescriptor image) { String fullTypeName = type.getFullyQualifiedName(); if(fullTypeName.startsWith(value)) { TextProposal proposal = new TextProposal(); proposal.setContextInfo(fullTypeName); proposal.setLabel(type.getElementName() + " - " + type.getPackageFragment().getElementName()); // proposal.setLabel(fullTypeName); proposal.setReplacementString(fullTypeName); proposal.setPosition(fullTypeName.length()); proposal.setImageDescriptor(image); proposals.add(proposal); } } }