1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski import com.sun.star.ucb.OpenCommandArgument2;
25*b1cdbd2cSJim Jagielski import com.sun.star.ucb.OpenMode;
26*b1cdbd2cSJim Jagielski import com.sun.star.ucb.XContent;
27*b1cdbd2cSJim Jagielski import com.sun.star.io.XActiveDataSink;
28*b1cdbd2cSJim Jagielski import com.sun.star.io.XInputStream;
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski /**
31*b1cdbd2cSJim Jagielski  * Accessing (Loading) the Content Data Stream of a UCB Document Content
32*b1cdbd2cSJim Jagielski  */
33*b1cdbd2cSJim Jagielski public class DataStreamRetriever {
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski     /**
36*b1cdbd2cSJim Jagielski      * Member properties
37*b1cdbd2cSJim Jagielski      */
38*b1cdbd2cSJim Jagielski     private  Helper   m_helper;
39*b1cdbd2cSJim Jagielski     private  XContent m_content;
40*b1cdbd2cSJim Jagielski     private  String   m_contenturl    = "";
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski     /**
43*b1cdbd2cSJim Jagielski      * Constructor.
44*b1cdbd2cSJim Jagielski      *
45*b1cdbd2cSJim Jagielski      *@param      String[]   This construtor requires the arguments:
46*b1cdbd2cSJim Jagielski      *                          -url=... (optional)
47*b1cdbd2cSJim Jagielski      *                       See Help (method printCmdLineUsage()).
48*b1cdbd2cSJim Jagielski      *                       Without the arguments a new connection to a
49*b1cdbd2cSJim Jagielski      *                       running office cannot created.
50*b1cdbd2cSJim Jagielski      *@exception  java.lang.Exception
51*b1cdbd2cSJim Jagielski      */
DataStreamRetriever( String args[] )52*b1cdbd2cSJim Jagielski     public DataStreamRetriever( String args[] ) throws java.lang.Exception {
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski         // Parse arguments
55*b1cdbd2cSJim Jagielski         parseArguments( args );
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski         // Init
58*b1cdbd2cSJim Jagielski         m_helper       = new Helper( getContentURL() );
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski         // Create UCB content
61*b1cdbd2cSJim Jagielski         m_content      = m_helper.createUCBContent();
62*b1cdbd2cSJim Jagielski     }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski     /**
65*b1cdbd2cSJim Jagielski      *  Read the document data stream of a document content using a
66*b1cdbd2cSJim Jagielski      *  XActiveDataSink implementation as data sink....
67*b1cdbd2cSJim Jagielski      *
68*b1cdbd2cSJim Jagielski      *@return     XInputStream  Returns input stream if stream successfully retrieved,
69*b1cdbd2cSJim Jagielski      *                          null otherwise
70*b1cdbd2cSJim Jagielski      *@exception  com.sun.star.ucb.CommandAbortedException
71*b1cdbd2cSJim Jagielski      *@exception  com.sun.star.uno.Exception
72*b1cdbd2cSJim Jagielski      */
getDataStream()73*b1cdbd2cSJim Jagielski     public XInputStream getDataStream()
74*b1cdbd2cSJim Jagielski         throws com.sun.star.ucb.CommandAbortedException, com.sun.star.uno.Exception {
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski         XInputStream data = null;
77*b1cdbd2cSJim Jagielski         if ( m_content != null ) {
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski             // Fill argument structure...
80*b1cdbd2cSJim Jagielski             OpenCommandArgument2 arg = new OpenCommandArgument2();
81*b1cdbd2cSJim Jagielski             arg.Mode = OpenMode.DOCUMENT;
82*b1cdbd2cSJim Jagielski             arg.Priority = 32768; // Final static for 32768
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski             // Create data sink implementation object.
85*b1cdbd2cSJim Jagielski             XActiveDataSink dataSink = new MyActiveDataSink();
86*b1cdbd2cSJim Jagielski             arg.Sink = dataSink;
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski             // Execute command "open". The implementation of the command will
89*b1cdbd2cSJim Jagielski             // supply an XInputStream implementation to the data sink.
90*b1cdbd2cSJim Jagielski             m_helper.executeCommand( m_content, "open", arg );
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski             // Get input stream supplied by the open command implementation.
93*b1cdbd2cSJim Jagielski             data = dataSink.getInputStream();
94*b1cdbd2cSJim Jagielski         }
95*b1cdbd2cSJim Jagielski         return data;
96*b1cdbd2cSJim Jagielski     }
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski     /**
99*b1cdbd2cSJim Jagielski      *  Get connect URL.
100*b1cdbd2cSJim Jagielski      *
101*b1cdbd2cSJim Jagielski      *@return   String  That contains the connect URL
102*b1cdbd2cSJim Jagielski      */
getContentURL()103*b1cdbd2cSJim Jagielski     public String getContentURL() {
104*b1cdbd2cSJim Jagielski         return m_contenturl;
105*b1cdbd2cSJim Jagielski     }
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     /**
108*b1cdbd2cSJim Jagielski      * Parse arguments
109*b1cdbd2cSJim Jagielski      *
110*b1cdbd2cSJim Jagielski      *@param      String[]   Arguments
111*b1cdbd2cSJim Jagielski      *@exception  java.lang.Exception
112*b1cdbd2cSJim Jagielski      */
parseArguments( String[] args )113*b1cdbd2cSJim Jagielski     public void parseArguments( String[] args ) throws java.lang.Exception {
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski         for ( int i = 0; i < args.length; i++ ) {
116*b1cdbd2cSJim Jagielski             if ( args[i].startsWith( "-url=" )) {
117*b1cdbd2cSJim Jagielski                 m_contenturl    = args[i].substring( 5 );
118*b1cdbd2cSJim Jagielski             } else if ( args[i].startsWith( "-help" ) ||
119*b1cdbd2cSJim Jagielski                         args[i].startsWith( "-?" )) {
120*b1cdbd2cSJim Jagielski                 printCmdLineUsage();
121*b1cdbd2cSJim Jagielski                 System.exit( 0 );
122*b1cdbd2cSJim Jagielski             }
123*b1cdbd2cSJim Jagielski         }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski 		if ( m_contenturl == null || m_contenturl.equals( "" )) {
126*b1cdbd2cSJim Jagielski             m_contenturl = Helper.prependCurrentDirAsAbsoluteFileURL( "data/data.txt" );
127*b1cdbd2cSJim Jagielski         }
128*b1cdbd2cSJim Jagielski     }
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski     /**
131*b1cdbd2cSJim Jagielski      * Print the commands options
132*b1cdbd2cSJim Jagielski      */
printCmdLineUsage()133*b1cdbd2cSJim Jagielski     public void printCmdLineUsage() {
134*b1cdbd2cSJim Jagielski         System.out.println(
135*b1cdbd2cSJim Jagielski             "Usage   : DataStreamRetriever -url=..." );
136*b1cdbd2cSJim Jagielski         System.out.println(
137*b1cdbd2cSJim Jagielski             "Defaults: -url=<currentdir>/data/data.txt" );
138*b1cdbd2cSJim Jagielski         System.out.println(
139*b1cdbd2cSJim Jagielski             "\nExample : -url=file:///temp/my.txt" );
140*b1cdbd2cSJim Jagielski     }
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     /**
143*b1cdbd2cSJim Jagielski      *  Print Stream content.
144*b1cdbd2cSJim Jagielski      *
145*b1cdbd2cSJim Jagielski      *@param    XInputStream
146*b1cdbd2cSJim Jagielski      *@exception  com.sun.star.uno.Exception
147*b1cdbd2cSJim Jagielski      */
printStream( XInputStream data )148*b1cdbd2cSJim Jagielski     public void printStream( XInputStream data )
149*b1cdbd2cSJim Jagielski         throws com.sun.star.uno.Exception {
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski         /////////////////////////////////////////////////////////////////////
152*b1cdbd2cSJim Jagielski         // Read data from input stream...65536
153*b1cdbd2cSJim Jagielski         /////////////////////////////////////////////////////////////////////
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski         // Data buffer. Will be allocated by input stream implementation!
156*b1cdbd2cSJim Jagielski         byte[][] buffer = new byte[ 1 ][ 65536 ];
157*b1cdbd2cSJim Jagielski         int read = data.readSomeBytes( buffer, 65536 );
158*b1cdbd2cSJim Jagielski         System.out.println( "Read bytes : " + read );
159*b1cdbd2cSJim Jagielski         System.out.println( "Read data (only first 64K displayed): ");
160*b1cdbd2cSJim Jagielski         while ( read > 0 ) {
161*b1cdbd2cSJim Jagielski             byte[] bytes =  new byte[ read ];
162*b1cdbd2cSJim Jagielski             for( int i = 0; i < read; i++ ) {
163*b1cdbd2cSJim Jagielski                 bytes[ i ] = buffer[ 0 ][ i ];
164*b1cdbd2cSJim Jagielski             }
165*b1cdbd2cSJim Jagielski             System.out.println( new String(bytes) );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski             // Process data contained in buffer.
168*b1cdbd2cSJim Jagielski             read = data.readSomeBytes( buffer, 65536 );
169*b1cdbd2cSJim Jagielski         }
170*b1cdbd2cSJim Jagielski     }
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski     /**
173*b1cdbd2cSJim Jagielski      *  Create a new connection with the specific args to a running office and
174*b1cdbd2cSJim Jagielski      *  access (Load) the content data stream of a UCB document content.
175*b1cdbd2cSJim Jagielski      *
176*b1cdbd2cSJim Jagielski      *@param  String[]   Arguments
177*b1cdbd2cSJim Jagielski      */
main( String args[] )178*b1cdbd2cSJim Jagielski     public static void main ( String args[] ) {
179*b1cdbd2cSJim Jagielski         System.out.println( "\n" );
180*b1cdbd2cSJim Jagielski 		System.out.println(
181*b1cdbd2cSJim Jagielski             "-----------------------------------------------------------------------" );
182*b1cdbd2cSJim Jagielski 		System.out.println(
183*b1cdbd2cSJim Jagielski             "DataStreamRetriever - obtains the data stream from a document resource." );
184*b1cdbd2cSJim Jagielski 		System.out.println(
185*b1cdbd2cSJim Jagielski             "-----------------------------------------------------------------------" );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski         try {
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski             DataStreamRetriever access = new DataStreamRetriever( args );
190*b1cdbd2cSJim Jagielski             XInputStream data = access.getDataStream();
191*b1cdbd2cSJim Jagielski             String url = access.getContentURL();
192*b1cdbd2cSJim Jagielski             if ( data != null )  {
193*b1cdbd2cSJim Jagielski                 String tempPrint = "\nGetting data stream for resource " + url +
194*b1cdbd2cSJim Jagielski                 " succeeded.";
195*b1cdbd2cSJim Jagielski                 int size = tempPrint.length();
196*b1cdbd2cSJim Jagielski                 System.out.println( tempPrint );
197*b1cdbd2cSJim Jagielski                 tempPrint = "";
198*b1cdbd2cSJim Jagielski                 for( int i = 0; i < size; i++ ) {
199*b1cdbd2cSJim Jagielski                     tempPrint += "-";
200*b1cdbd2cSJim Jagielski                 }
201*b1cdbd2cSJim Jagielski                 System.out.println( tempPrint );
202*b1cdbd2cSJim Jagielski                 access.printStream( data );
203*b1cdbd2cSJim Jagielski             } else {
204*b1cdbd2cSJim Jagielski                 System.out.println(
205*b1cdbd2cSJim Jagielski                     "Getting data stream for resource " + url + " failed." );
206*b1cdbd2cSJim Jagielski             }
207*b1cdbd2cSJim Jagielski         } catch ( com.sun.star.io.NotConnectedException e ) {
208*b1cdbd2cSJim Jagielski             System.out.println( "Error: " + e );
209*b1cdbd2cSJim Jagielski         } catch ( com.sun.star.io.BufferSizeExceededException e ) {
210*b1cdbd2cSJim Jagielski             System.out.println( "Error: " + e );
211*b1cdbd2cSJim Jagielski         } catch ( com.sun.star.io.IOException e ) {
212*b1cdbd2cSJim Jagielski             System.out.println( "Error: " + e );
213*b1cdbd2cSJim Jagielski         } catch ( com.sun.star.ucb.CommandAbortedException e ) {
214*b1cdbd2cSJim Jagielski             System.out.println( "Error: " + e );
215*b1cdbd2cSJim Jagielski         } catch ( com.sun.star.uno.Exception e ) {
216*b1cdbd2cSJim Jagielski             System.out.println( "Error: " + e );
217*b1cdbd2cSJim Jagielski         } catch ( java.lang.Exception e ) {
218*b1cdbd2cSJim Jagielski             System.out.println( "Error: " + e );
219*b1cdbd2cSJim Jagielski         }
220*b1cdbd2cSJim Jagielski         System.exit( 0 );
221*b1cdbd2cSJim Jagielski     }
222*b1cdbd2cSJim Jagielski }
223