/** * This file is part of CloudML [ http://cloudml.org ] * * Copyright (C) 2012 - SINTEF ICT * Contact: Franck Chauvel <franck.chauvel@sintef.no> * * Module: root * * CloudML is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * CloudML 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with CloudML. If not, see * <http://www.gnu.org/licenses/>. */ package org.cloudml.connectors.util; import com.aragost.javahg.RepositoryConfiguration; import com.aragost.javahg.commands.AddCommand; import com.aragost.javahg.commands.CommitCommand; import com.aragost.javahg.commands.PushCommand; import org.apache.commons.io.FileUtils; import java.io.*; import java.nio.channels.FileChannel; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import com.aragost.javahg.BaseRepository; /** * On Linux just need your ssh key as .ssh/id_rsa * On windows you need a configuration file where you specify a link to: a ssh tool(such as putty), * the mercurial binary, the mercurial configuration file (Mercurial.ini) which contains the path to the ssh key * Created by nicolasf on 03.09.14. */ public class MercurialConnector { private static final Logger journal = Logger.getLogger(MercurialConnector.class.getName()); public static String endPoint; public static String sshKey; private String directory=""; private String filename=""; private BaseRepository br=null; private RepositoryConfiguration rc=null; public MercurialConnector(String endPoint, String sshKey){ this.endPoint=endPoint; this.sshKey=sshKey; if(!System.getProperty("os.name").toLowerCase().contains("windows")){ directory=System.getProperty("user.dir")+"/nodes"; }else{ directory=System.getProperty("user.dir")+"\\nodes"; } } public void clone(String pathDest){ checkIfExist(pathDest); rc=new RepositoryConfiguration(); if(System.getProperty("os.name").toLowerCase().contains("windows")){ configureMercurial(); } br= BaseRepository.clone(rc,new File(pathDest),endPoint); } private void configureMercurial(){ MercurialProperties mp= MercurialProperties.load(); if(mp!=null){ rc.setHgBin(mp.getHgBin()); rc.setSshBin(mp.getSshBin()); rc.setHgrcPath(mp.getHgConf()); } } private Boolean checkIfExist(String pathDest){ File directory = new File(pathDest); //return deleteDirectory(directory); return FileUtils.deleteQuietly(directory); } public void commit(String username, String message){ CommitCommand cc=new CommitCommand(br); cc.message("\"" + message + "\""); cc.user(username); cc.execute(); } public void add(){ AddCommand ac=new AddCommand(br); ac.execute(); } public void push(String username){ PushCommand pc=new PushCommand(br); try { pc.execute(); } catch (IOException e) { e.printStackTrace(); } } public void addFile(String file, String username) { clone("./nodes"); journal.log(Level.INFO, ">> Repository cloned"); File f =new File(file); filename=f.getName(); copyFile(f); add(); journal.log(Level.INFO, ">> File added"); rc.setSshBin(null); commit(username, "updated by CloudML"); journal.log(Level.INFO, ">> Commit"); push(username); journal.log(Level.INFO, ">> Push"); } private void copyFile(File f){ FileChannel sourceChannel = null; FileChannel destChannel = null; try { sourceChannel = new FileInputStream(f).getChannel(); String destPath; if(!System.getProperty("os.name").toLowerCase().contains("windows")){ destPath=directory+"/"+filename; }else{ destPath=directory+"\\"+filename; } File destFile=new File(destPath); if(!destFile.exists()) { destFile.createNewFile(); } destChannel = new FileOutputStream(destFile).getChannel(); destChannel.transferFrom(sourceChannel, 0, sourceChannel.size()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static class MercurialProperties { public String getHgBin() { return hgBin; } public String getSshBin() { return sshBin; } public String getHgConf() { return hgConf; } private String hgBin; private String sshBin; private String hgConf; public MercurialProperties(String hgBin, String sshBin, String hgConf) { this.hgBin=hgBin; this.hgConf=hgConf; this.sshBin=sshBin; } public static MercurialProperties load() { Properties prop = new Properties(); InputStream input = null; MercurialProperties properties=null; try { input = new FileInputStream("mercurial.properties"); // load a properties file prop.load(input); // get the property String hgBin= prop.getProperty("hgBin"); String hgConf = prop.getProperty("hgConf"); String sshBin = prop.getProperty("sshBin"); properties = new MercurialProperties(hgBin, sshBin,hgConf); } catch (IOException ex) { journal.log(Level.INFO, ">> mercurial.properties not found!!"); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } return properties; } } }