Newer
Older
IoTP / src / main / java / info / istlab / IoTP / App.java
@motoki miura motoki miura on 25 Mar 2023 6 KB v030
package info.istlab.IoTP;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.ArrayList;

/**
 * Hello world!
 *
 */
public class App {
    static String userhome;
    static ArrayList<File> iotDirs;

    static String workingDir;

    public static String latestVersion;
    public static Path execPath;
    public static String downloadurl = "https://cit.istlab.info/IoTP/target/";
    public static boolean isWindows;
    public static String serialName;

    static {
        userhome = System.getProperty("user.home");
        String os = System.getProperty("os.name").toLowerCase();
        isWindows = os.contains("windows");
    }

    public static void main(String[] args) {
        try {
            App.execPath = getApplicationPath(new App().getClass());
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        // IoTPフォルダを探す
        iotDirs = new ArrayList<File>();
        findDotGitFileRecursive(new File(userhome), iotDirs, 0); // 指定フォルダ以下の.gitを探索する

        FolderSelector<File> fs = new FolderSelector<File>(iotDirs, "フォルダが複数みつかりました。フォルダを選択してください。",
                "フォルダが1つもみつかりませんでした");
        File ret = fs.getSelectedItem();
        if (ret == null)
            System.exit(0);
        workingDir = ret.getAbsolutePath();
        System.out.println(ret);
        new Launcher(ret).setVisible(true);
    }

    public static void findDotGitFileRecursive(File dir, ArrayList<File> iotDirs, int level) {
        if (level > 3)
            return;
        // System.out.println("checking " + dir.getAbsolutePath());
        File[] list = dir.listFiles(new FileFilter() {
            public boolean accept(File path) {
                return (path.isDirectory());
            }
        });
        if (list == null)
            return;
        for (File tempdir : list) {
            // if (tempdir.getName().equals(".git")) {
            if (tempdir.getName().equals("SampleSrc")) {
                iotDirs.add(tempdir);
            } else {
                findDotGitFileRecursive(tempdir, iotDirs, level + 1);
            }
        }
    }

    public static Path getApplicationPath(Class<?> cls) throws URISyntaxException {
        ProtectionDomain pd = cls.getProtectionDomain();
        CodeSource cs = pd.getCodeSource();
        URL location = cs.getLocation();
        URI uri = location.toURI();
        Path path = Paths.get(uri);
        return path;
    }

    public static boolean isLatest() {
        // 最初に、ダウンロードサイトから最新版の情報を得る
        // 更新があれば、ダウンロードし、ファイルを表示する。
        StringBuilder sb = new StringBuilder();
        latestVersion = null;
        try {
            URL url = new URL(downloadurl);
            InputStream is = url.openConnection().getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line = null;
            while ((line = reader.readLine()) != null) {
                if (latestVersion == null) {
                    latestVersion = line.trim();
                    System.out.println(line);
                }
                sb.append(line + "\n");
            }
            reader.close();
        } catch (Exception ex) {
        }
        // System.out.println(sb.toString());
        // 同じかどうかチェック
        System.out.println("[" + latestVersion + "]"); // [IoTP-0.18-launcher.jar]
        // System.out.println("=" + execPath.getFileName() + "=");
        if (execPath.getFileName().toString().equals("classes"))
            return true; // exec:javaで起動しているので、へんな場所にダウンロードしないように、ダウンロード抑制する。
        // if (latestVersion.indexOf("0-") > -1) { //デバッグ用:バージョン番号が 0.180 のように、0で終わる時は、常に更新するためfalseを返す
        //     return false;
        // }
        return latestVersion.equals(execPath.getFileName().toString());
    }

    // ダウンロードして実行パーミッションをつける
    public static String download() {
        try {
            URL url = new URL(downloadurl + "/" + latestVersion);
            ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
            FileOutputStream fileOutputStream = new FileOutputStream(latestVersion);
            FileChannel fileChannel = fileOutputStream.getChannel();
            fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
            fileChannel.close();
            fileOutputStream.close();

            File execjar = new File(execPath.getParent().toString() + File.separator + latestVersion);
            execjar.setExecutable(true);
            return execjar.getAbsolutePath();
        } catch (Exception ex) {
        } finally {
        }
        return null;
    }

    public static void reboot(String pathfile) {
        String com;
        ProcessBuilder processBuilder;
        if (App.isWindows){
            pathfile = pathfile.replaceAll("\\\\","\\\\\\\\"); 
            com = "java -jar " + new File(pathfile).getName();
            processBuilder = new ProcessBuilder("cmd", "/c", com);
        } else {
            com = "sleep 1 ; java -jar " + pathfile;
            processBuilder = new ProcessBuilder("bash", "-c", com);
        }
        System.out.println(com);
        try {
            processBuilder.start();
        } catch (Exception ex) {
        }
        Thread t = new Thread(Launcher.theapp);
        t.start();
    }


}