package com.github.dtschust.zork.parser; import com.github.dtschust.zork.ZorkGame; import com.github.dtschust.zork.objects.ZorkContainer; import com.github.dtschust.zork.objects.ZorkCreature; import com.github.dtschust.zork.objects.ZorkItem; import com.github.dtschust.zork.objects.ZorkRoom; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; public abstract class ZorkParser { private final PropertyParseStrategy creatureStrategy; private final PropertyParseStrategy containerStrategy; private final PropertyParseStrategy itemStrategy; private final PropertyParseStrategy roomStrategy; protected ZorkParser(final PropertyParseStrategy creatureStrategy, final PropertyParseStrategy containerStrategy, final PropertyParseStrategy itemStrategy, final PropertyParseStrategy roomStrategy) { this.creatureStrategy = creatureStrategy; this.containerStrategy = containerStrategy; this.itemStrategy = itemStrategy; this.roomStrategy = roomStrategy; } protected abstract Property getRootProperty(final String filename); public ZorkGame parse(final String filename, final PrintStream stream) { final List creatureList = new ArrayList<>(); final List containerList = new ArrayList<>(); final List roomList = new ArrayList<>(); final List itemList = new ArrayList<>(); final Property rootElement = getRootProperty(filename); // Every single first generation child is a room, container, creature, or item. So load them in for (final Property element : rootElement.subProperties()) { switch (element.name()) { case "creature": creatureList.add(creatureStrategy.parse(element)); break; case "container": containerList.add(containerStrategy.parse(element)); break; case "room": roomList.add(roomStrategy.parse(element)); break; case "item": itemList.add(itemStrategy.parse(element)); break; default: throw new IllegalArgumentException(element.name() + " not recognized"); } } return new ZorkGame(roomList, itemList, containerList, creatureList, stream); } }