001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one
003 *  or more contributor license agreements.  See the NOTICE file
004 *  distributed with this work for additional information
005 *  regarding copyright ownership.  The ASF licenses this file
006 *  to you under the Apache License, Version 2.0 (the
007 *  "License"); you may not use this file except in compliance
008 *  with 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,
013 *  software distributed under the License is distributed on an
014 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *  KIND, either express or implied.  See the License for the
016 *  specific language governing permissions and limitations
017 *  under the License. 
018 *  
019 */
020package org.apache.directory.api.ldap.model.ldif;
021
022
023import java.io.Externalizable;
024import java.io.IOException;
025import java.io.ObjectInput;
026import java.io.ObjectOutput;
027
028import org.apache.directory.api.ldap.model.message.Control;
029import org.apache.directory.api.util.Strings;
030
031
032/**
033 * The LdifControl class stores a control defined for an entry found in a LDIF
034 * file.
035 *
036 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
037 */
038public class LdifControl implements Control, Externalizable
039{
040    /** The control type */
041    private String oid;
042
043    /** The criticality (default value is false) */
044    private boolean criticality = false;
045
046    /** Optional control value */
047    protected byte[] value;
048
049
050    /**
051     * Create a new Control
052     */
053    public LdifControl()
054    {
055    }
056
057
058    /**
059     * Create a new Control
060     * 
061     * @param oid OID of the created control
062     */
063    public LdifControl( String oid )
064    {
065        this.oid = oid;
066    }
067
068
069    /**
070     * {@inheritDoc}
071     */
072    public String toString()
073    {
074        return "LdifControl : {" + getOid() + ", " + isCritical() + ", " + Strings.dumpBytes( getValue() ) + "}";
075    }
076
077
078    /**
079     * {@inheritDoc}
080     */
081    public String getOid()
082    {
083        return oid;
084    }
085
086
087    /**
088     * {@inheritDoc}
089     */
090    public boolean isCritical()
091    {
092        return criticality;
093    }
094
095
096    /**
097     * {@inheritDoc}
098     */
099    public void setCritical( boolean criticality )
100    {
101        this.criticality = criticality;
102    }
103
104
105    /**
106     * {@inheritDoc}
107     */
108    public byte[] getValue()
109    {
110        return value;
111    }
112
113
114    /**
115     * {@inheritDoc}
116     */
117    public void setValue( byte[] value )
118    {
119        this.value = value;
120    }
121
122
123    /**
124     * {@inheritDoc}
125     */
126    public boolean hasValue()
127    {
128        return value != null;
129    }
130
131
132    /**
133     * {@inheritDoc}
134     */
135    public void writeExternal( ObjectOutput out ) throws IOException
136    {
137        out.writeUTF( oid );
138        out.writeBoolean( criticality );
139
140        if ( hasValue() )
141        {
142            out.writeBoolean( true );
143            out.writeInt( value.length );
144
145            if ( value.length > 0 )
146            {
147                out.write( value );
148            }
149        }
150        else
151        {
152            out.writeBoolean( false );
153        }
154
155        out.flush();
156    }
157
158
159    /**
160     * {@inheritDoc}
161     */
162    public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
163    {
164        oid = in.readUTF();
165        criticality = in.readBoolean();
166
167        if ( in.readBoolean() )
168        {
169            int valueLength = in.readInt();
170
171            if ( valueLength > 0 )
172            {
173                value = new byte[valueLength];
174                in.readFully( value );
175            }
176        }
177    }
178
179
180    /**
181     * @see Object#hashCode()
182     */
183    public int hashCode()
184    {
185        int h = 17;
186        h = h * 37 + ( criticality ? 1 : 0 );
187        h = h * 37 + ( oid == null ? 0 : oid.hashCode() );
188
189        if ( value != null )
190        {
191            for ( byte v : value )
192            {
193                h = h * 37 + v;
194            }
195        }
196
197        return h;
198    }
199
200
201    /**
202     * @see Object#equals(Object)
203     */
204    public boolean equals( Object o )
205    {
206        if ( o == this )
207        {
208            return true;
209        }
210
211        if ( o == null )
212        {
213            return false;
214        }
215
216        if ( !( o instanceof Control ) )
217        {
218            return false;
219        }
220
221        Control otherControl = ( Control ) o;
222
223        if ( !oid.equalsIgnoreCase( otherControl.getOid() ) )
224        {
225            return false;
226        }
227
228        return criticality == otherControl.isCritical();
229    }
230}