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 }