pluginupdateplugin.java
来自「Azureus is a powerful, full-featured, cr」· Java 代码 · 共 1,101 行 · 第 1/2 页
JAVA
1,101 行
/*
* Created on 28-Apr-2004
* Created by Paul Gardner
* Copyright (C) 2004 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, SARL au capital de 30,000 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package org.gudy.azureus2.pluginsimpl.update;
/**
* @author parg
*
*/
import java.util.*;
import java.util.zip.*;
import java.net.URL;
import java.io.*;
import org.gudy.azureus2.core3.html.HTMLUtils;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.plugins.*;
import org.gudy.azureus2.plugins.logging.*;
import org.gudy.azureus2.plugins.update.*;
import org.gudy.azureus2.plugins.utils.resourcedownloader.*;
import org.gudy.azureus2.plugins.ui.*;
import org.gudy.azureus2.plugins.ui.model.*;
import org.gudy.azureus2.pluginsimpl.*;
import org.gudy.azureus2.pluginsimpl.update.sf.*;
public class
PluginUpdatePlugin
implements Plugin
{
public static final int RD_SIZE_RETRIES = 3;
public static final int RD_SIZE_TIMEOUT = 10000;
protected PluginInterface plugin_interface;
protected SFPluginDetailsLoader loader;
protected LoggerChannel log;
public void
initialize(
PluginInterface _plugin_interface )
{
plugin_interface = _plugin_interface;
plugin_interface.getPluginProperties().setProperty( "plugin.name", "Plugin Updater" );
log = plugin_interface.getLogger().getChannel("Plugin Update");
UIManager ui_manager = plugin_interface.getUIManager();
final BasicPluginViewModel model =
ui_manager.createBasicPluginViewModel(
"Plugin Update");
boolean enabled = plugin_interface.getPluginconfig().getPluginBooleanParameter( "enable.update", true );
model.getStatus().setText( enabled?"Running":"Optional checks disabled" );
model.getActivity().setVisible( false );
model.getProgress().setVisible( false );
log.addListener(
new LoggerChannelListener()
{
public void
messageLogged(
int type,
String message )
{
model.getLogArea().appendText( message+"\n");
}
public void
messageLogged(
String str,
Throwable error )
{
model.getLogArea().appendText( error.toString()+"\n");
}
});
loader = SFPluginDetailsLoaderFactory.getSingleton();
loader.addListener(
new SFPluginDetailsLoaderListener()
{
public void
log(
String str )
{
log.log( LoggerChannel.LT_INFORMATION, "[" + str + "]" );
}
});
BasicPluginConfigModel config = ui_manager.createBasicPluginConfigModel( "plugins", "plugins.update");
config.addBooleanParameter2( "enable.update", "Plugin.pluginupdate.enablecheck", true );
UpdateManager update_manager = plugin_interface.getUpdateManager();
update_manager.addListener(
new UpdateManagerListener()
{
public void
checkInstanceCreated(
UpdateCheckInstance inst )
{
SFPluginDetailsLoaderFactory.getSingleton().reset();
}
});
PluginInterface[] plugins = plugin_interface.getPluginManager().getPlugins();
int mandatory_count = 0;
int non_mandatory_count = 0;
for (int i=0;i<plugins.length;i++){
PluginInterface pi = plugins[i];
boolean pi_mandatory = pi.isMandatory();
String id = pi.getPluginID();
String version = pi.getPluginVersion();
if ( version != null && !id.startsWith("<")){
if ( pi_mandatory ){
mandatory_count++;
}else{
non_mandatory_count++;
}
}
}
final int f_non_mandatory_count = non_mandatory_count;
final int f_mandatory_count = mandatory_count;
update_manager.registerUpdatableComponent(
new UpdatableComponent()
{
public String
getName()
{
return( "Non-mandatory plugins" );
}
public int
getMaximumCheckTime()
{
return( f_non_mandatory_count * (( RD_SIZE_RETRIES * RD_SIZE_TIMEOUT )/1000));
}
public void
checkForUpdate(
UpdateChecker checker )
{
checkForUpdateSupport( checker, null, false );
}
}, false );
update_manager.registerUpdatableComponent(
new UpdatableComponent()
{
public String
getName()
{
return( "Mandatory plugins" );
}
public int
getMaximumCheckTime()
{
return( f_mandatory_count * (( RD_SIZE_RETRIES * RD_SIZE_TIMEOUT )/1000));
}
public void
checkForUpdate(
UpdateChecker checker )
{
checkForUpdateSupport( checker, null, true );
}
}, true );
}
public UpdatableComponent
getCustomUpdateableComponent(
final String id,
final boolean mandatory )
{
return(
new UpdatableComponent()
{
public String
getName()
{
return( "Installation of '" + id + "'" );
}
public int
getMaximumCheckTime()
{
return( ( RD_SIZE_RETRIES * RD_SIZE_TIMEOUT )/1000 );
}
public void
checkForUpdate(
UpdateChecker checker )
{
checkForUpdateSupport( checker, new String[]{ id }, mandatory );
}
});
}
protected void
checkForUpdateSupport(
UpdateChecker checker,
String[] ids_to_check, // explicit ids or null for all
boolean mandatory )
{
try{
if ( (!mandatory) &&
(ids_to_check == null ) && // allow custom actions through
(!plugin_interface.getPluginconfig().getPluginBooleanParameter( "enable.update", true ))){
return;
}
PluginInterface[] plugins = plugin_interface.getPluginManager().getPlugins();
log.log( LoggerChannel.LT_INFORMATION, "Currently loaded " + (mandatory?"mandatory ":"non-mandatory" ) + " plugins:");
List plugins_to_check = new ArrayList();
List plugins_to_check_ids = new ArrayList();
Map plugins_to_check_unloadable = new HashMap();
Map plugins_to_check_names = new HashMap();
for (int i=0;i<plugins.length;i++){
PluginInterface pi = plugins[i];
String mand = pi.getPluginProperties().getProperty( "plugin.mandatory");
boolean pi_mandatory = mand != null && mand.trim().toLowerCase().equals("true");
if ( pi_mandatory != mandatory ){
continue;
}
String id = pi.getPluginID();
String version = pi.getPluginVersion();
String name = pi.getPluginName();
if ( ids_to_check != null ){
boolean id_selected = false;
for (int j=0;j<ids_to_check.length;j++){
if ( ids_to_check[j].equals( id )){
id_selected = true;
break;
}
}
if ( !id_selected ){
continue;
}
}
if ( version != null && !id.startsWith("<")){
if ( plugins_to_check_ids.contains( id )){
String s = (String)plugins_to_check_names.get(id);
if ( !name.equals( id )){
plugins_to_check_names.put( id, s+","+name);
}
Boolean old_unloadable = (Boolean)plugins_to_check_unloadable.get(id);
plugins_to_check_unloadable.put(id,new Boolean(pi.isUnloadable() && old_unloadable.booleanValue()));
}else{
plugins_to_check_ids.add( id );
plugins_to_check.add( pi );
plugins_to_check_names.put( id, name.equals(id)?"":name);
plugins_to_check_unloadable.put( id, new Boolean( pi.isUnloadable()));
}
}
log.log( LoggerChannel.LT_INFORMATION, " " + pi.getPluginName() + ", id = " + id + (version==null?"":(", version = " + pi.getPluginVersion())));
}
String[] ids = loader.getPluginIDs();
String id_list = "";
for (int i=0;i<ids.length;i++){
id_list += (i==0?"":",") + ids[i];
}
log.log( LoggerChannel.LT_INFORMATION, "Downloaded plugin ids = " + id_list );
for ( int i=0;i<plugins_to_check.size();i++){
if ( checker.getCheckInstance().isCancelled()){
throw( new Exception( "Update check cancelled" ));
}
final PluginInterface pi_being_checked = (PluginInterface)plugins_to_check.get(i);
final String plugin_id = pi_being_checked.getPluginID();
checker.reportProgress( "Loading details for " + plugin_id + "/" + pi_being_checked.getPluginName());
boolean found = false;
for (int j=0;j<ids.length;j++){
if ( ids[j].equalsIgnoreCase( plugin_id )){
found = true;
break;
}
}
if ( !found ){
log.log( LoggerChannel.LT_INFORMATION, "Skipping " + plugin_id + " as not listed on web site");
continue;
}
String plugin_names = (String)plugins_to_check_names.get( plugin_id );
final boolean plugin_unloadable = ((Boolean)plugins_to_check_unloadable.get( plugin_id )).booleanValue();
log.log( LoggerChannel.LT_INFORMATION, "Checking " + plugin_id);
try{
SFPluginDetails details = loader.getPluginDetails( plugin_id );
if ( plugin_names.length() == 0 ){
plugin_names = details.getName();
}
boolean az_cvs = plugin_interface.getUtilities().isCVSVersion();
String pi_version_info = pi_being_checked.getPluginProperties().getProperty( "plugin.version.info" );
String az_plugin_version = pi_being_checked.getPluginVersion();
String sf_plugin_version = details.getVersion();
String sf_comp_version = sf_plugin_version;
if ( az_cvs ){
String sf_cvs_version = details.getCVSVersion();
if ( sf_cvs_version.length() > 0 ){
// sf cvs version ALWAYS ends in _CVS
sf_plugin_version = sf_cvs_version;
sf_comp_version = sf_plugin_version.substring(0,sf_plugin_version.length()-4);
}
}
if ( sf_comp_version.length() == 0 ||
!Character.isDigit(sf_comp_version.charAt(0))){
log.log( LoggerChannel.LT_INFORMATION, "Skipping " + plugin_id + " as no valid version to check");
continue;
}
// System.out.println("comp version = " + sf_comp_version );
int comp = PluginUtils.comparePluginVersions( az_plugin_version, sf_comp_version );
// if they're the same version and latest is CVS then stick a _CVS on
// the end of current to avoid confusion
log.log( LoggerChannel.LT_INFORMATION,
" Current: " + az_plugin_version +
(comp==0&&sf_plugin_version.endsWith( "_CVS")?"_CVS":"")+
", Latest: " + sf_plugin_version + (pi_version_info==null?"":" [" + pi_version_info + "]"));
if ( comp < 0 && ! ( pi_being_checked.getPlugin() instanceof UpdatableComponent)){
// only update if newer verison + plugin itself doesn't handle
// the update
String sf_plugin_download = details.getDownloadURL();
if ( az_cvs ){
String sf_cvs_version = details.getCVSVersion();
if ( sf_cvs_version.length() > 0 ){
sf_plugin_download = details.getCVSDownloadURL();
}
}
log.log( LoggerChannel.LT_INFORMATION, " Description:" );
List update_desc = new ArrayList();
List desc_lines = HTMLUtils.convertHTMLToText( "", details.getDescription());
logMultiLine( " ", desc_lines );
update_desc.addAll( desc_lines );
log.log( LoggerChannel.LT_INFORMATION, " Comment:" );
List comment_lines = HTMLUtils.convertHTMLToText( " ", details.getComment());
logMultiLine( " ", comment_lines );
update_desc.addAll( comment_lines );
String msg = "A newer version (version " + sf_plugin_version + ") of plugin '" +
plugin_id + "' " +
(plugin_names.length()==0?"":"(" + plugin_names + ") " ) +
"is available. ";
log.log( LoggerChannel.LT_INFORMATION, "" );
log.log( LoggerChannel.LT_INFORMATION, " " + msg + "Download from "+
sf_plugin_download);
ResourceDownloaderFactory rdf = plugin_interface.getUtilities().getResourceDownloaderFactory();
ResourceDownloader direct_rdl = rdf.create( new URL( sf_plugin_download ));
// work out what the torrent download will be, if it exists
// sf_plugin_download will be something like ../plugins/safepeer_2.4.zip
// torrent is safepeer_2.4.zip.torrent
String torrent_download = Constants.AELITIS_TORRENTS;
int slash_pos = sf_plugin_download.lastIndexOf("/");
if ( slash_pos == -1 ){
torrent_download += sf_plugin_download;
}else{
torrent_download += sf_plugin_download.substring( slash_pos + 1 );
}
torrent_download += ".torrent";
ResourceDownloader torrent_rdl = rdf.create( new URL( torrent_download ));
torrent_rdl = rdf.getSuffixBasedDownloader( torrent_rdl );
// create an alternate downloader with torrent attempt first
ResourceDownloader alternate_rdl = rdf.getAlternateDownloader( new ResourceDownloader[]{ torrent_rdl, direct_rdl });
// get size so it is cached
rdf.getTimeoutDownloader(rdf.getRetryDownloader(alternate_rdl,RD_SIZE_RETRIES),RD_SIZE_TIMEOUT).getSize();
String[] update_d = new String[update_desc.size()];
update_desc.toArray( update_d );
addUpdate(
pi_being_checked,
checker,
plugin_id + "/" + plugin_names,
update_d,
sf_plugin_version,
alternate_rdl,
sf_plugin_download.toLowerCase().endsWith(".jar"),
plugin_unloadable?Update.RESTART_REQUIRED_NO:Update.RESTART_REQUIRED_YES );
}
}catch( Throwable e ){
log.log(" Plugin check failed", e );
}
}
}catch( Throwable e ){
log.log("Failed to load plugin details", e );
checker.failed();
}finally{
// any prior failure will take precedence
checker.completed();
}
}
public void
addUpdate(
final PluginInterface pi_for_update,
final UpdateChecker checker,
final String update_name,
final String[] update_details,
final String version,
final ResourceDownloader resource_downloader,
final boolean is_jar,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?