Package javax.swing

Source Code of javax.swing.ThreadGetUIClass

/*
*  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.
*/
/**
* @author Sergey Burlak
* @version $Revision$
*/
package javax.swing;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Insets;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Hashtable;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Vector;
import javax.swing.border.Border;
import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.InputMapUIResource;
import javax.swing.plaf.basic.BasicLookAndFeel;

public class UIDefaultsTest extends SwingTestCase {
    UIDefaults uiDefaults;

    @Override
    public void setUp() throws Exception {
        super.setUp();
        uiDefaults = new UIDefaults();
    }

    @Override
    public void tearDown() throws Exception {
        uiDefaults = null;
        super.tearDown();
    }

    public void testGetBoolean() {
        uiDefaults.put("TRUE", Boolean.TRUE);
        assertEquals(1, uiDefaults.size());
        assertEquals(Boolean.TRUE.booleanValue(), uiDefaults.getBoolean("TRUE"));
        uiDefaults.put("TRUE", "a");
        uiDefaults.getBoolean("TRUE");
    }

    public void testGetInt() {
        Integer num = new Integer("10");
        uiDefaults.put("1", num);
        assertEquals(1, uiDefaults.size());
        assertEquals(num.intValue(), uiDefaults.getInt("1"));
        uiDefaults.put("1", "a");
        uiDefaults.getInt("1");
    }

    public void testGetString() {
        String str = "10";
        uiDefaults.put("string", str);
        assertEquals(1, uiDefaults.size());
        assertEquals(str, uiDefaults.getString("string"));
    }

    public void testGetIcon() {
        Icon ic = new Icon() {
            public int getIconHeight() {
                return 0;
            }

            public int getIconWidth() {
                return 0;
            }

            public void paintIcon(final Component c, final Graphics g, final int x, final int y) {
            }
        };
        uiDefaults.put("ic", ic);
        assertEquals(1, uiDefaults.size());
        assertEquals(ic, uiDefaults.getIcon("ic"));
    }

    public void testGetBorder() {
        Border b = new Border() {
            public void paintBorder(final Component c, final Graphics g, final int x,
                    final int y, final int w, final int h) {
            }

            public Insets getBorderInsets(final Component c) {
                return null;
            }

            public boolean isBorderOpaque() {
                return false;
            }
        };
        uiDefaults.put("b", b);
        assertEquals(1, uiDefaults.size());
        assertEquals(b, uiDefaults.getBorder("b"));
    }

    public void testGetInsets() {
        Insets ins = new Insets(0, 0, 0, 0);
        uiDefaults.put("ins", ins);
        assertEquals(1, uiDefaults.size());
        assertEquals(ins, uiDefaults.getInsets("ins"));
    }

    public void testGetFont() {
        Font f = new Font("Arial", Font.BOLD, 12);
        uiDefaults.put("f", f);
        assertEquals(1, uiDefaults.size());
        assertEquals(f, uiDefaults.getFont("f"));
    }

    public void testGetDimension() {
        Dimension dim = new Dimension();
        uiDefaults.put("d", dim);
        assertEquals(1, uiDefaults.size());
        assertEquals(dim, uiDefaults.getDimension("d"));
    }

    public void testGetColor() {
        Color c = Color.RED;
        uiDefaults.put("c", c);
        assertEquals(1, uiDefaults.size());
        assertEquals(c, uiDefaults.getColor("c"));
    }

