Feature: NeoPackageManager

This commit is contained in:
zt515
2017-06-25 00:53:36 +08:00
parent c0370101fc
commit 9ed09d2536
5 changed files with 291 additions and 12 deletions

View File

@ -0,0 +1,24 @@
package io.neoterm.installer.packages;
/**
* @author kiva
*/
public enum NeoPackageArchitecture {
ALL, ARM, AARCH64, X86, X86_64;
public static NeoPackageArchitecture parse(String arch) {
switch (arch) {
case "arm":
return ARM;
case "aarch64":
return AARCH64;
case "x86":
return X86;
case "x86_64":
return X86_64;
default:
return ALL;
}
}
}

View File

@ -0,0 +1,24 @@
package io.neoterm.installer.packages
/**
* @author kiva
*/
class NeoPackageInfo {
var packageName: String? = null
var isEssential: Boolean = false
var version: String? = null
var architecture: NeoPackageArchitecture = NeoPackageArchitecture.ALL
var maintainer: String? = null
var installedSizeInBytes: Long = 0L
var fileName: String? = null
var dependenciesString: String? = null
var dependencies: Array<NeoPackageInfo>? = null
var sizeInBytes: Long = 0L
var md5: String? = null
var sha1: String? = null
var sha256: String? = null
var homePage: String? = null
var description: String? = null
}

View File

@ -0,0 +1,100 @@
package io.neoterm.installer.packages;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
/**
* @author kiva
*/
public class NeoPackageManager {
private static final NeoPackageManager INSTANCE = new NeoPackageManager();
public static NeoPackageManager getInstance() {
return INSTANCE;
}
private final Object lock = new Object();
private boolean isRefreshing = false;
private boolean queryEnabled = true;
private HashMap<String, NeoPackageInfo> neoPackages;
private NeoPackageManager() {
neoPackages = new HashMap<>();
}
public NeoPackageInfo getPackageInfo(String packageName) {
return queryEnabled ? neoPackages.get(packageName) : null;
}
public int getPackageCount() {
return queryEnabled ? neoPackages.size() : -1;
}
public void refreshPackageList(File packageListFile) throws IOException {
synchronized (lock) {
if (isRefreshing) {
return;
}
isRefreshing = true;
}
tryParsePackages(packageListFile);
synchronized (lock) {
isRefreshing = false;
}
}
private void tryParsePackages(File packageListFile) throws IOException {
NeoPackageParser packageParser = new NeoPackageParser(new FileInputStream(packageListFile));
packageParser.setStateListener(new NeoPackageParser.ParseStateListener() {
@Override
public void onStartState() {
queryEnabled = false;
neoPackages.clear();
}
@Override
public void onEndState() {
queryEnabled = true;
for (NeoPackageInfo info : neoPackages.values()) {
resolveDepends(info);
}
}
@Override
public NeoPackageInfo onCreatePackageInfo() {
return new NeoPackageInfo();
}
@Override
public void onStartParsePackage(String name, NeoPackageInfo packageInfo) {
}
@Override
public void onEndParsePackage(NeoPackageInfo packageInfo) {
neoPackages.put(packageInfo.getPackageName(), packageInfo);
}
});
packageParser.parse();
}
private void resolveDepends(NeoPackageInfo info) {
String dep = info.getDependenciesString();
if (dep == null) {
return;
}
String[] splits = dep.split(",");
NeoPackageInfo[] depends = new NeoPackageInfo[splits.length];
info.setDependencies(depends);
for (int i = 0; i < splits.length; ++i) {
String item = splits[i].trim();
depends[i] = getPackageInfo(item);
}
}
}

View File

