fi.jumi.launcher.daemon.DirBasedSteward.java Source code

Java tutorial

Introduction

Here is the source code for fi.jumi.launcher.daemon.DirBasedSteward.java

Source

// Copyright  2011-2014, Esko Luontola <www.orfjackal.net>
// This software is released under the Apache License 2.0.
// The license text is at http://www.apache.org/licenses/LICENSE-2.0

package fi.jumi.launcher.daemon;

import fi.jumi.core.ipc.dirs.UniqueDirectories;
import org.apache.commons.io.IOUtils;

import javax.annotation.concurrent.NotThreadSafe;
import java.io.*;
import java.nio.file.*;

@NotThreadSafe
public class DirBasedSteward implements Steward {

    private static final String DAEMONS_DIR = "daemons";

    private final DaemonJar daemonJar;

    public DirBasedSteward(DaemonJar daemonJar) {
        this.daemonJar = daemonJar;
    }

    @Override
    public Path createDaemonDir(Path jumiHome) {
        try {
            return UniqueDirectories.createUniqueDir(jumiHome.resolve(DAEMONS_DIR), System.currentTimeMillis());
        } catch (IOException e) {
            throw new RuntimeException("Unable to create daemon directory", e);
        }
    }

    @Override
    public Path getDaemonJar(Path jumiHome) {
        Path extractedJar = jumiHome.resolve("lib/" + daemonJar.getDaemonJarName());
        createIfDoesNotExist(extractedJar);
        return extractedJar;
    }

    private void createIfDoesNotExist(Path extractedJar) {
        try (InputStream embeddedJar = daemonJar.getDaemonJarAsStream()) {
            if (sameSize(extractedJar, embeddedJar)) {
                return;
            }
            copyToFile(embeddedJar, extractedJar);
        } catch (IOException e) {
            throw new RuntimeException("failed to copy the embedded daemon JAR to " + extractedJar, e);
        }
    }

    private static boolean sameSize(Path path, InputStream in) throws IOException {
        return Files.exists(path) && Files.size(path) == in.available();
    }

    private static void copyToFile(InputStream source, Path destination) throws IOException {
        Files.createDirectories(destination.getParent());
        try (OutputStream out = Files.newOutputStream(destination)) {
            IOUtils.copy(source, out);
        }
    }
}