Package com.ind.eclipse.headlessworkspace

Source Code of com.ind.eclipse.headlessworkspace.HeadLessUpdateSiteExporter

package com.ind.eclipse.headlessworkspace;

import java.io.File;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.pde.internal.core.FeatureModelManager;
import org.eclipse.pde.internal.core.PDECore;
import org.eclipse.pde.internal.core.ifeature.IFeatureModel;
import org.eclipse.pde.internal.core.isite.ISiteFeature;
import org.eclipse.pde.internal.core.isite.ISiteModel;
import org.eclipse.pde.internal.core.site.WorkspaceSiteModel;

/**
* This class searches for update site project in the workspace and exports
* them.
*
* @author lex.schade@googlemail.com
*/
@SuppressWarnings("restriction")
public class HeadLessUpdateSiteExporter {

    private static final String MSG_NO_UPDATE_SITES_FOUND = "No update sites found in workspace {0}.";
    private static final String SITE_XML_FILENAME = "site.xml";
    private static final String JOB_NAME = "Update site export job";

    /** The shared instance of the exporter. */
    private static HeadLessUpdateSiteExporter instance = new HeadLessUpdateSiteExporter();

    /**
     * Returns the single instance of the update site exporter.
     *
     * @return the instance
     */
    public static HeadLessUpdateSiteExporter getInstance() {
        return instance;
    }

    private HeadLessUpdateSiteExporter() {
    }

    /**
     * Exports the update site.
     *
     * @param monitor
     *            the progress monitor to use
     * @throws Exception
     */
    void exportUpdateSites(final IProgressMonitor monitor) throws Exception {

        ISiteModel[] updateSites = getSiteModels();
        if (updateSites.length > 0) {

            // iterate through all available sites
            for (ISiteModel updateSiteModel : getSiteModels()) {

                // set the target, if you need update sites for different target
                // platforms
                // IFile targetFile =
                // updateSiteModel.getUnderlyingResource().getProject().getFile("site.target");
                // TargetPlatformUtils.loadTargetDefinition(targetFile);
               
                // cleanup
                cleanUpdateSiteFolder(updateSiteModel.getInstallLocation());
               
                SysOutProgressMonitor.out.println("Exporting update site: " + updateSiteModel.getInstallLocation());

                // build the update site
                final HeadlessSiteBuildOperation useo = new HeadlessSiteBuildOperation(getFeatures(updateSiteModel), updateSiteModel,
                        JOB_NAME);
              
                SysOutProgressMonitor.out.println("Update site build operation started.");
                useo.run(monitor);        
                SysOutProgressMonitor.out.println("Update site build operation finished.");
            }
        } else {
            SysOutProgressMonitor.out.println(MessageFormat.format(MSG_NO_UPDATE_SITES_FOUND, ResourcesPlugin
                    .getWorkspace().getRoot().getLocation()));
        }
    }

    /**
     * Returns the features contained in the update site project.
     *
     * @param updateSiteModel
     *            the update site model
     * @return the features or an empty array if not features can be found
     */
    public IFeatureModel[] getFeatures(ISiteModel updateSiteModel) {
        final List<IFeatureModel> models = new ArrayList<IFeatureModel>();
        final FeatureModelManager manager = PDECore.getDefault().getFeatureModelManager();
        for (ISiteFeature siteFeature : updateSiteModel.getSite().getFeatures()) {
            final IFeatureModel model = manager.findFeatureModel(siteFeature.getId());
            if (model != null) {
                models.add(model);
            }
        }
        return models.toArray(new IFeatureModel[models.size()]);
    }

    /**
     * Returns all existing update site models from the workspace.
     *
     * @return the update site models or an empty array if no update site exists
     */
    public ISiteModel[] getSiteModels() {
        final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
        final List<ISiteModel> siteModels = new ArrayList<ISiteModel>();

        for (IProject project : projects) {
            IFile siteXml = project.getFile(SITE_XML_FILENAME);
            if (siteXml != null && siteXml.exists()) {
                final ISiteModel model = new WorkspaceSiteModel(siteXml);
                if (model != null) {
                    siteModels.add(model);
                    try {
                        model.load();
                    } catch (CoreException e) {
                        SysOutProgressMonitor.out.println("Problem occurred while loading: " + siteXml.getLocation());
                        e.printStackTrace(SysOutProgressMonitor.out);
                    }
                }
            }
        }
        return siteModels.toArray(new ISiteModel[siteModels.size()]);
    }
   
    /**
     * Deletes existing old files from the update site project folder.
     * @param updateSiteLocation
     *
     */
    private void cleanUpdateSiteFolder(String updateSiteLocation) {
        File siteFeatures = new File(updateSiteLocation, "plugins");
        deleteDirectory(siteFeatures);
       
        File sitePlugins = new File(updateSiteLocation, "features");
        deleteDirectory(sitePlugins);
    }
   
    /**
     * Removes the given directory recursive.
     *
     * @param directory The directory to remove.
     * @return True, if the directory was removed.
     */
    private static boolean deleteDirectory(File directory) {
        if (directory.exists()) {
            for (File file : directory.listFiles()) {
                if (file.isDirectory()) {
                    deleteDirectory(file);
                } else {
                    file.delete();
                }
            }
        }
        return directory.delete();
    }

}
TOP

Related Classes of com.ind.eclipse.headlessworkspace.HeadLessUpdateSiteExporter

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.