/* / Copyright (C) 2009 Risto Känsäkoski- Sesca ISW Ltd / / This file is part of SIP-Applet (www.sesca.com, www.purplescout.com) / / This program is free software; you can redistribute it and/or / modify it under the terms of the GNU General Public License / as published by the Free Software Foundation; either version 2 / of the License, or (at your option) any later version. / / This program is distributed in the hope that it will be useful, / but WITHOUT ANY WARRANTY; without even the implied warranty of / MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the / GNU General Public License for more details. / / You should have received a copy of the GNU General Public License / along with this program; if not, write to the Free Software / Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package com.sesca.sip.presence.pidf; import java.util.HashMap; import java.util.Map; import java.util.Vector; public class SimpleParser { int index=0; int start=0; int end=0; String tag=""; boolean done=false; Map<String, String> prefixes=null; String prefix=""; static final String nameSpace="urn:ietf:params:xml:ns:pidf"; Map<String, Integer> indexes=null; Tuple tuple = null; Vector<Tuple> tuples = null; String xml = ""; public void parse(String x) { done=false; xml=x; init(); while (!done){ readNextTag(); } showTuples(); } private void readNextTag() { boolean isEndTag; int tagStart=xml.indexOf("<",index); int tagEnd=xml.indexOf(">",index)+1; if (tagStart<0 || tagEnd <= 0) { done=true; return; } //System.out.println("start="+tagStart); //System.out.println("end="+tagEnd); index = tagEnd; tag=xml.substring(tagStart, tagEnd); //System.out.println(tag); int nextSpace= tag.indexOf(" "); if (nextSpace==-1) { nextSpace=tag.indexOf("/>"); if (nextSpace==-1)nextSpace=tag.indexOf(">"); if (nextSpace==-1) return; } //System.out.println("nextSpace="+nextSpace); String tagName = tag.substring(1,nextSpace); String prefix=""; if (tagName.startsWith("/")) isEndTag=true; else isEndTag=false; int k = tagName.indexOf(":"); if (k>=0) { if (!isEndTag) prefix=tagName.substring(0, k); else prefix=tagName.substring(1, k); tagName=tagName.substring(k+1); if (isEndTag)tagName="/"+tagName; } else prefix="-"; this.prefix=prefix; //System.out.println("*"+prefix+"* : "+tagName); String ns=prefixes.get(prefix); if (tagName.equals("presence")) { readNameSpaces(); } if (ns!= null && ns.equals(nameSpace)) { // System.out.println(ns+"."+tagName); if (tagName.equals("basic")) { // System.out.println("basic"); indexes.put(ns+".basic", tagEnd); } else if (tagName.equals("/basic")) { // System.out.println("/basic"); int i =-1; i = indexes.get(ns+".basic"); if (i!=-1) { String s = xml.substring(i,tagStart); // System.out.println("'"+s+"'"); tuple.setStatus_basic(s); } } if (tagName.equals("note")) { indexes.put(ns+".note", tagEnd); } else if (tagName.equals("/note")) { int i =-1; i = indexes.get(ns+".note"); if (i!=-1) { String s = xml.substring(i,tagStart); // System.out.println("'"+s+"'"); tuple.setNote(s); } } else if (tagName.equals("tuple")) { // System.out.println("tuple"); String id=readId(); // System.out.println("'"+id+"'"); if (id!=null) { tuple=new Tuple(id); } } else if (tagName.equals("/tuple")) { if (tuple != null) { tuples.add(tuple); } tuple = null; } } } private void init() { index = 0; start = 0; end = xml.length(); tag = ""; prefixes = new HashMap<String, String>(); indexes= new HashMap<String, Integer>(); tuples = new Vector<Tuple>(); } private void readNameSpaces() { // System.out.println("readNameSpaces()"); int start=0; int prefix=0; int uStart=0; int uEnd=0; String pref=""; boolean stop=false; String tag=this.tag; while (!stop) { //System.out.println("while"); start=tag.indexOf("xmlns",uEnd); if (start<0) { stop=true; break; } uStart=tag.indexOf("=",start); prefix = tag.indexOf(":",start); //System.out.println(uStart+", "+start+", "+prefix); if (prefix<0 || prefix > uStart) prefix = -1; if (prefix>=0) pref=tag.substring(prefix+1, uStart); else pref="-"; uStart=tag.indexOf("\"",uStart); if (uStart<0) { stop=true; break; } uEnd=tag.indexOf("\"",uStart+1); if (uEnd<0) { stop=true; break; } //System.out.println(tag.subSequence(uStart+1, uEnd)); //System.out.println("prefix='"+pref+"'"); //start = uEnd; prefixes.put(pref, tag.subSequence(uStart+1, uEnd).toString()); } } private String readId() { // System.out.println("readId()"); int start=0; int uStart=0; int uEnd=0; boolean stop=false; String tag=this.tag; while (!stop) { //System.out.println("while"); start=tag.indexOf("id",uEnd); if (start<0) { stop=true; break; } uStart=tag.indexOf("=",start); uStart=tag.indexOf("\"",uStart); if (uStart<0) { stop=true; break; } uEnd=tag.indexOf("\"",uStart+1); if (uEnd<0) { stop=true; break; } String id = tag.substring(uStart+1,uEnd); //System.out.println("id='"+id+"'"); return id; } return null; } private void showTuples() { for (int i=0;i<tuples.size();i++) { Tuple t=tuples.elementAt(i); if (t!=null) { // System.out.println(t.getId()+":"+t.getStatus_basic()); } } } public Vector getTuples() { return tuples; } }