package php.runtime.env;
import php.runtime.Memory;
import php.runtime.common.Messages;
import php.runtime.exceptions.support.ErrorType;
import php.runtime.memory.ArrayMemory;
import php.runtime.memory.ReferenceMemory;
import java.util.*;
public class PackageManager {
private final Map<String, Package> packages = new HashMap<>();
private final Set<PackageLoader> loaders = new LinkedHashSet<>();
private final Environment env;
public PackageManager(Environment env) {
this.env = env;
}
public void apply(PackageManager parent) {
for (Map.Entry<String, Package> packageEntry : parent.packages.entrySet()) {
this.packages.put(packageEntry.getKey(), packageEntry.getValue().duplicate());
}
}
public Collection<String> names() {
return packages.keySet();
}
public boolean has(String name) {
return packages.containsKey(name);
}
public Package tryFind(String name, TraceInfo trace) {
Package aPackage = packages.get(name);
if (aPackage == null) {
synchronized (loaders) {
for (PackageLoader loader : loaders) {
Package newPackage = loader.load(name, trace);
if (newPackage != null) {
synchronized (packages) {
packages.put(name, newPackage);
return newPackage;
}
}
}
return null;
}
}
return aPackage;
}
public Package fetch(String name) {
Package aPackage = packages.get(name);
if (aPackage == null) {
synchronized (packages) {
aPackage = packages.get(name);
if (aPackage != null) return aPackage;
packages.put(name, aPackage = new Package());
}
}
return aPackage;
}
synchronized public boolean registerLoader(PackageLoader loader) {
return loaders.add(loader);
}
synchronized public boolean unregisterLoader(PackageLoader loader) {
return loaders.remove(loader);
}
synchronized public void set(String name, Package aPackage) {
packages.put(name, aPackage);
}
}