package me.pbox.site.service.impl;
import com.codeforces.commons.xml.XmlUtil;
import me.pbox.site.model.Package;
import me.pbox.site.service.PackageService;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.w3c.dom.NodeList;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author Mike Mirzayanov (mirzayanovmr@gmail.com)
*/
public class PackageServiceImpl implements PackageService {
@Override
public Package construct(File versionDirectory) throws IOException {
Package p = new Package();
String packageName = versionDirectory.getParentFile().getName();
File descriptorFile = new File(versionDirectory, Package.DESCRIPTOR_FILENAME);
p.setDescriptor(FileUtils.readFileToString(descriptorFile));
File authorsFile = new File(versionDirectory.getParentFile(), Package.AUTHORS_FILENAME);
p.setAuthors(FileUtils.readFileToString(authorsFile));
String version = XmlUtil.extractFromXml(descriptorFile, "/pbox/version", String.class);
p.setVersion(version);
p.setSizeKilobytes((int) (new File(versionDirectory, packageName + "$" + version + ".pbox.7z").length() / 1024));
p.setTitle(XmlUtil.extractFromXml(descriptorFile, "/pbox/title", String.class));
p.setDescription(FileUtils.readFileToString(new File(descriptorFile.getParentFile().getParentFile(),
Package.DESCRIPTION_FILENAME)));
p.setArchs(XmlUtil.extractFromXml(descriptorFile, "/pbox/archs", String.class));
StringBuilder tags = new StringBuilder();
for (String tag : FileUtils.readFileToString(new File(versionDirectory.getParentFile(),
Package.TAGS_FILENAME)).split("[\r\n]+")) {
if (StringUtils.isNotBlank(tag)) {
if (tags.length() > 0) {
tags.append(",");
}
tags.append(tag);
}
}
p.setTags(tags.toString());
NodeList groupNodeList = XmlUtil.extractFromXml(descriptorFile, "/pbox/group", NodeList.class);
StringBuilder groups = new StringBuilder();
for (int i = 0; i < groupNodeList.getLength(); i++) {
if (groups.length() > 0) {
groups.append(",");
}
groups.append(groupNodeList.item(i).getTextContent());
}
p.setGroups(groups.toString());
String[] iconUrlExts = {"png", "jpg", "ico", "gif", "svg"};
File iconFile = null;
for (String iconUrlExt : iconUrlExts) {
File file = new File(versionDirectory.getParentFile(), "icon." + iconUrlExt);
if (file.isFile()) {
iconFile = file;
}
}
if (iconFile == null) {
throw new IOException("Can't find icon file for version directory '" + versionDirectory + "'.");
}
p.setIconUrl(String.format(Package.ICON_URL_PATTERN, packageName, iconFile.getName()));
p.setName(packageName);
StringBuilder versions = new StringBuilder();
File[] versionDirs = versionDirectory.getParentFile().listFiles();
if (versionDirs != null) {
for (File dir : versionDirs) {
if (dir.isDirectory() && new File(dir, Package.DESCRIPTOR_FILENAME).isFile()) {
if (versions.length() > 0) {
versions.append(",");
}
versions.append(dir.getName());
}
}
}
p.setVersions(versions.toString());
p.setCreationTime(new Date(descriptorFile.lastModified()));
return p;
}
@Override
public List<Package> rescanPackagesDir(File packagesDir) throws IOException {
List<Package> packages = new ArrayList<>();
File[] packageDirs = packagesDir.listFiles();
if (packageDirs != null) {
for (File packageDir : packageDirs) {
if (packageDir.isDirectory() && new File(packageDir, Package.DESCRIPTOR_FILENAME).isFile()) {
File[] versionDirs = packageDir.listFiles();
if (versionDirs != null) {
for (File versionDir : versionDirs) {
if (versionDir.isDirectory() && new File(versionDir, Package.DESCRIPTOR_FILENAME).isFile()) {
packages.add(construct(versionDir));
}
}
}
}
}
}
return packages;
}
}