예제 #1
0
파일: OpDecl.java 프로젝트: aabykov/JacORB
  /** Writes the Stream-based Body of the Method for the stub */
  public void printStreamBody(
      PrintWriter ps, String classname, String idl_name, boolean is_local, boolean is_abstract) {
    ps.println("\t\twhile(true)");
    ps.println("\t\t{");
    // remote part, not for locality constrained objects
    //
    if (!is_local) {
      ps.println("\t\t\tif(! this._is_local())");
      ps.println("\t\t\t{");
      ps.println("\t\t\t\torg.omg.CORBA.portable.InputStream _is = null;");
      ps.println("\t\t\t\torg.omg.CORBA.portable.OutputStream _os = null;");
      ps.println("\t\t\t\ttry");
      ps.println("\t\t\t\t{");
      ps.print("\t\t\t\t\t_os = _request( \"" + idl_name + "\",");

      if (opAttribute == NO_ATTRIBUTE) ps.println(" true);");
      else ps.println(" false);");

      //  arguments..

      for (Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) {
        ParamDecl p = ((ParamDecl) e.nextElement());
        if (p.paramAttribute != ParamDecl.MODE_OUT)
          ps.println("\t\t\t\t\t" + p.printWriteStatement("_os"));
      }

      ps.println("\t\t\t\t\t_is = _invoke(_os);");

      if (opAttribute == 0 && !(opTypeSpec.typeSpec() instanceof VoidTypeSpec)) {
        ps.println(
            "\t\t\t\t\t"
                + opTypeSpec.toString()
                + " _result = "
                + opTypeSpec.typeSpec().printReadExpression("_is")
                + ";");
      }

      for (Enumeration e2 = paramDecls.elements(); e2.hasMoreElements(); ) {
        ParamDecl p = (ParamDecl) e2.nextElement();
        if (p.paramAttribute != ParamDecl.MODE_IN) {
          ps.println(
              "\t\t\t\t\t"
                  + p.simple_declarator
                  + ".value = "
                  + p.printReadExpression("_is")
                  + ";");
        }
      }

      if (opAttribute == NO_ATTRIBUTE && !(opTypeSpec.typeSpec() instanceof VoidTypeSpec)) {
        ps.println("\t\t\t\t\treturn _result;");
      } else ps.println("\t\t\t\t\treturn;");

      /* catch exceptions */

      ps.println("\t\t\t\t}");
      ps.println("\t\t\t\tcatch( org.omg.CORBA.portable.RemarshalException _rx )");
      ps.println("\t\t\t\t\t{");
      ps.println("\t\t\t\t\t\tcontinue;");
      ps.println("\t\t\t\t\t}");
      ps.println("\t\t\t\tcatch( org.omg.CORBA.portable.ApplicationException _ax )");
      ps.println("\t\t\t\t{");
      ps.println("\t\t\t\t\tString _id = _ax.getId();");

      if (!raisesExpr.empty()) {
        String[] exceptIds = raisesExpr.getExceptionIds();
        String[] classNames = raisesExpr.getExceptionClassNames();

        ps.println("\t\t\t\t\ttry");
        ps.println("\t\t\t\t\t{");

        for (int i = 0; i < exceptIds.length; i++) {
          ps.println("\t\t\t\t\t\tif( _id.equals(\"" + exceptIds[i] + "\"))");
          ps.println("\t\t\t\t\t\t{");
          ps.println("\t\t\t\t\t\t\tthrow " + classNames[i] + "Helper.read(_ax.getInputStream());");
          ps.println("\t\t\t\t\t\t}");
          ps.println("\t\t\t\t\t\telse ");
        }
        ps.println("\t\t\t\t\t\t{");
        ps.println("\t\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );");
        ps.println("\t\t\t\t\t\t}");
        ps.println("\t\t\t\t\t}");
        ps.println("\t\t\t\t\tfinally");
        ps.println("\t\t\t\t\t{");
        ps.println("\t\t\t\t\t\ttry");
        ps.println("\t\t\t\t\t\t{");
        ps.println("\t\t\t\t\t\t\t_ax.getInputStream().close();");
        ps.println("\t\t\t\t\t\t}");
        ps.println("\t\t\t\t\t\tcatch (java.io.IOException e)");
        ps.println("\t\t\t\t\t\t{");
        ps.println(
            "\t\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );");
        ps.println("\t\t\t\t\t\t}");
        ps.println("\t\t\t\t\t}");
      } else {
        ps.println("\t\t\t\t\ttry");
        ps.println("\t\t\t\t\t{");
        ps.println("\t\t\t\t\t\t\t_ax.getInputStream().close();");
        ps.println("\t\t\t\t\t}");
        ps.println("\t\t\t\t\tcatch (java.io.IOException e)");
        ps.println("\t\t\t\t\t{");
        ps.println(
            "\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );");
        ps.println("\t\t\t\t\t}");
        ps.println("\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + _id );");
      }
      ps.println("\t\t\t}");
      ps.println("\t\t\tfinally");
      ps.println("\t\t\t{");
      ps.println("\t\t\t\tif (_os != null)");
      ps.println("\t\t\t\t{");
      ps.println("\t\t\t\t\ttry");
      ps.println("\t\t\t\t\t{");
      ps.println("\t\t\t\t\t\t_os.close();");
      ps.println("\t\t\t\t\t}");
      ps.println("\t\t\t\t\tcatch (java.io.IOException e)");
      ps.println("\t\t\t\t\t{");
      ps.println(
          "\t\t\t\t\t\tthrow new RuntimeException(\"Unexpected exception \" + e.toString() );");
      ps.println("\t\t\t\t\t}");
      ps.println("\t\t\t\t}");
      ps.println("\t\t\t\tthis._releaseReply(_is);");
      ps.println("\t\t\t}");

      ps.println("\t\t}");
      // local part
      ps.println("\t\telse");
      ps.println("\t\t{");
    }

    ps.println(
        "\t\t\torg.omg.CORBA.portable.ServantObject _so = _servant_preinvoke( \""
            + idl_name
            + "\", _opsClass );");

    ps.println("\t\t\tif( _so == null )");
    ps.println("\t\t\t\tcontinue;");

    if (is_abstract) {
      ps.println("\t\t\t" + classname + " _localServant = (" + classname + ")_so.servant;");
    } else {
      ps.println(
          "\t\t\t"
              + classname
              + "Operations _localServant = ("
              + classname
              + "Operations)_so.servant;");
    }

    if (opAttribute == 0 && !(opTypeSpec.typeSpec() instanceof VoidTypeSpec)) {
      ps.println("\t\t\t" + opTypeSpec.toString() + " _result;");
    }

    ps.println("\t\t\ttry");
    ps.println("\t\t\t{");

    if (opAttribute == 0 && !(opTypeSpec.typeSpec() instanceof VoidTypeSpec)) {
      ps.print("\t\t\t\t_result = ");
    } else {
      ps.print("\t\t\t\t");
    }

    ps.print("_localServant." + name + "(");

    for (Enumeration e = paramDecls.elements(); e.hasMoreElements(); ) {
      ParamDecl p = ((ParamDecl) e.nextElement());
      ps.print(p.simple_declarator.toString());
      if (e.hasMoreElements()) ps.print(",");
    }
    ps.println(");");

    ps.println("\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) ");
    ps.println("\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).normalCompletion();");

    if (opAttribute == 0 && !(opTypeSpec.typeSpec() instanceof VoidTypeSpec)) {
      ps.println("\t\t\t\treturn _result;");
    } else {
      ps.println("\t\t\t\treturn;");
    }

    ps.println("\t\t\t}");

    if (!raisesExpr.empty()) {
      String[] exceptIds = raisesExpr.getExceptionIds();
      String[] classNames = raisesExpr.getExceptionClassNames();

      for (int i = 0; i < exceptIds.length; i++) {
        ps.println("\t\t\tcatch (" + classNames[i] + " ex) ");
        ps.println("\t\t\t{");
        ps.println("\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) ");
        ps.println(
            "\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(ex);");
        ps.println("\t\t\t\tthrow ex;");
        ps.println("\t\t\t}");
      }
    }

    ps.println("\t\t\tcatch (RuntimeException re) ");
    ps.println("\t\t\t{");
    ps.println("\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) ");
    ps.println(
        "\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(re);");
    ps.println("\t\t\t\tthrow re;");
    ps.println("\t\t\t}");
    ps.println("\t\t\tcatch (java.lang.Error err) ");
    ps.println("\t\t\t{");
    ps.println("\t\t\t\tif ( _so instanceof org.omg.CORBA.portable.ServantObjectExt) ");
    ps.println(
        "\t\t\t\t\t((org.omg.CORBA.portable.ServantObjectExt)_so).exceptionalCompletion(err);");
    ps.println("\t\t\t\tthrow err;");
    ps.println("\t\t\t}");
    ps.println("\t\t\tfinally");
    ps.println("\t\t\t{");
    ps.println("\t\t\t\t_servant_postinvoke(_so);");
    ps.println("\t\t\t}");

    if (!is_local) ps.println("\t\t}" + Environment.NL);

    ps.println("\t\t}" + Environment.NL); // end while
  }