@ -0,0 +1,138 @@
package io.neoterm.installer.packages;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* @author kiva
*/
public class NeoPackageParser {
public interface ParseStateListener {
void onStartState();
void onEndState();
NeoPackageInfo onCreatePackageInfo();
void onStartParsePackage(String name, NeoPackageInfo packageInfo);
void onEndParsePackage(NeoPackageInfo packageInfo);
}
private static final String
KEY_PACKAGE_NAME = "Package",
KEY_VERSION = "Version",
KEY_ESSENTIAL = "Essential",
KEY_ARCH = "Architecture",
KEY_MAINTAINER = "Maintainer",
KEY_INSTALLED_SIZE = "Installed-Size",
KEY_DEPENDS = "Depends",
KEY_FILENAME = "Filename",
KEY_SIZE = "Size",
KEY_MD5 = "MD5sum",
KEY_SHA1 = "SHA1",
KEY_SHA256 = "SHA256",
KEY_HOMEPAGE = "Homepage",
KEY_DESC = "Description";
private BufferedReader reader;
private ParseStateListener stateListener;
public NeoPackageParser(InputStream inputStream) {
reader = new BufferedReader(new InputStreamReader(inputStream));
}
public NeoPackageParser setStateListener(ParseStateListener stateListener) {
this.stateListener = stateListener;
return this;
}
public void parse() throws IOException {
if (stateListener == null) {
return;
}
String line;
String[] splits = new String[2];
String key;
String value;
NeoPackageInfo packageInfo = null;
stateListener.onStartState();
while ((line = reader.readLine()) != null) {
if (line.isEmpty()) {
continue;
}
splitKeyAndValue(line, splits);
key = splits[0];
value = splits[1];
if (key.equals(KEY_PACKAGE_NAME)) {
if (packageInfo != null) {
stateListener.onEndParsePackage(packageInfo);
}
packageInfo = stateListener.onCreatePackageInfo();
packageInfo.setPackageName(value);
stateListener.onStartParsePackage(value, packageInfo);
}
if (packageInfo == null) {
continue;
}
switch (key) {
case KEY_ARCH:
packageInfo.setArchitecture(NeoPackageArchitecture.parse(value));
break;
case KEY_DEPENDS:
packageInfo.setDependenciesString(value);
break;
case KEY_DESC:
packageInfo.setDescription(value);
break;
case KEY_ESSENTIAL:
packageInfo.setEssential(value.equals("yes"));
break;
case KEY_FILENAME:
packageInfo.setFileName(value);
break;
case KEY_HOMEPAGE:
packageInfo.setHomePage(value);
break;
case KEY_INSTALLED_SIZE:
packageInfo.setInstalledSizeInBytes(Long.parseLong(value));
break;
case KEY_MAINTAINER:
packageInfo.setMaintainer(value);
break;
case KEY_MD5:
packageInfo.setMd5(value);
break;
case KEY_SHA1:
packageInfo.setSha1(value);
break;
case KEY_SHA256:
packageInfo.setSha256(value);
break;
case KEY_SIZE:
packageInfo.setSizeInBytes(Long.parseLong(value));
break;
case KEY_VERSION:
packageInfo.setVersion(value);
break;
}
}
stateListener.onEndState();
}
private void splitKeyAndValue(String line, String[] splits) {
splits[0] = line.substring(0, line.indexOf(':')).trim();
int valueIndex = line.indexOf(':');
splits[1] = line.substring(valueIndex == line.length() ? valueIndex : valueIndex + 1).trim();
}
}

View File

@ -1,9 +1,7 @@
package io.neoterm
import io.neoterm.customize.shortcut.ShortcutConfigParser
import io.neoterm.installer.packages.NeoPackageManager
import org.junit.Test
import org.junit.Assert.*
import java.io.File
/**
@ -15,14 +13,9 @@ class ExampleUnitTest {
@Test
@Throws(Exception::class)
fun test_config_parser() {
val parser = ShortcutConfigParser()
parser.setInput(File("docs/shortcut-key-config.example"))
val config = parser.parse()
}
@Test
fun test_wchar() {
println("".length)
println("X".length)
val pm = NeoPackageManager.getInstance()
pm.refreshPackageList(File("/Users/kiva/1.txt"))
val clang = pm.getPackageInfo("clang")
println(">>> Parsed ${pm.packageCount} packages.")
}
}