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

package installer;

import java.io.*;
import javax.swing.JLabel;

public class FileUpdater {

	public static boolean updateProtocolHandler( String installPath, JLabel statusLabel ) {
            File in_file = null;
            FileInputStream in = null;
            File out_file = null;
            FileWriter out = null;
            int count = 0;

            try {
                in_file = new File( installPath+File.separator+"share"+File.separator+"registry"+File.separator+"data"+File.separator+"org"+File.separator+"openoffice"+File.separator+"Office"+File.separator+"ProtocolHandler.xcu" );

		String[] xmlArray = new String[50];
		try {
			BufferedReader reader = new BufferedReader(new FileReader(in_file));
			count = -1;
	    		for (String s = reader.readLine(); s != null; s = reader.readLine()) { //</oor:node>
				count = count + 1;
				if(s != null) {
					s.trim();
					xmlArray[count] = s;
				}
				else
					break;
			}
		}
		catch( IOException ioe ) {
			String message = "\nError reading ProtocolHandler.xcu, please view SFrameworkInstall.log.";
			System.out.println(message);
			ioe.printStackTrace();
			statusLabel.setText(message);
			return false;
		}

		in_file.delete();

                out_file = new File( installPath+File.separator+"share"+File.separator+"registry"+File.separator+"data"+File.separator+"org"+File.separator+"openoffice"+File.separator+"Office"+File.separator+"ProtocolHandler.xcu" );
                out_file.createNewFile();
                out = new FileWriter( out_file );

		for(int i=0; i<count + 1; i++) {
                    out.write(xmlArray[i]+"\n");
                    if( ( xmlArray[i].indexOf( "<node oor:name=\"HandlerSet\">" ) != -1 ) && ( xmlArray[i+1].indexOf( "ScriptProtocolHandler" ) == -1 ) ) {
                        out.write( "		<node oor:name=\"com.sun.star.comp.ScriptProtocolHandler\" oor:op=\"replace\">\n" );
                        out.write( "			<prop oor:name=\"Protocols\">\n" );
                        out.write( "				<value>script:*</value>\n" );
                        out.write( "			</prop>\n" );
                        out.write( "		</node>\n" );
                     }
                }
            }
            catch( Exception e ) {
		String message = "\nError updating ProtocolHandler.xcu, please view SFrameworkInstall.log.";
                System.out.println(message);
		e.printStackTrace();
		statusLabel.setText(message);
		return false;
            }
            finally {
                try {
                    out.close();
                    System.out.println("File closed");
                }
                catch(Exception e) {
                    System.out.println("Update ProtocolHandler Failed, please view SFrameworkInstall.log.");
		    System.err.println(e);
		    e.printStackTrace();
                }
            }
	    return true;

	}// updateProtocolHandler


