org.eclipse.mylyn.reviews.r4e_gerrit.internal.utils.R4EGerritServerUtility.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.reviews.r4e_gerrit.internal.utils.R4EGerritServerUtility.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Ericsson
 * 
 * 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
 * 
 * Description:
 *    This class implements some utility for the Gerrit servers.
 * 
 * Contributors:
 *   Jacques Bouthillier - Initial Implementation of the server selection
 ******************************************************************************/

package org.eclipse.mylyn.reviews.r4e_gerrit.internal.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.eclipse.core.runtime.IPath;
import org.eclipse.egit.core.RepositoryCache;
import org.eclipse.egit.core.RepositoryUtil;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.mylyn.internal.gerrit.core.GerritConnector;
import org.eclipse.mylyn.internal.tasks.core.RepositoryTemplateManager;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.reviews.r4e_gerrit.R4EGerritPlugin;
import org.eclipse.mylyn.reviews.r4e_gerrit.ui.R4EGerritUi;
import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
import org.eclipse.mylyn.tasks.core.TaskRepository;

/**
 * @author Jacques Bouthillier
 * @version $Revision: 1.0 $
 *
 */
@SuppressWarnings("restriction")
public class R4EGerritServerUtility {

    // ------------------------------------------------------------------------
    // Constants
    // ------------------------------------------------------------------------

    /**
     * Field GERRIT_PORT. (value is "":29418"")
     */
    private static final String GERRIT_PORT = ":29418";

    /**
     * Field AT. (value is ""@"")
     */
    private static final String AT = "@";

    /**
     * Field AT. (value is ""https://"")
     */
    private static final String HTTPS = "https://";

    /**
     * Field LAST_GERRIT_FILE. (value is ""lastGerrit.txt"")
     */
    private static final String LAST_GERRIT_FILE = "lastGerrit.txt";

    // ------------------------------------------------------------------------
    // Variables
    // ------------------------------------------------------------------------

    private static R4EGerritServerUtility instance = null;

    private static Map<TaskRepository, String> fResultTask = new HashMap<TaskRepository, String>();

    // ------------------------------------------------------------------------
    // Constructors
    // ------------------------------------------------------------------------
    public R4EGerritServerUtility() {
        instance = this;
        mapConfiguredGerritServer();

        //LATER: Map the workspace gerrit to the menu option
        //addWorkspaceGerritRepo();

        //Begin Test
        //testTaskRepo(); not needed anymore
        //End Test
    }

    // ------------------------------------------------------------------------
    // Methods Private
    // ------------------------------------------------------------------------

    /**
     * Map the configured Gerrit server found in the TaskList
     * @return Map<TaskRepository, String>
     */
    private Map<TaskRepository, String> mapConfiguredGerritServer() {
        //Reset the list of Gerrit server
        fResultTask.clear();

        TaskRepositoryManager repositoryManager = TasksUiPlugin.getRepositoryManager();

        //Only get the TaskRepository related to Gerrit review connnector
        R4EGerritPlugin.Ftracer.traceInfo("--------Review repo ---------------");
        Set<TaskRepository> reviewRepo = repositoryManager.getRepositories(GerritConnector.CONNECTOR_KIND);
        for (TaskRepository taskRepo : reviewRepo) {
            R4EGerritPlugin.Ftracer.traceInfo("Add Gerrit Review repo: " + taskRepo.getRepositoryLabel()
                    + "\t url: " + taskRepo.getRepositoryUrl());
            fResultTask.put(taskRepo, taskRepo.getRepositoryUrl());
            if (null != taskRepo.getRepositoryUrl()) {
                adjustTemplatemanager(taskRepo);
            }
        }
        //Print a the end the info for all Gerrit 
        printRepositoryTemplate();
        return fResultTask;
    }

