/*
 * Created on Feb 15, 2005
 * Created by Alon Rohter
 * Copyright (C) 2004-2005 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, SAS au capital de 46,603.30 euros
 * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
 *
 */

package org.gudy.azureus2.plugins.utils;

import java.io.InputStream;

import org.gudy.azureus2.core3.util.AESemaphore;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.ui.*;
import org.gudy.azureus2.plugins.utils.resourcedownloader.ResourceDownloaderFactory;
import org.gudy.azureus2.plugins.utils.resourceuploader.ResourceUploaderFactory;
import org.gudy.azureus2.plugins.utils.xml.rss.RSSFeed;
import org.gudy.azureus2.plugins.utils.xml.simpleparser.SimpleXMLParserDocumentException;
import org.gudy.azureus2.pluginsimpl.local.utils.resourcedownloader.ResourceDownloaderFactoryImpl;
import org.gudy.azureus2.pluginsimpl.local.utils.resourceuploader.ResourceUploaderFactoryImpl;

import com.aelitis.azureus.core.AzureusCoreFactory;

/**
 * Plugin utility class for easy access to static helper methods,
 * without the need for a plugin interface instance.
 */
public class StaticUtilities {

  private static Formatters formatters;
  
  static {
    try {
      Class c = Class.forName("org.gudy.azureus2.pluginsimpl.local.utils.FormattersImpl");
      formatters = (Formatters) c.newInstance();
    } catch (Exception e) {
     e.printStackTrace();
    }
  }
  
  /**
   * Get display and byte format utilities.
   * @return formatters
   */
  public static Formatters getFormatters() {  return formatters;  }
   
  public static ResourceDownloaderFactory 
  getResourceDownloaderFactory()
  {
	  return( ResourceDownloaderFactoryImpl.getSingleton());
  }
  
  public static ResourceUploaderFactory 
  getResourceUploaderFactory()
  {
	  return( ResourceUploaderFactoryImpl.getSingleton());
  }
  
  public static PluginInterface
  getDefaultPluginInterface()
  {
	  return( AzureusCoreFactory.getSingleton().getPluginManager().getDefaultPluginInterface());
  }
  
  public static RSSFeed
  getRSSFeed(
	InputStream		is )
  
  	throws SimpleXMLParserDocumentException
  {
	  return( getDefaultPluginInterface().getUtilities().getRSSFeed( is ));
  }
  	/**
  	 * See UIInstance.promptUser
  	 * @param title
  	 * @param desc
  	 * @param options
  	 * @param default_option
  	 * @return
  	 */
  
  public static int
  promptUser(
	 String		title,
	 String		desc,
	 String[]	options,
	 int		default_option )
  {
	  UIInstance[] instances = getDefaultPluginInterface().getUIManager().getUIInstances();
	  
	  if ( instances.length > 0 ){
		  
		  return( instances[0].promptUser(title, desc, options, default_option ));
		  
	  }else{
		  
		  Debug.out( "No UIInstances to handle prompt: " + title + "/" + desc );
		  
		  return( -1 );
	  }
  }
  
  /**
   * gets the default UI manager and also waits for up to a specified time for a UI instance to
   * attach. useful when doing things during initialisation  
   * @param millis_to_wait_for_attach
   * @return
   */
  
  public static UIManager
  getUIManager(
	  long	millis_to_wait_for_attach )
  {
	  final UIManager ui_manager = getDefaultPluginInterface().getUIManager();
	  
	  if ( ui_manager.getUIInstances().length == 0 ){
		  
		  final AESemaphore sem = new AESemaphore( "waitforui") ;
		 
		  ui_manager.addUIListener(
					new UIManagerListener()
					{
						public void
						UIAttached(
							UIInstance		instance )
						{
							ui_manager.removeUIListener( this );
							
							sem.releaseForever();
						}
						
						public void
						UIDetached(
							UIInstance		instance )
						{
						}
					});
		  
		  	// UIAttached is only fired once initialisation is complete. However, the instance
		  	// can be made available prior to this and there is a case where this event is blocking
		  	// the firing of the completion event. therefore pick it up if present directly
		  
		  long	time_to_go = millis_to_wait_for_attach;
		  
		  while( ui_manager.getUIInstances().length == 0 ){
			  
			  if ( sem.reserve( 1000 )){
				  
				  break;
			  }
			  
			  time_to_go -= 1000;
		
			  if ( time_to_go <= 0 ){
				  
				  Debug.out( "Timeout waiting for UI to attach" );
				  
				  break;
			  }
		  }
	  }
	  
	  return( ui_manager );
  }
}
