| /* |
| * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| import java.awt.*; |
| import java.beans.PropertyChangeEvent; |
| import java.beans.PropertyChangeListener; |
| import java.io.InputStream; |
| |
| /* |
| * @test |
| * @bug 4758438 |
| * @summary Testcase to check the implementation of RFE 4758438 |
| * The RFE suggests that the GNOME desktop properties |
| * should be made accessible through the |
| * Toolkit.getDesktopProperty() API. |
| * @author Girish R (girish.ramachandran@sun.com) |
| * @author Dmitriy Ermashov (dmitriy.ermashov@oracle.com) |
| * @run shell rfe4758438.sh |
| */ |
| |
| public class rfe4758438 implements PropertyChangeListener { |
| |
| enum PROPS { |
| drag_threshold( |
| "org.gnome.settings-daemon.peripherals.mouse drag-threshold", |
| "/desktop/gnome/peripherals/mouse/drag_threshold", |
| "gnome.Net/DndDragThreshold", |
| "int", |
| new String[]{"5", "6"}), |
| double_click( |
| "org.gnome.settings-daemon.peripherals.mouse double-click", |
| "/desktop/gnome/peripherals/mouse/double_click", |
| "gnome.Net/DoubleClickTime", |
| "int", |
| new String[]{"200","300"}), |
| cursor_blink( |
| "org.gnome.desktop.interface cursor-blink", |
| "/desktop/gnome/interface/cursor_blink", |
| "gnome.Net/CursorBlink", |
| "bool", |
| new String[]{"true","false"}), |
| cursor_blink_time( |
| "org.gnome.desktop.interface cursor-blink-time", |
| "/desktop/gnome/interface/cursor_blink_time", |
| "gnome.Net/CursorBlinkTime", |
| "int", |
| new String[]{"1000","1500"}), |
| gtk_theme( |
| "org.gnome.desktop.interface gtk-theme", |
| "/desktop/gnome/interface/gtk_theme", |
| "gnome.Net/ThemeName", |
| "string", |
| new String[]{"Crux","Simple"}); |
| |
| public final String gsettings; |
| public final String gconftool; |
| public final String java; |
| public final String type; |
| public final String[] values; |
| |
| PROPS(String gsettings, String gconftool, String java, String type, String[] values){ |
| this.gsettings = gsettings; |
| this.gconftool = gconftool; |
| this.java = java; |
| this.type = type; |
| this.values = values; |
| } |
| } |
| |
| static boolean useGsettings; |
| static String tool; |
| Toolkit toolkit = Toolkit.getDefaultToolkit(); |
| String changedProperty; |
| Object changedValue; |
| Object lock = new Object(); |
| |
| /** |
| * Implementation of PropertyChangeListener method |
| */ |
| public void propertyChange(PropertyChangeEvent event) { |
| changedProperty = event.getPropertyName(); |
| changedValue = toolkit.getDesktopProperty(changedProperty); |
| System.out.println("Property "+changedProperty+" changed. Changed value: "+changedValue); |
| synchronized(lock) { |
| try { |
| lock.notifyAll(); |
| } catch (Exception e) { |
| } |
| } |
| } |
| |
| public static void main(String[] args) throws Exception { |
| useGsettings = System.getProperty("useGsettings").equals("true"); |
| tool = System.getProperty("tool"); |
| |
| String osName = System.getProperty("os.name"); |
| if (!"Linux".equals(osName) && !"SunOS".equals(osName)) |
| System.out.println("This test need not be run on this platform"); |
| else |
| new rfe4758438().doTest(); |
| } |
| |
| void doTest() throws Exception { |
| for (PROPS p : PROPS.values()) |
| toolkit.addPropertyChangeListener(p.java, this); |
| |
| for (PROPS p : PROPS.values()) { |
| Thread.sleep(1000); |
| doTest(p); |
| } |
| System.out.println("Test passed"); |
| } |
| |
| /** |
| * Do the test for each property. Find the current value |
| * of the property, set the property to a value not equal |
| * to the current value, check if the propertyChange event |
| * is triggered. Reset the property to the actual value. |
| */ |
| void doTest(PROPS property) throws Exception { |
| //Choose the test value which is not same as the current value |
| Object obj = toolkit.getDesktopProperty(property.java); |
| if (obj == null) |
| throw new RuntimeException("No such property available: " + property.java); |
| |
| //For boolean type values, getDesktopProperty method returns Integer objects |
| if (property.type.equals("bool")) { |
| if (obj.equals(new Integer(1))) { |
| obj = new String("true"); |
| } else { |
| obj = new String("false"); |
| } |
| } |
| Object value = property.values[0]; |
| if (obj.toString().equals(value)) { |
| value = property.values[1]; |
| } |
| |
| //Create the command to execute |
| StringBuffer sb = new StringBuffer(tool); |
| if (useGsettings) { |
| sb.append(" set "); |
| sb.append(property.gsettings); |
| sb.append(" "); |
| } else { |
| sb.append(" --set --type="); |
| sb.append(property.type); |
| sb.append(" "); |
| sb.append(property.gconftool); |
| sb.append(" "); |
| } |
| String tempCommand = sb.toString(); |
| sb.append(value.toString()); |
| |
| //Initialize the variables and execute the command |
| changedProperty = ""; |
| changedValue = null; |
| if (executeCommand(sb.toString()) != 0) |
| throw new RuntimeException("Could not execute the command"); |
| |
| synchronized(lock) { |
| try { |
| lock.wait(5000); |
| } catch (Exception e) { |
| } |
| } |
| if (property.type.equals("bool")) { |
| if (changedValue.equals(new Integer(1))) { |
| changedValue = new String("true"); |
| } else { |
| changedValue = new String("false"); |
| } |
| } |
| |
| //Check if the event got triggered |
| if (!changedProperty.equals(property.java)) { |
| //Reset the property |
| executeCommand(tempCommand + obj.toString()); |
| throw new RuntimeException("PropertyChangedEvent did not occur for " + property.java); |
| } else if (!changedValue.toString().equals(value.toString())) { |
| //Reset the property |
| executeCommand(tempCommand + obj.toString()); |
| throw new RuntimeException("New value of the property is different from " + |
| "the value supplied"); |
| } |
| |
| //Reset the property |
| executeCommand(tempCommand + obj.toString()); |
| } |
| |
| /** |
| * Uses the gconftool-2 command to change the value of the property. |
| * Gets the output of the command and prints the output |
| */ |
| int executeCommand(String command) throws Exception { |
| System.out.println("Executing " + command); |
| Process process = Runtime.getRuntime().exec(command); |
| |
| InputStream is = process.getInputStream(); |
| InputStream es = process.getErrorStream(); |
| StringBuilder stdout = new StringBuilder(); |
| StringBuilder stderr = new StringBuilder(); |
| |
| process.waitFor(); |
| |
| while (is.available() > 0) |
| stdout.append((char) is.read()); |
| |
| while (es.available() > 0) |
| stderr.append((char) es.read()); |
| |
| if (stdout.length() > 0) |
| System.out.println(stdout.toString()); |
| if (stderr.length() > 0) |
| System.err.println(stderr.toString()); |
| return process.exitValue(); |
| } |
| } |