1 20 21 package org.apache.directory.ldapstudio.browser.core.jobs; 22 23 24 import java.io.BufferedWriter ; 25 import java.io.FileOutputStream ; 26 import java.io.IOException ; 27 import java.io.OutputStreamWriter ; 28 import java.nio.charset.Charset ; 29 import java.util.ArrayList ; 30 import java.util.HashMap ; 31 import java.util.List ; 32 import java.util.Map ; 33 34 import org.apache.commons.codec.digest.DigestUtils; 35 import org.apache.directory.ldapstudio.browser.core.BrowserCoreConstants; 36 import org.apache.directory.ldapstudio.browser.core.BrowserCoreMessages; 37 import org.apache.directory.ldapstudio.browser.core.BrowserCorePlugin; 38 import org.apache.directory.ldapstudio.browser.core.internal.model.AttributeDescription; 39 import org.apache.directory.ldapstudio.browser.core.internal.model.ConnectionException; 40 import org.apache.directory.ldapstudio.browser.core.internal.model.ReferralException; 41 import org.apache.directory.ldapstudio.browser.core.model.IConnection; 42 import org.apache.directory.ldapstudio.browser.core.model.ISearch; 43 import org.apache.directory.ldapstudio.browser.core.model.SearchParameter; 44 import org.apache.directory.ldapstudio.browser.core.model.ldif.LdifEnumeration; 45 import org.apache.directory.ldapstudio.browser.core.model.ldif.container.LdifContainer; 46 import org.apache.directory.ldapstudio.browser.core.model.ldif.container.LdifContentRecord; 47 import org.apache.directory.ldapstudio.browser.core.model.ldif.lines.LdifAttrValLine; 48 import org.apache.directory.ldapstudio.browser.core.utils.LdifUtils; 49 import org.eclipse.core.runtime.Preferences; 50 51 52 public class ExportCsvJob extends AbstractEclipseJob 53 { 54 55 private String exportLdifFilename; 56 57 private IConnection connection; 58 59 private SearchParameter searchParameter; 60 61 private boolean exportDn; 62 63 64 public ExportCsvJob( String exportLdifFilename, IConnection connection, SearchParameter searchParameter, 65 boolean exportDn ) 66 { 67 this.exportLdifFilename = exportLdifFilename; 68 this.connection = connection; 69 this.searchParameter = searchParameter; 70 this.exportDn = exportDn; 71 72 setName( BrowserCoreMessages.jobs__export_csv_name ); 73 } 74 75 76 protected IConnection[] getConnections() 77 { 78 return new IConnection[] 79 { connection }; 80 } 81 82 83 protected Object [] getLockedObjects() 84 { 85 List l = new ArrayList (); 86 l.add( connection.getUrl() + "_" + DigestUtils.shaHex( exportLdifFilename ) ); 87 return l.toArray(); 88 } 89 90 91 protected void executeAsyncJob( ExtendedProgressMonitor monitor ) 92 { 93 94 monitor.beginTask( BrowserCoreMessages.jobs__export_csv_task, 2 ); 95 monitor.reportProgress( " " ); monitor.worked( 1 ); 97 98 Preferences coreStore = BrowserCorePlugin.getDefault().getPluginPreferences(); 99 100 String attributeDelimiter = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_ATTRIBUTEDELIMITER ); 101 String valueDelimiter = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_VALUEDELIMITER ); 102 String quoteCharacter = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_QUOTECHARACTER ); 103 String lineSeparator = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_LINESEPARATOR ); 104 String encoding = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_ENCODING ); 105 int binaryEncoding = coreStore.getInt( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_BINARYENCODING ); 106 String [] exportAttributes = this.searchParameter.getReturningAttributes(); 107 108 try 109 { 110 FileOutputStream fos = new FileOutputStream ( exportLdifFilename ); 112 OutputStreamWriter osw = new OutputStreamWriter ( fos, encoding ); 113 BufferedWriter bufferedWriter = new BufferedWriter ( osw ); 114 115 if ( this.exportDn ) 117 { 118 bufferedWriter.write( "dn" ); if ( exportAttributes == null || exportAttributes.length > 0 ) 120 bufferedWriter.write( attributeDelimiter ); 121 } 122 for ( int i = 0; i < exportAttributes.length; i++ ) 123 { 124 bufferedWriter.write( exportAttributes[i] ); 125 if ( i + 1 < exportAttributes.length ) 126 bufferedWriter.write( attributeDelimiter ); 127 } 128 bufferedWriter.write( BrowserCoreConstants.LINE_SEPARATOR ); 129 130 int count = 0; 132 export( connection, searchParameter, bufferedWriter, count, monitor, exportAttributes, attributeDelimiter, 133 valueDelimiter, quoteCharacter, lineSeparator, encoding, binaryEncoding, exportDn ); 134 135 bufferedWriter.close(); 137 osw.close(); 138 fos.close(); 139 140 } 141 catch ( Exception e ) 142 { 143 monitor.reportError( e ); 144 } 145 } 146 147 148 private static void export( IConnection connection, SearchParameter searchParameter, BufferedWriter bufferedWriter, 149 int count, ExtendedProgressMonitor monitor, String [] attributes, String attributeDelimiter, 150 String valueDelimiter, String quoteCharacter, String lineSeparator, String encoding, int binaryEncoding, boolean exportDn ) 151 throws IOException , ConnectionException 152 { 153 try 154 { 155 156 LdifEnumeration enumeration = connection.exportLdif( searchParameter, monitor ); 157 while ( !monitor.isCanceled() && enumeration.hasNext( monitor ) ) 158 { 159 LdifContainer container = enumeration.next( monitor ); 160 161 if ( container instanceof LdifContentRecord ) 162 { 163 164 LdifContentRecord record = ( LdifContentRecord ) container; 165 bufferedWriter.write( recordToCsv( connection, record, attributes, attributeDelimiter, valueDelimiter, 166 quoteCharacter, lineSeparator, encoding, binaryEncoding, exportDn ) ); 167 168 count++; 169 monitor.reportProgress( BrowserCoreMessages.bind( BrowserCoreMessages.jobs__export_progress, 170 new String [] 171 { Integer.toString( count ) } ) ); 172 } 173 } 174 } 175 catch ( ConnectionException ce ) 176 { 177 178 if ( ce.getLdapStatusCode() == 3 || ce.getLdapStatusCode() == 4 || ce.getLdapStatusCode() == 11 ) 179 { 180 } 182 else if ( ce instanceof ReferralException ) 183 { 184 185 if ( searchParameter.getReferralsHandlingMethod() == IConnection.HANDLE_REFERRALS_FOLLOW ) 186 { 187 188 ReferralException re = ( ReferralException ) ce; 189 ISearch[] referralSearches = re.getReferralSearches(); 190 for ( int i = 0; i < referralSearches.length; i++ ) 191 { 192 ISearch referralSearch = referralSearches[i]; 193 194 if ( !referralSearch.getConnection().isOpened() ) 196 { 197 referralSearch.getConnection().open( monitor ); 198 } 199 200 export( referralSearch.getConnection(), referralSearch.getSearchParameter(), bufferedWriter, 202 count, monitor, attributes, attributeDelimiter, valueDelimiter, quoteCharacter, 203 lineSeparator, encoding, binaryEncoding, exportDn ); 204 } 205 } 206 } 207 else 208 { 209 monitor.reportError( ce ); 210 } 211 } 212 213 } 214 215 216 private static String recordToCsv( IConnection connection, LdifContentRecord record, String [] attributes, String attributeDelimiter, 217 String valueDelimiter, String quoteCharacter, String lineSeparator, String encoding, int binaryEncoding, boolean exportDn ) 218 { 219 220 Map attributeMap = getAttributeMap( connection, record, valueDelimiter, encoding, binaryEncoding ); 222 223 StringBuffer sb = new StringBuffer (); 225 if ( exportDn ) 226 { 227 sb.append( quoteCharacter ); 228 sb.append( record.getDnLine().getValueAsString() ); 229 sb.append( quoteCharacter ); 230 231 if ( attributes == null || attributes.length > 0 ) 232 sb.append( attributeDelimiter ); 233 } 234 for ( int i = 0; i < attributes.length; i++ ) 235 { 236 237 String attributeName = attributes[i]; 238 AttributeDescription ad = new AttributeDescription( attributeName ); 239 String oidString = ad.toOidString( connection.getSchema() ); 240 if ( attributeMap.containsKey( oidString ) ) 241 { 242 String value = ( String ) attributeMap.get( oidString ); 243 244 value = value.replaceAll( quoteCharacter, quoteCharacter + quoteCharacter ); 246 247 sb.append( quoteCharacter ); 249 sb.append( value ); 250 sb.append( quoteCharacter ); 251 } 252 253 if ( i + 1 < attributes.length ) 255 { 256 sb.append( attributeDelimiter ); 257 } 258 259 } 260 sb.append( lineSeparator ); 261 262 return sb.toString(); 263 } 264 265 266 static Map getAttributeMap( IConnection connection, LdifContentRecord record, String valueDelimiter, String encoding, int binaryEncoding ) 267 { 268 Map attributeMap = new HashMap (); 269 LdifAttrValLine[] lines = record.getAttrVals(); 270 for ( int i = 0; i < lines.length; i++ ) 271 { 272 String attributeName = lines[i].getUnfoldedAttributeDescription(); 273 if ( connection != null ) 274 { 275 AttributeDescription ad = new AttributeDescription( attributeName ); 277 attributeName = ad.toOidString( connection.getSchema() ); 278 } 279 String value = lines[i].getValueAsString(); 280 if ( ! Charset.forName( encoding ).newEncoder().canEncode( value ) ) 281 { 282 if ( binaryEncoding == BrowserCoreConstants.BINARYENCODING_BASE64 ) 283 { 284 value = LdifUtils.base64encode( lines[i].getValueAsBinary() ); 285 } 286 else if ( binaryEncoding == BrowserCoreConstants.BINARYENCODING_HEX ) 287 { 288 value = LdifUtils.hexEncode( lines[i].getValueAsBinary() ); 289 } 290 else 291 { 292 value = BrowserCoreConstants.BINARY; 293 } 294 295 if ( attributeMap.containsKey( attributeName ) ) 296 { 297 String oldValue = ( String ) attributeMap.get( attributeName ); 298 attributeMap.put( attributeName, oldValue + valueDelimiter + value ); 299 } 300 else 301 { 302 attributeMap.put( attributeName, value ); 303 } 304 } 305 else 306 { 307 if ( attributeMap.containsKey( attributeName ) ) 308 { 309 String oldValue = ( String ) attributeMap.get( attributeName ); 310 attributeMap.put( attributeName, oldValue + valueDelimiter + value ); 311 } 312 else 313 { 314 attributeMap.put( attributeName, value ); 315 } 316 } 317 } 318 return attributeMap; 319 } 320 321 322 protected String getErrorMessage() 323 { 324 return BrowserCoreMessages.jobs__export_cvs_error; 325 } 326 327 } 328 | Popular Tags |