Factions/src/com/massivecraft/factions/update/UpdateUtil.java
2015-11-08 17:26:36 +01:00

259 lines
6.8 KiB
Java

package com.massivecraft.factions.update;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import com.massivecraft.factions.Const;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.TerritoryAccess;
import com.massivecraft.factions.entity.Board;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.MassiveCore;
import com.massivecraft.massivecore.store.Coll;
import com.massivecraft.massivecore.store.Db;
import com.massivecraft.massivecore.store.Entity;
import com.massivecraft.massivecore.store.MStore;
import com.massivecraft.massivecore.util.MUtil;
public class UpdateUtil
{
// -------------------------------------------- //
// CONSTANTS
// -------------------------------------------- //
public static final List<String> oldCollnamePrefixes = MUtil.list(
"factions_board@",
"factions_faction@",
"factions_uplayer@",
"factions_uconf@"
);
// -------------------------------------------- //
// UPDATE
// -------------------------------------------- //
// Assumes the MConfColl has been inited!
public static void update()
{
// Select the old universe of our attention ...
String universe = getUniverse();
if (universe == null) return;
Factions.get().log("Updating Database to New Version!");
// ... load the old uconf data ...
OldConfColls.get().init();
OldConf oldConf = OldConfColls.get().getForUniverse(universe).get(MassiveCore.INSTANCE, true);
// ... transfer the old uconf data over to the new mconf ...
oldConf.transferTo(MConf.get());
MConf.get().changed();
MConf.get().sync();
// ... rename target collections ...
Db db = MStore.getDb();
// The old mplayer data we don't care much for.
// Could even delete it but let's just move it out of the way.
db.renameColl(Const.COLLECTION_MPLAYER, "old_"+Const.COLLECTION_MPLAYER);
db.renameColl("factions_board@" + universe, Const.COLLECTION_BOARD);
db.renameColl("factions_faction@" + universe, Const.COLLECTION_FACTION);
db.renameColl("factions_uplayer@" + universe, Const.COLLECTION_MPLAYER);
// ... rename remaining collections ...
for (String collname : db.getCollnames())
{
if (!collname.startsWith("factions_")) continue;
if (!collname.contains("@")) continue;
db.renameColl(collname, "old_" + collname);
}
}
// -------------------------------------------- //
// UNIVERSE SELECTION
// -------------------------------------------- //
public static String getUniverse()
{
List<String> universes = getUniverses();
String ret = null;
int best = -1;
for (String universe : universes)
{
int count = getUniverseFactionCount(universe);
if (count > 0 && count > best)
{
ret = universe;
best = count;
}
}
return ret;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static int getUniverseFactionCount(String universe)
{
Coll coll = new Coll("factions_faction@"+universe, Entity.class, MStore.getDb(), Factions.get());
Collection<String> ids = MStore.getDb().getIds(coll);
return ids.size();
}
public static List<String> getUniverses()
{
List<String> ret = new ArrayList<String>();
for (String collname : MStore.getDb().getCollnames())
{
for (String prefix : oldCollnamePrefixes)
{
if (collname.startsWith(prefix))
{
ret.add(collname.substring(prefix.length()));
}
}
}
return ret;
}
// -------------------------------------------- //
// UPDATE SPECIAL IDS
// -------------------------------------------- //
public static void updateSpecialIds()
{
if (MConf.get().factionIdNone != null)
{
updateSpecialId(MConf.get().factionIdNone, Factions.ID_NONE);
MConf.get().factionIdNone = null;
}
if (MConf.get().factionIdSafezone != null)
{
updateSpecialId(MConf.get().factionIdSafezone, Factions.ID_SAFEZONE);
MConf.get().factionIdSafezone = null;
}
if (MConf.get().factionIdWarzone != null)
{
updateSpecialId(MConf.get().factionIdWarzone, Factions.ID_WARZONE);
MConf.get().factionIdWarzone = null;
}
MConf.get().sync();
}
public static void updateSpecialId(String from, String to)
{
// Get the coll.
FactionColl coll = FactionColl.get();
// Get the faction and detach it
Faction faction = coll.detachId(from);
if (faction == null) return;
coll.syncId(from);
// A faction may already be occupying the to-id.
// We must remove it to make space for renaming.
// This faction is simply an auto-created faction with no references yet.
coll.detachId(to);
coll.syncId(to);
// Attach it
coll.attach(faction, to);
coll.syncId(to);
// Update that config special config option.
if (MConf.get().defaultPlayerFactionId.equals(from))
{
MConf.get().defaultPlayerFactionId = to;
MConf.get().sync();
}
// Update all board entries.
updateBoards(from, to);
}
public static void updateBoards(String from, String to)
{
for (Board board : BoardColl.get().getAll())
{
updateBoard(board, from, to);
}
}
public static void updateBoard(Board board, String from, String to)
{
boolean changed = false;
for (TerritoryAccess ta : board.getMap().values())
{
changed |= updateTerritoryAccess(ta, from, to);
}
if (changed)
{
board.changed();
board.sync();
}
}
public static boolean updateTerritoryAccess(TerritoryAccess entity, String from, String to)
{
boolean changed = false;
changed |= updateTerritoryHostFactionId(entity, from, to);
changed |= updateTerritoryAccessFactionIds(entity, from, to);
return changed;
}
public static boolean updateTerritoryHostFactionId(TerritoryAccess entity, String from, String to)
{
String before = entity.hostFactionId;
if (before == null) return false;
if (!before.equals(from)) return false;
entity.hostFactionId = to;
return true;
}
public static boolean updateTerritoryAccessFactionIds(TerritoryAccess entity, String from, String to)
{
// Before and After
Set<String> before = entity.factionIds;
if (before == null) return false;
Set<String> after = new LinkedHashSet<String>();
for (String id : before)
{
if (id == null) continue;
if (id.equals(from))
{
after.add(to);
}
else
{
after.add(from);
}
}
// NoChange
if (MUtil.equals(before, after)) return false;
// Apply
entity.factionIds = after;
//entity.sync();
return true;
}
}