ObjectWrapper.java
01 /*
02  *  ObjectWrapper.java
03  *
04  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
05  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
06  *
07  *  This file is part of GATE (see http://gate.ac.uk/), and is free
08  *  software, licenced under the GNU Library General Public License,
09  *  Version 2, June 1991 (in the distribution as file licence.html,
10  *  and also available at http://gate.ac.uk/gate/licence.html).
11  *
12  *  Valentin Tablan, 8 Mar 2012
13  *
14  *  $Id: ObjectWrapper.java 18753 2015-06-04 13:20:25Z ian_roberts $
15  */
16 package gate.corpora;
17 
18 import gate.util.xml.XML11StaxDriver;
19 
20 import java.io.StringWriter;
21 
22 import org.apache.log4j.Logger;
23 
24 import com.thoughtworks.xstream.XStream;
25 import com.thoughtworks.xstream.io.xml.StaxDriver;
26 
27 /**
28  * Class used to wrap arbitrary values prior to saving as GATE XML. The 
29  {@link #toString()} method uses {@link XStream} to serialise the 
30  * ObjectWrapper as XML; while the {@link #ObjectWrapper(String)} constructor
31  * performs the reverse, parsing the previously saved XML and re-creating the 
32  * wrapped value. 
33  */
34 public class ObjectWrapper {
35   
36   /**
37    * The value being wrapped. 
38    */
39   protected Object value;
40   
41   protected static final Logger log = Logger.getLogger(ObjectWrapper.class);
42 
43   /**
44    * Wraps an arbitrary value, which must be serialisable by XStream.
45    @param value any of any class that can be XML-serialised by XStream.
46    */
47   public ObjectWrapper(Object value) {
48     this.value = value;
49   }
50 
51   /**
52    * De-serialises an {@link ObjectWrapper} instance from a string previously 
53    * obtained by calling {@link #toString()}.
54    @param xmlSerialisation the XML string representing the saved 
55    {@link ObjectWrapper} instance.
56    */
57   public ObjectWrapper(String xmlSerialisation) {
58     XStream xstream = new XStream(new StaxDriver());
59     Object other = xstream.fromXML(xmlSerialisation);
60     if(other instanceof ObjectWrapper) {
61       this.value = ((ObjectWrapper)other).value;
62       other = null;
63     else {
64       log.error("Value de-serialised from XML is of type \"" 
65           other.getClass().getName() "\", instead of expected \"" 
66           ObjectWrapper.class.getName() ". Value was lost.");
67       value = null;
68     }
69   }
70 
71   /**
72    * Produces an XML serialisation of this {@link ObjectWrapper} instance, that
73    * can be deserialised by using the {@link #ObjectWrapper(String)} constructor.
74    @see java.lang.Object#toString()
75    */
76   @Override
77   public String toString() {
78     // Use XML 1.1 in case the XML representation includes characters
79     // that 1.0 forbids (typically control characters).
80     XStream xstream = new XStream(new XML11StaxDriver());
81     StringWriter out  = new StringWriter();
82     xstream.toXML(this, out);
83     return out.toString();
84   }
85 
86   /**
87    * Gets the wrapped value.
88    
89    @return the value
90    */
91   public Object getValue() {
92     return value;
93   }
94 }