/* * "Copyright (c) 2010-11 The Regents of the University of California. * All rights reserved. * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. * * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." * * Author: Jorge Ortiz (jortiz@cs.berkeley.edu) * IS4 release version 1.0 */ package local.metadata; import java.util.*; import java.util.logging.Logger; import java.util.logging.Level; import net.sf.json.*; import java.io.*; public class MetadataMngr implements Serializable { private static Logger logger = Logger.getLogger(MetadataMngr.class.getPackage().getName()); private static MetadataMngr metadataMngr = null; private static HashMap<String, Binding> bindTable = null; private static BindStateMngr bindStateMngr = null; protected static String IS4HOME=null; protected static String bindTableObjPath = "/.state/bindTable.obj"; private static boolean init = false; private MetadataMngr() { logger.info("Instantiated MetadataMngr"); if(bindStateMngr == null) bindStateMngr = BindStateMngr.getInstance(); if(!init) { try { initGlobalVars(); File f = new File(bindTableObjPath); if(!f.exists() && bindTable == null) { bindTable = new HashMap<String, Binding>(); } else if (f.exists()){ FileInputStream fileIn = new FileInputStream(f); ObjectInputStream in = new ObjectInputStream(fileIn); bindTable = (HashMap<String, Binding>)in.readObject(); } init = true; } catch (Exception e) { logger.log(Level.WARNING, "Error loading previous state", e); } } } public static MetadataMngr getInstance() { logger.info("Fetching local static instance of MetadataMngr"); if(metadataMngr == null) metadataMngr = new MetadataMngr(); return metadataMngr; } protected static void initGlobalVars(){ String home = System.getenv().get("IS4HOME"); if(IS4HOME == null && home !=null && !home.equals("")){ IS4HOME = home; bindTableObjPath = IS4HOME + bindTableObjPath; } else if(IS4HOME == null && home ==null || home.equals("")){ logger.severe("Environment variable not set"); System.exit(1); } } public boolean bind(String id, JSONObject metadata) { if(bindTable.containsKey(id)) return false; if(!metadata.containsKey("object_stream") || !metadata.containsKey("context_stream") || !metadata.containsKey("logic_stream")) return false; logger.info((new StringBuilder()).append("Binding: (\n\t").append(id).append(" --> \t\n").append(metadata.toString()).append("\n)").toString()); Binding binding = new Binding(id, metadata); bindStateMngr.manageBinding(binding); bindTable.put(id, binding); saveState(); return true; } public void touch(String id){ if(bindTable.containsKey(id)) { Binding b = bindTable.get(id); BindStateMngr.getInstance().updateBindingTimestamp(b); } } public boolean unbind(String id) { if(!bindTable.containsKey(id)) return false; logger.info((new StringBuilder()).append("unbinding: ").append(id).toString()); bindStateMngr.expireBinding(bindTable.get(id)); bindTable.remove(id); saveState(); return true; } public boolean rebind(String id, String name) { return false; } public boolean isBound(String id) { logger.info((new StringBuilder()).append("checking is ").append(id).append(" is bound?").toString()); return bindTable.containsKey(id); } public JSONArray getAllBoundIds(){ if(bindTable == null) logger.warning("bindTable is NULL"); Set<String> idsSet = bindTable.keySet(); JSONArray idsJArray = new JSONArray(); if(idsSet != null) { Iterator<String> ids = idsSet.iterator(); while(ids.hasNext()) idsJArray.add(ids.next()); } return idsJArray; } public synchronized void saveState(){ try { FileOutputStream fileOut = new FileOutputStream(bindTableObjPath); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(bindTable); logger.info("Wrote objectes"); } catch(Exception e) { logger.log(Level.WARNING, "Likely and IOException while writing objects", e); } } }