Package org.springframework.ide.eclipse.internal.bestpractices.quickfix

Source Code of org.springframework.ide.eclipse.internal.bestpractices.quickfix.CreateConstructorMarkerResolution

/*******************************************************************************
*  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.internal.bestpractices.quickfix;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.springframework.ide.eclipse.beans.core.BeansCorePlugin;
import org.springframework.ide.eclipse.beans.core.internal.model.BeansModelUtils;
import org.springframework.ide.eclipse.beans.core.model.IBean;
import org.springframework.ide.eclipse.beans.core.model.IBeansConfig;
import org.springframework.ide.eclipse.beans.core.model.IBeansModel;
import org.w3c.dom.Element;

/**
* Resolution for missing init method markers. Creates a corresponding method in
* the class referenced by the bean definition.
* @author Wesley Coelho
* @author Leo Dos Santos
* @author Terry Denney
* @author Christian Dupuis
*/
public class CreateConstructorMarkerResolution extends AbstractCreateMethodMarkerResolution {

  private String targetClass = "";

  private int numConstructorArgs = 0;

  public CreateConstructorMarkerResolution(IMarker marker) throws CoreException {
    super(marker);
    targetClass = extractQuotedString("class '", getMarkerMessage());
    numConstructorArgs = getNumConstructorArgsForMarkedBean(marker);
  }

  @Override
  @SuppressWarnings("unchecked")
  protected List<Expression> getArguments(Expression invocationExpression) {
    ClassInstanceCreation methodInvocation = (ClassInstanceCreation) invocationExpression;
    List<Expression> arguments = new ArrayList<Expression>();
    for (Iterator<Expression> argumentIter = methodInvocation.arguments().iterator(); argumentIter.hasNext();) {
      Expression argumentExpression = argumentIter.next();
      arguments.add(argumentExpression);
    }
    return arguments;
  }

  @Override
  public String getDescription() {
    return "Create matching constructor in class '" + targetClass + "'";
  }

  @Override
  public String getLabel() {
    return "Create matching constructor in class '" + targetClass + "'";
  }

  @Override
  protected String getNewMethodName() {
    return "new " + targetClass;
  }

  @Override
  protected String getNewMethodParameters() {
    String params = "";
    String paramName = "object";
    for (int i = 0; i < numConstructorArgs; i++) {
      if (i == 0) {
        params += paramName;
      }
      else {
        params += ", " + paramName;
      }
    }
    return params;
  }

  private int getNumConstructorArgsForMarkedBean(IMarker marker) throws CoreException {
    IStructuredModel model = null;
    Element beanElement = null;
    try {
      model = XmlQuickFixUtil.getModel(marker);

      if (model == null) {
        return 0;
      }

      beanElement = XmlQuickFixUtil.getMarkerElement(model, marker);

      if (beanElement == null) {
        return 0;
      }

      IBeansModel beansModel = BeansCorePlugin.getModel();
      if (beansModel == null) {
        return 0;
      }

      IBeansConfig beansConfig = beansModel.getConfig((IFile) marker.getResource(), false);
      String beanName = beanElement.getAttribute("id");
      IBean bean = BeansModelUtils.getBean(beanName, beansConfig);
      if (bean != null && bean.getConstructorArguments() != null) {
        return bean.getConstructorArguments().size();
      }
      return 0;
    }
    finally {
      if (model != null) {
        model.releaseFromEdit();
      }
    }
  }

  @Override
  protected String getTargetClass() {
    return targetClass;
  }

}
TOP

Related Classes of org.springframework.ide.eclipse.internal.bestpractices.quickfix.CreateConstructorMarkerResolution

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.