package org.concord.otrunk.applet;

import java.applet.Applet;
import java.util.ArrayList;
import java.util.Enumeration;

public class OTAppletViewer2 extends OTAppletViewer
{
    private static final long serialVersionUID = 1L;
	private static ArrayList<OTAppletViewer> viewers = new ArrayList<OTAppletViewer>();
	
	@Override
	public void init() {
		super.init();
		viewers.add(this);
	}
	
	@Override
	public void destroy() {
		viewers.remove(this);
		super.destroy();
	}
	
	@Override
	public OTAppletViewer getMaster()
	{
		if(isMaster()){
			return this;
		}

		if(master != null) {
			return master;
		}

		String masterName = getMasterName();
		if(masterName == null){
			// we don't have a pointer to our master, and we are not a master ourselves
			// this should never happen.
			throw new RuntimeException("Non-master applet doesn't have a set master property");
		}
		
		// first try the current JVM's applets
		for (OTAppletViewer viewer : viewers) {
			System.out.println("" + getAppletName() + " found in jvm: " + viewer.getParameter("name"));
			if (isSiblingMaster(viewer)) {
				System.out.println("Found a master in the current JVM");
				master = viewer;
				return master;
			}
		}
		
		Applet masterApplet = getAppletContext().getApplet(masterName);
		if(masterApplet instanceof OTAppletViewer &&
				((OTAppletViewer)masterApplet).isMaster()){
			System.out.println("Found a master directly by name");
			master = (OTAppletViewer)masterApplet;
			return master;
		}

		// We did not find our master using that simple look up approach
		// try manually going through all the applets
		Enumeration<Applet> applets = getAppletContext().getApplets();
		while(applets.hasMoreElements()){
			Applet a = applets.nextElement();
			System.out.println("" + getAppletName() + " found: " + a.getParameter("name"));
			if(a instanceof OTAppletViewer){
				if (isSiblingMaster((OTAppletViewer)a)) {
					master = (OTAppletViewer)a;
					return master;
				}
			}
		}

		return null;
	}
	
	private boolean isSiblingMaster(OTAppletViewer sibling) {
		if(sibling.isMaster() &&
			sibling.getAppletName() != null &&
			sibling.getAppletName().equals(getMasterName())){
			return true;					
		}
		return false;
	}

}

Add a variation of the OTAppletViewer which attempts to find siblings within the current JVM using static fields.
Add a variation of the OTAppletViewer which attempts to find siblings within the current JVM using static fields.

git-svn-id: 8ebed0c25533aaea68ca43268d4d516467f97e6a@21399 6e01202a-0783-4428-890a-84243c50cc2b
