/******************************************************************************* * Copyright (c) 2012, 2013 Wind River Systems, Inc. and others. 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 * * Contributors: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.tcf.te.ui.views.internal.categories; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.tcf.te.runtime.events.ChangeEvent; import org.eclipse.tcf.te.runtime.events.EventManager; import org.eclipse.tcf.te.runtime.persistence.interfaces.IURIPersistenceService; import org.eclipse.tcf.te.runtime.services.ServiceManager; import org.eclipse.tcf.te.ui.views.activator.UIPlugin; import org.eclipse.tcf.te.ui.views.extensions.CategoriesExtensionPointManager; import org.eclipse.tcf.te.ui.views.interfaces.categories.ICategoryManager; /** * Category manager implementation. */ public class CategoryManager implements ICategoryManager { // The map maintaining the id list per category id private Map<String, List<String>> cat2id = new HashMap<String, List<String>>(); // The map maintaining the category id list per id private Map<String, List<String>> id2cat = new HashMap<String, List<String>>(); // The map maintaining the transient id list per category id private final Map<String, List<String>> _t_cat2id = new HashMap<String, List<String>>(); // The map maintaining the transient category id list per id private final Map<String, List<String>> _t_id2cat = new HashMap<String, List<String>>(); /** * Constructor. */ public CategoryManager() { super(); initialize(); } /** * Returns the root path where to persist the maps between the sessions. * * @return The root path or <code>null</code>. */ private IPath getRoot() { try { File file = UIPlugin.getDefault().getStateLocation().toFile(); boolean exists = file.exists(); if (!exists) { exists = file.mkdirs(); } if (exists && file.canRead() && file.isDirectory()) { return new Path(file.toString()); } } catch (IllegalStateException e) { /* ignored on purpose */ } File file = new Path(System.getProperty("user.home")).append(".tcf").toFile(); //$NON-NLS-1$ //$NON-NLS-2$ if (file.canRead() && file.isDirectory()) { return new Path(file.toString()); } return null; } /** * Initialize the category manager. */ @SuppressWarnings("unchecked") private void initialize() { IPath root = getRoot(); if (root == null) { return; } // Clear out the transient maps _t_cat2id.clear(); _t_id2cat.clear(); cat2id.clear(); id2cat.clear(); try { // Get the persistence service IURIPersistenceService uRIPersistenceService = ServiceManager.getInstance().getService(IURIPersistenceService.class); if (uRIPersistenceService == null) { throw new IOException("Persistence service instance unavailable."); //$NON-NLS-1$ } // Save the history to the persistence storage cat2id = (Map<String,List<String>>)uRIPersistenceService.read(cat2id, root.append("cat2id.json").toFile().toURI()); //$NON-NLS-1$ } catch (IOException e) { } try { // Get the persistence service IURIPersistenceService uRIPersistenceService = ServiceManager.getInstance().getService(IURIPersistenceService.class); if (uRIPersistenceService == null) { throw new IOException("Persistence service instance unavailable."); //$NON-NLS-1$ } // Save the history to the persistence storage id2cat = (Map<String,List<String>>)uRIPersistenceService.read(id2cat, root.append("id2cat.json").toFile().toURI()); //$NON-NLS-1$ } catch (IOException e) { } } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.categories.ICategoryManager#flush() */ @Override public void flush() { IPath root = getRoot(); if (root == null) { return; } try { // Get the persistence service IURIPersistenceService uRIPersistenceService = ServiceManager.getInstance().getService(IURIPersistenceService.class); if (uRIPersistenceService == null) { throw new IOException("Persistence service instance unavailable."); //$NON-NLS-1$ } // Save the history to the persistence storage uRIPersistenceService.write(cat2id, root.append("cat2id.json").toFile().toURI()); //$NON-NLS-1$ } catch (IOException e) { } try { // Get the persistence service IURIPersistenceService uRIPersistenceService = ServiceManager.getInstance().getService(IURIPersistenceService.class); if (uRIPersistenceService == null) { throw new IOException("Persistence service instance unavailable."); //$NON-NLS-1$ } // Save the history to the persistence storage uRIPersistenceService.write(id2cat, root.append("id2cat.json").toFile().toURI()); //$NON-NLS-1$ } catch (IOException e) { } } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.categories.ICategoryManager#add(java.lang.String, java.lang.String) */ @Override public boolean add(String categoryId, String id) { Assert.isNotNull(categoryId); Assert.isNotNull(id); boolean added = false; List<String> ids = cat2id.get(categoryId); if (ids == null) { ids = new ArrayList<String>(); cat2id.put(categoryId, ids); } if (!ids.contains(id)) { added |= ids.add(id); } List<String> cats = id2cat.get(id); if (cats == null) { cats = new ArrayList<String>(); id2cat.put(id, cats); } if (!cats.contains(categoryId)) { added |= cats.add(categoryId); } if (added) { flush(); EventManager.getInstance().fireEvent( new ChangeEvent(CategoriesExtensionPointManager.getInstance().getCategory(categoryId, false), ChangeEvent.ID_ADDED, null, id)); } return added; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.interfaces.categories.ICategoryManager#addTransient(java.lang.String, java.lang.String) */ @Override public boolean addTransient(String categoryId, String id) { Assert.isNotNull(categoryId); Assert.isNotNull(id); boolean added = false; List<String> ids = _t_cat2id.get(categoryId); if (ids == null) { ids = new ArrayList<String>(); _t_cat2id.put(categoryId, ids); } if (!ids.contains(id)) { added |= ids.add(id); } List<String> cats = _t_id2cat.get(id); if (cats == null) { cats = new ArrayList<String>(); _t_id2cat.put(id, cats); } if (!cats.contains(categoryId)) { added |= cats.add(categoryId); } if (added) { EventManager.getInstance().fireEvent( new ChangeEvent(CategoriesExtensionPointManager.getInstance().getCategory(categoryId, false), ChangeEvent.ID_ADDED, null, id)); } return added; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.categories.ICategoryManager#remove(java.lang.String, java.lang.String) */ @Override public boolean remove(String categoryId, String id) { Assert.isNotNull(categoryId); Assert.isNotNull(id); boolean removed = false; List<String> ids = cat2id.get(categoryId); if (ids != null) { removed |= ids.remove(id); if (ids.isEmpty()) { cat2id.remove(categoryId); } } ids = _t_cat2id.get(categoryId); if (ids != null) { removed |= ids.remove(id); if (ids.isEmpty()) { _t_cat2id.remove(categoryId); } } List<String> cats = id2cat.get(id); if (cats != null) { removed |= cats.remove(categoryId); if (cats.isEmpty()) { id2cat.remove(id); } } cats = _t_id2cat.get(id); if (cats != null) { removed |= cats.remove(categoryId); if (cats.isEmpty()) { _t_id2cat.remove(id); } } if (removed) { flush(); EventManager.getInstance().fireEvent( new ChangeEvent(CategoriesExtensionPointManager.getInstance().getCategory(categoryId, false), ChangeEvent.ID_REMOVED, id, null)); } return removed; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.categories.ICategoryManager#belongsTo(java.lang.String, java.lang.String) */ @Override public boolean belongsTo(String categoryId, String id) { Assert.isNotNull(categoryId); Assert.isNotNull(id); boolean belongsTo = isLinked(categoryId, id); List<String> ids = cat2id.get(categoryId); if (!belongsTo) { ids = _t_cat2id.get(categoryId); if (ids != null && ids.contains(id)) { belongsTo = true; } } return belongsTo; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.interfaces.categories.ICategoryManager#isLinked(java.lang.String, java.lang.String) */ @Override public boolean isLinked(String categoryId, String id) { Assert.isNotNull(categoryId); Assert.isNotNull(id); boolean belongsTo = false; List<String> ids = cat2id.get(categoryId); if (ids != null && ids.contains(id)) { belongsTo = true; } return belongsTo; } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.categories.ICategoryManager#getCategoryIds(java.lang.String) */ @Override public String[] getCategoryIds(String id) { Assert.isNotNull(id); List<String> allCategories = new ArrayList<String>(); List<String> cats = id2cat.get(id); if (cats != null) { allCategories.addAll(cats); } cats = _t_id2cat.get(id); if (cats != null) { for (String cat : cats) { if (!allCategories.contains(cat)) { allCategories.add(cat); } } } return allCategories.toArray(new String[allCategories.size()]); } /* (non-Javadoc) * @see org.eclipse.tcf.te.ui.views.interfaces.categories.ICategoryManager#getIdsForCategory(java.lang.String) */ @Override public String[] getIdsForCategory(String categoryId) { Assert.isNotNull(categoryId); List<String> allIds = new ArrayList<String>(); List<String> cats = cat2id.get(categoryId); if (cats != null) { allIds.addAll(cats); } cats = _t_cat2id.get(categoryId); if (cats != null) { for (String cat : cats) { if (!allIds.contains(cat)) { allIds.add(cat); } } } return allIds.toArray(new String[allIds.size()]); } }