/* * Copyright (C) 2010 Medo <smaxein@googlemail.com> * * This file is part of GmkSplitter. * GmkSplitter is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package com.ganggarrison.gmdec.xml; import java.awt.Dimension; import java.awt.Point; import java.io.File; import java.io.IOException; import org.lateralgm.resources.GmObject; import org.lateralgm.resources.InstantiableResource; import org.lateralgm.resources.ResourceReference; import com.ganggarrison.easyxml.XmlReader; import com.ganggarrison.easyxml.XmlWriter; import com.ganggarrison.gmdec.DeferredReferenceCreatorNotifier; import com.ganggarrison.gmdec.GmkSplitter; import com.ganggarrison.gmdec.GmkSplitter.IdPreservation; public abstract class XmlFormat<T> { public abstract void write(T object, XmlWriter writer); public abstract T read(XmlReader reader, DeferredReferenceCreatorNotifier notifier); public final void write(T object, File file) throws IOException { if (file.exists()) { throw new IOException("File " + file + " already exists."); } XmlWriter out = new XmlWriter(); write(object, out); out.write(file); } public final T read(File file, DeferredReferenceCreatorNotifier notifier) throws IOException { XmlReader reader = new XmlReader(file); return read(reader, notifier); } protected static String getRefStr(ResourceReference<?> ref) { if (ref != null && ref.get() != null) { return ref.get().getName(); } else { return ""; } } protected static void writeResourceRef(XmlWriter out, String elemName, ResourceReference<?> ref) { out.putElement(elemName, getRefStr(ref)); } protected static String readResourceRef(XmlReader in, String elemName) { return in.getStringElement(elemName); } protected static void writePoint(XmlWriter writer, String elementName, Point point) { writer.startElement(elementName); writer.putAttribute("x", point.x); writer.putAttribute("y", point.y); writer.endElement(); } protected static Point readPoint(XmlReader reader, String elementName) { reader.enterElement(elementName); int x = reader.getIntAttribute("x"); int y = reader.getIntAttribute("y"); reader.leaveElement(); return new Point(x, y); } protected static void writeDimension(XmlWriter writer, String elementName, Dimension d) { writer.startElement(elementName); writer.putAttribute("width", d.width); writer.putAttribute("height", d.height); writer.endElement(); } protected static Dimension readDimension(XmlReader reader, String elementName) { reader.enterElement(elementName); int width = reader.getIntAttribute("width"); int height = reader.getIntAttribute("height"); reader.leaveElement(); return new Dimension(width, height); } protected void writeIdAttribute(InstantiableResource<?, ?> resource, XmlWriter writer) { if (preserveId(resource)) { writer.putAttribute("id", resource.getId()); } } protected void readIdAttribute(InstantiableResource<?, ?> resource, XmlReader reader) { if (preserveId(resource) && reader.hasAttribute("id")) { resource.setId(reader.getIntAttribute("id")); } } private boolean preserveId(InstantiableResource<?, ?> resource) { if (GmkSplitter.preserveIds == IdPreservation.ALL) { return true; } if (GmkSplitter.preserveIds == IdPreservation.OBJECTS && (resource instanceof GmObject)) { return true; } return false; } }