1d127360fSAndrew Rist /**************************************************************
2*f3abe594Smseidel  *
3d127360fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4d127360fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5d127360fSAndrew Rist  * distributed with this work for additional information
6d127360fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7d127360fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8d127360fSAndrew Rist  * "License"); you may not use this file except in compliance
9d127360fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*f3abe594Smseidel  *
11d127360fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f3abe594Smseidel  *
13d127360fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14d127360fSAndrew Rist  * software distributed under the License is distributed on an
15d127360fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16d127360fSAndrew Rist  * KIND, either express or implied.  See the License for the
17d127360fSAndrew Rist  * specific language governing permissions and limitations
18d127360fSAndrew Rist  * under the License.
19*f3abe594Smseidel  *
20d127360fSAndrew Rist  *************************************************************/
21d127360fSAndrew Rist 
22d127360fSAndrew Rist 
23*f3abe594Smseidel 
24cdf0e10cSrcweir /*
25cdf0e10cSrcweir  * Converter.java
26cdf0e10cSrcweir  *
27cdf0e10cSrcweir  * create Source and Target
28cdf0e10cSrcweir  * for converting
29cdf0e10cSrcweir  * TODO maybe a factory would be good here
30cdf0e10cSrcweir  */
31cdf0e10cSrcweir 
32cdf0e10cSrcweir package com.sun.star.tooling.converter;
33cdf0e10cSrcweir 
34cdf0e10cSrcweir import java.io.BufferedOutputStream;
35cdf0e10cSrcweir import java.io.File;
36cdf0e10cSrcweir import java.io.FileNotFoundException;
37cdf0e10cSrcweir import java.io.FileOutputStream;
38cdf0e10cSrcweir import java.io.IOException;
39cdf0e10cSrcweir import java.io.OutputStream;
40cdf0e10cSrcweir 
41cdf0e10cSrcweir import javax.xml.parsers.ParserConfigurationException;
42cdf0e10cSrcweir import javax.xml.parsers.SAXParser;
43cdf0e10cSrcweir import javax.xml.parsers.SAXParserFactory;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir import org.xml.sax.EntityResolver;
46cdf0e10cSrcweir import org.xml.sax.SAXException;
47cdf0e10cSrcweir import org.xml.sax.SAXParseException;
48cdf0e10cSrcweir import org.xml.sax.XMLReader;
49cdf0e10cSrcweir import org.xml.sax.helpers.DefaultHandler;
50cdf0e10cSrcweir 
51cdf0e10cSrcweir /**
52*f3abe594Smseidel  *
53cdf0e10cSrcweir  * This class handles the creating of the source to read from,
54cdf0e10cSrcweir  * the target to write to and the appropriate DataHandler
55*f3abe594Smseidel  *
56*f3abe594Smseidel  * @author Christian Schmidt 2005
57cdf0e10cSrcweir  */
58cdf0e10cSrcweir public final class Converter {
59cdf0e10cSrcweir 
60cdf0e10cSrcweir     /**
61*f3abe594Smseidel      * the used charset i.e. UTF-8
62cdf0e10cSrcweir      */
63cdf0e10cSrcweir     private final static String         CHARSET        = new String("UTF-8");
64cdf0e10cSrcweir 
65cdf0e10cSrcweir     private static final String EMPTY          = new String("");
66*f3abe594Smseidel 
67cdf0e10cSrcweir     /**
68cdf0e10cSrcweir      * The DataHandler use to connect reader and writer
69cdf0e10cSrcweir      */
70cdf0e10cSrcweir     private static DataHandler  handler;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir     /**
73cdf0e10cSrcweir      * Counting the lines written by a writer
74cdf0e10cSrcweir      */
75cdf0e10cSrcweir     private static int          lineCounter;
76*f3abe594Smseidel 
77cdf0e10cSrcweir     /**
78cdf0e10cSrcweir      * The target to write to
79cdf0e10cSrcweir      */
80cdf0e10cSrcweir     private static DataWriter   theTargetWriter;
81*f3abe594Smseidel 
82*f3abe594Smseidel 
83cdf0e10cSrcweir     /**
84cdf0e10cSrcweir      * Overwrite existing files
85cdf0e10cSrcweir      */
86cdf0e10cSrcweir     private boolean             overwrite      = false;
87cdf0e10cSrcweir     /**
88cdf0e10cSrcweir      * The source to read from
89cdf0e10cSrcweir      */
90cdf0e10cSrcweir     private Source              reader;
91cdf0e10cSrcweir     /**
92cdf0e10cSrcweir      * The name of the source file
93cdf0e10cSrcweir      */
94cdf0e10cSrcweir     private String              sourceString;
95cdf0e10cSrcweir     /**
96*f3abe594Smseidel      * the Type of the Source file (SDF,GSI,XLIFF)
97cdf0e10cSrcweir      */
98cdf0e10cSrcweir     private String              sourceType;
99cdf0e10cSrcweir     /**
100*f3abe594Smseidel      * The name of the target file
101cdf0e10cSrcweir      */
102cdf0e10cSrcweir     private String              targetString;
103cdf0e10cSrcweir     /**
104*f3abe594Smseidel      * the Type of the Target file (SDF,GSI,XLIFF)
105cdf0e10cSrcweir      */
106*f3abe594Smseidel     private String              targetType;
107cdf0e10cSrcweir     /**
108cdf0e10cSrcweir      * The writer that handles the output
109cdf0e10cSrcweir      */
110cdf0e10cSrcweir     private Target              writer;
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     /**
113cdf0e10cSrcweir      * The sourceLanguage
114cdf0e10cSrcweir      */
115cdf0e10cSrcweir     String                      sourceLanguage = "en-US";
116*f3abe594Smseidel 
117cdf0e10cSrcweir     /**
118cdf0e10cSrcweir      * The targetLanguage
119cdf0e10cSrcweir      */
120cdf0e10cSrcweir     String                      targetLanguage = "";
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     /**
123cdf0e10cSrcweir      * The name of the second source, needed for GSI to SDF merge
124cdf0e10cSrcweir      */
125cdf0e10cSrcweir     private String secondSourceString=EMPTY;
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     /**
129cdf0e10cSrcweir      * Get the line counter
130cdf0e10cSrcweir      * @return Returns the lineCounter.
131cdf0e10cSrcweir      */
getLineCounter()132cdf0e10cSrcweir     public static int getLineCounter() {
133cdf0e10cSrcweir         return lineCounter;
134cdf0e10cSrcweir     }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir     /**
137cdf0e10cSrcweir      * increment the lineCounter
138cdf0e10cSrcweir      */
countLine()139cdf0e10cSrcweir     final static void countLine() {
140cdf0e10cSrcweir         lineCounter++;
141cdf0e10cSrcweir     }
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     /**
144cdf0e10cSrcweir      * Creates a new instance of Converter
145*f3abe594Smseidel      *
146cdf0e10cSrcweir      * @param sourceType        the type of the sourceFile
147cdf0e10cSrcweir      * @param sourceString      the name of the sourceFile
148cdf0e10cSrcweir      * @param SourceLanguage    the ISO Id of the sourceLanguage
149cdf0e10cSrcweir      * @param targetType        the type of the targetFile
150cdf0e10cSrcweir      * @param targetString      the name of the targetFile
151cdf0e10cSrcweir      * @param TargetLanguage    the ISO Id of the targetLanguage
152cdf0e10cSrcweir      * @param secondSourceString     the name of the second sourceFile (GSI merge only)
153cdf0e10cSrcweir      * @param overwrite         indicates whether overwrite existing files
154cdf0e10cSrcweir      * @throws IOException
155cdf0e10cSrcweir      * @throws Exception
156cdf0e10cSrcweir      */
Converter(String sourceType, String sourceString, String SourceLanguage, String targetType, String targetString, String TargetLanguage,String secondSourceString, boolean overwrite)157cdf0e10cSrcweir     public Converter(String sourceType, String sourceString,
158cdf0e10cSrcweir             String SourceLanguage, String targetType, String targetString,
159cdf0e10cSrcweir             String TargetLanguage,String secondSourceString, boolean overwrite) throws IOException,
160cdf0e10cSrcweir             Exception {
161cdf0e10cSrcweir 
162cdf0e10cSrcweir         this.sourceType = sourceType;
163cdf0e10cSrcweir         this.sourceString = sourceString;
164cdf0e10cSrcweir         this.sourceLanguage = SourceLanguage;
165cdf0e10cSrcweir         this.targetType = targetType;
166cdf0e10cSrcweir         this.targetString = targetString;
167cdf0e10cSrcweir         this.targetLanguage = TargetLanguage;
168cdf0e10cSrcweir         this.secondSourceString=secondSourceString;
169cdf0e10cSrcweir         this.overwrite = overwrite;
170cdf0e10cSrcweir 
171cdf0e10cSrcweir         handler = new DataHandler();
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         if ("sdf".equalsIgnoreCase(sourceType)) {
174cdf0e10cSrcweir             reader = new SDFSource();
175cdf0e10cSrcweir         } else if ("xliff".equalsIgnoreCase(sourceType)||"dbxliff".equalsIgnoreCase(sourceType)) {
176cdf0e10cSrcweir             reader = new XLIFFSource();
177cdf0e10cSrcweir         } else if ("gsi".equalsIgnoreCase(sourceType)) {
178cdf0e10cSrcweir             reader = new GSISource();
179cdf0e10cSrcweir         } else {
180cdf0e10cSrcweir             throw new ConverterException("Unknown Source File Type: '"+sourceType+"'");
181cdf0e10cSrcweir         }
182cdf0e10cSrcweir 
183cdf0e10cSrcweir         if ("sdf".equalsIgnoreCase(targetType)) {
184cdf0e10cSrcweir             writer = new SDFTarget();
185cdf0e10cSrcweir         } else if ("xliff".equalsIgnoreCase(targetType)) {
186cdf0e10cSrcweir             writer = new XLIFFTarget();
187cdf0e10cSrcweir         } else if ("gsi".equalsIgnoreCase(targetType)) {
188cdf0e10cSrcweir             writer = new GSITarget();
189cdf0e10cSrcweir         } else {
190cdf0e10cSrcweir             throw new ConverterException("Unknown Target File Type: '"+targetType+"'");
191cdf0e10cSrcweir         }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     }
194cdf0e10cSrcweir 
195cdf0e10cSrcweir     /**
196cdf0e10cSrcweir      * Do the converting from the source file format to the target file format
197*f3abe594Smseidel      *
198cdf0e10cSrcweir      * @throws IOException
199cdf0e10cSrcweir      */
convert()200cdf0e10cSrcweir     public final void convert() throws IOException {
201cdf0e10cSrcweir 
202cdf0e10cSrcweir         try {
203cdf0e10cSrcweir 
204cdf0e10cSrcweir             reader.convertTo(writer);
205cdf0e10cSrcweir 
206cdf0e10cSrcweir             //TODO this belongs in the Target Class
207cdf0e10cSrcweir             theTargetWriter.flush();
208cdf0e10cSrcweir             theTargetWriter.close();
209cdf0e10cSrcweir         } catch (Exception e) {
210cdf0e10cSrcweir             OutputHandler.out(e.getMessage());
211cdf0e10cSrcweir         }
212cdf0e10cSrcweir 
213cdf0e10cSrcweir     }
214*f3abe594Smseidel 
215cdf0e10cSrcweir 
216cdf0e10cSrcweir     /**
217*f3abe594Smseidel      *
218cdf0e10cSrcweir      * Encapsulate the reading from an GSI file
219*f3abe594Smseidel      *
220cdf0e10cSrcweir      * @author Christian Schmidt 2005
221cdf0e10cSrcweir      *
222cdf0e10cSrcweir      */
223cdf0e10cSrcweir     private class GSISource implements Source {
224cdf0e10cSrcweir         DataReader theSourceReader;
225cdf0e10cSrcweir         /**
226cdf0e10cSrcweir          * Create a new Instance of GSISource
227*f3abe594Smseidel          *
228cdf0e10cSrcweir          * @throws IOException
229cdf0e10cSrcweir          * @throws Exception
230cdf0e10cSrcweir          */
GSISource()231cdf0e10cSrcweir         public GSISource() throws IOException {
232cdf0e10cSrcweir 
233cdf0e10cSrcweir             theSourceReader = new GSIandSDFMerger(new File(sourceString),new File(secondSourceString), sourceLanguage,
234cdf0e10cSrcweir                     targetLanguage, CHARSET);
235cdf0e10cSrcweir         }
236cdf0e10cSrcweir 
convertTo(Target t)237cdf0e10cSrcweir         public void convertTo(Target t) {
238*f3abe594Smseidel 
239cdf0e10cSrcweir             try {
240cdf0e10cSrcweir                 theTargetWriter = t.getWriter();
241cdf0e10cSrcweir                 while (handler.fillDataFrom(theSourceReader)) {
242cdf0e10cSrcweir 
243cdf0e10cSrcweir                     theTargetWriter.getDatafrom(handler);
244cdf0e10cSrcweir                     theTargetWriter.writeData();
245cdf0e10cSrcweir                 }
246cdf0e10cSrcweir             } catch (IOException e) {
247cdf0e10cSrcweir                 OutputHandler.out(e.getMessage());
248cdf0e10cSrcweir 
249cdf0e10cSrcweir             } catch (Exception e) {
250cdf0e10cSrcweir                 e.printStackTrace();
251cdf0e10cSrcweir             }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir         }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir     }
256cdf0e10cSrcweir     /**
257*f3abe594Smseidel      *
258cdf0e10cSrcweir      * Encapsulate to write to a GSI file
259*f3abe594Smseidel      *
260cdf0e10cSrcweir      * @author Christian Schmidt 2005
261cdf0e10cSrcweir      *
262cdf0e10cSrcweir      */
263cdf0e10cSrcweir     private class GSITarget implements Target {
264cdf0e10cSrcweir 
265cdf0e10cSrcweir         File target;
266*f3abe594Smseidel 
267cdf0e10cSrcweir         /**
268cdf0e10cSrcweir          * Create a new Instance of GSITarget
269*f3abe594Smseidel          *
270cdf0e10cSrcweir          * @throws FileNotFoundException
271cdf0e10cSrcweir          * @throws IOException
272cdf0e10cSrcweir          */
GSITarget()273cdf0e10cSrcweir         public GSITarget() throws FileNotFoundException, IOException {
274cdf0e10cSrcweir 
275cdf0e10cSrcweir             target = FileMaker.newFile(targetString, overwrite);
276cdf0e10cSrcweir             theTargetWriter = new GSIWriter(new BufferedOutputStream(
277cdf0e10cSrcweir                     new FileOutputStream(target)), CHARSET);
278cdf0e10cSrcweir         }
279cdf0e10cSrcweir 
getWriter()280cdf0e10cSrcweir         public DataWriter getWriter() {
281*f3abe594Smseidel 
282cdf0e10cSrcweir             return theTargetWriter;
283cdf0e10cSrcweir         }
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     }
286cdf0e10cSrcweir     /**
287*f3abe594Smseidel      *
288cdf0e10cSrcweir      * Encapsulate the reading from an SDF file
289*f3abe594Smseidel      *
290cdf0e10cSrcweir      * @author Christian Schmidt 2005
291*f3abe594Smseidel      *
292cdf0e10cSrcweir      */
293cdf0e10cSrcweir     private final class SDFSource implements Source {
294cdf0e10cSrcweir 
295cdf0e10cSrcweir         DataReader Source;
296cdf0e10cSrcweir 
297cdf0e10cSrcweir         /**
298cdf0e10cSrcweir          * Create a new Instance of SDFSource
299cdf0e10cSrcweir          * @throws IOException
300cdf0e10cSrcweir          * @throws Exception
301cdf0e10cSrcweir          */
SDFSource()302cdf0e10cSrcweir         public SDFSource() throws IOException, Exception {
303cdf0e10cSrcweir 
304cdf0e10cSrcweir             Source = new SDFReader(new File(sourceString), sourceLanguage,
305cdf0e10cSrcweir                     targetLanguage, CHARSET);
306cdf0e10cSrcweir         }
307cdf0e10cSrcweir 
convertTo(Target t)308cdf0e10cSrcweir         public void convertTo(Target t) {
309cdf0e10cSrcweir             try {
310cdf0e10cSrcweir                 theTargetWriter = t.getWriter();
311cdf0e10cSrcweir                 while (handler.fillDataFrom(Source)) {
312cdf0e10cSrcweir 
313cdf0e10cSrcweir                     theTargetWriter.getDatafrom(handler);
314cdf0e10cSrcweir                     theTargetWriter.writeData();
315cdf0e10cSrcweir                 }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir             } catch (IOException e) {
318cdf0e10cSrcweir                 OutputHandler.out(e.getMessage());
319cdf0e10cSrcweir 
320cdf0e10cSrcweir             } catch (Exception e) {
321cdf0e10cSrcweir                 e.printStackTrace();
322cdf0e10cSrcweir             }
323cdf0e10cSrcweir 
324cdf0e10cSrcweir         }
325cdf0e10cSrcweir 
326cdf0e10cSrcweir     }
327cdf0e10cSrcweir     /**
328cdf0e10cSrcweir      * Encapsulate writing to a SDF file
329cdf0e10cSrcweir      *
330cdf0e10cSrcweir      * @author Christian Schmidt 2005
331cdf0e10cSrcweir      *
332cdf0e10cSrcweir      */
333cdf0e10cSrcweir     private class SDFTarget implements Target {
334cdf0e10cSrcweir 
335cdf0e10cSrcweir         /**
336cdf0e10cSrcweir          * Create a new Instance of SDFTarget
337*f3abe594Smseidel          *
338cdf0e10cSrcweir          * @throws IOException
339cdf0e10cSrcweir          */
SDFTarget()340cdf0e10cSrcweir         public SDFTarget() throws IOException {
341cdf0e10cSrcweir             File target = FileMaker.newFile(targetString, overwrite);
342cdf0e10cSrcweir             theTargetWriter = new SDFWriter(new BufferedOutputStream(
343cdf0e10cSrcweir                     new FileOutputStream(target)), CHARSET);
344cdf0e10cSrcweir         }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir         /* (non-Javadoc)
347cdf0e10cSrcweir          * @see com.sun.star.tooling.converter.Converter.Target#getWriter()
348cdf0e10cSrcweir          */
getWriter()349cdf0e10cSrcweir         public DataWriter getWriter() {
350cdf0e10cSrcweir 
351cdf0e10cSrcweir             return theTargetWriter;
352cdf0e10cSrcweir         }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir     }
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     /**
357*f3abe594Smseidel      * The interface for all convertible sources
358*f3abe594Smseidel      *
359cdf0e10cSrcweir      * @author Christian Schmidt 2005
360cdf0e10cSrcweir      *
361cdf0e10cSrcweir      */
362cdf0e10cSrcweir     private interface Source {
363*f3abe594Smseidel 
364cdf0e10cSrcweir         DataReader Source=null;
365cdf0e10cSrcweir         /**
366cdf0e10cSrcweir          * Convert this. to the designated target
367*f3abe594Smseidel          * @param target the target of the converting
368cdf0e10cSrcweir          * @throws IOException
369cdf0e10cSrcweir          */
convertTo(Target target)370cdf0e10cSrcweir         abstract void convertTo(Target target) throws IOException;
371cdf0e10cSrcweir     }
372cdf0e10cSrcweir 
373cdf0e10cSrcweir     /**
374cdf0e10cSrcweir      * The interface for all creatable targets
375*f3abe594Smseidel      *
376cdf0e10cSrcweir      * @author Christian Schmidt 2005
377cdf0e10cSrcweir      *
378cdf0e10cSrcweir      */
379cdf0e10cSrcweir     private interface Target {
380cdf0e10cSrcweir         /**
381cdf0e10cSrcweir          * The writer to use
382cdf0e10cSrcweir          */
383cdf0e10cSrcweir         public OutputStream writer = null;
384cdf0e10cSrcweir 
385cdf0e10cSrcweir         /**
386cdf0e10cSrcweir          * Get the writer
387cdf0e10cSrcweir          * this target uses to write the
388*f3abe594Smseidel          * data in the correct format.
389*f3abe594Smseidel          *
390cdf0e10cSrcweir          * @return the used DataWriter
391cdf0e10cSrcweir          */
getWriter()392cdf0e10cSrcweir         abstract DataWriter getWriter();
393cdf0e10cSrcweir 
394cdf0e10cSrcweir     }
395cdf0e10cSrcweir     /**
396cdf0e10cSrcweir      * Encapsulate the reading from an XLIFF file
397cdf0e10cSrcweir      *
398cdf0e10cSrcweir      * @author Christian Schmidt 2005
399cdf0e10cSrcweir      *
400cdf0e10cSrcweir      */
401cdf0e10cSrcweir     private class XLIFFSource implements Source {
402cdf0e10cSrcweir         File source;
403cdf0e10cSrcweir 
404cdf0e10cSrcweir         /**
405cdf0e10cSrcweir          * Create a new Instance of XLIFFSource
406*f3abe594Smseidel          *
407*f3abe594Smseidel          *
408cdf0e10cSrcweir          */
XLIFFSource()409cdf0e10cSrcweir         public XLIFFSource() {
410cdf0e10cSrcweir 
411cdf0e10cSrcweir             source = new File(sourceString);
412cdf0e10cSrcweir         }
413cdf0e10cSrcweir 
convertTo(Target t)414cdf0e10cSrcweir         public void convertTo(Target t) throws IOException {
415cdf0e10cSrcweir             try {
416cdf0e10cSrcweir                 System.setProperty("entityExpansionLimit", "1000000");
417cdf0e10cSrcweir                 boolean laden = source.canRead();
418cdf0e10cSrcweir                 if (laden) {
419cdf0e10cSrcweir                     DefaultHandler contentHandler=null;
420cdf0e10cSrcweir                     if("dbxliff".equalsIgnoreCase(sourceType)){
421cdf0e10cSrcweir                         contentHandler = new XLIFFReader(handler, t
422cdf0e10cSrcweir                                 .getWriter(),false);
423cdf0e10cSrcweir                     }else{
424cdf0e10cSrcweir                         contentHandler = new XLIFFReader(handler, t
425cdf0e10cSrcweir                             .getWriter());
426cdf0e10cSrcweir                     }
427cdf0e10cSrcweir                     SAXParserFactory factory = SAXParserFactory.newInstance();
428cdf0e10cSrcweir                     factory.setNamespaceAware( true );
429cdf0e10cSrcweir                     factory.setValidating( true );
430cdf0e10cSrcweir 
431cdf0e10cSrcweir                     SAXParser parser=factory.newSAXParser();
432cdf0e10cSrcweir                     XMLReader xliffreader=parser.getXMLReader();
433cdf0e10cSrcweir 
434*f3abe594Smseidel 
435*f3abe594Smseidel 
436cdf0e10cSrcweir //                    XMLReader xliffreader = XMLReaderFactory
437cdf0e10cSrcweir //                            .createXMLReader("org.apache.crimson.parser.XMLReaderImpl");
438cdf0e10cSrcweir                     xliffreader.setErrorHandler(contentHandler);
439cdf0e10cSrcweir                     xliffreader.setContentHandler(contentHandler);
440cdf0e10cSrcweir                     /* one possibility to resolve an extern entity (DTD) */
441cdf0e10cSrcweir                     EntityResolver res = new Resolver();
442cdf0e10cSrcweir                     xliffreader.setEntityResolver(res);
443cdf0e10cSrcweir                     /*
444cdf0e10cSrcweir                      * a second possibility to resolve an extern entity (DTD)
445*f3abe594Smseidel                      *
446cdf0e10cSrcweir                      * xliffreader.setFeature("xml.org/sax/features/validation",true);
447cdf0e10cSrcweir                      * xliffreader.setEntityResolver(new EntityResolver() {
448cdf0e10cSrcweir                      * public InputSource resolveEntity(java.lang.String
449cdf0e10cSrcweir                      * publicId, java.lang.String systemId) throws SAXException,
450cdf0e10cSrcweir                      * java.io.IOException { if (publicId.equals("-//XLIFF//DTD
451*f3abe594Smseidel                      * XLIFF//EN")) // this deactivates the OpenOffice DTD
452cdf0e10cSrcweir                      * return new InputSource(new ByteArrayInputStream( " <?xml
453cdf0e10cSrcweir                      * version='1.0' encoding='UTF-8'?>" .getBytes())); else
454cdf0e10cSrcweir                      * return null; } });
455*f3abe594Smseidel                      *
456cdf0e10cSrcweir                      */
457cdf0e10cSrcweir 
458cdf0e10cSrcweir                     xliffreader.parse(sourceString);
459cdf0e10cSrcweir 
460cdf0e10cSrcweir                 } else {
461*f3abe594Smseidel                     System.out.println("File does not exist");
462cdf0e10cSrcweir                 }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir             } catch (SAXParseException e) {
465cdf0e10cSrcweir                 try {
466cdf0e10cSrcweir                     theTargetWriter.flush();
467cdf0e10cSrcweir                 } catch (IOException e1) {
468cdf0e10cSrcweir 
469cdf0e10cSrcweir                     e1.printStackTrace();
470cdf0e10cSrcweir                 }
471cdf0e10cSrcweir                 OutputHandler.out("PARSE ERROR Zeile " + e.getLineNumber()
472cdf0e10cSrcweir                         + ", " + e.getMessage());
473cdf0e10cSrcweir 
474cdf0e10cSrcweir             }catch (SAXException e){
475cdf0e10cSrcweir                 try {
476cdf0e10cSrcweir                     theTargetWriter.flush();
477cdf0e10cSrcweir                 } catch (IOException e1) {
478cdf0e10cSrcweir 
479cdf0e10cSrcweir                     e1.printStackTrace();
480cdf0e10cSrcweir                 }
481*f3abe594Smseidel                 OutputHandler.out("PARSE EXCEPTION " + e.getMessage());
482cdf0e10cSrcweir             } catch (ParserConfigurationException e) {
483*f3abe594Smseidel                 OutputHandler.out("PARSER Configuration failed\n " + e.getMessage());
484cdf0e10cSrcweir             }
485cdf0e10cSrcweir         }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir     }
488cdf0e10cSrcweir     /**
489cdf0e10cSrcweir      * Encapsulate writing to a XLIFF file
490*f3abe594Smseidel      *
491cdf0e10cSrcweir      * @author Christian Schmidt 2005
492cdf0e10cSrcweir      *
493cdf0e10cSrcweir      */
494cdf0e10cSrcweir     private class XLIFFTarget implements Target {
495cdf0e10cSrcweir         File target;
496cdf0e10cSrcweir 
497cdf0e10cSrcweir         /**
498cdf0e10cSrcweir          * Create a new Instance of XLIFFTarget
499*f3abe594Smseidel          *
500cdf0e10cSrcweir          * @throws FileNotFoundException
501cdf0e10cSrcweir          * @throws IOException
502cdf0e10cSrcweir          */
XLIFFTarget()503cdf0e10cSrcweir         public XLIFFTarget() throws FileNotFoundException, IOException {
504cdf0e10cSrcweir             target = FileMaker.newFile(targetString, overwrite);
505cdf0e10cSrcweir             theTargetWriter = new XLIFFWriter(new BufferedOutputStream(
506cdf0e10cSrcweir                     new FileOutputStream(target)), CHARSET);
507cdf0e10cSrcweir 
508cdf0e10cSrcweir         }
509cdf0e10cSrcweir 
getWriter()510cdf0e10cSrcweir         public DataWriter getWriter() {
511cdf0e10cSrcweir 
512cdf0e10cSrcweir             return theTargetWriter;
513cdf0e10cSrcweir         }
514cdf0e10cSrcweir     }
515cdf0e10cSrcweir 
516*f3abe594Smseidel }
517cdf0e10cSrcweir 
518