package de.lazyzero.kkMulticopterFlashTool.gui.widgets; import static lu.tudor.santec.i18n.Translatrix._; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Collections; import java.util.Comparator; import java.util.Vector; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import org.apache.commons.io.FileExistsException; import org.kohsuke.github.GHRepository; import org.kohsuke.github.GHTag; import org.kohsuke.github.GitHub; import org.kohsuke.github.PagedIterable; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import de.lazyzero.kkMulticopterFlashTool.KKMulticopterFlashTool; import de.lazyzero.kkMulticopterFlashTool.utils.Zip; import de.lazyzero.kkMulticopterFlashTool.utils.download.Download; public class GithubPanel extends JPanel implements ActionListener{ private static final long serialVersionUID = 1L; public static final int TARGET_CHANGED = 9999; private String repositoryName; private GitHub github; private GHRepository repository; private PagedIterable<GHTag> tags; private Vector<String> versions = new Vector<String>(); private Vector<String> targets = new Vector<String>(); private JComboBox<String> versionsCombobox; private JComboBox<String> targetsCombobox; private JButton downloadVersion; private Vector<GithubPanelListener> githubPanelListeners = new Vector<GithubPanelListener>(); public GithubPanel(String repositoryName) { this.repositoryName = repositoryName; try { github = GitHub.connectAnonymously(); repository = github.getRepository(this.repositoryName); loadVersions(); // downloadArchive(repository.getMasterBranch()); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } initGUI(); } private void loadVersions() throws IOException { versions.removeAllElements(); versions.add(repository.getMasterBranch()); tags = repository.listTags(); for (GHTag tag : tags) { System.out.println(tag.getName() + "/" + tag.getOwner() + "/" + tag.getCommit().getSHA1()); System.out.println(repository.getUrl()+"/archive/"+tag.getName()+".zip"); versions.add(tag.getName()); } } private void initGUI() { //create the CellContraints CellConstraints cc = new CellConstraints(); // create the Layout for Panel this String panelColumns = "pref,3dlu,fill:pref:grow, 3dlu,pref"; String panelRows = "pref,3dlu,pref,3dlu,pref"; FormLayout panelLayout = new FormLayout(panelColumns, panelRows); this.setLayout(panelLayout); //row1 JLabel repositoryNameLabel = new JLabel(_("github.repository.intro") + " " + this.repositoryName); //row3 JLabel versionLabel = new JLabel(_("github.selectversion")); versionsCombobox = new JComboBox<String>(versions); downloadVersion = new JButton(_("downloads.download")); downloadVersion.addActionListener(this); //row5 targetsCombobox = new JComboBox<String>(targets); targetsCombobox.addActionListener(this); this.add(repositoryNameLabel, cc.xyw(1,1,5)); this.add(versionLabel, cc.xy(1, 3)); this.add(versionsCombobox, cc.xy(3, 3)); this.add(downloadVersion, cc.xy(5, 3)); this.add(targetsCombobox, cc.xy(3, 5)); } private void downloadArchive(String version) throws MalformedURLException, FileExistsException { URL zipURL = new URL(repository.getUrl()+"/archive/"+version+".zip"); Download dl; int counter = 0; do { dl = new Download(zipURL, version); while(dl.getStatus() == Download.DOWNLOADING) { notifyGithubPanelListener(Download.DOWNLOADING); System.out.println("downloading :" + dl.getProgress()); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } counter++; } while (dl.getStatus() == Download.ERROR && counter < 3); if (dl.getStatus() == Download.COMPLETE) { String tmpFolder = KKMulticopterFlashTool.getTempFolder(); File zipFile = new File(tmpFolder, version+".zip" ); File toFolder = new File(tmpFolder, "github"); Zip.unzip2folder(zipFile, toFolder); updateTargets(); notifyGithubPanelListener(Download.COMPLETE); } } @Override public void actionPerformed(ActionEvent e) { if (e.getSource().equals(downloadVersion)) { System.out.println("download: " + (String)versionsCombobox.getSelectedItem()); try { downloadArchive((String)versionsCombobox.getSelectedItem()); } catch (FileExistsException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (MalformedURLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else if (e.getSource().equals(targetsCombobox)) { notifyGithubPanelListener(TARGET_CHANGED); } } private void updateTargets() { File f = new File(getPath()); String[] fileList = f.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".inc"); } }); targets.removeAllElements(); for (String name : fileList) { if (!name.startsWith("boot")) { targets.add(name.split(".inc")[0]); } } Collections.sort(targets, new Comparator<String>() { public int compare(String s1, String s2){ return s1.compareTo(s2); } }); targetsCombobox.setSelectedIndex(0); } /** * @param state could be constant of Download or GithubPanel * */ private void notifyGithubPanelListener(int state) { System.out.println("notifyGithubPanelListener: " + state); for (GithubPanelListener githubPanelListener : githubPanelListeners) { githubPanelListener.githubPanelChanged(state); } } public void addGithubPanelListener(GithubPanelListener githubPanelListener) { githubPanelListeners.add(githubPanelListener); } public String getPath() { return KKMulticopterFlashTool.getTempFolder() + "github" + File.separatorChar + "tgy-" + (String)versionsCombobox.getSelectedItem(); } public String getVersion() { return (String)versionsCombobox.getSelectedItem(); } public String getTarget() { return (String)targetsCombobox.getSelectedItem(); } }