Search in sources :

Example 1 with LocalStorageUtil.getSubdirOrFile

use of se.light.assembly64.util.LocalStorageUtil.getSubdirOrFile in project assembly64fx by freabemania.

the class InstallationService method findDestination.

private static String findDestination(char prefix, String dirname, File root) {
    String sourceDir = formatDir(dirname);
    String[] subdirs;
    if (Character.isDigit(prefix)) {
        subdirs = getImmedateSubdirs(LocalStorageUtil.getSubdirOrFile(root, NBR_FOLDER));
    } else {
        subdirs = getImmedateSubdirs(LocalStorageUtil.getSubdirOrFile(root, String.valueOf(prefix)));
    }
    if (subdirs == null) {
        return null;
    }
    for (int i = 0; i < subdirs.length - 1; i++) {
        String from = getFirstPartOfDir(subdirs[i]);
        String to = getFirstPartOfDir(subdirs[i + 1]);
        for (int c = 1; c < CHUNCK_LENGTH; c++) {
            int startOrd = from.charAt(c);
            int endOrd = to.charAt(c);
            int curr = sourceDir.charAt(c);
            String res = checkMatch(curr, startOrd, endOrd, sourceDir, from, to, i, c, subdirs);
            if (res.equals(CONT)) {
                continue;
            } else if (res == BRK) {
                break;
            } else {
                return res;
            }
        }
    }
    if (subdirs.length == 0) {
        return "AAAA - ZZZZ";
    } else {
        return subdirs[subdirs.length - 1];
    }
}
Also used : Support.getTodayDateAsBasicIsoString(se.light.assembly64.Support.getTodayDateAsBasicIsoString)

Example 2 with LocalStorageUtil.getSubdirOrFile

use of se.light.assembly64.util.LocalStorageUtil.getSubdirOrFile in project assembly64fx by freabemania.

the class InstallationService method unpackDynamic.

