001    /**
002     *  Licensed to the Apache Software Foundation (ASF) under one or more
003     *  contributor license agreements.  See the NOTICE file distributed with
004     *  this work for additional information regarding copyright ownership.
005     *  The ASF licenses this file to You under the Apache License, Version 2.0
006     *  (the "License"); you may not use this file except in compliance with
007     *  the License.  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     */
017    
018    package org.apache.geronimo.util.asn1;
019    
020    import java.io.ByteArrayInputStream;
021    import java.io.ByteArrayOutputStream;
022    import java.io.IOException;
023    
024    /**
025     * Base class for an application specific object
026     */
027    public class DERApplicationSpecific
028        extends DERObject
029    {
030        private int       tag;
031        private byte[]    octets;
032    
033        public DERApplicationSpecific(
034            int        tag,
035            byte[]    octets)
036        {
037            this.tag = tag;
038            this.octets = octets;
039        }
040    
041        public DERApplicationSpecific(
042            int                  tag,
043            DEREncodable         object)
044            throws IOException
045        {
046            this.tag = tag | DERTags.CONSTRUCTED;
047    
048            ByteArrayOutputStream baos = new ByteArrayOutputStream();
049            DEROutputStream dos = new DEROutputStream(baos);
050    
051            dos.writeObject(object);
052    
053            this.octets = baos.toByteArray();
054        }
055    
056        public boolean isConstructed()
057        {
058            return (tag & DERTags.CONSTRUCTED) != 0;
059        }
060    
061        public byte[] getContents()
062        {
063            return octets;
064        }
065    
066        public int getApplicationTag()
067        {
068            return tag & 0x1F;
069        }
070    
071        public DERObject getObject()
072            throws IOException
073        {
074            return new ASN1InputStream(new ByteArrayInputStream(getContents())).readObject();
075        }
076    
077        /* (non-Javadoc)
078         * @see org.apache.geronimo.util.asn1.DERObject#encode(org.apache.geronimo.util.asn1.DEROutputStream)
079         */
080        void encode(DEROutputStream out) throws IOException
081        {
082            out.writeEncoded(DERTags.APPLICATION | tag, octets);
083        }
084    
085        public boolean equals(
086                Object o)
087        {
088            if ((o == null) || !(o instanceof DERApplicationSpecific))
089            {
090                return false;
091            }
092    
093            DERApplicationSpecific other = (DERApplicationSpecific)o;
094    
095            if (tag != other.tag)
096            {
097                return false;
098            }
099    
100            if (octets.length != other.octets.length)
101            {
102                return false;
103            }
104    
105            for (int i = 0; i < octets.length; i++)
106            {
107                if (octets[i] != other.octets[i])
108                {
109                    return false;
110                }
111            }
112    
113            return true;
114        }
115    
116        public int hashCode()
117        {
118            byte[]  b = this.getContents();
119            int     value = 0;
120    
121            for (int i = 0; i != b.length; i++)
122            {
123                value ^= (b[i] & 0xff) << (i % 4);
124            }
125    
126            return value ^ this.getApplicationTag();
127        }
128    }