Package org.springframework.ide.eclipse.quickfix.processors

Source Code of org.springframework.ide.eclipse.quickfix.processors.PropertyAttributeQuickAssistProcessor

/*******************************************************************************
*  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.processors;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.text.correction.NameMatcher;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
import org.springframework.ide.eclipse.core.java.Introspector;
import org.springframework.ide.eclipse.core.java.JdtUtils;
import org.springframework.ide.eclipse.quickfix.QuickfixUtils;
import org.springframework.ide.eclipse.quickfix.proposals.RenameToSimilarNameQuickFixProposal;


/**
* Quick assist processor for bean property attribute in beans XML editor.
* @author Terry Denney
* @author Leo Dos Santos
* @author Christian Dupuis
* @since 2.0
*/
public class PropertyAttributeQuickAssistProcessor extends BeanQuickAssistProcessor {

  public enum Type {
    GETTER, SETTER
  }

  private final String className;

  private final IJavaProject javaProject;

  private final IProject project;

  private final Type type;;

  public PropertyAttributeQuickAssistProcessor(int offset, int length, String className, String propertyName,
      IProject project, boolean missingEndQuote, Type type) {
    super(offset, length, propertyName, missingEndQuote);
    this.className = className;
    this.project = project;
    this.type = type;
    this.javaProject = JavaCore.create(project);
  }

  private void addPropertyName(String property, Set<String> properties) {
    if (NameMatcher.isSimilarName(property, text)) {
      if (property.length() > 1 && Character.isUpperCase(property.charAt(1))) {
        properties.add(property);
      }
      else {
        properties.add(property.substring(0, 1).toLowerCase() + property.substring(1));
      }
    }
  }

  public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext invocationContext) {
    List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();

    List<String> similarProperties = getSimilarProperties();
    for (String similarProperty : similarProperties) {
      RenameToSimilarNameQuickFixProposal p = new RenameToSimilarNameQuickFixProposal(similarProperty, offset,
          length, missingEndQuote);
      proposals.add(p);
    }

    ICompletionProposal proposal = QuickfixUtils
        .getNewMethodQuickFixProposal(getNewMethodName(), null, getMethodParamTypes(), javaProject, className,
            offset, length, text, missingEndQuote, false, "property");
    if (proposal != null) {
      proposals.add(proposal);
    }

    return proposals.toArray(new ICompletionProposal[proposals.size()]);
  }

  private String[] getMethodParamTypes() {
    switch (type) {
    case SETTER:
      return new String[] { "Object" };
    case GETTER:
      return new String[] {};
    }
    return null;
  }

  private String getNewMethodName() {
    String firstChar = text.substring(0, 1);
    switch (type) {
    case SETTER:
      return "set" + firstChar.toUpperCase() + text.substring(1);
    case GETTER:
      return "get" + firstChar.toUpperCase() + text.substring(1);
    }
    return null;
  }

  private List<String> getSimilarProperties() {
    HashSet<String> properties = new HashSet<String>();
    IType type = JdtUtils.getJavaType(project, className);
    if (type != null) {
      try {
        Set<IMethod> methods = Introspector.findAllWritableProperties(type);
        for (IMethod method : methods) {
          String methodName = method.getElementName();
          if (methodName.startsWith("set")) {
            String propertyName = methodName.replace("set", "");
            addPropertyName(propertyName, properties);
          }
        }
      }
      catch (JavaModelException e) {
      }
    }

    List<String> result = new ArrayList<String>(properties);
    Collections.sort(result, new NameSuggestionComparator(text));
    return result;
  }

}
TOP

Related Classes of org.springframework.ide.eclipse.quickfix.processors.PropertyAttributeQuickAssistProcessor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.