/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2000, 2010 Oracle and/or its affiliates.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org 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 Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/
package com.sun.star.cmp;

import com.sun.star.io.XPersistObject;
import com.sun.star.io.XObjectInputStream;
import com.sun.star.io.XObjectOutputStream;
import com.sun.star.beans.XPropertySet;
import com.sun.star.beans.XPropertySetInfo;
import com.sun.star.beans.Property;
import com.sun.star.beans.XPropertyChangeListener;
import com.sun.star.beans.XVetoableChangeListener;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XSingleServiceFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.uno.XInterface;
import com.sun.star.lang.XTypeProvider;
import com.sun.star.registry.XRegistryKey;
import com.sun.star.comp.loader.FactoryHelper;
import com.sun.star.uno.Type;

/**
 * Class MyPersistObject implements an XPersistObject, XServiceInfo,
 * XTypeProvider and XPropertySet.
 *
 * Warning: In XPropertySet only the following methods that are
 *          used for testing are really implemented:
 *
 *          - public XPropertySetInfo getPropertySetInfo()
 *          - public void setPropertyValue(String property, Object value)
 *          - public Object getPropertyValue(String property)
 */
public class MyPersistObject implements XPersistObject, XTypeProvider,
                                                XServiceInfo, XPropertySet {

    private class MyPropertySetInfo implements XPropertySetInfo {
        Property[] _props;
        public MyPropertySetInfo(Property[] props) {
            _props = props;
        }
        public Property[] getProperties() {
            return _props;
        }
        public Property getPropertyByName(String name) {
            int i = getPropertyIndexByName(name);
            return i>0?_props[i]:null;
        }
        public int getPropertyIndexByName(String name) {
            for ( int i=0; i<_props.length; i++ )
                if (name.equals(_props[i].Name))
                    return i;
            return -1;
        }
        public boolean hasPropertyByName(String name) {
            int i = getPropertyIndexByName(name);
            return i>0?true:false;
        }
    }

    static private final boolean verbose = false;

    static public final String __serviceName =
                                        "com.sun.star.cmp.PersistObject";
    static public final String __implName =
                                        "com.sun.star.cmp.MyPersistObject";

    // lots of props to write
    Property[] props;
    private byte by;
    private int i;
    private char c;
    private double d;
    private float f;
    private short s;
    private String st;
    // property set info
    XPropertySetInfo xInfo;

    /**
     * Constructor: sets all properties
     **/
    public MyPersistObject() {
        int prop_count = 7;
        props = new Property[prop_count];
        for (int i=0; i<prop_count; i++ ) {
            props[i] = new Property();
        }
        by = 1;
        props[0].Name = "byte";
        i = 3;
        props[1].Name = "int";
        c = 'c';
        props[2].Name = "char";
        d = 3.142;
        props[3].Name = "double";
        f = 2.718f;
        props[4].Name = "float";
        s = 1;
        props[5].Name = "short";
        st = "Though this be madness, yet there is method in 't.";
        props[6].Name = "String";
        xInfo = new MyPropertySetInfo(props);
    }
    /**
     * This function provides the service name
     * @return the service name
     * @see com.sun.star.io.XPersistObject
     */
    public String getServiceName() {
        if ( verbose ) {
            System.out.println("get service name");
        }
        return __serviceName;
    }

    /**
     * Fuction reads properties from this input stream
     * @param inStream the input stream
     * @see com.sun.star.io.XPersistObject
     */
    public void read(XObjectInputStream inStream)
                            throws com.sun.star.io.IOException {
        s = inStream.readShort();
        i = inStream.readLong();
        by = inStream.readByte();
        c = inStream.readChar();
        d = inStream.readDouble();
        f = inStream.readFloat();
        st = inStream.readUTF();
        if ( verbose )
            System.out.println("read called" + s + " " + i + " " + st);
    }

    /**
     * Fuction writes properties on this output stream
     * @param outStream the output stream
     * @see com.sun.star.io.XPersistObject
     */
    public void write(XObjectOutputStream outStream)
                            throws com.sun.star.io.IOException {
        if ( verbose )
            System.out.println("write called");
        outStream.writeShort(s);
        outStream.writeLong(i);
        outStream.writeByte(by);
        outStream.writeChar(c);
        outStream.writeDouble(d);
        outStream.writeFloat(f);
        outStream.writeUTF(st);

    }


    /**
     * Fuction to get information about the property set.
     * @return The information
     * @see com.sun.star.io.XPropertySet
     */
    public XPropertySetInfo getPropertySetInfo() {
        return xInfo;
    }

    /**
     * Set a property value
     * @param property The name of the property.
     * @param value The new value of the property.
     * @see com.sun.star.io.XPropertySet
     */
    public void setPropertyValue(String property, Object value) {
        if ( property.equals(props[0].Name))
            by = ((Byte)value).byteValue();
        if ( property.equals(props[1].Name))
            i = ((Integer)value).intValue();
        if ( property.equals(props[2].Name))
            c = ((Character)value).charValue();
        if ( property.equals(props[3].Name))
            d = ((Double)value).doubleValue();
        if ( property.equals(props[4].Name))
            f = ((Float)value).floatValue();
        if ( property.equals(props[5].Name))
            s = ((Short)value).shortValue();
        if ( property.equals(props[6].Name))
            st = (String)value;
    }

    /**
     * Get a property value
     * @param property The property name.
     * @return The value of the property.
     * @see com.sun.star.io.XPropertySet
     */
    public Object getPropertyValue(String property) {
        if ( property.equals(props[0].Name))
            return new Byte(by);
        if ( property.equals(props[1].Name))
            return new Integer(i);
        if ( property.equals(props[2].Name))
            return new Character(c);
        if ( property.equals(props[3].Name))
            return new Double(d);
        if ( property.equals(props[4].Name))
            return new Float(f);
        if ( property.equals(props[5].Name))
            return new Short(s);
        if ( property.equals(props[6].Name))
            return st;
        return new Object();
    }

    /**
     * Empty implementation: not needed for tests.
     */
    public void addPropertyChangeListener(String aPropertyName,
             XPropertyChangeListener xListener ) {}

    /**
     * Empty implementation: not needed for tests.
     */
    public void removePropertyChangeListener(String aPropertyName,
             XPropertyChangeListener aListener ) {}

    /**
     * Empty implementation: not needed for tests.
     */
    public void addVetoableChangeListener(String PropertyName,
             XVetoableChangeListener aListener ) {}

    /**
     * Empty implementation: not needed for tests.
     */
    public void removeVetoableChangeListener(String PropertyName,
             XVetoableChangeListener aListener ) {}

    /**
     * Get all implemented types of this class.
     * @return An array of implemented interface types.
     * @see com.sun.star.lang.XTypeProvider
     */
    public Type[] getTypes() {
        Type[] type = new Type[5];
        type[0] = new Type(XInterface.class);
        type[1] = new Type(XTypeProvider.class);
        type[2] = new Type(XPersistObject.class);
        type[3] = new Type(XServiceInfo.class);
        type[4] = new Type(XPropertySet.class);
        return type;
    }

    /**
     * Get the implementation id.
     * @return An empty implementation id.
     * @see com.sun.star.lang.XTypeProvider
     */
    public byte[] getImplementationId() {
        return new byte[0];
    }
    /**
     * Function for reading the implementation name.
     *
     * @return the implementation name
     * @see com.sun.star.lang.XServiceInfo
     */
    public String getImplementationName() {
        return __implName;
    }

    /**
     * Does the implementation support this service?
     *
     * @param serviceName The name of the service in question
     * @return true, if service is supported, false otherwise
     * @see com.sun.star.lang.XServiceInfo
     */
    public boolean supportsService(String serviceName) {
        if(serviceName.equals(__serviceName))
            return true;
        return false;
    }

    /**
     * Function for reading all supported services
     *
     * @return An aaray with all supported service names
     * @see com.sun.star.lang.XServiceInfo
     */
    public String[] getSupportedServiceNames() {
        String[] supServiceNames = {__serviceName};
        return supServiceNames;
    }

   /**
   *
   * Gives a factory for creating the service.
   * This method is called by the <code>JavaLoader</code>
   * <p>
   * @return  returns a <code>XSingleServiceFactory</code> for creating the component
   * @param   implName     the name of the implementation for which a service is desired
   * @param   multiFactory the service manager to be used if needed
   * @param   regKey       the registryKey
   * @see                  com.sun.star.comp.loader.JavaLoader
   */
    public static XSingleServiceFactory __getServiceFactory(String implName,
                    XMultiServiceFactory multiFactory, XRegistryKey regKey)
    {
        XSingleServiceFactory xSingleServiceFactory = null;

        if (implName.equals(MyPersistObject.class.getName()))
            xSingleServiceFactory = FactoryHelper.getServiceFactory(
                MyPersistObject.class, __serviceName, multiFactory, regKey);

        return xSingleServiceFactory;
    }

  /**
   * Writes the service information into the given registry key.
   * This method is called by the <code>JavaLoader</code>
   * <p>
   * @return  returns true if the operation succeeded
   * @param   regKey       the registryKey
   * @see                  com.sun.star.comp.loader.JavaLoader
   */
    public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) {
        return FactoryHelper.writeRegistryServiceInfo(MyPersistObject.class.getName(),
        __serviceName, regKey);
    }




}   // finish class MyPersistObject