    /**
     * Build a list of Gerrit server to display in the combo box in the dialogue window
     * @param aTaskRepo
     */
    private void adjustTemplatemanager(TaskRepository aTaskRepo) {
        RepositoryTemplateManager templateManager = TasksUiPlugin.getRepositoryTemplateManager();
        //Verify to only add once in the repository template
        Boolean found = false;
        //   printTaskRepository(aTaskRepo);
        for (RepositoryTemplate template : templateManager.getTemplates(GerritConnector.CONNECTOR_KIND)) {
            String convertedRemoteURL = aTaskRepo.getRepositoryUrl();
            R4EGerritPlugin.Ftracer.traceInfo("\t template.label: " + template.label + "\t repo label: "
                    + aTaskRepo.getRepositoryLabel() + " repo getname: " + convertedRemoteURL);
            //Test the name and the remoteURL to reduce duplications
            if (template.label.equals(aTaskRepo.getRepositoryLabel())
                    || template.repositoryUrl.equals(convertedRemoteURL)) {
                found = true;
                break;
            }
        }

        if (!found) {
            //Set each parameter of the Gerrit server
            String userName = aTaskRepo.getUserName();
            Boolean anonymous = (userName != null && !userName.isEmpty()) ? false : true;

            //Create a repository template
            RepositoryTemplate templateTest = new RepositoryTemplate(aTaskRepo.getRepositoryLabel(),
                    aTaskRepo.getRepositoryUrl(), aTaskRepo.getCharacterEncoding(), aTaskRepo.getVersion(), "", "",
                    "", aTaskRepo.getUserName(), anonymous, true);

            //Set the attributes 
            Map<String, String> attributes = aTaskRepo.getProperties();

            Set<Entry<String, String>> value = attributes.entrySet();
            for (Map.Entry<String, String> entry : value) {
                templateTest.addAttribute(entry.getKey(), entry.getValue());
            }
            templateManager.addTemplate(GerritConnector.CONNECTOR_KIND, templateTest);

        }
    }

    private void printRepositoryTemplate() {
        RepositoryTemplateManager templateManager = TasksUiPlugin.getRepositoryTemplateManager();
        for (RepositoryTemplate template : templateManager.getTemplates(GerritConnector.CONNECTOR_KIND)) {
            R4EGerritPlugin.Ftracer.traceInfo("------------======================------------------");
            Set<Entry<String, String>> value = template.getAttributes().entrySet();
            for (Map.Entry<String, String> entry : value) {
                R4EGerritPlugin.Ftracer.traceInfo("key: " + entry.getKey() + "\tvalue: " + entry.getValue());
            }
        }
    }

    private void printTaskRepository(TaskRepository aTask) {
        Set<Entry<String, String>> value = aTask.getProperties().entrySet();
        for (Map.Entry<String, String> entry : value) {
            R4EGerritPlugin.Ftracer.traceInfo("TaskRepo key: " + entry.getKey() + "\tvalue: " + entry.getValue());
        }
        R4EGerritPlugin.Ftracer.traceInfo(" UserName: " + aTask.getUserName());
        R4EGerritPlugin.Ftracer.traceInfo("===================================");
    }

