added operational transformation (OT) bundle

This commit is contained in:
Axel Uhl
2012-03-26 20:40:43 +02:00
parent 13e431e8e8
commit 3d38cc0cff
113 changed files with 8089 additions and 0 deletions
@@ -0,0 +1,7 @@
<?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>
+28
View File
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.sap.sailing.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>
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,62 @@
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
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,7 @@
#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
@@ -0,0 +1,7 @@
#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
@@ -0,0 +1,29 @@
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
@@ -0,0 +1,6 @@
K 10
svn:ignore
V 4
bin
END
+176
View File
@@ -0,0 +1,176 @@
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
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,7 @@
<?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>
@@ -0,0 +1,28 @@
<?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>
@@ -0,0 +1,46 @@
<?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>
@@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,62 @@
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
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,10 @@
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
@@ -0,0 +1,10 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Operationaltransformation Plug-in
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
@@ -0,0 +1,46 @@
<?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>
@@ -0,0 +1,58 @@
<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>
@@ -0,0 +1,4 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.
@@ -0,0 +1,5 @@
K 25
svn:wc:ra_dav:version-url
V 81
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs
END
@@ -0,0 +1,26 @@
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
@@ -0,0 +1,39 @@
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
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END
@@ -0,0 +1,45 @@
<!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>
All Classes
</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="FrameHeadingFont">
<B>All Classes</B></FONT>
<BR>
<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
<TR>
<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">AbstractOperation</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">ClientServerOperationPair</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation" target="classFrame"><I>Operation</I></A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation" target="classFrame"><I>Peer</I></A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">PeerImpl</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">StatesAndOperations</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation" target="classFrame"><I>Transformer</I></A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation" target="classFrame">UnmergedOperationsQueue</A>
<BR>
</FONT></TD>
</TR>
</TABLE>
</BODY>
</HTML>
@@ -0,0 +1,45 @@
<!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>
All Classes
</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="FrameHeadingFont">
<B>All Classes</B></FONT>
<BR>
<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
<TR>
<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation">AbstractOperation</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation">ClientServerOperationPair</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><I>Operation</I></A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation"><I>Peer</I></A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation">StatesAndOperations</A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><I>Transformer</I></A>
<BR>
<A HREF="com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue</A>
<BR>
</FONT></TD>
</TR>
</TABLE>
</BODY>
</HTML>
@@ -0,0 +1,5 @@
K 25
svn:wc:ra_dav:version-url
V 85
/svn/monet/!svn/ver/7650/trunk/ngpm/com.sap.runlet.operationaltransformation/docs/com
END
@@ -0,0 +1,39 @@
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
@@ -0,0 +1,5 @@
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
@@ -0,0 +1,39 @@
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
@@ -0,0 +1,5 @@
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
@@ -0,0 +1,6 @@
K 10
svn:ignore
V 26
operationaltransformation
END
@@ -0,0 +1,39 @@
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
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,70 @@
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
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 24
application/octet-stream
END
@@ -0,0 +1,263 @@
<!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>
@@ -0,0 +1,269 @@
<!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>
@@ -0,0 +1,245 @@
<!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>
@@ -0,0 +1,371 @@
<!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>
@@ -0,0 +1,548 @@
<!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>
@@ -0,0 +1,208 @@
<!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>
@@ -0,0 +1,281 @@
<!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>
@@ -0,0 +1,211 @@
<!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>
@@ -0,0 +1,353 @@
<!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>
@@ -0,0 +1,55 @@
<!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>
@@ -0,0 +1,265 @@
<!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>
@@ -0,0 +1,155 @@
<!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>
@@ -0,0 +1,142 @@
<!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>
Constant Field Values
</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="Constant Field Values";
}
}
</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="com/sap/runlet/operationaltransformation/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&nbsp;
&nbsp;NEXT</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="constant-values.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>
<H1>
Constant Field Values</H1>
</CENTER>
<HR SIZE="4" NOSHADE>
<B>Contents</B><UL>
</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="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/sap/runlet/operationaltransformation/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&nbsp;
&nbsp;NEXT</FONT></TD>
<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
<A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="constant-values.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>
@@ -0,0 +1,142 @@
<!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>
Deprecated List
</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="Deprecated List";
}
}
</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="com/sap/runlet/operationaltransformation/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&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?deprecated-list.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="deprecated-list.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>
<B>Deprecated API</B></H2>
</CENTER>
<HR SIZE="4" NOSHADE>
<B>Contents</B><UL>
</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="#EEEEFF" CLASS="NavBarCell1"> <A HREF="com/sap/runlet/operationaltransformation/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A>&nbsp;</TD>
<TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT>&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?deprecated-list.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="deprecated-list.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>
@@ -0,0 +1,209 @@
<!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>
API Help
</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="API Help";
}
}
</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="com/sap/runlet/operationaltransformation/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="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&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?help-doc.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="help-doc.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>
<H1>
How This API Document Is Organized</H1>
</CENTER>
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
Package</H3>
<BLOCKQUOTE>
<P>
Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:<UL>
<LI>Interfaces (italic)<LI>Classes<LI>Enums<LI>Exceptions<LI>Errors<LI>Annotation Types</UL>
</BLOCKQUOTE>
<H3>
Class/Interface</H3>
<BLOCKQUOTE>
<P>
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:<UL>
<LI>Class inheritance diagram<LI>Direct Subclasses<LI>All Known Subinterfaces<LI>All Known Implementing Classes<LI>Class/interface declaration<LI>Class/interface description
<P>
<LI>Nested Class Summary<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
<P>
<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</BLOCKQUOTE>
</BLOCKQUOTE>
<H3>
Annotation Type</H3>
<BLOCKQUOTE>
<P>
Each annotation type has its own separate page with the following sections:<UL>
<LI>Annotation Type declaration<LI>Annotation Type description<LI>Required Element Summary<LI>Optional Element Summary<LI>Element Detail</UL>
</BLOCKQUOTE>
</BLOCKQUOTE>
<H3>
Enum</H3>
<BLOCKQUOTE>
<P>
Each enum has its own separate page with the following sections:<UL>
<LI>Enum declaration<LI>Enum description<LI>Enum Constant Summary<LI>Enum Constant Detail</UL>
</BLOCKQUOTE>
<H3>
Tree (Class Hierarchy)</H3>
<BLOCKQUOTE>
There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.<UL>
<LI>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.<LI>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</UL>
</BLOCKQUOTE>
<H3>
Deprecated API</H3>
<BLOCKQUOTE>
The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE>
<H3>
Index</H3>
<BLOCKQUOTE>
The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</BLOCKQUOTE>
<H3>
Prev/Next</H3>
These links take you to the next or previous class, interface, package, or related page.<H3>
Frames/No Frames</H3>
These links show and hide the HTML frames. All pages are available with or without frames.
<P>
<H3>
Serialized Form</H3>
Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
<P>
<H3>
Constant Field Values</H3>
The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values.
<P>
<FONT SIZE="-1">
<EM>
This help file applies to API documentation generated using the standard doclet.</EM>
</FONT>
<BR>
<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="com/sap/runlet/operationaltransformation/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="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT>&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?help-doc.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="help-doc.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>
@@ -0,0 +1,308 @@
<!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>
Index
</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="Index";
}
}
</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="./com/sap/runlet/operationaltransformation/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="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT>&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?index-all.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="index-all.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 ========= -->
<A HREF="#_A_">A</A> <A HREF="#_C_">C</A> <A HREF="#_F_">F</A> <A HREF="#_G_">G</A> <A HREF="#_O_">O</A> <A HREF="#_P_">P</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_W_">W</A> <HR>
<A NAME="_A_"><!-- --></A><H2>
<B>A</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation"><B>AbstractOperation</B></A>&lt;<A HREF="./com/sap/runlet/operationaltransformation/AbstractOperation.html" title="type parameter in AbstractOperation">S</A>&gt; - Class in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>&nbsp;<DT><A HREF="./com/sap/runlet/operationaltransformation/AbstractOperation.html#AbstractOperation()"><B>AbstractOperation()</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation">AbstractOperation</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/Peer.html#addPeer(com.sap.runlet.operationaltransformation.Peer)"><B>addPeer(Peer&lt;O, S&gt;)</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>
<DD>Registers a peer with this peer for replication.
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#addPeer(com.sap.runlet.operationaltransformation.Peer)"><B>addPeer(Peer&lt;O, S&gt;)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/Peer.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)"><B>apply(Peer&lt;O, S&gt;, O, int)</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>
<DD>Usually, the framework handles calls to this method and framework users
should therefore not need to call this method.
<DT><A HREF="./com/sap/runlet/operationaltransformation/Peer.html#apply(O)"><B>apply(O)</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>
<DD>Applies a change operation locally to the current peer's state.
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#apply(O)"><B>apply(O)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#apply(com.sap.runlet.operationaltransformation.Peer, O, int)"><B>apply(Peer&lt;O, S&gt;, O, int)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html#apply(O)"><B>apply(O)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation">StatesAndOperations</A>
<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.
<DT><A HREF="./com/sap/runlet/operationaltransformation/Operation.html#applyTo(S)"><B>applyTo(S)</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>
<DD>Applies this operation to the state <tt>toState</tt>, producing a new target state
which is returned.
</DL>
<HR>
<A NAME="_C_"><!-- --></A><H2>
<B>C</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation"><B>ClientServerOperationPair</B></A>&lt;<A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="type parameter in ClientServerOperationPair">O</A> extends <A HREF="./com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;?&gt;&gt; - Class in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>&nbsp;<DT><A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html#ClientServerOperationPair(O, O)"><B>ClientServerOperationPair(O, O)</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation">ClientServerOperationPair</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/AbstractOperation.html#clone()"><B>clone()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/AbstractOperation.html" title="class in com.sap.runlet.operationaltransformation">AbstractOperation</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/Operation.html#clone()"><B>clone()</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/package-summary.html"><B>com.sap.runlet.operationaltransformation</B></A> - package com.sap.runlet.operationaltransformation<DD>
Use the contents of this package for so-called <em>operational transformations</em>.<DT><A HREF="./com/sap/runlet/operationaltransformation/Peer.html#confirm(com.sap.runlet.operationaltransformation.Peer, int)"><B>confirm(Peer&lt;O, S&gt;, int)</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>
<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.
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#confirm(com.sap.runlet.operationaltransformation.Peer, int)"><B>confirm(Peer&lt;O, S&gt;, int)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#confirm(int)"><B>confirm(int)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue</A>
<DD>Cleans up the queue so that only unconfirmed / unmerged operations
remain.
</DL>
<HR>
<A NAME="_F_"><!-- --></A><H2>
<B>F</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#finalize()"><B>finalize()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
</DL>
<HR>
<A NAME="_G_"><!-- --></A><H2>
<B>G</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html#getClientOp()"><B>getClientOp()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation">ClientServerOperationPair</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/Peer.html#getCurrentState()"><B>getCurrentState()</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>
<DD>Tells the current state in which the peer is.
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#getCurrentState()"><B>getCurrentState()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html#getCurrentState()"><B>getCurrentState()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation">StatesAndOperations</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html#getServerOp()"><B>getServerOp()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/ClientServerOperationPair.html" title="class in com.sap.runlet.operationaltransformation">ClientServerOperationPair</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#getUnmergedOperations(int)"><B>getUnmergedOperations(int)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue</A>
<DD>Returns a copied list of unmerged and stepwise transformed local
operations starting at the requested local operation number.
</DL>
<HR>
<A NAME="_O_"><!-- --></A><H2>
<B>O</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation"><B>Operation</B></A>&lt;<A HREF="./com/sap/runlet/operationaltransformation/Operation.html" title="type parameter in Operation">S</A>&gt; - Interface in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>A change operation can be applied to some start state of some
universe and transforms that universe into a target state.</DL>
<HR>
<A NAME="_P_"><!-- --></A><H2>
<B>P</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation"><B>Peer</B></A>&lt;<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">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/Peer.html" title="type parameter in Peer">S</A>&gt;,<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="type parameter in Peer">S</A>&gt; - Interface in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>Accepts change operations from clients and maintains a shared state.<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation"><B>PeerImpl</B></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; - Class in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>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.<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(com.sap.runlet.operationaltransformation.Transformer, S, boolean)"><B>PeerImpl(Transformer&lt;O&gt;, S, boolean)</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(java.lang.String, com.sap.runlet.operationaltransformation.Transformer, S, boolean)"><B>PeerImpl(String, Transformer&lt;O&gt;, S, boolean)</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(com.sap.runlet.operationaltransformation.Transformer, com.sap.runlet.operationaltransformation.Peer)"><B>PeerImpl(Transformer&lt;O&gt;, Peer&lt;O, S&gt;)</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>Constructs a client peer and connects it to the <tt>server</tt> peer, establishing
the two-way link between client and server peers.
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#PeerImpl(java.lang.String, com.sap.runlet.operationaltransformation.Transformer, com.sap.runlet.operationaltransformation.Peer)"><B>PeerImpl(String, Transformer&lt;O&gt;, Peer&lt;O, S&gt;)</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<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.
</DL>
<HR>
<A NAME="_S_"><!-- --></A><H2>
<B>S</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#sentOutOperation(O)"><B>sentOutOperation(O)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue</A>
<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.
<DT><A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation"><B>StatesAndOperations</B></A>&lt;<A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">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/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A>&gt;,<A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="type parameter in StatesAndOperations">S</A>&gt; - Class in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>Maintains a list of states and the operations that transformed the i-th into
the i+1st, starting with an initial state.<DT><A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html#StatesAndOperations(S)"><B>StatesAndOperations(S)</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/StatesAndOperations.html" title="class in com.sap.runlet.operationaltransformation">StatesAndOperations</A>
<DD>&nbsp;
</DL>
<HR>
<A NAME="_T_"><!-- --></A><H2>
<B>T</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#toString()"><B>toString()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#toString()"><B>toString()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/Transformer.html#transform(O, O)"><B>transform(O, O)</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation">Transformer</A>
<DD>Takes an operation from the client and an operation from the server, both
based on the same state.
<DT><A HREF="./com/sap/runlet/operationaltransformation/Transformer.html" title="interface in com.sap.runlet.operationaltransformation"><B>Transformer</B></A>&lt;<A HREF="./com/sap/runlet/operationaltransformation/Transformer.html" title="type parameter in Transformer">O</A> extends <A HREF="./com/sap/runlet/operationaltransformation/Operation.html" title="interface in com.sap.runlet.operationaltransformation">Operation</A>&lt;?&gt;&gt; - Interface in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>&nbsp;</DL>
<HR>
<A NAME="_U_"><!-- --></A><H2>
<B>U</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation"><B>UnmergedOperationsQueue</B></A>&lt;<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">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/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">S</A>&gt;,<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="type parameter in UnmergedOperationsQueue">S</A>&gt; - Class in <A HREF="./com/sap/runlet/operationaltransformation/package-summary.html">com.sap.runlet.operationaltransformation</A><DD>&nbsp;<DT><A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#UnmergedOperationsQueue()"><B>UnmergedOperationsQueue()</B></A> -
Constructor for class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue</A>
<DD>&nbsp;
<DT><A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html#updateWithTransformed(int, O)"><B>updateWithTransformed(int, O)</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/UnmergedOperationsQueue.html" title="class in com.sap.runlet.operationaltransformation">UnmergedOperationsQueue</A>
<DD>Replaces the local operation with number <tt>localOperationNumber</tt> in the queue by
<tt>transformedOperation</tt>.
</DL>
<HR>
<A NAME="_W_"><!-- --></A><H2>
<B>W</B></H2>
<DL>
<DT><A HREF="./com/sap/runlet/operationaltransformation/Peer.html#waitForNotRunning()"><B>waitForNotRunning()</B></A> -
Method in interface com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/Peer.html" title="interface in com.sap.runlet.operationaltransformation">Peer</A>
<DD>Blocks until the queue of tasks that works on achieving consistency across peers
has completely drained.
<DT><A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html#waitForNotRunning()"><B>waitForNotRunning()</B></A> -
Method in class com.sap.runlet.operationaltransformation.<A HREF="./com/sap/runlet/operationaltransformation/PeerImpl.html" title="class in com.sap.runlet.operationaltransformation">PeerImpl</A>
<DD>&nbsp;
</DL>
<HR>
<A HREF="#_A_">A</A> <A HREF="#_C_">C</A> <A HREF="#_F_">F</A> <A HREF="#_G_">G</A> <A HREF="#_O_">O</A> <A HREF="#_P_">P</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_W_">W</A>
<!-- ======= 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="./com/sap/runlet/operationaltransformation/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="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT>&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?index-all.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="index-all.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>
@@ -0,0 +1,36 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<!--NewPage-->
<HTML>
<HEAD>
<!-- Generated by javadoc on Thu Jul 30 14:17:57 CEST 2009-->
<TITLE>
Generated Documentation (Untitled)
</TITLE>
<SCRIPT type="text/javascript">
targetPage = "" + window.location.search;
if (targetPage != "" && targetPage != "undefined")
targetPage = targetPage.substring(1);
if (targetPage.indexOf(":") != -1)
targetPage = "undefined";
function loadFrames() {
if (targetPage != "" && targetPage != "undefined")
top.classFrame.location = top.targetPage;
}
</SCRIPT>
<NOSCRIPT>
</NOSCRIPT>
</HEAD>
<FRAMESET cols="20%,80%" title="" onLoad="top.loadFrames()">
<FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)">
<FRAME src="com/sap/runlet/operationaltransformation/package-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes">
<NOFRAMES>
<H2>
Frame Alert</H2>
<P>
This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
<BR>
Link to<A HREF="com/sap/runlet/operationaltransformation/package-summary.html">Non-frame version.</A>
</NOFRAMES>
</FRAMESET>
</HTML>
@@ -0,0 +1,157 @@
<!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>
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="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?overview-tree.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="overview-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 All Packages</H2>
</CENTER>
<DL>
<DT><B>Package Hierarchies:</B><DD><A HREF="com/sap/runlet/operationaltransformation/package-tree.html">com.sap.runlet.operationaltransformation</A></DL>
<HR>
<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?overview-tree.html" target="_top"><B>FRAMES</B></A> &nbsp;
&nbsp;<A HREF="overview-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>
@@ -0,0 +1 @@
com.sap.runlet.operationaltransformation
Binary file not shown.

