// ======================================================================== // Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // You may elect to redistribute this code under either of these licenses. // ======================================================================== package net.hasor.rsf.json; import net.hasor.rsf.json.JSON.Convertor; import net.hasor.rsf.json.JSON.Output; import java.util.Map; /** * */ public class JSONPojoConvertorFactory implements Convertor { private final JSON _json; private final boolean _fromJson; public JSONPojoConvertorFactory(JSON json) { if (json == null) { throw new IllegalArgumentException(); } _json = json; _fromJson = true; } /* ------------------------------------------------------------ */ /** * @param json The JSON instance to use * @param fromJSON If true, the class name of the objects is included * in the generated JSON and is used to instantiate the object when * JSON is parsed (otherwise a Map is used). */ public JSONPojoConvertorFactory(JSON json, boolean fromJSON) { if (json == null) { throw new IllegalArgumentException(); } _json = json; _fromJson = fromJSON; } /* ------------------------------------------------------------ */ public void toJSON(Object obj, Output out) { String clsName = obj.getClass().getName(); Convertor convertor = _json.getConvertorFor(clsName); if (convertor == null) { try { Class cls = Loader.loadClass(JSON.class, clsName); convertor = new JSONPojoConvertor(cls, _fromJson); _json.addConvertorFor(clsName, convertor); } catch (ClassNotFoundException e) { JSON.logger.warn(e.getMessage(), e); } } if (convertor != null) { convertor.toJSON(obj, out); } } public Object fromJSON(Map object) { Map map = object; String clsName = (String) map.get("class"); if (clsName != null) { Convertor convertor = _json.getConvertorFor(clsName); if (convertor == null) { try { Class cls = Loader.loadClass(JSON.class, clsName); convertor = new JSONPojoConvertor(cls, _fromJson); _json.addConvertorFor(clsName, convertor); } catch (ClassNotFoundException e) { JSON.logger.warn(e.getMessage(), e); } } if (convertor != null) { return convertor.fromJSON(object); } } return map; } }