View Javadoc

1   package org.apache.ojb.broker.accesslayer.conversions;
2   
3   /* Copyright 2002-2005 The Apache Software Foundation
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License");
6    * you may not use this file except in compliance with the License.
7    * You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  import java.io.ByteArrayInputStream;
19  import java.io.ByteArrayOutputStream;
20  import java.io.ObjectInputStream;
21  import java.io.ObjectOutputStream;
22  import java.util.zip.GZIPInputStream;
23  import java.util.zip.GZIPOutputStream;
24  
25  import org.apache.ojb.broker.util.Base64;
26  
27  /**
28   * this implementation of the FieldConversion interface converts
29   * between java.lang.Objects values and char[] values in the rdbms.
30   * This conversion is useful to store serialized objects in database
31   * columns. For an example have a look at the mapping of
32   * org.apache.ojb.odmg.collections.DlistEntry.
33   *
34   * @author Thomas Mahler, Scott C. Gray
35   * @version $Id: Object2Base64StringFieldConversion.java,v 1.1 2007-08-24 22:17:31 ewestfal Exp $
36   */
37  public class Object2Base64StringFieldConversion implements FieldConversion
38  {
39      private ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
40      private Base64.OutputStream uuOut =
41          new Base64.OutputStream(byteOut, Base64.ENCODE, false);
42      private GZIPOutputStream gzipOut;
43      private ObjectOutputStream objOut;
44  
45      /*
46      ** @see FieldConversion#javaToSql(Object)
47      */
48      public Object javaToSql(Object source)
49      {
50          synchronized (byteOut)
51          {
52              try
53              {
54                  if (gzipOut == null)
55                  {
56                      gzipOut = new GZIPOutputStream(uuOut);
57                      objOut = new ObjectOutputStream(gzipOut);
58                  }
59  
60                  /*
61                  ** Clear out the byte array
62                  */
63                  byteOut.reset();
64  
65                  objOut.writeObject(source);
66                  objOut.flush();
67                  gzipOut.finish();
68                  gzipOut.flush();
69  
70                  return (byteOut.toString());
71              }
72              catch (Throwable t)
73              {
74                  throw new ConversionException(t);
75              }
76          }
77      }
78  
79      /*
80      ** @see FieldConversion#sqlToJava(Object)
81      */
82      public Object sqlToJava(Object source)
83      {
84          try
85          {
86              ByteArrayInputStream stringIn =
87                  new ByteArrayInputStream(((String) source).getBytes());
88              Base64.InputStream uuIn =
89                  new Base64.InputStream(stringIn, Base64.DECODE, false);
90              GZIPInputStream gzipIn = new GZIPInputStream(uuIn);
91              ObjectInputStream objIn = new ObjectInputStream(gzipIn);
92              Object result = objIn.readObject();
93  
94              objIn.close();
95              return result;
96          }
97          catch (Throwable t)
98          {
99              throw new ConversionException(t);
100         }
101     }
102 
103 }