/*
 *  Copyright (c) 1995-2012, The University of Sheffield. See the file
 *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *  Valentin Tablan 26/10/2001
 *
 *  $Id: DSPersistence.java 18176 2014-07-11 15:45:13Z johann_p $
 *
 */
package gate.util.persistence;

import java.net.MalformedURLException;
import java.util.Iterator;

import gate.*;
import gate.creole.ResourceInstantiationException;
import gate.persist.PersistenceException;
import java.net.URL;

public class DSPersistence extends AbstractPersistence{


  /**
   * Populates this Persistence with the data that needs to be stored from the
   * original source object.
   */
  @Override
  public void extractDataFromSource(Object source)throws PersistenceException{
    //check input
    if(! (source instanceof DataStore)){
      throw new UnsupportedOperationException(
                getClass().getName() + " can only be used for " +
                DataStore.class.getName() +
                " objects!\n" + source.getClass().getName() +
                " is not a " + DataStore.class.getName());
    }

    DataStore ds = (DataStore)source;
    className = ds.getClass().getName();
    storageUrlString = ds.getStorageUrl();
    try {
      storageUrl = PersistenceManager.getPersistentRepresentation(
        new URL(storageUrlString));
    } catch(MalformedURLException e) {
      // ignore and just stay with storageUrlString
    }
  }

  /**
   * Creates a new object from the data contained. This new object is supposed
   * to be a copy for the original object used as source for data extraction.
   */
  @Override
  public Object createObject()throws PersistenceException,
                                     ResourceInstantiationException{
    if(storageUrl != null) {
      storageUrlString =
        ((URL)PersistenceManager.getTransientRepresentation(storageUrl))
          .toExternalForm();
    }

    //check if the same datastore is not already open
    Iterator<DataStore> dsIter = Gate.getDataStoreRegister().iterator();
    while(dsIter.hasNext()){
      DataStore aDS = dsIter.next();
      if(aDS.getStorageUrl().equals(storageUrlString)) {
        return aDS;
      }
    }
    //if we got this far, then it's a new datastore that needs opening
    return Factory.openDataStore(className, storageUrlString);
  }
 
  protected String className;
  protected String storageUrlString;
  protected Object storageUrl;
  static final long serialVersionUID = 5952924943977701708L;
}