    /**
     * This method use the Gerrit from the git server in the workspace
     */
    private void addWorkspaceGerritRepo() {
        RepositoryUtil repoUtil = org.eclipse.egit.core.Activator.getDefault().getRepositoryUtil();
        List<String> repoPaths = repoUtil.getConfiguredRepositories();
        RepositoryCache repositoryCache = org.eclipse.egit.core.Activator.getDefault().getRepositoryCache();
        Repository repo = null;

        for (String repoPath : repoPaths) {
            R4EGerritPlugin.Ftracer.traceInfo("List Gerrit repository: " + repoPath);
            File gitDir = new File(repoPath);
            if (!gitDir.exists()) {
                R4EGerritPlugin.Ftracer.traceInfo("Gerrit repository do not exist: " + gitDir.getPath());
                continue;
            }
            try {
                repo = repositoryCache.lookupRepository(gitDir);
                R4EGerritPlugin.Ftracer.traceInfo("\trepository config after lookup: " + repo.getConfig());
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (repo != null) {
                Config config = new Config(repo.getConfig());
                //Look to get the remotes URL
                Set<String> remotes = config.getSubsections(ConfigConstants.CONFIG_REMOTE_SECTION);
                for (String remote : remotes) {
                    String remoteURL = config.getString(ConfigConstants.CONFIG_REMOTE_SECTION, remote,
                            ConfigConstants.CONFIG_KEY_URL);
                    R4EGerritPlugin.Ftracer.traceInfo("\t\t " + remote + " -> remoteURL: " + remoteURL);

                    //Test if this is a Gerrit server and add it to the Dialogue combo
                    String convertedRemoteURL = getReformatGerritServer(remoteURL);
                    if (null != convertedRemoteURL) {
                        TaskRepository taskRepo = new TaskRepository(GerritConnector.CONNECTOR_KIND,
                                convertedRemoteURL);
                        taskRepo.setRepositoryLabel(convertedRemoteURL);
                        fResultTask.put(taskRepo, taskRepo.getRepositoryUrl());
                        adjustTemplatemanager(taskRepo);

                    }
                }
            }
        }
    }

    //Note the Gerrit server for "git.eclipse.org" in config is 
    //      not the same as in the task Repository: "git.eclipse.org/r"
    /**
     * Verify if the gerrit remote URL has the gerrit port (29418 )
     * @param aRemoteURL
     * @return String remote converted URL
     */
    private String getReformatGerritServer(String aRemoteURL) {
        //Test if this is a Gerrit server or not
        String[] strParsePort = aRemoteURL.split(GERRIT_PORT);
        if (strParsePort.length == 2) {
            //Do not convert it for now
            return aRemoteURL;
            //         //We found a Gerrit server, lets build the URL
            //         //String[] strParseServer = strParsePort[0].split(AT);
            //         int index = strParsePort[0].indexOf(AT);
            //         String server = strParsePort[0].substring(++index);
            //         StringBuilder sb = new StringBuilder();
            //         sb.append(HTTPS);
            //         sb.append(server);
            //         return sb.toString();
        }
        return null;
    }

    private File getLastGerritFile() {
        IPath ipath = R4EGerritUi.getDefault().getStateLocation();
        String fileName = ipath.append(LAST_GERRIT_FILE).toPortableString();
        File file = new File(fileName);
        return file;
    }

    // ------------------------------------------------------------------------
    // Methods Public
    // ------------------------------------------------------------------------
    public static R4EGerritServerUtility getDefault() {
        if (instance == null) {
            new R4EGerritServerUtility();
        }
        return instance;
    }

    /**
     * Return the mapping of the available Gerrit server used in the user workspace
     * @return Map<Repository, String>
     */
    public static Map<TaskRepository, String> getGerritMapping() {
        return fResultTask;
    }

    /**
     * Save the selected Gerrit server URL
     * @param aURL
     * @return Boolean
     */
    public Boolean saveLastGerritServer(String aURL) {
        Boolean ok = true;
        File file = getLastGerritFile();
        try {
            FileWriter fw = new FileWriter(file);
            BufferedWriter out = new BufferedWriter(fw);
            out.write(aURL);
            out.close();
        } catch (IOException e1) {
            e1.printStackTrace();
            ok = false;
        }

        return ok;
    }

    /**
     * Return the last selected Gerrit server used
     * @return String
     */
    public String getLastSavedGerritServer() {
        String lastGerritURL = null;
        File file = getLastGerritFile();
        if (file != null) {
            try {
                FileReader fr = new FileReader(file);
                BufferedReader in = new BufferedReader(fr);
                lastGerritURL = in.readLine();
                in.close();
            } catch (IOException e1) {
                //When there is no file, 
                //e1.printStackTrace();
            }
        }
        return lastGerritURL;
    }

    /**
     * Get the Gerrit URL based on the provided string
     * 
     * @param  Menu string aSt
     * @return URL as a string
     * 
     */
    public String getMenuSelectionURL(String aSt) {
        String urlStr = null;
        if (!fResultTask.isEmpty()) {
            Set<TaskRepository> mapSet = fResultTask.keySet();
            R4EGerritPlugin.Ftracer.traceInfo("-------------------");
            for (TaskRepository key : mapSet) {
                if (key.getRepositoryLabel().equals(aSt)) {
                    urlStr = fResultTask.get(key);

                    R4EGerritPlugin.Ftracer
                            .traceInfo("Map Key: " + key.getRepositoryLabel() + "\t URL: " + fResultTask.get(key));
                    return urlStr;
                }
            }
        }

        return urlStr;
    }

    /**
     * Get the Gerrit task Repository
     * 
     * @param  string aSt
     * @return TaskRepository
     * 
     */
    public TaskRepository getTaskRepo(String aStURL) {

        if (aStURL != null && !fResultTask.isEmpty()) {
            Set<TaskRepository> mapSet = fResultTask.keySet();
            R4EGerritPlugin.Ftracer.traceInfo("-------------------");
            for (TaskRepository key : mapSet) {
                if (key.getRepositoryUrl().equals(aStURL)) {

                    R4EGerritPlugin.Ftracer.traceInfo(
                            "Key label : " + key.getRepositoryLabel() + "\t URL: " + fResultTask.get(key));
                    return key;
                }
            }
        }

        return null;
    }

    /**
     * Read the Gerrit server to populate the list of reviews
     */
    public void getReviewListFromServer() {
        //Get the Gerrit URL to query
        String urlToUsed = getLastSavedGerritServer();

        if (urlToUsed != null) {
            //Initiate the request to populate the list of Reviews
            R4EGerritPlugin.Ftracer
                    .traceInfo("use the following Gerrit URL to populate the list of reviews: " + urlToUsed);

            // TODO: Make it pick the right repository
            Set<TaskRepository> gerritRepositories = fResultTask.keySet();
            Iterator<TaskRepository> it = gerritRepositories.iterator();
            if (it.hasNext()) {
                TaskRepository repository = it.next();
                //       List<R4EGerritReviewSummary> reviews = getReviewListFromRepository(repository, GerritQuery.MY_WATCHED_CHANGES);
                // TODO: populate the Gerrit Dashboard with 'reviews'
            }
        } else {
            //Open the dialogue to populate a Gerrit server, Should not happen here
            R4EGerritPlugin.Ftracer.traceInfo("Need to open the dialogue to populate a gerrit server");
        }
    }
    //
    //    /**
    //     * 
    //     */
    //    public static List<R4EGerritReviewSummary> getReviewListFromRepository(TaskRepository repository, String query) {
    //        List<R4EGerritReviewSummary> results = new ArrayList<R4EGerritReviewSummary>();
    //        R4EGerritQueryHandler handler = new R4EGerritQueryHandler(repository, query);
    //        IStatus status = handler.performQuery();
    //        if (status.isOK()) {
    //            for (R4EGerritReviewSummary summary : handler.getQueryResult()) {
    //                if (summary.getAttribute(R4EGerritReviewSummary.DATE_COMPLETION) == null) {
    //                    R4EGerritPlugin.Ftracer.traceInfo(summary.toString());
    //                    results.add(summary);
    //                }
    //            }
    //        }
    //        return results;
    //    }

    /******************************************************************/
    /******************************************************************/
    /******************************************************************/
    /******************************************************************/
    /********  TEST   *************************************************/
    /******************************************************************/
    /******************************************************************/
    /******************************************************************/
    /******************************************************************/

    private void testTaskRepo() {
        //   TaskRepository repository = new TaskRepository(GerritConnector.CONNECTOR_KIND, "http://repository"); //$NON-NLS-1$
        //      final TaskRepository repository = new TaskRepository(GerritConnector.CONNECTOR_KIND, "https://"); //$NON-NLS-1$

        final TaskRepository repository = getTaskRepository(); //$NON-NLS-1$
        R4EGerritPlugin.Ftracer.traceInfo("repository:   " + repository.getUrl()); //$NON-NLS-1$
        //      int ret = TasksUiUtil.openEditRepositoryWizard(repository); //Generate a null pointer for the workbench window

        R4EGerritPlugin.Ftracer.traceInfo("Before: repository url:   " + repository.getUrl()); //$NON-NLS-1$

    }

    /**
     * Look at the current Gerrit repository and return a default value 
     * i.e the first Gerrit if found ???
     * @return TaskRepository
     */
    private TaskRepository getTaskRepository() {
        TaskRepository taskRepo = null;
        /**
         * Field DEFAULT_REPOSITORY. (value is ""https://repository"")
         */
        String DEFAULT_REPOSITORY = "https://";
        //Reset the list of Gerrit server
        fResultTask.clear();

        //Test to read the TaskRepositories

        TaskRepositoryManager repositoryManager = TasksUiPlugin.getRepositoryManager();

        //List all repositories in the the TaskRepositories view
        List<TaskRepository> listallRepo = repositoryManager.getAllRepositories();
        for (int i = 0; i < listallRepo.size(); i++) {
            R4EGerritPlugin.Ftracer.traceInfo(
                    "TaskRepositoryManager repository: [ " + i + " ] : " + listallRepo.get(i).getRepositoryLabel());
        }

        //Only get the TaskRepository related to Gerrit review connnector
        R4EGerritPlugin.Ftracer.traceInfo("--------Review repo ---------------");
        Set<TaskRepository> reviewRepo = repositoryManager.getRepositories(GerritConnector.CONNECTOR_KIND);
        for (TaskRepository tp : reviewRepo) {
            R4EGerritPlugin.Ftracer.traceInfo(
                    "Only Gerrit Review repo: " + tp.getRepositoryLabel() + "\t url: " + tp.getRepositoryUrl());
        }

        //Testing bugzilla but need to add the mylyn bugzilla in plugin dependencies
        //      for (RepositoryTemplate template : templateManager.getTemplates(BugzillaCorePlugin.CONNECTOR_KIND)) {
        //         R4EGerritPlugin.Ftracer.traceInfo("Gerrit Bugzilla repository: " + template.label + "\t URL: " + template.repositoryUrl);
        //      }

        return taskRepo;
    }

}