/* * Created on 12-May-2004 * Created by Paul Gardner * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.pluginsimpl.local.update; /** * @author parg * */ import java.util.*; import org.gudy.azureus2.core3.util.*; import org.gudy.azureus2.plugins.update.*; import org.gudy.azureus2.plugins.utils.resourcedownloader.*; public class UpdateCheckerImpl implements UpdateChecker { protected UpdateCheckInstanceImpl check_instance; protected UpdatableComponentImpl component; protected AESemaphore semaphore; protected boolean completed; protected boolean failed; protected boolean cancelled; protected boolean sem_released; protected List listeners = new ArrayList(); protected List progress_listeners = new ArrayList(); protected AEMonitor this_mon = new AEMonitor( "UpdateChecker" ); protected UpdateCheckerImpl( UpdateCheckInstanceImpl _check_instance, UpdatableComponentImpl _component, AESemaphore _sem ) { check_instance = _check_instance; component = _component; semaphore = _sem; } public UpdateCheckInstance getCheckInstance() { return( check_instance ); } public Update addUpdate( String name, String[] description, String new_version, ResourceDownloader downloader, int restart_required ) { return( addUpdate( name, description, new_version, new ResourceDownloader[]{ downloader }, restart_required )); } public Update addUpdate( String name, String[] description, String new_version, ResourceDownloader[] downloaders, int restart_required ) { reportProgress( "Adding update: " + name ); return( check_instance.addUpdate( component, name, description, new_version, downloaders, restart_required )); } public UpdateInstaller createInstaller() throws UpdateException { return( check_instance.createInstaller()); } public UpdatableComponent getComponent() { return( component.getComponent()); } public void completed() { try{ this_mon.enter(); if ( !sem_released ){ completed = true; for (int i=0;i<listeners.size();i++){ try{ ((UpdateCheckerListener)listeners.get(i)).completed( this ); }catch( Throwable e ){ Debug.printStackTrace( e ); } } sem_released = true; semaphore.release(); } }finally{ this_mon.exit(); } } public void failed() { try{ this_mon.enter(); if ( !sem_released ){ failed = true; for (int i=0;i<listeners.size();i++){ try{ ((UpdateCheckerListener)listeners.get(i)).failed( this ); }catch( Throwable e ){ Debug.printStackTrace( e ); } } sem_released = true; semaphore.release(); } }finally{ this_mon.exit(); } } protected boolean getFailed() { return( failed ); } protected void cancel() { cancelled = true; for (int i=0;i<listeners.size();i++){ try{ ((UpdateCheckerListener)listeners.get(i)).cancelled( this ); }catch( Throwable e ){ Debug.printStackTrace(e); } } } public void addListener( UpdateCheckerListener l ) { try{ this_mon.enter(); listeners.add( l ); if ( failed ){ l.failed( this ); }else if ( completed ){ l.completed( this ); } if ( cancelled ){ l.cancelled( this ); } }finally{ this_mon.exit(); } } public void removeListener( UpdateCheckerListener l ) { try{ this_mon.enter(); listeners.remove(l); }finally{ this_mon.exit(); } } public void reportProgress( String str ) { List ref = progress_listeners; for (int i=0;i<ref.size();i++){ try{ ((UpdateProgressListener)ref.get(i)).reportProgress( str ); }catch( Throwable e ){ Debug.printStackTrace(e); } } } public void addProgressListener( UpdateProgressListener l ) { try{ this_mon.enter(); List new_l = new ArrayList( progress_listeners ); new_l.add( l ); progress_listeners = new_l; }finally{ this_mon.exit(); } } public void removeProgressListener( UpdateProgressListener l ) { try{ this_mon.enter(); List new_l = new ArrayList( progress_listeners ); new_l.remove( l ); progress_listeners = new_l; }finally{ this_mon.exit(); } } }