/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.studio.ldifparser.model.lines;
import org.apache.directory.studio.ldifparser.LdifParserConstants;
import org.apache.directory.studio.ldifparser.LdifUtils;
public class LdifControlLine extends LdifValueLineBase
{
private String rawCriticality;
private String rawControlValueType;
private String rawControlValue;
public LdifControlLine( int offset, String rawControlSpec, String rawControlType, String rawOid,
String rawCriticality, String rawControlValueType, String rawControlValue, String rawNewLine )
{
super( offset, rawControlSpec, rawControlType, rawOid, rawNewLine );
this.rawCriticality = rawCriticality;
this.rawControlValueType = rawControlValueType;
this.rawControlValue = rawControlValue;
}
public String getRawControlSpec()
{
return super.getRawLineStart();
}
public String getUnfoldedControlSpec()
{
return super.getUnfoldedLineStart();
}
public String getRawControlType()
{
return super.getRawValueType();
}
public String getUnfoldedControlType()
{
return super.getUnfoldedValueType();
}
public String getRawOid()
{
return super.getRawValue();
}
public String getUnfoldedOid()
{
return super.getUnfoldedValue();
}
public String getRawCriticality()
{
return getNonNull( rawCriticality );
}
public String getUnfoldedCriticality()
{
return unfold( getRawCriticality() );
}
public boolean isCritical()
{
return getUnfoldedCriticality().endsWith( "true" ); //$NON-NLS-1$
}
public String getRawControlValueType()
{
return getNonNull( rawControlValueType );
}
public String getUnfoldedControlValueType()
{
return unfold( getRawControlValueType() );
}
public String getRawControlValue()
{
return getNonNull( rawControlValue );
}
public String getUnfoldedControlValue()
{
return unfold( getRawControlValue() );
}
public String toRawString()
{
return getRawControlSpec() + getRawControlType() + getRawOid() + getRawCriticality()
+ getRawControlValueType() + getRawControlValue() + getRawNewLine();
}
public boolean isValid()
{
return getUnfoldedControlSpec().length() > 0
&& getUnfoldedControlType().length() > 0
&& getUnfoldedOid().length() > 0
&& ( rawCriticality == null || getUnfoldedCriticality().endsWith( "true" ) || this //$NON-NLS-1$
.getUnfoldedCriticality().endsWith( "false" ) ) //$NON-NLS-1$
&& ( ( rawControlValueType == null && rawControlValue == null ) || ( rawControlValueType != null && rawControlValue != null ) )
&& getUnfoldedNewLine().length() > 0;
}
public String getInvalidString()
{
if ( getUnfoldedControlSpec().length() == 0 )
{
return "Missing 'control'";
}
else if ( getUnfoldedOid().length() == 0 )
{
return "Missing OID";
}
else if ( ( rawCriticality != null && !getUnfoldedCriticality().endsWith( "true" ) && !this //$NON-NLS-1$
.getUnfoldedCriticality().endsWith( "false" ) ) ) //$NON-NLS-1$
{
return "Invalid criticality, must be 'true' or 'false'";
}
else
{
return super.getInvalidString();
}
}
/**
*
* @return the binary representation of the control value, may be null
*/
public final byte[] getControlValueAsBinary()
{
Object o = getControlValueAsObject();
if ( o instanceof String )
{
return LdifUtils.utf8encode( ( String ) o );
}
else if ( o instanceof byte[] )
{
return ( byte[] ) o;
}
else
{
return new byte[0];
}
}
public final Object getControlValueAsObject()
{
if ( isControlValueTypeSafe() )
{
return getUnfoldedControlValue();
}
else if ( isControlValueTypeBase64() )
{
return LdifUtils.base64decodeToByteArray( getUnfoldedControlValue() );
}
else
{
return null;
}
}
public boolean isControlValueTypeBase64()
{
return getUnfoldedControlValueType().startsWith( "::" ); //$NON-NLS-1$
}
public boolean isControlValueTypeSafe()
{
return getUnfoldedControlValueType().startsWith( ":" ) && !isControlValueTypeBase64(); //$NON-NLS-1$
}
public static LdifControlLine create( String oid, String criticality, String controlValue )
{
if ( LdifUtils.mustEncode( controlValue ) )
{
return create( oid, criticality, LdifUtils.utf8encode( controlValue ) );
}
else
{
LdifControlLine controlLine = new LdifControlLine( 0, "control", ":", oid, criticality, //$NON-NLS-1$ //$NON-NLS-2$
controlValue != null ? ":" : null, controlValue != null ? controlValue : null, //$NON-NLS-1$
LdifParserConstants.LINE_SEPARATOR );
return controlLine;
}
}
public static LdifControlLine create( String oid, String criticality, byte[] controlValue )
{
LdifControlLine controlLine = new LdifControlLine( 0, "control", ":", oid, criticality, controlValue != null //$NON-NLS-1$ //$NON-NLS-2$
&& controlValue.length > 0 ? "::" : null, controlValue != null && controlValue.length > 0 ? LdifUtils //$NON-NLS-1$
.base64encode( controlValue ) : null, LdifParserConstants.LINE_SEPARATOR );
return controlLine;
}
public static LdifControlLine create( String oid, boolean isCritical, String controlValue )
{
return create( oid, isCritical ? " true" : " false", controlValue ); //$NON-NLS-1$ //$NON-NLS-2$
}
public static LdifControlLine create( String oid, boolean isCritical, byte[] controlValue )
{
return create( oid, isCritical ? " true" : " false", controlValue ); //$NON-NLS-1$ //$NON-NLS-2$
}
}