/**************************************************************
 *
 * 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 oooapplet;

import java.lang.reflect.Method;
import java.lang.reflect.Array;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import com.sun.star.comp.beans.*;
import java.applet.Applet;
import java.awt.Graphics;
import java.util.*;

public class OOoViewer extends Applet {

    private OOoBean oBean;

    static private CustomURLClassLoader m_loader;

    Object  m_objBean;

    public void init() {
        try {
            if (m_loader == null) {
                String s = getParameter("office");
                System.out.println("sun.awt.noxembed: " + System.getProperty("sun.awt.noxembed"));
                System.setProperty("sun.awt.xembedserver", "true");

                File f = new File(s);
                URL url = f.toURL();
                String officeURL = url.toString();
                URL[] arURL = new URL[] {
                    new URL(officeURL + "/program/classes/officebean.jar"),
                    new URL(officeURL + "/program/classes/jurt.jar"),
                    new URL(officeURL + "/program/classes/ridl.jar"),
                    new URL(officeURL + "/program/classes/unoil.jar"),
                    new URL(officeURL + "/program/classes/java_uno.jar"),
                    new URL(officeURL + "/program/classes/juh.jar")
                };
                m_loader = new CustomURLClassLoader(arURL);
                File fileProg = new File(s + "/program");
                m_loader.addResourcePath(fileProg.toURL());
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    public void start() {
        try {
        Class beanClass = m_loader.loadClass("com.sun.star.comp.beans.OOoBean");
        m_objBean = beanClass.newInstance();
        setLayout(new BorderLayout());
        add((java.awt.Container)m_objBean, BorderLayout.CENTER);
        setVisible(true);
        //this does not work here. Why?
//        Class arPropValClass = m_loader.loadClass("[Lcom.sun.star.beans.PropertyValue;");
        Object arProp = Array.newInstance(
            m_loader.loadClass("com.sun.star.beans.PropertyValue"), 1);
        Class clazz = arProp.getClass();

        Method methLoad = beanClass.getMethod(
            "loadFromURL", new Class[] {
                String.class, arProp.getClass() });

        methLoad.invoke(m_objBean, new Object[] {"private:factory/swriter", null});
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassCastException e) {
            e.printStackTrace();
        } catch (java.lang.reflect.InvocationTargetException e) {
            e.printStackTrace();
        } catch (java.lang.NoSuchMethodException e) {
            e.printStackTrace();        }



        validate();
    }

    public void stop() {
        try {
            Method methStop = m_objBean.getClass().getMethod(
                "stopOOoConnection", new Class[0]);
            methStop.invoke(m_objBean, null);
        } catch (java.lang.NoSuchMethodException e) {
            e.printStackTrace();
        } catch (java.lang.IllegalAccessException e) {
            e.printStackTrace();
        }
         catch (java.lang.reflect.InvocationTargetException e) {
            e.printStackTrace();
         }

    }

    public void destroy() {
    }

    public void paint(Graphics g) {
    }
}


final class CustomURLClassLoader extends URLClassLoader {

    private Vector resourcePaths;

    public CustomURLClassLoader( URL[] urls ) {
        super( urls );
    }

    protected Class findClass( String name ) throws ClassNotFoundException {
        // This is only called via this.loadClass -> super.loadClass ->
        // this.findClass, after this.loadClass has already called
        // super.findClass, so no need to call super.findClass again:
        throw new ClassNotFoundException( name );
//        return super.findClass(name);
    }



    protected Class loadClass( String name, boolean resolve )
        throws ClassNotFoundException
    {
        Class c = findLoadedClass( name );
        if ( c == null ) {
            try {
                c = super.findClass( name );
            } catch ( ClassNotFoundException e ) {
                return super.loadClass( name, resolve );
            } catch ( SecurityException e ) {
                // A SecurityException "Prohibited package name: java.lang"
                // may occur when the user added the JVM's rt.jar to the
                // java.class.path:
                return super.loadClass( name, resolve );
            }
        }
        if ( resolve ) {
            resolveClass( c );
        }
        return c;
    }

    public void addResourcePath(URL rurl) {
        if (resourcePaths == null) resourcePaths = new Vector();
        resourcePaths.add(rurl);
    }

    public URL getResource(String name) {
        if (resourcePaths == null) return null;

        URL result = super.getResource(name);
        if (result != null) {
            return result;
        }

        URL u = null;
        URI uri = null;
        for (Enumeration e = resourcePaths.elements(); e.hasMoreElements();) {
            u = (URL)e.nextElement();
            if (u.getProtocol().startsWith("file")){
                try {
                    File f1 = new File(u.getPath());
                    File f2 = new File(f1, name);
                    if (f2.exists()) {
                        return new URL(f2.toURI().toASCIIString());
                    }
                } catch (MalformedURLException e1) {
                    System.err.println("malformed url: "+e1.getMessage());
                    continue;
                }
            }
        }
        return null;
    }

}
