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

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

/*******************************************************************************
*  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 org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IMarkerResolution2;
import org.eclipse.wst.sse.core.internal.format.IStructuredFormatProcessor;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
import org.eclipse.wst.xml.core.internal.cleanup.CleanupProcessorXML;
import org.eclipse.wst.xml.core.internal.document.ElementImpl;
import org.eclipse.wst.xml.core.internal.provisional.format.FormatProcessorXML;
import org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart;
import org.springsource.ide.eclipse.commons.core.StatusHandler;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;


/**
* Resolution property setters that are required due to an
* <code>@required</code> annotation.
* @author Wesley Coelho
* @author Leo Dos Santos
* @author Christian Dupuis
*/
public class CreateRequiredMethodMarkerResolution implements IMarkerResolution2 {

  private static final String MESSAGE_ATTRIBUTE_KEY = "message";

  private String property = "";

  private String bean = "";

  public CreateRequiredMethodMarkerResolution(IMarker marker) {
    String markerMessage = marker.getAttribute(MESSAGE_ATTRIBUTE_KEY, "");
    property = extractQuotedString("Property '", markerMessage);
    bean = extractQuotedString("bean '", markerMessage);
  }

  private String extractQuotedString(String startTag, String message) {
    int startPos = message.indexOf(startTag) + startTag.length();
    int endPos = message.indexOf("'", startPos);
    return message.substring(startPos, endPos);
  }

  public String getDescription() {
    return "Create property '" + property + "' in bean '" + bean + "'";
  }

  public Image getImage() {
    return null;
  }

  public String getLabel() {
    return "Create property '" + property + "' in bean '" + bean + "'";
  }

  public void run(IMarker marker) {
    IStructuredModel model = null;
    Element beanElement = null;

    try {
      model = XmlQuickFixUtil.getModel(marker);
      beanElement = XmlQuickFixUtil.getMarkerElement(model, marker);

      if (model != null) {
        if (beanElement != null) {
          Document document = beanElement.getOwnerDocument();

          Text spacerNode = document.createTextNode("\n");
          beanElement.appendChild(spacerNode);

          Element newBeanProperty = document.createElement("property");
          newBeanProperty.setAttribute("name", property);
          newBeanProperty.setAttribute("value", "");
          newBeanProperty = (Element) beanElement.appendChild(newBeanProperty);

          spacerNode = document.createTextNode("\n\n");
          beanElement.appendChild(spacerNode);

          IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
          formatProcessor.formatNode(newBeanProperty);

          IEditorPart editor = XmlQuickFixUtil.getMarkedEditor(marker);
          setCursorPositionToPropertyValue((XMLMultiPageEditorPart) editor, (ElementImpl) newBeanProperty);

          CleanupProcessorXML cleanupProcessor = new CleanupProcessorXML();
          cleanupProcessor.getCleanupPreferences().setCompressEmptyElementTags(true);
          cleanupProcessor.cleanupNode(newBeanProperty);

          XmlQuickFixUtil.saveMarkedFile(marker);
        }
      }
    }
    catch (CoreException e) {
      StatusHandler.log(e.getStatus());
    }
    finally {
      if (model != null) {
        model.releaseFromEdit();
      }
    }
  }

  /**
   * Attempts to set the cursor position to the value attribute of the given
   * property element
   */
  private void setCursorPositionToPropertyValue(XMLMultiPageEditorPart xmlEditor, ElementImpl propertyElement) {
    IEditorPart[] editorParts = xmlEditor.findEditors(xmlEditor.getEditorInput());

    for (IEditorPart currEditorPart : editorParts) {
      if (currEditorPart instanceof StructuredTextEditor) {
        StructuredTextEditor structuredTextEditor = (StructuredTextEditor) currEditorPart;
        int propertyElementStartOffset = propertyElement.getStartOffset();
        String propertyElementTextContent = propertyElement.getStartStructuredDocumentRegion().getFullText();
        String valueAttributeStartString = "value=\"";
        int valueAttributeStartIndex = propertyElementTextContent.indexOf(valueAttributeStartString)
            + valueAttributeStartString.length();
        if (valueAttributeStartIndex > 0) {
          int documentOffset = propertyElementStartOffset + valueAttributeStartIndex;
          structuredTextEditor.selectAndReveal(documentOffset, 0);
          currEditorPart.setFocus();
        }
      }
    }
  }
}
TOP

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

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.