// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/link/TestLinkServer.java,v $ // $RCSfile: TestLinkServer.java,v $ // $Revision: 1.6 $ // $Date: 2005/08/09 18:08:42 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.layer.link; import java.io.IOException; import java.net.Socket; import java.util.Iterator; import java.util.Vector; import com.bbn.openmap.omGraphics.OMAction; import com.bbn.openmap.omGraphics.OMGraphic; /** * The TestLinkServer is my test implementation of a customized * LinkServer. */ public class TestLinkServer extends LinkServer implements LinkActionConstants, LinkPropertiesConstants { int newGraphicCounter = 0; LinkOMGraphicList clientCreatedGraphics = new LinkOMGraphicList(); /** * Create child thread that will handle the client. * * @param s the socket to communicate over. */ public TestLinkServer(Socket s) { super(s); } /** * handleClient is a method that listens to the link to a client, * and responds to requests that are made. */ public void handleClient() throws IOException { boolean validQuery; while (true) { link.readAndParse(); validQuery = false; System.out.println("TestLinkServer: fielding request"); LinkMapRequest graphicsQuery = link.getMapRequest(); LinkActionRequest gestureQuery = link.getActionRequest(); LinkActionList actionList = link.getActionList(); if (graphicsQuery != null) { System.out.println((LinkMapRequest) graphicsQuery); getRectangle(graphicsQuery, link); validQuery = true; } if (gestureQuery != null) { System.out.println(gestureQuery); handleGesture(gestureQuery, link); validQuery = true; } if (actionList != null) { Vector graphicUpdates = actionList.getGraphicUpdates(); Iterator it = graphicUpdates.iterator(); while (it.hasNext()) { GraphicUpdate gu = (GraphicUpdate) it.next(); if (gu != null) { String id = gu.id; System.out.println("TestLinkServer: graphic id = " + id); OMGraphic graphic = gu.graphic; int index = clientCreatedGraphics.getOMGraphicIndexWithId(id); if (index != Link.UNKNOWN) { System.out.println("TestLinkServer: modifying graphic"); clientCreatedGraphics.setOMGraphicAt(gu.graphic, index); } else { System.out.println("TestLinkServer: new graphic"); // Set the ID for it, so it can be // referred to later. LinkProperties props = (LinkProperties) graphic.getAttribute(OMGraphic.APP_OBJECT); props.setProperty(LPC_GRAPHICID, "graphic" + (newGraphicCounter++)); System.out.println("TestLinkServer: new graphic given id " + props); } clientCreatedGraphics.doAction(gu.graphic, new OMAction(gu.action)); } } } if (!validQuery) { huh(link); } } } /** * An example of how to handle GraphicsLinkQueries. * * @param query the GraphicsLinkQuery, so you can get more * information about the parameters of the map screen of * the client. * @param link the link to communicate the response back to the * client. */ public void getRectangle(LinkMapRequest query, Link link) throws IOException { LinkProperties lineProperties = new LinkProperties(LPC_LINECOLOR, "FFFF0000"); lineProperties.setProperty(LPC_GRAPHICID, "testline1"); lineProperties.setProperty(LPC_FILLCOLOR, "FFFF0000"); lineProperties.setProperty(LPC_HIGHLIGHTCOLOR, "FFFFFF00"); lineProperties.setProperty(LPC_LINEWIDTH, "1"); lineProperties.setProperty(LPC_INFO, "Testing info line."); // lineProperties.setProperty(LPC_URL, // "http://blatz.bbn.com/users/dietrick/LinkProtocol.html"); int count = 0; LinkGraphicList gr = new LinkGraphicList(link, new LinkProperties()); LinkBoundingPoly[] bounds = query.getBoundingPolys(); for (int i = 0; i < bounds.length; i++) { gr.addLine(bounds[i].maxY, bounds[i].minX, bounds[i].minY, bounds[i].maxX, (int) OMGraphic.LINETYPE_STRAIGHT, -1, lineProperties); count++; int[] data = new int[10000]; for (int j = 0; j < 10000; j++) { if (j < 3000) { data[j] = 0xFFFF0000; } else if (j < 6000) { data[j] = 0xFF00FF00; } else if (j < 8000) { data[j] = 0xFF0000FF; } else { data[j] = 0xFFAAAAAA; } } gr.addGrid(42.0f, -70.0f, 100, 100, 0.0f, .001f, .001f, LinkGraphicConstants.COLUMN_MAJOR, data, new LinkProperties()); count++; // for (int x = 10; x < 600; x+=2) { // for (int y = 10; y < 500; y+=50) { // link.addLine(x, y, x + 40, y + 40, lineSemantics); // count++; // } // } } // Handle any other graphics added by client. LinkGraphic.write(clientCreatedGraphics, link); gr.end(Link.END_SECTION); System.out.println("TestLinkServer: Wrote " + count + " graphics to output stream"); int des = LinkUtil.setMask(0, MOUSE_CLICKED_MASK); // des = LinkUtil.setMask(des, MOUSE_MOVED_MASK); des = LinkUtil.unsetMask(des, SERVER_NOTIFICATION_MASK); new LinkActionRequest(link, des, Link.END_TOTAL); System.out.println("TestLinkServer: Wrote gesture descriptor to output stream"); } /** * An example of how to handle LinkActionRequest. * * @param glq the LinkActionRequest, so you can get more * information about the parameters of the gesture frome * the client. * @param link the link to communicate the response back to the * client. */ public void handleGesture(LinkActionRequest glq, Link link) throws IOException { // int descriptor = glq.getDescriptor(); LinkProperties props = new LinkProperties(); props.setProperty(LPC_INFO, ("Mouse Clicked at: x = " + glq.getX() + ", y = " + glq.getY())); LinkActionList glr = new LinkActionList(link, props); String gid = glq.getGraphicID(); if (gid == null) { System.out.println("Deselecting graphic"); glr.deselectGraphics(); } else { System.out.println("Selecting graphic"); props.clear(); props.setProperty(LPC_GRAPHICID, gid); glr.modifyGraphic(MODIFY_SELECT_GRAPHIC_MASK, props); } glr.end(Link.END_TOTAL); } }