/*******************************************************************************
* Copyright 2012 Geoscience Australia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package au.gov.ga.earthsci.bookmark.model;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Singleton;
import org.eclipse.e4.core.di.annotations.Creatable;
import au.gov.ga.earthsci.bookmark.Messages;
import au.gov.ga.earthsci.bookmark.io.BookmarksPersister;
import au.gov.ga.earthsci.common.collection.ArrayListTreeMap;
import au.gov.ga.earthsci.common.persistence.Exportable;
import au.gov.ga.earthsci.common.persistence.Persistent;
import au.gov.ga.earthsci.common.util.AbstractPropertyChangeBean;
/**
* The default implementation of the {@link IBookmarks} interface.
* <p/>
* Uses a maps for fast lookup of lists by name/id.
*
* @author James Navin (james.navin@ga.gov.au)
*/
@Exportable
@Creatable
@Singleton
public class Bookmarks extends AbstractPropertyChangeBean implements IBookmarks
{
private static final String DEFAULT_LIST_ID = "au.gov.ga.earthsci.bookmark.list.default"; //$NON-NLS-1$
private ArrayListTreeMap<String, IBookmarkList> nameToListMap = new ArrayListTreeMap<String, IBookmarkList>();
private Map<String, IBookmarkList> idToListMap = new HashMap<String, IBookmarkList>();
private IBookmarkList defaultList;
@PostConstruct
public void load()
{
BookmarksPersister.loadFromWorkspace(this);
}
@PreDestroy
public void save()
{
BookmarksPersister.saveToWorkspace(this);
}
public Bookmarks()
{
initialiseDefaultList();
}
@Override
public IBookmarkList getListByName(String name)
{
List<IBookmarkList> lists = nameToListMap.get(name);
if (lists != null && lists.size() > 0)
{
return lists.get(0);
}
return null;
}
@Override
public IBookmarkList getListById(String id)
{
return idToListMap.get(id);
}
@Override
public IBookmarkList getDefaultList()
{
return defaultList;
}
@Persistent
@Override
public IBookmarkList[] getLists()
{
return nameToListMap.flatValues().toArray(new IBookmarkList[0]);
}
@Override
public void setLists(IBookmarkList[] lists)
{
IBookmarkList[] oldLists = getLists();
idToListMap.clear();
nameToListMap.clear();
defaultList = null;
if (lists != null)
{
for (IBookmarkList list : lists)
{
doAddList(list, false);
}
}
if (defaultList == null)
{
initialiseDefaultList();
}
firePropertyChange("lists", oldLists, getLists()); //$NON-NLS-1$
}
@Override
public void addList(IBookmarkList list)
{
doAddList(list, true);
}
private void doAddList(IBookmarkList list, boolean raiseEvent)
{
if (list == null)
{
return;
}
IBookmarkList[] oldLists = getLists();
if (idToListMap.containsKey(list.getId()))
{
IBookmarkList toRemove = idToListMap.get(list.getId());
nameToListMap.removeSingle(toRemove.getName(), toRemove);
}
idToListMap.put(list.getId(), list);
nameToListMap.putSingle(list.getName(), list);
if (list.getId().equals(DEFAULT_LIST_ID))
{
defaultList = list;
firePropertyChange("defaultList", this.defaultList, this.defaultList = list); //$NON-NLS-1$
}
if (raiseEvent)
{
firePropertyChange("lists", oldLists, getLists()); //$NON-NLS-1$
}
}
@Override
public boolean removeList(IBookmarkList list)
{
if (list == null || !idToListMap.containsKey(list.getId()) || list.getId().equals(DEFAULT_LIST_ID))
{
return false;
}
IBookmarkList[] oldLists = getLists();
idToListMap.remove(list.getId());
nameToListMap.removeSingle(list.getName(), list);
firePropertyChange("lists", oldLists, getLists()); //$NON-NLS-1$
return true;
}
private void initialiseDefaultList()
{
BookmarkList defaultList = new BookmarkList();
defaultList.setId(DEFAULT_LIST_ID);
defaultList.setName(Messages.Bookmarks_DefaultListName);
addList(defaultList);
}
}