use of pl.themolka.arcade.dom.Document in project Arcade2 by ShootGame.
the class MapLoaderModule method readMapDirectory.
private OfflineMap readMapDirectory(File worldDirectory) throws DOMException, IOException {
File file = new File(worldDirectory, MapManifest.FILENAME);
if (!file.exists()) {
throw new FileNotFoundException("Missing " + file.getName());
}
DOMEngine engine = this.getPlugin().getDomEngines().forFile(file);
Parser<OfflineMap> parser;
try {
parser = this.getPlugin().getParsers().forType(OfflineMap.class);
} catch (ParserNotSupportedException ex) {
throw new RuntimeException("No " + OfflineMap.class.getSimpleName() + " parser installed");
}
Document document = engine.read(file);
this.getPlugin().getDomPreprocessor().preprocess(document);
OfflineMap map = parser.parse(document).orFail();
map.setDirectory(worldDirectory);
map.setSettings(file);
return map;
}
use of pl.themolka.arcade.dom.Document in project Arcade2 by ShootGame.
the class SimpleGameManager method createGame.
@Override
public Game createGame(OfflineMap map) throws DOMException, IOException {
File file = map.getSettings();
DOMEngine engine = this.plugin.getDomEngines().forFile(file);
Parser<MapManifest> parser;
try {
parser = this.plugin.getParsers().forType(MapManifest.class);
} catch (ParserNotSupportedException ex) {
throw new RuntimeException("No " + MapManifest.class.getSimpleName() + " parser installed");
}
Document document = engine.read(file);
this.plugin.getDomPreprocessor().preprocess(document);
ArcadeMap realMap = new ArcadeMap(map, parser.parse(document).orFail());
WorldNameGenerator worldNameGenerator = new WorldNameGenerator(map);
realMap.setWorldName(worldNameGenerator.nextWorldName());
return this.createGame(realMap);
}
use of pl.themolka.arcade.dom.Document in project Arcade2 by ShootGame.
the class ImportStage method invokeNode.
@Override
public void invokeNode(Node node) throws PreprocessException {
if (!node.hasParent()) {
throw new PreprocessException(node, "Node must have its parent");
}
Node parent = node.getParent();
String targetPath = node.getValue();
if (targetPath == null) {
throw new PreprocessException(node, "Target document path not specified");
}
Document target;
try {
Path directory = this.document.getPath().getParent();
target = readDocument(this.engines, node, directory.resolve(targetPath).toUri());
} catch (InvalidPathException ex) {
throw new PreprocessException(node, "Invalid document path: " + ex.getReason(), ex);
}
if (!target.hasPath()) {
throw new PreprocessException(target, "Cannot resolve target document path");
} else if (!target.hasRoot()) {
throw new PreprocessException(target, "Target document is empty");
}
Path path = target.getPath();
if (stack.search(path) != -1) {
throw new PreprocessException(target, "Import loop detected");
}
stack.push(path);
// Preprocess the target document.
this.preprocessor.preprocess(target);
// Remove the old <import> node.
Node.detach(node);
// We don't support root node properties.
parent.add(target.getRoot().children());
}
use of pl.themolka.arcade.dom.Document in project Arcade2 by ShootGame.
the class Include method invokeNode.
@Override
public void invokeNode(Node node) throws PreprocessException {
if (!node.hasParent()) {
throw new PreprocessException(node, "Node must have its parent");
}
Node parent = node.getParent();
String targetPath = node.getValue();
if (targetPath == null) {
throw new PreprocessException(node, "Target document path not specified");
}
Document target;
try {
target = ImportStage.readDocument(this.engines, node, this.repository.resolve(targetPath).toUri());
} catch (InvalidPathException ex) {
throw new PreprocessException(node, "Invalid document path: " + ex.getReason(), ex);
}
if (!target.hasPath()) {
throw new PreprocessException(target, "Cannot resolve target document path");
} else if (!target.hasRoot()) {
throw new PreprocessException(target, "Target document is empty");
}
// Preprocess the target document.
this.preprocessor.preprocess(target);
// Remove the old <include> node.
Node.detach(node);
// We don't support root node properties.
parent.add(target.getRoot().children());
}
Aggregations