001: /*
002: * %W% %E%
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.jumpimpl.module.windowing;
028:
029: import com.sun.jump.executive.JUMPExecutive;
030: import com.sun.jump.common.JUMPIsolate;
031: import com.sun.jump.common.JUMPWindow;
032:
033: import com.sun.jumpimpl.process.JUMPIsolateProxyImpl;
034:
035: import java.util.TreeMap;
036: import java.util.Comparator;
037:
038: public class WindowImpl extends JUMPWindow {
039: public static int executiveId = JUMPExecutive.getInstance()
040: .getProcessId();
041:
042: private String state;
043: private int id;
044: private int isolateId;
045:
046: private static long getKey(Object o) {
047: if (o == null || !(o instanceof WindowImpl)) {
048: return 0;
049: }
050:
051: WindowImpl w = (WindowImpl) o;
052:
053: long res = w.id;
054: return (res << 32 | w.isolateId);
055: }
056:
057: // all known windows
058: // use TreeMap and not HashMap or something similar to enforce use of
059: // custom comparator that ignores WindowImpl#state member field in key
060: // generation
061: private static TreeMap windows = new TreeMap(new Comparator() {
062: public int compare(Object o1, Object o2) {
063: long res = (getKey(o1) - getKey(o2));
064: if (res < 0) {
065: return -1;
066: }
067: if (res > 0) {
068: return 1;
069: }
070: return 0;
071: }
072: });
073: // key to reuse in window look up
074: private static WindowImpl key = new WindowImpl(0, 0);
075:
076: private WindowImpl(int isolateId, int id) {
077: this .id = id;
078: this .isolateId = isolateId;
079:
080: JUMPIsolateProxyImpl isolateProxy = (JUMPIsolateProxyImpl) getIsolate();
081: if (isolateProxy != null) {
082: isolateProxy.registerWindow(this );
083: }
084: }
085:
086: static synchronized WindowImpl getWindow(int isolateId, int id) {
087: // don't create key for look up, instead initialize precreated one
088: key.id = id;
089: key.isolateId = isolateId;
090:
091: WindowImpl w = (WindowImpl) windows.get(key);
092: if (w == null) {
093: w = new WindowImpl(isolateId, id);
094: windows.put(w, w);
095: }
096:
097: return w;
098: }
099:
100: void setState(String state) {
101: this .state = state;
102: }
103:
104: public String getState() {
105: return this .state;
106: }
107:
108: public int getId() {
109: return this .id;
110: }
111:
112: public JUMPIsolate getIsolate() {
113: if (isolateId == executiveId) {
114: // this WindowImpl was created in executive's VM
115: return null;
116: }
117:
118: return JUMPExecutive.getInstance().getIsolateFactory()
119: .getIsolate(isolateId);
120: }
121: }
|