private boolean explode()

in tools/cli/src/main/java/org/apache/batchee/cli/command/JobOperatorCommand.java [376:427]


    private boolean explode(final File source, final File target) {
        final File parentDir = target.getAbsoluteFile().getParentFile();
        final File timestamp = new File(parentDir, target.getName() + ".timestamp.txt");

        long ts = Long.MIN_VALUE;

        if (target.exists()) {
            if (timestamp.exists()) {
                ts = getTimestampFromFile(timestamp);
            }
        }

        final long sourceLastModifiedTst = source.lastModified();
        if (ts == Long.MIN_VALUE || ts < sourceLastModifiedTst) {
            FileLock lock = null;
            if (!parentDir.exists()) {
                parentDir.mkdirs();
            }
            final File lockFile = new File(parentDir, target.getName() + ".batchee.lock");
            if (lockFile.exists() && lockFile.lastModified() > (new Date().getTime() - TimeUnit.SECONDS.toMillis(5) )) {
                return false;
            }

            try (FileOutputStream fileOutputStream = new FileOutputStream(lockFile)) {
                FileChannel channel = fileOutputStream.getChannel();
                lock = channel.tryLock();
                if (lock == null) {
                    return false;
                }

                if (timestamp.exists()) {
                    ts = getTimestampFromFile(timestamp);
                }

                // check timestamp again
                if (ts == Long.MIN_VALUE || ts < sourceLastModifiedTst) {
                    FileUtils.deleteDirectory(target);
                    Zips.unzip(source, target);
                    FileUtils.write(timestamp, Long.toString(sourceLastModifiedTst));
                }
                lock.release();
            } catch (final IOException e) {
                return false;
            } finally {
                if (lockFile.exists()) {
                    lockFile.delete();
                }
            }
        }

        return true;
    }