Home | History | Annotate | Download | only in macros
      1 /**
      2  * $Revision$
      3  * $Date$
      4  *
      5  * Copyright 2003-2007 Jive Software.
      6  *
      7  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *     http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  */
     19 
     20 package org.jivesoftware.smackx.workgroup.ext.macros;
     21 
     22 import java.io.StringReader;
     23 
     24 import org.jivesoftware.smack.packet.IQ;
     25 import org.jivesoftware.smack.provider.IQProvider;
     26 import org.jivesoftware.smack.util.StringUtils;
     27 import org.xmlpull.v1.XmlPullParserFactory;
     28 import org.xmlpull.v1.XmlPullParser;
     29 
     30 /**
     31  * Macros iq is responsible for handling global and personal macros in the a Live Assistant
     32  * Workgroup.
     33  */
     34 public class Macros extends IQ {
     35 
     36     private MacroGroup rootGroup;
     37     private boolean personal;
     38     private MacroGroup personalMacroGroup;
     39 
     40     public MacroGroup getRootGroup() {
     41         return rootGroup;
     42     }
     43 
     44     public void setRootGroup(MacroGroup rootGroup) {
     45         this.rootGroup = rootGroup;
     46     }
     47 
     48     public boolean isPersonal() {
     49         return personal;
     50     }
     51 
     52     public void setPersonal(boolean personal) {
     53         this.personal = personal;
     54     }
     55 
     56     public MacroGroup getPersonalMacroGroup() {
     57         return personalMacroGroup;
     58     }
     59 
     60     public void setPersonalMacroGroup(MacroGroup personalMacroGroup) {
     61         this.personalMacroGroup = personalMacroGroup;
     62     }
     63 
     64 
     65     /**
     66      * Element name of the packet extension.
     67      */
     68     public static final String ELEMENT_NAME = "macros";
     69 
     70     /**
     71      * Namespace of the packet extension.
     72      */
     73     public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup";
     74 
     75     public String getChildElementXML() {
     76         StringBuilder buf = new StringBuilder();
     77 
     78         buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");
     79         if (isPersonal()) {
     80             buf.append("<personal>true</personal>");
     81         }
     82         if (getPersonalMacroGroup() != null) {
     83         	buf.append("<personalMacro>");
     84         	buf.append(StringUtils.escapeForXML(getPersonalMacroGroup().toXML()));
     85         	buf.append("</personalMacro>");
     86         }
     87         buf.append("</").append(ELEMENT_NAME).append("> ");
     88 
     89         return buf.toString();
     90     }
     91 
     92     /**
     93      * An IQProvider for Macro packets.
     94      *
     95      * @author Derek DeMoro
     96      */
     97     public static class InternalProvider implements IQProvider {
     98 
     99         public InternalProvider() {
    100             super();
    101         }
    102 
    103         public IQ parseIQ(XmlPullParser parser) throws Exception {
    104             Macros macroGroup = new Macros();
    105 
    106             boolean done = false;
    107             while (!done) {
    108                 int eventType = parser.next();
    109                 if (eventType == XmlPullParser.START_TAG) {
    110                     if (parser.getName().equals("model")) {
    111                         String macros = parser.nextText();
    112                         MacroGroup group = parseMacroGroups(macros);
    113                         macroGroup.setRootGroup(group);
    114                     }
    115                 }
    116                 else if (eventType == XmlPullParser.END_TAG) {
    117                     if (parser.getName().equals(ELEMENT_NAME)) {
    118                         done = true;
    119                     }
    120                 }
    121             }
    122 
    123             return macroGroup;
    124         }
    125 
    126         public Macro parseMacro(XmlPullParser parser) throws Exception {
    127         	Macro macro = new Macro();
    128         	 boolean done = false;
    129             while (!done) {
    130 	        	int eventType = parser.next();
    131 	        	if (eventType == XmlPullParser.START_TAG) {
    132 	        		if (parser.getName().equals("title")) {
    133 	        			parser.next();
    134 	        			macro.setTitle(parser.getText());
    135 	        		}
    136 	        		else if (parser.getName().equals("description")) {
    137 	        			macro.setDescription(parser.nextText());
    138 	        		}
    139 	        		else if (parser.getName().equals("response")) {
    140 	        			macro.setResponse(parser.nextText());
    141 	        		}
    142 	        		else if (parser.getName().equals("type")) {
    143 	        			macro.setType(Integer.valueOf(parser.nextText()).intValue());
    144 	        		}
    145 	        	}
    146 	            else if (eventType == XmlPullParser.END_TAG) {
    147 	                if (parser.getName().equals("macro")) {
    148 	                    done = true;
    149 	                }
    150 	            }
    151             }
    152         	return macro;
    153         }
    154 
    155         public MacroGroup parseMacroGroup(XmlPullParser parser) throws Exception {
    156         	MacroGroup group = new MacroGroup();
    157 
    158             boolean done = false;
    159             while (!done) {
    160 	        	int eventType = parser.next();
    161 	        	if (eventType == XmlPullParser.START_TAG) {
    162 	        		if (parser.getName().equals("macrogroup")) {
    163 	        			group.addMacroGroup(parseMacroGroup(parser));
    164 	        		}
    165 	        		if (parser.getName().equals("title")) {
    166 	        			group.setTitle(parser.nextText());
    167 	        		}
    168 	        		if (parser.getName().equals("macro")) {
    169 	        			group.addMacro(parseMacro(parser));
    170 	        		}
    171 	        	}
    172 	            else if (eventType == XmlPullParser.END_TAG) {
    173 	                if (parser.getName().equals("macrogroup")) {
    174 	                    done = true;
    175 	                }
    176 	            }
    177             }
    178         	return group;
    179         }
    180 
    181         public MacroGroup parseMacroGroups(String macros) throws Exception {
    182 
    183         	MacroGroup group = null;
    184         	XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
    185         	parser.setInput(new StringReader(macros));
    186 			int eventType = parser.getEventType();
    187 			while (eventType != XmlPullParser.END_DOCUMENT) {
    188 				eventType = parser.next();
    189 				 if (eventType == XmlPullParser.START_TAG) {
    190 	                    if (parser.getName().equals("macrogroup")) {
    191 	                    	group = parseMacroGroup(parser);
    192 	                    }
    193 				 }
    194 			}
    195 			return group;
    196         }
    197     }
    198 }