[MOBY-guts] biomoby commit
Paul Gordon
gordonp at dev.open-bio.org
Wed Dec 6 16:07:10 UTC 2006
gordonp
Wed Dec 6 11:07:10 EST 2006
Update of /home/repository/moby/moby-live/Java/docs
In directory dev.open-bio.org:/tmp/cvs-serv24370/docs
Modified Files:
ConvertAAtoFASTA_AA.java deployingServices.html
tomcatInstall.html
Removed Files:
mobyAASeq.xml web.xml
Log Message:
Major commit to allow automated construction of MobyServlet.war, and revised cvode for Java annotation-based service meta-data specification
moby-live/Java/docs ConvertAAtoFASTA_AA.java,1.1,1.2 deployingServices.html,1.10,1.11 tomcatInstall.html,1.2,1.3 mobyAASeq.xml,1.1,NONE web.xml,1.1,NONE
===================================================================
RCS file: /home/repository/moby/moby-live/Java/docs/ConvertAAtoFASTA_AA.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- /home/repository/moby/moby-live/Java/docs/ConvertAAtoFASTA_AA.java 2006/08/01 15:20:53 1.1
+++ /home/repository/moby/moby-live/Java/docs/ConvertAAtoFASTA_AA.java 2006/12/06 16:07:10 1.2
@@ -1,6 +1,11 @@
import org.biomoby.shared.MobyDataType;
import org.biomoby.shared.data.*;
+ at mobyService(type="FormatConversion",
+ provider="moby.ucalgary.ca",
+ author="gordonp at ucalgary.ca",
+ in={"inseq:AminoAcidSequence"},
+ out={"outseq:FASTA_AA"})
public class ConvertAAtoFASTA_AA extends org.biomoby.client.MobyServlet{
public void processRequest(MobyDataJob request, MobyDataJob result) throws Exception{
===================================================================
RCS file: /home/repository/moby/moby-live/Java/docs/deployingServices.html,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- /home/repository/moby/moby-live/Java/docs/deployingServices.html 2006/11/21 21:02:05 1.10
+++ /home/repository/moby/moby-live/Java/docs/deployingServices.html 2006/12/06 16:07:10 1.11
@@ -15,10 +15,11 @@
provider of a MOBY service. It should take you less than 30 minutes. The approach is based on extending a
base jMOBY Servlet, but does not require you to have any knowledge of Servlets,
SOAP, XML, RDF or any of the other technologies underlying its implementation.
- You do <b>not</b> need to checkout the jMOBY CVS, or install Axis or even Ant.
+ You do <b>not</b> need to checkout the jMOBY CVS, or install Apache Axis. Alternatively,
+ you can do this tutorial <a href="deployingServicesBasic.html">without Apache Ant</a> too.
</p>
<p>
- If on the other hand you are planning on directly hacking the jMOBY classes, the proper approach
+ If, on the other hand, you are planning on directly hacking the jMOBY classes, the other approach
to developing services (using a code generator and the full jMOBY CVS)
can be found in <a href="ServiceDevelopment.html">this document</a>.
</p>
@@ -27,10 +28,11 @@
<p>
<ul>
<li><a href="#prereq">What are the prerequisites?</a></li>
- <li><a href="#write">Step 1: Write the function</a></li>
- <li><a href="#package">Step 2: Package the code</a></li>
- <li><a href="#deploy">Step 3: Deploy the servlet</a></li>
- <li><a href="#register">Step 4: Register the service</a></li>
+ <li><a href="#config">Step 1: Configure the build environment</a></li>
+ <li><a href="#write">Step 2: Write the function</a></li>
+ <li><a href="#package">Step 3: Package the code</a></li>
+ <li><a href="#deploy">Step 4: Deploy the servlet</a></li>
+ <li><a href="#register">Step 5: Register the service</a></li>
</ul>
</p>
@@ -41,26 +43,59 @@
<ol>
<li>A <a href="http://java.sun.com/javase/downloads/index.jsp">Java Development Kit version 5.0+</a></li>
+ <li>The <a href="http://ant.apache.org/bindownload.cgi">Apache Ant</a> build tool. If you have an aversion to Ant for some reason, you can follow <a href="deployingServicesBasic.html">these instructions</a> instead, which give you the required java command lines.</li>
<li>A Java Servlet container, such as
<a href="http://tomcat.apache.org/download-55.cgi#5.5.17">Apache Tomcat</a>.
If you don't have one setup, <a href="tomcatInstall.html">here's a very quick guide</a>.</li>
- <li>Also download
- <ul><li>the <a href="http://biomoby.org/jmoby-jars/jars-archive/MobyServlet.war">MobyServlet</a> Web Archive (WAR) you will be
- extending (right-click, "Save Target As...").</li>
- <li>the <a href="mobyAASeq.xml">example MOBY XML file</a> that you'll use
+ <li>Also download:
+ <ul><li>The MobyServlet <a href="http://biomoby.open-bio.org/CVS_CONTENT/moby-live/Java/src/xmls/servlet/build.xml">build file</a>, <b>and</b> its associated <a href="http://biomoby.open-bio.org/CVS_CONTENT/moby-live/Java/src/xmls/servlet/mobyService.properties">properties file</a>.</li>
+ <li>The <a href="http://biomoby.open-bio.org/CVS_CONTENT/moby-live/Java/src/main/org/biomoby/service/test/mobyAASeq.xml">example MOBY XML file</a> that you'll use
as input to your service.</li>
</ul>
Save them in your code development directory, so they will be convenient to access.</li>
</ol>
+ <a name="config"></a>
+ <h2>Step 1: Configure your build enviroment</h2>
+ <p>You need to tell Ant where your code and servlet container are located. This is done by modifying the
+ <code>mobyService.properties</code> file you just downloaded:
+<table border="1" cellpadding="5"><tr bgcolor="#FFFFDF"><td><pre>
+# Where the project directory is located.
+project.dir=/home/gordonp/development/fastaConverter
+
+# Where the Java source directory is located.
+src.dir=${project.dir}/src
+
+# The package-qualified location of your main class (the one extending MobyServlet).
+# You could have no package, or org/bar/foo, etc. in a real service
+main.class.file=org/biomoby/service/test/ConvertAAtoFASTA_AA.java
+
+# Where all 3rd party libraries for your code are stored.
+lib.dir=${project.dir}/lib
+
+# Name of the output WAR archive to be generated (will also be the servlet name).
+my.servlet.war.file=ConvertAAtoFASTA_AA.war
+
+# The location of a test MOBY XML input data file (use as input to test your service).
+input.data.file=${project.dir}/mobyAASeq.xml
+
+# Your Java Servlet host URL
+servlet.host.url=http://moby.ucalgary.ca
+
+# Your Java Servlet port
+servlet.port=8089
+</pre></td></tr></table>
+
+</p>
+
<a name="write"></a>
- <h2>Step 1: Write the function</h2>
+ <h2>Step 2: Write the function</h2>
<p><code>MobyServlet</code> takes care of all of the protocol
issues for you, all you need to do is override the
<i>business logic</i> method: <code>processRequest</code></p>
- <p>For example, the <a href="ConvertAAtoFASTA_AA.java">following service</a> consumes a
+ <p>For example, the <a href="http://biomoby.open-bio.org/CVS_CONTENT/moby-live/Java/src/main/org/biomoby/service/test/ConvertAAtoFASTA_AA.java">following service</a> consumes a
<a href="http://mobycentral.icapture.ubc.ca/cgi-bin/MOBY_display_object_xml.cgi?obj=AminoAcidSequence">MOBY
AminoAcidSequence</a> object called <tt>"inseq"</tt>, and returns it reformatted
into a
@@ -68,10 +103,22 @@
FASTA_AA</a> object called <tt>"outseq"</tt>:
<table border="1" cellpadding="5"><tr bgcolor="#FFFFDF"><td><pre>
+package org.biomoby.service.test; // This could be any package you want in real life...
+
import org.biomoby.shared.MobyDataType;
import org.biomoby.shared.data.*;
+import org.biomoby.service.*;
+
+ at mobyService(name="ConvertAAtoFASTA_AA",
+ type="FormatConversion",
+ provider="moby.ucalgary.ca",
+ author="gordonp at ucalgary.ca",
+ in={"inseq:AminoAcidSequence"},
+ out={"outseq:FASTA_AA"},
+ description={"Converts amino acid objects into FastA formatted records, ",
+ "primarily to increase inter-service compatibility"})
-public class ConvertAAtoFASTA_AA extends org.biomoby.service.MobyServlet{
+public class ConvertAAtoFASTA_AA extends MobyServlet{
public void processRequest(MobyDataJob request, MobyDataJob result) throws Exception{
// The input parameter for this method is registered as "inseq"
@@ -94,115 +141,54 @@
// Set the result that will be passed back to the client
result.put("outseq", fastaObject);
}
-}
- </pre></td></tr></table>
+}</pre></td></tr></table>
+
+ <p>Save a file with <a href="http://biomoby.open-bio.org/CVS_CONTENT/moby-live/Java/src/main/org/biomoby/service/test/ConvertAAtoFASTA_AA.java">the code above</a> in a file called
+ <code>${src.dir}/org/biomoby/service/test/ConvertAAtoFASTA_AA.java</code></p>
- <p>That's it for the coding. Really! Now compile it (remember: Java 1.5), including the <code>MobyServlet.war</code>
- you downloaded in the class path, e.g.:</p>
+ <p>Notice the <tt>@mobyService</tt> line. This is a Java
+ <a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html">annotation</a> used by
+ the base MobyServlet to do all the input type checking for you. If you've specified the annotation
+ correctly, you are guaranteed that <code>processRequest</code> will only receive syntactically
+ and semantically valid data. The same annotation is eventually used to publish your service's meta-data to
+ MOBY Central.</p>
+
+ <p>That's it for the coding. Really! Now compile it (Ant will automatically fetch the
+ <code>MobyServlet.war</code> you are extending), running the following command in the same
+ directory where you saved the <code>build.xml</code> file:</p>
- <blockquote><pre>javac -cp MobyServlet.war:. ConvertAAtoFASTA_AA.java</pre></blockquote>
+ <blockquote><pre>ant compile</pre></blockquote>
<p>When you go to write your own services with different data types,
a quick tutorial on the data API can be found
<a href="DataPackageInAnger.html">here</a>. All of the datatypes, service types and namespaces
you use must be <a href="http://biomoby.open-bio.org/index.php/moby-clients/ontology_clients">registered</a>
- in the <a href="http://mobycentral.icapture.ubc.ca/cgi-bin/list.services.cgi">MOBY Ontologies</a>.</p>
+ in the <a href="http://mobycentral.icapture.ubc.ca/cgi-bin/list.services.cgi">MOBY Ontologies</a>. Also,
+ when you go to create your own services, you'll put the Java code in a directory that matches a package name of your
+ own choosing (e.g. ${src.dir}/org/foo/bar.java, or just ${src.dir}/foo.java for no-package code)</p>
<p>You should probably test that your business logic works! The base servlet has a built-in
application test, so just type:
-<blockquote><pre>java -cp MobyServlet.war:. ConvertAAtoFASTA_AA ConvertAAtoFASTA_AA <a href="mobyAASeq.xml">mobyAASeq.xml</a></pre></blockquote>
+ <blockquote><pre>ant test</pre></blockquote>
and make sure the output is <a href="mobyFASTA_AA.html">as you expected</a>.
- Note that the class name is given twice,
- once to the JVM, and once as an argument to the application itself.</p>
+ </p>
<a name="package"></a>
- <h2>Step 2: Package the code</h2>
-
+ <h2>Step 3: Package the code</h2>
<p>The default <code>MobyServlet.war</code> business logic is to just return blank MOBY messages.
- You've got to customize it for your service with the following:</p>
- <ol>
- <li>Copy <code>MobyServlet.war</code> to <code>ConvertAAtoFASTA_AA.war</code></li>
- <li>Edit the WAR's <code>WEB-INF/web.xml</code> to tell it about your class
- (a WAR is just a JAR with a particular directory structure):
-<blockquote><pre>
-# Extract the existing web.xml from the WAR
-jar xvf ConvertAAtoFASTA_AA.war WEB-INF/web.xml
-# Edit the file with your favorite editor <b>(see the table below)</b>
-vi WEB-INF/web.xml
-</pre></blockquote></li>
- </ol>
+ You've got to customize it as your new WAR file with the following:</p>
-<p>For our example converter, it should minimally look like <a href="web.xml">this</a>, with the <b>required changes</b> to the default <code>web.xml</code> shown in <b>bold</b>:
-<table border="1" cellpadding="5"><tr bgcolor="#FFFFDF"><td>
-<pre>
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE web-app
- PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
- "http://java.sun.com/dtd/web-app_2_3.dtd">
-
-<web-app>
- <display-name>BioMOBY Web Service: Convert AA -> FASTA_AA</display-name>
- <servlet>
- <servlet-name><b>ConvertAAtoFASTA_AA</b></servlet-name>
- <servlet-class><b>ConvertAAtoFASTA_AA</b></servlet-class>
-
- </servlet>
- <servlet-mapping>
- <servlet-name><b>ConvertAAtoFASTA_AA</b></servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
-
- <context-param>
- <param-name>mobyServiceDescription</param-name>
- <param-value><b>Converts amino acid objects into FastA formatted records,
- primarily to increase inter-service compatibility</b></param-value>
- </context-param>
-
- <context-param>
- <param-name>mobyInput</param-name>
- <param-value><b>inseq:<a href="http://mobycentral.icapture.ubc.ca/cgi-bin/MOBY_display_object_xml.cgi?obj=AminoAcidSequence">AminoAcidSequence</a></b></param-value>
- </context-param>
-
- <context-param>
- <param-name>mobyOutput</param-name>
- <param-value><b>outseq:<a href="http://mobycentral.icapture.ubc.ca/cgi-bin/MOBY_display_object_xml.cgi?obj=FASTA_AA">FASTA_AA</a></b></param-value>
- </context-param>
-
- <context-param>
- <param-name>mobyServiceType</param-name>
- <param-value><b><a href="http://mobycentral.icapture.ubc.ca/cgi-bin/list.services.cgi?servKeyword=FormatConversion">FormatConversion</a></b></param-value>
- </context-param>
-
- <context-param>
- <param-name>mobyProviderURI</param-name>
- <param-value><b>your.domain.name</b></param-value>
- </context-param>
-
- <context-param>
- <param-name>mobyAuthorContact</param-name>
- <param-value><b>yourname at email.com</b></param-value>
- </context-param>
-
-</web-app></pre></td></tr></table>
- </li>
- <li>Put your new class and the updated web.xml in the WAR file:
- <blockquote><pre>
-mkdir WEB-INF/classes
-cp ConvertAAtoFASTA_AA.class WEB-INF/classes
-jar uvf ConvertAAtoFASTA_AA.war WEB-INF
- </pre></blockquote></li>
-
-<p>The <code>web.xml</code> file is used by the Servlet container (e.g. Tomcat), and by the base MobyServlet
-to do all the input type checking for you. If you've specified this file correctly, you are guaranteed that
-<code>processRequest</code> will only receive syntactically valid data.</p>
+ <blockquote><pre>ant war</pre></blockquote>
+
+ <p>The resulting <code>ConvertAAtoFASTA_AA.war</code> is in the build directory you specified in Step 1.
<a name="deploy"></a>
- <h2>Step 3: Deploy the servlet</h2>
+ <h2>Step 4: Deploy the servlet</h2>
- <p><code>ConvertAAtoFASTA_AA.war</code> now contains your Web Service, and is ready to be <em>deployed</em>
+ <p><code>ConvertAAtoFASTA_AA.war</code> now contains your MOBY-S Web Service, and is ready to be <em>deployed</em>
in the Servlet container. How you do this depends on the container. For Tomcat, the easiest way is to use
the management Web interface (e.g. <tt>http://your.servlet.host:8080/manager/html</tt>, but change 8080 appropriately
if you had to follow <a href="tomcatInstall.html">Step 0</a>) and upload the WAR.
@@ -228,14 +214,15 @@
</p>
<a name="deploy"></a>
- <h2>Step 4: Register the service</h2>
+ <h2>Step 5: Register the service</h2>
<p>You should test your service to make sure it works in the servlet environment.
- A testing client program is automagically included in your WAR, so type (<b>with
- the fully qualified host name, and change 8080 appropriately if you had follow
- <a href="tomcatInstall.html">Step 0</a></b>):
-<blockquote><pre>java -jar ConvertAAtoFASTA_AA.war http://your.servlet.host:8080/ConvertAAtoFASTA_AA mobyAASeq.xml</pre></blockquote>
+ A testing client program is automagically included in your WAR, so type:
+
+ <blockquote><pre>ant testService</pre></blockquote>
+
+ <p>
If the service fails, a useful error message should be printed to help you diagnose the problem.
- This would usually be an incorrect <code>web.xml</code>, or the data type you return isn't what you declared
+ This would usually be because the data type you return isn't what you declared
(this is the first occasion your output is thoroughly checked).
If you get a <code>java.lang.NoClassDefFoundError</code>, please see the notes below. If that doesn't help,
let me know (<code>gordonp</code><!-- no un-solic-ited mail please...
@@ -245,17 +232,16 @@
<p>Finally, if the output looks <a href="mobyFASTA_AA.html">reasonable</a>
(no errors or faults, a real object is returned), you're ready to
- register your service with MobyCentral so anyone can use it. To do this,
- simply do the previous command, with an extra argument:
- <blockquote><pre>java -jar ConvertAAtoFASTA_AA.war http://your.servlet.host:8080/ConvertAAtoFASTA_AA mobyAASeq.xml <b>register</b></pre></blockquote>
- </p>
+ register your service with MobyCentral so anyone can use it:
+ <blockquote><pre>ant registerService</pre></blockquote>
+ </p>
- <p>This will run the service to make sure it works, then register it with MOBY Central. You'll see
+ <p>This will test the service to make sure it works, then register it with MOBY Central. You'll see
the message "Service Successfully Registered!".</p>
<p>
Once it's registered, <b>try loading</b> the example
- data file (i.e. <tt>mobyAASeq.xml</tt>) into <a href="http://bluejay.ucalgary.ca/seahawk/">Seahawk</a>
+ data file from before (i.e. <tt><a href="http://biomoby.open-bio.org/CVS_CONTENT/moby-live/Java/src/main/org/biomoby/service/test/mobyAASeq.xml">mobyAASeq.xml</a></tt>) into <a href="http://moby.ucalgary.ca/seahawk/">Seahawk</a>
using the file/URL load icon on the toolbar (<img src="images/mobyOpen.gif" align="bottom" / >).
Click the "AminoAcidSequence" hyperlink, and your service will now appear (under the <i>Conversion</i>
menu) as a service option!</p>
@@ -263,19 +249,19 @@
<p>Since it isn't useful for everyone who uses this tutorial to host this service, please
<b>unregister</b> it now with the following command:
- <blockquote><pre>java -jar ConvertAAtoFASTA_AA.war http://your.servlet.host:8080/ConvertAAtoFASTA_AA <b>unregister</b></pre></blockquote>
+ <blockquote><pre>ant unregisterService</pre></blockquote>
<p>You should get "Service Successfully Unregistered!" if it worked.</p>
<a name="notes"></a>
- <h2>Important Notes</h2>
+ <h2>Important Notes (Please Read!)</h2>
<p><b>Permanent services</b>:
- When you want to deploy <b>your own, permanent service</b>, simply replace <b>register</b>
- with <b>register_permanent</b> in the earlier command.
- <br/>
- <br/>
+ When you want to deploy <b>your own, permanent service</b>, simply run instead:
+
+ <blockquote><pre>ant registerServicePermanent</pre></blockquote>
+
Your service hosts its own RDF specification (retrievable by doing a GET on the servlet URL). An
automated agent at MOBY Central retrieves that RDF a few times a day, and if it fails to retrieve it
several times in a row, the service is automatically deregistered. Therefore, if you stop or undeploy
@@ -290,8 +276,8 @@
INTERNAL_PROCESSING_ERROR, and severity level "error". Unless the exception thrown was a
jMOBY <tt>ServiceException</tt> already, in which case the exception is used as-is. Warnings
and information can be added without halting the program flow using <tt>addException(ServiceException)</tt>.
- <a href="FromFastaToDNASequence.java">This example program</a> demonstrates both fatal and
- non-fatal exceptions.
+ <a href="http://biomoby.open-bio.org/CVS_CONTENT/moby-live/Java/src/main/org/biomoby/service/test/FromFastaToDNASequence.java">This example program</a>
+ demonstrates both fatal and non-fatal exceptions.
</p>
<p><b>Performance</b>:
@@ -300,14 +286,14 @@
For example, the basic <code>MobyServlet</code>
service call can take about 15 seconds at first, then about 1 second afterwards (using Tomcat).</p>
- <p><b>Updating your service</b>:
- If you need to change your code, simply repeat steps 1, 2 and 3 (plus testing, of course).
+ <p><b>Updating your service (permanently registered ones)</b>:
+ If you need to change your code, simply repeat steps 2, 3 and 4 (plus testing, of course).
You do NOT need to register the service, even if you changed the inputs and outputs!
This is because MOBY Central's agent will read the new RDF description the Servlet generates.
It might take a day or so.
</p>
- <p><b>Synching with MOBY Central</b>:
+ <p><b>Syncing with MOBY Central</b>:
Your service downloads the MOBY Central ontologies when started, therefore if you want your
service to catch an important update to the ontologies, simply restart it (e.g. the "reload" link
in the Tomcat manager interface shown previously).
@@ -316,9 +302,11 @@
<p><b>Moving Your Service</b>:
The WAR you've built is completely self-contained, therefore you should be able to move your service
simply by copying the WAR to another servlet container. You can e-mail it to your friends, so they can
- mirror the service, or extend it! The only restriction is that the <code>mobyServiceProvider</code>
- parameter in <code>web.xml</code> must be changed if more than one copy of the service is to be registered
- (since the "serviceAuthURI:serviceName" combination is a service key in MOBY Central).
+ mirror the service, or extend it! The only restriction is that the <code>mobyService</code> annotation's
+ <code>provider</code> parameter must be changed in the code if more than one copy of the service is to
+ be registered (since the "serviceAuthURI:serviceName" combination is a service key in MOBY Central).
+ Alternatively, you can override the annotation manually, by uncommenting the override parameters in the WAR's
+ <code>WEB-INF/web.xml</code> file.
</p>
<p><b>Servlet Initialization</b>:
@@ -331,16 +319,11 @@
is being stopped.
</p>
- <p><b>Library Dependencies</b>:
- As you start to write more complicated services, you may need to use external libraries (e.g.
- SQL drivers). These must be included in the WAR file before you deploy, like so:
-<blockquote><pre>jar uvf MyService.war WEB-INF/lib/sql.jar</pre></blockquote>
- </p>
<hr>
<address><a href="mailto:gordonp at ucalgary.ca">Paul Gordon</a></address>
<!-- Created: Wed Jul 20 11:44:30 MDT 2005 -->
<!-- hhmts start -->
-Last modified: Tue Nov 21 13:16:31 MST 2006
+Last modified: Wed Dec 6 08:39:50 MST 2006
<!-- hhmts end -->
</body>
</html>
===================================================================
RCS file: /home/repository/moby/moby-live/Java/docs/tomcatInstall.html,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- /home/repository/moby/moby-live/Java/docs/tomcatInstall.html 2006/11/21 21:02:26 1.2
+++ /home/repository/moby/moby-live/Java/docs/tomcatInstall.html 2006/12/06 16:07:10 1.3
@@ -61,7 +61,7 @@
</tomcat-users>
</td></tr></table>
</li>
- <li>Windows: in step 2 you created the admin account.<li>
+ <li>Windows: in step 2 you created the admin account.</li>
</ul>
</li>
<li><b>Step 4: Start the servlet container.</b>
@@ -84,7 +84,7 @@
<address><a href="mailto:gordonp at ucalgary.ca">Paul Gordon</a></address>
<!-- Created: Mon Jul 31 12:16:08 MDT 2006 -->
<!-- hhmts start -->
-Last modified: Tue Nov 21 13:17:49 MST 2006
+Last modified: Tue Dec 5 09:23:31 MST 2006
<!-- hhmts end -->
</body>
</html>
rcsdiff: /home/repository/moby/moby-live/Java/docs/RCS/mobyAASeq.xml,v: No such file or directory
rcsdiff: /home/repository/moby/moby-live/Java/docs/RCS/web.xml,v: No such file or directory
More information about the MOBY-guts
mailing list