⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listenermanager.java

📁 java 文件下载器。可自定义
💻 JAVA
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space 
// Source File Name:   ListenerManager.java

package org.gudy.azureus2.core3.util;

import java.lang.reflect.Method;
import java.util.*;
import org.gudy.azureus2.core3.logging.*;

// Referenced classes of package org.gudy.azureus2.core3.util:
//			AESemaphore, AEThread2, Debug, ListenerManagerDispatcher, 
//			ListenerManagerDispatcherWithException, SystemTime

public class ListenerManager
{

	private static final boolean TIME_LISTENERS = false;
	protected String name;
	protected ListenerManagerDispatcher target;
	protected ListenerManagerDispatcherWithException target_with_exception;
	protected boolean async;
	protected AEThread2 async_thread;
	protected List listeners;
	protected List dispatch_queue;
	protected AESemaphore dispatch_sem;

	public static ListenerManager createManager(String name, ListenerManagerDispatcher target)
	{
		return new ListenerManager(name, target, false);
	}

	public static ListenerManager createAsyncManager(String name, ListenerManagerDispatcher target)
	{
		return new ListenerManager(name, target, true);
	}

	protected ListenerManager(String _name, ListenerManagerDispatcher _target, boolean _async)
	{
		listeners = new ArrayList();
		name = _name;
		target = _target;
		async = _async;
		if (target instanceof ListenerManagerDispatcherWithException)
			target_with_exception = (ListenerManagerDispatcherWithException)target;
		if (async)
		{
			dispatch_sem = new AESemaphore((new StringBuilder()).append("ListenerManager::").append(name).toString());
			dispatch_queue = new LinkedList();
			if (target_with_exception != null)
				throw new RuntimeException("Can't have an async manager with exceptions!");
		}
	}

	public void addListener(Object listener)
	{
		synchronized (this)
		{
			ArrayList new_listeners = new ArrayList(listeners);
			if (new_listeners.contains(listener))
				Logger.log(new LogEvent(LogIDs.CORE, 1, (new StringBuilder()).append("addListener called but listener already added for ").append(name).append("\n\t").append(Debug.getStackTrace(true, false)).toString()));
			new_listeners.add(listener);
			if (new_listeners.size() > 50)
				Logger.log(new LogEvent(LogIDs.CORE, 1, (new StringBuilder()).append("addListener: over 50 listeners added for ").append(name).append("\n\t").append(Debug.getStackTrace(true, false)).toString()));
			listeners = new_listeners;
			if (async && async_thread == null)
			{
				async_thread = new AEThread2(name, true) {

					final ListenerManager this$0;

					public void run()
					{
						dispatchLoop();
					}

			
			{
				this$0 = ListenerManager.this;
				super(x0, x1);
			}
				};
				async_thread.start();
			}
		}
	}

	public void removeListener(Object listener)
	{
		synchronized (this)
		{
			ArrayList new_listeners = new ArrayList(listeners);
			new_listeners.remove(listener);
			listeners = new_listeners;
			if (async && listeners.size() == 0)
			{
				async_thread = null;
				dispatch_sem.release();
			}
		}
	}

	public boolean hasListener(Object listener)
	{
		ListenerManager listenermanager = this;
		JVM INSTR monitorenter ;
		return listeners.contains(listener);
		Exception exception;
		exception;
		throw exception;
	}

	public void clear()
	{
		synchronized (this)
		{
			listeners = new ArrayList();
			if (async)
			{
				async_thread = null;
				dispatch_sem.release();
			}
		}
	}

	public List getListenersCopy()
	{
		return listeners;
	}

	public void dispatch(int type, Object value)
	{
		dispatch(type, value, false);
	}

	public void dispatch(int type, Object value, boolean blocking)
	{
		AESemaphore sem;
label0:
		{
			if (!async)
				break MISSING_BLOCK_LABEL_121;
			sem = null;
			if (blocking)
				sem = new AESemaphore("ListenerManager:blocker");
			synchronized (this)
			{
				if (listeners.size() != 0)
					break label0;
			}
			return;
		}
		dispatch_queue.add(((Object) (new Object[] {
			listeners, new Integer(type), value, sem
		})));
		listenermanager;
		JVM INSTR monitorexit ;
		  goto _L1
		exception;
		throw exception;
_L1:
		dispatch_sem.release();
		if (sem != null)
			sem.reserve();
		break MISSING_BLOCK_LABEL_181;
		if (target_with_exception != null)
			throw new RuntimeException("call dispatchWithException, not dispatch");
		List listeners_ref;
		synchronized (this)
		{
			listeners_ref = listeners;
		}
		try
		{
			dispatchInternal(listeners_ref, type, value);
		}
		catch (Throwable e)
		{
			Debug.printStackTrace(e);
		}
	}

	public void dispatchWithException(int type, Object value)
		throws Throwable
	{
		List listeners_ref;
		synchronized (this)
		{
			listeners_ref = listeners;
		}
		dispatchInternal(listeners_ref, type, value);
	}

	public void dispatch(Object listener, int type, Object value)
	{
		dispatch(listener, type, value, false);
	}