    public void testProxyLazyValue() {
        uiDefaults.put("1", new UIDefaults.ProxyLazyValue("java.lang.String",
                new Object[] { "aaa" }));
        propertyChangeController = new PropertyChangeController();
        uiDefaults.addPropertyChangeListener(propertyChangeController);
        assertEquals(1, uiDefaults.size());
        assertEquals("aaa", uiDefaults.get("1"));
        assertEquals(1, uiDefaults.size());
        assertFalse(propertyChangeController.isChanged());
        uiDefaults.put("2", new UIDefaults.ProxyLazyValue("java.lang.String"));
        assertEquals(2, uiDefaults.size());
        assertEquals("aaa", uiDefaults.get("1"));
        assertEquals("", uiDefaults.get("2"));
        assertNull(uiDefaults.getIcon("2"));
        uiDefaults.put("3", new UIDefaults.ProxyLazyValue("java.lang.Integer", "decode",
                new String[] { "43" }));
        assertEquals(3, uiDefaults.size());
        assertEquals("aaa", uiDefaults.get("1"));
        assertEquals("", uiDefaults.get("2"));
        assertEquals(new Integer("43"), uiDefaults.get("3"));
        assertEquals(43, uiDefaults.getInt("3"));
        uiDefaults.put("4", new UIDefaults.ProxyLazyValue("java.lang.String", "toUpperCase"));
        assertEquals(4, uiDefaults.size());
        assertEquals("aaa", uiDefaults.get("1"));
        assertEquals("", uiDefaults.get("2"));
        assertEquals(new Integer("43"), uiDefaults.get("3"));
        assertNull(uiDefaults.get("4"));
    }

    public void testProxyLazyValueWithThreadClassLoader() throws Exception {
        // Regression test for HARMONY-3420

        final ClassLoader classLoader = new ArrayClassLoader();

        class ThreadGetUIClass extends Thread {
            private UIDefaults.ProxyLazyValue plv =
                    new UIDefaults.ProxyLazyValue("MyLabelUI");
            private Object result;

            public ThreadGetUIClass() {
                setContextClassLoader(classLoader);
            }

            public void run() {
                result = plv.createValue(null);
            }

            public Object getResult() {
                while (true) {
                    try {
                        join();
                        return result;
                    } catch (InterruptedException e) {
                        // Ignored.
                    }
                }
            }
        };

        ThreadGetUIClass thread = new ThreadGetUIClass();
        thread.start();
        Object result = thread.getResult();
        assertNotNull(result);
        assertEquals(result.getClass(), classLoader.loadClass("MyLabelUI"));
    }

    public void testGetUI() {
        setBasicLF();
        final String uiClassName = "javax.swing.plaf.basic.BasicButtonUI";
        uiDefaults.put("ButtonUI", uiClassName);
        assertNull(uiDefaults.get(uiClassName));
        JButton button = new JButton();
        assertTrue(uiDefaults.getUI(button).getClass().getName().equals(uiClassName));
        Object classObj = uiDefaults.get(uiClassName);
        assertNotNull(classObj);
        Object methodObj = uiDefaults.get(classObj);
        assertNotNull(methodObj);
    }

    public void testGetUIWithClassLoader() throws Exception {
        // Regression test for HARMONY-3385

        uiDefaults.put("LabelUI", "MyLabelUI");
        Class<? extends JComponent> cls = (Class<? extends JComponent>)
                new ArrayClassLoader().loadClass("MyJLabel");
        JComponent component = cls.newInstance();
        assertNotNull(uiDefaults.getUI(component));
    }

    public void testGetUIClass() throws ClassNotFoundException {
        setBasicLF();
        final String uiClassName = "javax.swing.plaf.basic.BasicButtonUI";
        uiDefaults.put("ButtonUI", uiClassName);
        assertEquals(Class.forName(uiClassName), uiDefaults.getUIClass("ButtonUI"));
    }

    public void testGetUIClassWithClassLoader() throws Exception {
        setBasicLF();
        final String uiClassName = "javax.swing.plaf.basic.BasicButtonUI";
        uiDefaults.put("ButtonUI", uiClassName);
        assertEquals(Class.forName(uiClassName), uiDefaults.getUIClass("ButtonUI", null));
        AccessController.doPrivileged(new PrivilegedAction<Object>() {
            public Object run() {
                try {
                    assertEquals(Class.forName(uiClassName), uiDefaults.getUIClass("ButtonUI",
                            new URLClassLoader(new URL[0])));
                } catch (ClassNotFoundException e) {
                }
                return null;
            }
        });
    }

