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

📄 transceiver.java

📁 java开源的企业总线.xmlBlaster
💻 JAVA
字号:
/*------------------------------------------------------------------------------Name:      Transceiver.javaProject:   xmlBlaster.orgCopyright: xmlBlaster.org, see xmlBlaster-LICENSE fileComment:   Demo code for a svg client using batikVersion:   $Id: Transceiver.java 16476 2007-09-06 22:36:52Z laghi $------------------------------------------------------------------------------*/package javaclients.svg.batik;import org.apache.batik.gvt.GraphicsNode;import org.apache.batik.bridge.BridgeContext;import java.awt.Point;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.NodeList;import java.util.logging.Logger;import java.util.logging.Level;import org.xmlBlaster.util.Global;import org.xmlBlaster.util.XmlBlasterException;import org.xmlBlaster.client.I_XmlBlasterAccess;import org.xmlBlaster.client.I_Callback;import org.xmlBlaster.client.qos.PublishReturnQos;import org.xmlBlaster.client.qos.ConnectQos;import org.xmlBlaster.client.qos.DisconnectQos;import org.xmlBlaster.client.key.UpdateKey;import org.xmlBlaster.client.qos.UpdateQos;import org.xmlBlaster.util.MsgUnit;import org.xmlBlaster.util.XmlToDom;import java.io.IOException;import java.io.FileNotFoundException;import java.io.FileInputStream;import java.util.StringTokenizer;/** * @author $Author: laghi $ (michele@laghi.eu) */public class Transceiver implements I_Callback{   private static final String ME = "Transceiver";   private final Global glob;   private static Logger log = Logger.getLogger(Transceiver.class.getName());   private BridgeContext        bridgeContext        = null;   private JSVGCanvasExtended   canvas               = null;   private I_XmlBlasterAccess xmlBlasterConnection = null;   private String               svgFileName          = null;   private final static String SVG_PREFIX  = "<?xml version='1.0' standalone='no'?>\n<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'\n'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'><svg>";   private final static String SVG_POSTFIX = "</svg>";   /**    * ensures that elements are subscribed only one time    */   private boolean elementsSubscribed = false;   protected static byte[] readFromFile (String filename)      throws FileNotFoundException, IOException   {      FileInputStream fileInputStream = new FileInputStream(filename);      int fileSize = fileInputStream.available();      byte[] b = new byte[fileSize];      fileInputStream.read(b);      return b;   }   public void subscribeElements () throws XmlBlasterException   {      if ((this.svgFileName != null) && (this.elementsSubscribed == false)) {         String xmlKey = "<?xml version='1.0' encoding='ISO-8859-1' ?>\n" +                      "<key oid='' queryType='XPATH'>\n" +                      "   //svg[@name='" + this.svgFileName + "' and @complete='false']" +                      "</key>";         String qos = "<qos></qos>";         this.xmlBlasterConnection.subscribe(xmlKey, qos);         this.elementsSubscribed = true;      }   }   /**    * In the argument list you should have either    * -svgMaster filename    * -svgSlave filename    */   public Transceiver (Global glob, JSVGCanvasExtended canvas)   {      this.glob = glob;      log.fine("constructor with Global");      this.canvas = canvas;      try {         String svgMaster = glob.getProperty().get("svgMaster", (String)null);         String svgSlave  = glob.getProperty().get("svgSlave", (String)null);         String svgUser   = glob.getProperty().get("svgUser", "dummyUser");         this.xmlBlasterConnection = glob.getXmlBlasterAccess();         ConnectQos connectQos = new ConnectQos(glob, svgUser, "secret");         this.xmlBlasterConnection.connect(connectQos, this);         if (svgMaster != null) {            this.svgFileName = svgMaster;            log.fine("constructor: running as Master: " + svgMaster);            // read the file, create a publishKey and then publish the thing            // then subscribe only to complete documents (not single elements)            // this because the elements can olny be updated once the document            // has been loaded.            String xmlKey = "<key oid=''><svg name='" + this.svgFileName + "' complete='true'></svg></key>";            String qos = "<qos></qos>";            // retrieve the file content            byte[] content = this.readFromFile(this.svgFileName);            MsgUnit messageUnit = new MsgUnit(xmlKey, content, qos);            PublishReturnQos ret = this.xmlBlasterConnection.publish(messageUnit);            log.info("constructor: " + ret.getKeyOid());         }         else if (svgSlave != null) {            this.svgFileName = svgSlave;         }         if (this.svgFileName != null) {            String xmlKey = "<?xml version='1.0' encoding='ISO-8859-1' ?>\n" +                      "<key oid='' queryType='XPATH'>\n" +                      "   //svg[@name='" + this.svgFileName + "' and @complete='true']" +                      "</key>";            String qos = "<qos></qos>";            this.xmlBlasterConnection.subscribe(xmlKey, qos);         }      }      // don't know if this is the correct place where to catch this exception      catch (XmlBlasterException ex) {         log.severe("Transceiver Constructor: " + ex.toString());      }      catch (FileNotFoundException ex) {         log.severe("Transceiver Constructor: " + ex.toString());      }      catch (IOException ex) {         log.severe("Transceiver Constructor: " + ex.toString());      }   }   /**    * Disconnects from the xmlBlaster Server    */   public void disconnect ()   {      this.xmlBlasterConnection.disconnect(new DisconnectQos(glob));   }   /**    * This method is invoked when a whole document is sent (this should be the    * first update this object should receive).    */   protected void updateDocument (byte[] content) throws XmlBlasterException   {      log.warning(".updateDocument()");      try {         this.canvas.loadDocumentFromByteArray(content);      }      catch (IOException ex)      {         log.severe("io exception: " + ex.toString());         throw new XmlBlasterException(ME, ".updateDocument: " + ex.getMessage());      }   }   protected void updateElement (byte[] content, String id) throws XmlBlasterException   {      log.fine(".updateElement(): " + id);      Element el = this.canvas.getElement(id);      if (el == null) {         log.warning("the element with id '" + id + "' is not registered");         return;      }      this.bridgeContext.unbind(el);      String completeSVG = SVG_PREFIX + new String(content) + SVG_POSTFIX;      log.warning(".updateElement: " + completeSVG);      try {         Node tempNode = SvgUtility.createDocument(completeSVG, "file://dummy.svg").getDocumentElement().getFirstChild();         Document doc = el.getOwnerDocument();         tempNode = doc.importNode(tempNode, true);         Node parentNode = el.getParentNode();         parentNode.replaceChild(tempNode, el);         GraphicsNode graphicsNode = this.bridgeContext.getGVTBuilder().build(this.bridgeContext, (Element)tempNode);         this.bridgeContext.bind((Element)tempNode, graphicsNode);         graphicsNode = this.bridgeContext.getGVTBuilder().build(this.bridgeContext, tempNode.getOwnerDocument());         this.canvas.setGraphicsNode(graphicsNode);         this.canvas.updateDocument();      }      catch (IOException ex) {         log.severe(".updateElement: IOException " + ex.getMessage());         throw new XmlBlasterException(ME, ".updateElement: IOException " + ex.getMessage());      }   }   public String update(java.lang.String loginName, UpdateKey updateKey,                   byte[] content, UpdateQos updateQos) throws XmlBlasterException   {      log.fine("update called, content: " + new String(content));      log.fine("update called, loginName: " + loginName);      log.fine("update called, updateKey: " + updateKey);      log.fine("update called, updateQos: " + updateQos);      NodeList nodes = XmlToDom.parseToDomTree(glob, updateKey.toString()).getDocumentElement().getElementsByTagName("svg");      int length = nodes.getLength();      if ((nodes == null) || (length < 1)) {         throw new XmlBlasterException(ME, ".update: no svg node found in the key");      }      Node keyNode = nodes.item(0);      if (keyNode instanceof Element) {         // if an id has been defined, then it is a single element otherwise the whole document         String id = ((Element)keyNode).getAttribute("id");         if ((id == null) || (id.length() < 1)) {            updateDocument(content);         }         else updateElement(content, id);      }      else throw new XmlBlasterException(ME, "update: svg node is not an element");      return "";   }   public void setBridgeContext (BridgeContext bridgeContext)   {      this.bridgeContext = bridgeContext;   }   /**    * finds if the given element is in the idTable (i.e. if it does not    * fullfill the 'dynamic' requirements). If not, its parent is searched and    * so on. If the element nor one of its ancestors is dynamic, it returns    * null, otherwise it returns the first dynamic element found.    *    * Currently the requirements for dynamic is that the element has an id    * which has a prefix 'xmlBlaster:'    */   protected Element getClickedDynamicElement (Element el)   {      log.fine(".getClickedDynamicElement");      while (el != null) {         String id = el.getAttribute("id");         if (SvgIdMapper.isDynamic(id)) return el;         Node parent = el.getParentNode();         if (parent instanceof Element) el = (Element)parent;         else return null;      }      return null;   }   public static void moveElement (Element el, int x, int y)   {      //log.finer(".moveElement");      if (el == null) return;      String transformString = el.getAttribute("transform");      if ((transformString == null) || (transformString.length() < 1)) {         transformString = "translate(" + x + "," + y + ")";      }      else {         el.removeAttribute("transform");         // check if 'translate' is defined         int pos = transformString.indexOf("translate(");         if (pos < 0) transformString += " translate(" + x + "," + y + ")";         else { // get the position string            String endString   = transformString.substring(pos + "translate(".length()).trim();            String startString = transformString.substring(0, pos).trim();            String coreString  = endString.substring(0, endString.indexOf(")")).trim();            endString          = endString.substring(1 + endString.indexOf(")")).trim();            StringTokenizer tokenizer = new StringTokenizer(coreString,",");            double x0 = Double.parseDouble(tokenizer.nextToken().trim());            double y0 = Double.parseDouble(tokenizer.nextToken().trim());            transformString = startString + " translate(" + (x0 + x) + "," + (y0 + y) + ") " + endString;         }      }      el.setAttribute("transform", transformString);   }   public void move (GraphicsNode graphicsNode, Point displacement)   {      log.info(".move " + displacement.x + " " + displacement.y);      Element el = this.bridgeContext.getElement(graphicsNode);      el = getClickedDynamicElement(el);      if (el == null) return;      String id = el.getAttribute("id");      // later make the necessary transform ....      this.moveElement(el, displacement.x, displacement.y);   /*      double x = graphicsNode.getBounds().getMinX() + displacement.x;      double y = graphicsNode.getBounds().getMinY() + displacement.y;      el.setAttributeNS(null, "x", Double.toString(x));      el.setAttributeNS(null, "y", Double.toString(y));*/      log.info(".move: el: " + el.getNodeName());      // publish the node      String xmlKey = "<key oid=''><svg name='" + this.svgFileName + "' id='" + id + "' complete='false'></svg></key>";      String qos = "<qos></qos>";      // retrieve the file content      byte[] content = XmlUtility.write(el).getBytes();      try {         MsgUnit messageUnit = new MsgUnit(xmlKey, content, qos);         PublishReturnQos ret = this.xmlBlasterConnection.publish(messageUnit);         log.fine("move: " + ret.getKeyOid());      }      catch (XmlBlasterException ex) {         log.severe(".move exception when publishing: " + ex.getMessage());      }   }}

⌨️ 快捷键说明

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