	public void dispatch(Object listener, int type, Object value, boolean blocking)
	{
		if (async)
		{
			AESemaphore sem = null;
			if (blocking)
				sem = new AESemaphore("ListenerManager:blocker");
			synchronized (this)
			{
				dispatch_queue.add(((Object) (new Object[] {
					listener, new Integer(type), value, sem, null
				})));
				if (async_thread == null)
				{
					async_thread = new AEThread2(name, true) {

						final ListenerManager this$0;

						public void run()
						{
							dispatchLoop();
						}

			
			{
				this$0 = ListenerManager.this;
				super(x0, x1);
			}
					};
					async_thread.start();
				}
			}
			dispatch_sem.release();
			if (sem != null)
				sem.reserve();
		} else
		{
			if (target_with_exception != null)
				throw new RuntimeException("call dispatchWithException, not dispatch");
			doDispatch(listener, type, value);
		}
	}

	protected String getListenerName(Object listener)
	{
		Class listener_class = listener.getClass();
		String res = listener_class.getName();
		try
		{
			Method getString = listener_class.getMethod("getString", new Class[0]);
			if (getString != null)
			{
				String s = (String)getString.invoke(listener, new Object[0]);
				res = (new StringBuilder()).append(res).append(" (").append(s).append(")").toString();
			}
		}
		catch (Throwable e) { }
		return res;
	}

	protected void doDispatch(Object listener, int type, Object value)
	{
		try
		{
			target.dispatch(listener, type, value);
		}
		catch (Throwable e)
		{
			Debug.printStackTrace(e);
		}
	}

	protected void doDispatchWithException(Object listener, int type, Object value)
		throws Throwable
	{
		target_with_exception.dispatchWithException(listener, type, value);
	}

	protected void dispatchInternal(List listeners_ref, int type, Object value)
		throws Throwable
	{
		for (int i = 0; i < listeners_ref.size(); i++)
			if (target_with_exception != null)
				doDispatchWithException(listeners_ref.get(i), type, value);
			else
				doDispatch(listeners_ref.get(i), type, value);

	}

	protected void dispatchInternal(Object listener, int type, Object value)
		throws Throwable
	{
		if (target_with_exception != null)
			doDispatchWithException(listener, type, value);
		else
			doDispatch(listener, type, value);
	}

	public void dispatchLoop()
	{
_L3:
		Object data[];
label0:
		{
			dispatch_sem.reserve();
			data = null;
			synchronized (this)
			{
				if (async_thread != null && async_thread.isCurrentThread())
					break label0;
				dispatch_sem.release();
			}
			break; /* Loop/switch isn't completed */
		}
		if (dispatch_queue.size() > 0)
			data = (Object[])(Object[])dispatch_queue.remove(0);
		listenermanager;
		JVM INSTR monitorexit ;
		  goto _L1
		exception;
		throw exception;
_L1:
		if (data == null)
			continue; /* Loop/switch isn't completed */
		if (data.length == 4)
			dispatchInternal((List)data[0], ((Integer)data[1]).intValue(), data[2]);
		else
			dispatchInternal(data[0], ((Integer)data[1]).intValue(), data[2]);
		if (data[3] != null)
			((AESemaphore)data[3]).release();
		continue; /* Loop/switch isn't completed */
		Throwable e;
		e;
		Debug.printStackTrace(e);
		if (data[3] != null)
			((AESemaphore)data[3]).release();
		if (true) goto _L3; else goto _L2
		Exception exception1;
		exception1;
		if (data[3] != null)
			((AESemaphore)data[3]).release();
		throw exception1;
_L2:
	}

	public static void dispatchWithTimeout(List _listeners, ListenerManagerDispatcher _dispatcher, long _timeout)
	{
		List listeners = new ArrayList(_listeners);
		boolean completed[] = new boolean[listeners.size()];
		AESemaphore timeout_sem = new AESemaphore("ListenerManager:dwt:timeout");
		for (int i = 0; i < listeners.size(); i++)
		{
			int f_i = i;
			(new AEThread2("ListenerManager:dwt:dispatcher", true, _dispatcher, listeners, f_i, completed, timeout_sem) {

				final ListenerManagerDispatcher val$_dispatcher;
				final List val$listeners;
				final int val$f_i;
				final boolean val$completed[];
				final AESemaphore val$timeout_sem;

				public void run()
				{
					_dispatcher.dispatch(listeners.get(f_i), -1, null);
					completed[f_i] = true;
					timeout_sem.release();
					break MISSING_BLOCK_LABEL_87;
					Throwable e;
					e;
					Debug.printStackTrace(e);
					completed[f_i] = true;
					timeout_sem.release();
					break MISSING_BLOCK_LABEL_87;
					Exception exception;
					exception;
					completed[f_i] = true;
					timeout_sem.release();
					throw exception;
				}

			
			{
				_dispatcher = listenermanagerdispatcher;
				listeners = list;
				f_i = i;
				completed = aflag;
				timeout_sem = aesemaphore;
				super(x0, x1);
			}
			}).start();
		}

		boolean timeout_occurred = false;
		for (int i = 0; i < listeners.size(); i++)
		{
			if (_timeout <= 0L)
			{
				timeout_occurred = true;
				break;
			}
			long start = SystemTime.getCurrentTime();
			if (!timeout_sem.reserve(_timeout))
			{
				timeout_occurred = true;
				break;
			}
			long end = SystemTime.getCurrentTime();
			if (end > start)
				_timeout -= end - start;
		}

		if (timeout_occurred)
		{
			String str = "";
			for (int i = 0; i < completed.length; i++)
				if (!completed[i])
					str = (new StringBuilder()).append(str).append(str.length() != 0 ? "," : "").append(listeners.get(i)).toString();

			if (str.length() > 0)
				Debug.out((new StringBuilder()).append("Listener dispatch timeout: failed = ").append(str).toString());
		}
	}

	public long size()
	{
		if (listeners == null)
			return 0L;
		else
			return (long)listeners.size();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -