ApplyPatchGui.java :  » Linux » pagavcs » hu » pagavcs » gui » Java Open Source

Java Open Source » Linux » pagavcs 
pagavcs » hu » pagavcs » gui » ApplyPatchGui.java
package hu.pagavcs.gui;

import hu.pagavcs.bl.Cancelable;
import hu.pagavcs.bl.Manager;
import hu.pagavcs.bl.ThreadAction;
import hu.pagavcs.gui.platform.EditField;
import hu.pagavcs.gui.platform.Frame;
import hu.pagavcs.gui.platform.GuiHelper;
import hu.pagavcs.gui.platform.Label;
import hu.pagavcs.gui.platform.ProgressBar;
import hu.pagavcs.operation.ApplyPatchOperation;
import hu.pagavcs.operation.GeneralStatus;
import hu.pagavcs.operation.ResolveConflict;

import java.awt.event.ActionEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;

import org.tmatesoft.svn.core.SVNException;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;

/**
 * PagaVCS 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 2 of the License, or (at your option) any later
 * version.<br>
 * <br>
 * PagaVCS 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.<br>
 * <br>
 * You should have received a copy of the GNU General Public License along with
 * PagaVCS; If not, see http://www.gnu.org/licenses/.
 */
public class ApplyPatchGui implements Working, Cancelable {

  private ApplyPatchOperation other;
  private JLabel              lblStatus;
  private Frame               frame;
  private EditField           sfRepo;
  private EditField           sfWorkingCopy;
  private JButton             btnShowLog;
  private ProgressBar         prgBusy;
  private JButton             btnApplyPatch;

  public ApplyPatchGui(ApplyPatchOperation other) {
    this.other = other;
  }

  public void display() throws SVNException {
    FormLayout layout = new FormLayout("right:p, 2dlu,p:g, p", "p,2dlu,p,2dlu,p,4dlu,p,2dlu,p,4dlu,p,2dlu,p,4dlu,p,2dlu,p,4dlu,p,4dlu,p");
    JPanel pnlMain = new JPanel(layout);
    CellConstraints cc = new CellConstraints();

    Label lblWorkingCopy = new Label("Path:");
    sfWorkingCopy = new EditField(other.getPath());
    sfWorkingCopy.setEditable(false);
    Label lblRepo = new Label("Repository:");
    sfRepo = new EditField();
    sfRepo.setEditable(false);
    btnShowLog = new JButton(new ShowLogAction());

    btnApplyPatch = new JButton(new ApplyPatchAction());

    lblStatus = new Label(" ");
    prgBusy = new ProgressBar(this);

    pnlMain.add(lblWorkingCopy, cc.xywh(1, 1, 1, 1));
    pnlMain.add(sfWorkingCopy, cc.xywh(3, 1, 2, 1));
    pnlMain.add(lblRepo, cc.xywh(1, 3, 1, 1));
    pnlMain.add(sfRepo, cc.xywh(3, 3, 2, 1));
    pnlMain.add(btnShowLog, cc.xywh(4, 5, 1, 1));

    pnlMain.add(new JSeparator(), cc.xywh(1, 6, 4, 1));
    pnlMain.add(btnApplyPatch, cc.xywh(4, 7, 1, 1));

    pnlMain.add(new JSeparator(), cc.xywh(1, 8, 4, 1));
    pnlMain.add(prgBusy, cc.xywh(1, 9, 3, 1));
    pnlMain.add(lblStatus, cc.xywh(4, 9, 1, 1));

    frame = GuiHelper.createAndShowFrame(pnlMain, "Other", "/hu/pagavcs/resources/other-app-icon.png");
    frame.setTitlePrefix(other.getPath());
  }

  public void setStatus(GeneralStatus status) {
    lblStatus.setText("Status: " + status.toString());
  }

  public void close() {
    frame.setVisible(false);
    frame.dispose();
  }

  public void setURL(String text) {
    sfRepo.setText(text);
  }

  private void doApplyPatch(String path) throws Exception {
    JFileChooser fc = new JFileChooser(new File(other.getPath()));
    fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
    int choosed = fc.showSaveDialog(frame);
    if (choosed == JFileChooser.APPROVE_OPTION) {

      File baseDirCandiate = new File(path);
      if (!baseDirCandiate.isDirectory()) {
        baseDirCandiate = baseDirCandiate.getParentFile();
      }

      final File baseDir = baseDirCandiate;
      File file = fc.getSelectedFile();

      String result = Manager.getOsCommandResult(baseDir, "lsdiff", file.getPath());
      // TODO display file names, select from files

      List<String> lstFilesToPatch = new ArrayList<String>();
      for (String filename : result.split("\n")) {
        lstFilesToPatch.add(filename);
      }
      Manager.getOsCommandResult(baseDir, "patch", "-p0", "--no-backup-if-mismatch", "-U", "-i", file.getPath());
      /*
       * example output: patching file a Hunk #1 FAILED at 9. 1 out of 1
       * hunk FAILED -- saving rejects to file a.rej
       */

      // find rejected files
      List<String> lstRejected = new ArrayList<String>();
      for (String fileName : lstFilesToPatch) {
        File f = new File(baseDir, fileName + ".rej");
        if (f.exists() && f.isFile()) {
          lstRejected.add(fileName);
        }
      }

      List<String> lstUnresolved = new ArrayList<String>();
      for (String fileName : lstRejected) {
        /*
         * example output: 1 unresolved conflict found
         */
        String output = Manager.getOsCommandResult(baseDir, "wiggle", "--replace", fileName, fileName + ".rej");
        if (output.contains("unresolved conflict")) {
          lstUnresolved.add(fileName);
        }
      }

      for (final String fileName : lstUnresolved) {

        Refreshable li = new Refreshable() {

          public void refresh() throws Exception {
            // delete .rej and .porig files if everything was
            // successful
            new File(baseDir, fileName + ".rej").delete();
            new File(baseDir, fileName + ".porig").delete();
          }
        };
        ResolveConflict resolveConflict = new ResolveConflict(li, baseDir.getPath() + "/" + fileName, true);
        resolveConflict.execute();
      }
    }
  }

  public void workStarted() {
    setStatus(GeneralStatus.WORKING);
  }

  public void workEnded() {
    setStatus(GeneralStatus.COMPLETED);
  }

  private class ApplyPatchAction extends ThreadAction {

    public ApplyPatchAction() {
      super("Apply patch");
    }

    public void actionProcess(ActionEvent e) throws Exception {
      doApplyPatch(other.getPath());
    }

  }

  private class ShowLogAction extends ThreadAction {

    public ShowLogAction() {
      super("Show log");
    }

    public void actionProcess(ActionEvent e) throws Exception {
      other.doShowLog(sfWorkingCopy.getText());
    }

  }

  public boolean isCancel() {
    return other.isCancel();
  }

  public void setCancel(boolean cancel) throws Exception {
    other.setCancel(true);
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.