/*
* Created on Mar 21, 2013
* Created by Paul Gardner
*
* Copyright 2013 Azureus Software, Inc. 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; version 2 of the License only.
*
* 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.
*/
package com.aelitis.azureus.core.tag.impl;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.gudy.azureus2.core3.util.Debug;
import com.aelitis.azureus.core.tag.TagException;
import com.aelitis.azureus.core.tag.Taggable;
import com.aelitis.azureus.core.util.CopyOnWriteSet;
import com.aelitis.azureus.util.MapUtils;
public abstract class
TagWithState
extends TagBase
{
private CopyOnWriteSet<Taggable> objects = new CopyOnWriteSet<Taggable>( true );
private boolean removed;
public
TagWithState(
TagTypeBase tt,
int tag_id,
String name )
{
super( tt, tag_id, name );
}
protected
TagWithState(
TagTypeBase tt,
int tag_id,
Map map )
{
super( tt, tag_id, MapUtils.getMapString( map, "n", "" ));
if ( map != null ){
List<byte[]> list = (List<byte[]>)map.get( "o" );
if ( list != null ){
for ( byte[] b: list ){
try{
String id = new String( b, "UTF-8" );
Taggable taggable = tt.resolveTaggable( id );
if ( taggable != null ){
objects.add( taggable );
}
}catch( Throwable e ){
Debug.out( e );
}
}
}
}
}
protected void
exportDetails(
Map map,
boolean do_contents )
{
MapUtils.setMapString( map, "n", getTagNameRaw());
if ( do_contents ){
Iterator<Taggable> it = objects.iterator();
List<byte[]> l = new ArrayList<byte[]>( objects.size());
while( it.hasNext()){
try{
Taggable taggable = it.next();
String id = taggable.getTaggableID();
if ( id != null ){
l.add( id.getBytes( "UTF-8" ));
}else{
Debug.out( "No taggable ID for " + taggable );
}
}catch( Throwable e ){
Debug.out( e );
}
}
map.put( "o", l );
}
}
public void
setTagName(
String name )
throws TagException
{
super.setTagName( name );
getManager().tagChanged( this );
}
public void
addTaggable(
Taggable t )
{
if ( removed ){
Debug.out( "Tag has been removed" );
return;
}
objects.add( t );
super.addTaggable( t );
getManager().tagContentsChanged( this );
}
public void
removeTaggable(
Taggable t )
{
boolean removed = objects.remove( t );
super.removeTaggable( t );
if ( removed ){
getManager().tagContentsChanged( this );
}
}
@Override
public void
removeTag()
{
super.removeTag();
removed = true;
}
protected boolean
isRemoved()
{
return( removed );
}
public int
getTaggedCount()
{
return( objects.size());
}
public boolean
hasTaggable(
Taggable t )
{
return( objects.contains( t ));
}
public Set<Taggable>
getTagged()
{
return(objects.getSet());
}
}