private void unpackDynamic(File content, LocationAndInstallationStatus location, Artifact entry, ArtifactDelta delta) throws Exception {
    CancelableTask cancelTask = CancelableTask.of();
    LocalStorageUtil.createDir(pathService.getTmpDynFolder());
    unzipService.extractZip(content, pathService.getTmpDynFolder(), entry);
    if (cancelTask.isCancelled()) {
        return;
    }
    File[] files = LocalStorageUtil.getSubdirOrFile(pathService.getTmpDynFolder(), entry.getFolder()).listFiles();
    File base = LocalStorageUtil.getSubdirOrFile(location.getLocation(), entry.getPrefix() + "/" + entry.getFolder());
    Optional<File> releaseLogFile = Arrays.stream(files).filter(item -> item.getName().equals("releaselog.json")).findFirst();
    List<ReleaseInfo> releaseInfoList = null;
    List<ReleaseInfo> matchedReleaseInfoList = new ArrayList<>();
    if (releaseLogFile.isPresent()) {
        releaseInfoList = Support.readList(ReleaseInfo.class, releaseLogFile.get()).stream().collect(Collectors.toList());
        for (ReleaseInfo item : releaseInfoList) {
            String p = item.getPath();
            int start = p.indexOf("/", p.indexOf("/") + 1);
            item.setPath(entry.getPrefix() + "/" + entry.getFolder() + "/" + p.substring(start + 1));
            item.setStrippedPath(entry.getFolder() + "/" + p.substring(start + 1));
        }
    }
    for (File f : files) {
        if (f.isDirectory()) {
            String dirname = f.getName().toUpperCase();
            char firstChar = dirname.charAt(0);
            boolean isDigit = Character.isDigit(firstChar);
            boolean isAlpha = Character.isAlphabetic(firstChar);
            String target = findDestination(firstChar, dirname, base);
            if (target != null) {
                File t = null;
                if (isDigit) {
                    t = new File(base.getAbsolutePath() + "/0-9/" + target + "/" + f.getName());
                } else if (isAlpha) {
                    t = new File(base.getAbsolutePath() + "/" + String.valueOf(firstChar) + "/" + target + "/" + f.getName());
                } else {
                    t = new File(base.getAbsolutePath() + "/___MISC___/" + target + "/" + f.getName());
                }
                FileUtils.forceMkdir(t);
                FileUtils.copyDirectory(f, t);
                if (releaseInfoList != null) {
                    ReleaseInfo matchedReleaseInfo = null;
                    for (ReleaseInfo item : releaseInfoList) {
                        File[] subdirs = f.listFiles(File::isDirectory);
                        for (File dir : subdirs) {
                            if (dir.getPath().contains(item.getStrippedPath())) {
                                matchedReleaseInfo = item;
                                break;
                            }
                        }
                    }
                    if (matchedReleaseInfo != null) {
                        matchedReleaseInfo.setPath(t.getAbsolutePath().substring(base.getAbsolutePath().length() + 1));
                        matchedReleaseInfoList.add(matchedReleaseInfo);
                    }
                }
                ProgressControlWrapper.getInstance().setProgressLabel("Moved " + f.getName() + " to " + t.getAbsolutePath());
                if (cancelTask.isCancelled()) {
                    break;
                }
            } else {
                LOGGER.info("Unable to install " + dirname);
            }
        }
    }
    ProgressControlWrapper.getInstance().increaseProgress();
    if (releaseLogFile.isPresent()) {
        File t = new File(base.getAbsolutePath() + "/releaselog.json");
        LOGGER.info("Flushing rebuildt releaselog.json to " + t.getAbsolutePath());
        Support.flush(matchedReleaseInfoList, t);
    }
}
Also used : ArtifactDelta(se.light.assembly64.model.ArtifactDelta) ReturningTask(se.light.assembly64.model.ReturningTask) Arrays(java.util.Arrays) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) Support.isRemoteArtifact(se.light.assembly64.Support.isRemoteArtifact) StringUtils(org.apache.commons.lang3.StringUtils) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) LatestInstalledItemInfo(se.light.assembly64.model.LatestInstalledItemInfo) Support.getVersionAsInteger(se.light.assembly64.Support.getVersionAsInteger) ArtifactType(se.light.assembly64.model.ArtifactType) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ProgressDBController(se.light.assembly64.fx.ProgressDBController) GuiUtils(se.light.assembly64.util.GuiUtils) Map(java.util.Map) Support(se.light.assembly64.Support) Support.flush(se.light.assembly64.Support.flush) CancelableTask(se.light.assembly64.model.CancelableTask) TrueFileFilter(org.apache.commons.io.filefilter.TrueFileFilter) Support.getObjectMapper(se.light.assembly64.Support.getObjectMapper) ContentEntry(se.light.assembly64.model.ContentEntry) GenericMessageDialogController(se.light.assembly64.fx.GenericMessageDialogController) Analytics(se.light.assembly64.Analytics) Logger(org.slf4j.Logger) ExecutorUtil(se.light.assembly64.util.ExecutorUtil) Set(java.util.Set) IOException(java.io.IOException) FileUtils(org.apache.commons.io.FileUtils) Artifact(se.light.assembly64.model.Artifact) Collectors(java.util.stream.Collectors) LocalStorageUtil(se.light.assembly64.util.LocalStorageUtil) File(java.io.File) ReleaseInfo(se.light.assembly64.model.ReleaseInfo) Platform(javafx.application.Platform) ProgressControlWrapper(se.light.assembly64.fx.ProgressControlWrapper) List(java.util.List) ChronoUnit(java.time.temporal.ChronoUnit) SearchResultItem(se.light.assembly64.model.SearchResultItem) NullWindowOwner(se.light.assembly64.fx.NullWindowOwner) LocalDate(java.time.LocalDate) DateTimeFormatter(java.time.format.DateTimeFormatter) Optional(java.util.Optional) DOWNLOAD_STATUS(se.light.assembly64.service.FTPService.DOWNLOAD_STATUS) ProgressMessageBox(se.light.assembly64.ProgressMessageBox) FILE_ACTION(se.light.assembly64.Support.FILE_ACTION) Support.getTodayDateAsBasicIsoString(se.light.assembly64.Support.getTodayDateAsBasicIsoString) LocationAndInstallationStatus(se.light.assembly64.model.LocationAndInstallationStatus) ArrayList(java.util.ArrayList) ReleaseInfo(se.light.assembly64.model.ReleaseInfo) Support.getTodayDateAsBasicIsoString(se.light.assembly64.Support.getTodayDateAsBasicIsoString) File(java.io.File) CancelableTask(se.light.assembly64.model.CancelableTask)

Example 3 with LocalStorageUtil.getSubdirOrFile

use of se.light.assembly64.util.LocalStorageUtil.getSubdirOrFile in project assembly64fx by freabemania.

the class InstallationService method housekeep.

