themeinstaller/source/src/com/nokia/tools/themeinstaller/localisation/DTDReader.java
branchRCL_3
changeset 18 04b7640f6fb5
parent 0 05da4621cfb2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/themeinstaller/source/src/com/nokia/tools/themeinstaller/localisation/DTDReader.java	Wed Sep 01 12:32:13 2010 +0100
@@ -0,0 +1,178 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Read entities from dtd files
+ *
+*/
+
+
+package com.nokia.tools.themeinstaller.localisation;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.nokia.tools.themeinstaller.logger.LogWriter;
+import com.nokia.tools.themeinstaller.odtconverter.ConverterProperties;
+
+/**
+ * Reads entities from dtd files.
+ */
+public class DTDReader
+    {
+
+    /** The Regular expression for entity. */
+    private static final String ENTITY_REGEX = "<!ENTITY(\\s*)%s(.*)>";
+
+    /** The Regular expression for entity's value. */
+    private static final String VALUE_REGEX = "(\")(.*)(\")";
+
+    /** Line separator */
+    private static final String LINE_SEPARATOR =
+            System.getProperty( "line.separator" );
+
+    /** Property key for character encoding of DTD files */
+    private static final String ENCODING_KEY = "dtd_encoding";
+
+    /**
+     * Read DTD Entities. Reads a set of DTD files and searches
+     * for localised string defined in a entity named aLocString.
+     * If there are more than one instances found, the one that
+     * is found first is returned.
+     *
+     * @param aDtdFiles DTD files containing entities
+     * @param aLocString Entity's localisation string
+     *
+     * @return Localised string
+     *
+     * @throws IOException Signals that an I/O exception has occurred.
+     */
+    public static String readFiles( Vector aDtdFiles, String aLocString )
+            throws IOException
+        {
+        String tempResult = null;
+        Vector results = new Vector();
+        for ( int i = 0; i < aDtdFiles.size(); i++ )
+            {
+            tempResult = readEntity( ( File ) aDtdFiles.get( i ), aLocString );
+
+            if ( tempResult != null )
+                {
+                results.add( tempResult );
+                }
+            }
+        if ( results.isEmpty() )
+            {
+            return null;
+            }
+        else
+            {
+            return ( String ) results.firstElement();
+            }
+
+        }
+
+    /**
+     * Read localized entity from the dtd.
+     *
+     * @param aDTD DTD file containing the localization
+     * @param aLocString Localization string
+     * @return Localized entity
+     * @throws IOException if FileInputStream can not be opened
+     */
+    public static String readEntity( File aDTD, String aLocString )
+            throws IOException
+        {
+        StringBuffer strbuf = new StringBuffer();
+
+        // Read the assumed character encoding of DTD files
+        String encoding =
+                ConverterProperties.getInstance().getProperty( ENCODING_KEY );
+
+        BufferedReader rdr = null;
+        if( encoding != null )
+            {
+            // Use specified encoding
+            rdr = new BufferedReader( new InputStreamReader(
+                    new FileInputStream( aDTD ), encoding ) );
+            }
+        else
+            {
+            // Use default encoding
+            LogWriter.getInstance().logWarning( "DTDReader: Character " +
+            		"encoding of DTD files is not specified in the " +
+            		"properties file, using system default encoding." );
+
+            rdr = new BufferedReader( new InputStreamReader(
+                    new FileInputStream( aDTD ) ) );
+            }
+
+        // Add all lines from the DTD file to the buffer
+        for ( String line = rdr.readLine(); line != null; line = rdr.readLine() )
+            {
+            strbuf.append( line + LINE_SEPARATOR );
+            }
+
+        String[] formatArguments = { aLocString };
+        String regex = String.format( ENTITY_REGEX, formatArguments );
+
+        // Search for an entity containing the aLocString
+        String result = findString( regex, strbuf.toString() );
+
+        if ( result != null )
+            {
+            // Search for the entity's value
+            result = findString( VALUE_REGEX, result );
+
+            // Remove "-marks from the value
+            result = result.replaceAll( "\"", "" );
+            }
+
+        return result;
+        }
+
+    /**
+     * Find a substring. Also verifies that exactly one match is found.
+     *
+     * @param aRegex Regular expression for matching
+     * @param aSearchString String for searching
+     * @return Found string
+     */
+    private static String findString( String aRegex, String aSearchString )
+        {
+        String result = null;
+        Pattern pattern = Pattern.compile( aRegex );
+        Matcher matcher = pattern.matcher( aSearchString );
+        int count = 0;
+        while ( matcher.find() )
+            {
+            result = matcher.group();
+            count++;
+            }
+
+        if ( count > 1 )
+            {
+            throw new IllegalArgumentException( "DTD parsing: "
+                    + "found more than one localized value for the "
+                    + "entity" );
+            }
+
+        return result;
+        }
+
+    }