001/**
002 *
003 * Copyright 2016-2017 Fernando Ramirez, Florian Schmaus
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *     http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.jivesoftware.smackx.bob;
018
019import org.jivesoftware.smack.util.StringUtils;
020
021/**
022 * Bits of Binary hash class.
023 * 
024 * @author Fernando Ramirez
025 * @author Florian Schmaus
026 * @see <a href="http://xmpp.org/extensions/xep-0231.html">XEP-0231: Bits of
027 *      Binary</a>
028 */
029public class BoBHash {
030
031    private final String hash;
032    private final String hashType;
033    private final String cid;
034
035    /**
036     * BoB hash constructor.
037     * 
038     * @param hash
039     * @param hashType
040     */
041    public BoBHash(String hash, String hashType) {
042        this.hash = StringUtils.requireNotNullOrEmpty(hash, "hash must not be null or empty");
043        this.hashType = StringUtils.requireNotNullOrEmpty(hashType, "hashType must not be null or empty");
044        this.cid = this.hashType + '+' + this.hash + "@bob.xmpp.org";
045    }
046
047    /**
048     * Get the hash.
049     * 
050     * @return the hash
051     */
052    public String getHash() {
053        return hash;
054    }
055
056    /**
057     * Get the hash type.
058     * 
059     * @return the hash type
060     */
061    public String getHashType() {
062        return hashType;
063    }
064
065    /**
066     * BoB hash to src attribute string.
067     * 
068     * @return src attribute string
069     */
070    public String toSrc() {
071        return "cid:" + getCid();
072    }
073
074    /**
075     * BoB hash to cid attribute string.
076     * 
077     * @return cid attribute string
078     */
079    public String getCid() {
080        return cid;
081    }
082
083    @Override
084    public boolean equals(Object other) {
085        if (other instanceof BoBHash) {
086            BoBHash otherBob = (BoBHash) other;
087            return cid.equals(otherBob.cid);
088        }
089        return false;
090    }
091
092    @Override
093    public int hashCode() {
094        return cid.hashCode();
095    }
096
097    /**
098     * Get BoB hash from src attribute string.
099     * 
100     * @param src
101     * @return the BoB hash
102     */
103    public static BoBHash fromSrc(String src) {
104        String hashType = src.substring(src.lastIndexOf("cid:") + 4, src.indexOf("+"));
105        String hash = src.substring(src.indexOf("+") + 1, src.indexOf("@bob.xmpp.org"));
106        return new BoBHash(hash, hashType);
107    }
108
109    /**
110     * Get BoB hash from cid attribute string.
111     * 
112     * @param cid
113     * @return the BoB hash
114     */
115    public static BoBHash fromCid(String cid) {
116        String hashType = cid.substring(0, cid.indexOf("+"));
117        String hash = cid.substring(cid.indexOf("+") + 1, cid.indexOf("@bob.xmpp.org"));
118        return new BoBHash(hash, hashType);
119    }
120
121}