## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements. See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership. The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License. You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied. See the License for the
## specific language governing permissions and limitations
## under the License.
// This file automatically generated by:
//   $version
//   $now
// This file is automatically created and should not be edited!


This is a description of the etch-generated files for your service.

----------------
- How To Build -
----------------

In the directory where the etch file is located, execute the following command:

etch -q -d . -I . -b java -w all Blah.etch

This would compile the service description Blah.etch, generating all java files,
into java packages rooted in the current directory (-d .), resolving includes
and mixins from the current directory (-I .) and being quiet about it (-q).

Assuming the Blah.etch specified a module of "demo" and a service of Blah,
the java files would be generated into a sub-directory demo of the current
directory. you may now change to that directory and compile the resulting files:

cd demo
javac -cp %ETCH_HOME%\lib\etch-java-runtime.jar *.java

(Assuming windows; for unix, you only need to change the slash direction and
change %ETCH_HOME% into \$ETCH_HOME.)

To run the service (which initially won't do anything but make a connection and
then close it, use the following two commands in separate shells (again, from
the demo directory):

java -cp %ETCH_HOME%\lib\etch-java-runtime.jar;.. demo.MainBlahListener

java -cp %ETCH_HOME%\lib\etch-java-runtime.jar;.. demo.MainBlahClient

(Again, assuming windows; for unix, make the changes detailed above and also
change the semi-colon in the -cp spec to a colon.)

The first command (java ... demo.MainBlahListener) starts the service listener
which accepts connections. The second command runs a sample client, which makes
a connection to the running listener and then closes it again.

Once you've compiled the service and tested the result, you may implement your
service by adding content to the etch file, adding implementation details to the
Impl*.java and Main*.java files, and recompiling using the above steps. You may
also load these files into an IDE such as eclipse or intellij, or use a build
management system such as maven or ant. Remember, whenever you change the etch
file, you must re-etch the service description and then re-javac all the java
files.

-------------------
- Generated Files -
-------------------

Here is a description of the generated files for a service named Blah.

Blah.java
BlahClient.java
BlahServer.java

These three files are the generated interface classes. Service defined constants
and types are in Blah.java, as well as direction "both" messages, which are
messages which are shared between client and server. BlahClient.java and
BlahServer.java are respectively the messages for just the direction client or
server. You should not edit these files.

RemoteBlah.java
RemoteBlahClient.java
RemoteBlahServer.java

RemoteBlah*.java are the generated classes which implement the interfaces,
with message implementations which encode the message type and arguments for
transport to the connection peer and then receive and decode any response. You
should not edit these files.

StubBlah.java
StubBlahClient.java
StubBlahServer.java

StubBlah*.java are the generated classes which receive messages encoded by
RemoteBlah*.java and decode them, calling the appropriate message implementation
and then encoding and sending any result. You should not edit these files.

ValueFactoryBlah.java

ValueFactoryBlah.java is a generated class which contains helper code to
serialize service defined types and also the meta data which describes the
messages and fields, field types, timeouts, etc. You should not edit this file.

BaseBlah.java
BaseBlahClient.java
BaseBlahServer.java

BaseBlah*.java are generated classes which implement the interfaces, with
message implementations which do nothing but throw UnsupportedOperationException.
They can be used to supply an implementation when you don't want to immediately
implement all the messages. You should not edit these files.

ImplBlahClient.java
ImplBlahServer.java

ImplBlah*.java are the generated sample client and server implementation
classes. They extend the generated base classes. These are used by the sample
main programs to provide implementations of the client or server messages. Edit
these files as you wish to implement your service (overriding the default
implementations from the generated base classes).

BlahHelper.java

BlahHelper.java is a generated class which includes static methods to help
construct transports for client and listener. You should not edit this file.

MainBlahClient.java
MainBlahListener.java

MainBlah*.java are the generated sample client and server main programs.
They show how to setup a transport and start it and how to create a session.
Edit these files as you wish to implement your service, or just copy the code
into your own application.
