package com.marinilli.b2.c11.util;
import com.marinilli.b2.c11.util.Utilities;
import javax.jnlp.*;
import java.net.URL;
import java.io.*;
import java.util.*;
/**
 * Chapter 11 - utility wrapper for PersistenceService
 * @author Mauro Marinilli
 * @version 1.0
 */
public class PersistentStorage {
  private PersistenceService persistenceService;
  private long DEFAULT_SIZE = 2048L;
  public PersistentStorage() {
    persistenceService =
      (PersistenceService)Utilities.getService("javax.jnlp.PersistenceService");
  }
  public PersistentStorage(PersistenceService ps) {
    persistenceService = ps;
  }
  public void write(String keyString, Object value) {
    write(keyString, value, DEFAULT_SIZE);
  }
  public void write(String keyString, Object value, long maxLength) {
    write(getUrl(keyString), value, DEFAULT_SIZE);
  }
  public void write(URL url, Object value, long maxLength) {
    if (exists(url))
      removeEntry(url);
    try {
      persistenceService.create(url, maxLength);
      FileContents fc = persistenceService.get(url);
      ObjectOutputStream oos =
        new ObjectOutputStream(fc.getOutputStream(false));
      oos.writeObject(value);
      oos.close();
    } catch (IOException ioe) {
      System.out.println(getClass()+".write("+url+", "+value+"): "+ioe);
    }
  }
  public Object read(String keyString) {
    return read(getUrl(keyString));
  }
  public Object read(URL url) {
    if (!exists(url))
      return null;
    Object object = null;
    try {
      FileContents fc = persistenceService.get(url);
      ObjectInputStream ois = new ObjectInputStream(fc.getInputStream());
      object = ois.readObject();
    } catch (Exception e) {
      System.out.println(getClass()+".read("+url+"): "+e);
    }
    return object;
  }
  public boolean exists(URL url){
    try {
      if (persistenceService.getNames(url).length>0)
        return true;
    } catch (Exception e) {
      System.out.println(getClass()+".exists("+url+"): "+e);
    }
    return false;
  }
  public void synchronize(String keyString) {
    synchronize(getUrl(keyString));
  }
  public void synchronize(URL url) {
    try {
      if (persistenceService.getTag(url)==PersistenceService.DIRTY)
      persistenceService.setTag(url, persistenceService.CACHED);
    } catch (Exception e) {
      System.out.println(getClass()+".synchronize("+url+"): "+e);
    }
  }
  public void removeEntry(URL url) {
    try {
      persistenceService.delete(url);
    } catch (Exception e) {
      System.out.println(getClass()+".remove("+url+"): "+e);
    }
  }
  public List getEntries(String keyString) {
    return getEntries(getUrl(keyString));
  }
  public List getEntries(URL url) {
    List list =null;
    try {
      list=
        Collections.unmodifiableList(
          Arrays.asList(persistenceService.getNames(url)));
    } catch (Exception e) {
      System.out.println(getClass()+".getEntries("+url+"): "+e);
    }
    return list;
  }
  public PersistenceService getPersistenceService() {
    return persistenceService;
  }
  public URL getUrl(String keyString) {
    URL codebase = Utilities.getBasicService().getCodeBase();
    URL  url = null;
    try {
      url = new URL(codebase,keyString);
    } catch (IOException ioe) {
      System.out.println(getClass()+".getUrl("+keyString+"): "+ioe);
    }
    return url;
  }
}