        public static boolean updateScriptXLC( String installPath, JLabel statusLabel ) {

            File in_file = null;
            FileInputStream in = null;
            File out_file = null;
            FileWriter out = null;
            int count = 0;

	    //System.out.println("updateScriptXLC");
            try {
                in_file = new File( installPath+File.separator+"user"+File.separator+"basic"+File.separator+"script.xlc" );

		String[] xmlArray = new String[50];
		try {
			BufferedReader reader = new BufferedReader(new FileReader(in_file));
			count = -1;
	    		for (String s = reader.readLine(); s != null; s = reader.readLine()) { //</oor:node>
				count = count + 1;
				if(s != null) {
					s.trim();
					xmlArray[count] = s;
				}
				else
					break;
			}
		}
		catch( IOException ioe ) {
			String message = "Error reading script.xlc, please view SFrameworkInstall.log.";
			System.out.println(message);
			ioe.printStackTrace();
			statusLabel.setText(message);
			return false;
		}

		in_file.delete();

                out_file = new File( installPath+File.separator+"user"+File.separator+"basic"+File.separator+"script.xlc" );
                out_file.createNewFile();
                out = new FileWriter( out_file );

                //split the string into a string array with one line of xml in each element
                //String[] xmlArray = xmlLine.split("\n");
		for(int i=0; i<count + 1; i++) {
                    out.write(xmlArray[i]+"\n");
                    if( ( xmlArray[i].indexOf( "<library:libraries xmlns:library" ) != -1 ) && ( xmlArray[i+1].indexOf( "ScriptBindingLibrary" ) == -1 ) ) {
			String opSys = System.getProperty("os.name");
			if (opSys.indexOf("Windows") != -1) {
				out.write(" <library:library library:name=\"ScriptBindingLibrary\" library:link=\"true\"/>\n" );
			}
			else {
				out.write(" <library:library library:name=\"ScriptBindingLibrary\" xlink:href=\"file://"+installPath+"/share/basic/ScriptBindingLibrary/script.xlb/\" xlink:type=\"simple\" library:link=\"true\"/>\n" );
			}
                     }
                }
            }
            catch( Exception e ) {
			String message = "\nError updating script.xlc, please view SFrameworkInstall.log.";
			System.out.println(message);
			e.printStackTrace();
			statusLabel.setText(message);
			return false;
            }
            finally {
                try {
                    out.close();
                }
                catch(Exception e) {
                    System.out.println("Update Script.xlc Failed, please view SFrameworkInstall.log.");
		    e.printStackTrace();
                    System.err.println(e);
                }
            }
	    return true;
        }// updateScriptXLC


        public static boolean updateDialogXLC( String installPath, JLabel statusLabel ) {
            File in_file = null;
            FileInputStream in = null;
            File out_file = null;
            FileWriter out = null;
            int count = 0;

            //System.out.println( "updateDialogXLC" );
            try {
                in_file = new File( installPath+File.separator+"user"+File.separator+"basic"+File.separator+"dialog.xlc" );
                String xmlLine = "";

		String[] xmlArray = new String[50];
		try {
			BufferedReader reader = new BufferedReader(new FileReader(in_file));
			count = -1;
	    		for (String s = reader.readLine(); s != null; s = reader.readLine()) {
				count = count + 1;
				if(s != null) {
					s.trim();
					xmlArray[count] = s;
				}
				else
					break;
			}
		}
		catch( IOException ioe ) {

			String message = "\nError reading dialog.xlc, please view SFrameworkInstall.log.";
			System.out.println(message);
			statusLabel.setText(message);
			return false;
		}
                in_file.delete();

                out_file = new File( installPath+File.separator+"user"+File.separator+"basic"+File.separator+"dialog.xlc" );
                out_file.createNewFile();

                out = new FileWriter( out_file );

                //split the string into a string array with one line of xml in each element
                // String[] xmlArray = xmlLine.split("\n");
		for(int i=0; i<count + 1; i++) {
                    out.write(xmlArray[i]+"\n");
                    if( ( xmlArray[i].indexOf( "<library:libraries xmlns:library" ) != -1 ) && ( xmlArray[i+1].indexOf( "ScriptBindingLibrary" ) == -1 ) ) {
			String opSys = System.getProperty("os.name");
			if (opSys.indexOf("Windows") != -1) {
				out.write(" <library:library library:name=\"ScriptBindingLibrary\" library:link=\"true\"/>\n" );
			}
			else {
				out.write(" <library:library library:name=\"ScriptBindingLibrary\" xlink:href=\"file://"+installPath+"/share/basic/ScriptBindingLibrary/dialog.xlb/\" xlink:type=\"simple\" library:link=\"true\"/>\n" );
			}
                     }
                }
            }
            catch( Exception e ) {
			String message = "\nError updating dialog.xlc, please view SFrameworkInstall.log.";
			System.out.println(message);
			e.printStackTrace();
			statusLabel.setText(message);
			return false;
            }
            finally {
                try {
                    out.close();
                }
                catch(Exception e) {
                    System.out.println("Update dialog.xlc Failed, please view SFrameworkInstall.log.");
		    e.printStackTrace();
                    System.err.println(e);
                }
            }
	    return true;
        }// updateScriptXLC


}