    public void testGetUIClassWithThreadClassLoader() throws Exception {
        // Regression test for HARMONY-3398

        final ClassLoader classLoader = new ArrayClassLoader();

        class ThreadGetUIClass extends Thread {
            private UIDefaults uid = new UIDefaults(
                    new Object[] { "LabelUI", "MyLabelUI" });
            private Class result;

            public ThreadGetUIClass() {
                setContextClassLoader(classLoader);
            }

            public void run() {
                result = uid.getUIClass("LabelUI");
            }

            public Class getResult() {
                while (true) {
                    try {
                        join();
                        return result;
                    } catch (InterruptedException e) {
                        // Ignored.
                    }
                }
            }
        };

        ThreadGetUIClass thread = new ThreadGetUIClass();
        thread.start();
        Class result = thread.getResult();
        assertNotNull(result);
        assertEquals(result, classLoader.loadClass("MyLabelUI"));
    }

    public void testGetValueFromResourceBundle() {
        String bundleName = "javax.swing.TestBundle";
        assertNull(uiDefaults.get("OptionPane.okButtonText"));
        propertyChangeController = new PropertyChangeController();
        uiDefaults.addPropertyChangeListener(propertyChangeController);
        uiDefaults.addResourceBundle(bundleName);
        assertFalse(propertyChangeController.isChanged());
        ResourceBundle bundle = ResourceBundle.getBundle(bundleName);
        assertEquals(bundle.getString("OptionPane.okButtonText"), uiDefaults
                .get("OptionPane.okButtonText"));
        propertyChangeController.reset();
        uiDefaults.removeResourceBundle(bundleName);
        assertFalse(propertyChangeController.isChanged());
    }

    public void testInputMap() {
        uiDefaults.put("1", new UIDefaults.LazyInputMap(new Object[] { "1", "11", "2", "22",
                "3", "33", "4", "44" }));
        assertTrue(uiDefaults.get("1") instanceof InputMapUIResource);
        InputMapUIResource map = (InputMapUIResource) uiDefaults.get("1");
        assertEquals(4, map.allKeys().length);
    }

    public void testCreateUIDefaultsTable() {
        assertEquals(0, uiDefaults.size());
        UIDefaults uid = new UIDefaults(new Object[] { "1", "1v", "2", "2v", "3", "3v", "4",
                "4v" });
        assertEquals(4, uid.size());
        assertEquals("1v", uid.get("1"));
        assertEquals("3v", uid.getString("3"));
        uiDefaults.put("key", null);
        assertNull(uiDefaults.get("key"));
    }

    public void testErrorGetUI() {
        final PrintStream orig = System.err;
        final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        final PrintStream errStream = new PrintStream(byteStream);
        AccessController.doPrivileged(new PrivilegedAction<Object>() {
            public Object run() {
                System.setErr(errStream);
                return null;
            }
        });
        uiDefaults.put("ButtonUI", "plaf.windows.WWWWWinButtonUI");
        JButton button = new JButton();
        uiDefaults.getUI(button);
        String error = byteStream.toString();
        assertTrue(error.indexOf("failed") > 0);
        AccessController.doPrivileged(new PrivilegedAction<Object>() {
            public Object run() {
                System.setErr(orig);
                return null;
            }
        });
    }

    public void testLocale() {
        assertTrue(uiDefaults.getDefaultLocale() == Locale.getDefault());
        propertyChangeController = new PropertyChangeController();
        uiDefaults.addPropertyChangeListener(propertyChangeController);
        uiDefaults.setDefaultLocale(Locale.UK);
        assertFalse(propertyChangeController.isChanged());
        String bundleName = "javax.swing.TestBundle";
        assertNull(uiDefaults.get("OptionPane.titleText"));
        uiDefaults.addResourceBundle(bundleName);
        assertEquals(ResourceBundle.getBundle(bundleName, Locale.GERMAN).getString(
                "OptionPane.titleText"), uiDefaults.getString("OptionPane.titleText",
                Locale.GERMAN));
        assertEquals(ResourceBundle.getBundle(bundleName, Locale.ITALIAN).getString(
                "OptionPane.titleText"), uiDefaults.getString("OptionPane.titleText",
                Locale.ITALIAN));
        assertEquals(ResourceBundle.getBundle(bundleName, Locale.KOREAN).getString(
                "OptionPane.titleText"), uiDefaults.getString("OptionPane.titleText",
                Locale.KOREAN));
    }

