use of se.light.assembly64.model.LocationAndInstallationStatus 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);
}
}
use of se.light.assembly64.model.LocationAndInstallationStatus in project assembly64fx by freabemania.
the class InstallationService method resolveLatestInstalledByLocation.
public Set<LatestInstalledItemInfo> resolveLatestInstalledByLocation(LocationAndInstallationStatus location) {
String key = location.getLocation().getPath();
if (recentlyInstalled.containsKey(key)) {
return recentlyInstalled.get(key);
} else {
List<LatestInstalledItemInfo> items = Support.readList(LatestInstalledItemInfo.class, resolvedLatestInstallationsFile(location));
int size = items.size();
items.removeIf(item -> ChronoUnit.DAYS.between(item.toLocalDate(), LocalDate.now()) > 3);
int sizeAfterCheck = items.size();
if (size != sizeAfterCheck) {
flush(items, resolvedLatestInstallationsFile(location));
}
Set<LatestInstalledItemInfo> set = new HashSet<>(items);
recentlyInstalled.put(key, set);
return set;
}
}
use of se.light.assembly64.model.LocationAndInstallationStatus in project assembly64fx by freabemania.
the class Scheduler method countNofItems.
private int countNofItems(LocationAndInstallationStatus location, Artifact entry) {
try {
if (entry.getType() == ArtifactType.REMOTE) {
String latestInstalled = artifactsService.getLatestVersion(artifactsService.resolveDB(location, entry));
if (artifactsService.isInstalled(location, entry)) {
int installedVersion = getVersionAsInteger(latestInstalled);
int ticks = 0;
for (ArtifactDelta delta : entry.getDeltas()) {
if (installedVersion < getVersionAsInteger(delta.getVersion())) {
ticks = ticks + 2;
} else {
}
}
return ticks;
} else {
return 2;
}
} else {
return 1;
}
} catch (Exception e) {
LOGGER.error("Error when counting", e);
return 1;
}
}
use of se.light.assembly64.model.LocationAndInstallationStatus in project assembly64fx by freabemania.
the class InstallationService method addToLatestInstalled.
public void addToLatestInstalled(LocationAndInstallationStatus location, Artifact entry) {
Set<LatestInstalledItemInfo> latestItems = resolveLatestInstalledByLocation(location);
Optional<LatestInstalledItemInfo> foundItem = latestItems.stream().filter(item -> item.getId().equals(entry.getName())).findFirst();
LatestInstalledItemInfo updatedItem = LatestInstalledItemInfo.builder().id(entry.getName()).date(getTodayDateAsBasicIsoString()).build();
if (foundItem.isPresent()) {
latestItems.remove(foundItem.get());
}
latestItems.add(updatedItem);
flush(latestItems, resolvedLatestInstallationsFile(location));
}
use of se.light.assembly64.model.LocationAndInstallationStatus 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());
}
}
Aggregations