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}