/*
* 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.ldapbrowser.core.model.impl;
import java.util.Iterator;
import org.apache.directory.api.ldap.model.name.Ava;
import org.apache.directory.studio.connection.core.Connection;
import org.apache.directory.studio.ldapbrowser.core.internal.search.LdapSearchPageScoreComputer;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
import org.apache.directory.studio.ldapbrowser.core.model.IValue;
import org.apache.directory.studio.ldapbrowser.core.utils.Utils;
import org.apache.directory.studio.ldifparser.LdifUtils;
import org.eclipse.search.ui.ISearchPageScoreComputer;
/**
* Default implementation of IValue.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class Value implements IValue
{
/** The serialVersionUID. */
private static final long serialVersionUID = -9039209604742682740L;
/** The attribute this value belongs to */
private IAttribute attribute;
/** The raw value, either a String or a byte[] */
private Object rawValue;
/**
* Creates a new instance of Value.
*
* @param attribute the attribute this value belongs to
* @param rawValue the raw value, either a String or a byte[]
*/
public Value( IAttribute attribute, Object rawValue )
{
this.init( attribute, rawValue );
assert rawValue != null;
}
/**
* Creates a new instance of Value with an empty value.
*
* @param attribute the attribute this value belongs to
*/
public Value( IAttribute attribute )
{
this.init( attribute, null );
}
/**
* Initializes this Value.
*
* @param attribute the attribute this value belongs to
* @param rawValue the raw value, either a String or a byte[] or null
*/
private void init( IAttribute attribute, Object rawValue )
{
assert attribute != null;
this.attribute = attribute;
if ( rawValue == null )
{
if ( attribute.isString() )
{
this.rawValue = IValue.EMPTY_STRING_VALUE;
}
else
{
this.rawValue = IValue.EMPTY_BINARY_VALUE;
}
}
else
{
this.rawValue = rawValue;
}
}
/**
* {@inheritDoc}
*/
public IAttribute getAttribute()
{
return attribute;
}
/**
* {@inheritDoc}
*/
public Object getRawValue()
{
return rawValue;
}
/**
* {@inheritDoc}
*/
public String getStringValue()
{
if ( rawValue == EMPTY_STRING_VALUE )
{
return EMPTY_STRING_VALUE.getStringValue();
}
else if ( rawValue == EMPTY_BINARY_VALUE )
{
return EMPTY_BINARY_VALUE.getStringValue();
}
else if ( rawValue instanceof String )
{
return ( String ) rawValue;
}
else if ( rawValue instanceof byte[] )
{
return LdifUtils.utf8decode( ( byte[] ) rawValue );
}
else
{
return Messages.Value_Unknown;
}
}
/**
* {@inheritDoc}
*/
public byte[] getBinaryValue()
{
if ( rawValue == EMPTY_STRING_VALUE )
{
return EMPTY_STRING_VALUE.getBinaryValue();
}
else if ( rawValue == EMPTY_BINARY_VALUE )
{
return EMPTY_BINARY_VALUE.getBinaryValue();
}
else if ( rawValue instanceof byte[] )
{
return ( byte[] ) rawValue;
}
else if ( rawValue instanceof String )
{
return LdifUtils.utf8encode( ( String ) rawValue );
}
else
{
return LdifUtils.utf8encode( Messages.Value_Unknown );
}
}
/**
* {@inheritDoc}
*/
public boolean isString()
{
return rawValue == EMPTY_STRING_VALUE || attribute.isString();
}
/**
* {@inheritDoc}
*/
public boolean isBinary()
{
return rawValue == EMPTY_BINARY_VALUE || attribute.isBinary();
}
/**
* {@inheritDoc}
*/
public boolean isEmpty()
{
return rawValue == EMPTY_STRING_VALUE || rawValue == EMPTY_BINARY_VALUE;
}
/**
* {@inheritDoc}
*/
public boolean equals( Object o )
{
// check argument
if ( !( o instanceof IValue ) )
{
return false;
}
IValue vc = ( IValue ) o;
// compare attributes
if ( !vc.getAttribute().equals( this.getAttribute() ) )
{
return false;
}
// compare values
if ( this.isEmpty() && vc.isEmpty() )
{
return true;
}
else if ( this.isBinary() && vc.isBinary() )
{
return Utils.equals( this.getBinaryValue(), vc.getBinaryValue() );
}
else if ( this.isString() && vc.isString() )
{
return ( this.getStringValue().equals( vc.getStringValue() ) );
}
else
{
return false;
}
}
/**
* {@inheritDoc}
*/
public int hashCode()
{
return rawValue.hashCode();
}
/**
* {@inheritDoc}
*/
public String toString()
{
return attribute + ":" + ( isString() ? getStringValue() : "BINARY" ); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
public Object getAdapter( Class adapter )
{
Class<?> clazz = ( Class<?> ) adapter;
if ( clazz.isAssignableFrom( ISearchPageScoreComputer.class ) )
{
return new LdapSearchPageScoreComputer();
}
if ( clazz.isAssignableFrom( Connection.class ) )
{
return getAttribute().getEntry().getBrowserConnection().getConnection();
}
if ( clazz.isAssignableFrom( IBrowserConnection.class ) )
{
return getAttribute().getEntry().getBrowserConnection();
}
if ( clazz.isAssignableFrom( IEntry.class ) )
{
return getAttribute().getEntry();
}
if ( clazz.isAssignableFrom( IAttribute.class ) )
{
return getAttribute();
}
if ( clazz.isAssignableFrom( IValue.class ) )
{
return this;
}
return null;
}
/**
* {@inheritDoc}
*/
public boolean isRdnPart()
{
Iterator<Ava> atavIterator = getAttribute().getEntry().getRdn().iterator();
while ( atavIterator.hasNext() )
{
Ava ava = atavIterator.next();
if ( getAttribute().getDescription().equals( ava.getNormType() )
&& getStringValue().equals( ava.getValue().getNormValue() ) )
{
return true;
}
}
return false;
}
}