blob: 1ee7a314b5a56afa7f94980ca26a6bbf688be2df [file] [log] [blame]
/*
* 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.utils;
import java.util.Collection;
import java.util.stream.Collectors;
import org.apache.directory.api.ldap.model.entry.DefaultEntry;
import org.apache.directory.api.ldap.model.entry.DefaultModification;
import org.apache.directory.api.ldap.model.entry.Entry;
import org.apache.directory.api.ldap.model.entry.Modification;
import org.apache.directory.api.ldap.model.entry.ModificationOperation;
import org.apache.directory.api.ldap.model.exception.LdapException;
import org.apache.directory.api.ldap.model.exception.LdapInvalidDnException;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.studio.connection.core.StudioControl;
import org.apache.directory.studio.ldapbrowser.core.BrowserCoreConstants;
import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry;
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.model.impl.Attribute;
import org.apache.directory.studio.ldapbrowser.core.model.impl.DummyEntry;
import org.apache.directory.studio.ldapbrowser.core.model.impl.Value;
import org.apache.directory.studio.ldifparser.LdifUtils;
import org.apache.directory.studio.ldifparser.model.LdifEOFPart;
import org.apache.directory.studio.ldifparser.model.LdifPart;
import org.apache.directory.studio.ldifparser.model.container.LdifChangeAddRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifChangeRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifContentRecord;
import org.apache.directory.studio.ldifparser.model.container.LdifRecord;
import org.apache.directory.studio.ldifparser.model.lines.LdifAttrValLine;
import org.apache.directory.studio.ldifparser.model.lines.LdifChangeTypeLine;
import org.apache.directory.studio.ldifparser.model.lines.LdifCommentLine;
import org.apache.directory.studio.ldifparser.model.lines.LdifControlLine;
import org.apache.directory.studio.ldifparser.model.lines.LdifDnLine;
import org.apache.directory.studio.ldifparser.model.lines.LdifSepLine;
public class ModelConverter
{
/**
* Converts the given {@link LdifContentRecord} to an {@link DummyEntry}.
*
* @param ldifContentRecord the ldif content record to convert
* @param connection the connection
*
* @return the resulting dummy entry
*
* @throws org.apache.directory.api.ldap.model.exception.LdapInvalidDnException
*/
public static DummyEntry ldifContentRecordToEntry( LdifContentRecord ldifContentRecord,
IBrowserConnection connection ) throws LdapInvalidDnException
{
return createIntern( ldifContentRecord, connection );
}
/**
* Converts the given {@link LdifChangeAddRecord} to an {@link DummyEntry}.
*
* @param ldifChangeAddRecord the ldif change add record to convert
* @param connection the connection
*
* @return the resulting dummy entry
*
* @throws org.apache.directory.api.ldap.model.exception.LdapInvalidDnException
*/
public static DummyEntry ldifChangeAddRecordToEntry( LdifChangeAddRecord ldifChangeAddRecord,
IBrowserConnection connection ) throws LdapInvalidDnException
{
return createIntern( ldifChangeAddRecord, connection );
}
/**
* Creates an {@link DummyEntry} from the given {@link LdifRecord}.
*
* @param connection the connection
* @param ldifRecord the ldif record
*
* @return the dummy entry
*
* @throws LdapInvalidDnException
*/
private static DummyEntry createIntern( LdifRecord ldifRecord, IBrowserConnection connection )
throws LdapInvalidDnException
{
LdifPart[] parts = ldifRecord.getParts();
EventRegistry.suspendEventFiringInCurrentThread();
DummyEntry entry = new DummyEntry( new Dn( ldifRecord.getDnLine().getValueAsString() ), connection );
for ( int i = 0; i < parts.length; i++ )
{
if ( parts[i] instanceof LdifAttrValLine )
{
LdifAttrValLine line = ( LdifAttrValLine ) parts[i];
String attributeName = line.getUnfoldedAttributeDescription();
Object value = line.getValueAsObject();
IAttribute attribute = entry.getAttribute( attributeName );
if ( attribute == null )
{
attribute = new Attribute( entry, attributeName );
entry.addAttribute( attribute );
}
attribute.addValue( new Value( attribute, value ) );
}
else if ( !( parts[i] instanceof LdifDnLine ) && !( parts[i] instanceof LdifSepLine )
&& !( parts[i] instanceof LdifEOFPart ) && !( parts[i] instanceof LdifChangeTypeLine ) )
{
String name = parts[i].toRawString();
name = name.replaceAll( "\n", "" ); //$NON-NLS-1$ //$NON-NLS-2$
name = name.replaceAll( "\r", "" ); //$NON-NLS-1$ //$NON-NLS-2$
IAttribute attribute = new Attribute( entry, name );
attribute.addValue( new Value( attribute, parts[i] ) );
entry.addAttribute( attribute );
}
}
EventRegistry.resumeEventFiringInCurrentThread();
return entry;
}
public static LdifChangeAddRecord entryToLdifChangeAddRecord( IEntry entry )
{
boolean mustCreateChangeTypeLine = true;
for ( IAttribute attribute : entry.getAttributes() )
{
for ( IValue value : attribute.getValues() )
{
if ( value.getRawValue() instanceof LdifPart )
{
mustCreateChangeTypeLine = false;
}
}
}
LdifChangeAddRecord record = new LdifChangeAddRecord( LdifDnLine.create( entry.getDn().getName() ) );
if ( mustCreateChangeTypeLine )
{
addControls( record, entry );
record.setChangeType( LdifChangeTypeLine.createAdd() );
}
for ( IAttribute attribute : entry.getAttributes() )
{
String name = attribute.getDescription();
for ( IValue value : attribute.getValues() )
{
if ( !value.isEmpty() )
{
if ( value.getRawValue() instanceof LdifPart )
{
LdifPart part = ( LdifPart ) value.getRawValue();
if ( part instanceof LdifChangeTypeLine )
{
record.setChangeType( ( LdifChangeTypeLine ) part );
}
else if ( part instanceof LdifCommentLine )
{
record.addComment( ( LdifCommentLine ) part );
}
else if ( part instanceof LdifControlLine )
{
record.addControl( ( LdifControlLine ) part );
}
}
else if ( value.isString() )
{
record.addAttrVal( LdifAttrValLine.create( name, value.getStringValue() ) );
}
else
{
record.addAttrVal( LdifAttrValLine.create( name, value.getBinaryValue() ) );
}
}
}
}
record.finish( LdifSepLine.create() );
return record;
}
public static LdifContentRecord entryToLdifContentRecord( IEntry entry )
{
LdifContentRecord record = LdifContentRecord.create( entry.getDn().getName() );
if ( entry.getAttributes() != null )
{
for ( IAttribute attribute : entry.getAttributes() )
{
String name = attribute.getDescription();
for ( IValue value : attribute.getValues() )
{
if ( !value.isEmpty() )
{
if ( value.getRawValue() instanceof LdifPart )
{
LdifPart part = ( LdifPart ) value.getRawValue();
if ( part instanceof LdifCommentLine )
{
record.addComment( ( LdifCommentLine ) part );
}
}
else if ( value.isString() )
{
record.addAttrVal( LdifAttrValLine.create( name, value.getStringValue() ) );
}
else
{
record.addAttrVal( LdifAttrValLine.create( name, value.getBinaryValue() ) );
}
}
}
}
}
record.finish( LdifSepLine.create() );
return record;
}
public static LdifAttrValLine valueToLdifAttrValLine( IValue value )
{
LdifAttrValLine line;
if ( value.isString() )
{
line = LdifAttrValLine.create( value.getAttribute().getDescription(), value.getStringValue() );
}
else
{
line = LdifAttrValLine.create( value.getAttribute().getDescription(), value.getBinaryValue() );
}
return line;
}
public static IValue ldifAttrValLineToValue( LdifAttrValLine line, IEntry entry )
{
try
{
IAttribute attribute = new Attribute( entry, line.getUnfoldedAttributeDescription() );
IValue value = new Value( attribute, line.getValueAsObject() );
return value;
}
catch ( Exception e )
{
return null;
}
}
public static LdifDnLine dnToLdifDnLine( Dn dn )
{
LdifDnLine line = LdifDnLine.create( dn.getName() );
return line;
}
public static void addControls( LdifChangeRecord cr, IEntry entry )
{
if ( entry.isReferral() )
{
cr.addControl( LdifControlLine.create( StudioControl.MANAGEDSAIT_CONTROL.getOid(),
StudioControl.MANAGEDSAIT_CONTROL.isCritical(), StudioControl.MANAGEDSAIT_CONTROL.getControlValue() ) );
}
}
/**
* Gets the string value from the given {@link IValue}. If the given
* {@link IValue} is binary is is encoded according to the regquested
* encoding type.
*
* @param value the value
* @param binaryEncoding the binary encoding type
*
* @return the string value
*/
public static String getStringValue( IValue value, int binaryEncoding )
{
String s = value.getStringValue();
if ( value.isBinary() && LdifUtils.mustEncode( s ) )
{
byte[] binary = value.getBinaryValue();
if ( binaryEncoding == BrowserCoreConstants.BINARYENCODING_BASE64 )
{
s = LdifUtils.base64encode( binary );
}
else if ( binaryEncoding == BrowserCoreConstants.BINARYENCODING_HEX )
{
s = LdifUtils.hexEncode( binary );
}
else
{
s = BrowserCoreConstants.BINARY;
}
}
return s;
}
public static Entry toLdapApiEntry( IEntry entry ) throws LdapException
{
Entry ldapApiEntry = new DefaultEntry( entry.getDn() );
for ( IAttribute iAttribute : entry.getAttributes() )
{
for ( IValue value : iAttribute.getValues() )
{
String attributeDescription = value.getAttribute().getDescription();
if ( value.isString() )
{
ldapApiEntry.add( attributeDescription, value.getStringValue() );
}
else
{
ldapApiEntry.add( attributeDescription, value.getBinaryValue() );
}
}
}
return ldapApiEntry;
}
public static Collection<Modification> toReplaceModifications( Entry entry )
{
Collection<Modification> modifications = entry.getAttributes()
.stream()
.map( attribute -> new DefaultModification(
ModificationOperation.REPLACE_ATTRIBUTE, attribute ) )
.collect( Collectors.toList() );
return modifications;
}
}