KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > directory > ldapstudio > browser > core > jobs > ExportCsvJob


1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  *
19  */

20
21 package org.apache.directory.ldapstudio.browser.core.jobs;
22
23
24 import java.io.BufferedWriter JavaDoc;
25 import java.io.FileOutputStream JavaDoc;
26 import java.io.IOException JavaDoc;
27 import java.io.OutputStreamWriter JavaDoc;
28 import java.nio.charset.Charset JavaDoc;
29 import java.util.ArrayList JavaDoc;
30 import java.util.HashMap JavaDoc;
31 import java.util.List JavaDoc;
32 import java.util.Map JavaDoc;
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 JavaDoc exportLdifFilename;
56
57     private IConnection connection;
58
59     private SearchParameter searchParameter;
60
61     private boolean exportDn;
62
63
64     public ExportCsvJob( String JavaDoc 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 JavaDoc[] getLockedObjects()
84     {
85         List JavaDoc l = new ArrayList JavaDoc();
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( " " ); //$NON-NLS-1$
96
monitor.worked( 1 );
97
98         Preferences coreStore = BrowserCorePlugin.getDefault().getPluginPreferences();
99
100         String JavaDoc attributeDelimiter = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_ATTRIBUTEDELIMITER );
101         String JavaDoc valueDelimiter = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_VALUEDELIMITER );
102         String JavaDoc quoteCharacter = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_QUOTECHARACTER );
103         String JavaDoc lineSeparator = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_LINESEPARATOR );
104         String JavaDoc encoding = coreStore.getString( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_ENCODING );
105         int binaryEncoding = coreStore.getInt( BrowserCoreConstants.PREFERENCE_FORMAT_CSV_BINARYENCODING );
106         String JavaDoc[] exportAttributes = this.searchParameter.getReturningAttributes();
107
108         try
109         {
110             // open file
111
FileOutputStream JavaDoc fos = new FileOutputStream JavaDoc( exportLdifFilename );
112             OutputStreamWriter JavaDoc osw = new OutputStreamWriter JavaDoc( fos, encoding );
113             BufferedWriter JavaDoc bufferedWriter = new BufferedWriter JavaDoc( osw );
114
115             // header
116
if ( this.exportDn )
117             {
118                 bufferedWriter.write( "dn" ); //$NON-NLS-1$
119
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             // export
131
int count = 0;
132             export( connection, searchParameter, bufferedWriter, count, monitor, exportAttributes, attributeDelimiter,
133                 valueDelimiter, quoteCharacter, lineSeparator, encoding, binaryEncoding, exportDn );
134
135             // close file
136
bufferedWriter.close();
137             osw.close();
138             fos.close();
139
140         }
141         catch ( Exception JavaDoc e )
142         {
143             monitor.reportError( e );
144         }
145     }
146
147
148     private static void export( IConnection connection, SearchParameter searchParameter, BufferedWriter JavaDoc bufferedWriter,
149         int count, ExtendedProgressMonitor monitor, String JavaDoc[] attributes, String JavaDoc attributeDelimiter,
150         String JavaDoc valueDelimiter, String JavaDoc quoteCharacter, String JavaDoc lineSeparator, String JavaDoc encoding, int binaryEncoding, boolean exportDn )
151         throws IOException JavaDoc, 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 JavaDoc[]
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                 // nothing
181
}
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                         // open connection
195
if ( !referralSearch.getConnection().isOpened() )
196                         {
197                             referralSearch.getConnection().open( monitor );
198                         }
199
200                         // export recursive
201
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 JavaDoc recordToCsv( IConnection connection, LdifContentRecord record, String JavaDoc[] attributes, String JavaDoc attributeDelimiter,
217         String JavaDoc valueDelimiter, String JavaDoc quoteCharacter, String JavaDoc lineSeparator, String JavaDoc encoding, int binaryEncoding, boolean exportDn )
218     {
219
220         // group multi-valued attributes
221
Map JavaDoc attributeMap = getAttributeMap( connection, record, valueDelimiter, encoding, binaryEncoding );
222
223         // print attributes
224
StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
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 JavaDoc attributeName = attributes[i];
238             AttributeDescription ad = new AttributeDescription( attributeName );
239             String JavaDoc oidString = ad.toOidString( connection.getSchema() );
240             if ( attributeMap.containsKey( oidString ) )
241             {
242                 String JavaDoc value = ( String JavaDoc ) attributeMap.get( oidString );
243
244                 // escape
245
value = value.replaceAll( quoteCharacter, quoteCharacter + quoteCharacter );
246
247                 // always quote
248
sb.append( quoteCharacter );
249                 sb.append( value );
250                 sb.append( quoteCharacter );
251             }
252
253             // delimiter
254
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 JavaDoc getAttributeMap( IConnection connection, LdifContentRecord record, String JavaDoc valueDelimiter, String JavaDoc encoding, int binaryEncoding )
267     {
268         Map JavaDoc attributeMap = new HashMap JavaDoc();
269         LdifAttrValLine[] lines = record.getAttrVals();
270         for ( int i = 0; i < lines.length; i++ )
271         {
272             String JavaDoc attributeName = lines[i].getUnfoldedAttributeDescription();
273             if ( connection != null )
274             {
275                 // convert attributeName to oid
276
AttributeDescription ad = new AttributeDescription( attributeName );
277                 attributeName = ad.toOidString( connection.getSchema() );
278             }
279             String JavaDoc 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 JavaDoc oldValue = ( String JavaDoc ) 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 JavaDoc oldValue = ( String JavaDoc ) 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 JavaDoc getErrorMessage()
323     {
324         return BrowserCoreMessages.jobs__export_cvs_error;
325     }
326
327 }
328
Popular Tags