001: /*
002: * @(#)PlaneImpl.java 1.3 03/01/16
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:
028: package IXCDemo.ixcXlets.serverXlet;
029:
030: import java.util.Vector;
031: import javax.microedition.xlet.Xlet;
032: import javax.microedition.xlet.XletContext;
033: import java.rmi.RemoteException;
034: import IXCDemo.shared.*;
035:
036: public class PlaneImpl implements Plane {
037: private float speed;
038: private double heading;
039: private Position position = new Position(0, 0);
040: private Vector listeners = new Vector();
041: private long lastTime;
042:
043: public float getSpeed() {
044: return speed;
045: }
046:
047: public double getHeading() {
048: return heading;
049: }
050:
051: public Position getPosition() {
052: return position;
053: }
054:
055: public void accelerate(float deltaV) {
056: System.out.println("PlaneServer accelerates by " + deltaV);
057: speed += deltaV;
058: updatePosition();
059: }
060:
061: public void turn(double delta) {
062: System.out.println("PlaneServer turns by " + delta);
063: heading += delta;
064: updatePosition();
065: }
066:
067: public void addListener(PlaneListener l) {
068: System.out.println("PlaneImpl gets new listener " + l);
069: listeners.addElement(l);
070: }
071:
072: public void removeListener(PlaneListener l) {
073: listeners.removeElement(l);
074: }
075:
076: void tick() {
077: updatePosition();
078: notifyListeners();
079: }
080:
081: private void updatePosition() {
082: synchronized (this ) {
083: long next = System.currentTimeMillis();
084: long deltaT = next - lastTime;
085: float x = position.getX()
086: + (float) (speed * Math.sin(heading));
087: float y = position.getY()
088: + (float) (speed * Math.cos(heading));
089: position = new Position(x, y);
090: lastTime = next;
091: }
092: }
093:
094: private void notifyListeners() {
095: PlaneListener[] l;
096: synchronized (listeners) {
097: l = new PlaneListener[listeners.size()];
098: for (int i = 0; i < l.length; i++) {
099: l[i] = (PlaneListener) listeners.elementAt(i);
100: }
101: }
102: for (int i = 0; i < l.length; i++) {
103: try {
104: System.out.println("PlaneImpl notifing listener "
105: + l[i]);
106: l[i].positionChanged(position);
107: } catch (RemoteException ex) {
108: ex.printStackTrace();
109: System.out
110: .println("Remote exception, will remove listener...");
111: try {
112: Thread.sleep(2000);
113: } catch (InterruptedException iex) {
114: Thread.currentThread().interrupt();
115: }
116: System.out.println("Removing listener.");
117: removeListener(l[i]);
118: }
119: }
120: }
121:
122: public int hashCode() {
123: long headingBits = Double.doubleToLongBits(heading);
124: return position.hashCode() ^ Float.floatToIntBits(speed)
125: ^ ((int) (headingBits & (headingBits >>> 32)));
126: }
127:
128: public boolean equals(Object other) {
129: if (this == other) {
130: return true;
131: } else if (!(other instanceof PlaneImpl)) {
132: return false;
133: } else {
134: PlaneImpl po = (PlaneImpl) other;
135: return speed == po.speed && heading == po.heading
136: && position.equals(po.position);
137: }
138: }
139:
140: public String toString() {
141: return getClass().getName() + "<speed=" + speed + ", heading="
142: + heading + ", position=" + position + ">";
143: }
144: }
|