/****************************************************************************** * Copyright (c) 2009-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsoucing.petals.repositories.explorer; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchListener; import org.eclipse.ui.PlatformUI; import com.ebmwebsoucing.petals.repositories.explorer.model.Repository; /** * The class in charge of managing all the end-point sources. * <p> * When a source must be added, removed, or is changed, it must be signaled * in this class. The changes will be propagated to listeners. * </p> * * @author Vincent Zurczak - EBM WebSourcing */ public class RepositoryManager { private static RepositoryManager instance = new RepositoryManager (); private final Collection<Repository> repositories = new HashSet<Repository> (); private final List<IRepositoryChangeListener> listeners = new ArrayList<IRepositoryChangeListener> (); private boolean restoredSources = false; /** * Constructor. */ private RepositoryManager() { // Listen to the workbench // Release resources when the workbench is closed PlatformUI.getWorkbench().addWorkbenchListener( new IWorkbenchListener() { public boolean preShutdown( IWorkbench workbench, boolean forced ) { // Dispose remaining repositories for( Repository repo : RepositoryManager.this.repositories ) repo.releaseResource(); return true; } public void postShutdown( IWorkbench workbench ) { // nothing } }); } /** * @return */ public static RepositoryManager getInstance() { return instance; } /** * Returns the list of repositories. * <p> * If repositories were stored and not yet restored, they are restored. * </p> * * @return the repositories */ public Collection<Repository> getRepositories() { if( ! this.restoredSources ) { // restoreSavedSources(); this.restoredSources = true; } return Collections.unmodifiableCollection( this.repositories ); } /** * @param repository * @return * @see java.util.List#add(java.lang.Object) */ public boolean addRepository( Repository repository ) { boolean result = this.repositories.add( repository ); for( IRepositoryChangeListener listener : this.listeners ) listener.repositoryAdded( repository ); // storeSources(); return result; } /** * @param repository * @return * @see java.util.List#remove(java.lang.Object) */ public boolean removeRepository( Repository repository ) { boolean result = this.repositories.remove( repository ); for( IRepositoryChangeListener listener : this.listeners ) listener.repositoryRemoved( repository ); repository.releaseResource(); // storeSources(); return result; } /** * @param repository */ public void updateRepository( Repository repository ) { // repository.refreshServiceUnitList(); for( IRepositoryChangeListener listener : this.listeners ) listener.repositoryChanged( repository ); } /** * @param listener * @return * @see java.util.List#add(java.lang.Object) */ public boolean registerListener( IRepositoryChangeListener listener ) { return this.listeners.add( listener ); } /** * @param listener * @return * @see java.util.List#remove(java.lang.Object) */ public boolean unregisterListener( IRepositoryChangeListener listener ) { return this.listeners.remove( listener ); } // /** // * Restores the saved sources. // * <p> // * If no source was saved, the workspace source is added. // * </p> // */ // private void restoreSavedSources() { // // // Workspace // this.sources.add( this.currentWorkspaceSource ); // // // External workspaces // IPreferenceStore store = PetalsServicesPlugin.getDefault().getPreferenceStore(); // String prefs = store.getString( EXT_WK_SRC_PREF ); // for( String pref : prefs.split( ";;" )) { // // if( pref.trim().length() == 0 ) // continue; // // File f = new File( pref ); // if( f.exists()) // this.sources.add( new ExternalWorkspaceSource( f )); // } // // // SA Folders // prefs = store.getString( SA_FLDR_SRC_PREF ); // for( String pref : prefs.split( ";;" )) { // // if( pref.trim().length() == 0 ) // continue; // // File f = new File( pref ); // if( f.exists()) // this.sources.add( new SaDirectorySource( f, false, false )); // } // } // // // /** // * Saves the sources in the preferences, so that they can be restored at next startup. // */ // private void storeSources() { // // StringBuffer extWk = new StringBuffer(); // StringBuffer saFldr = new StringBuffer(); // for( EndpointSource source : this.sources ) { // // if( source instanceof ExternalWorkspaceSource ) { // extWk.append(((ExternalWorkspaceSource) source).getDirectory().getAbsolutePath()); // extWk.append( ";;" ); // } // else if( source instanceof SaDirectorySource ) { // saFldr.append(((SaDirectorySource) source).getDirectoryOrSaFile().getAbsolutePath()); // saFldr.append( ";;" ); // } // } // // IPreferenceStore store = PetalsServicesPlugin.getDefault().getPreferenceStore(); // store.setValue( EXT_WK_SRC_PREF, extWk.toString()); // store.setValue( SA_FLDR_SRC_PREF, saFldr.toString()); // } }