org.omegat.convert.ConvertProject26to37team.java Source code

Java tutorial

Introduction

Here is the source code for org.omegat.convert.ConvertProject26to37team.java

Source

/**************************************************************************
 OmegaT - Computer Assisted Translation (CAT) tool 
      with fuzzy matching, translation memory, keyword search, 
      glossaries, and translation leveraging into updated projects.
    
 Copyright (C) 2014 Alex Buloichik
           Home page: http://www.omegat.org/
           Support center: http://groups.yahoo.com/group/OmegaT/
    
 This file is part of OmegaT.
    
 OmegaT 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.
    
 OmegaT 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.omegat.convert;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.omegat.core.Core;
import org.omegat.core.data.ProjectProperties;
import org.omegat.core.team2.ProjectTeamSettings;
import org.omegat.core.team2.RebaseAndCommit;
import org.omegat.core.team2.RemoteRepositoryProvider;
import org.omegat.util.OStrings;
import org.omegat.util.ProjectFileStorage;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnGetInfo;
import org.tmatesoft.svn.core.wc2.SvnInfo;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.core.wc2.SvnTarget;

import gen.core.project.RepositoryDefinition;
import gen.core.project.RepositoryMapping;

/**
 * Check if project is 2.6-style team project, i.e. 'inplace' repository working copy exit. Then convert it
 * into 3.6-style team project.
 * 
 * @author Alex Buloichik (alex73mail@gmail.com)
 */
public class ConvertProject26to37team {
    public static void checkTeam(File projectRootFolder) throws Exception {
        if (isSVNDirectory(projectRootFolder) || isGITDirectory(projectRootFolder)) {
            // project is 2.6-style team project
            if (isConsoleMode()) {
                Core.getMainWindow().displayWarningRB("TEAM_26_TO_37_CONSOLE");
                return;
            }

            // ask for convert
            int res = JOptionPane.showConfirmDialog(Core.getMainWindow().getApplicationFrame(),
                    OStrings.getString("TEAM_26_to_37_CONFIRM_MESSAGE"),
                    OStrings.getString("TEAM_26_to_37_CONFIRM_TITLE"), JOptionPane.OK_CANCEL_OPTION);
            if (res != JOptionPane.OK_OPTION) {
                return;
            }

            // convert
            convert(projectRootFolder);
            JOptionPane.showMessageDialog(Core.getMainWindow().getApplicationFrame(),
                    OStrings.getString("TEAM_26_to_37_CONVERTED_MESSAGE"),
                    OStrings.getString("TEAM_26_to_37_CONFIRM_TITLE"), JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private static void convert(File projectRootFolder) throws Exception {
        ProjectProperties props = ProjectFileStorage.loadProjectProperties(projectRootFolder);

        String version;
        String url;
        RepositoryDefinition def = new RepositoryDefinition();
        if (isSVNDirectory(projectRootFolder)) {
            url = getSVNUrl(projectRootFolder);
            def.setType("svn");
            version = getSVNTmxVersion(projectRootFolder);
        } else {
            url = getGITUrl(projectRootFolder);
            def.setType("git");
            version = getGITTmxVersion(projectRootFolder);
        }
        if (url == null) {
            throw new Exception("Repository URL not defined");
        }
        def.setUrl(url);
        saveVersion(projectRootFolder, "omegat/project_save.tmx", version);

        // map full project
        RepositoryMapping map = new RepositoryMapping();
        map.setLocal("");
        map.setRepository("");
        def.getMapping().add(map);
        props.setRepositories(new ArrayList<RepositoryDefinition>());
        props.getRepositories().add(def);

        ProjectFileStorage.writeProjectFile(props);

        // all data saved - remove old repository
        FileUtils.deleteDirectory(new File(projectRootFolder, ".svn"));
        FileUtils.deleteDirectory(new File(projectRootFolder, ".git"));
    }

    /**
     * Save version of project_save.tmx to .repositories/versions.properties.
     */
    private static void saveVersion(File projectRootFolder, String file, String version) throws IOException {
        ProjectTeamSettings teamSettings = new ProjectTeamSettings(
                new File(projectRootFolder, RemoteRepositoryProvider.REPO_SUBDIR));
        teamSettings.set(RebaseAndCommit.VERSION_PREFIX + file, version);
    }

    /**
     * Check if project contains 2.6-style SVN directory.
     */
    private static boolean isSVNDirectory(File projectRootFolder) {
        File svnDir = new File(projectRootFolder, ".svn");
        return svnDir.exists() && svnDir.isDirectory();
    }

    /**
     * Check if project contains 2.6-style GIT directory.
     */
    private static boolean isGITDirectory(File projectRootFolder) {
        File gitDir = new File(projectRootFolder, ".git");
        return gitDir.exists() && gitDir.isDirectory();
    }

    /**
     * Get repository URL for SVN.
     */
    private static String getSVNUrl(File wc) throws Exception {
        final SvnOperationFactory of = new SvnOperationFactory();
        final SvnGetInfo infoOp = of.createGetInfo();
        infoOp.setSingleTarget(SvnTarget.fromFile(wc));
        infoOp.setDepth(SVNDepth.EMPTY);
        infoOp.setRevision(SVNRevision.WORKING);
        final SvnInfo info = infoOp.run();
        SVNURL svn = info.getUrl();
        return svn.toString();
    }

    /**
     * Get repository URL for SVN.
     */
    private static String getGITUrl(File wc) throws Exception {
        Repository repository = Git.open(wc).getRepository();
        StoredConfig config = repository.getConfig();
        return config.getString("remote", "origin", "url");
    }

    /**
     * Get version of "omegat/project_save.tmx" in SVN.
     */
    private static String getSVNTmxVersion(File wc) throws Exception {
        final SvnOperationFactory of = new SvnOperationFactory();
        final SvnGetInfo infoOp = of.createGetInfo();
        infoOp.setSingleTarget(SvnTarget.fromFile(new File(wc, "omegat/project_save.tmx")));
        infoOp.setDepth(SVNDepth.EMPTY);
        SvnInfo info = infoOp.run();
        long r = info.getRevision();
        return Long.toString(r);
    }

    /**
     * Get version of "omegat/project_save.tmx" in GIT.
     */
    private static String getGITTmxVersion(File wc) throws Exception {
        Repository repository = Git.open(wc).getRepository();
        try (RevWalk walk = new RevWalk(repository)) {
            Ref localBranch = repository.findRef("HEAD");
            RevCommit headCommit = walk.lookupCommit(localBranch.getObjectId());
            return headCommit.getName();
        }
    }

    /**
     * Check if executed in console mode.
     */
    private static boolean isConsoleMode() {
        try {
            Core.getMainWindow().getApplicationFrame();
            return false;
        } catch (NoSuchMethodError ex) {
            return true;
        }
    }
}