View Javadoc
1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
18   *  
19   */
20  package org.apache.directory.api.ldap.model.ldif;
21  
22  
23  import java.io.Externalizable;
24  import java.io.IOException;
25  import java.io.ObjectInput;
26  import java.io.ObjectOutput;
27  
28  import org.apache.directory.api.ldap.model.message.Control;
29  import org.apache.directory.api.util.Strings;
30  
31  
32  /**
33   * The LdifControl class stores a control defined for an entry found in a LDIF
34   * file.
35   *
36   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
37   */
38  public class LdifControl implements Control, Externalizable
39  {
40      /** The control type */
41      private String oid;
42  
43      /** The criticality (default value is false) */
44      private boolean criticality = false;
45  
46      /** Optional control value */
47      protected byte[] value;
48  
49  
50      /**
51       * Create a new Control
52       */
53      public LdifControl()
54      {
55      }
56  
57  
58      /**
59       * Create a new Control
60       * 
61       * @param oid OID of the created control
62       */
63      public LdifControl( String oid )
64      {
65          this.oid = oid;
66      }
67  
68  
69      /**
70       * {@inheritDoc}
71       */
72      @Override
73      public String toString()
74      {
75          return "LdifControl : {" + getOid() + ", " + isCritical() + ", " + Strings.dumpBytes( getValue() ) + "}";
76      }
77  
78  
79      /**
80       * {@inheritDoc}
81       */
82      @Override
83      public String getOid()
84      {
85          return oid;
86      }
87  
88  
89      /**
90       * {@inheritDoc}
91       */
92      @Override
93      public boolean isCritical()
94      {
95          return criticality;
96      }
97  
98  
99      /**
100      * {@inheritDoc}
101      */
102     @Override
103     public void setCritical( boolean criticality )
104     {
105         this.criticality = criticality;
106     }
107 
108 
109     /**
110      * Get back the control value
111      * 
112      * @return The control's value
113      */
114     public byte[] getValue()
115     {
116         return value;
117     }
118 
119 
120     /**
121      * Store the control value
122      * 
123      * @param value The value to store
124      */
125     public void setValue( byte[] value )
126     {
127         this.value = value;
128     }
129 
130 
131     /**
132      * @return <t>TRUE</t> if the control has a value
133      */
134     public boolean hasValue()
135     {
136         return value != null;
137     }
138 
139 
140     /**
141      * {@inheritDoc}
142      */
143     @Override
144     public void writeExternal( ObjectOutput out ) throws IOException
145     {
146         out.writeUTF( oid );
147         out.writeBoolean( criticality );
148 
149         if ( hasValue() )
150         {
151             out.writeBoolean( true );
152             out.writeInt( value.length );
153 
154             if ( value.length > 0 )
155             {
156                 out.write( value );
157             }
158         }
159         else
160         {
161             out.writeBoolean( false );
162         }
163 
164         out.flush();
165     }
166 
167 
168     /**
169      * {@inheritDoc}
170      */
171     @Override
172     public void readExternal( ObjectInput in ) throws IOException, ClassNotFoundException
173     {
174         oid = in.readUTF();
175         criticality = in.readBoolean();
176 
177         if ( in.readBoolean() )
178         {
179             int valueLength = in.readInt();
180 
181             if ( valueLength > 0 )
182             {
183                 value = new byte[valueLength];
184                 in.readFully( value );
185             }
186         }
187     }
188 
189 
190     /**
191      * @see Object#hashCode()
192      */
193     @Override
194     public int hashCode()
195     {
196         int h = 17;
197         h = h * 37 + ( criticality ? 1 : 0 );
198         h = h * 37 + ( oid == null ? 0 : oid.hashCode() );
199 
200         if ( value != null )
201         {
202             for ( byte v : value )
203             {
204                 h = h * 37 + v;
205             }
206         }
207 
208         return h;
209     }
210 
211 
212     /**
213      * @see Object#equals(Object)
214      */
215     @Override
216     public boolean equals( Object o )
217     {
218         if ( o == this )
219         {
220             return true;
221         }
222 
223         if ( o == null )
224         {
225             return false;
226         }
227 
228         if ( !( o instanceof Control ) )
229         {
230             return false;
231         }
232 
233         Control otherControl = ( Control ) o;
234 
235         if ( !oid.equalsIgnoreCase( otherControl.getOid() ) )
236         {
237             return false;
238         }
239 
240         return criticality == otherControl.isCritical();
241     }
242 }