/*******************************************************************************
* Copyright (c) 2012 VMware, Inc.
* All rights reserved. This program and the accompanying materials
* are 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.quickfix.jdt.computers;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposalComputer;
/**
* @author Terry Denney
* @since 2.6
*/
public class AnnotationComputerRegistry {
public static JavaCompletionProposalComputer[] computers = new JavaCompletionProposalComputer[] {
new QualifierCompletionProposalComputer(), new RequestMappingParamTypeProposalComputer(),
new ConfigurationLocationProposalComputer(), new SimpleClassProposalComputer() };
public final static String DEFAULT_ATTRIBUTE_NAME = "value";
/**
* annotation name -> attribute name -> proposal computer
*/
public static Map<String, Map<String, Set<AnnotationProposalComputer>>> annotationArgComputers = null;
public static Map<String, Map<String, Set<AnnotationProposalComputer>>> annotationArgComputersForArray = null;
private static void init() {
annotationArgComputers = new HashMap<String, Map<String, Set<AnnotationProposalComputer>>>();
annotationArgComputersForArray = new HashMap<String, Map<String, Set<AnnotationProposalComputer>>>();
addProposalComputer("Qualifier", new QualifierArgumentProposalComputer());
addProposalComputer("RequestMapping", new RequestMappingVariableProposalComputer());
addProposalComputer("ContextConfiguration", "locations", new ConfigurationLocationProposalComputer());
addProposalComputer("ContextConfiguration", "value", new ConfigurationLocationProposalComputer());
addProposalComputer("ComponentScan", new PackageNameProposalComputer());
addProposalComputer("ComponentScan", "basePackages", new PackageNameProposalComputer());
addProposalComputer("ComponentScan", "basePackageClasses", new SimpleClassProposalComputer());
addProposalComputerForArrayAttribute("ComponentScan", new PackageNameProposalComputer());
addProposalComputerForArrayAttribute("ComponentScan", "basePackages", new PackageNameProposalComputer());
addProposalComputerForArrayAttribute("ComponentScan", "basePackageClasses", new SimpleClassProposalComputer());
}
private static void addProposalComputer(String annotationName, AnnotationProposalComputer proposalComputer) {
addProposalComputer(annotationName, DEFAULT_ATTRIBUTE_NAME, proposalComputer);
}
private static void addProposalComputerForArrayAttribute(String annotationName,
AnnotationProposalComputer proposalComputer) {
addProposalComputerForArrayAttribute(annotationName, DEFAULT_ATTRIBUTE_NAME, proposalComputer);
}
private static void addProposalComputer(String annotationName, String attributeName,
AnnotationProposalComputer proposalComputer) {
addProposalComputerHelper(annotationName, attributeName, proposalComputer, annotationArgComputers);
}
private static void addProposalComputerForArrayAttribute(String annotationName, String attributeName,
AnnotationProposalComputer proposalComputer) {
addProposalComputerHelper(annotationName, attributeName, proposalComputer, annotationArgComputersForArray);
}
private static void addProposalComputerHelper(String annotationName, String attributeName,
AnnotationProposalComputer proposalComputer, Map<String, Map<String, Set<AnnotationProposalComputer>>> map) {
if (map != null) {
Map<String, Set<AnnotationProposalComputer>> attributeToComputers = map.get(annotationName);
if (attributeToComputers == null) {
attributeToComputers = new HashMap<String, Set<AnnotationProposalComputer>>();
map.put(annotationName, attributeToComputers);
}
Set<AnnotationProposalComputer> computers = attributeToComputers.get(attributeName);
if (computers == null) {
computers = new HashSet<AnnotationProposalComputer>();
attributeToComputers.put(attributeName, computers);
}
computers.add(proposalComputer);
}
}
public static Set<AnnotationProposalComputer> getProposalComputer(String annotationName) {
return getProposalComputer(annotationName, DEFAULT_ATTRIBUTE_NAME);
}
public static Set<AnnotationProposalComputer> getProposalComputer(String annotationName, String attributeName) {
if (annotationArgComputers == null) {
init();
}
return getProposalComputerHelper(annotationName, attributeName, annotationArgComputers);
}
public static Set<AnnotationProposalComputer> getProposalComputerForArrayAttribute(String annotationName) {
return getProposalComputerForArrayAttribute(annotationName, DEFAULT_ATTRIBUTE_NAME);
}
public static Set<AnnotationProposalComputer> getProposalComputerForArrayAttribute(String annotationName,
String attributeName) {
if (annotationArgComputersForArray == null) {
init();
}
return getProposalComputerHelper(annotationName, attributeName, annotationArgComputersForArray);
}
private static Set<AnnotationProposalComputer> getProposalComputerHelper(String annotationName,
String attributeName, Map<String, Map<String, Set<AnnotationProposalComputer>>> map) {
Map<String, Set<AnnotationProposalComputer>> attributeToComputers = map.get(annotationName);
if (attributeToComputers != null) {
Set<AnnotationProposalComputer> result = attributeToComputers.get(attributeName);
if (result != null) {
return result;
}
}
return Collections.emptySet();
}
}