/* * Copyright 2000-2006 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.communicator.jabber.impl; import jetbrains.communicator.core.transport.Transport; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.Namespace; import org.jdom.Verifier; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.provider.PacketExtensionProvider; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; import java.io.StringReader; /** * @author Kir */ public abstract class BaseExtension implements PacketExtension, PacketExtensionProvider { private static final Logger LOG = Logger.getLogger(BaseExtension.class); static final String NAMESPACE = Transport.NAMESPACE + "/jabber"; public final String getNamespace() { return NAMESPACE; } public String toXML() { Element root = new Element(getElementName()); setupData(root); root.setNamespace(Namespace.getNamespace(getNamespace())); XMLOutputter outputter = new XMLOutputter(); return outputter.outputString(root); } protected abstract void setupData(Element root); protected abstract Object createFrom(Element element); public Object createFrom(String xml) { try { Document document = new SAXBuilder().build(new StringReader(removeNonXmlCharacters(xml))); return createFrom(document.getRootElement()); } catch (Exception e) { LOG.error(e.getMessage() + "\n\n" + xml, e); } return null; } private static String removeNonXmlCharacters(String xml) { StringBuilder sb = null; for(int i = 0; i < xml.length(); i ++) { char c = xml.charAt(i); if (!Verifier.isXMLCharacter(c)) { if (sb == null) sb = new StringBuilder(xml); sb.setCharAt(i, '?'); } } return sb != null ? sb.toString() : xml; } protected static String getContent(XmlPullParser parser, String tagName) { StringBuffer sb = new StringBuffer(); try { int event = parser.getEventType(); // get the content XMLOutputter xmlOutputter = new XMLOutputter(); while (true) { switch (event) { case XmlPullParser.TEXT: sb.append(xmlOutputter.escapeElementEntities(parser.getText())); break; case XmlPullParser.START_TAG: sb.append('<' + parser.getName()); int attributeCount = parser.getAttributeCount(); for (int i = 0; i < attributeCount; i ++) { String attributeValue = xmlOutputter.escapeAttributeEntities(parser.getAttributeValue(i)); sb.append(' ').append(parser.getAttributeName(i)).append('=').append('"') .append(attributeValue).append('"'); } sb.append(" xmlns=\"").append(parser.getNamespace()).append('"'); sb.append('>'); break; case XmlPullParser.END_TAG: sb.append("</" + parser.getName() + '>'); break; default: } if (event == parser.END_TAG && tagName.equals(parser.getName())) break; event = parser.next(); } } catch (XmlPullParserException e) { e.printStackTrace(System.err); } catch (IOException e) { e.printStackTrace(System.err); } return sb.toString(); } }