/*
* 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.openldap.config.editor.wrappers;
import java.util.HashSet;
import java.util.Set;
import org.apache.directory.api.util.Strings;
import org.apache.directory.studio.openldap.common.ui.model.SaslSecPropEnum;
/**
* A wrapper for the olcSaslSecProps parameter. The syntax is the following :
*
* <pre>
* saslSecProp ::= ( 'none' | 'noplain' | 'noactive' | 'nodict' | 'noanonymous' | 'forwardsec' |
* 'passcred' | 'minssf' '=' INT | 'maxssf' '=' INT | 'maxbufsuze' '=' INT )*
* </pre>
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class SaslSecPropsWrapper implements Cloneable
{
/** The flags for properties with no arguments */
private Set<SaslSecPropEnum> flags = new HashSet<SaslSecPropEnum>();
/** The value of the minSSF parameter */
private Integer minSsf;
/** The value of the maxSSF parameter */
private Integer maxSsf;
/** The max buffer size parameter */
private Integer maxBufSize;
/**
* Creates an instance of a SaslSecProps
**/
public SaslSecPropsWrapper()
{
}
/**
* Creates an instance of a SaslSecProps parameter using a String.
*
* @param parameters The list of parameters to parse
*/
public SaslSecPropsWrapper( String parameters )
{
if ( !Strings.isEmpty( Strings.trim( parameters ) ) )
{
// Split the string along the spaces
String[] properties = parameters.split( "," );
for ( String property : properties )
{
if ( Strings.isEmpty( Strings.trim( property ) ) )
{
continue;
}
int pos = property.indexOf( '=' );
if ( pos == -1 )
{
// No value
SaslSecPropEnum flag = SaslSecPropEnum.getSaslSecProp( Strings.trim( property ) );
switch ( flag )
{
case FORWARD_SEC :
case NO_ACTIVE :
case NO_ANONYMOUS :
case NO_DICT :
case NO_PLAIN :
case PASS_CRED :
case NONE :
flags.add( flag );
break;
case MAX_BUF_SIZE :
case MAX_SSF :
case MIN_SSF :
case UNKNOWN :
// Nothing to do...
}
}
else
{
// Fetch the name
String name = property.substring( 0, pos );
SaslSecPropEnum flag = SaslSecPropEnum.getSaslSecProp( Strings.trim( name ) );
try
{
int value = Integer.valueOf( Strings.trim( property.substring( pos + 1 ) ) );
if ( value >= 0 )
{
switch ( flag )
{
case MAX_BUF_SIZE :
maxBufSize = Integer.valueOf( value );
break;
case MAX_SSF :
maxSsf = Integer.valueOf( value );
break;
case MIN_SSF :
minSsf = Integer.valueOf( value );
break;
case FORWARD_SEC :
case NO_ACTIVE :
case NO_ANONYMOUS :
case NO_DICT :
case NO_PLAIN :
case PASS_CRED :
case NONE :
case UNKNOWN :
// Nothing to do... This is an error
}
}
}
catch ( NumberFormatException nfe )
{
// Nothing to do
}
}
}
}
}
/**
* Check if a given String is a valid SaslSecProp parameter
*
* @param str The string to check
* @return true if the string is a valid SaslSecProp parameter
*/
public static boolean isValid( String str )
{
if ( !Strings.isEmpty( Strings.trim( str ) ) )
{
// Split the string along the spaces
String[] properties = str.split( "," );
if ( ( properties == null ) || ( properties.length == 0 ) )
{
return true;
}
for ( String property : properties )
{
if ( Strings.isEmpty( Strings.trim( property ) ) )
{
continue;
}
int pos = property.indexOf( '=' );
if ( pos == -1 )
{
// No value
SaslSecPropEnum flag = SaslSecPropEnum.getSaslSecProp( Strings.trim( property ) );
switch ( flag )
{
case FORWARD_SEC :
case NO_ACTIVE :
case NO_ANONYMOUS :
case NO_DICT :
case NO_PLAIN :
case PASS_CRED :
case NONE :
break;
default :
return false;
}
}
else
{
// Fetch the name
String name = property.substring( 0, pos );
SaslSecPropEnum flag = SaslSecPropEnum.getSaslSecProp( Strings.trim( name ) );
try
{
int value = Integer.valueOf( Strings.trim( property.substring( pos + 1 ) ) );
if ( value < 0 )
{
return false;
}
switch ( flag )
{
case MAX_BUF_SIZE :
case MAX_SSF :
case MIN_SSF :
break;
default :
return false;
}
}
catch ( NumberFormatException nfe )
{
// wrong
return false;
}
}
}
return true;
}
else
{
return true;
}
}
/**
* @return the flag
*/
public Set<SaslSecPropEnum> getFlags()
{
return flags;
}
/**
* @param flag the flag to set
*/
public void addFlag( SaslSecPropEnum flag )
{
this.flags.add( flag );
}
/**
* @param flag the flag to remove
*/
public void removeFlag( SaslSecPropEnum flag )
{
this.flags.remove( flag );
}
/**
* Clear the flag's set
*/
public void clearFlags()
{
this.flags.clear();
}
/**
* @return the minSsf
*/
public Integer getMinSsf()
{
return minSsf;
}
/**
* @param minSsf the minSsf to set
*/
public void setMinSsf( Integer minSsf )
{
this.minSsf = minSsf;
}
/**
* @return the maxSsf
*/
public Integer getMaxSsf()
{
return maxSsf;
}
/**
* @param maxSsf the maxSsf to set
*/
public void setMaxSsf( Integer maxSsf )
{
this.maxSsf = maxSsf;
}
/**
* @return the maxBufSize
*/
public Integer getMaxBufSize()
{
return maxBufSize;
}
/**
* @param maxBufSize the maxBufSize to set
*/
public void setMaxBufSize( Integer maxBufSize )
{
this.maxBufSize = maxBufSize;
}
/**
* Compare two Integer instance and return true if they are equal
*/
private boolean equals( Integer int1, Integer int2 )
{
if ( int1 == null )
{
return int2 == null;
}
return int1.equals( int2 );
}
/**
* @see Object#equals(Object)
*/
public boolean equals( Object that )
{
if ( this == that )
{
return true;
}
if ( !( that instanceof SaslSecPropsWrapper ) )
{
return false;
}
SaslSecPropsWrapper thatInstance = (SaslSecPropsWrapper)that;
return ( ( flags.size() == thatInstance.flags.size() ) &&
( thatInstance.flags.containsAll( flags ) ) &&
( equals( minSsf, thatInstance.minSsf ) ) &&
( equals( maxSsf, thatInstance.maxSsf ) ) &&
( equals( maxBufSize, thatInstance.maxBufSize ) ) );
}
/**
* @see Object#hashCode()
*/
public int hashCode()
{
int h = 37;
if ( minSsf != null )
{
h += h*17 + minSsf.intValue();
}
if ( maxSsf != null )
{
h += h*17 + maxSsf.intValue();
}
if ( maxBufSize != null )
{
h += h*17 + maxBufSize.intValue();
}
for ( SaslSecPropEnum saslSecProp : flags )
{
h += h*17 + saslSecProp.hashCode();
}
return h;
}
/**
* Clone the current object
*/
public SaslSecPropsWrapper clone()
{
try
{
return (SaslSecPropsWrapper)super.clone();
}
catch ( CloneNotSupportedException e )
{
return null;
}
}
/**
* @see Object#toString()
*/
public String toString()
{
StringBuilder sb = new StringBuilder();
boolean isFirst = true;
for ( SaslSecPropEnum saslSecProp : flags )
{
if ( isFirst )
{
isFirst = false;
}
else
{
sb.append( ',' );
}
sb.append( saslSecProp.getName() );
}
// The minSSF properties
if ( minSsf != null )
{
if ( sb.length() > 0 )
{
sb.append( ',' );
}
sb.append( SaslSecPropEnum.MIN_SSF.getName() ).append( '=' ).append( minSsf.intValue() );
}
// The maxSSF properties
if ( maxSsf != null )
{
if ( sb.length() > 0 )
{
sb.append( ',' );
}
sb.append( SaslSecPropEnum.MAX_SSF.getName() ).append( '=' ).append( maxSsf.intValue() );
}
// The maxbufsize properties
if ( maxBufSize != null )
{
if ( sb.length() > 0 )
{
sb.append( ',' );
}
sb.append( SaslSecPropEnum.MAX_BUF_SIZE.getName() ).append( '=' ).append( maxBufSize.intValue() );
}
return sb.toString();
}
}