package tools.map.xml.creator;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import games.strategy.util.Triple;
public class MapXmlData {
private String notes = "";
private File mapXMLFile;
private Map<String, String> xmlStringsMap = Maps.newLinkedHashMap();
private List<String> resourceList = new ArrayList<>();
private Map<String, Map<TerritoryDefinitionDialog.DEFINITION, Boolean>> territoryDefintionsMap =
Maps.newHashMap();
private Map<String, Set<String>> territoryConnectionsMap = Maps.newHashMap();
private List<String> playerNames = new ArrayList<>();
private Map<String, String> playerAllianceMap = Maps.newHashMap();
private Map<String, Integer> playerInitResourcesMap = Maps.newHashMap();
private Map<String, List<Integer>> unitDefinitionsMap = Maps.newLinkedHashMap();
private Map<String, List<String>> gamePlaySequenceMap = Maps.newLinkedHashMap();
private Map<String, Triple<String, String, Integer>> playerSequenceMap =
Maps.newLinkedHashMap();
private Map<String, List<String>> technologyDefinitionsMap =
Maps.newLinkedHashMap();
private Map<String, List<String>> productionFrontiersMap = Maps.newLinkedHashMap();
private Map<String, List<String>> unitAttachmentsMap = Maps.newLinkedHashMap();
private Map<String, Integer> territoyProductionsMap = Maps.newHashMap();
private Map<String, CanalTerritoriesTuple> canalDefinitionsMap =
Maps.newHashMap();
private Map<String, String> territoryOwnershipsMap = Maps.newHashMap();
private Map<String, Map<String, Map<String, Integer>>> unitPlacementsMap =
Maps.newHashMap();
private Map<String, List<String>> gameSettingsMap = Maps.newHashMap();
public MapXmlData() {
initialize();
}
public MapXmlData(final Map<String, String> xmlStringsMap, final List<String> resourceList,
final Map<String, Map<TerritoryDefinitionDialog.DEFINITION, Boolean>> territoryDefintionsMap,
final Map<String, Set<String>> territoryConnectionsMap, final List<String> playerNames,
final Map<String, String> playerAllianceMap,
final Map<String, Integer> playerInitResourcesMap, final Map<String, List<Integer>> unitDefinitionsMap,
final Map<String, List<String>> gamePlaySequenceMap,
final Map<String, Triple<String, String, Integer>> playerSequenceMap,
final Map<String, List<String>> technologyDefinitionsMap, final Map<String, List<String>> productionFrontiersMap,
final Map<String, List<String>> unitAttachmentsMap, final Map<String, Integer> territoyProductionsMap,
final Map<String, CanalTerritoriesTuple> canalDefinitionsMap,
final Map<String, String> territoryOwnershipsMap,
final Map<String, Map<String, Map<String, Integer>>> unitPlacementsMap,
final Map<String, List<String>> gameSettingsMap,
final String notes, final File mapXMLFile) {
this.xmlStringsMap = xmlStringsMap;
this.resourceList = resourceList;
this.territoryDefintionsMap = territoryDefintionsMap;
this.territoryConnectionsMap = territoryConnectionsMap;
this.playerNames = playerNames;
this.playerAllianceMap = playerAllianceMap;
this.playerInitResourcesMap = playerInitResourcesMap;
this.unitDefinitionsMap = unitDefinitionsMap;
this.gamePlaySequenceMap = gamePlaySequenceMap;
this.playerSequenceMap = playerSequenceMap;
this.technologyDefinitionsMap = technologyDefinitionsMap;
this.productionFrontiersMap = productionFrontiersMap;
this.unitAttachmentsMap = unitAttachmentsMap;
this.territoyProductionsMap = territoyProductionsMap;
this.canalDefinitionsMap = canalDefinitionsMap;
this.territoryOwnershipsMap = territoryOwnershipsMap;
this.unitPlacementsMap = unitPlacementsMap;
this.gameSettingsMap = gameSettingsMap;
this.notes = notes;
this.mapXMLFile = mapXMLFile;
}
public void initialize() {
getXmlStringsMap().clear();
getResourceList().clear();
getPlayerNames().clear();
getPlayerAllianceMap().clear();
getPlayerInitResourcesMap().clear();
getTerritoryDefintionsMap().clear();
getTerritoryConnectionsMap().clear();
getGamePlaySequenceMap().clear();
getPlayerSequenceMap().clear();
getProductionFrontiersMap().clear();
getTechnologyDefinitionsMap().clear();
getUnitAttachmentsMap().clear();
getTerritoyProductionsMap().clear();
getCanalDefinitionsMap().clear();
getTerritoryOwnershipsMap().clear();
getUnitPlacementsMap().clear();
getGameSettingsMap().clear();
setNotes("");
}
public Map<String, String> getXmlStringsMap() {
return xmlStringsMap;
}
public void setXmlStringsMap(final Map<String, String> xmlStringsMap) {
this.xmlStringsMap = xmlStringsMap;
}
public List<String> getResourceList() {
return resourceList;
}
public void setResourceList(final List<String> resourceList) {
this.resourceList = resourceList;
}
public Map<String, Map<TerritoryDefinitionDialog.DEFINITION, Boolean>> getTerritoryDefintionsMap() {
return territoryDefintionsMap;
}
public void setTerritoryDefintionsMap(
final Map<String, Map<TerritoryDefinitionDialog.DEFINITION, Boolean>> territoryDefintionsMap) {
this.territoryDefintionsMap = territoryDefintionsMap;
}
public Map<String, Set<String>> getTerritoryConnectionsMap() {
return territoryConnectionsMap;
}
public void setTerritoryConnectionsMap(final Map<String, Set<String>> territoryConnectionsMap) {
this.territoryConnectionsMap = territoryConnectionsMap;
}
public List<String> getPlayerNames() {
return playerNames;
}
public void setPlayerNames(final List<String> playerNames) {
this.playerNames = playerNames;
}
public Map<String, String> getPlayerAllianceMap() {
return playerAllianceMap;
}
public void setPlayerAllianceMap(final Map<String, String> playerAllianceMap) {
this.playerAllianceMap = playerAllianceMap;
}
public Map<String, Integer> getPlayerInitResourcesMap() {
return playerInitResourcesMap;
}
public void setPlayerInitResourcesMap(final Map<String, Integer> playerInitResourcesMap) {
this.playerInitResourcesMap = playerInitResourcesMap;
}
public Map<String, List<Integer>> getUnitDefinitionsMap() {
return unitDefinitionsMap;
}
public void setUnitDefinitionsMap(final Map<String, List<Integer>> unitDefinitionsMap) {
this.unitDefinitionsMap = unitDefinitionsMap;
}
public Map<String, List<String>> getGamePlaySequenceMap() {
return gamePlaySequenceMap;
}
public void setGamePlaySequenceMap(final Map<String, List<String>> gamePlaySequenceMap) {
this.gamePlaySequenceMap = gamePlaySequenceMap;
}
public Map<String, Triple<String, String, Integer>> getPlayerSequenceMap() {
return playerSequenceMap;
}
public void setPlayerSequenceMap(final Map<String, Triple<String, String, Integer>> playerSequenceMap) {
this.playerSequenceMap = playerSequenceMap;
}
public Map<String, List<String>> getTechnologyDefinitionsMap() {
return technologyDefinitionsMap;
}
public void setTechnologyDefinitionsMap(final Map<String, List<String>> technologyDefinitionsMap) {
this.technologyDefinitionsMap = technologyDefinitionsMap;
}
public Map<String, List<String>> getProductionFrontiersMap() {
return productionFrontiersMap;
}
public void setProductionFrontiersMap(final Map<String, List<String>> productionFrontiersMap) {
this.productionFrontiersMap = productionFrontiersMap;
}
public Map<String, List<String>> getUnitAttachmentsMap() {
return unitAttachmentsMap;
}
public void setUnitAttachmentsMap(final Map<String, List<String>> unitAttachmentsMap) {
this.unitAttachmentsMap = unitAttachmentsMap;
}
public Map<String, Integer> getTerritoyProductionsMap() {
return territoyProductionsMap;
}
public void setTerritoyProductionsMap(final Map<String, Integer> territoyProductionsMap) {
this.territoyProductionsMap = territoyProductionsMap;
}
public Map<String, CanalTerritoriesTuple> getCanalDefinitionsMap() {
return canalDefinitionsMap;
}
public void setCanalDefinitionsMap(final Map<String, CanalTerritoriesTuple> canalDefinitionsMap) {
this.canalDefinitionsMap = canalDefinitionsMap;
}
public Map<String, String> getTerritoryOwnershipsMap() {
return territoryOwnershipsMap;
}
public void setTerritoryOwnershipsMap(final Map<String, String> territoryOwnershipsMap) {
this.territoryOwnershipsMap = territoryOwnershipsMap;
}
public Map<String, Map<String, Map<String, Integer>>> getUnitPlacementsMap() {
return unitPlacementsMap;
}
public void setUnitPlacementsMap(final Map<String, Map<String, Map<String, Integer>>> unitPlacementsMap) {
this.unitPlacementsMap = unitPlacementsMap;
}
public Map<String, List<String>> getGameSettingsMap() {
return gameSettingsMap;
}
public void setGameSettingsMap(final Map<String, List<String>> gameSettingsMap) {
this.gameSettingsMap = gameSettingsMap;
}
public String getNotes() {
return notes;
}
public void setNotes(final String notes) {
this.notes = notes;
}
public File getMapXMLFile() {
return mapXMLFile;
}
public void setMapXMLFile(final File mapXMLFile) {
this.mapXMLFile = mapXMLFile;
}
/**
* The method separates the MapXml territoryConnectionsMap into connections starting in a land territory and those
* starting in a water territory.
* Each connection is only in one of the maps.
*
* <p>
* <b>Example:</b>
* </p>
*
* <p>
* Output:
* </p>
*
* <ul>
* <li>map1 { land1 -> {water1, water2} }
* <li>map2 { water3 -> {land2, land3} }
* </ul>
*
* @param landWaterTerritoyConnections - map of landTerritory -> waterTerritories with a connection to landTerritory
* @param waterLandTerritoyConnections - map of waterTerritory -> landTerritories with a connection to waterTerritory
*/
static void setSplittedTerritoryConnectionsByIsWaterSingle(
final Map<String, Set<String>> landWaterTerritoyConnections,
final Map<String, Set<String>> waterLandTerritoyConnections) {
for (final Entry<String, Set<String>> terrConn : MapXmlHelper.getTerritoryConnectionsMap().entrySet()) {
if (MapXmlHelper.getTerritoryDefintionsMap().get(terrConn.getKey())
.get(TerritoryDefinitionDialog.DEFINITION.IS_WATER)) {
// terrConn.Key is water territory, get none-water entries in terrConn.Value
@SuppressWarnings("unchecked")
final Set<String> landTerrValue = (Set<String>) terrConn.getValue().stream()
.filter(terr -> !MapXmlHelper.getTerritoryDefintionsMap().get(terr).get(
TerritoryDefinitionDialog.DEFINITION.IS_WATER));
if (!landTerrValue.isEmpty()) {
waterLandTerritoyConnections.put(terrConn.getKey(), landTerrValue);
}
} else {
// terrConn.Key is land territory, get water entries in terrConn.Value
@SuppressWarnings("unchecked")
final Set<String> waterTerrValue = (Set<String>) terrConn.getValue().stream()
.filter(terr -> MapXmlHelper.getTerritoryDefintionsMap().get(terr)
.get(TerritoryDefinitionDialog.DEFINITION.IS_WATER));
landWaterTerritoyConnections.put(terrConn.getKey(), waterTerrValue);
}
}
}
/**
* The method assumes that a connection is not represented in both provided maps.
* It enhances the first map with the symmetric fitting entries from the second map.
*
* <p>
* <b>Example:</b>
* </p>
*
* <p>
* Input:
* </p>
*
* <ul>
* <li>map1 = { land1 -> {water1, water2} }
* <li>map2 = { water3 -> {land2, land3} }
* </ul>
*
* <p>
* Output:
* </p>
*
* <ul>
* <li>map1 = { land1 -> {water1, water2, water3} }
* <li>map2 = { water3 -> {land2, land3} }
* </ul>
*
* @param landWaterTerritoyConnections - map of landTerritory -> waterTerritories with a connection to landTerritory
* @param waterLandTerritoyConnections - map of waterTerritory -> landTerritories with a connection to waterTerritory
*/
static void enhanceFirstSplittedTerritoryConnectionsWithSymmetryClosure(
final Map<String, Set<String>> landWaterTerritoyConnections,
final Map<String, Set<String>> waterLandTerritoyConnections) {
for (final Entry<String, Set<String>> terrConn : waterLandTerritoyConnections.entrySet()) {
final String waterTerr = terrConn.getKey();
for (final String landTerr : terrConn.getValue()) {
final Set<String> waterTerrs = landWaterTerritoyConnections.get(landTerr);
if (waterTerrs == null) {
final Set<String> newWaterTerrs = Sets.newLinkedHashSet();
newWaterTerrs.add(waterTerr);
landWaterTerritoyConnections.put(landTerr, newWaterTerrs);
} else {
waterTerrs.add(waterTerr);
}
}
}
}
/**
* The method extracts connections from the MapXml territoryConnectionsMap which are going from a land territory
* into a water territory or vice versa. They are represented in a new map with map.key values being the land
* territories
* and a map.value value being the list of water territories linked to the map.key land territory.
*
* @return map of landTerritory -> waterTerritories with a connection to landTerritory
*/
public static Map<String, Set<String>> getLandWaterTerritoryConnections() {
final Map<String, Set<String>> landWaterTerritoyConnections =
Maps.newHashMap();
final Map<String, Set<String>> waterLandTerritoyConnections =
Maps.newHashMap();
MapXmlData.setSplittedTerritoryConnectionsByIsWaterSingle(landWaterTerritoyConnections,
waterLandTerritoyConnections);
MapXmlData.enhanceFirstSplittedTerritoryConnectionsWithSymmetryClosure(landWaterTerritoyConnections,
waterLandTerritoyConnections);
return landWaterTerritoyConnections;
}
}