001    /**
002     *
003     *  Licensed to the Apache Software Foundation (ASF) under one or more
004     *  contributor license agreements.  See the NOTICE file distributed with
005     *  this work for additional information regarding copyright ownership.
006     *  The ASF licenses this file to You under the Apache License, Version 2.0
007     *  (the "License"); you may not use this file except in compliance with
008     *  the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     *  Unless required by applicable law or agreed to in writing, software
013     *  distributed under the License is distributed on an "AS IS" BASIS,
014     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     *  See the License for the specific language governing permissions and
016     *  limitations under the License.
017     */
018    
019    package org.apache.geronimo.util.asn1;
020    
021    import java.io.IOException;
022    
023    /**
024     * DER BMPString object.
025     */
026    public class DERBMPString
027        extends DERObject
028        implements DERString
029    {
030        String  string;
031    
032        /**
033         * return a BMP String from the given object.
034         *
035         * @param obj the object we want converted.
036         * @exception IllegalArgumentException if the object cannot be converted.
037         */
038        public static DERBMPString getInstance(
039            Object  obj)
040        {
041            if (obj == null || obj instanceof DERBMPString)
042            {
043                return (DERBMPString)obj;
044            }
045    
046            if (obj instanceof ASN1OctetString)
047            {
048                return new DERBMPString(((ASN1OctetString)obj).getOctets());
049            }
050    
051            if (obj instanceof ASN1TaggedObject)
052            {
053                return getInstance(((ASN1TaggedObject)obj).getObject());
054            }
055    
056            throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
057        }
058    
059        /**
060         * return a BMP String from a tagged object.
061         *
062         * @param obj the tagged object holding the object we want
063         * @param explicit true if the object is meant to be explicitly
064         *              tagged false otherwise.
065         * @exception IllegalArgumentException if the tagged object cannot
066         *              be converted.
067         */
068        public static DERBMPString getInstance(
069            ASN1TaggedObject obj,
070            boolean          explicit)
071        {
072            return getInstance(obj.getObject());
073        }
074    
075    
076        /**
077         * basic constructor - byte encoded string.
078         */
079        public DERBMPString(
080            byte[]   string)
081        {
082            char[]  cs = new char[string.length / 2];
083    
084            for (int i = 0; i != cs.length; i++)
085            {
086                cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff));
087            }
088    
089            this.string = new String(cs);
090        }
091    
092        /**
093         * basic constructor
094         */
095        public DERBMPString(
096            String   string)
097        {
098            this.string = string;
099        }
100    
101        public String getString()
102        {
103            return string;
104        }
105    
106        public int hashCode()
107        {
108            return this.getString().hashCode();
109        }
110    
111        public boolean equals(
112            Object  o)
113        {
114            if (!(o instanceof DERBMPString))
115            {
116                return false;
117            }
118    
119            DERBMPString  s = (DERBMPString)o;
120    
121            return this.getString().equals(s.getString());
122        }
123    
124        void encode(
125            DEROutputStream  out)
126            throws IOException
127        {
128            char[]  c = string.toCharArray();
129            byte[]  b = new byte[c.length * 2];
130    
131            for (int i = 0; i != c.length; i++)
132            {
133                b[2 * i] = (byte)(c[i] >> 8);
134                b[2 * i + 1] = (byte)c[i];
135            }
136    
137            out.writeEncoded(BMP_STRING, b);
138        }
139    }