/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/

import java.util.*;
import java.awt.*;

/** This class prints out the system properties.

    We cannot print the strings directly because of encoding issues. Since
    about 1.3.1 one can start java with the option -Dfile.encoding=UTF-8, but
    unfortunately this works only with later update - versions (for example,
    1.3.1_07). Therefore we use this scheme. The property string has this form:
    name=value

    Every character is cast to an integer which value is printed, followed by a
    space. If all characters of the string are printed, then a new line is printed.
*/
public class JREProperties
{
    static public void main(String[] args)
    {
         try
        {
            boolean bNoAccess = false;
            if(args.length > 0)
            {
                if (args[0].equals("noaccessibility"))
                    bNoAccess = true;
            }

            //Find out on what operation system we are running. On Windows 98
            //we must not call getDefaultToolkit, because the office may freeze
            //#i44608.
            boolean bW98 = false;
            String os = System.getProperty("os.name");
            
            if (os != null) 
            {
                os = os.trim();
                if (os.equalsIgnoreCase("Windows 98") ||
                    os.indexOf("Windows 98") != -1)
                    bW98 = true;
            }

            //We need to be able to switch this part off because
            //it causes an exception if the DISPLAY variable has
            //a false value. Setting the noaccessibility argument
            //can be done by providing a sunjavaplugin.ini with
            //the bootstrap parameter JFW_PLUGIN_NO_NOT_CHECK_ACCESSIBILITY
            //set to "1"
            if (bNoAccess == false && ! bW98)
            {
                try{
                    //This line is needed to get the accessibility properties 
                    Toolkit tk = java.awt.Toolkit.getDefaultToolkit();
                }
                catch(Throwable e)
                {
                    System.err.println(e);
                }
            }


            Properties p = System.getProperties();
            Enumeration e = p.propertyNames();
            for (; e.hasMoreElements() ;) {
                String sProp = (String) e.nextElement();
                String sCompleteProp = sProp + "=" + p.getProperty(sProp);
                char[] arChars = new char[sCompleteProp.length()];
                sCompleteProp.getChars(0, sCompleteProp.length(), arChars, 0);
                for (int c = 0; c < arChars.length; c++) {
                    System.out.print(String.valueOf((int) arChars[c]));
                    System.out.print(" ");
                }
                System.out.print("\n");
            }
        }
        catch(Exception e)
        {
            System.err.println(e);
        }

        System.exit(0);
    }


    
}
