/*
|
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 <http://www.gnu.org/licenses/>.
|
*/
|
|
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
|
}
|
|
}
|