    public void testPropertyListeners() {
        final List<Object> count = new Vector<Object>();
        PropertyChangeListener listener = new PropertyChangeListener() {
            public void propertyChange(final PropertyChangeEvent pce) {
                count.add(new Object());
            }
        };
        uiDefaults.put("1", "1v");
        assertEquals(0, uiDefaults.getPropertyChangeListeners().length);
        uiDefaults.addPropertyChangeListener(listener);
        assertEquals(1, uiDefaults.getPropertyChangeListeners().length);
        assertEquals(0, count.size());
        uiDefaults.put("2", "2v");
        assertEquals(1, count.size());
        uiDefaults.put("2", "2v");
        assertEquals(1, count.size());
        uiDefaults.removePropertyChangeListener(listener);
        assertEquals(0, uiDefaults.getPropertyChangeListeners().length);
    }

    public void testPutDefaultsChangeEvent() {
        propertyChangeController = new PropertyChangeController();
        uiDefaults.addPropertyChangeListener(propertyChangeController);
        uiDefaults.putDefaults(new Object[] { "1", "11", "2", "22", "3", "33", "4", "44" });
        assertTrue(propertyChangeController.isChanged("UIDefaults"));
    }

    public void testCreateProxyLazyValueWithUIResourceAsParameter() {
        uiDefaults.put("1", new UIDefaults.ProxyLazyValue(
                "javax.swing.plaf.BorderUIResource$LineBorderUIResource",
                new Object[] { new ColorUIResource(255, 255, 0) }));
        assertEquals(1, uiDefaults.size());
        assertNotNull(uiDefaults.get("1"));
        assertTrue(uiDefaults.get("1") instanceof Border);
    }

    public void testPut() throws Exception {
        propertyChangeController = new PropertyChangeController();
        uiDefaults.addPropertyChangeListener(propertyChangeController);
        assertNull(uiDefaults.put("1", "val1"));
        assertEquals(1, uiDefaults.size());
        assertTrue(propertyChangeController.isChanged("1"));
        propertyChangeController.reset();
        assertNull(uiDefaults.put("2", "val2"));
        assertEquals(2, uiDefaults.size());
        assertTrue(propertyChangeController.isChanged("2"));
        propertyChangeController.reset();
        assertEquals("val2", uiDefaults.put("2", "val2"));
        assertEquals(2, uiDefaults.size());
        assertFalse(propertyChangeController.isChanged("2"));
        propertyChangeController.reset();
        assertEquals("val2", uiDefaults.put("2", null));
        assertTrue(propertyChangeController.isChanged("2"));
        assertEquals(1, uiDefaults.size());
        propertyChangeController.reset();
        uiDefaults.put("nokey", null);
        assertTrue(propertyChangeController.isChanged("nokey"));
        assertEquals(1, uiDefaults.size());
    }

