/** * Copyright (c) 2013, Redsolution LTD. All rights reserved. * * This file is part of Xabber project; you can redistribute it and/or * modify it under the terms of the GNU General Public License, Version 3. * * Xabber 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, see http://www.gnu.org/licenses/. */ package com.xabber.xmpp.uri; import java.util.ArrayList; import java.util.HashMap; import java.util.regex.Pattern; import android.net.Uri; import android.text.Spannable; import android.text.util.Linkify; import android.util.Patterns; /** * Helper class to parse xmpp uri. * <p/> * http://xmpp.org/extensions/xep-0147.html * * @author alexander.ivanov */ public class XMPPUri { private static final String XMPP_SCHEME = "xmpp"; private static final Pattern XMPP_PATTERN = Pattern .compile("xmpp\\:(?:(?:[" + Patterns.GOOD_IRI_CHAR + "\\;\\/\\?\\@\\&\\=\\#\\~\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])" + "|(?:\\%[a-fA-F0-9]{2}))+"); private final String authority; private final String path; private final String queryType; private final HashMap<String, ArrayList<String>> values; public static XMPPUri parse(Uri uri) throws IllegalArgumentException { return new XMPPUri(uri); } private XMPPUri(Uri uri) throws IllegalArgumentException { if (uri == null) throw new IllegalArgumentException(); if (!XMPP_SCHEME.equals(uri.getScheme())) throw new IllegalArgumentException(); // Fix processing path without leading slash uri = Uri.parse(uri.getEncodedSchemeSpecificPart()); authority = uri.getAuthority(); if (uri.getPath() == null) throw new IllegalArgumentException(); if (uri.getPath().startsWith("/")) path = uri.getPath().substring(1); else path = uri.getPath(); values = new HashMap<String, ArrayList<String>>(); String query = uri.getEncodedQuery(); String action = null; if (query != null) { String parts[] = query.split(";"); for (String part : parts) if (action == null) { if (part.contains("=")) throw new IllegalArgumentException(); action = part; } else { int index = part.indexOf("="); if (index == -1) continue; String key = part.substring(0, index); String value = part.substring(index + 1); ArrayList<String> list = values.get(key); if (list == null) { list = new ArrayList<String>(); values.put(key, list); } list.add(Uri.decode(value)); } } queryType = action; } public String getAuthority() { return authority; } public String getPath() { return path; } public String getQueryType() { return queryType; } public ArrayList<String> getValues(String queryKey) { return values.get(queryKey); } @Override public String toString() { return path + " : " + queryType + " : " + values; } /** * Update spannable with XMPP URI links. * * @param spannable * @return Where spannable was modified. */ public static boolean addLinks(Spannable spannable) { return Linkify.addLinks(spannable, XMPP_PATTERN, "xmpp"); } }