/*
* Created on Nov 20, 2008
* Created by Paul Gardner
*
* Copyright 2008 Vuze, 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.cnetwork.impl;
import java.io.IOException;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.util.BEncoder;
import org.gudy.azureus2.core3.util.Debug;
import com.aelitis.azureus.core.cnetwork.*;
import com.aelitis.azureus.core.util.CopyOnWriteList;
import com.aelitis.azureus.core.vuzefile.VuzeFile;
import com.aelitis.azureus.core.vuzefile.VuzeFileComponent;
import com.aelitis.azureus.core.vuzefile.VuzeFileHandler;
import com.aelitis.azureus.util.ImportExportUtils;
import com.aelitis.azureus.util.MapUtils;
public abstract class
ContentNetworkImpl
implements ContentNetwork
{
protected static final long TYPE_VUZE_GENERIC = 1;
private static final String PP_STARTUP_NETWORK = "startup_network"; // Boolean
protected static ContentNetworkImpl
importFromBEncodedMapStatic(
ContentNetworkManagerImpl manager,
Map map )
throws IOException
{
long type = ImportExportUtils.importLong( map, "type" );
if ( type == TYPE_VUZE_GENERIC ){
return( new ContentNetworkVuzeGeneric( manager, map ));
}else{
throw( new IOException( "Unsupported network type: " + type ));
}
}
private ContentNetworkManagerImpl manager;
private long type;
private long version;
private long id;
private String name;
private Map<String,Object> pprop_defaults;
private Map<Object,Object> transient_properties = Collections.synchronizedMap( new HashMap<Object,Object>());
private CopyOnWriteList persistent_listeners = new CopyOnWriteList();
protected
ContentNetworkImpl(
ContentNetworkManagerImpl _manager,
long _type,
long _id,
long _version,
String _name,
Map<String,Object> _pprop_defaults )
{
manager = _manager;
type = _type;
version = _version;
id = _id;
name = _name;
pprop_defaults = _pprop_defaults;
}
protected
ContentNetworkImpl(
ContentNetworkManagerImpl _manager )
{
manager = _manager;
}
protected void
importFromBEncodedMap(
Map<String,Object> map )
throws IOException
{
type = ImportExportUtils.importLong( map, "type" );
id = ImportExportUtils.importLong( map, "id" );
version = ImportExportUtils.importLong( map, "version" );
name = ImportExportUtils.importString( map, "name" );
pprop_defaults = (Map<String,Object>)map.get( "pprop_defaults" );
}
protected void
exportToBEncodedMap(
Map<String,Object> map )
throws IOException
{
ImportExportUtils.exportLong( map, "type", type );
ImportExportUtils.exportLong( map, "id", id );
ImportExportUtils.exportLong( map, "version", version );
ImportExportUtils.exportString( map, "name", name );
if ( pprop_defaults != null ){
map.put( "pprop_defaults", pprop_defaults );
}
}
protected void
updateFrom(
ContentNetworkImpl other )
throws IOException
{
Map<String,Object> map = new HashMap<String,Object>();
other.exportToBEncodedMap(map);
importFromBEncodedMap( map );
}
public long
getID()
{
return( id );
}
protected long
getVersion()
{
return( version );
}
public String
getName()
{
return( name );
}
protected boolean
isSameAs(
ContentNetworkImpl other )
{
try{
Map<String,Object> map1 = new HashMap<String,Object>();
Map<String,Object> map2 = new HashMap<String,Object>();
exportToBEncodedMap( map1 );
other.exportToBEncodedMap( map2 );
return( BEncoder.mapsAreIdentical( map1, map2 ));
}catch( Throwable e ){
Debug.out( e );
return( false );
}
}
public String
getSearchService(
String query )
{
return( getServiceURL( SERVICE_SEARCH, new Object[]{ query } ));
}
public String
getXSearchService(
String query,
boolean to_subscribe )
{
return( getServiceURL( SERVICE_XSEARCH, new Object[]{ query, to_subscribe } ));
}
public String
getContentDetailsService(
String hash,
String client_ref )
{
return( getServiceURL( SERVICE_CONTENT_DETAILS, new Object[]{ hash, client_ref }));
}
public String
getCommentService(
String hash )
{
return( getServiceURL( SERVICE_COMMENT, new Object[]{ hash }));
}
public String
getProfileService(
String login_id,
String client_ref )
{
return( getServiceURL( SERVICE_PROFILE, new Object[]{ login_id, client_ref }));
}
public String
getTorrentDownloadService(
String hash,
String client_ref )
{
return( getServiceURL( SERVICE_TORRENT_DOWNLOAD, new Object[]{ hash, client_ref }));
}
public String
getFAQTopicService(
String topic )
{
return( getServiceURL( SERVICE_FAQ_TOPIC, new Object[]{ topic }));
}
public String
getLoginService(
String message )
{
return( getServiceURL( SERVICE_LOGIN, new Object[]{ message }));
}
public String
getSiteRelativeURL(
String relative_url,
boolean append_suffix )
{
return( getServiceURL( SERVICE_SITE_RELATIVE, new Object[]{ relative_url, append_suffix }));
}
public String
getExternalSiteRelativeURL(
String relative_url,
boolean append_suffix )
{
return( getServiceURL( SERVICE_EXT_SITE_RELATIVE, new Object[]{ relative_url, append_suffix }));
}
public String
getAddFriendURL(
String colour )
{
return( getServiceURL( SERVICE_ADD_FRIEND, new Object[]{ colour }));
}
public String
getSubscriptionURL(
String subs_id )
{
return( getServiceURL( SERVICE_SUBSCRIPTION, new Object[]{ subs_id }));
}
public VuzeFile
getVuzeFile()
{
VuzeFile vf = VuzeFileHandler.getSingleton().create();
Map map = new HashMap();
try{
exportToBEncodedMap( map );
vf.addComponent( VuzeFileComponent.COMP_TYPE_CONTENT_NETWORK, map );
}catch( Throwable e ){
Debug.printStackTrace( e );
}
return( vf );
}
public boolean
isStartupNetwork()
{
if ( hasPersistentProperty( PP_STARTUP_NETWORK )){
return((Boolean)getPersistentProperty( PP_STARTUP_NETWORK ));
}
return((Boolean)getPersistentProperty( ContentNetwork.PP_IS_CUSTOMIZATION ));
}
public void
setStartupNetwork(
boolean b )
{
setPersistentProperty( PP_STARTUP_NETWORK, new Boolean(b));
}
public void
setTransientProperty(
Object key,
Object value )
{
transient_properties.put( key, value );
}
public Object
getTransientProperty(
Object key )
{
return( transient_properties.get( key ));
}
protected String
getPropertiesKey()
{
return( "cnetwork.net." + id + ".props" );
}
public void
setPersistentProperty(
String name,
Object new_value )
{
synchronized( this ){
String key = getPropertiesKey();
if ( new_value instanceof Boolean ){
new_value = new Long(((Boolean)new_value)?1:0);
}
Map props = new HashMap( COConfigurationManager.getMapParameter( key , new HashMap()));
Object old_value = props.get( key );
if ( BEncoder.objectsAreIdentical( old_value, new_value )){
return;
}
props.put( name, new_value );
COConfigurationManager.setParameter( key, props );
}
Iterator it = persistent_listeners.iterator();
while( it.hasNext()){
try{
((ContentNetworkPropertyChangeListener)it.next()).propertyChanged(name);
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
}
public Object
getPersistentProperty(
String name )
{
synchronized( this ){
String key = getPropertiesKey();
Map props = COConfigurationManager.getMapParameter( key , new HashMap());
if ( name == PP_SOURCE_REF ) {
return MapUtils.getMapString(props, name, MapUtils.getMapString(
pprop_defaults, name, null));
}
Object obj = props.get( name );
if ( name == PP_AUTH_PAGE_SHOWN ||
name == PP_IS_CUSTOMIZATION ||
name == PP_ACTIVE ||
name == PP_SHOW_IN_MENU ||
name == PP_STARTUP_NETWORK ){
if ( obj == null && pprop_defaults != null ){
obj = pprop_defaults.get( name );
}
if ( obj == null ){
return( false );
}else{
return(((Long)obj)==1);
}
}
return( obj );
}
}
protected boolean
hasPersistentProperty(
String name )
{
synchronized( this ){
String key = getPropertiesKey();
Map props = COConfigurationManager.getMapParameter( key , new HashMap());
return( props.containsKey( name ));
}
}
protected Map<String,Object>
getPersistentPropertyDefaults()
{
return( pprop_defaults );
}
public void
addPersistentPropertyChangeListener(
ContentNetworkPropertyChangeListener listener )
{
persistent_listeners.add( listener );
}
public void
removePersistentPropertyChangeListener(
ContentNetworkPropertyChangeListener listener )
{
persistent_listeners.remove( listener );
}
protected void
destroy()
{
String key = getPropertiesKey();
COConfigurationManager.setParameter( key, new HashMap());
}
public void
remove()
{
manager.removeNetwork( this );
}
protected void
debug(
String str )
{
Debug.out( getString() + ": " + str );
}
protected String
getString()
{
return( getID() + " - " + getName() + ": version=" + getVersion() + ", site=" + getProperty( PROPERTY_SITE_HOST ));
}
}