After

Width:  |  Height:  |  Size: 57 B

@@ -0,0 +1,29 @@
/* Javadoc style sheet */
/* Define colors, fonts and other style attributes here to override the defaults */
/* Page background color */
body { background-color: #FFFFFF; color:#000000 }
/* Headings */
h1 { font-size: 145% }
/* Table colors */
.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */
.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */
.TableRowColor { background: #FFFFFF; color:#000000 } /* White */
/* Font used in left-hand frame lists */
.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
/* Navigation bar fonts and colors */
.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */
.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */
.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;}
.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;}
.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}
.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}
@@ -0,0 +1,5 @@
K 25
svn:wc:ra_dav:version-url
V 80
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src
END
@@ -0,0 +1,31 @@
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
@@ -0,0 +1,5 @@
K 25
svn:wc:ra_dav:version-url
V 84
/svn/monet/!svn/ver/7755/trunk/ngpm/com.sap.runlet.operationaltransformation/src/com
END
@@ -0,0 +1,31 @@
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
@@ -0,0 +1,5 @@
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
@@ -0,0 +1,31 @@
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
@@ -0,0 +1,5 @@
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
@@ -0,0 +1,31 @@
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
@@ -0,0 +1,59 @@
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
@@ -0,0 +1,337 @@
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
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,5 @@
K 13
svn:mime-type
V 10
text/plain
END
@@ -0,0 +1,13 @@
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);
}
}
}
@@ -0,0 +1,20 @@
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;
}
}
@@ -0,0 +1,22 @@
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);
}
@@ -0,0 +1,99 @@
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();
}
@@ -0,0 +1,255 @@
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
}
}
}
}
@@ -0,0 +1,42 @@
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);
}
}
@@ -0,0 +1,12 @@
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);
}
@@ -0,0 +1,91 @@
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();
}
}
@@ -0,0 +1,58 @@
<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>
@@ -0,0 +1,13 @@
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);
}
}
}
@@ -0,0 +1,20 @@
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;
}
}
@@ -0,0 +1,22 @@
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);
}
@@ -0,0 +1,99 @@
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();
}
@@ -0,0 +1,255 @@
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
}
}
}
}
@@ -0,0 +1,42 @@
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);
}
}
@@ -0,0 +1,12 @@
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);
}

Some files were not shown because too many files have changed in this diff Show More