public void housekeep(File base) {
    GenericMessageDialogController.withInfoProps("Scan was started", "Scanning " + base.getAbsolutePath()).show();
    ReturningTask<Void> task = () -> {
        final AtomicInteger emptyDirs = new AtomicInteger();
        final AtomicInteger emptyFiles = new AtomicInteger();
        for (Artifact entry : artifactsService.getArtifactsDb()) {
            if (artifactsService.isInstalled(base, entry)) {
                boolean emptyDirFound = true;
                while (emptyDirFound) {
                    emptyDirFound = false;
                    for (File f : FileUtils.listFilesAndDirs(LocalStorageUtil.getSubdirOrFile(base, entry), TrueFileFilter.TRUE, TrueFileFilter.TRUE)) {
                        if (!f.isDirectory()) {
                            if (f.length() == 0) {
                                emptyFiles.incrementAndGet();
                                FileUtils.deleteQuietly(f);
                                emptyDirFound = true;
                            }
                        } else {
                            if (f.list().length == 0 || f.getName().toUpperCase().equals("__MACOSX")) {
                                emptyDirs.incrementAndGet();
                                FileUtils.deleteQuietly(f);
                                emptyDirFound = true;
                            }
                        }
                    }
                }
            }
        }
        GenericMessageDialogController.withInfoProps("Housekeeping finished", "Removed " + emptyFiles.get() + " empty files and " + emptyDirs.get() + " dirs", true).showAndWait();
        return null;
    };
    ExecutorUtil.executeAsyncWithRetry(task, 3);
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) File(java.io.File) Support.isRemoteArtifact(se.light.assembly64.Support.isRemoteArtifact) Artifact(se.light.assembly64.model.Artifact)

Example 4 with LocalStorageUtil.getSubdirOrFile

use of se.light.assembly64.util.LocalStorageUtil.getSubdirOrFile in project assembly64fx by freabemania.

the class InstallationService method installDelta.

private void installDelta(LocationAndInstallationStatus location, Artifact entry) throws Exception {
    LOGGER.info("Updating " + entry.getName());
    if (entry.isCreateDelta()) {
        Integer latestUpdated = getVersionAsInteger(artifactsService.getLatestVersion(artifactsService.resolveDB(location, entry)));
        List<ArtifactDelta> entries = entry.getDeltas().stream().filter(item -> {
            return getVersionAsInteger(item.getVersion()) > latestUpdated;
        }).collect(Collectors.toList());
        CancelableTask cancelTask = CancelableTask.of();
        for (ArtifactDelta e : entries) {
            if (cancelTask.isRunning()) {
                if (entry.isDynamicImport()) {
                    File file = installEntry(location, entry, entry.getBaseDir() + "/delta", e.getFile(), e.getVersion(), true, true);
                    unpackDynamic(file, location, entry, e);
                    if (!cancelTask.isCancelled()) {
                        updateDb(location, entry, e.getVersion());
                    } else {
                        break;
                    }
                } else {
                    installEntry(location, entry, entry.getBaseDir() + "/delta", e.getFile(), e.getVersion());
                }
            } else {
                ProgressControlWrapper.getInstance().setProgressLabel("Cancelling");
                return;
            }
        }
    } else {
        ProgressControlWrapper.getInstance().setProgressLabel("Will delete current folder " + entry.getName() + ", please wait...");
        FileUtils.deleteQuietly(LocalStorageUtil.getSubdirOrFile(location.getLocation(), entry.getAbsoluteInstallationPath()));
        ProgressControlWrapper.getInstance().setProgressLabel("Installing new version");
        installEntry(location, entry, entry.getBaseDir(), entry.getFile(), entry.getVersion());
    }
}
Also used : Support.getVersionAsInteger(se.light.assembly64.Support.getVersionAsInteger) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ArtifactDelta(se.light.assembly64.model.ArtifactDelta) ReturningTask(se.light.assembly64.model.ReturningTask) Arrays(java.util.Arrays) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) Support.isRemoteArtifact(se.light.assembly64.Support.isRemoteArtifact) StringUtils(org.apache.commons.lang3.StringUtils) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) LatestInstalledItemInfo(se.light.assembly64.model.LatestInstalledItemInfo) Support.getVersionAsInteger(se.light.assembly64.Support.getVersionAsInteger) ArtifactType(se.light.assembly64.model.ArtifactType) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ProgressDBController(se.light.assembly64.fx.ProgressDBController) GuiUtils(se.light.assembly64.util.GuiUtils) Map(java.util.Map) Support(se.light.assembly64.Support) Support.flush(se.light.assembly64.Support.flush) CancelableTask(se.light.assembly64.model.CancelableTask) TrueFileFilter(org.apache.commons.io.filefilter.TrueFileFilter) Support.getObjectMapper(se.light.assembly64.Support.getObjectMapper) ContentEntry(se.light.assembly64.model.ContentEntry) GenericMessageDialogController(se.light.assembly64.fx.GenericMessageDialogController) Analytics(se.light.assembly64.Analytics) Logger(org.slf4j.Logger) ExecutorUtil(se.light.assembly64.util.ExecutorUtil) Set(java.util.Set) IOException(java.io.IOException) FileUtils(org.apache.commons.io.FileUtils) Artifact(se.light.assembly64.model.Artifact) Collectors(java.util.stream.Collectors) LocalStorageUtil(se.light.assembly64.util.LocalStorageUtil) File(java.io.File) ReleaseInfo(se.light.assembly64.model.ReleaseInfo) Platform(javafx.application.Platform) ProgressControlWrapper(se.light.assembly64.fx.ProgressControlWrapper) List(java.util.List) ChronoUnit(java.time.temporal.ChronoUnit) SearchResultItem(se.light.assembly64.model.SearchResultItem) NullWindowOwner(se.light.assembly64.fx.NullWindowOwner) LocalDate(java.time.LocalDate) DateTimeFormatter(java.time.format.DateTimeFormatter) Optional(java.util.Optional) DOWNLOAD_STATUS(se.light.assembly64.service.FTPService.DOWNLOAD_STATUS) ProgressMessageBox(se.light.assembly64.ProgressMessageBox) FILE_ACTION(se.light.assembly64.Support.FILE_ACTION) Support.getTodayDateAsBasicIsoString(se.light.assembly64.Support.getTodayDateAsBasicIsoString) LocationAndInstallationStatus(se.light.assembly64.model.LocationAndInstallationStatus) ArtifactDelta(se.light.assembly64.model.ArtifactDelta) File(java.io.File) CancelableTask(se.light.assembly64.model.CancelableTask)

