package com.bluevia.android.commons.parser.xml; import java.io.IOException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.util.Log; import com.bluevia.android.commons.data.UserId; import com.bluevia.android.commons.data.UserId.Type; import com.bluevia.android.commons.parser.ParseException; import com.bluevia.android.commons.parser.SerializeException; /** * * Internal class with xml parser and serializer util functions. * * @author Telefonica I+D * * */ public class XmlParserSerializerUtils { private static final String TAG = "XmlParserSerializerUtils"; /** * * @param parser * @return * @throws XmlPullParserException when an error occurs parsing * @throws ParseException * @throws IOException when an error reading the stream occurs */ public static String getChildText(XmlPullParser parser) throws XmlPullParserException, ParseException { int eventType; try { eventType = parser.next(); if (eventType != XmlPullParser.TEXT) { return null; } return parser.getText(); } catch (IOException e) { throw new ParseException(e); } } /** * * @param parser * @param eventTypeRef * @return * @throws XmlPullParserException * @throws IOException */ public static String getChildText(XmlPullParser parser, int[] eventTypeRef) throws XmlPullParserException, IOException { int eventType = parser.next(); eventTypeRef[0] = eventType; Log.d(TAG, "getChildText Siguiente evento: " + XmlPullParser.TYPES[eventType] + " nombre: " + parser.getName()); if (eventType != XmlPullParser.TEXT) { return null; } Log.d(TAG, "Text2: " + parser.getText().trim()); return parser.getText().trim(); } /** * This method parser an userid from the xml and with an specific [userid] tag (i.e. "address") * If address is empty or null it returns null * <tns:[userid]>" * <uctr:phoneNumber>6698787878</uctr:phoneNumber> * </tns:[userid]> * @return String with the phoneNumber * @throws XmlPullParserException * @throws IOException */ public static UserId parseUserId(XmlPullParser parser, int eventType, String userIdTag) throws XmlPullParserException, IOException, ParseException { UserId userId = null; if (eventType != XmlPullParser.START_TAG) { throw new ParseException("Expected event START_TAG: Actual event: " + XmlPullParser.TYPES[eventType]); } while (eventType != XmlPullParser.END_DOCUMENT) { String name = parser.getName(); switch (eventType) { case XmlPullParser.END_TAG: Log.d(TAG, "handleUserId end tag name is " + name); if (name.equals(userIdTag)) { return userId; } break; case XmlPullParser.START_TAG: if (XmlConstants.XSD_USERIDTYPE_PHONENUMBER.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); Log.d(TAG, "handleUserId: " + XmlPullParser.TYPES[textEventType[0]]); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } userId = new UserId(Type.PHONE_NUMBER, value); } else if (XmlConstants.XSD_USERIDTYPE_ALIAS.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); Log.d(TAG, "handleUserId: " + XmlPullParser.TYPES[textEventType[0]]); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } userId = new UserId(Type.ALIAS, value); } else if (XmlConstants.XSD_USERIDTYPE_ANYURI.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); Log.d(TAG, "handleUserId: " + XmlPullParser.TYPES[textEventType[0]]); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } userId = new UserId(Type.ANY_URI, value); } else if (XmlConstants.XSD_USERIDTYPE_IPADDRESS.equals(name)) { userId = handleIpAddress(parser, eventType); } else if (XmlConstants.XSD_USERIDTYPE_OTHERTYPE.equals(name)) { userId = handleUserIdOtherType(parser, eventType); } break; default: break; } eventType = parser.next(); } return null; } private static UserId handleIpAddress (XmlPullParser parser, int eventType) throws XmlPullParserException, IOException, ParseException { UserId userId = null; if (eventType != XmlPullParser.START_TAG) { throw new ParseException("Expected event START_TAG: Actual event: " + XmlPullParser.TYPES[eventType]); } while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.END_TAG: String name = parser.getName(); Log.d(TAG, "handleIpAddress end tag name is " + name); if (XmlConstants.XSD_USERIDTYPE_IPADDRESS.equals(name)) { Log.d(TAG, "UserId is " + userId.getType() + "=" + userId.getUserIdValue()); // stop parsing here. return userId; } break; case XmlPullParser.START_TAG: name = parser.getName(); Log.d(TAG, "handleIpAddress start tag name is " + name); if (XmlConstants.XSD_USERIDTYPE_IPADDRESS_IPV4.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); Log.d(TAG, "handleUserId: " + XmlPullParser.TYPES[textEventType[0]]); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } userId = new UserId(Type.IPV4_ADDRESS, value); } else if (XmlConstants.XSD_USERIDTYPE_IPADDRESS_IPV6.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); Log.d(TAG, "handleIpAddress: " + XmlPullParser.TYPES[textEventType[0]]); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } userId = new UserId(Type.IPV6_ADDRESS, value); } break; default: break; } eventType = parser.next(); } return userId; } private static UserId handleUserIdOtherType (XmlPullParser parser, int eventType) throws XmlPullParserException, IOException, ParseException { UserId userId = null; if (eventType != XmlPullParser.START_TAG) { throw new ParseException("Expected event START_TAG: Actual event: " + XmlPullParser.TYPES[eventType]); } while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.END_TAG: String name = parser.getName(); Log.d(TAG, "handleUserIdOtherType end tag name is " + name); if (XmlConstants.XSD_USERIDTYPE_OTHERTYPE.equals(name)) { Log.d(TAG, "UserId is " + userId.getType() + "=" + userId.getUserIdValue()); // stop parsing here. return userId; } break; case XmlPullParser.START_TAG: name = parser.getName(); if (XmlConstants.XSD_USERIDTYPE_OTHERTYPE_TYPE.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); Log.d(TAG, "handleUserId: " + XmlPullParser.TYPES[textEventType[0]]); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } if (userId == null) { userId = new UserId(); userId.setType(Type.OTHER_ID); } userId.setOtherType(value); } else if (XmlConstants.XSD_USERIDTYPE_OTHERTYPE_VALUE.equals(name)) { int[] textEventType = new int[1]; String value = XmlParserSerializerUtils.getChildText(parser, textEventType); Log.d(TAG, "handleUserIdOtherType: " + XmlPullParser.TYPES[textEventType[0]]); if ((value == null) && (textEventType[0] == XmlPullParser.END_TAG)) { eventType = textEventType[0]; continue; } if (userId == null) { userId = new UserId(); userId.setType(Type.OTHER_ID); } Log.d(TAG, "handleUserIdOtherType: otherid value" + value); userId.setUserIdValue(value); } break; default: break; } eventType = parser.next(); } return userId; } /** * * @param ns * @param address * @param serializer * @throws SerializeException * @throws IOException */ public static void serializeUserIdContents(String ns, UserId address, XmlSerializer serializer) throws SerializeException, IOException { if (!address.isValid()) { throw new SerializeException("address in not valid"); } switch (address.getType()) { case PHONE_NUMBER: serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_PHONENUMBER); serializer.text(address.getUserIdValue()); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_PHONENUMBER); break; case ALIAS: serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_ALIAS); serializer.text(address.getUserIdValue()); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_ALIAS); break; case ANY_URI: serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_ANYURI); serializer.text(address.getUserIdValue()); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_ANYURI); break; case IPV4_ADDRESS: serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS); serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS_IPV4); serializer.text(address.getUserIdValue()); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS_IPV4); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS); break; case IPV6_ADDRESS: serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS); serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS_IPV6); serializer.text(address.getUserIdValue()); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS_IPV6); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_IPADDRESS); break; case OTHER_ID: serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_OTHERTYPE); serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_OTHERTYPE_TYPE); serializer.text(address.getOtherType()); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_OTHERTYPE_TYPE); serializer.startTag(ns, XmlConstants.XSD_USERIDTYPE_OTHERTYPE_VALUE); serializer.text(address.getUserIdValue()); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_OTHERTYPE_VALUE); serializer.endTag(ns, XmlConstants.XSD_USERIDTYPE_OTHERTYPE); break; } } /** * * @param apiNamespace * @param commonTypeNamespace * @param endpoint * @param correlator * @param serializer * @throws SerializeException * @throws IOException */ public static void serializeReceiptRequestContents(String apiNamespace, String commonTypeNamespace, String endpoint, String correlator, XmlSerializer serializer) throws SerializeException, IOException { if (endpoint != null && endpoint.trim().length() != 0 && correlator != null && correlator.trim().length() != 0) { serializer.startTag(apiNamespace, XmlConstants.XSD_RECEIPTREQUEST); //Endpoint serializer.startTag(commonTypeNamespace, XmlConstants.XSD_RECEIPTREQUEST_ENDPOINT); serializer.text(endpoint); serializer.endTag(commonTypeNamespace, XmlConstants.XSD_RECEIPTREQUEST_ENDPOINT); //Correlator serializer.startTag(commonTypeNamespace, XmlConstants.XSD_RECEIPTREQUEST_CORRELATOR); serializer.text(correlator); serializer.endTag(commonTypeNamespace, XmlConstants.XSD_RECEIPTREQUEST_CORRELATOR); serializer.endTag(apiNamespace, XmlConstants.XSD_RECEIPTREQUEST); } } }