Java tutorial
/** * *************************************************************** * JADE - Java Agent DEvelopment Framework is a framework to develop * multi-agent systems in compliance with the FIPA specifications. * Copyright (C) 2000 CSELT S.p.A. * * GNU Lesser General Public License * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * ************************************************************** */ package jade.content.onto; //#MIDP_EXCLUDE_FILE import jade.content.abs.AbsObject; import jade.content.abs.AbsPrimitive; import jade.content.abs.AbsConcept; import jade.content.schema.PrimitiveSchema; import jade.content.schema.ConceptSchema; import org.apache.commons.codec.binary.Base64; import java.io.*; /** This ontology allows dealing with Java Serializable objects as if they were instances of ontological elements. <br> <b>NOT available in MIDP</b> <br> @author Giovanni Caire - TILAB */ public class SerializableOntology extends Ontology { // The singleton instance of this ontology private static final SerializableOntology theInstance = new SerializableOntology(); public static final String SERIALIZABLE = "serializable"; public static final String SERIALIZABLE_VALUE = "value"; private ClassLoader myClassLoader; /** * Returns the singleton instance of the <code>SerializableOntology</code>. * @return the singleton instance of the <code>SerializableOntology</code> */ public static Ontology getInstance() { return theInstance; } /** Construct a SerializableOntology object */ private SerializableOntology() { super("Serializable-ontology", (Ontology) null, null); try { // Add the primitive schema for binary data PrimitiveSchema stringSchema = (PrimitiveSchema) BasicOntology.getInstance() .getSchema(BasicOntology.STRING); add(stringSchema); // Add the schema for a generic Serializable object ConceptSchema serializableSchema = new ConceptSchema(SERIALIZABLE); serializableSchema.add(SERIALIZABLE_VALUE, stringSchema); add(serializableSchema); } catch (Exception e) { // Should never happen e.printStackTrace(); } } public void setClassLoader(ClassLoader cl) { myClassLoader = cl; } //#APIDOC_EXCLUDE_BEGIN /** */ protected Object toObject(AbsObject abs, String lcType, Ontology globalOnto) throws UnknownSchemaException, UngroundedException, OntologyException { if (SERIALIZABLE.equals(abs.getTypeName())) { try { AbsPrimitive absValue = (AbsPrimitive) abs.getAbsObject(SERIALIZABLE_VALUE); String stringValue = absValue.getString(); byte[] value = Base64.decodeBase64(stringValue.getBytes("US-ASCII")); ObjectInput in = new ObjectInputStream(new ByteArrayInputStream(value)) { protected Class resolveClass(ObjectStreamClass v) throws IOException, ClassNotFoundException { if (myClassLoader != null) { // FIXME: Manage primitive class fields. Refactor with AgentMobilityService return Class.forName(v.getName(), true, myClassLoader); } else { return super.resolveClass(v); } } }; return in.readObject(); } catch (Throwable t) { throw new OntologyException("Error in object deserialization.", t); } } else { throw new OntologyException("Abs-object " + abs + " is not serializable"); } } /** */ protected AbsObject fromObject(Object obj, Ontology globalOnto) throws UnknownSchemaException, OntologyException { // If obj is already an abstract descriptor --> just return it if (obj instanceof AbsObject) { return (AbsObject) obj; } if (obj instanceof Serializable) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(baos); out.writeObject(obj); AbsConcept absSerializable = new AbsConcept(SERIALIZABLE); String stringValue = new String(Base64.encodeBase64(baos.toByteArray()), "US-ASCII"); absSerializable.set(SERIALIZABLE_VALUE, stringValue); return absSerializable; } catch (Throwable t) { throw new OntologyException("Error in object serialization.", t); } } else { throw new OntologyException("Object " + obj + " is not serializable"); } } //#APIDOC_EXCLUDE_END //#J2ME_EXCLUDE_BEGIN private Object writeReplace() throws ObjectStreamException { return new DummySerializableOntology(); } private static class DummySerializableOntology implements Serializable { private Object readResolve() throws ObjectStreamException { return SerializableOntology.getInstance(); } } //#J2ME_EXCLUDE_END }