in.cypal.studio.gwt.ui.refactor.DeleteRemoteServiceChange.java Source code

Java tutorial

Introduction

Here is the source code for in.cypal.studio.gwt.ui.refactor.DeleteRemoteServiceChange.java

Source

/*
 * 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();
        }

    }

}