Moved OT tests into separate bundle; renamed from runlet to sailing

This commit is contained in:
Axel Uhl
2012-03-26 21:04:39 +02:00
parent f956c869c5
commit 79709e0fee
100 changed files with 9 additions and 6017 deletions
View File
View File
@@ -1,11 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 86
/svn/monet/!svn/ver/7639/trunk/ngpm/com.sap.runlet.operationaltransformation/.settings
END
org.eclipse.jdt.core.prefs
K 25
svn:wc:ra_dav:version-url
V 113
/svn/monet/!svn/ver/7639/trunk/ngpm/com.sap.runlet.operationaltransformation/.settings/org.eclipse.jdt.core.prefs
END
@@ -1,62 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/.settings
https://forge.sap.corp/svn/monet
2009-07-30T09:47:03.927281Z
7639
d043530
8e1b717f-a215-9248-8963-3bf2ea82000e
org.eclipse.jdt.core.prefs
file
2009-07-30T11:12:32.187500Z
568798bc673452f7fcf7725f6757062b
2009-07-30T09:47:03.927281Z
7639
d043530
has-props
331
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -1,7 +0,0 @@
#Thu Jul 30 11:41:49 CEST 2009
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.6
@@ -1,29 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 76
/svn/monet/!svn/ver/8898/trunk/ngpm/com.sap.runlet.operationaltransformation
END
build.properties
K 25
svn:wc:ra_dav:version-url
V 93
/svn/monet/!svn/ver/7639/trunk/ngpm/com.sap.runlet.operationaltransformation/build.properties
END
OperationalTransformationTest.launch
K 25
svn:wc:ra_dav:version-url
V 113
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/OperationalTransformationTest.launch
END
.project
K 25
svn:wc:ra_dav:version-url
V 85
/svn/monet/!svn/ver/7639/trunk/ngpm/com.sap.runlet.operationaltransformation/.project
END
.classpath
K 25
svn:wc:ra_dav:version-url
V 87
/svn/monet/!svn/ver/7639/trunk/ngpm/com.sap.runlet.operationaltransformation/.classpath
END
@@ -1,6 +0,0 @@
K 10
svn:ignore
V 4
bin
END
@@ -1,176 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation
https://forge.sap.corp/svn/monet
2009-12-02T14:23:28.803367Z
8898
d043530
has-props
8e1b717f-a215-9248-8963-3bf2ea82000e
.classpath
file
2009-07-30T11:12:32.250000Z
7dfc337a1ea5247d85247f102e53ce15
2009-07-30T09:47:03.927281Z
7639
d043530
has-props
376
.project
file
2009-07-30T11:12:32.265625Z
c7771af8771f770e963d9604846283fe
2009-07-30T09:47:03.927281Z
7639
d043530
has-props
701
.settings
dir
META-INF
dir
OperationalTransformationTest.launch
file
2009-07-30T12:06:17.203125Z
9476187212ef2d2b198013f002625fbe
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
3571
build.properties
file
2009-07-30T11:12:32.265625Z
72f1e780fe4bd58f12d3d4445498055e
2009-07-30T09:47:03.927281Z
7639
d043530
has-props
80
docs
dir
src
dir
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.sap.runlet.operationaltransformation</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
@@ -1,46 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
<booleanAttribute key="append.args" value="true"/>
<booleanAttribute key="askclear" value="false"/>
<booleanAttribute key="automaticAdd" value="true"/>
<booleanAttribute key="automaticValidate" value="false"/>
<stringAttribute key="bootstrap" value=""/>
<stringAttribute key="checked" value="[NONE]"/>
<booleanAttribute key="clearConfig" value="true"/>
<booleanAttribute key="clearws" value="false"/>
<booleanAttribute key="clearwslog" value="false"/>
<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
<booleanAttribute key="default" value="true"/>
<booleanAttribute key="includeOptional" value="true"/>
<stringAttribute key="location" value="${workspace_loc}/../runtime-workspace"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/test/OperationalTransformationTests.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
</listAttribute>
<stringAttribute key="org.eclipse.hyades.trace.ui.ATTR_DATA_COLLECTOR" value="org.eclipse.tptp.trace.jvmti.jvmtiMechanism:org.eclipse.tptp.analysisType.jvmti.execution"/>
<stringAttribute key="org.eclipse.hyades.trace.ui.ATTR_DESTINATION_FILE" value=""/>
<stringAttribute key="org.eclipse.hyades.trace.ui.ATTR_DESTINATION_MONITOR" value="DefaultMonitor"/>
<stringAttribute key="org.eclipse.hyades.trace.ui.ATTR_DESTINATION_PROJECT" value="ProfileProject"/>
<booleanAttribute key="org.eclipse.hyades.trace.ui.ATTR_PROFILE_TO_FILE" value="false"/>
<stringAttribute key="org.eclipse.hyades.trace.ui.ATTR_PROFILING_SET" value="tptp-dummy-profiling-set-OperationalTransformationTest"/>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.6.0_10"/>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.sap.runlet.operationaltransformation.test.OperationalTransformationTests"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="com.sap.runlet.operationaltransformation"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1024m -XX:PermSize=150m -ea"/>
<stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="product" value="org.eclipse.platform.ide"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useDefaultConfig" value="true"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<booleanAttribute key="useProduct" value="true"/>
</launchConfiguration>
@@ -1,4 +0,0 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.
@@ -1,11 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 85
/svn/monet/!svn/ver/8898/trunk/ngpm/com.sap.runlet.operationaltransformation/META-INF
END
MANIFEST.MF
K 25
svn:wc:ra_dav:version-url
V 97
/svn/monet/!svn/ver/8898/trunk/ngpm/com.sap.runlet.operationaltransformation/META-INF/MANIFEST.MF
END
@@ -1,62 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/META-INF
https://forge.sap.corp/svn/monet
2009-12-02T14:23:28.803367Z
8898
d043530
8e1b717f-a215-9248-8963-3bf2ea82000e
MANIFEST.MF
file
2009-12-02T11:03:40.109375Z
ea7fe51ec7c8a2360b15c92937b68188
2009-12-02T14:23:28.803367Z
8898
d043530
has-props
387
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -1,10 +0,0 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Operationaltransformation Plug-in
Bundle-SymbolicName: com.sap.runlet.operationaltransformation
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Export-Package: com.sap.runlet.operationaltransformation,
com.sap.runlet.operationaltransformation.test
Require-Bundle: org.junit
@@ -5,6 +5,4 @@ Bundle-SymbolicName: com.sap.sailing.operationaltransformation
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Export-Package: com.sap.sailing.operationaltransformation,
com.sap.sailing.operationaltransformation.test
Require-Bundle: org.junit
Export-Package: com.sap.sailing.operationaltransformation
View File
@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 81
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs
END
@@ -1,26 +0,0 @@
K 10
svn:ignore
V 195
resources
overview-tree.html
index-all.html
allclasses-frame.html
deprecated-list.html
allclasses-noframe.html
stylesheet.css
index.html
package-list
help-doc.html
constant-values.html
END
@@ -1,39 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/docs
https://forge.sap.corp/svn/monet
2009-07-30T11:47:40.072170Z
7650
d043530
has-props
8e1b717f-a215-9248-8963-3bf2ea82000e
empty
com
dir
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 24
application/octet-stream
END
@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 85
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com
END
@@ -1,39 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com
https://forge.sap.corp/svn/monet
2009-07-30T11:47:40.072170Z
7650
d043530
8e1b717f-a215-9248-8963-3bf2ea82000e
empty
sap
dir
@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 89
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com/sap
END
@@ -1,39 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com/sap
https://forge.sap.corp/svn/monet
2009-07-30T11:47:40.072170Z
7650
d043530
8e1b717f-a215-9248-8963-3bf2ea82000e
empty
runlet
dir
@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 96
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com/sap/runlet
END
@@ -1,6 +0,0 @@
K 10
svn:ignore
V 26
operationaltransformation
END
@@ -1,39 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com/sap/runlet
https://forge.sap.corp/svn/monet
2009-07-30T11:47:40.072170Z
7650
d043530
has-props
8e1b717f-a215-9248-8963-3bf2ea82000e
empty
docs
dir
@@ -1,11 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 101
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com/sap/runlet/docs
END
JupiterCollaborationSystem_Nichols.pdf
K 25
svn:wc:ra_dav:version-url
V 140
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com/sap/runlet/docs/JupiterCollaborationSystem_Nichols.pdf
END
@@ -1,70 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com/sap/runlet/docs
https://forge.sap.corp/svn/monet
2009-07-30T11:47:40.072170Z
7650
d043530
8e1b717f-a215-9248-8963-3bf2ea82000e
empty
JupiterCollaborationSystem_Nichols.pdf
file
2009-07-30T11:45:59.546875Z
0b0a7021188e78ae27a09bbe31f7e687
2009-07-30T11:47:40.072170Z
7650
d043530
has-props
1031529
@@ -1,5 +0,0 @@
K 13
svn:mime-type
V 24
application/octet-stream
END
@@ -1,263 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
AbstractOperation
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="AbstractOperation";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;PREV CLASS&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/AbstractOperation.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="AbstractOperation.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Class AbstractOperation&lt;S&gt;</H2>
<PRE>
java.lang.Object
<IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.sap.runlet.operationaltransformation.AbstractOperation&lt;S&gt;</B>
</PRE>
<DL>
<DT><B>All Implemented Interfaces:</B> <DD><A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;, java.lang.Cloneable</DD>
</DL>
<HR>
<DL>
<DT><PRE>public abstract class <B>AbstractOperation&lt;S&gt;</B><DT>extends java.lang.Object<DT>implements <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;</DL>
</PRE>
<P>
<HR>
<P>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<A NAME="constructor_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Constructor Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html#AbstractOperation()">AbstractOperation</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation">AbstractOperation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="type parameter in AbstractOperation">S</A>&gt;</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html#clone()">clone</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE>equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_com.sap.runlet.operationaltransformation.Operation"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from interface com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A></B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html#applyTo(S)">applyTo</A></CODE></TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<A NAME="constructor_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Constructor Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="AbstractOperation()"><!-- --></A><H3>
AbstractOperation</H3>
<PRE>
public <B>AbstractOperation</B>()</PRE>
<DL>
</DL>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="clone()"><!-- --></A><H3>
clone</H3>
<PRE>
public <A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation">AbstractOperation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="type parameter in AbstractOperation">S</A>&gt; <B>clone</B>()</PRE>
<DL>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html#clone()">clone</A></CODE> in interface <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="type parameter in AbstractOperation">S</A>&gt;</CODE><DT><B>Overrides:</B><DD><CODE>clone</CODE> in class <CODE>java.lang.Object</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;PREV CLASS&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/AbstractOperation.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="AbstractOperation.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,269 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
ClientServerOperationPair
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="ClientServerOperationPair";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="ClientServerOperationPair.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Class ClientServerOperationPair&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;?&gt;&gt;</H2>
<PRE>
java.lang.Object
<IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.sap.runlet.operationaltransformation.ClientServerOperationPair&lt;O&gt;</B>
</PRE>
<HR>
<DL>
<DT><PRE>public class <B>ClientServerOperationPair&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;?&gt;&gt;</B><DT>extends java.lang.Object</DL>
</PRE>
<P>
<HR>
<P>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<A NAME="constructor_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Constructor Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html#ClientServerOperationPair(O, O)">ClientServerOperationPair</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A>&nbsp;clientOp,
<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A>&nbsp;serverOp)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html#getClientOp()">getClientOp</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html#getServerOp()">getServerOp</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<A NAME="constructor_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Constructor Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="ClientServerOperationPair(com.sap.runlet.operationaltransformation.Operation,com.sap.runlet.operationaltransformation.Operation)"><!-- --></A><A NAME="ClientServerOperationPair(O, O)"><!-- --></A><H3>
ClientServerOperationPair</H3>
<PRE>
public <B>ClientServerOperationPair</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A>&nbsp;clientOp,
<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A>&nbsp;serverOp)</PRE>
<DL>
</DL>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="getClientOp()"><!-- --></A><H3>
getClientOp</H3>
<PRE>
public <A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A> <B>getClientOp</B>()</PRE>
<DL>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="getServerOp()"><!-- --></A><H3>
getServerOp</H3>
<PRE>
public <A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A> <B>getServerOp</B>()</PRE>
<DL>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="ClientServerOperationPair.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,245 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
Operation
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Operation";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/Operation.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="Operation.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Interface Operation&lt;S&gt;</H2>
<DL>
<DT><DT><B>Type Parameters:</B><DD><CODE>S</CODE> - the class that models the state, on instances of which operations perform changes</DL>
<DL>
<DT><B>All Superinterfaces:</B> <DD>java.lang.Cloneable</DD>
</DL>
<DL>
<DT><B>All Known Implementing Classes:</B> <DD><A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation">AbstractOperation</A></DD>
</DL>
<HR>
<DL>
<DT><PRE>public interface <B>Operation&lt;S&gt;</B><DT>extends java.lang.Cloneable</DL>
</PRE>
<P>
A change operation can be applied to some start state of some
universe and transforms that universe into a target state.
<P>
<P>
<HR>
<P>
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="type parameter in Operation">S</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html#applyTo(S)">applyTo</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="type parameter in Operation">S</A>&nbsp;toState)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Applies this operation to the state <tt>toState</tt>, producing a new target state
which is returned.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="type parameter in Operation">S</A>&gt;</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html#clone()">clone</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="clone()"><!-- --></A><H3>
clone</H3>
<PRE>
<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="type parameter in Operation">S</A>&gt; <B>clone</B>()</PRE>
<DL>
<DD><DL>
</DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="applyTo(java.lang.Object)"><!-- --></A><A NAME="applyTo(S)"><!-- --></A><H3>
applyTo</H3>
<PRE>
<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="type parameter in Operation">S</A> <B>applyTo</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="type parameter in Operation">S</A>&nbsp;toState)</PRE>
<DL>
<DD>Applies this operation to the state <tt>toState</tt>, producing a new target state
which is returned.
<P>
<DD><DL>
</DL>
</DD>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>toState</CODE> - the state to which to apply this operation
<DT><B>Returns:</B><DD>the state produced by applying this operation to <tt>toState</tt></DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/Operation.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="Operation.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,371 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
Peer
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Peer";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/Peer.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="Peer.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Interface Peer&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</H2>
<DL>
<DT><DT><B>Type Parameters:</B><DD><CODE>O</CODE> - the type of operations that can be applied to the states<DD><CODE>S</CODE> - the type of the states on which the operations perform changes</DL>
<DL>
<DT><B>All Known Implementing Classes:</B> <DD><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A></DD>
</DL>
<HR>
<DL>
<DT><PRE>public interface <B>Peer&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</B></DL>
</PRE>
<P>
Accepts change operations from clients and maintains a shared state. If new
clients connect, the full state can be sent to the client for initial
synchronization. When a change <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><CODE>Operation</CODE></A> is received from a client
that operation will be based on some state. Since that state the
server may have applied one or more change operations already. In order to
synchronize the requesting client, the server transforms all in-between
change operations for the requesting client and sends those transformation
results back to the requesting client. The client's operation, in turn, is
disseminated to all other clients for them to merge into their local replica
of the global state.
<P>
<P>
<HR>
<P>
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#addPeer(com.sap.runlet.operationaltransformation.Peer)">addPeer</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A>&gt;&nbsp;peer)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Registers a peer with this peer for replication.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(O)">apply</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>&nbsp;operation)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Applies a change operation locally to the current peer's state.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)">apply</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A>&gt;&nbsp;source,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>&nbsp;operation,
int&nbsp;numberOfOperationsSourceHasMergedFromThis)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Usually, the framework handles calls to this method and framework users
should therefore not need to call this method.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#confirm(com.sap.runlet.operationaltransformation.Peer, int)">confirm</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A>&gt;&nbsp;source,
int&nbsp;numberOfMergedOperations)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tells this peer that the <tt>source</tt> peer has successfully merged
<tt>numberOfMergedOperations</tt> altogether coming from this peer
into its operation sequence.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#getCurrentState()">getCurrentState</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tells the current state in which the peer is.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#waitForNotRunning()">waitForNotRunning</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blocks until the queue of tasks that works on achieving consistency across peers
has completely drained.</TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="addPeer(com.sap.runlet.operationaltransformation.Peer)"><!-- --></A><H3>
addPeer</H3>
<PRE>
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A> <B>addPeer</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A>&gt;&nbsp;peer)</PRE>
<DL>
<DD>Registers a peer with this peer for replication. From this point on, this
peer will remember which operations it has forwarded to that peer for
later transformation jobs for operations coming in from that client.<p>
The <tt>peer</tt> is expected to set the state returned by this operation
as its initial state.
<P>
<DD><DL>
<DT><B>Returns:</B><DD>the current server state; the calling client can use this as its
initial state</DL>
</DD>
</DL>
<HR>
<A NAME="apply(com.sap.runlet.operationaltransformation.Peer,com.sap.runlet.operationaltransformation.Operation,int)"><!-- --></A><A NAME="apply(com.sap.runlet.operationaltransformation.Peer, O, int)"><!-- --></A><H3>
apply</H3>
<PRE>
void <B>apply</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A>&gt;&nbsp;source,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>&nbsp;operation,
int&nbsp;numberOfOperationsSourceHasMergedFromThis)</PRE>
<DL>
<DD>Usually, the framework handles calls to this method and framework users
should therefore not need to call this method.
<p>
Synchronizes an <tt>operation</tt> from the <tt>source</tt> peer to this
peer. The <tt>source</tt> peer specifies how many operations from this
peer it already merged into its operations sequence before having
executed <tt>operation</tt>.
<p>
The operation has to be transformed using this peer's operational
transformation and using the sequence of operations applied to the
operation's start state up to this peer's current state. This results in
the operation that needs to be applied to the current state to produce
the next state.
<p>
After applying this possibly transformed operation to this peer's current
state and thus producing a new current state, all registered peers except
<tt>source</tt> are notified about the change by sending them the
transformed operation.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="apply(com.sap.runlet.operationaltransformation.Operation)"><!-- --></A><A NAME="apply(O)"><!-- --></A><H3>
apply</H3>
<PRE>
void <B>apply</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>&nbsp;operation)</PRE>
<DL>
<DD>Applies a change operation locally to the current peer's state.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="confirm(com.sap.runlet.operationaltransformation.Peer, int)"><!-- --></A><H3>
confirm</H3>
<PRE>
void <B>confirm</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A>&gt;&nbsp;source,
int&nbsp;numberOfMergedOperations)</PRE>
<DL>
<DD>Tells this peer that the <tt>source</tt> peer has successfully merged
<tt>numberOfMergedOperations</tt> altogether coming from this peer
into its operation sequence. This peer can take this as an opportunity
to clean up the queue and remove the transformed copies of all operations
up to number <tt>numberOfMergedOperations-1</tt>.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="getCurrentState()"><!-- --></A><H3>
getCurrentState</H3>
<PRE>
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A> <B>getCurrentState</B>()</PRE>
<DL>
<DD>Tells the current state in which the peer is. This is the state constructed by
the sequence of calls to <A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(O)"><CODE>apply(Operation)</CODE></A> and the merged in notifications
from other peers.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="waitForNotRunning()"><!-- --></A><H3>
waitForNotRunning</H3>
<PRE>
void <B>waitForNotRunning</B>()</PRE>
<DL>
<DD>Blocks until the queue of tasks that works on achieving consistency across peers
has completely drained.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/Peer.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="Peer.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,548 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
PeerImpl
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="PeerImpl";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/PeerImpl.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="PeerImpl.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Class PeerImpl&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</H2>
<PRE>
java.lang.Object
<IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.sap.runlet.operationaltransformation.PeerImpl&lt;O,S&gt;</B>
</PRE>
<DL>
<DT><DT><B>Type Parameters:</B><DD><CODE>O</CODE> - type of change operations to be processed by this server<DD><CODE>S</CODE> - type of state managed by this server to which the operations can be applied</DL>
<DL>
<DT><B>All Implemented Interfaces:</B> <DD><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;O,S&gt;</DD>
</DL>
<HR>
<DL>
<DT><PRE>public class <B>PeerImpl&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</B><DT>extends java.lang.Object<DT>implements <A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;O,S&gt;</DL>
</PRE>
<P>
A very simple peer implementation for operational transformations that starts
out with a provided initial state and then receives operations which it applies
to its state. It manages a set of clients. Using the <tt>server</tt> constructor
parameter one can configure whether this peer is a client or a server.
<P>
<P>
<HR>
<P>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<A NAME="constructor_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Constructor Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(java.lang.String, com.sap.runlet.operationaltransformation.Transformer, com.sap.runlet.operationaltransformation.Peer)">PeerImpl</A></B>(java.lang.String&nbsp;name,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;server)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructs a client peer with a name and connects it to the
<tt>server</tt> peer, establishing the two-way link between client and
server peers.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(java.lang.String, com.sap.runlet.operationaltransformation.Transformer, S, boolean)">PeerImpl</A></B>(java.lang.String&nbsp;name,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&nbsp;initialState,
boolean&nbsp;server)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(com.sap.runlet.operationaltransformation.Transformer, com.sap.runlet.operationaltransformation.Peer)">PeerImpl</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;server)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constructs a client peer and connects it to the <tt>server</tt> peer, establishing
the two-way link between client and server peers.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(com.sap.runlet.operationaltransformation.Transformer, S, boolean)">PeerImpl</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&nbsp;initialState,
boolean&nbsp;server)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#addPeer(com.sap.runlet.operationaltransformation.Peer)">addPeer</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;peer)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Registers a peer with this peer for replication.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#apply(O)">apply</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&nbsp;operation)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Applies a change operation locally to the current peer's state.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)">apply</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;source,
<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&nbsp;operation,
int&nbsp;numberOfOperationsSourceHasMergedFromThis)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Usually, the framework handles calls to this method and framework users
should therefore not need to call this method.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#confirm(com.sap.runlet.operationaltransformation.Peer, int)">confirm</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;source,
int&nbsp;numberOfMergedOperations)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tells this peer that the <tt>source</tt> peer has successfully merged
<tt>numberOfMergedOperations</tt> altogether coming from this peer
into its operation sequence.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#finalize()">finalize</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#getCurrentState()">getCurrentState</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tells the current state in which the peer is.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;java.lang.String</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#toString()">toString</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html#waitForNotRunning()">waitForNotRunning</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Blocks until the queue of tasks that works on achieving consistency across peers
has completely drained.</TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE>clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<A NAME="constructor_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Constructor Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="PeerImpl(com.sap.runlet.operationaltransformation.Transformer,java.lang.Object,boolean)"><!-- --></A><A NAME="PeerImpl(com.sap.runlet.operationaltransformation.Transformer, S, boolean)"><!-- --></A><H3>
PeerImpl</H3>
<PRE>
public <B>PeerImpl</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&nbsp;initialState,
boolean&nbsp;server)</PRE>
<DL>
</DL>
<HR>
<A NAME="PeerImpl(java.lang.String,com.sap.runlet.operationaltransformation.Transformer,java.lang.Object,boolean)"><!-- --></A><A NAME="PeerImpl(java.lang.String, com.sap.runlet.operationaltransformation.Transformer, S, boolean)"><!-- --></A><H3>
PeerImpl</H3>
<PRE>
public <B>PeerImpl</B>(java.lang.String&nbsp;name,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&nbsp;initialState,
boolean&nbsp;server)</PRE>
<DL>
</DL>
<HR>
<A NAME="PeerImpl(com.sap.runlet.operationaltransformation.Transformer, com.sap.runlet.operationaltransformation.Peer)"><!-- --></A><H3>
PeerImpl</H3>
<PRE>
public <B>PeerImpl</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;server)</PRE>
<DL>
<DD>Constructs a client peer and connects it to the <tt>server</tt> peer, establishing
the two-way link between client and server peers. The initial state is taken from
the server.
<P>
</DL>
<HR>
<A NAME="PeerImpl(java.lang.String, com.sap.runlet.operationaltransformation.Transformer, com.sap.runlet.operationaltransformation.Peer)"><!-- --></A><H3>
PeerImpl</H3>
<PRE>
public <B>PeerImpl</B>(java.lang.String&nbsp;name,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&gt;&nbsp;transformer,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;server)</PRE>
<DL>
<DD>Constructs a client peer with a name and connects it to the
<tt>server</tt> peer, establishing the two-way link between client and
server peers. The initial state is taken from the server.
<P>
</DL>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="finalize()"><!-- --></A><H3>
finalize</H3>
<PRE>
public void <B>finalize</B>()</PRE>
<DL>
<DD><DL>
<DT><B>Overrides:</B><DD><CODE>finalize</CODE> in class <CODE>java.lang.Object</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="addPeer(com.sap.runlet.operationaltransformation.Peer)"><!-- --></A><H3>
addPeer</H3>
<PRE>
public <A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A> <B>addPeer</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;peer)</PRE>
<DL>
<DD><B>Description copied from interface: <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#addPeer(com.sap.runlet.operationaltransformation.Peer)">Peer</A></CODE></B></DD>
<DD>Registers a peer with this peer for replication. From this point on, this
peer will remember which operations it has forwarded to that peer for
later transformation jobs for operations coming in from that client.<p>
The <tt>peer</tt> is expected to set the state returned by this operation
as its initial state.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#addPeer(com.sap.runlet.operationaltransformation.Peer)">addPeer</A></CODE> in interface <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A> extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;</CODE></DL>
</DD>
<DD><DL>
<DT><B>Returns:</B><DD>the current server state; the calling client can use this as its
initial state</DL>
</DD>
</DL>
<HR>
<A NAME="getCurrentState()"><!-- --></A><H3>
getCurrentState</H3>
<PRE>
public <A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A> <B>getCurrentState</B>()</PRE>
<DL>
<DD><B>Description copied from interface: <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#getCurrentState()">Peer</A></CODE></B></DD>
<DD>Tells the current state in which the peer is. This is the state constructed by
the sequence of calls to <A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(O)"><CODE>Peer.apply(Operation)</CODE></A> and the merged in notifications
from other peers.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#getCurrentState()">getCurrentState</A></CODE> in interface <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A> extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="apply(com.sap.runlet.operationaltransformation.Operation)"><!-- --></A><A NAME="apply(O)"><!-- --></A><H3>
apply</H3>
<PRE>
public void <B>apply</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&nbsp;operation)</PRE>
<DL>
<DD><B>Description copied from interface: <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(O)">Peer</A></CODE></B></DD>
<DD>Applies a change operation locally to the current peer's state.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(O)">apply</A></CODE> in interface <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A> extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="apply(com.sap.runlet.operationaltransformation.Peer,com.sap.runlet.operationaltransformation.Operation,int)"><!-- --></A><A NAME="apply(com.sap.runlet.operationaltransformation.Peer, O, int)"><!-- --></A><H3>
apply</H3>
<PRE>
public void <B>apply</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;source,
<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>&nbsp;operation,
int&nbsp;numberOfOperationsSourceHasMergedFromThis)</PRE>
<DL>
<DD><B>Description copied from interface: <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)">Peer</A></CODE></B></DD>
<DD>Usually, the framework handles calls to this method and framework users
should therefore not need to call this method.
<p>
Synchronizes an <tt>operation</tt> from the <tt>source</tt> peer to this
peer. The <tt>source</tt> peer specifies how many operations from this
peer it already merged into its operations sequence before having
executed <tt>operation</tt>.
<p>
The operation has to be transformed using this peer's operational
transformation and using the sequence of operations applied to the
operation's start state up to this peer's current state. This results in
the operation that needs to be applied to the current state to produce
the next state.
<p>
After applying this possibly transformed operation to this peer's current
state and thus producing a new current state, all registered peers except
<tt>source</tt> are notified about the change by sending them the
transformed operation.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)">apply</A></CODE> in interface <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A> extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="toString()"><!-- --></A><H3>
toString</H3>
<PRE>
public java.lang.String <B>toString</B>()</PRE>
<DL>
<DD><DL>
<DT><B>Overrides:</B><DD><CODE>toString</CODE> in class <CODE>java.lang.Object</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="confirm(com.sap.runlet.operationaltransformation.Peer, int)"><!-- --></A><H3>
confirm</H3>
<PRE>
public void <B>confirm</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A>,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;&nbsp;source,
int&nbsp;numberOfMergedOperations)</PRE>
<DL>
<DD><B>Description copied from interface: <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#confirm(com.sap.runlet.operationaltransformation.Peer, int)">Peer</A></CODE></B></DD>
<DD>Tells this peer that the <tt>source</tt> peer has successfully merged
<tt>numberOfMergedOperations</tt> altogether coming from this peer
into its operation sequence. This peer can take this as an opportunity
to clean up the queue and remove the transformed copies of all operations
up to number <tt>numberOfMergedOperations-1</tt>.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#confirm(com.sap.runlet.operationaltransformation.Peer, int)">confirm</A></CODE> in interface <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A> extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="waitForNotRunning()"><!-- --></A><H3>
waitForNotRunning</H3>
<PRE>
public void <B>waitForNotRunning</B>()</PRE>
<DL>
<DD><B>Description copied from interface: <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#waitForNotRunning()">Peer</A></CODE></B></DD>
<DD>Blocks until the queue of tasks that works on achieving consistency across peers
has completely drained.
<P>
<DD><DL>
<DT><B>Specified by:</B><DD><CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#waitForNotRunning()">waitForNotRunning</A></CODE> in interface <CODE><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">O</A> extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;,<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="type parameter in PeerImpl">S</A>&gt;</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/PeerImpl.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="PeerImpl.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,208 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 13:48:55 CEST 2009 -->
<TITLE>
State
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="State";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/State.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="State.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Interface State</H2>
<HR>
<DL>
<DT><PRE>public interface <B>State</B></DL>
</PRE>
<P>
A state of the "universe" in which the <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><CODE>Operation</CODE></A>s perform state changes.
<P>
<P>
<HR>
<P>
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;java.lang.Object</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/State.html#getId()">getId</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns an identifier for this state.</TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="getId()"><!-- --></A><H3>
getId</H3>
<PRE>
java.lang.Object <B>getId</B>()</PRE>
<DL>
<DD>Returns an identifier for this state.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/State.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="State.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,281 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
StatesAndOperations
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="StatesAndOperations";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/StatesAndOperations.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="StatesAndOperations.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Class StatesAndOperations&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</H2>
<PRE>
java.lang.Object
<IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.sap.runlet.operationaltransformation.StatesAndOperations&lt;O,S&gt;</B>
</PRE>
<HR>
<DL>
<DT><PRE>public class <B>StatesAndOperations&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</B><DT>extends java.lang.Object</DL>
</PRE>
<P>
Maintains a list of states and the operations that transformed the i-th into
the i+1st, starting with an initial state. Using <A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html#apply(O)"><CODE>apply(Operation)</CODE></A>,
operation/state pairs can be appended to the end.
<p>
<P>
<P>
<HR>
<P>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<A NAME="constructor_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Constructor Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html#StatesAndOperations(S)">StatesAndOperations</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A>&nbsp;initialState)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html#apply(O)">apply</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">O</A>&nbsp;operation)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Applies the <tt>operation</tt> to the <A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html#getCurrentState()"><CODE>current
state</CODE></A> and records both, the new current state and the operation.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A></CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html#getCurrentState()">getCurrentState</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<A NAME="constructor_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Constructor Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="StatesAndOperations(java.lang.Object)"><!-- --></A><A NAME="StatesAndOperations(S)"><!-- --></A><H3>
StatesAndOperations</H3>
<PRE>
public <B>StatesAndOperations</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A>&nbsp;initialState)</PRE>
<DL>
</DL>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="apply(com.sap.runlet.operationaltransformation.Operation)"><!-- --></A><A NAME="apply(O)"><!-- --></A><H3>
apply</H3>
<PRE>
public <A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A> <B>apply</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">O</A>&nbsp;operation)</PRE>
<DL>
<DD>Applies the <tt>operation</tt> to the <A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html#getCurrentState()"><CODE>current
state</CODE></A> and records both, the new current state and the operation.
<P>
<DD><DL>
<DT><B>Returns:</B><DD>the new current state that results from applying
<tt>operation</tt> to the state that was current when the
operation was invoked.</DL>
</DD>
</DL>
<HR>
<A NAME="getCurrentState()"><!-- --></A><H3>
getCurrentState</H3>
<PRE>
public <A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A> <B>getCurrentState</B>()</PRE>
<DL>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/StatesAndOperations.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="StatesAndOperations.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,211 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
Transformer
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="Transformer";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/Transformer.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="Transformer.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Interface Transformer&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;?&gt;&gt;</H2>
<HR>
<DL>
<DT><PRE>public interface <B>Transformer&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;?&gt;&gt;</B></DL>
</PRE>
<P>
<HR>
<P>
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation">ClientServerOperationPair</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="type parameter in Transformer">O</A>&gt;</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html#transform(O, O)">transform</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="type parameter in Transformer">O</A>&nbsp;clientOp,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="type parameter in Transformer">O</A>&nbsp;serverOp)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Takes an operation from the client and an operation from the server, both
based on the same state.</TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="transform(com.sap.runlet.operationaltransformation.Operation,com.sap.runlet.operationaltransformation.Operation)"><!-- --></A><A NAME="transform(O, O)"><!-- --></A><H3>
transform</H3>
<PRE>
<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation">ClientServerOperationPair</A>&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="type parameter in Transformer">O</A>&gt; <B>transform</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="type parameter in Transformer">O</A>&nbsp;clientOp,
<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="type parameter in Transformer">O</A>&nbsp;serverOp)</PRE>
<DL>
<DD>Takes an operation from the client and an operation from the server, both
based on the same state. The complementary pair of operations is computed
such that if the client applies the server operation returned, and the
server applies the client operation returned, both end up in equal states
again.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation"><B>NEXT CLASS</B></A></FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/Transformer.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="Transformer.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,353 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
UnmergedOperationsQueue
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="UnmergedOperationsQueue";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;NEXT CLASS</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="UnmergedOperationsQueue.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<!-- ======== START OF CLASS DATA ======== -->
<H2>
<FONT SIZE="-1">
com.sap.runlet.operationaltransformation</FONT>
<BR>
Class UnmergedOperationsQueue&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</H2>
<PRE>
java.lang.Object
<IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>com.sap.runlet.operationaltransformation.UnmergedOperationsQueue&lt;O,S&gt;</B>
</PRE>
<HR>
<DL>
<DT><PRE>public class <B>UnmergedOperationsQueue&lt;O extends <A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;,S&gt;</B><DT>extends java.lang.Object</DL>
</PRE>
<P>
<HR>
<P>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<A NAME="constructor_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Constructor Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#UnmergedOperationsQueue()">UnmergedOperationsQueue</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<!-- ========== METHOD SUMMARY =========== -->
<A NAME="method_summary"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Method Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#confirm(int)">confirm</A></B>(int&nbsp;numberOfMergedOperations)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cleans up the queue so that only unconfirmed / unmerged operations
remain.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;java.util.List&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">O</A>&gt;</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#getUnmergedOperations(int)">getUnmergedOperations</A></B>(int&nbsp;numberOfConfirmedLocalOperations)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Returns a copied list of unmerged and stepwise transformed local
operations starting at the requested local operation number.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#sentOutOperation(O)">sentOutOperation</A></B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">O</A>&nbsp;operationSentOut)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;After an operation has been locally applied and needs to be propagated
to the peer for which this is the queue of unmerged operations, the operation
must be appended to this queue.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;java.lang.String</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#toString()">toString</A></B>()</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
<CODE>&nbsp;void</CODE></FONT></TD>
<TD><CODE><B><A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#updateWithTransformed(int, O)">updateWithTransformed</A></B>(int&nbsp;localOperationNumber,
<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">O</A>&nbsp;transformedOperation)</CODE>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Replaces the local operation with number <tt>localOperationNumber</tt> in the queue by
<tt>transformedOperation</tt>.</TD>
</TR>
</TABLE>
&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD><CODE>clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait</CODE></TD>
</TR>
</TABLE>
&nbsp;
<P>
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<A NAME="constructor_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Constructor Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="UnmergedOperationsQueue()"><!-- --></A><H3>
UnmergedOperationsQueue</H3>
<PRE>
public <B>UnmergedOperationsQueue</B>()</PRE>
<DL>
</DL>
<!-- ============ METHOD DETAIL ========== -->
<A NAME="method_detail"><!-- --></A>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
<B>Method Detail</B></FONT></TH>
</TR>
</TABLE>
<A NAME="sentOutOperation(com.sap.runlet.operationaltransformation.Operation)"><!-- --></A><A NAME="sentOutOperation(O)"><!-- --></A><H3>
sentOutOperation</H3>
<PRE>
public void <B>sentOutOperation</B>(<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">O</A>&nbsp;operationSentOut)</PRE>
<DL>
<DD>After an operation has been locally applied and needs to be propagated
to the peer for which this is the queue of unmerged operations, the operation
must be appended to this queue.
<P>
<DD><DL>
</DL>
</DD>
</DL>
<HR>
<A NAME="getUnmergedOperations(int)"><!-- --></A><H3>
getUnmergedOperations</H3>
<PRE>
public java.util.List&lt;<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">O</A>&gt; <B>getUnmergedOperations</B>(int&nbsp;numberOfConfirmedLocalOperations)</PRE>
<DL>
<DD>Returns a copied list of unmerged and stepwise transformed local
operations starting at the requested local operation number.
<P>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>numberOfConfirmedLocalOperations</CODE> - A value of 0 means that the remote peer has not confirmed the
merge of any local operation yet.</DL>
</DD>
</DL>
<HR>
<A NAME="updateWithTransformed(int,com.sap.runlet.operationaltransformation.Operation)"><!-- --></A><A NAME="updateWithTransformed(int, O)"><!-- --></A><H3>
updateWithTransformed</H3>
<PRE>
public void <B>updateWithTransformed</B>(int&nbsp;localOperationNumber,
<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">O</A>&nbsp;transformedOperation)</PRE>
<DL>
<DD>Replaces the local operation with number <tt>localOperationNumber</tt> in the queue by
<tt>transformedOperation</tt>.
<P>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>localOperationNumber</CODE> - starts with 0</DL>
</DD>
</DL>
<HR>
<A NAME="confirm(int)"><!-- --></A><H3>
confirm</H3>
<PRE>
public void <B>confirm</B>(int&nbsp;numberOfMergedOperations)</PRE>
<DL>
<DD>Cleans up the queue so that only unconfirmed / unmerged operations
remain. Afterwards, <A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#getUnmergedOperations(int)"><CODE>asking for an
unmerged operation</CODE></A> with an argument for
<tt>numberOfConfirmedLocalOperations</tt> smaller than
<tt>numberOfMergedOperations</tt> passed to this call will result in an
exception.
<P>
<DD><DL>
<DT><B>Parameters:</B><DD><CODE>numberOfMergedOperations</CODE> - tells how many operations that emerged from the local peer the
remote peer has confirmed to have merged.</DL>
</DD>
</DL>
<HR>
<A NAME="toString()"><!-- --></A><H3>
toString</H3>
<PRE>
public java.lang.String <B>toString</B>()</PRE>
<DL>
<DD><DL>
<DT><B>Overrides:</B><DD><CODE>toString</CODE> in class <CODE>java.lang.Object</CODE></DL>
</DD>
<DD><DL>
</DL>
</DD>
</DL>
<!-- ========= END OF CLASS DATA ========= -->
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><B>PREV CLASS</B></A>&nbsp;
&nbsp;NEXT CLASS</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="UnmergedOperationsQueue.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
<TR>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,55 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
com.sap.runlet.operationaltransformation
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
</HEAD>
<BODY BGCOLOR="white">
<FONT size="+1" CLASS="FrameTitleFont">
<A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html" target="classFrame">com.sap.runlet.operationaltransformation</A></FONT>
<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
<TR>
<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
Interfaces</FONT>&nbsp;
<FONT CLASS="FrameItemFont">
<BR>
<A HREF="Operation.html" title="interface in com.sap.runlet.operationaltransformation" target="classFrame"><I>Operation</I></A>
<BR>
<A HREF="Peer.html" title="interface in com.sap.runlet.operationaltransformation" target="classFrame"><I>Peer</I></A>
<BR>
<A HREF="Transformer.html" title="interface in com.sap.runlet.operationaltransformation" target="classFrame"><I>Transformer</I></A></FONT></TD>
</TR>
</TABLE>
<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
<TR>
<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
Classes</FONT>&nbsp;
<FONT CLASS="FrameItemFont">
<BR>
<A HREF="AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">AbstractOperation</A>
<BR>
<A HREF="ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">ClientServerOperationPair</A>
<BR>
<A HREF="PeerImpl.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">PeerImpl</A>
<BR>
<A HREF="StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">StatesAndOperations</A>
<BR>
<A HREF="UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">UnmergedOperationsQueue</A></FONT></TD>
</TR>
</TABLE>
</BODY>
</HTML>
@@ -1,265 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
com.sap.runlet.operationaltransformation
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="com.sap.runlet.operationaltransformation";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;PREV PACKAGE&nbsp;
&nbsp;NEXT PACKAGE</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/package-summary.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<H2>
Package com.sap.runlet.operationaltransformation
</H2>
Use the contents of this package for so-called <em>operational transformations</em>.
<P>
<B>See:</B>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A HREF="#package_description"><B>Description</B></A>
<P>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Interface Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation&lt;S&gt;</A></B></TD>
<TD>A change operation can be applied to some start state of some
universe and transforms that universe into a target state.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer&lt;O extends Operation&lt;S&gt;,S&gt;</A></B></TD>
<TD>Accepts change operations from clients and maintains a shared state.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer&lt;O extends Operation&lt;?&gt;&gt;</A></B></TD>
<TD>&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<P>
<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
<B>Class Summary</B></FONT></TH>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation">AbstractOperation&lt;S&gt;</A></B></TD>
<TD>&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation">ClientServerOperationPair&lt;O extends Operation&lt;?&gt;&gt;</A></B></TD>
<TD>&nbsp;</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl&lt;O extends Operation&lt;S&gt;,S&gt;</A></B></TD>
<TD>A very simple peer implementation for operational transformations that starts
out with a provided initial state and then receives operations which it applies
to its state.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation">StatesAndOperations&lt;O extends Operation&lt;S&gt;,S&gt;</A></B></TD>
<TD>Maintains a list of states and the operations that transformed the i-th into
the i+1st, starting with an initial state.</TD>
</TR>
<TR BGCOLOR="white" CLASS="TableRowColor">
<TD WIDTH="15%"><B><A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue&lt;O extends Operation&lt;S&gt;,S&gt;</A></B></TD>
<TD>&nbsp;</TD>
</TR>
</TABLE>
&nbsp;
<P>
<A NAME="package_description"><!-- --></A><H2>
Package com.sap.runlet.operationaltransformation Description
</H2>
<P>
<p>
Use the contents of this package for so-called <em>operational transformations</em>.
This can be used to synchronize the states of a number of clients with a single server.
The synchronization is performed asynchronously. The construction of the transformation
function guarantees to lead to eventual consistency across clients and server.
Read more about the general background of the algorithm on which this is based
<a href="../docs/JupiterCollaborationSystem_Nichols.pdf">here</a>.
</p>
<p>
To establish a server to which clients can connect, first decide how your <em>state</em>
is encoded on which the <em>operations</em> will perform changes to transition from one
state to the next. Then, design your operations class. The trickiest part comes next. You
have to define a transformer that maps a pair of your operations to another pair of
operations of the same type. The transformer has to implement the
<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><CODE>Transformer</CODE></A> interface, in particular
the <A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html#transform(O, O)"><CODE>Transformer.transform(O, O)</CODE></A> method. The
transformation function assumes that both input operations have been applied to the same
state, one on a client, the other one on the server. The resulting operation for the client
applied on the client must lead to a state equal to the state reached on the server by
applying the resulting operation for the server to the server's state.
</p>
<p>
Put formally, if <em>t</em> is a transformer, and
if we have <em>s_c</em> as the state on the client and <em>s_s</em> as the state
on the server, and <em>c</em> as the operation that was executed in state <em>s_c</em> on the
client, and <em>s</em> as the operation executed on the server in state <em>s_s</em>, then the
following condition must hold:<br>
<pre>
t.transform(c, s).getClientOp().applyTo(c.applyTo(s_c).equals(
t.transform(c, s).getServerOp().applyTo(s.applyTo(s_s))
</pre>
</p>
<p>
You can create servers and clients, e.g., as follows:
<pre>
server = new <A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><CODE>PeerImpl</CODE></A><MyOperationType, MyStateType>(
"Server", new MyTransformer(), /* initial state */ new MyStateType(...), /* server */ true);
client1 = new <A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><CODE>PeerImpl</CODE></A><MyOperationType, MyStateType>("Client1", new MyTransformer(), server);
client2 = new <A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><CODE>PeerImpl</CODE></A><MyOperationType, MyStateType>("Client2", new MyTransformer(), server);
</pre>
After that, you can start sending operations to the clients using the
<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)"><CODE>Peer.apply(com.sap.runlet.operationaltransformation.Peer<O, S>, O, int)</CODE></A> method as follows:
<pre>
client1.<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)"><CODE>apply</CODE></A>(new MyOperationType(...));
client2.<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)"><CODE>apply</CODE></A>(new MyOperationType(...));
...
</pre>
and those changes will eventually get synchronized across all clients and the server. You can
obtain the current state of a peer using the <A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html#getCurrentState()"><CODE>Peer.getCurrentState()</CODE></A>
operation.
</p>
<P>
<P>
<DL>
</DL>
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;PREV PACKAGE&nbsp;
&nbsp;NEXT PACKAGE</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/package-summary.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
@@ -1,155 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc (build 1.6.0_14) on Thu Jul 30 14:17:57 CEST 2009 -->
<TITLE>
com.sap.runlet.operationaltransformation Class Hierarchy
</TITLE>
<META NAME="date" CONTENT="2009-07-30">
<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
<SCRIPT type="text/javascript">
function windowTitle()
{
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="com.sap.runlet.operationaltransformation Class Hierarchy";
}
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<BODY BGCOLOR="white" onload="windowTitle();">
<HR>
<!-- ========= START OF TOP NAVBAR ======= -->
<A NAME="navbar_top"><!-- --></A>
<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_top_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;PREV&nbsp;
&nbsp;NEXT</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/package-tree.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_top"></A>
<!-- ========= END OF TOP NAVBAR ========= -->
<HR>
<CENTER>
<H2>
Hierarchy For Package com.sap.runlet.operationaltransformation
</H2>
</CENTER>
<H2>
Class Hierarchy
</H2>
<UL>
<LI TYPE="circle">java.lang.Object<UL>
<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation"><B>AbstractOperation</B></A>&lt;S&gt; (implements com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;S&gt;)
<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation"><B>ClientServerOperationPair</B></A>&lt;O&gt;<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>PeerImpl</B></A>&lt;O,S&gt; (implements com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>&lt;O,S&gt;)
<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>StatesAndOperations</B></A>&lt;O,S&gt;<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation"><B>UnmergedOperationsQueue</B></A>&lt;O,S&gt;</UL>
</UL>
<H2>
Interface Hierarchy
</H2>
<UL>
<LI TYPE="circle">java.lang.Cloneable<UL>
<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><B>Operation</B></A>&lt;S&gt;</UL>
<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation"><B>Peer</B></A>&lt;O,S&gt;<LI TYPE="circle">com.sap.runlet.operationaltransformation.<A HREF="../../../../com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><B>Transformer</B></A>&lt;O&gt;</UL>
<HR>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<A NAME="navbar_bottom"><!-- --></A>
<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
<TR>
<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
<A NAME="navbar_bottom_firstrow"><!-- --></A>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
<TR ALIGN="center" VALIGN="top">
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../com/sap/runlet/operationaltransformation/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
</TR>
</TABLE>
</TD>
<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
</EM>
</TD>
</TR>
<TR>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
&nbsp;PREV&nbsp;
&nbsp;NEXT</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="../../../../index.html?com/sap/runlet/operationaltransformation/package-tree.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A> &nbsp;
&nbsp;<SCRIPT type="text/javascript">
<!--
if(window==top) {
document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
}
//-->
</SCRIPT>
<NOSCRIPT>
<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
</NOSCRIPT>
</FONT></TD>
</TR>
</TABLE>
<A NAME="skip-navbar_bottom"></A>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<HR>
</BODY>
</HTML>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 B

@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 80
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src
END
@@ -1,31 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/src
https://forge.sap.corp/svn/monet
2009-08-26T06:41:31.887030Z
7755
d046040
8e1b717f-a215-9248-8963-3bf2ea82000e
com
dir
@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 84
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com
END
@@ -1,31 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com
https://forge.sap.corp/svn/monet
2009-08-26T06:41:31.887030Z
7755
d046040
8e1b717f-a215-9248-8963-3bf2ea82000e
sap
dir
@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 88
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap
END
@@ -1,31 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap
https://forge.sap.corp/svn/monet
2009-08-26T06:41:31.887030Z
7755
d046040
8e1b717f-a215-9248-8963-3bf2ea82000e
runlet
dir
@@ -1,5 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 95
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet
END
@@ -1,31 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet
https://forge.sap.corp/svn/monet
2009-08-26T06:41:31.887030Z
7755
d046040
8e1b717f-a215-9248-8963-3bf2ea82000e
operationaltransformation
dir
@@ -1,59 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 121
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation
END
UnmergedOperationsQueue.java
K 25
svn:wc:ra_dav:version-url
V 150
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.java
END
package.html
K 25
svn:wc:ra_dav:version-url
V 134
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/package.html
END
Transformer.java
K 25
svn:wc:ra_dav:version-url
V 138
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/Transformer.java
END
Operation.java
K 25
svn:wc:ra_dav:version-url
V 136
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/Operation.java
END
AbstractOperation.java
K 25
svn:wc:ra_dav:version-url
V 144
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/AbstractOperation.java
END
ClientServerOperationPair.java
K 25
svn:wc:ra_dav:version-url
V 152
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/ClientServerOperationPair.java
END
Peer.java
K 25
svn:wc:ra_dav:version-url
V 131
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/Peer.java
END
PeerImpl.java
K 25
svn:wc:ra_dav:version-url
V 135
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/PeerImpl.java
END
StatesAndOperations.java
K 25
svn:wc:ra_dav:version-url
V 146
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/StatesAndOperations.java
END
@@ -1,337 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation
https://forge.sap.corp/svn/monet
2009-08-26T06:41:31.887030Z
7755
d046040
8e1b717f-a215-9248-8963-3bf2ea82000e
AbstractOperation.java
file
2009-07-30T11:51:34.968750Z
d732c59e20359bd198a33923b2f2d809
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
361
ClientServerOperationPair.java
file
2009-07-30T11:51:43.062500Z
bbb0a1b071ec1902c32a01c097de8e37
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
450
Operation.java
file
2009-07-30T12:03:50.375000Z
554af7f7c8f9950b2c3b028713c5dca5
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
742
Peer.java
file
2009-09-09T09:21:12.312500Z
a213381a03c1b1ca53d5266b07e6db9e
2009-08-26T06:41:31.887030Z
7755
d046040
has-props
4176
PeerImpl.java
file
2009-09-09T09:21:12.359375Z
1ae5677b824ab53f5e384ae1e294af16
2009-08-26T06:41:31.887030Z
7755
d046040
has-props
9644
StatesAndOperations.java
file
2009-07-30T12:03:50.515625Z
564632bf246ea174f06feb9b8275e9ea
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
1264
Transformer.java
file
2009-07-30T11:54:15.703125Z
d5a71d7815754f28c22802dd06c746d3
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
539
UnmergedOperationsQueue.java
file
2009-07-30T11:53:59.046875Z
515f02687bcb23fb5542688142243a25
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
3248
package.html
file
2009-07-30T12:14:25.406250Z
41ed1dde8ca42604ac0c99dd9cbb47b9
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
3188
test
dir
@@ -1,13 +0,0 @@
package com.sap.runlet.operationaltransformation;
public abstract class AbstractOperation<S> implements Operation<S> {
@SuppressWarnings("unchecked")
public AbstractOperation<S> clone() {
try {
return (AbstractOperation<S>) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
@@ -1,20 +0,0 @@
package com.sap.runlet.operationaltransformation;
public class ClientServerOperationPair<O extends Operation<?>> {
private O clientOp;
private O serverOp;
public ClientServerOperationPair(O clientOp, O serverOp) {
super();
this.clientOp = clientOp;
this.serverOp = serverOp;
}
public O getClientOp() {
return clientOp;
}
public O getServerOp() {
return serverOp;
}
}
@@ -1,22 +0,0 @@
package com.sap.runlet.operationaltransformation;
/**
* A change operation can be applied to some start state of some
* universe and transforms that universe into a target state.
*
* @author Axel Uhl D043530
*
* @param <S> the class that models the state, on instances of which operations perform changes
*/
public interface Operation<S> extends Cloneable {
public Operation<S> clone();
/**
* Applies this operation to the state <tt>toState</tt>, producing a new target state
* which is returned.
*
* @param toState the state to which to apply this operation
* @return the state produced by applying this operation to <tt>toState</tt>
*/
S applyTo(S toState);
}
@@ -1,99 +0,0 @@
package com.sap.runlet.operationaltransformation;
/**
* Accepts change operations from clients and maintains a shared state. If new
* clients connect, the full state can be sent to the client for initial
* synchronization. When a change {@link Operation} is received from a client
* that operation will be based on some state. Since that state the
* server may have applied one or more change operations already. In order to
* synchronize the requesting client, the server transforms all in-between
* change operations for the requesting client and sends those transformation
* results back to the requesting client. The client's operation, in turn, is
* disseminated to all other clients for them to merge into their local replica
* of the global state.
*
* @author Axel Uhl D043530
*
* @param <O> the type of operations that can be applied to the states
* @param <S> the type of the states on which the operations perform changes
*/
public interface Peer<O extends Operation<S>, S> {
/**
* Enumeration representing the two valid roles a peer can have. There must
* be exactly one server, multiple clients are allowed.
*
* @author Jan Karstens D046040
*
*/
public enum Role {
SERVER, CLIENT
}
/**
* Registers a peer with this peer for replication. From this point on, this
* peer will remember which operations it has forwarded to that peer for
* later transformation jobs for operations coming in from that client.<p>
*
* The <tt>peer</tt> is expected to set the state returned by this operation
* as its initial state.
*
* @return the current server state; the calling client can use this as its
* initial state
*/
S addPeer(Peer<O, S> peer);
/**
* Usually, the framework handles calls to this method and framework users
* should therefore not need to call this method.
* <p>
*
* Synchronizes an <tt>operation</tt> from the <tt>source</tt> peer to this
* peer. The <tt>source</tt> peer specifies how many operations from this
* peer it already merged into its operations sequence before having
* executed <tt>operation</tt>.
* <p>
*
* The operation has to be transformed using this peer's operational
* transformation and using the sequence of operations applied to the
* operation's start state up to this peer's current state. This results in
* the operation that needs to be applied to the current state to produce
* the next state.
* <p>
*
* After applying this possibly transformed operation to this peer's current
* state and thus producing a new current state, all registered peers except
* <tt>source</tt> are notified about the change by sending them the
* transformed operation.
*
*/
void apply(Peer<O, S> source, O operation, int numberOfOperationsSourceHasMergedFromThis);
/**
* Applies a change operation locally to the current peer's state.
*/
void apply(O operation);
/**
* Tells this peer that the <tt>source</tt> peer has successfully merged
* <tt>numberOfMergedOperations</tt> altogether coming from this peer
* into its operation sequence. This peer can take this as an opportunity
* to clean up the queue and remove the transformed copies of all operations
* up to number <tt>numberOfMergedOperations-1</tt>.
*/
void confirm(Peer<O, S> source, int numberOfMergedOperations);
/**
* Tells the current state in which the peer is. This is the state constructed by
* the sequence of calls to {@link #apply(Operation)} and the merged in notifications
* from other peers.
*/
S getCurrentState();
/**
* Blocks until the queue of tasks that works on achieving consistency across peers
* has completely drained. This can be useful for testing purposes when you want to
* wait until consistency has been reached across clients and server.
*/
void waitForNotRunning();
}
@@ -1,255 +0,0 @@
package com.sap.runlet.operationaltransformation;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* A very simple peer implementation for operational transformations that starts
* out with a provided initial state and then receives operations which it applies
* to its state. It manages a set of clients. Using the <tt>server</tt> constructor
* parameter one can configure whether this peer is a client or a server.
*
* @author Axel Uhl D043530
*
* @param <O> type of change operations to be processed by this server
* @param <S> type of state managed by this server to which the operations can be applied
*/
public class PeerImpl<O extends Operation<S>, S> implements Peer<O, S> {
private String name;
private StatesAndOperations<O, S> statesAndOperations;
/**
* Tells if this peer acts in the server or client role. This is used to determine in which
* direction to apply the operational transformation.
*/
private Role role;
/**
* Tells if this peer is currently actively running, with a certain number of pending / running requests
*/
private int running = 0;
/**
* Queues operations sent out to a peer in {@link #updatePeers(Operation, Peer)} and whose
* merging has not yet been confirmed by that peer. Those messages are transformed when an
* operation from that peer is applied. When applying an operation to the peer has been
* confirmed, the first operation from the queue is removed because operations sent
* from this peer to the remote peer are processed in order.
*/
private Map<Peer<O, S>, UnmergedOperationsQueue<O, S>> unmergedOperationsForPeer = new HashMap<Peer<O, S>, UnmergedOperationsQueue<O, S>>();
/**
* Remembers per peer how many of that peer's operations this peer has already
* applied locally.
*/
private Map<Peer<O, S>, Integer> numberOfMergedOperations = new HashMap<Peer<O, S>, Integer>();
private Transformer<O> transformer;
/**
* The background task handler which sends out the asynchronous updates to the peers.
*/
private ExecutorService merger;
public PeerImpl(Transformer<O> transformer, S initialState, Role role) {
this.transformer = transformer;
statesAndOperations = new StatesAndOperations<O, S>(initialState);
this.role = role;
this.merger = Executors.newSingleThreadExecutor();
}
public PeerImpl(String name, Transformer<O> transformer, S initialState, Role role) {
this(transformer, initialState, role);
this.name = name;
}
/**
* Constructs a client peer and connects it to the <tt>server</tt> peer, establishing
* the two-way link between client and server peers. The initial state is taken from
* the server.
*/
public PeerImpl(Transformer<O> transformer, Peer<O, S> server) {
this.transformer = transformer;
S initialState = server.addPeer(this);
statesAndOperations = new StatesAndOperations<O, S>(initialState);
this.role = Role.CLIENT;
this.merger = Executors.newSingleThreadExecutor();
addPeer(server);
}
/**
* Constructs a client peer with a name and connects it to the
* <tt>server</tt> peer, establishing the two-way link between client and
* server peers. The initial state is taken from the server.
*/
public PeerImpl(String name, Transformer<O> transformer, Peer<O, S> server) {
this(transformer, server);
this.name = name;
}
@Override
public void finalize() {
merger.shutdown();
}
private Transformer<O> getTransformer() {
return transformer;
}
@Override
public S addPeer(Peer<O, S> peer) {
if ( role == Role.CLIENT && getPeers().size() > 0) {
throw new RuntimeException("A client must be connected to at most one server");
}
unmergedOperationsForPeer.put(peer, new UnmergedOperationsQueue<O, S>());
numberOfMergedOperations.put(peer, 0);
return getCurrentState();
}
private Collection<Peer<O, S>> getPeers() {
return unmergedOperationsForPeer.keySet();
}
public S getCurrentState() {
return statesAndOperations.getCurrentState();
}
@Override
public synchronized void apply(O operation) {
taskStarted();
statesAndOperations.apply(operation);
updatePeers(operation, /* except */ null);
taskFinished();
}
@Override
public synchronized void apply(final Peer<O, S> source, O operation,
final int numberOfOperationsSourceHasMergedFromThis) {
taskStarted();
if (!getPeers().contains(source)) {
throw new RuntimeException("Peer "+source+" not registered with peer "+this);
}
// Starting from base up to current, compute transformed operation sequence to send
// to client; this will create a sequence of states for the client which eventually
// leads up to a state that equals the server's current state.
O transformedOp = operation;
UnmergedOperationsQueue<O, S> unmergedOperationsForSource = unmergedOperationsForPeer.get(source);
int localOpNumber = numberOfOperationsSourceHasMergedFromThis;
for (O unconfirmedOperation : unmergedOperationsForSource.getUnmergedOperations(numberOfOperationsSourceHasMergedFromThis)) {
if (role == Role.SERVER) {
ClientServerOperationPair<O> pair = getTransformer().transform(transformedOp, unconfirmedOperation);
transformedOp = pair.getClientOp();
unmergedOperationsForSource.updateWithTransformed(localOpNumber, pair.getServerOp());
} else {
ClientServerOperationPair<O> pair = getTransformer().transform(unconfirmedOperation, transformedOp);
transformedOp = pair.getServerOp();
unmergedOperationsForSource.updateWithTransformed(localOpNumber, pair.getClientOp());
}
localOpNumber++;
}
statesAndOperations.apply(transformedOp); // produce a new current state
final int numberOfMergedOperationsFromSource = numberOfMergedOperations.get(source)+1;
numberOfMergedOperations.put(source, numberOfMergedOperationsFromSource);
// It's important that the following call to confirm is synchronized with the
// sending of updates to the source peer. Therefore, the confirm call is executed
// in the same serializing background thread:
scheduleTask(new Runnable() {
public void run() {
source.confirm(PeerImpl.this, numberOfMergedOperationsFromSource);
}
});
updatePeers(transformedOp, /* except */source);
taskFinished();
}
/**
* Propagates the changes described by <tt>operation</tt> to all registered
* peers (except the peer identified by <tt>except</tt> if not <tt>null</tt>
* ). For each peer, the operation is sent along to that peer's
* {@link #apply(Peer, Operation, int)} method together with the
* {@link #numberOfMergedOperations number of operations currently merged
* from that peer}.
*/
private synchronized void updatePeers(final O operation, Peer<O, S> except) {
for (final Peer<O, S> peer : getPeers()) {
if (except == null || !except.equals(peer)) {
unmergedOperationsForPeer.get(peer).sentOutOperation(operation);
// remember the number of merged operations while still in synchronized block
final int numberOfMergedOpsForPeer = numberOfMergedOperations.get(peer);
scheduleTask(new Runnable() {
public void run() {
/*
* Thoughts on locking: The peer runs the folling apply(...) call synchronized.
* Therefore, it can't take other apply calls (local or from other peers) during
* that time. It may, though, have pending tasks in its updatePeers that can
* continue to run. This may include updates for this peer which would be received
* by this peer's apply(...) method.
*/
peer.apply(PeerImpl.this, operation, numberOfMergedOpsForPeer);
}
});
}
}
}
public String toString() {
if (name != null) {
return name;
} else {
return (role == Role.SERVER?"server":"client")+" "+super.toString();
}
}
@Override
public void confirm(Peer<O, S> source, int numberOfMergedOperations) {
unmergedOperationsForPeer.get(source).confirm(numberOfMergedOperations);
}
/**
* Records that a new task is scheduled by incrementing {@link #running} by one, then
* schedules the <tt>runnable</tt> with the {@link #merger} executor service. The
* <tt>runnable</tt> is wrapped such that when its execution has finished,
* {@link #taskFinished()} will be called such that {@link #running} is decremented
* properly again and waiting clients in {@link #waitForNotRunning()} can be unblocked.
*/
private void scheduleTask(final Runnable runnable) {
taskStarted();
merger.execute(new Runnable() {
public void run() {
runnable.run();
taskFinished();
}
});
}
private void taskStarted() {
running++;
}
/**
* Must be called by all tasks submitted to the {@link #merger} when finished.
* Unblocks {@link #waitForNotRunning()} if the merger's queue got empty by this.
*/
private synchronized void taskFinished() {
running--;
if (running == 0) {
notifyAll();
}
}
@Override
public synchronized void waitForNotRunning() {
while (running > 0) {
try {
wait();
} catch (InterruptedException e) {
// ignore interruption, try again
}
}
}
}
@@ -1,42 +0,0 @@
package com.sap.runlet.operationaltransformation;
import java.util.LinkedList;
import java.util.List;
/**
* Maintains a list of states and the operations that transformed the i-th into
* the i+1st, starting with an initial state. Using {@link #apply(Operation)},
* operation/state pairs can be appended to the end.
* <p>
*
* @author Axel Uhl D043530
*
*/
public class StatesAndOperations<O extends Operation<S>, S> {
private List<S> states = new LinkedList<S>();
private List<O> operations = new LinkedList<O>();
public StatesAndOperations(S initialState) {
states.add(initialState);
}
/**
* Applies the <tt>operation</tt> to the {@link #getCurrentState() current
* state} and records both, the new current state and the operation.
*
* @return the new current state that results from applying
* <tt>operation</tt> to the state that was current when the
* operation was invoked.
*/
public synchronized S apply(O operation) {
S result = operation.applyTo(getCurrentState());
states.add(result);
operations.add(operation);
return result;
}
public S getCurrentState() {
return states.get(states.size() - 1);
}
}
@@ -1,12 +0,0 @@
package com.sap.runlet.operationaltransformation;
public interface Transformer<O extends Operation<?>> {
/**
* Takes an operation from the client and an operation from the server, both
* based on the same state. The complementary pair of operations is computed
* such that if the client applies the server operation returned, and the
* server applies the client operation returned, both end up in equal states
* again.
*/
ClientServerOperationPair<O> transform(O clientOp, O serverOp);
}
@@ -1,91 +0,0 @@
package com.sap.runlet.operationaltransformation;
import java.util.ArrayList;
import java.util.List;
public class UnmergedOperationsQueue<O extends Operation<S>, S> {
/**
* As the {@link #unmergedOperationsForPeer} queues are cleaned up whenever merge
* confirmations are received from peers, we need to remember which local operation
* number the first element in the queue resulted from.
*/
private int numberOfFirstInList;
private List<O> unmergedOperations;
public UnmergedOperationsQueue() {
numberOfFirstInList = 0;
unmergedOperations = new ArrayList<O>(5);
}
/**
* After an operation has been locally applied and needs to be propagated
* to the peer for which this is the queue of unmerged operations, the operation
* must be appended to this queue.
*/
public synchronized void sentOutOperation(O operationSentOut) {
unmergedOperations.add(operationSentOut);
}
/**
* Returns a copied list of unmerged and stepwise transformed local
* operations starting at the requested local operation number.
*
* @param numberOfConfirmedLocalOperations
* A value of 0 means that the remote peer has not confirmed the
* merge of any local operation yet.
*/
public synchronized List<O> getUnmergedOperations(int numberOfConfirmedLocalOperations) {
return new ArrayList<O>(unmergedOperations.subList(
numberOfConfirmedLocalOperations-numberOfFirstInList,
unmergedOperations.size()));
}
/**
* Replaces the local operation with number <tt>localOperationNumber</tt> in the queue by
* <tt>transformedOperation</tt>.
*
* @param localOperationNumber starts with 0
*/
public synchronized void updateWithTransformed(int localOperationNumber, O transformedOperation) {
unmergedOperations.set(localOperationNumber-numberOfFirstInList, transformedOperation);
}
/**
* Cleans up the queue so that only unconfirmed / unmerged operations
* remain. Afterwards, {@link #getUnmergedOperations(int) asking for an
* unmerged operation} with an argument for
* <tt>numberOfConfirmedLocalOperations</tt> smaller than
* <tt>numberOfMergedOperations</tt> passed to this call will result in an
* exception.
*
* @param numberOfMergedOperations
* tells how many operations that emerged from the local peer the
* remote peer has confirmed to have merged.
*/
public synchronized void confirm(int numberOfMergedOperations) {
for (int i=numberOfFirstInList; i<numberOfMergedOperations; i++) {
unmergedOperations.remove(0);
}
numberOfFirstInList = numberOfMergedOperations;
}
public synchronized String toString() {
int i=numberOfFirstInList;
StringBuilder result = new StringBuilder();
result.append('[');
boolean first = true;
for (O op : unmergedOperations) {
if (!first) {
result.append(", ");
} else {
first = false;
}
result.append(i);
result.append(": ");
result.append(op);
}
result.append(']');
return result.toString();
}
}
@@ -1,58 +0,0 @@
<body>
<p>
Use the contents of this package for so-called <em>operational transformations</em>.
This can be used to synchronize the states of a number of clients with a single server.
The synchronization is performed asynchronously. The construction of the transformation
function guarantees to lead to eventual consistency across clients and server.
Read more about the general background of the algorithm on which this is based
<a href="../docs/JupiterCollaborationSystem_Nichols.pdf">here</a>.
</p>
<p>
To establish a server to which clients can connect, first decide how your <em>state</em>
is encoded on which the <em>operations</em> will perform changes to transition from one
state to the next. Then, design your operations class. The trickiest part comes next. You
have to define a transformer that maps a pair of your operations to another pair of
operations of the same type. The transformer has to implement the
{@link com.sap.runlet.operationaltransformation.Transformer} interface, in particular
the {@link com.sap.runlet.operationaltransformation.Transformer#transform} method. The
transformation function assumes that both input operations have been applied to the same
state, one on a client, the other one on the server. The resulting operation for the client
applied on the client must lead to a state equal to the state reached on the server by
applying the resulting operation for the server to the server's state.
</p>
<p>
Put formally, if <em>t</em> is a transformer, and
if we have <em>s_c</em> as the state on the client and <em>s_s</em> as the state
on the server, and <em>c</em> as the operation that was executed in state <em>s_c</em> on the
client, and <em>s</em> as the operation executed on the server in state <em>s_s</em>, then the
following condition must hold:<br>
<pre>
t.transform(c, s).getClientOp().applyTo(c.applyTo(s_c).equals(
t.transform(c, s).getServerOp().applyTo(s.applyTo(s_s))
</pre>
</p>
<p>
You can create servers and clients, e.g., as follows:
<pre>
server = new {@link com.sap.runlet.operationaltransformation.PeerImpl PeerImpl}<MyOperationType, MyStateType>(
"Server", new MyTransformer(), /* initial state */ new MyStateType(...), /* server */ true);
client1 = new {@link com.sap.runlet.operationaltransformation.PeerImpl PeerImpl}<MyOperationType, MyStateType>("Client1", new MyTransformer(), server);
client2 = new {@link com.sap.runlet.operationaltransformation.PeerImpl PeerImpl}<MyOperationType, MyStateType>("Client2", new MyTransformer(), server);
</pre>
After that, you can start sending operations to the clients using the
{@link com.sap.runlet.operationaltransformation.Peer#apply} method as follows:
<pre>
client1.{@link com.sap.runlet.operationaltransformation.Peer#apply apply}(new MyOperationType(...));
client2.{@link com.sap.runlet.operationaltransformation.Peer#apply apply}(new MyOperationType(...));
...
</pre>
and those changes will eventually get synchronized across all clients and the server. You can
obtain the current state of a peer using the {@link com.sap.runlet.operationaltransformation.Peer#getCurrentState}
operation.
</p>
</body>
@@ -1,11 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 126
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/test
END
OperationalTransformationTests.java
K 25
svn:wc:ra_dav:version-url
V 162
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/test/OperationalTransformationTests.java
END
@@ -1,73 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/test
https://forge.sap.corp/svn/monet
2009-08-26T06:41:31.887030Z
7755
d046040
8e1b717f-a215-9248-8963-3bf2ea82000e
empty
OperationalTransformationTests.java
file
2009-09-09T09:21:11.984375Z
c6ff5315b3ae61ceddfbe71b4ff90362
2009-08-26T06:41:31.887030Z
7755
d046040
has-props
6997
util
dir
@@ -1,197 +0,0 @@
package com.sap.runlet.operationaltransformation.test;
import java.util.Random;
import java.util.UUID;
import junit.framework.TestCase;
import com.sap.runlet.operationaltransformation.AbstractOperation;
import com.sap.runlet.operationaltransformation.ClientServerOperationPair;
import com.sap.runlet.operationaltransformation.Peer;
import com.sap.runlet.operationaltransformation.PeerImpl;
import com.sap.runlet.operationaltransformation.Transformer;
import com.sap.runlet.operationaltransformation.Peer.Role;
import com.sap.runlet.operationaltransformation.test.util.Base64;
public class OperationalTransformationTests extends TestCase {
private Peer<StringInsertOperation, StringState> server;
private Peer<StringInsertOperation, StringState> client1, client2;
public static class StringInsertOperation extends AbstractOperation<StringState> {
private int pos;
private String s;
public StringInsertOperation(int pos, String s) {
this.pos = pos;
this.s = s;
}
public StringInsertOperation clone() {
return (StringInsertOperation) super.clone();
}
public int getPos() {
return pos;
}
public String getS() {
return s;
}
public String toString() {
return "insert("+getPos()+", \""+getS()+"\")";
}
@Override
public StringState applyTo(StringState toState) {
return toState.apply(this);
}
}
public static class StringInsertTransformer implements Transformer<StringInsertOperation> {
@Override
public ClientServerOperationPair<StringInsertOperation> transform(StringInsertOperation clientOp, StringInsertOperation serverOp) {
StringInsertOperation resultClientOp;
StringInsertOperation resultServerOp;
if (clientOp.getPos() >= serverOp.getPos()) {
resultServerOp = serverOp;
resultClientOp = new StringInsertOperation(clientOp.getPos()+serverOp.getS().length(), clientOp.getS());
} else {
resultClientOp = clientOp;
resultServerOp = new StringInsertOperation(serverOp.getPos()+clientOp.getS().length(), serverOp.getS());
}
return new ClientServerOperationPair<StringInsertOperation>(resultClientOp, resultServerOp);
}
}
public static class StringState {
private String state;
private UUID id;
public String getState() {
return state;
}
public boolean equals(Object o) {
return o instanceof StringState &&
this.getState().equals(((StringState) o).getState()) &&
this.id.equals(((StringState) o).id);
}
public int hashCode() {
return getState().hashCode() ^ id.hashCode();
}
public StringState(String state) {
super();
id = UUID.randomUUID();
this.state = state;
}
public StringState apply(StringInsertOperation operation) {
String s = this.getState().substring(0, operation.getPos()) +
operation.getS()+this.getState().substring(operation.getPos());
StringState result = new StringState(s);
return result;
}
private UUID getId() {
return id;
}
protected void setId(UUID id) {
this.id = id;
}
public String toString() {
return "\""+getState()+"\" @ "+getId();
}
}
public static class SimpleClient extends PeerImpl<StringInsertOperation, StringState> {
public SimpleClient(String name, StringState initialState) {
super(name, new StringInsertTransformer(), initialState, Role.SERVER);
}
}
public void setUp() {
server = new PeerImpl<StringInsertOperation, StringState>(
"Server", new StringInsertTransformer(), new StringState(""), Role.SERVER);
client1 = new PeerImpl<StringInsertOperation, StringState>("Client1", new StringInsertTransformer(), server);
client2 = new PeerImpl<StringInsertOperation, StringState>("Client2", new StringInsertTransformer(), server);
}
public void testBasicTransformation() {
client1.apply(new StringInsertOperation(0, "abc"));
client2.apply(new StringInsertOperation(0, "def"));
client1.waitForNotRunning();
client2.waitForNotRunning();
server.waitForNotRunning();
assertEquals(server.getCurrentState().getState(), client1.getCurrentState().getState());
assertEquals(server.getCurrentState().getState(), client2.getCurrentState().getState());
assertEquals(6, server.getCurrentState().getState().length());
assertTrue(server.getCurrentState().getState().equals("abcdef") || server.getCurrentState().getState().equals("defabc"));
}
public void testTwoMassInserts() {
final int COUNT = 100;
for (int i = 0; i < COUNT; i++) {
client1.apply(new StringInsertOperation(0, "abc"));
client2.apply(new StringInsertOperation(0, "def"));
}
client1.waitForNotRunning();
client2.waitForNotRunning();
server.waitForNotRunning();
assertEquals(server.getCurrentState().getState(), client1.getCurrentState().getState());
assertEquals(server.getCurrentState().getState(), client2.getCurrentState().getState());
assertEquals(6*COUNT, server.getCurrentState().getState().length());
}
/**
* Randomizes the number of changes applied to each client per iteration,
* the insert position and the string to be inserted.
*/
public void testRandomInserts() {
final int COUNT = 100;
Random r = new Random();
int totalLength = 0;
for (int i = 0; i < COUNT; i++) {
for (int j = r.nextInt(10); j > 0; j--) {
byte[] b = new byte[r.nextInt(10)];
r.nextBytes(b);
String s = Base64.encode(b);
client1.apply(new StringInsertOperation(
r.nextInt(client1.getCurrentState().getState().length()+1), s));
totalLength += s.length();
}
for (int j = r.nextInt(10); j > 0; j--) {
byte[] b = new byte[r.nextInt(10)];
r.nextBytes(b);
String s = Base64.encode(b);
client2.apply(new StringInsertOperation(
r.nextInt(client2.getCurrentState().getState().length()+1), s));
totalLength += s.length();
}
}
client1.waitForNotRunning();
client2.waitForNotRunning();
server.waitForNotRunning();
assertEquals(server.getCurrentState().getState(), client1.getCurrentState().getState());
assertEquals(server.getCurrentState().getState(), client2.getCurrentState().getState());
assertEquals(totalLength, server.getCurrentState().getState().length());
}
public void testTwoMassInsertsWithServerReplica() {
Peer<StringInsertOperation, StringState> server2 = new PeerImpl<StringInsertOperation, StringState>("Server2",
new StringInsertTransformer(), server);
final int COUNT = 100;
for (int i = 0; i < COUNT; i++) {
client1.apply(new StringInsertOperation(0, "abc"));
client2.apply(new StringInsertOperation(0, "def"));
}
client1.waitForNotRunning();
client2.waitForNotRunning();
server.waitForNotRunning();
server2.waitForNotRunning();
assertEquals(server.getCurrentState().getState(), client1.getCurrentState().getState());
assertEquals(server.getCurrentState().getState(), client2.getCurrentState().getState());
assertEquals(server.getCurrentState().getState(), server2.getCurrentState().getState());
assertEquals(6*COUNT, server2.getCurrentState().getState().length());
}
}
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
public abstract class AbstractOperation<S> implements Operation<S> {
@SuppressWarnings("unchecked")
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
public class ClientServerOperationPair<O extends Operation<?>> {
private O clientOp;
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
/**
* A change operation can be applied to some start state of some
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
/**
* Accepts change operations from clients and maintains a shared state. If new
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
import java.util.Collection;
import java.util.HashMap;
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
import java.util.LinkedList;
import java.util.List;
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
public interface Transformer<O extends Operation<?>> {
/**
@@ -1,4 +1,4 @@
package com.sap.runlet.operationaltransformation;
package com.sap.sailing.operationaltransformation;
import java.util.ArrayList;
import java.util.List;
@@ -1,11 +0,0 @@
K 25
svn:wc:ra_dav:version-url
V 131
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/test/util
END
Base64.java
K 25
svn:wc:ra_dav:version-url
V 143
/svn/monet/!svn/ver/7651/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/test/util/Base64.java
END
@@ -1,70 +0,0 @@
10
dir
9910
https://forge.sap.corp/svn/monet/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com/sap/runlet/operationaltransformation/test/util
https://forge.sap.corp/svn/monet
2009-07-30T13:54:09.892881Z
7651
d043530
8e1b717f-a215-9248-8963-3bf2ea82000e
empty
Base64.java
file
2009-07-30T12:31:05.390625Z
e8f4864c6e3971e407e14d13f2fdccb4
2009-07-30T13:54:09.892881Z
7651
d043530
has-props
7965
@@ -1,210 +0,0 @@
package com.sap.runlet.operationaltransformation.test.util;
/**
* Implements a BASE64 encoder and decoder. Class <code>Base64</code> provides
* static encoding- and decoding-methods for describing binary data through
* printable characters. The implementation is compliant to RFC 1521.
*
* @copyright @version $Revision: #1 $.
* @author Stefan Kusterer, Last modified by $Author: d038253 $, Change list
* $Change: 156641 $.
*/
public class Base64 {
protected static final char[] CHAR_LOOKUP_ARRAY = {
/* 0 */'A', /* 1 */'B', /* 2 */'C', /* 3 */'D',
/* 4 */'E', /* 5 */'F', /* 6 */'G', /* 7 */'H',
/* 8 */'I', /* 9 */'J', /* 10 */'K', /* 11 */'L',
/* 12 */'M', /* 13 */'N', /* 14 */'O', /* 15 */'P',
/* 16 */'Q', /* 17 */'R', /* 18 */'S', /* 19 */'T',
/* 20 */'U', /* 21 */'V', /* 22 */'W', /* 23 */'X',
/* 24 */'Y', /* 25 */'Z',
/* 26 */'a', /* 27 */'b', /* 28 */'c', /* 29 */'d',
/* 30 */'e', /* 31 */'f', /* 32 */'g', /* 33 */'h',
/* 34 */'i', /* 35 */'j', /* 36 */'k', /* 37 */'l',
/* 38 */'m', /* 39 */'n', /* 40 */'o', /* 41 */'p',
/* 42 */'q', /* 43 */'r', /* 44 */'s', /* 45 */'t',
/* 46 */'u', /* 47 */'v', /* 48 */'w', /* 49 */'x',
/* 50 */'y', /* 51 */'z',
/* 52 */'0', /* 53 */'1', /* 54 */'2', /* 55 */'3',
/* 56 */'4', /* 57 */'5', /* 58 */'6', /* 59 */'7',
/* 60 */'8', /* 61 */'9',
/* 62 */'+', /* 63 */'/',
/* pad */'=' };
protected static final int[] VALUE_LOOKUP_ARRAY = new int[128];
static // Initializer
{
for ( char i = 0; i < VALUE_LOOKUP_ARRAY.length; i++ ) {
if ( CHAR_LOOKUP_ARRAY[0] <= i && i <= CHAR_LOOKUP_ARRAY[25] ) {
VALUE_LOOKUP_ARRAY[i] = ( i - CHAR_LOOKUP_ARRAY[0] );
} else if ( CHAR_LOOKUP_ARRAY[26] <= i && i <= CHAR_LOOKUP_ARRAY[51] ) {
VALUE_LOOKUP_ARRAY[i] = ( i - CHAR_LOOKUP_ARRAY[26] ) + 26;
} else if ( CHAR_LOOKUP_ARRAY[52] <= i && i <= CHAR_LOOKUP_ARRAY[61] ) {
VALUE_LOOKUP_ARRAY[i] = ( i - CHAR_LOOKUP_ARRAY[52] ) + 52;
} else if ( i == CHAR_LOOKUP_ARRAY[62] ) {
VALUE_LOOKUP_ARRAY[i] = 62;
} else if ( i == CHAR_LOOKUP_ARRAY[63] ) {
VALUE_LOOKUP_ARRAY[i] = 63;
} else if ( i == CHAR_LOOKUP_ARRAY[64] ) {
VALUE_LOOKUP_ARRAY[i] = -1;
} else {
VALUE_LOOKUP_ARRAY[i] = -2;
}
}
}
// do not allow to instantiate this class
protected Base64( ) {
// only static methods
}
public final static byte[] decode(String in) {
char[] c = new char[in.length()];
in.getChars(0, in.length(), c, 0);
return decode(c);
}
/**
* <code>decode</code> a given array of characters.
*
* @param in The input array of characters
* @return The array of bytes
*/
public final static byte[] decode( char[] in ) {
if ( in == null || in.length == 0 ) {
return new byte[0];
}
int index_in;
int index_out;
int helper_1 = 0;
int helper_2 = 0;
int mod = 0;
int in_length = in.length;
int chr;
// Determine number of used characters: Ignore linebreaks etc. and count
// trailing =-signes
for ( index_in = 0; index_in < in.length; index_in++ ) {
chr = in[index_in];
if ( chr >= 128 ) {
in_length--;
} else if (VALUE_LOOKUP_ARRAY[chr] < 0) {
in_length--;
}
}
// Allocate out-buffer
byte out[] = new byte[( in_length >>> 2 ) * 3 + ( ( in_length & 0x03 ) > 0 ? ( in_length & 0x03 ) - 1 : 0 )];
// Do the real decoding
for ( index_in = 0, index_out = 0; index_in < in.length && index_out < out.length; index_in++ ) {
chr = in[index_in];
if ( chr > 127 || VALUE_LOOKUP_ARRAY[chr] == -2 ) {
continue;
}
helper_1 = helper_2;
helper_2 = VALUE_LOOKUP_ARRAY[chr] > 0 ? VALUE_LOOKUP_ARRAY[chr] : 0;
switch ( mod ) {
case 0:
// no operation
break;
case 1:
out[index_out++] = (byte) ( ( helper_1 << 2 ) & 0xFC | ( helper_2 >>> 4 ) & 0x03 );
break;
case 2:
out[index_out++] = (byte) ( ( helper_1 << 4 ) & 0xF0 | ( helper_2 >>> 2 ) & 0x0F );
break;
case 3:
out[index_out++] = (byte) ( ( helper_1 << 6 ) & 0xC0 | helper_2 & 0x3F );
break;
}
mod = ( mod < 3 ? mod + 1 : 0 );
}
return out;
}
/**
* Add a charcter to an array of chars and insert linebreas if necessary
*/
private final static int writeToCharArray( char[] out, int idx, char chr ) {
out[idx++] = chr;
return idx;
}
/**
* <code>encode</code> a given array.
*
* @param in the input array of binary data
* @return The array of characters
*/
public final static String encode( byte[] in ) {
if ( in == null ) {
return null;
}
int index_in;
int index_out;
char chr;
// Allocate buffer for result: Consider chars for trailing =-signs
// and linebreaks.
char out[] = new char[( ( ( in.length + 2 ) / 3 ) << 2 )];
for ( index_in = 0, index_out = 0; index_in < in.length - 2; index_in += 3 ) {
// compute first byte: highest six bits of first byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in] >>> 2 ) & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
// compute second byte: lowest two bits of first byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in] << 4 ) & 0x30 |
// and highest four bits of second byte
( in[index_in + 1] >>> 4 ) & 0x0F];
index_out = writeToCharArray( out, index_out, chr );
// compute third byte: lowest four bits of second byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in + 1] << 2 ) & 0x3C |
// and higest two bits of third byte
( in[index_in + 2] >>> 6 ) & 0x03];
index_out = writeToCharArray( out, index_out, chr );
// compute fourth byte: lowest six bits of third byte
chr = CHAR_LOOKUP_ARRAY[in[index_in + 2] & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
}
// take care of the last bytes (one or two)
if ( index_in < in.length ) {
chr = CHAR_LOOKUP_ARRAY[( in[index_in] >>> 2 ) & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
if ( index_in < in.length - 1 ) {
// there are two remaining bytes
chr = CHAR_LOOKUP_ARRAY[( in[index_in] << 4 ) & 0x30 | ( in[index_in + 1] >>> 4 ) & 0x0F];
index_out = writeToCharArray( out, index_out, chr );
chr = CHAR_LOOKUP_ARRAY[( in[index_in + 1] << 2 ) & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
} else {
// there is only one remaining byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in] << 4 ) & 0x30];
index_out = writeToCharArray( out, index_out, chr );
}
}
// add padding =-signs if required
while ( index_out < out.length ) {
index_out = writeToCharArray( out, index_out, CHAR_LOOKUP_ARRAY[64] );
}
return new String(out);
}
}
@@ -1,210 +0,0 @@
package com.sap.runlet.operationaltransformation.test.util;
/**
* Implements a BASE64 encoder and decoder. Class <code>Base64</code> provides
* static encoding- and decoding-methods for describing binary data through
* printable characters. The implementation is compliant to RFC 1521.
*
* @copyright @version $Revision: #1 $.
* @author Stefan Kusterer, Last modified by $Author: d038253 $, Change list
* $Change: 156641 $.
*/
public class Base64 {
protected static final char[] CHAR_LOOKUP_ARRAY = {
/* 0 */'A', /* 1 */'B', /* 2 */'C', /* 3 */'D',
/* 4 */'E', /* 5 */'F', /* 6 */'G', /* 7 */'H',
/* 8 */'I', /* 9 */'J', /* 10 */'K', /* 11 */'L',
/* 12 */'M', /* 13 */'N', /* 14 */'O', /* 15 */'P',
/* 16 */'Q', /* 17 */'R', /* 18 */'S', /* 19 */'T',
/* 20 */'U', /* 21 */'V', /* 22 */'W', /* 23 */'X',
/* 24 */'Y', /* 25 */'Z',
/* 26 */'a', /* 27 */'b', /* 28 */'c', /* 29 */'d',
/* 30 */'e', /* 31 */'f', /* 32 */'g', /* 33 */'h',
/* 34 */'i', /* 35 */'j', /* 36 */'k', /* 37 */'l',
/* 38 */'m', /* 39 */'n', /* 40 */'o', /* 41 */'p',
/* 42 */'q', /* 43 */'r', /* 44 */'s', /* 45 */'t',
/* 46 */'u', /* 47 */'v', /* 48 */'w', /* 49 */'x',
/* 50 */'y', /* 51 */'z',
/* 52 */'0', /* 53 */'1', /* 54 */'2', /* 55 */'3',
/* 56 */'4', /* 57 */'5', /* 58 */'6', /* 59 */'7',
/* 60 */'8', /* 61 */'9',
/* 62 */'+', /* 63 */'/',
/* pad */'=' };
protected static final int[] VALUE_LOOKUP_ARRAY = new int[128];
static // Initializer
{
for ( char i = 0; i < VALUE_LOOKUP_ARRAY.length; i++ ) {
if ( CHAR_LOOKUP_ARRAY[0] <= i && i <= CHAR_LOOKUP_ARRAY[25] ) {
VALUE_LOOKUP_ARRAY[i] = ( i - CHAR_LOOKUP_ARRAY[0] );
} else if ( CHAR_LOOKUP_ARRAY[26] <= i && i <= CHAR_LOOKUP_ARRAY[51] ) {
VALUE_LOOKUP_ARRAY[i] = ( i - CHAR_LOOKUP_ARRAY[26] ) + 26;
} else if ( CHAR_LOOKUP_ARRAY[52] <= i && i <= CHAR_LOOKUP_ARRAY[61] ) {
VALUE_LOOKUP_ARRAY[i] = ( i - CHAR_LOOKUP_ARRAY[52] ) + 52;
} else if ( i == CHAR_LOOKUP_ARRAY[62] ) {
VALUE_LOOKUP_ARRAY[i] = 62;
} else if ( i == CHAR_LOOKUP_ARRAY[63] ) {
VALUE_LOOKUP_ARRAY[i] = 63;
} else if ( i == CHAR_LOOKUP_ARRAY[64] ) {
VALUE_LOOKUP_ARRAY[i] = -1;
} else {
VALUE_LOOKUP_ARRAY[i] = -2;
}
}
}
// do not allow to instantiate this class
protected Base64( ) {
// only static methods
}
public final static byte[] decode(String in) {
char[] c = new char[in.length()];
in.getChars(0, in.length(), c, 0);
return decode(c);
}
/**
* <code>decode</code> a given array of characters.
*
* @param in The input array of characters
* @return The array of bytes
*/
public final static byte[] decode( char[] in ) {
if ( in == null || in.length == 0 ) {
return new byte[0];
}
int index_in;
int index_out;
int helper_1 = 0;
int helper_2 = 0;
int mod = 0;
int in_length = in.length;
int chr;
// Determine number of used characters: Ignore linebreaks etc. and count
// trailing =-signes
for ( index_in = 0; index_in < in.length; index_in++ ) {
chr = in[index_in];
if ( chr >= 128 ) {
in_length--;
} else if (VALUE_LOOKUP_ARRAY[chr] < 0) {
in_length--;
}
}
// Allocate out-buffer
byte out[] = new byte[( in_length >>> 2 ) * 3 + ( ( in_length & 0x03 ) > 0 ? ( in_length & 0x03 ) - 1 : 0 )];
// Do the real decoding
for ( index_in = 0, index_out = 0; index_in < in.length && index_out < out.length; index_in++ ) {
chr = in[index_in];
if ( chr > 127 || VALUE_LOOKUP_ARRAY[chr] == -2 ) {
continue;
}
helper_1 = helper_2;
helper_2 = VALUE_LOOKUP_ARRAY[chr] > 0 ? VALUE_LOOKUP_ARRAY[chr] : 0;
switch ( mod ) {
case 0:
// no operation
break;
case 1:
out[index_out++] = (byte) ( ( helper_1 << 2 ) & 0xFC | ( helper_2 >>> 4 ) & 0x03 );
break;
case 2:
out[index_out++] = (byte) ( ( helper_1 << 4 ) & 0xF0 | ( helper_2 >>> 2 ) & 0x0F );
break;
case 3:
out[index_out++] = (byte) ( ( helper_1 << 6 ) & 0xC0 | helper_2 & 0x3F );
break;
}
mod = ( mod < 3 ? mod + 1 : 0 );
}
return out;
}
/**
* Add a charcter to an array of chars and insert linebreas if necessary
*/
private final static int writeToCharArray( char[] out, int idx, char chr ) {
out[idx++] = chr;
return idx;
}
/**
* <code>encode</code> a given array.
*
* @param in the input array of binary data
* @return The array of characters
*/
public final static String encode( byte[] in ) {
if ( in == null ) {
return null;
}
int index_in;
int index_out;
char chr;
// Allocate buffer for result: Consider chars for trailing =-signs
// and linebreaks.
char out[] = new char[( ( ( in.length + 2 ) / 3 ) << 2 )];
for ( index_in = 0, index_out = 0; index_in < in.length - 2; index_in += 3 ) {
// compute first byte: highest six bits of first byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in] >>> 2 ) & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
// compute second byte: lowest two bits of first byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in] << 4 ) & 0x30 |
// and highest four bits of second byte
( in[index_in + 1] >>> 4 ) & 0x0F];
index_out = writeToCharArray( out, index_out, chr );
// compute third byte: lowest four bits of second byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in + 1] << 2 ) & 0x3C |
// and higest two bits of third byte
( in[index_in + 2] >>> 6 ) & 0x03];
index_out = writeToCharArray( out, index_out, chr );
// compute fourth byte: lowest six bits of third byte
chr = CHAR_LOOKUP_ARRAY[in[index_in + 2] & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
}
// take care of the last bytes (one or two)
if ( index_in < in.length ) {
chr = CHAR_LOOKUP_ARRAY[( in[index_in] >>> 2 ) & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
if ( index_in < in.length - 1 ) {
// there are two remaining bytes
chr = CHAR_LOOKUP_ARRAY[( in[index_in] << 4 ) & 0x30 | ( in[index_in + 1] >>> 4 ) & 0x0F];
index_out = writeToCharArray( out, index_out, chr );
chr = CHAR_LOOKUP_ARRAY[( in[index_in + 1] << 2 ) & 0x3F];
index_out = writeToCharArray( out, index_out, chr );
} else {
// there is only one remaining byte
chr = CHAR_LOOKUP_ARRAY[( in[index_in] << 4 ) & 0x30];
index_out = writeToCharArray( out, index_out, chr );
}
}
// add padding =-signs if required
while ( index_out < out.length ) {
index_out = writeToCharArray( out, index_out, CHAR_LOOKUP_ARRAY[64] );
}
return new String(out);
}
}