ResourcePersistence.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 25/10/2001
011  *
012  *  $Id: ResourcePersistence.java 18176 2014-07-11 15:45:13Z johann_p $
013  *
014  */
015 package gate.util.persistence;
016 
017 import gate.Factory;
018 import gate.FeatureMap;
019 import gate.Gate;
020 import gate.Resource;
021 import gate.creole.Parameter;
022 import gate.creole.ParameterList;
023 import gate.creole.ResourceData;
024 import gate.creole.ResourceInstantiationException;
025 import gate.persist.PersistenceException;
026 import gate.util.NameBearer;
027 
028 import java.util.Iterator;
029 import java.util.List;
030 import java.util.Map;
031 
032 import org.apache.log4j.Logger;
033 
034 /**
035  * Holds the data needed to serialise and recreate a {@link Resource}.
036  * This data is considered to be: the resource class name, the resource name,
037  * the resource features and the resource initialistion parameters.
038  */
039 class ResourcePersistence extends AbstractPersistence{
040 
041   protected static final Logger log = Logger.getLogger(ResourcePersistence.class);
042   
043   @Override
044   public void extractDataFromSource(Object sourcethrows PersistenceException{
045     if((source instanceof Resource)){
046       throw new UnsupportedOperationException(
047                 getClass().getName() " can only be used for " +
048                 Resource.class.getName() +
049                 " objects!\n" + source.getClass().getName() +
050                 " is not a " + Resource.class.getName());
051     }
052     Resource res = (Resource)source;
053     resourceType = res.getClass().getName();
054     resourceName = ((NameBearer)res).getName();
055 
056     ResourceData rData = Gate.getCreoleRegister().get(resourceType);
057     if(rData == nullthrow new PersistenceException(
058                                 "Could not find CREOLE data for " +
059                                 resourceType);
060     ParameterList params = rData.getParameterList();
061     try{
062       //get the values for the init time parameters
063       initParams = Factory.newFeatureMap();
064       //this is a list of lists
065       Iterator<List<Parameter>> parDisjIter = params.getInitimeParameters().iterator();
066       while(parDisjIter.hasNext()){
067         Iterator<Parameter> parIter = parDisjIter.next().iterator();
068         while(parIter.hasNext()){
069           Parameter parameter = parIter.next();
070           String parName = parameter.getName();
071           Object parValue = res.getParameterValue(parName);
072           ((FeatureMap)initParams).put(parName, parValue);
073         }
074       }
075       initParams = PersistenceManager.getPersistentRepresentation(initParams);
076 
077       //get the features
078       if(res.getFeatures() != null){
079         features = Factory.newFeatureMap();
080         ((FeatureMap)features).putAll(res.getFeatures());
081         features = PersistenceManager.getPersistentRepresentation(features);
082       }
083     }catch(ResourceInstantiationException rie){
084       throw new PersistenceException(rie);
085     }
086   }
087 
088 
089   @Override
090   public Object createObject()throws PersistenceException,
091                                      ResourceInstantiationException {
092     if(initParams != null)
093       initParams = PersistenceManager.getTransientRepresentation(
094               initParams,containingControllerName,initParamOverrides);
095     if(features != null)
096       features = PersistenceManager.getTransientRepresentation(
097               features,containingControllerName,initParamOverrides);
098     if(initParamOverrides != null) {
099       // check if there is a map for this resource Id in the overrides
100       String containingControllerNameToUse = 
101               containingControllerName == null "" : containingControllerName;
102       String resourceId = containingControllerNameToUse+"\t"+resourceName;
103       if(initParamOverrides.containsKey(resourceId)) {
104         Map<String,Object> parmOverrides = initParamOverrides.get(resourceId);
105         if(initParams instanceof FeatureMap) {
106           FeatureMap fm = (FeatureMap)initParams;
107           // override the values
108           // do this in a loop instead of using putAll so we can log the changes
109           for(String name : parmOverrides.keySet()) {
110             Object obj = parmOverrides.get(name);
111             log.info(
112                     "Overriding init parameter "+name+
113                     " for "+containingControllerNameToUse+
114                     "//"+resourceName+" with "+obj);
115             fm.put(name, obj);
116           }
117         }
118       }
119     
120     Resource res = Factory.createResource(resourceType, (FeatureMap)initParams,
121                                           (FeatureMap)features,resourceName);
122     return res;
123   }
124 
125   protected String resourceType;
126   protected String resourceName;
127   protected Object initParams;
128   protected Object features;
129   static final long serialVersionUID = -3196664486112887875L;
130 }