Feature: NeoPackageManager
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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.")
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user