Package in.cypal.studio.gwt.ui.refactor

Source Code of in.cypal.studio.gwt.ui.refactor.DeleteRemoteServiceChange

/*
* Copyright 2007 - 2008 Cypal Solutions (tools@cypal.in)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

package in.cypal.studio.gwt.ui.refactor;

import in.cypal.studio.gwt.core.common.Constants;
import in.cypal.studio.gwt.core.common.Util;
import in.cypal.studio.gwt.ui.Activator;

import java.util.Iterator;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
import org.eclipse.jst.j2ee.webapplication.Servlet;
import org.eclipse.jst.j2ee.webapplication.ServletMapping;
import org.eclipse.jst.j2ee.webapplication.ServletType;
import org.eclipse.jst.j2ee.webapplication.WebApp;
import org.eclipse.jst.j2ee.webapplication.WebType;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
* @author Prakash G.R.
*
*/
public class DeleteRemoteServiceChange extends Change {

  private final ICompilationUnit compilationUnit;

  public DeleteRemoteServiceChange(ICompilationUnit compilationUnit) {
    this.compilationUnit = compilationUnit;
  }

  public Object getModifiedElement() {
    return compilationUnit.getResource();
  }

  public String getName() {
    return "Remote Service Delete Change";
  }

  public void initializeValidationData(IProgressMonitor pm) {

  }

  public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException, OperationCanceledException {
    return new RefactoringStatus();
  }

  public Change perform(IProgressMonitor pm) throws CoreException {

    IPackageFragment clientPackage = (IPackageFragment) compilationUnit.getParent();
    ICompilationUnit asyncInterface = clientPackage.getCompilationUnit(getRemoteInterfaceName().concat("Async.java"));
    IResource asyncFile = asyncInterface.getResource();
    if (asyncFile.exists())
      asyncFile.delete(true, null);

    IPackageFragmentRoot sourceFolder = (IPackageFragmentRoot) clientPackage.getParent();
    IJavaElement[] subPackages = sourceFolder.getChildren();
    for (int i = 0; i < subPackages.length; i++) {

      IPackageFragment packageFragment = (IPackageFragment) subPackages[i];
      if (subPackages[i].getElementName().endsWith(Constants.SERVER_PACKAGE)) {
        ICompilationUnit implClass = packageFragment.getCompilationUnit(getRemoteInterfaceName().concat("Impl.java"));
        IResource implFile = implClass.getResource();
        if (implFile.exists()) {
          implFile.delete(true, null);
        }
      }
    }

    IFolder moduleFolder = (IFolder) sourceFolder.getCorrespondingResource();
    moduleFolder.accept(new IResourceVisitor() {

      public boolean visit(IResource resource) throws CoreException {

        if (Util.isModuleXml(resource)) {
          try {
            deleteFromGwtXml((IFile) resource, null);
          } catch (Exception e) {
            Activator.logException(e);
          }
        }
        return true;
      }

    });

    deleteFromWebXml(null);

    return null;
  }

  private String getRemoteInterfaceName() {
    return compilationUnit.getElementName().substring(0, compilationUnit.getElementName().length() - 5);
  }

  private void deleteFromGwtXml(IFile moduleFile, IProgressMonitor monitor) throws Exception {

    monitor = Util.getNonNullMonitor(monitor);

    try {

      monitor.beginTask("", 2);

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

      DocumentBuilder builder = factory.newDocumentBuilder();

      Document document = builder.parse(moduleFile.getContents());
      Node module = document.getDocumentElement();

      NodeList childNodes = module.getChildNodes();
      for (int i = 0; i < childNodes.getLength(); i++) {
        Node item = childNodes.item(i);
        if (item instanceof Element && ((Element) item).getTagName().equals("servlet")) {
          String servletClass = ((Element) item).getAttribute("class");
          if (servletClass.endsWith(getRemoteInterfaceName().concat("Impl"))) {
            module.removeChild(item);
          }
        }
      }

      Transformer writer = TransformerFactory.newInstance().newTransformer();

      writer.transform(new DOMSource(document), new StreamResult(moduleFile.getLocation().toFile()));
      monitor.worked(1);

      moduleFile.refreshLocal(IResource.DEPTH_ONE, new SubProgressMonitor(monitor, 1));

    } finally {
      monitor.done();
    }
  }

  private void deleteFromWebXml(IProgressMonitor monitor) {

    monitor = Util.getNonNullMonitor(monitor);

    try {

      monitor.beginTask("", 1);

      IVirtualComponent component = ComponentCore.createComponent(compilationUnit.getJavaProject().getProject());
      WebArtifactEdit artifactEdit = WebArtifactEdit.getWebArtifactEditForWrite(component);
      WebApp webApp = (WebApp) artifactEdit.getContentModelRoot();
      EList servlets = webApp.getServlets();
      for (Iterator i = servlets.iterator(); i.hasNext();) {
        Servlet servlet = (Servlet) i.next();
        WebType webType = servlet.getWebType();
        if (webType instanceof ServletType && ((ServletType) webType).getClassName().endsWith(getRemoteInterfaceName().concat("Impl"))) {
          ServletMapping servletMapping = webApp.getServletMapping(servlet);
          servlets.remove(servlet);
          webApp.getServletMappings().remove(servletMapping);
          break;
        }
      }

      artifactEdit.saveIfNecessary(monitor);

      artifactEdit.dispose();

    } finally {
      monitor.done();
    }

  }

}
TOP

Related Classes of in.cypal.studio.gwt.ui.refactor.DeleteRemoteServiceChange

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.