[pylewiki]

MpsSimpleExample


Table of Contents


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

1.2.1 MPS IDL File

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

 namespace Logging {
	interface LogServer {
		// Log a string to our current file.
		// Returns true for success, and false for 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:

 #include <mps.h>
 #include <mpsnaming.h>
 #include "logging.h"

 using namespace org::hebe::mps::naming;

 int main(int argc, char *argv[]) {
	NamingServiceProxy ns("mps://localhost:9091/", NULL);
	Logging::LogServerProxy logServer("Logserver", &ns);

	...
	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:

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

 public class LogServerImpl implements LogServer {
	public static void main(String[] args) {
		NamingService ns = new NamingServiceProxy("mps://localhost:9091/", null);
		new LogServerServer("Logserver", ns, new LogServerImpl());
	}

	private LoggingImpl() {
	}

	public boolean logString(String toLog) {
		// Implement server-side here...
	}
 }

The equivalent C++ code might look like:

 #include <mps.h>
 #include <mpsnaming.h>
 #include "logging.h"

 using namespace org::hebe::mps::naming;
 using namespace Logging;

 class LogServerImpl: public LogServer {
	virtual bool logString(string const &toLog) {
		// Implement server-side here...
	}
 };

 int main() {
	NamingServiceProxy ns("mps://localhost:9091/", NULL);
	LogServerImpl impl;
	LogServerServer server("Logserver", &ns, impl);

	server.mainloop();
 }

Go to Table of Contents


(last modified 04 June 2000 by tonyg)