/* Transit - Remote procedure calls made simple Copyright (c) 2012 Ulrich Hilger This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.transit; import java.util.List; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.StaxDriver; public abstract class AbstractWandler implements Wandler { /** * Ein Java-Objekt in das Format verwandeln, das dieser Wandler * verarbeitet * * @param obj das Objekt, das verwandelt werden soll * @param typ der Datentyp, von dem verwandelt werden soll * @return das Objekt, in das das uebergebene Objekt verwandelt wurde */ public Object vonJava(Object obj, Class typ) { XStream xstream = getXStream(); aliasSubtypes(xstream, obj); xstream.alias(typ.getSimpleName(), typ); String xml = xstream.toXML(obj); return xml; } protected abstract XStream getXStream(); protected void aliasSubtypes(XStream xstream, Object obj) { if(obj instanceof List) { List list = (List) obj; if(list.size() > 0) { Object subobj = list.get(0); if(subobj instanceof List) { List sublist = (List) subobj; if(sublist.size() > 0) { Class subsubtyp = sublist.get(0).getClass(); xstream.alias(subsubtyp.getSimpleName(), subsubtyp); } } Class subtyp = list.get(0).getClass(); xstream.alias(subtyp.getSimpleName(), subtyp); } } } /** * Das Format, das dieser Wandler verarbeitet, zu Java wandeln * * @param obj das Objekt, das verwandelt werden soll * @param typ der Datentyp, in den verwandelt werden soll * @return das Objekt, in das das uebergebene Objekt verwandelt wurde */ public Object zuJava(Object obj, Class typ) { //XStream xstream = new XStream(new StaxDriver()); XStream xstream = getXStream(); xstream.alias(typ.getSimpleName(), typ); Object newObject = xstream.fromXML(obj.toString()); return newObject; } /** * Das Format ermitteln, das dieser Wandler verarbeitet * @return das Format, das dieser Wandler verarbeitet */ public abstract String getFormat(); /** * Pruefen, ob ein anderes Objekt gleich diesem Objekt ist * @param other das Objekt, mit dem dieses Objekt verglichen werden soll * @return true, wenn beide Objekte gleich sind, false wenn nicht */ public boolean equals(Object other) { boolean isEqual = false; if(other != null && other instanceof Wandler) { Wandler w = (Wandler) other; isEqual = this.getFormat().equals(w.getFormat()); } return isEqual; } public void aufloesen() { // hier muss bei diesem Wandler nichts geschehen } }