/*
* 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.ui.actions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator;
import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants;
import org.apache.directory.studio.ldapbrowser.core.model.AttributeHierarchy;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
import org.apache.directory.studio.ldapbrowser.core.model.IValue;
import org.apache.directory.studio.ldapbrowser.core.utils.AttributeComparator;
import org.apache.directory.studio.ldapbrowser.core.utils.ModelConverter;
import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
import org.apache.directory.studio.ldapbrowser.ui.BrowserUIPlugin;
import org.eclipse.jface.resource.ImageDescriptor;
/**
* This Action copies entry(ies) as CSV.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class CopyEntryAsCsvAction extends CopyEntryAsAction
{
/**
* Table Mode.
*/
public static final int MODE_TABLE = 5;
/**
* Creates a new instance of CopyEntryAsCsvAction.
*
* @param mode
* the copy Mode
*/
public CopyEntryAsCsvAction( int mode )
{
super( Messages.getString( "CopyEntryAsCsvAction.CSV" ), mode ); //$NON-NLS-1$
}
/**
* {@inheritDoc}
*/
public ImageDescriptor getImageDescriptor()
{
if ( this.mode == MODE_DN_ONLY )
{
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_CSV );
}
else if ( this.mode == MODE_RETURNING_ATTRIBUTES_ONLY )
{
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_CSV_SEARCHRESULT );
}
else if ( this.mode == MODE_INCLUDE_OPERATIONAL_ATTRIBUTES )
{
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_CSV_OPERATIONAL );
}
else if ( this.mode == MODE_NORMAL )
{
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_CSV_USER );
}
else if ( this.mode == MODE_TABLE )
{
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_TABLE );
}
else
{
return BrowserUIPlugin.getDefault().getImageDescriptor( BrowserUIConstants.IMG_COPY_CSV );
}
}
/**
* {@inheritDoc}
*/
public String getText()
{
if ( this.mode == MODE_TABLE )
{
return Messages.getString( "CopyEntryAsCsvAction.CopyTable" ); //$NON-NLS-1$
}
return super.getText();
}
/**
* {@inheritDoc}
*/
public boolean isEnabled()
{
if ( this.mode == MODE_TABLE )
{
return getInput() instanceof ISearch
&& ( ( ISearch ) getInput() ).getSearchResults() != null
&& ( ( ISearch ) getInput() ).getSearchResults().length > 0;
}
return super.isEnabled();
}
/**
* {@inheritDoc}
*/
public void run()
{
if ( this.mode == MODE_TABLE )
{
if ( getInput() instanceof ISearch
&& ( ( ISearch ) getInput() ).getSearchResults() != null
&& ( ( ISearch ) getInput() ).getSearchResults().length > 0 )
{
List<IEntry> entryList = new ArrayList<IEntry>();
ISearchResult[] results = ( ( ISearch ) getInput() ).getSearchResults();
for ( int k = 0; k < results.length; k++ )
{
entryList.add( results[k].getEntry() );
}
IEntry[] entries = ( IEntry[] ) entryList.toArray( new IEntry[entryList.size()] );
StringBuffer text = new StringBuffer();
serialializeEntries( entries, text );
copyToClipboard( text.toString() );
}
}
else
{
super.run();
}
}
/**
* {@inheritDoc}
*/
public void serialializeEntries( IEntry[] entries, StringBuffer text )
{
String attributeDelimiter = BrowserCommonActivator.getDefault().getPreferenceStore().getString(
BrowserCommonConstants.PREFERENCE_FORMAT_TABLE_ATTRIBUTEDELIMITER );
String valueDelimiter = BrowserCommonActivator.getDefault().getPreferenceStore().getString(
BrowserCommonConstants.PREFERENCE_FORMAT_TABLE_VALUEDELIMITER );
String quoteCharacter = BrowserCommonActivator.getDefault().getPreferenceStore().getString(
BrowserCommonConstants.PREFERENCE_FORMAT_TABLE_QUOTECHARACTER );
String lineSeparator = BrowserCommonActivator.getDefault().getPreferenceStore().getString(
BrowserCommonConstants.PREFERENCE_FORMAT_TABLE_LINESEPARATOR );
int binaryEncoding = BrowserCommonActivator.getDefault().getPreferenceStore().getInt(
BrowserCommonConstants.PREFERENCE_FORMAT_TABLE_BINARYENCODING );
String[] returningAttributes = null;
if ( this.mode == MODE_DN_ONLY )
{
returningAttributes = new String[0];
}
else if ( this.mode == MODE_RETURNING_ATTRIBUTES_ONLY && getSelectedSearchResults().length > 0
&& getSelectedEntries().length + getSelectedBookmarks().length + getSelectedSearches().length == 0 )
{
returningAttributes = getSelectedSearchResults()[0].getSearch().getReturningAttributes();
}
else if ( ( this.mode == MODE_RETURNING_ATTRIBUTES_ONLY || this.mode == MODE_TABLE )
&& getSelectedSearches().length == 1 )
{
returningAttributes = getSelectedSearches()[0].getReturningAttributes();
}
else if ( ( this.mode == MODE_RETURNING_ATTRIBUTES_ONLY || this.mode == MODE_TABLE )
&& ( getInput() instanceof ISearch ) )
{
returningAttributes = ( ( ISearch ) ( getInput() ) ).getReturningAttributes();
}
else
{
Map<String, IAttribute> attributeMap = new HashMap<String, IAttribute>();
for ( int e = 0; entries != null && e < entries.length; e++ )
{
IAttribute[] attributes = entries[e].getAttributes();
for ( int a = 0; attributes != null && a < attributes.length; a++ )
{
if ( attributes[a].isOperationalAttribute() && this.mode != MODE_INCLUDE_OPERATIONAL_ATTRIBUTES )
continue;
if ( !attributeMap.containsKey( attributes[a].getDescription() ) )
{
attributeMap.put( attributes[a].getDescription(), attributes[a] );
}
}
}
IAttribute[] attributes = ( IAttribute[] ) attributeMap.values().toArray(
new IAttribute[attributeMap.size()] );
if ( attributes.length > 0 )
{
AttributeComparator comparator = new AttributeComparator( entries[0] );
Arrays.sort( attributes, comparator );
}
returningAttributes = new String[attributes.length];
for ( int i = 0; i < attributes.length; i++ )
{
returningAttributes[i] = attributes[i].getDescription();
}
}
// header
if ( this.mode != MODE_TABLE
|| BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
BrowserUIConstants.PREFERENCE_SEARCHRESULTEDITOR_SHOW_DN ) )
{
text.append( quoteCharacter );
text.append( "Dn" ); //$NON-NLS-1$
text.append( quoteCharacter );
text.append( attributeDelimiter );
}
for ( int a = 0; returningAttributes != null && a < returningAttributes.length; a++ )
{
text.append( quoteCharacter );
text.append( returningAttributes[a] );
text.append( quoteCharacter );
if ( a + 1 < returningAttributes.length )
{
text.append( attributeDelimiter );
}
}
text.append( lineSeparator );
for ( int e = 0; entries != null && e < entries.length; e++ )
{
if ( this.mode != MODE_TABLE
|| BrowserUIPlugin.getDefault().getPreferenceStore().getBoolean(
BrowserUIConstants.PREFERENCE_SEARCHRESULTEDITOR_SHOW_DN ) )
{
text.append( quoteCharacter );
text.append( entries[e].getDn().getName() );
text.append( quoteCharacter );
text.append( attributeDelimiter );
}
for ( int a = 0; returningAttributes != null && a < returningAttributes.length; a++ )
{
AttributeComparator comparator = new AttributeComparator( entries[e] );
AttributeHierarchy ah = entries[e].getAttributeWithSubtypes( returningAttributes[a] );
if ( ah != null )
{
StringBuffer valueSB = new StringBuffer();
for ( Iterator it = ah.iterator(); it.hasNext(); )
{
IAttribute attribute = ( IAttribute ) it.next();
if ( attribute != null )
{
IValue[] values = attribute.getValues();
Arrays.sort( values, comparator );
for ( int v = 0; v < values.length; v++ )
{
String val = ModelConverter.getStringValue( values[v], binaryEncoding );
valueSB.append( val );
if ( v + 1 < values.length )
{
valueSB.append( valueDelimiter );
}
}
}
if ( it.hasNext() )
{
valueSB.append( valueDelimiter );
}
}
String value = valueSB.toString().replaceAll( quoteCharacter, quoteCharacter + quoteCharacter );
text.append( quoteCharacter );
text.append( value );
text.append( quoteCharacter );
}
// IAttribute attribute =
// entries[e].getAttribute(returningAttributes[a]);
// if (attribute != null) {
//
// IValue[] values = attribute.getValues();
// Arrays.sort(values, comparator);
//
// StringBuffer valueSB = new StringBuffer();
// for (int v = 0; v < values.length; v++) {
// String val = LdifUtils.getStringValue(values[v],
// binaryEncoding);
// valueSB.append(val);
// if (v + 1 < values.length) {
// valueSB.append(valueDelimiter);
// ;
// }
// }
//
// String value = valueSB.toString().replaceAll(quoteCharacter,
// quoteCharacter + quoteCharacter);
// text.append(quoteCharacter);
// text.append(value);
// text.append(quoteCharacter);
//
// }
if ( a + 1 < returningAttributes.length )
{
text.append( attributeDelimiter );
}
}
if ( e < entries.length )
{
text.append( lineSeparator );
}
}
}
}