CollectionPersistence.java
001 /*
002  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
003  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  Valentin Tablan 26/10/2001
011  *
012  *  $Id: CollectionPersistence.java 18176 2014-07-11 15:45:13Z johann_p $
013  *
014  */
015 package gate.util.persistence;
016 
017 import gate.creole.ResourceInstantiationException;
018 import gate.persist.PersistenceException;
019 import gate.util.Err;
020 
021 import java.io.Serializable;
022 import java.util.ArrayList;
023 import java.util.Arrays;
024 import java.util.Collection;
025 import java.util.Iterator;
026 import java.util.List;
027 
028 
029 public class CollectionPersistence extends AbstractPersistence {
030 
031   /**
032    * Populates this Persistence with the data that needs to be stored from the
033    * original source object.
034    */
035   @Override
036   public void extractDataFromSource(Object source)throws PersistenceException{
037     if((source instanceof Collection)){
038       throw new UnsupportedOperationException(
039                 getClass().getName() " can only be used for " +
040                 Collection.class.getName() +
041                 " objects!\n" + source.getClass().getName() +
042                 " is not a " + Collection.class.getName());
043     }
044     collectionType = source.getClass();
045 
046     Collection<?> coll = (Collection<?>)source;
047 
048     //get the values in the iterator's order
049     localList = new ArrayList<Serializable>(coll.size());
050     Iterator<?> elemIter = coll.iterator();
051     while(elemIter.hasNext()){
052       localList.add(PersistenceManager.
053                     getPersistentRepresentation(elemIter.next()));
054     }
055   }
056 
057   /**
058    * Creates a new object from the data contained. This new object is supposed
059    * to be a copy for the original object used as source for data extraction.
060    */
061   @SuppressWarnings("unchecked")
062   @Override
063   public Object createObject()throws PersistenceException,
064                                      ResourceInstantiationException{
065     List<String> exceptionsOccurred = new ArrayList<String>();
066     //let's try to create a collection of the same type as the original
067     Collection<Object> result = null;
068     try{
069       result = (Collection<Object>)collectionType.newInstance();
070     }catch(Exception e){
071       // ignore - if we can't create a collection of the original type
072       // for any reason, just create an ArrayList as a fallback.  The
073       // main use for this class is to persist parameter values for
074       // GATE resources, and GATE can convert an ArrayList to any type
075       // required by a resource parameter.
076     }
077     if(result == nullresult = new ArrayList<Object>(localList.size());
078 
079     //now we have the collection let's populate it
080     for(Object local : localList) {
081       try {
082         result.add(PersistenceManager.getTransientRepresentation(
083                 local,containingControllerName,initParamOverrides));
084       }
085       catch(PersistenceException pe) {
086         exceptionsOccurred.add(pe.getMessage());
087         pe.printStackTrace(Err.getPrintWriter());
088       }
089       catch(ResourceInstantiationException rie) {
090         exceptionsOccurred.add(rie.getMessage());
091         rie.printStackTrace(Err.getPrintWriter());
092       }
093     }
094 
095     if(exceptionsOccurred.size() 0) {
096       throw new PersistenceException("Some resources cannot be restored:\n" +
097         Arrays.toString(exceptionsOccurred
098         .toArray(new String[exceptionsOccurred.size()]))
099         .replaceAll("[\\]\\[]""").replaceAll(", ""\n"));
100     }
101 
102     return result;
103   }
104 
105 
106   protected List<Serializable> localList;
107   protected Class<?> collectionType;
108   static final long serialVersionUID = 7908364068699089834L;
109 }