    private void setBasicLF() {
        try {
            UIManager.setLookAndFeel(new BasicLookAndFeel() {
                private static final long serialVersionUID = 1L;

                @Override
                public boolean isNativeLookAndFeel() {
                    return true;
                }

                @Override
                public boolean isSupportedLookAndFeel() {
                    return true;
                }

                @Override
                public String getDescription() {
                    return null;
                }

                @Override
                public String getID() {
                    return null;
                }

                @Override
                public String getName() {
                    return null;
                }
            });
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
    }

    /**
     * Special classloader for classloader-based tests.
     */
    private static class ArrayClassLoader extends ClassLoader {

        private static Hashtable<String, byte[]> table =
                new Hashtable<String, byte[]>();

        static {
            table.put("MyJLabel", new byte[] {
                /*
                 * public class MyJLabel extends JLabel {
                 *     public String getUIClassID() {
                 *         return "LabelUI";
                 *     }
                 * }
                 */
                -54, -2, -70, -66, 0, 0, 0, 49, 0, 17, 10, 0, 4, 0, 13, 8,
                0, 14, 7, 0, 15, 7, 0, 16, 1, 0, 6, 60, 105, 110, 105, 116,
                62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100, 101, 1, 0,
                15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97,
                98, 108, 101, 1, 0, 12, 103, 101, 116, 85, 73, 67, 108, 97,
                115, 115, 73, 68, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97,
                47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59,
                1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1,
                0, 13, 77, 121, 74, 76, 97, 98, 101, 108, 46, 106, 97, 118,
                97, 12, 0, 5, 0, 6, 1, 0, 7, 76, 97, 98, 101, 108, 85, 73,
                1, 0, 8, 77, 121, 74, 76, 97, 98, 101, 108, 1, 0, 18, 106,
                97, 118, 97, 120, 47, 115, 119, 105, 110, 103, 47, 74, 76,
                97, 98, 101, 108, 0, 33, 0, 3, 0, 4, 0, 0, 0, 0, 0, 2, 0,
                1, 0, 5, 0, 6, 0, 1, 0, 7, 0, 0, 0, 29, 0, 1, 0, 1, 0, 0,
                0, 5, 42, -73, 0, 1, -79, 0, 0, 0, 1, 0, 8, 0, 0, 0, 6, 0,
                1, 0, 0, 0, 3, 0, 1, 0, 9, 0, 10, 0, 1, 0, 7, 0, 0, 0, 27,
                0, 1, 0, 1, 0, 0, 0, 3, 18, 2, -80, 0, 0, 0, 1, 0, 8, 0, 0,
                0, 6, 0, 1, 0, 0, 0, 5, 0, 1, 0, 11, 0, 0, 0, 2, 0, 12 });

            table.put("MyLabelUI", new byte[] {
                /*
                 * public class MyLabelUI extends LabelUI {
                 *     public static ComponentUI createUI(JComponent c) {
                 *         return new MyLabelUI();
                 *     }
                 * }
                 */
                -54, -2, -70, -66, 0, 0, 0, 49, 0, 16, 10, 0, 4, 0, 13, 7,
                0, 14, 10, 0, 2, 0, 13, 7, 0, 15, 1, 0, 6, 60, 105, 110,
                105, 116, 62, 1, 0, 3, 40, 41, 86, 1, 0, 4, 67, 111, 100,
                101, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101,
                114, 84, 97, 98, 108, 101, 1, 0, 8, 99, 114, 101, 97, 116,
                101, 85, 73, 1, 0, 56, 40, 76, 106, 97, 118, 97, 120, 47,
                115, 119, 105, 110, 103, 47, 74, 67, 111, 109, 112, 111,
                110, 101, 110, 116, 59, 41, 76, 106, 97, 118, 97, 120, 47,
                115, 119, 105, 110, 103, 47, 112, 108, 97, 102, 47, 67,
                111, 109, 112, 111, 110, 101, 110, 116, 85, 73, 59, 1, 0,
                10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0,
                14, 77, 121, 76, 97, 98, 101, 108, 85, 73, 46, 106, 97,
                118, 97, 12, 0, 5, 0, 6, 1, 0, 9, 77, 121, 76, 97, 98, 101,
                108, 85, 73, 1, 0, 24, 106, 97, 118, 97, 120, 47, 115, 119,
                105, 110, 103, 47, 112, 108, 97, 102, 47, 76, 97, 98, 101,
                108, 85, 73, 0, 33, 0, 2, 0, 4, 0, 0, 0, 0, 0, 2, 0, 1, 0,
                5, 0, 6, 0, 1, 0, 7, 0, 0, 0, 29, 0, 1, 0, 1, 0, 0, 0, 5,
                42, -73, 0, 1, -79, 0, 0, 0, 1, 0, 8, 0, 0, 0, 6, 0, 1, 0,
                0, 0, 5, 0, 9, 0, 9, 0, 10, 0, 1, 0, 7, 0, 0, 0, 32, 0, 2,
                0, 1, 0, 0, 0, 8, -69, 0, 2, 89, -73, 0, 3, -80, 0, 0, 0,
                1, 0, 8, 0, 0, 0, 6, 0, 1, 0, 0, 0, 7, 0, 1, 0, 11, 0, 0,
                0, 2, 0, 12 });
            }

        protected Class findClass(String name) throws ClassNotFoundException {
            byte[] bytes = table.get(name);

            if (bytes == null) {
                throw new ClassNotFoundException(name);
            }
            return defineClass(name, bytes, 0, bytes.length);
        }
    }
}
TOP

Related Classes of javax.swing.ThreadGetUIClass

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.