/*
* File : TorrentDownloader2Impl.java
* Created : 27-Feb-2004
* By : parg
*
* Azureus - a Java Bittorrent client
*
* 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.
*
* 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 ( see the LICENSE file ).
*
* 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
*/
package org.gudy.azureus2.pluginsimpl.local.utils.resourcedownloader;
/**
* @author parg
*
*/
import java.util.*;
import java.io.*;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.utils.resourcedownloader.*;
public abstract class
ResourceDownloaderBaseImpl
implements ResourceDownloader
{
private List listeners = new ArrayList();
private boolean result_informed;
private Object result_informed_data;
private ResourceDownloaderBaseImpl parent;
private List children = new ArrayList();
private boolean download_cancelled;
private Map properties = new HashMap();
protected AEMonitor this_mon = new AEMonitor( "ResourceDownloader" );
protected
ResourceDownloaderBaseImpl(
ResourceDownloaderBaseImpl _parent )
{
parent = _parent;
if ( parent != null ){
parent.addChild(this);
}
}
public abstract ResourceDownloaderBaseImpl
getClone(
ResourceDownloaderBaseImpl _parent );
protected abstract void
setSize(
long size );
public Object
getProperty(
String name )
throws ResourceDownloaderException
{
// hack this, properties are read during size acquisition - should treat size as a property
// too....
getSize();
return( properties.get( name ));
}
protected void
setPropertySupport(
String name,
Object value )
{
properties.put( name, value );
}
protected void
setProperties(
ResourceDownloaderBaseImpl other )
{
Map p = other.properties;
Iterator it = p.keySet().iterator();
while( it.hasNext()){
String key = (String)it.next();
setProperty( key, p.get(key));
}
}
protected abstract void
setProperty(
String name,
Object value );
protected void
setParent(
ResourceDownloader _parent )
{
ResourceDownloaderBaseImpl old_parent = parent;
parent = (ResourceDownloaderBaseImpl)_parent;
if( old_parent != null ){
old_parent.removeChild( this );
}
if ( parent != null ){
parent.addChild( this );
}
}
protected ResourceDownloaderBaseImpl
getParent()
{
return( parent );
}
protected void
addChild(
ResourceDownloaderBaseImpl kid )
{
children.add( kid );
}
protected void
removeChild(
ResourceDownloaderBaseImpl kid )
{
children.remove( kid );
}
protected List
getChildren()
{
return( children );
}
protected String
getLogIndent()
{
String indent = "";
ResourceDownloaderBaseImpl pos = parent;
while( pos != null ){
indent += " ";
pos = pos.getParent();
}
return( indent );
}
// adds a listener that simply logs messages. used during size getting
protected void
addReportListener(
ResourceDownloader rd )
{
rd.addListener(
new ResourceDownloaderAdapter()
{
public void
reportActivity(
ResourceDownloader downloader,
String activity )
{
informActivity( activity );
}
public void
failed(
ResourceDownloader downloader,
ResourceDownloaderException e )
{
informActivity( downloader.getName() + ":" + e.getMessage());
}
});
}
protected void
informPercentDone(
int percentage )
{
for (int i=0;i<listeners.size();i++){
try{
((ResourceDownloaderListener)listeners.get(i)).reportPercentComplete(this,percentage);
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
protected void
informAmountComplete(
long amount )
{
for (int i=0;i<listeners.size();i++){
try{
((ResourceDownloaderListener)listeners.get(i)).reportAmountComplete(this,amount);
}catch( NoSuchMethodError e ){
// handle addition of this new method with old impls
}catch( AbstractMethodError e ){
// handle addition of this new method with old impls
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
public void
reportActivity(
String str )
{
informActivity( str );
}
protected void
informActivity(
String activity )
{
for (int i=0;i<listeners.size();i++){
try{
((ResourceDownloaderListener)listeners.get(i)).reportActivity(this,activity);
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
protected boolean
informComplete(
InputStream is )
{
if ( !result_informed ){
for (int i=0;i<listeners.size();i++){
try{
if ( !((ResourceDownloaderListener)listeners.get(i)).completed(this,is)){
return( false );
}
}catch( Throwable e ){
Debug.printStackTrace(e);
return( false );
}
}
result_informed = true;
result_informed_data = is;
}
return( true );
}
protected void
informFailed(
ResourceDownloaderException e )
{
if ( !result_informed ){
result_informed = true;
result_informed_data = e;
for (int i=0;i<listeners.size();i++){
try{
((ResourceDownloaderListener)listeners.get(i)).failed(this,e);
}catch( Throwable f ){
Debug.printStackTrace(f);
}
}
}
}
public void
reportActivity(
ResourceDownloader downloader,
String activity )
{
informActivity( activity );
}
public void
reportPercentComplete(
ResourceDownloader downloader,
int percentage )
{
informPercentDone( percentage );
}
public void
reportAmountComplete(
ResourceDownloader downloader,
long amount )
{
informAmountComplete( amount );
}
protected void
setCancelled()
{
download_cancelled = true;
}
public boolean
isCancelled()
{
return( download_cancelled );
}
public void
addListener(
ResourceDownloaderListener l )
{
listeners.add( l );
if ( result_informed ){
if (result_informed_data instanceof InputStream ){
l.completed( this, (InputStream)result_informed_data);
}else{
l.failed( this, (ResourceDownloaderException)result_informed_data);
}
}
}
public void
removeListener(
ResourceDownloaderListener l )
{
listeners.remove(l);
}
}