/*
 *        JacORB - a free Java ORB
 *
 *   Copyright (C) 1999-2004 Gerald Brose
 *
 *   This library is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU Library General Public
 *   License as published by the Free Software Foundation; either
 *   version 2 of the License, or (at your option) any later version.
 *
 *   This library 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
 *   Library General Public License for more details.
 *
 *   You should have received a copy of the GNU Library General Public
 *   License along with this library; if not, write to the Free
 *   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */
package org.jacorb.ir.gui.remoteobject;

import org.jacorb.ir.gui.typesystem.AbstractContainer;
import org.jacorb.ir.gui.typesystem.Interface;
import org.jacorb.ir.gui.typesystem.ModelParticipant;
import org.jacorb.ir.gui.typesystem.TypeSystemNode;
import org.jacorb.ir.gui.typesystem.remote.IRAttribute;
import org.jacorb.ir.gui.typesystem.remote.IRNode;
import org.jacorb.ir.gui.typesystem.remote.IROperation;
import org.jacorb.ir.gui.typesystem.remote.IRParameter;
import org.omg.CORBA.Any;
import org.omg.CORBA.ParameterMode;
import org.omg.CORBA.Request;
/**
 * This class was generated by a SmartGuide.
 *
 */
public class RemoteObject
    extends ObjectRepresentant implements AbstractContainer
{


    /**
     * This method was created by a SmartGuide.
     * @param counterPart java.lang.Object
     */
    protected RemoteObject (org.omg.CORBA.Object counterPart,
                            TypeSystemNode type, String name)
    {
    super(counterPart,type,name);

}
    /**
     * Für alle Attributes erzeuge ObjectRepresentants und gebe sie zurück
     * @return ModelParticipant[]
     */
    public ModelParticipant[] contents() {
    if (counterPart!=null) {
            IRAttribute[] allFields = (IRAttribute[])((Interface)this.typeSystemNode).getAllFields();
            ObjectRepresentant[] result = new ObjectRepresentant[allFields.length];
            for (int i=0; i<allFields.length; i++) {
                Request request = ((org.omg.CORBA.Object)counterPart)._request("_get_"+allFields[i].getName());
                IRNode associatedNode = (IRNode)allFields[i].getAssociatedTypeSystemNode();
                request.set_return_type(associatedNode.getTypeCode());	// was ist mit Alias-Typen?
                try {
                    request.invoke();
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
                Any any = request.return_value();
                if (any!=null) {
                    result[i] = ObjectRepresentantFactory.create(
                                                                 ObjectRepresentantFactory.objectFromAny(any),
                                                                 allFields[i].getAssociatedTypeSystemNode(),
                                                                 allFields[i]);
                }
                else {
                    result[i] = ObjectRepresentantFactory.create(null, allFields[i].getAssociatedTypeSystemNode(),allFields[i]);
                }
            }
            return result;
    }	// if (counterPart!=null)
    else {
            return new ModelParticipant[0];
    }
    }
    /**
     * This method was created by a SmartGuide.
     * @return java.lang.Object
     * @param op org.jacorb.ir;.gui.typesystem.remote.IROperation
     * @param params java.lang.String[]
     */
    public java.lang.Object invokeOperation(IROperation op, String[] params) {
    ModelParticipant[] irParams = op.contents();
    Request request =  ((org.omg.CORBA.Object)counterPart)._request(op.getName());
    IRNode associatedNode = (IRNode)op.getAssociatedTypeSystemNode();
    request.set_return_type(associatedNode.getTypeCode());	// was ist mit Alias-Typen?
    for (int i=0; i<irParams.length; i++) {
            IRParameter irParam = (IRParameter)irParams[i];
            switch (irParam.getMode().value()) {
            case ParameterMode._PARAM_IN:
                ObjectRepresentantFactory.insertFromString(request.add_in_arg(),params[i],irParam.getTypeCode().kind());
                break;
            case ParameterMode._PARAM_OUT:
                ObjectRepresentantFactory.insertFromString(request.add_out_arg(),params[i],irParam.getTypeCode().kind());
                break;
            case ParameterMode._PARAM_INOUT:
                ObjectRepresentantFactory.insertFromString(request.add_inout_arg(),params[i],irParam.getTypeCode().kind());
                break;
            }
    }
    request.invoke();
    Any any = request.return_value();
    if (any!=null) {
            return ObjectRepresentantFactory.objectFromAny(any);
    }
    return null;
    }
}











