package hk.reality.stock.service; import hk.reality.stock.model.Portfolio; import hk.reality.stock.service.exception.StorageException; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.Vector; import org.apache.commons.io.IOUtils; import android.util.Log; import com.thoughtworks.xstream.io.StreamException; public class FilePortfolioService implements PortfolioService { private static final String STORAGE_FILE = "portfolio.xml"; private static final String TAG = "FilePortfolioService"; private File baseDirectory; private List<Portfolio> portfolios; public FilePortfolioService(File directory) { Log.i(TAG, "init portfolio service: " + directory.getAbsolutePath()); this.baseDirectory = directory; this.portfolios = loadOrCreateNew(); } @Override public void create(Portfolio p) { Log.i(TAG, "create portfolio: " + p.getName()); p.setId(UUID.randomUUID().toString()); portfolios.add(p); save(); } @Override public void delete(Portfolio p) { Log.i(TAG, "delete portfolio: " + p.getName()); portfolios.remove(p); save(); } @Override public List<Portfolio> list() { Log.i(TAG, "list portfolio "); return Collections.unmodifiableList(this.portfolios); } @Override public void update(Portfolio p) { Log.i(TAG, "update portfolio: " + p.getName()); int pos = portfolios.indexOf(p); if (pos > -1) { Portfolio orig = portfolios.get(pos); orig.setName(p.getName()); orig.setStocks(p.getStocks()); } else { throw new IllegalArgumentException("record not found"); } save(); } private List<Portfolio> loadOrCreateNew() { Log.i(TAG, "loading portfolio file ..."); File store = new File(baseDirectory, STORAGE_FILE); Reader reader = null; try { if (!store.exists()) { return new Vector<Portfolio>(); } reader = new FileReader(store); return PortfolioSerializer.fromXML(reader); } catch (IOException e) { throw new StorageException("failed storing datafile", e); } catch (StreamException se) { Log.w(TAG, "failed to read or write datafile", se); return new Vector<Portfolio>(); } finally { IOUtils.closeQuietly(reader); } } private void save() { Log.i(TAG, "saving portfolio file ..."); File store = new File(baseDirectory, STORAGE_FILE); Writer writer = null; try { if (!store.exists()) { store.createNewFile(); } writer = new BufferedWriter(new FileWriter(store)); String xml = PortfolioSerializer.toXML(portfolios); IOUtils.write(xml, writer); Log.i(TAG, "save completed"); } catch (IOException e) { throw new StorageException("failed storing datafile", e); } finally { IOUtils.closeQuietly(writer); } } }