MPSIDL Logo

MpsSimpleExample



1 Example 1

1.1 Scenario

Let's say we need to have two programs interact with each other. They need to be able to access each others' functionality - that is, one of them is providing a service to the other. Let's say that this service (it's a simple example, OK?) is to write out a log entry to a file.

1.2 The Code

All this code is available in the distribution, in the "test/MpsSimpleExample" directory. You will find there

  • a working Java Logserver implementation
  • a working C++ Logserver implementation
  • a working C++ Logserver client
  • the MPSIDL Logserver specification

1.2.1 MPS IDL File

We might choose to define part of the interface like this (logging.mps - [:loggingmps:]):

 namespace Logging {
	interface LogServer {
		// Log a string to our current file.
		// Returns true for success, and false for failure.
		// We could have chosen to use exceptions in case of failure.
		bool logString(string toLog);
	}
 }

Performing the command

 mpsidl -c -o logging logging.mps

produces the files logging.h and logging.cc, which contain definitions for C++ server stubs and client proxies implementing this interface.

1.2.2 Client code

One of our C++ programs needs to make use of this new functionality. Read the [:cplusplusclient:] code to see how to do so. Here's a fragment of that file:

 MPS::InetTransport::initialise("", 0);
 ref<MPS::NamingService> ns = MPS::getNamingService();
 ref<Logging::LogServer> logServer = Logging::LogServer::_attach(ns->resolve("Logserver"));

 if (logServer->logString("Startup successful") == false) {
   // Couldn't write log message...
   ...
 }
 ...

1.2.3 Server code

We choose to implement the server in Java. Running the command

 mpsidl -j logging.mps

creates the directory Logging/ which contains Java source code implementing package Logging, which provides both client- and server-side interfaces to the interface defined in logging.mps.

We write our implementation of the server like this ([:javaserver:]):

 import org.hebe.mps.*;
 import org.hebe.mps.naming.*;
 import Logging.*;

 class LogServerImpl implements LogServer {
    public static void main(String [] args) {
	try {
	    NamingService ns = new NamingServiceProxy("mps:inet:localhost:9091:1");
	    LogServerServer lss = new LogServerServer("Logserver", new LogServerImpl());
	    ns.bind("Logserver", lss.getBoundName(), true);
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    private int index;

    private LogServerImpl() {
	index = 1;
    }

    public boolean logString(String str) {
	System.out.println(Integer.toString(index++) + ": " + str);
	return true;
    }
 }

The equivalent C++ code can be found at [:cplusplusserver:].

Go to Table of Contents


(last modified 06 August 2001 by surazal)

SourceForge.net Logo