org.eclim.installer.ant.CleanupTask.java Source code

Java tutorial

Introduction

Here is the source code for org.eclim.installer.ant.CleanupTask.java

Source

/**
 * Copyright (C) 2005 - 2011  Eric Van Dewoestine
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.eclim.installer.ant;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;

import java.util.regex.Pattern;

import org.apache.commons.io.IOUtils;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;

import org.eclim.installer.step.command.Command;
import org.eclim.installer.step.command.UninstallCommand;

import org.formic.Installer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Ant task to remove installer resources.
 *
 * @author Eric Van Dewoestine
 */
public class CleanupTask extends Task {
    private static final Logger logger = LoggerFactory.getLogger(CleanupTask.class);

    /**
     * Executes this task.
     */
    public void execute() throws BuildException {
        Command command = null;
        try {
            Project project = Installer.getProject();

            String url = project.getProperty("eclim.feature.location");
            command = new UninstallCommand(null, url, "org.eclim.installer", "org.eclipse.equinox.p2.director");
            command.start();
            command.join();
            if (command.getReturnCode() != 0) {
                logger.warn("error: " + command.getErrorMessage() + " out: " + command.getResult());
            }

            // remove installer plugin jar + artifacts.xml entry which the p2
            // director does not.
            new File(project.replaceProperties("${eclipse.local}/plugins/org.eclim.installer_${eclim.version}.jar"))
                    .delete();

            FileInputStream fin = new FileInputStream(project.replaceProperties("${eclipse.local}/artifacts.xml"));
            FileWriter fout = null;
            try {
                String artifacts = IOUtils.toString(fin);
                fin.close();
                Pattern pattern = Pattern.compile(
                        "\n\\s*<artifact classifier='osgi.bundle' " + "id='org\\.eclim\\.installer.*?</artifact>",
                        Pattern.DOTALL);
                artifacts = pattern.matcher(artifacts).replaceFirst("");
                fout = new FileWriter(project.replaceProperties("${eclipse.local}/artifacts.xml"));
                fout.write(artifacts);
            } finally {
                IOUtils.closeQuietly(fout);
                IOUtils.closeQuietly(fin);
            }

            // remove references to the temp formic update site.
            String settingsDir = "p2/org.eclipse.equinox.p2.engine/.settings/";
            String profileSettingsDir = "p2/org.eclipse.equinox.p2.engine/profileRegistry/"
                    + "SDKProfile.profile/.data/.settings/";
            String[] files = new String[] { settingsDir + "org.eclipse.equinox.p2.artifact.repository.prefs",
                    settingsDir + "org.eclipse.equinox.p2.metadata.repository.prefs",
                    profileSettingsDir + "org.eclipse.equinox.p2.artifact.repository.prefs",
                    profileSettingsDir + "org.eclipse.equinox.p2.metadata.repository.prefs", };
            Pattern pattern = Pattern.compile("^.*formic.*$\n", Pattern.MULTILINE);
            for (int ii = 0; ii < files.length; ii++) {
                File file = new File(project.replaceProperties("${eclipse.local}/" + files[ii]));
                if (file.exists()) {
                    try {
                        fin = new FileInputStream(file);
                        String contents = IOUtils.toString(fin);
                        contents = pattern.matcher(contents).replaceAll("");
                        fin.close();

                        fout = new FileWriter(file);
                        fout.write(contents);
                    } catch (Exception e) {
                        logger.warn("Error removing formic update site references.", e);
                        e.printStackTrace();
                    } finally {
                        IOUtils.closeQuietly(fout);
                        IOUtils.closeQuietly(fin);
                    }
                }
            }
        } catch (Exception e) {
            throw new BuildException(e);
        } finally {
            if (command != null) {
                command.destroy();
            }
        }
    }
}