DefaultHandler.java

00001 /*
00002  * OpenMobileIS - a free Java(TM) Framework for mobile applications Java(TM)
00003  * Copyright (C) 2004-2006 Philippe Delrieu
00004  * All rights reserved.
00005  * Contact: pdelrieu@openmobileis.org
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00020  * USA
00021  *
00022  *  Author : Philippe Delrieu
00023  * 
00024  */
00025 
00026 package org.openmobileis.synchro.openmsp.protocol;
00027 
00028 import org.openmobileis.common.util.collection.Array;
00029 import org.openmobileis.synchro.openmsp.OpenMSPException;
00038 public class DefaultHandler extends  Handler {
00039 
00040   private String parsingStep = "";
00041   private Message message = null;
00042   private Array pile = new Array(10);
00043   private int indexPile = -1;
00044   private boolean isCred = false;
00045   private StringBuffer tagContent;
00046 
00047 
00048   public DefaultHandler() {
00049   }
00050 
00051   // override Handler methods in order to create Message from OpenMSP string
00052   public void startElement (String name) throws OpenMSPException {
00053     if (name.equals(MessageFactory.TAG_ROOT)) {
00054       ContainerMessage root = new ContainerMessage();
00055       message = new Message(root, false);
00056       addParsedElement(root);
00057     }  else if (message == null)
00058       throw new OpenMSPException ("Don't find root tag OpenMSP");
00059     else if (name.equals(MessageFactory.TAG_HEADER)) {
00060       ((ContainerMessage)pile.get(indexPile)).content = new Header();
00061     } else if (name.equals(MessageFactory.TAG_CRED))
00062       isCred = true;
00063     else if (name.equals(MessageFactory.TAG_SYNC))
00064       addParsedElement(new ContainerMessage(new Command(Element.SYNC)));
00065     else if (name.equals(MessageFactory.TAG_ADD))
00066       addParsedElement(new ContainerMessage(new RequestCommand(Element.ADD)));
00067     else if (name.equals(MessageFactory.TAG_DELETE))
00068       addParsedElement(new ContainerMessage(new RequestCommand(Element.DELETE)));
00069     else if (name.equals(MessageFactory.TAG_REPLACE))
00070       addParsedElement(new ContainerMessage(new RequestCommand(Element.REPLACE)));
00071     else if (name.equals(MessageFactory.TAG_MAP))
00072       addParsedElement(new ContainerMessage(new Command(Element.MAP)));
00073     else if (name.equals(MessageFactory.TAG_GET))
00074       addParsedElement(new ContainerMessage(new Command(Element.GET)));
00075     else if (name.equals(MessageFactory.TAG_SEQUENCE))
00076       addParsedElement(new ContainerMessage(new Sequence()));
00077     else if (name.equals(MessageFactory.TAG_RESULT))
00078       addParsedElement(new ContainerMessage(new Result()));
00079     else if (name.equals(MessageFactory.TAG_STATUS))
00080       addParsedElement(new AtomicMessage(new Status()));
00081     else if (name.equals(MessageFactory.TAG_MAP_ITEM))
00082       addParsedElement(new AtomicMessage(new Item(Element.MAP_ITEM)));
00083     else if (name.equals(MessageFactory.TAG_ITEM))
00084       addParsedElement(new AtomicMessage(new DataItem(Element.ITEM)));
00085     else if (name.equals(MessageFactory.TAG_FINAL))
00086       message.setFinal(true);
00087 
00088     if (name.equals(MessageFactory.TAG_META))  {
00089       tagContent = new StringBuffer();
00090     } else if (!name.equals(MessageFactory.TAG_URI)) {
00091       parsingStep = name;
00092       if (tagContent!=null) {
00093         tagContent.append("<").append(name).append(">");
00094       }
00095     }
00096  }
00097 
00098 
00099  public void endElement (String name) throws OpenMSPException {
00100     if ( (name.equals(MessageFactory.TAG_ROOT)) || (name.equals(MessageFactory.TAG_SYNC)) || (name.equals(MessageFactory.TAG_ADD)) ||
00101          (name.equals(MessageFactory.TAG_DELETE)) || (name.equals(MessageFactory.TAG_REPLACE)) || (name.equals(MessageFactory.TAG_MAP)) ||
00102          (name.equals(MessageFactory.TAG_GET)) || (name.equals(MessageFactory.TAG_SEQUENCE)) || (name.equals(MessageFactory.TAG_RESULT)) ||
00103          (name.equals(MessageFactory.TAG_STATUS)) || (name.equals(MessageFactory.TAG_ITEM)) || (name.equals(MessageFactory.TAG_MAP_ITEM)))
00104       removeParsedElement();
00105     else if (name.equals(MessageFactory.TAG_CRED))
00106       isCred = false;
00107     else if ((name.equals(MessageFactory.TAG_META)) && isCred)  {
00108       getElement().setCredentialMeta(tagContent.toString());
00109       tagContent = null;
00110     } else if (name.equals(MessageFactory.TAG_META))  {
00111       getElement().setMetaInformation(tagContent.toString());
00112     }else if (tagContent != null)  {
00113       tagContent.append("</").append(name).append(">");
00114     }
00115     parsingStep = "";
00116   }
00117 
00118 
00119  public void getValue (String value) throws OpenMSPException {
00120    try {
00121       if (parsingStep.equals(MessageFactory.TAG_SESSION)) {
00122         Element element = getElement();
00123         if (element.getElementType() == Element.HEADER)  {
00124           ((Header)element).sessionID = Long.parseLong(value);
00125         } else  {
00126           element.setSourceSessionID(Long.parseLong(value));
00127         }
00128       }
00129       else if (parsingStep.equals(MessageFactory.TAG_TARGET))
00130         getElement().setTarget(value);
00131       else if (parsingStep.equals(MessageFactory.TAG_SOURCE))
00132         getElement().setSource(value);
00133       else  if ((parsingStep.equals(MessageFactory.TAG_DATA)) && isCred)
00134         getElement().setCredentialData(value);
00135       else if (parsingStep.equals(MessageFactory.TAG_CMD_REF))
00136         getElement().setCmdRef(Integer.parseInt(value));
00137       else if (parsingStep.equals(MessageFactory.TAG_SOURCE_REF))
00138         getElement().setSourceRef(value);
00139       else if (parsingStep.equals(MessageFactory.TAG_TARGET_REF))
00140         getElement().setTargetRef(value);
00141       else if (parsingStep.equals(MessageFactory.TAG_CMDID)) {
00142         int cmdId = Integer.parseInt(value);
00143         if (message.cmdIdCounter < cmdId)
00144             message.cmdIdCounter = cmdId;
00145         getElement().setCmdId(cmdId);
00146       } else if ((parsingStep.equals(MessageFactory.TAG_META)) && (!isCred) )
00147         getElement().setMetaInformation(value);
00148       else  if ((parsingStep.equals(MessageFactory.TAG_DATA)) && (!isCred) )
00149          getElement().setData(value);
00150       else if (tagContent != null)  {
00151         tagContent.append(value);
00152       }
00153    } catch (java.lang.NullPointerException e) { // means the getElement() return null
00154        throw new OpenMSPException ("Malformed cyberML document, for " + parsingStep + " tag with value : " + value);
00155    }
00156  }
00157 
00158  private void addParsedElement (ContainerMessage message) {
00159     indexPile++;
00160     pile.add(message);
00161  }
00162 
00163  private void removeParsedElement () throws OpenMSPException {
00164     if (indexPile < 0)
00165       throw new OpenMSPException ("Invalid XML message : the end tag " + parsingStep + "does not correspond to the begin tag");
00166     // else get current message
00167     ContainerMessage message = (ContainerMessage)pile.get(indexPile);
00168     pile.remove(indexPile);
00169     // add to its parent if it is not the root
00170     indexPile--;
00171     if (indexPile >= 0)
00172       ((ContainerMessage)pile.get(indexPile)).add(message);
00173  }
00174 
00175  private Element getElement() {
00176     return ((ContainerMessage)pile.get(indexPile)).getElement();
00177  }
00178 
00179  public Message getMessage() {
00180   return message;
00181  }
00182 }

Generated on Mon Dec 4 11:03:25 2006 for OpenMobileIS by  doxygen 1.5.1-p1