/******************************************************************************* * Copyright (c) 2009, 2010 Progress Software Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ package org.fusesource.tools.messaging.cnf.model; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.fusesource.tools.messaging.core.IListener; import org.fusesource.tools.messaging.core.ISender; /** * Handles all the changes in the model file */ public class DataModelManager { private final Map<IFile, Object> cachedModelMap; private static DataModelManager modelManager; private DataModelManager() { cachedModelMap = new HashMap<IFile, Object>(); } public static DataModelManager getInstance() { if (modelManager == null) { modelManager = new DataModelManager(); } return modelManager; } public void addDestination(IFile file, ISender sender) { Senders senders = (Senders) getModel(file); if (senders == null) { senders = new Senders(file); addModel(file, senders); } senders.addSender(sender); saveSenders(senders); } public void addDestination(IFile file, IListener listener) { Listeners listeners = (Listeners) getModel(file); if (listeners == null) { listeners = new Listeners(file); addModel(file, listeners); } listeners.addListener(listener); saveListeners(listeners); } public void removeDestination(IFile file, ISender sender) { Senders senders = (Senders) getModel(file); if (senders != null) { senders.removeSender(sender); saveSenders(senders); } } public void removeDestination(IFile file, IListener listener) { Listeners listeners = (Listeners) getModel(file); if (listeners != null) { listeners.removeListener(listener); saveListeners(listeners); } } public void saveSenders(Senders senders) { save(senders, senders.getModelFile()); } public void saveListeners(Listeners listeners) { save(listeners, listeners.getModelFile()); } public void saveListeners(IFile modelFile) { saveListeners((Listeners) cachedModelMap.get(modelFile)); } /** * writes the object to disk * * @param senderList * @param file */ private synchronized void save(final Object list, final IFile file) { ObjectOutputStream obj = null; try { FileOutputStream fileOutputStream = null; fileOutputStream = new FileOutputStream(file.getLocation().toOSString()); obj = new ObjectOutputStream(fileOutputStream); obj.writeObject(list); obj.flush(); file.getProject().refreshLocal(IResource.DEPTH_INFINITE, null); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (CoreException e) { e.printStackTrace(); } finally { if (obj != null) { try { obj.close(); } catch (IOException e) { e.printStackTrace(); } } } } public Senders loadSenders(IFile modelFile) throws Exception { createFileIfRequired(modelFile); FileInputStream inputStream = null; ObjectInputStream objInputStream = null; Senders senderList = null; try { inputStream = new FileInputStream(modelFile.getLocation().toOSString()); if (inputStream.available() == 0) { return null; } objInputStream = new ObjectInputStream(inputStream); senderList = (Senders) objInputStream.readObject(); // Set the model File, since we did not serialize this member senderList.setModelFile(modelFile); } finally { if (objInputStream != null) { objInputStream.close(); } if (inputStream != null) { inputStream.close(); } } return senderList; } public Listeners loadListeners(IFile modelFile) throws Exception { createFileIfRequired(modelFile); FileInputStream inputStream = null; ObjectInputStream objInputStream = null; Listeners listenerList = null; try { inputStream = new FileInputStream(modelFile.getLocation().toOSString()); if (inputStream.available() == 0) { return null; } objInputStream = new ObjectInputStream(inputStream); listenerList = (Listeners) objInputStream.readObject(); // Set the model File, since we did not serialize this member listenerList.setModelFile(modelFile); } finally { if (objInputStream != null) { objInputStream.close(); } if (inputStream != null) { inputStream.close(); } } return listenerList; } private void createFileIfRequired(IFile modelFile) throws CoreException { if (!modelFile.exists()) { modelFile.create(new ByteArrayInputStream(new byte[] {}), true, null); } } /** * Load the model from the given file, if possible. * * @param modelFile * The IFile which contains the persisted model * @throws CoreException */ private void updateModel(IFile modelFile) { Object object = null; try { createFileIfRequired(modelFile); if (IModelConstants.SENDERS_EXT.equals(modelFile.getFileExtension())) { object = loadSenders(modelFile); } else if (IModelConstants.LISTENERS_EXT.equals(modelFile.getFileExtension())) { object = loadListeners(modelFile); } if (object != null) { addModel(modelFile, object); } } catch (IOException e) { e.printStackTrace();// TODO log to problems view } catch (Exception e) { e.printStackTrace(); } } public void clear() { cachedModelMap.clear(); } private void addModel(IFile file, Object object) { cachedModelMap.put(file, object); } public Object getModel(IFile file) { if (cachedModelMap.get(file) == null) { updateModel(file); } return cachedModelMap.get(file); } }