Package org.gatein.exports.data

Source Code of org.gatein.exports.data.ExportData

/******************************************************************************
* JBoss, a division of Red Hat                                               *
* Copyright 2010, Red Hat Middleware, LLC, and individual                    *
* contributors as indicated by the @authors tag. See the                     *
* copyright.txt in the distribution for a full listing of                    *
* individual contributors.                                                   *
*                                                                            *
* This 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; either version 2.1 of           *
* the License, or (at your option) any later version.                        *
*                                                                            *
* This software 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 software; if not, write to the Free                *
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA         *
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.                   *
******************************************************************************/
package org.gatein.exports.data;

import org.gatein.exports.ExportPersistenceManager;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
* @author <a href="mailto:mwringe@redhat.com">Matt Wringe</a>
* @version $Revision$
*/
public abstract class ExportData
{
   protected static final String NO_ID = "__NO_ID__";
   private String id = NO_ID;

   public static <T extends ExportData> T initExportData(Class<T> expected, byte[] encodedData, ExportPersistenceManager persistenceManager)
   {
      if (encodedData != null && encodedData.length > 0)
      {
         try
         {
            ByteArrayInputStream bais = new ByteArrayInputStream(encodedData);
            ObjectInputStream ois = new ObjectInputStream(bais);

            String type = ois.readUTF();

            ExportData exportData;
            if (ExportContext.TYPE.equals(type))
            {
               exportData = new ExportContext();
            }
            else if (ExportPortletData.TYPE.equals(type))
            {
               exportData = new ExportPortletData();
            }
            else
            {
               throw new IllegalArgumentException("Unknown ExportData type '" + type + "'");
            }

            T result = expected.cast(exportData);

            double version = ois.readDouble();
            if (!result.supports(version))
            {
               throw new IllegalArgumentException(expected.getSimpleName() + " doesn't know how to deal with version '" + version + "'");
            }

            String id = ois.readUTF();
            exportData.id = id;
            if (NO_ID.equals(id))
            {
               result.decodeExtraData(ois);
            }
            else
            {
               if(persistenceManager == null)
               {
                  throw new IllegalStateException("Encoded data points to persisted state, yet no ExportPersistenceManager has been provided to load state from persistence");
               }
               result = persistenceManager.loadExportData(id, expected);
            }

            return result;
         }
         catch (IOException e)
         {
            throw new IllegalArgumentException("Couldn't read from byte array", e);
         }
      }
      throw new IllegalArgumentException("Cannot create ExportData from null or empty byte array");
   }


   protected boolean supports(double version)
   {
      return Double.compare(getVersion(), version) == 0;
   }

   protected abstract void decodeExtraData(ObjectInputStream ois) throws IOException;
   protected abstract void encodeExtraData(ObjectOutputStream oos) throws IOException;


   public byte[] encodeAsBytes() throws IOException
   {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ObjectOutputStream oos = new ObjectOutputStream(baos);

      oos.writeUTF(getType());
      oos.writeDouble(getVersion());
      oos.writeUTF(id);

      encodeExtraData(oos);

      oos.close();

      return baos.toByteArray();
   }

   protected abstract double getVersion();

   protected abstract String getType();

   public String getId()
   {
      return id;
   }

   public void setId(String id)
   {
      this.id = id;
   }
}
TOP

Related Classes of org.gatein.exports.data.ExportData

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.