Example 5 with LocalStorageUtil.getSubdirOrFile

use of se.light.assembly64.util.LocalStorageUtil.getSubdirOrFile in project assembly64fx by freabemania.

the class InstallationService method install.

public void install(LocationAndInstallationStatus location, Artifact entry, boolean updateProgressWindow) throws Exception {
    CancelableTask cancelTask = CancelableTask.of();
    if (isRemoteArtifact(entry)) {
        if (!artifactsService.isInstalled(location, entry)) {
            Analytics.sendEvent("install_item", "artifact_" + entry.getName());
            installFull(location, entry);
        } else if (artifactsService.needsUpdate(location, entry)) {
            Analytics.sendEvent("update_item", "artifact_" + entry.getName());
            installDelta(location, entry);
        }
    } else {
        ProgressControlWrapper.getInstance().setProgressLabel("Installing local folder!!!");
        artifactsService.updateChecksumInPrivateFolder();
        FileUtils.copyDirectory(new File(localDbService.getPrivateDir()), LocalStorageUtil.getSubdirOrFile(LocalStorageUtil.getSubdirOrFile(location.getLocation(), "Misc"), localDbService.getPrivateDirName()));
        artifactsService.updateChecksumInInstallation(location);
    }
    if (updateProgressWindow) {
        updateProgressDialog(cancelTask);
    }
}
Also used : File(java.io.File) CancelableTask(se.light.assembly64.model.CancelableTask)

Aggregations

File (java.io.File)6 CancelableTask (se.light.assembly64.model.CancelableTask)5 IOException (java.io.IOException)3 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)3 Support.getTodayDateAsBasicIsoString (se.light.assembly64.Support.getTodayDateAsBasicIsoString)3 Support.isRemoteArtifact (se.light.assembly64.Support.isRemoteArtifact)3 Artifact (se.light.assembly64.model.Artifact)3 LocalDate (java.time.LocalDate)2 DateTimeFormatter (java.time.format.DateTimeFormatter)2 ChronoUnit (java.time.temporal.ChronoUnit)2 ArrayList (java.util.ArrayList)2 Arrays (java.util.Arrays)2 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 List (java.util.List)2 Map (java.util.Map)2 Optional (java.util.Optional)2 Set (java.util.Set)2 Collectors (java.util.stream.Collectors)2 Platform (javafx.application.Platform)2