sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi/src/com/nokia/carbide/cpp/internal/pi/model/PiManager.java
changeset 2 b9ab3b238396
child 5 844b047e260d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi/src/com/nokia/carbide/cpp/internal/pi/model/PiManager.java	Thu Feb 11 15:32:31 2010 +0200
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: 
+ *
+ */
+
+package com.nokia.carbide.cpp.internal.pi.model;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+
+import org.eclipse.ui.IMemento;
+import org.eclipse.ui.XMLMemento;
+
+import com.nokia.carbide.cpp.internal.pi.analyser.PIChangeEvent;
+import com.nokia.carbide.cpp.internal.pi.interfaces.IPiItem;
+import com.nokia.carbide.cpp.pi.PiPlugin;
+
+
+
+public class PiManager {
+	private static PiManager manager;
+	private Collection<IPiItem> favorites;
+	private ArrayList<PiManagerListener> listeners = new ArrayList<PiManagerListener>();
+	
+	private PiManager() {
+	}
+	
+   ///////////// IPiItem accessors ///////////////////////
+
+	public static PiManager getManager() {
+		if (manager == null)
+			manager = new PiManager();
+		return manager;
+	}
+	
+	public void synchronizePI() {
+		PIChangeEvent.action("synchronise"); //$NON-NLS-1$
+	}
+
+	public IPiItem[] getFavorites() {
+		if (favorites == null)
+			loadFavorites();
+		return favorites.toArray(
+			new IPiItem[favorites.size()]);
+	}
+	
+	public IPiItem newFavoriteFor(Object obj) {
+		PiItemType[] types =
+			PiItemType.getTypes();
+		for (int i = 0; i < types.length; i++) {
+			IPiItem item = types[i].newFavorite(obj);
+			if (item != null)
+				return item;
+		}
+		return null;
+	}
+
+	public IPiItem[] newFavoritesFor(Iterator iter) {
+		if (iter == null)
+			return IPiItem.NONE;
+		Collection<IPiItem> items = new HashSet<IPiItem>(20);
+		while (iter.hasNext()) {
+			IPiItem item =
+				newFavoriteFor((Object) iter.next());
+			if (item != null)
+				items.add(item);
+		}
+		return (IPiItem[]) items.toArray(
+			new IPiItem[items.size()]);
+	}
+
+	public IPiItem[] newFavoritesFor(Object[] objects) {
+		if (objects == null)
+			return IPiItem.NONE;
+		return newFavoritesFor(
+			Arrays.asList(objects).iterator());
+	}
+	
+	public IPiItem existingFavoriteFor(Object obj) {
+		if (obj == null)
+			return null;
+		Iterator<IPiItem> iter = favorites.iterator();
+		while (iter.hasNext()) {
+			IPiItem item = iter.next();
+			if (item.isPIFor(obj))
+				return item;
+		}
+		return null;
+	}
+
+	public IPiItem[] existingFavoritesFor(Iterator iter)
+	{
+		ArrayList<IPiItem> result = new ArrayList<IPiItem>(10);
+		while (iter.hasNext()) {
+			IPiItem item =
+				existingFavoriteFor(iter.next());
+			if (item != null)
+				result.add(item);
+		}
+		return (IPiItem[]) result.toArray(
+			new IPiItem[result.size()]);
+	}
+	
+	public void addFavorites(IPiItem[] items) {
+		if (favorites == null)
+			loadFavorites();
+		if (favorites.addAll(Arrays.asList(items)))
+			fireFavoritesChanged(items, IPiItem.NONE);
+	}
+	
+	public void removeFavorites(IPiItem[] items) {
+		if (favorites == null)
+			loadFavorites();
+		if (favorites.removeAll(Arrays.asList(items)))
+			fireFavoritesChanged(IPiItem.NONE, items);
+	}
+
+   /////////// Loading and Saving Favorites /////////////////
+
+   private static final String TAG_FAVORITES = "Favorites"; //$NON-NLS-1$
+   private static final String TAG_FAVORITE = "Favorite"; //$NON-NLS-1$
+   private static final String TAG_TYPEID = "TypeId"; //$NON-NLS-1$
+   private static final String TAG_INFO = "Info"; //$NON-NLS-1$
+   
+   private void loadFavorites() {
+      favorites = new HashSet<IPiItem>(20);
+      FileReader reader = null;
+      try {
+         reader = new FileReader(getFavoritesFile());
+         loadFavorites(XMLMemento.createReadRoot(reader));
+      }
+      catch (FileNotFoundException e) {
+         // ignored... no favorites exist yet
+      }
+      catch (Exception e) {
+         // log the exception and move on
+//         PILog.logError(e);
+      }
+      finally {
+         try {
+            if (reader != null)
+               reader.close();
+         }
+         catch (IOException e) {
+//            PILog.logError(e);
+         }
+      }
+   }
+   
+   private void loadFavorites(XMLMemento memento) {
+      IMemento[] children =
+         memento.getChildren(TAG_FAVORITE);
+      for (int i = 0; i < children.length; i++) {
+         IPiItem item =
+            newFavoriteFor(
+               children[i].getString(TAG_TYPEID),
+               children[i].getString(TAG_INFO));
+         if (item != null)
+            favorites.add(item);
+      }
+   }
+   
+   public IPiItem newFavoriteFor(String typeId, String info) {
+      PiItemType[] types = PiItemType.getTypes();
+      for (int i = 0; i < types.length; i++)
+         if (types[i].getID().equals(typeId))
+            return types[i].loadFavorite(info);
+      return null;
+   }
+   
+   public void saveFavorites() {
+      if (favorites == null)
+         return;
+      XMLMemento memento =
+         XMLMemento.createWriteRoot(TAG_FAVORITES);
+      saveFavorites(memento);
+      FileWriter writer = null;
+      try {
+         writer = new FileWriter(getFavoritesFile());
+         memento.save(writer);
+      }
+      catch (IOException e) {
+ //        PILog.logError(e);
+      }
+      finally {
+         try {
+            if (writer != null)
+               writer.close();
+         }
+         catch (IOException e) {
+//            PILog.logError(e);
+         }
+      }
+   }
+   
+   private void saveFavorites(XMLMemento memento) {
+      Iterator iter = favorites.iterator();
+      while (iter.hasNext()) {
+         IPiItem item = (IPiItem) iter.next();
+         IMemento child = memento.createChild(TAG_FAVORITE);
+         child.putString(TAG_TYPEID, item.getType().getID());
+         child.putString(TAG_INFO, item.getInfo());
+      }
+   }
+   
+   private File getFavoritesFile() {
+      return PiPlugin
+         .getDefault()
+         .getStateLocation()
+         .append(Messages.getString("PiManager.favoritesXmlFile")) //$NON-NLS-1$
+         .toFile();
+	}
+	
+   ///////////// FavoriteManagerListener methods ///////////////////////
+
+	public void addFavoritesManagerListener(PiManagerListener listener) {
+		if (!listeners.contains(listener))
+			listeners.add(listener);
+	}
+	
+	public void removeFavoritesManagerListener(PiManagerListener listener) {
+		listeners.remove(listener);
+	}
+	
+	private void fireFavoritesChanged(IPiItem[] itemsAdded, IPiItem[] itemsRemoved) {
+		PiManagerEvent event = new PiManagerEvent(this, itemsAdded, itemsRemoved);
+		for (Iterator<PiManagerListener> iter = listeners.iterator(); iter.hasNext();)
+			iter.next().piChanged(event);
+	}
+
+   ///////////// IResourceChangeListener //////////////////////
+   
+}