gt: 					if ( !(file_name.equals( "." ) || file_name.equals( ".." ))){
context: /*
   * File    : ShareResourceImpl.java
   * Created : 31-Dec-2003
   * 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.sharing;
  
  /**
   * @author parg
   *
   */
  
  import java.util.*;
  import java.io.*;
  
  import org.gudy.azureus2.plugins.sharing.*;
  import org.gudy.azureus2.plugins.torrent.TorrentAttribute;
  import org.gudy.azureus2.pluginsimpl.local.torrent.TorrentManagerImpl;
  import org.gudy.azureus2.core3.util.*;
  import org.gudy.azureus2.core3.internat.*;
  
  public abstract class 
  ShareResourceImpl
  	implements ShareResource
  {
  	protected static BrokenMd5Hasher	hasher = new BrokenMd5Hasher();
  	
  	protected ShareManagerImpl				manager;
  	protected int							type;
  	protected ShareResourceDirContents		parent;
  	
  	protected Map	attributes			= new HashMap();
  	
  	protected List	change_listeners 	= new ArrayList();
  	protected List	deletion_listeners 	= new ArrayList();
  	
  		// new constructor
  	
  	protected
  	ShareResourceImpl(
  		ShareManagerImpl	_manager,
  		int					_type )
  	{
  		manager	= _manager;
  		type 	= _type;
  	}
  
  		// deserialised constructor
  	
  	protected
  	ShareResourceImpl(
  		ShareManagerImpl	_manager,
  		int					_type,
  		Map					_map )
  	{
  		manager	= _manager;
  		type 	= _type;
  		
  		Map	attrs = (Map)_map.get( "attributes" );
  		
  		if ( attrs != null ){
  			
  			Iterator	keys = attrs.keySet().iterator();
  			
  			while( keys.hasNext()){
  				
  				String	key = (String)keys.next();
  				
  				try{
  					String	value = new String((byte[])attrs.get(key), Constants.DEFAULT_ENCODING );
  				
  					TorrentAttribute ta = TorrentManagerImpl.getSingleton().getAttribute( key );
  					
  					if ( ta == null ){
  						
  						Debug.out( "Invalid attribute '" + key );
  					}else{
  						
  						attributes.put( ta, value );
  					}
  				}catch( Throwable e ){
  					
  					Debug.printStackTrace(e);
  				}
  			}
  		}
  	}
  	
  	protected void
  	serialiseResource(
  		Map		map )
  	{
  		Iterator	it = attributes.keySet().iterator();
  		
  		Map	attrs = new HashMap();
  		
  		map.put( "attributes", attrs );
  		
  		while( it.hasNext()){
  			
  			TorrentAttribute	ta = (TorrentAttribute)it.next();
  			
  			String	value = (String)attributes.get(ta);
  			
  			try{
  				if ( value != null ){
  					
  					attrs.put( ta.getName(), value.getBytes( Constants.DEFAULT_ENCODING ));
  					
  				}
  			}catch( Throwable e ){
  				
  				Debug.printStackTrace(e);
  			}
  		}
  	}
  	
  	public ShareResourceDirContents
  	getParent()
  	{
  		return( parent );
  	}
  	
  	protected void
  	setParent(
  		ShareResourceDirContents	_parent )
  	{
  		parent	= _parent;
  	}
  	
  	public ShareResource[]
  	getChildren()
  	{
  		return( new ShareResource[0] );
  	}
  	
  	public int
  	getType()
  	{
  		return( type );
  	}
  	
  	public void
  	setAttribute(
  		final TorrentAttribute		attribute,
  		String						value )
  	{
  		ShareConfigImpl	config = manager.getShareConfig();
  				
  		try{
  			config.suspendSaving();
  		
  			ShareResource[]	kids = getChildren();
  			
  			for (int i=0;i<kids.length;i++){
  				
  				kids[i].setAttribute( attribute, value );
  			}
  			
  			String	old_value = (String)attributes.get( attribute );
  			
  			if( old_value == null && value == null ){
  				
  				return;
  			}
  			
  			if ( old_value != null && value != null && old_value.equals( value )){
  				
  				return;
  			}
  			
  			attributes.put( attribute, value );
  			
  			try{
  				config.saveConfig();
  				
  			}catch( ShareException e ){
  				
  				Debug.printStackTrace( e );
  			}
  			
  		}finally{
  				
  			try{
  				config.resumeSaving();
  					
  			}catch( ShareException e ){
  					
  				Debug.printStackTrace( e );
  			}
  		}
  		
  		for (int i=0;i<change_listeners.size();i++){
  			
  			try{
  				((ShareResourceListener)change_listeners.get(i)).shareResourceChanged(
  						this,
  						new ShareResourceEvent()
  						{
  							public int
  							getType()
  							{
  								return( ShareResourceEvent.ET_ATTRIBUTE_CHANGED);
  							}
  							
  							public Object
  							getData()
  							{
  								return( attribute );
  							}
  						});
  				
  			}catch( Throwable e ){
  				
  				Debug.printStackTrace(e);
  			}
  		}
  	}
  	
  	public String
  	getAttribute(
  		TorrentAttribute		attribute )
  	{
  		return((String)attributes.get( attribute ));
  	}
  	
  	public TorrentAttribute[]
  	getAttributes()
  	{
  		TorrentAttribute[]	res = new TorrentAttribute[attributes.size()];
  		
  		attributes.keySet().toArray( res );
  		
  		return( res );
  	}
  	
  	protected void
  	inheritAttributes(
  		ShareResourceImpl	source )
  	{
  		TorrentAttribute[]	attrs = source.getAttributes();
  		
  		for ( int i=0;i<attrs.length;i++ ){
  			
  			setAttribute( attrs[i], source.getAttribute( attrs[i] ));
  		}
  	}
  	
  	public void
  	delete()
  	
  		throws ShareException, ShareResourceDeletionVetoException
  	{
  		if ( getParent() != null ){
  			
  		
  			throw( new ShareResourceDeletionVetoException( MessageText.getString("plugin.sharing.remove.veto")));
  		}
  		
  		delete( false );
  	}
  	
  	public void
  	delete(
  		boolean	force )
  	
  		throws ShareException, ShareResourceDeletionVetoException
  	{
  		delete( force, true );
  	}
  	
  	public void
  	delete(
  		boolean	force,
  		boolean	fire_listeners )
  	
  		throws ShareException, ShareResourceDeletionVetoException
  	{
  		if ( !force ){
  	
  			canBeDeleted();
  		}
  		
  		manager.delete( this, fire_listeners );
  	}
  	
  	public abstract boolean
  	canBeDeleted()
  	
  		throws ShareResourceDeletionVetoException;
  	
  	protected abstract void
  	deleteInternal();
  	
  	protected byte[]
  	getFingerPrint(
  		File		file )
  	
  		throws ShareException
  	{
  		try{
  			StringBuffer	buffer = new StringBuffer();
  			
  			getFingerPrintSupport( buffer, file, TorrentUtils.getIgnoreSet());
  							
  			return( hasher.calculateHash(buffer.toString().getBytes()));
  			
  		}catch( ShareException e ){
  			
  			throw( e );
  			
  		}catch( Throwable e ){
  			
  			throw( new ShareException( "ShareResource::getFingerPrint: fails", e ));
  		}
  	}
  	
  	protected void
  	getFingerPrintSupport(
  		StringBuffer	buffer,
  		File			file,
  		Set				ignore_set )
  	
  		throws ShareException
  	{
  		try{
  			if ( file.isFile()){
  				
  				long	mod 	= file.lastModified();
  				long	size	= file.length();
  			
  				String	file_name = file.getName();
  				
  				if  ( ignore_set.contains( file_name.toLowerCase())){
  										
  				}else{
  					
  					buffer.append( file_name ).append( ":" ).append( mod ).append( ":" ).append( size );
  				}	
  			}else if ( file.isDirectory()){
  								
  				File[]	dir_file_list = file.listFiles();
  										
  				List file_list = new ArrayList(Arrays.asList(dir_file_list));
  				
  				Collections.sort(file_list);
  				
  				for (int i=0;i<file_list.size();i++){
  					
  					File	f = (File)file_list.get(i);
  					
  					String	file_name = f.getName();
  					
  