blob: 794822c3700b3abb6491a2ae3824f41d27c02e29 [file] [log] [blame]
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- No caching headers -->
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="expires" content="-1"/>
<meta name="keywords" content="JDO, Apache, Java, Data, Objects"/>
<meta name="description" content="Apache JDO - Java Data Objects"/>
<title>JDO Bytecode Enhancement</title>
<link rel="icon" type="image/png" href="images/JDOx150.png"/>
<!--
Apache JDO Documentation Template
==================================
This template derived various aspects from Apache Deltaspike template, the Apache ISIS template and the Datanucleus template.
This template uses
* Bootstrap v3.3.7 (https://getbootstrap.com/) for navbar.
* Asciidoctor "foundation" CSS
* Bootswatch "cosmo" theme for Bootstrap (https://bootswatch.com/cosmo).
* Bootstrap TOC plugin v0.4.1 (https://afeld.github.io/bootstrap-toc/) for the table of contents.
* jQuery (necessary for Bootstrap's JavaScript plugins)
* Font-Awesome for some icons used by Asciidoctor
NOTE: tried using Font-Awesome CSS hosted locally but then fails to work!
-->
<link href="css/bootswatch/3.3.7/bootstrap-cosmo.css" rel="stylesheet"/>
<link href="css/bootstrap-toc/0.4.1/bootstrap-toc.min.css" rel="stylesheet"/>
<link href="css/asciidoctor/foundation.css" rel="stylesheet"/>
<link href="css/datanucleus_theme.css" rel="stylesheet"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="js/bootstrap/3.3.7/bootstrap.min.js"></script>
<script src="js/bootstrap-toc/0.4.1/bootstrap-toc.min.js"></script>
<!-- Coderay syntax formatter -->
<style type="text/css">
/* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
pre.CodeRay{background:#f7f7f8}
.CodeRay .line-numbers{border-right:1px solid currentColor;opacity:.35;padding:0 .5em 0 0}
.CodeRay span.line-numbers{display:inline-block;margin-right:.75em}
.CodeRay .line-numbers strong{color:#000}
table.CodeRay{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.CodeRay td{vertical-align:top;line-height:inherit}
table.CodeRay td.line-numbers{text-align:right}
table.CodeRay td.code{padding:0 0 0 .75em}
.CodeRay .debug{color:#fff !important;background:#000080 !important}
.CodeRay .annotation{color:#007}
.CodeRay .attribute-name{color:#000080}
.CodeRay .attribute-value{color:#700}
.CodeRay .binary{color:#509}
.CodeRay .comment{color:#998;font-style:italic}
.CodeRay .char{color:#04d}
.CodeRay .char .content{color:#04d}
.CodeRay .char .delimiter{color:#039}
.CodeRay .class{color:#458;font-weight:bold}
.CodeRay .complex{color:#a08}
.CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
.CodeRay .color{color:#099}
.CodeRay .class-variable{color:#369}
.CodeRay .decorator{color:#b0b}
.CodeRay .definition{color:#099}
.CodeRay .delimiter{color:#000}
.CodeRay .doc{color:#970}
.CodeRay .doctype{color:#34b}
.CodeRay .doc-string{color:#d42}
.CodeRay .escape{color:#666}
.CodeRay .entity{color:#800}
.CodeRay .error{color:#808}
.CodeRay .exception{color:inherit}
.CodeRay .filename{color:#099}
.CodeRay .function{color:#900;font-weight:bold}
.CodeRay .global-variable{color:#008080}
.CodeRay .hex{color:#058}
.CodeRay .integer,.CodeRay .float{color:#099}
.CodeRay .include{color:#555}
.CodeRay .inline{color:#000}
.CodeRay .inline .inline{background:#ccc}
.CodeRay .inline .inline .inline{background:#bbb}
.CodeRay .inline .inline-delimiter{color:#d14}
.CodeRay .inline-delimiter{color:#d14}
.CodeRay .important{color:#555;font-weight:bold}
.CodeRay .interpreted{color:#b2b}
.CodeRay .instance-variable{color:#008080}
.CodeRay .label{color:#970}
.CodeRay .local-variable{color:#963}
.CodeRay .octal{color:#40e}
.CodeRay .predefined{color:#369}
.CodeRay .preprocessor{color:#579}
.CodeRay .pseudo-class{color:#555}
.CodeRay .directive{font-weight:bold}
.CodeRay .type{font-weight:bold}
.CodeRay .predefined-type{color:inherit}
.CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
.CodeRay .key{color:#808}
.CodeRay .key .delimiter{color:#606}
.CodeRay .key .char{color:#80f}
.CodeRay .value{color:#088}
.CodeRay .regexp .delimiter{color:#808}
.CodeRay .regexp .content{color:#808}
.CodeRay .regexp .modifier{color:#808}
.CodeRay .regexp .char{color:#d14}
.CodeRay .regexp .function{color:#404;font-weight:bold}
.CodeRay .string{color:#d20}
.CodeRay .string .string .string{background:#ffd0d0}
.CodeRay .string .content{color:#d14}
.CodeRay .string .char{color:#d14}
.CodeRay .string .delimiter{color:#d14}
.CodeRay .shell{color:#d14}
.CodeRay .shell .delimiter{color:#d14}
.CodeRay .symbol{color:#990073}
.CodeRay .symbol .content{color:#a60}
.CodeRay .symbol .delimiter{color:#630}
.CodeRay .tag{color:#008080}
.CodeRay .tag-special{color:#d70}
.CodeRay .variable{color:#036}
.CodeRay .insert{background:#afa}
.CodeRay .delete{background:#faa}
.CodeRay .change{color:#aaf;background:#007}
.CodeRay .head{color:#f8f;background:#505}
.CodeRay .insert .insert{color:#080}
.CodeRay .delete .delete{color:#800}
.CodeRay .change .change{color:#66f}
.CodeRay .head .head{color:#f4f}
</style>
</head>
<body data-spy="scroll" data-target="#toc">
<!-- Navbar -->
<nav class="navbar navbar-default navbar-static-top">
<div class="container">
<div class="navbar-header">
<!-- Three line menu button for use on mobile screens -->
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- 'style' added to align image with navbar. FIX THIS -->
<a class="navbar-brand" href="https://db.apache.org/jdo/">
<img style="margin-top: -12px;" alt="Brand" width="45.5" height="45.5" src="images/JDOx150.png"/>
</a>
<!-- TODO Any way to abstract the version from Maven? -->
<a class="navbar-brand" href="index.html">Apache JDO</a>
</div>
<!-- Navbar that will collapse on mobile screens -->
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="dropdown">
<!-- menu item General -->
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">General<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="why_jdo.html">Why JDO?</a></li>
<li><a href="getting-started.html">Getting Started</a></li>
<li><a href="specifications.html">Specifications</a></li>
<li><a href="tck.html">TCK</a></li>
<li><a href="javadoc.html">API Javadoc</a></li>
<li role="separator" class="divider"></li>
<li><a href="jdo_v_jpa.html">JDO v JPA</a></li>
<li><a href="jdo_v_jpa_api.html">JDO v JPA : API</a></li>
<li><a href="jdo_v_jpa_orm.html">JDO v JPA : ORM</a></li>
<li role="separator" class="divider"></li>
<li><a href="license.html">License</a></li>
<li><a href="impls.html">Implementations</a></li>
<li><a href="jdo_3_0_overview.html">JDO 3.0 Overview</a></li>
<li><a href="references.html">References</a></li>
<li><a href="glossary.html">Glossary</a></li>
</ul>
</li>
<!-- menu item API Usage -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">API Usage<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="pmf.html">PersistenceManagerFactory</a></li>
<li><a href="pm.html">PersistenceManager</a></li>
<li><a href="transactions.html">Transactions</a></li>
<li><a href="attach_detach.html">Attach-Detach</a></li>
<li><a href="fetchgroups.html">Fetch Plan/Groups</a></li>
<li><a href="state_transition.html">Object States</a></li>
<li><a href="object_retrieval.html">Object Retrieval</a></li>
<li><a href="exceptions.html">Exceptions</a></li>
<li><a href="jdohelper.html">JDO Helper</a></li>
<li role="separator" class="divider"></li>
<li><a href="guides-replication.html">Data Replication</a></li>
</ul>
</li>
<!-- menu item Types & Metadata -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" style="background-color:#2385c6">Types &amp; Metadata<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="class_types.html">Types of Classes</a></li>
<li><a href="field_types.html">Types of Fields</a></li>
<li role="separator" class="divider"></li>
<!-- <li class="dropdown-header">Metadata</li> -->
<li><a href="metadata.html">MetaData</a></li>
<li><a href="annotations.html">Annotations</a></li>
<li><a href="jdo_dtd.html">jdo DTD/XSD</a></li>
<li><a href="orm_dtd.html">orm DTD/XSD</a></li>
<li><a href="jdoquery_dtd.html">jdoquery DTD/XSD</a></li>
<li><a href="jdoconfig_dtd.html">jdoconfig DTD/XSD</a></li>
<li role="separator" class="divider"></li>
<li><a href="enhancement.html">Bytecode Enhancement</a></li>
</ul>
</li>
<!-- menu item Query -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Query<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="query_api.html">Query API</a></li>
<li role="separator" class="divider"></li>
<li><a href="jdoql.html">JDOQL</a></li>
<li><a href="jdoql_methods.html">Methods</a></li>
<li><a href="jdoql_result.html">Result</a></li>
<li><a href="jdoql_quickref.pdf">Quick Ref PDF</a></li>
<li><a href="jdoql_typed.html">JDOQL Typed API</a></li>
<li role="separator" class="divider"></li>
<li><a href="query_sql.html">SQL</a></li>
</ul>
</li>
<!-- menu item Community -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Community<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="get-involved.html">Get Involved</a></li>
<li><a href="team-list.html">Project Team</a></li>
<li><a href="mail-lists.html">Mailing Lists</a></li>
<li><a href="faq.html">FAQ</a></li>
</ul>
</li>
<!-- menu item Development -->
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Development<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="roadmap.html">RoadMap / TODO</a></li>
<li><a href="downloads.html">Downloads</a></li>
<li><a href="source-code.html">Source Code</a></li>
<li><a href="coding-standards.html">Coding Standards</a></li>
<li><a href="issuetracking.html">Issue Tracking</a></li>
</ul>
</li>
</ul>
<!-- 'style' added to fix height of input box. FIX THIS -->
<form class="navbar-form navbar-left" role="search" id="search-form" action="https://www.google.com/search" method="get" style="padding: 1px 15px;">
<div class="form-group">
<input name="sitesearch" value="db.apache.org/jdo" type="hidden">
<input name="q" type="text" class="form-control" placeholder="Search" style="margin-top: 7px; padding: 1px; border-radius: 5px; height: 30px; vertical-align: middle;">
</div>
</form>
</div>
</div>
</nav>
<div class="container">
<!-- No TOC -->
<div class="row-fluid">
<div class="col-sm-12">
<!-- no heading -->
<div id="doc-content">
<div class="sect1">
<h2 id="JDO_Bytecode_Enhancement">JDO Bytecode Enhancement</h2>
<div class="sectionbody">
<div class="paragraph">
<p>JDO defines a byte-code enhancement process that provides for dirty detection of fields.
Before a class is used at runtime it is compiled and then "enhanced" to implement the interface <em>PersistenceCapable</em>, and optionally also <em>Detachable</em>.</p>
</div>
<div class="paragraph">
<p>We can demonstrate this by taking a sample class, and seeing it before and after enhancement.
We start with the following class</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.jdo.test</span>;
<span class="directive">public</span> <span class="type">class</span> <span class="class">A</span>
{
<span class="type">long</span> id;
<span class="predefined-type">String</span> name;
B b;
<span class="directive">public</span> A(<span class="predefined-type">String</span> name)
{
<span class="local-variable">this</span>.name = name;
}
<span class="directive">public</span> <span class="type">void</span> setId(<span class="type">long</span> id)
{
<span class="local-variable">this</span>.id = id;
}
<span class="directive">public</span> <span class="type">void</span> setB(B b)
{
<span class="local-variable">this</span>.b = b;
}
<span class="directive">public</span> <span class="predefined-type">String</span> getName()
{
<span class="keyword">return</span> name;
}
<span class="directive">public</span> B getB()
{
<span class="keyword">return</span> b;
}
<span class="directive">public</span> <span class="type">long</span> getId()
{
<span class="keyword">return</span> id;
}
<span class="directive">public</span> <span class="predefined-type">String</span> toString()
{
<span class="keyword">return</span> <span class="string"><span class="delimiter">&quot;</span><span class="content">A : id=</span><span class="delimiter">&quot;</span></span> + id + <span class="string"><span class="delimiter">&quot;</span><span class="content"> [</span><span class="delimiter">&quot;</span></span> + name + <span class="string"><span class="delimiter">&quot;</span><span class="content">] b=</span><span class="char">\&quot;</span><span class="delimiter">&quot;</span></span> + b + <span class="string"><span class="delimiter">&quot;</span><span class="char">\&quot;</span><span class="delimiter">&quot;</span></span>;
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>and require it to be <em>PersistenceCapable</em> and <em>Detachable</em>.
The enhancement process needs to intercept all updates of the fields of the
class (id, name, b) as well as add on the necessary <em>PersistenceCapable</em>, <em>Detachable</em> methods. After "enhancement" it becomes</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight"><code data-lang="java"><span class="keyword">package</span> <span class="namespace">org.apache.jdo.test</span>;
<span class="keyword">import</span> <span class="include">java.util.BitSet</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.JDODetachedFieldAccessException</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.JDOFatalInternalException</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.PersistenceManager</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.identity.LongIdentity</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.spi.Detachable</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.spi.JDOImplHelper</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.spi.JDOPermission</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.spi.PersistenceCapable</span>;
<span class="keyword">import</span> <span class="include">javax.jdo.spi.StateManager</span>;
<span class="directive">public</span> <span class="type">class</span> <span class="class">A</span> <span class="directive">implements</span> PersistenceCapable, Detachable
{
<span class="type">long</span> id;
<span class="predefined-type">String</span> name;
B b;
<span class="directive">protected</span> <span class="directive">transient</span> StateManager jdoStateManager;
<span class="directive">protected</span> <span class="directive">transient</span> <span class="type">byte</span> jdoFlags;
<span class="directive">protected</span> <span class="predefined-type">Object</span><span class="type">[]</span> jdoDetachedState;
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="type">byte</span><span class="type">[]</span> jdoFieldFlags;
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="predefined-type">Class</span> jdoPersistenceCapableSuperclass;
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="predefined-type">Class</span><span class="type">[]</span> jdoFieldTypes;
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="predefined-type">String</span><span class="type">[]</span> jdoFieldNames = __jdoFieldNamesInit();
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="type">int</span> jdoInheritedFieldCount;
<span class="directive">static</span>
{
jdoFieldTypes = __jdoFieldTypesInit();
jdoFieldFlags = __jdoFieldFlagsInit();
jdoInheritedFieldCount = __jdoGetInheritedFieldCount();
jdoPersistenceCapableSuperclass = __jdoPersistenceCapableSuperclassInit();
JDOImplHelper.registerClass(___jdo<span class="error">$</span>loadClass(<span class="string"><span class="delimiter">&quot;</span><span class="content">org.apache.jdo.test.A</span><span class="delimiter">&quot;</span></span>),
jdoFieldNames, jdoFieldTypes,
jdoFieldFlags,
jdoPersistenceCapableSuperclass, <span class="keyword">new</span> A());
}
<span class="directive">public</span> <span class="type">void</span> setId(<span class="type">long</span> id)
{
jdoSetid(<span class="local-variable">this</span>, id);
}
<span class="directive">public</span> <span class="type">void</span> setB(B b)
{
jdoSetb(<span class="local-variable">this</span>, b);
}
<span class="directive">public</span> <span class="predefined-type">String</span> getName()
{
<span class="keyword">return</span> jdoGetname(<span class="local-variable">this</span>);
}
<span class="directive">public</span> B getB()
{
<span class="keyword">return</span> jdoGetb(<span class="local-variable">this</span>);
}
<span class="directive">public</span> <span class="type">long</span> getId()
{
<span class="keyword">return</span> jdoGetid(<span class="local-variable">this</span>);
}
<span class="directive">public</span> <span class="predefined-type">String</span> toString()
{
<span class="keyword">return</span> <span class="keyword">new</span> <span class="predefined-type">StringBuilder</span>().append(<span class="string"><span class="delimiter">&quot;</span><span class="content">A : id=</span><span class="delimiter">&quot;</span></span>).append(jdoGetid(<span class="local-variable">this</span>))
.append(<span class="string"><span class="delimiter">&quot;</span><span class="content"> [</span><span class="delimiter">&quot;</span></span>).append(jdoGetname(<span class="local-variable">this</span>))
.append(<span class="string"><span class="delimiter">&quot;</span><span class="content">] b=</span><span class="char">\&quot;</span><span class="delimiter">&quot;</span></span>).append(jdoGetb(<span class="local-variable">this</span>))
.append(<span class="string"><span class="delimiter">&quot;</span><span class="char">\&quot;</span><span class="delimiter">&quot;</span></span>).toString();
}
<span class="directive">public</span> <span class="type">void</span> jdoCopyKeyFieldsFromObjectId(PersistenceCapable.ObjectIdFieldConsumer fc, <span class="predefined-type">Object</span> oid)
{
<span class="keyword">if</span> (fc == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>
(<span class="string"><span class="delimiter">&quot;</span><span class="content">ObjectIdFieldConsumer is null</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">if</span> (!(oid <span class="keyword">instanceof</span> LongIdentity))
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">ClassCastException</span>
(<span class="string"><span class="delimiter">&quot;</span><span class="content">oid is not instanceof javax.jdo.identity.LongIdentity</span><span class="delimiter">&quot;</span></span>);
LongIdentity o = (LongIdentity) oid;
fc.storeLongField(<span class="integer">1</span>, o.getKey());
}
<span class="directive">protected</span> <span class="type">void</span> jdoCopyKeyFieldsFromObjectId(<span class="predefined-type">Object</span> oid)
{
<span class="keyword">if</span> (!(oid <span class="keyword">instanceof</span> LongIdentity))
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">ClassCastException</span>
(<span class="string"><span class="delimiter">&quot;</span><span class="content">key class is not javax.jdo.identity.LongIdentity or null</span><span class="delimiter">&quot;</span></span>);
LongIdentity o = (LongIdentity) oid;
id = o.getKey();
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">void</span> jdoCopyKeyFieldsToObjectId(<span class="predefined-type">Object</span> oid)
{
<span class="keyword">throw</span> <span class="keyword">new</span> JDOFatalInternalException
(<span class="string"><span class="delimiter">&quot;</span><span class="content">It's illegal to call jdoCopyKeyFieldsToObjectId for a class with Single Field Identity.</span><span class="delimiter">&quot;</span></span>);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">void</span> jdoCopyKeyFieldsToObjectId
(PersistenceCapable.ObjectIdFieldSupplier fs, <span class="predefined-type">Object</span> oid) {
<span class="keyword">throw</span> <span class="keyword">new</span> JDOFatalInternalException
(<span class="string"><span class="delimiter">&quot;</span><span class="content">It's illegal to call jdoCopyKeyFieldsToObjectId for a class with Single Field Identity.</span><span class="delimiter">&quot;</span></span>);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="predefined-type">Object</span> jdoGetObjectId()
{
<span class="keyword">if</span> (jdoStateManager != <span class="predefined-constant">null</span>)
<span class="keyword">return</span> jdoStateManager.getObjectId(<span class="local-variable">this</span>);
<span class="keyword">if</span> (<span class="local-variable">this</span>.jdoIsDetached() != <span class="predefined-constant">true</span>)
<span class="keyword">return</span> <span class="predefined-constant">null</span>;
<span class="keyword">return</span> jdoDetachedState[<span class="integer">0</span>];
}
<span class="directive">public</span> <span class="directive">final</span> <span class="predefined-type">Object</span> jdoGetVersion()
{
<span class="keyword">if</span> (jdoStateManager != <span class="predefined-constant">null</span>)
<span class="keyword">return</span> jdoStateManager.getVersion(<span class="local-variable">this</span>);
<span class="keyword">if</span> (<span class="local-variable">this</span>.jdoIsDetached() != <span class="predefined-constant">true</span>)
<span class="keyword">return</span> <span class="predefined-constant">null</span>;
<span class="keyword">return</span> jdoDetachedState[<span class="integer">1</span>];
}
<span class="directive">protected</span> <span class="directive">final</span> <span class="type">void</span> jdoPreSerialize()
{
<span class="keyword">if</span> (jdoStateManager != <span class="predefined-constant">null</span>)
jdoStateManager.preSerialize(<span class="local-variable">this</span>);
}
<span class="directive">public</span> <span class="directive">final</span> PersistenceManager jdoGetPersistenceManager()
{
<span class="keyword">return</span> (jdoStateManager != <span class="predefined-constant">null</span>
? jdoStateManager.getPersistenceManager(<span class="local-variable">this</span>) : <span class="predefined-constant">null</span>);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="predefined-type">Object</span> jdoGetTransactionalObjectId()
{
<span class="keyword">return</span> (jdoStateManager != <span class="predefined-constant">null</span>
? jdoStateManager.getTransactionalObjectId(<span class="local-variable">this</span>) : <span class="predefined-constant">null</span>);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">boolean</span> jdoIsDeleted()
{
<span class="keyword">return</span> (jdoStateManager != <span class="predefined-constant">null</span> ? jdoStateManager.isDeleted(<span class="local-variable">this</span>): <span class="predefined-constant">false</span>);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">boolean</span> jdoIsDirty()
{
<span class="keyword">if</span> (jdoStateManager != <span class="predefined-constant">null</span>)
<span class="keyword">return</span> jdoStateManager.isDirty(<span class="local-variable">this</span>);
<span class="keyword">if</span> (<span class="local-variable">this</span>.jdoIsDetached() != <span class="predefined-constant">true</span>)
<span class="keyword">return</span> <span class="predefined-constant">false</span>;
<span class="keyword">if</span> (((<span class="predefined-type">BitSet</span>) jdoDetachedState[<span class="integer">3</span>]).length() &lt;= <span class="integer">0</span>)
<span class="keyword">return</span> <span class="predefined-constant">false</span>;
<span class="keyword">return</span> <span class="predefined-constant">true</span>;
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">boolean</span> jdoIsNew()
{
<span class="keyword">return</span> jdoStateManager != <span class="predefined-constant">null</span> ? jdoStateManager.isNew(<span class="local-variable">this</span>) : <span class="predefined-constant">false</span>;
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">boolean</span> jdoIsPersistent()
{
<span class="keyword">return</span> (jdoStateManager != <span class="predefined-constant">null</span> ? jdoStateManager.isPersistent(<span class="local-variable">this</span>): <span class="predefined-constant">false</span>);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">boolean</span> jdoIsTransactional()
{
<span class="keyword">return</span> (jdoStateManager != <span class="predefined-constant">null</span> ? jdoStateManager.isTransactional(<span class="local-variable">this</span>): <span class="predefined-constant">false</span>);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">boolean</span> jdoIsDetached()
{
<span class="keyword">if</span> (jdoStateManager == <span class="predefined-constant">null</span>) {
<span class="keyword">if</span> (jdoDetachedState == <span class="predefined-constant">null</span>)
<span class="keyword">return</span> <span class="predefined-constant">false</span>;
<span class="keyword">return</span> <span class="predefined-constant">true</span>;
}
<span class="keyword">return</span> <span class="predefined-constant">false</span>;
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">void</span> jdoMakeDirty(<span class="predefined-type">String</span> fieldName)
{
<span class="keyword">if</span> (jdoStateManager != <span class="predefined-constant">null</span>)
jdoStateManager.makeDirty(<span class="local-variable">this</span>, fieldName);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="predefined-type">Object</span> jdoNewObjectIdInstance()
{
<span class="keyword">return</span> <span class="keyword">new</span> LongIdentity(getClass(), id);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="predefined-type">Object</span> jdoNewObjectIdInstance(<span class="predefined-type">Object</span> key)
{
<span class="keyword">if</span> (key == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">key is null</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">if</span> (key <span class="keyword">instanceof</span> <span class="predefined-type">String</span> != <span class="predefined-constant">true</span>)
<span class="keyword">return</span> <span class="keyword">new</span> LongIdentity(<span class="local-variable">this</span>.getClass(), (<span class="predefined-type">Long</span>) key);
<span class="keyword">return</span> <span class="keyword">new</span> LongIdentity(<span class="local-variable">this</span>.getClass(), (<span class="predefined-type">String</span>) key);
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">void</span> jdoProvideFields(<span class="type">int</span><span class="type">[]</span> fieldId)
{
<span class="keyword">if</span> (fieldId == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">argment is null</span><span class="delimiter">&quot;</span></span>);
<span class="type">int</span> i = fieldId.length - <span class="integer">1</span>;
<span class="keyword">if</span> (i &gt;= <span class="integer">0</span>)
{
<span class="keyword">do</span>
jdoProvideField(fieldId[i]);
<span class="keyword">while</span> (--i &gt;= <span class="integer">0</span>);
}
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">void</span> jdoReplaceFields(<span class="type">int</span><span class="type">[]</span> fieldId)
{
<span class="keyword">if</span> (fieldId == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">argument is null</span><span class="delimiter">&quot;</span></span>);
<span class="type">int</span> i = fieldId.length;
<span class="keyword">if</span> (i &gt; <span class="integer">0</span>)
{
<span class="type">int</span> i_0_ = <span class="integer">0</span>;
<span class="keyword">do</span>
jdoReplaceField(fieldId[i_0_]);
<span class="keyword">while</span> (++i_0_ &lt; i);
}
}
<span class="directive">public</span> <span class="directive">final</span> <span class="type">void</span> jdoReplaceFlags()
{
<span class="keyword">if</span> (jdoStateManager != <span class="predefined-constant">null</span>)
{
A a = <span class="local-variable">this</span>;
a.jdoFlags = a.jdoStateManager.replacingFlags(<span class="local-variable">this</span>);
}
}
<span class="directive">public</span> <span class="directive">final</span> <span class="directive">synchronized</span> <span class="type">void</span> jdoReplaceStateManager(StateManager stateManager)
{
<span class="keyword">if</span> (jdoStateManager != <span class="predefined-constant">null</span>)
{
A a = <span class="local-variable">this</span>;
a.jdoStateManager = a.jdoStateManager.replacingStateManager(<span class="local-variable">this</span>, stateManager);
}
<span class="keyword">else</span>
{
JDOImplHelper.checkAuthorizedStateManager(sm);
jdoStateManager = stateManager;
jdoFlags = (<span class="type">byte</span>) <span class="integer">1</span>;
}
}
<span class="directive">public</span> <span class="directive">final</span> <span class="directive">synchronized</span> <span class="type">void</span> jdoReplaceDetachedState()
{
<span class="keyword">if</span> (jdoStateManager == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalStateException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">state manager is null</span><span class="delimiter">&quot;</span></span>);
A a = <span class="local-variable">this</span>;
a.jdoDetachedState = a.jdoStateManager.replacingDetachedState(<span class="local-variable">this</span>, jdoDetachedState);
}
<span class="directive">public</span> PersistenceCapable jdoNewInstance(StateManager sm)
{
A result = <span class="keyword">new</span> A();
A a = result;
a.jdoFlags = (<span class="type">byte</span>) <span class="integer">1</span>;
a.jdoStateManager = sm;
<span class="keyword">return</span> a;
}
<span class="directive">public</span> PersistenceCapable jdoNewInstance(StateManager sm, <span class="predefined-type">Object</span> o)
{
A result = <span class="keyword">new</span> A();
A a = result;
a.jdoFlags = (<span class="type">byte</span>) <span class="integer">1</span>;
a.jdoStateManager = sm;
result.jdoCopyKeyFieldsFromObjectId(o);
<span class="keyword">return</span> a;
}
<span class="directive">public</span> <span class="type">void</span> jdoReplaceField(<span class="type">int</span> fieldIndex)
{
<span class="keyword">if</span> (jdoStateManager == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalStateException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">state manager is null</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">switch</span> (fieldIndex)
{
<span class="keyword">case</span> <span class="integer">0</span>:
{
A a = <span class="local-variable">this</span>;
a.b = (B) a.jdoStateManager.replacingObjectField(<span class="local-variable">this</span>, fieldIndex);
<span class="keyword">break</span>;
}
<span class="keyword">case</span> <span class="integer">1</span>:
{
A a = <span class="local-variable">this</span>;
a.id = a.jdoStateManager.replacingLongField(<span class="local-variable">this</span>, fieldIndex);
<span class="keyword">break</span>;
}
<span class="keyword">case</span> <span class="integer">2</span>:
{
A a = <span class="local-variable">this</span>;
a.name = a.jdoStateManager.replacingStringField(<span class="local-variable">this</span>, fieldIndex);
<span class="keyword">break</span>;
}
<span class="keyword">default</span>:
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">out of field index :</span><span class="delimiter">&quot;</span></span> + fieldIndex);
}
}
<span class="directive">public</span> <span class="type">void</span> jdoProvideField(<span class="type">int</span> fieldIndex)
{
<span class="keyword">if</span> (jdoStateManager == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalStateException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">state manager is null</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">switch</span> (fieldIndex)
{
<span class="keyword">case</span> <span class="integer">0</span>:
jdoStateManager.providedObjectField(<span class="local-variable">this</span>, fieldIndex, b);
<span class="keyword">break</span>;
<span class="keyword">case</span> <span class="integer">1</span>:
jdoStateManager.providedLongField(<span class="local-variable">this</span>, fieldIndex, id);
<span class="keyword">break</span>;
<span class="keyword">case</span> <span class="integer">2</span>:
jdoStateManager.providedStringField(<span class="local-variable">this</span>, fieldIndex, name);
<span class="keyword">break</span>;
<span class="keyword">default</span>:
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">out of field index :</span><span class="delimiter">&quot;</span></span> + fieldIndex);
}
}
<span class="directive">protected</span> <span class="directive">final</span> <span class="type">void</span> jdoCopyField(A obj, <span class="type">int</span> index)
{
<span class="keyword">switch</span> (index)
{
<span class="keyword">case</span> <span class="integer">0</span>:
b = obj.b;
<span class="keyword">break</span>;
<span class="keyword">case</span> <span class="integer">1</span>:
id = obj.id;
<span class="keyword">break</span>;
<span class="keyword">case</span> <span class="integer">2</span>:
name = obj.name;
<span class="keyword">break</span>;
<span class="keyword">default</span>:
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">out of field index :</span><span class="delimiter">&quot;</span></span> + index);
}
}
<span class="directive">public</span> <span class="type">void</span> jdoCopyFields(<span class="predefined-type">Object</span> obj, <span class="type">int</span><span class="type">[]</span> fieldNumbers)
{
<span class="keyword">if</span> (jdoStateManager == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalStateException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">state manager is null</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">if</span> (fieldNumbers == <span class="predefined-constant">null</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalStateException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">fieldNumbers is null</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">if</span> (obj <span class="keyword">instanceof</span> A != <span class="predefined-constant">true</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">object is not org.apache.jdo.test.A</span><span class="delimiter">&quot;</span></span>);
A me = (A) obj;
<span class="keyword">if</span> (jdoStateManager != me.jdoStateManager)
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">IllegalArgumentException</span>(<span class="string"><span class="delimiter">&quot;</span><span class="content">state manager unmatch</span><span class="delimiter">&quot;</span></span>);
<span class="type">int</span> i = fieldNumbers.length - <span class="integer">1</span>;
<span class="keyword">if</span> (i &gt;= <span class="integer">0</span>)
{
<span class="keyword">do</span>
jdoCopyField(me, fieldNumbers[i]);
<span class="keyword">while</span> (--i &gt;= <span class="integer">0</span>);
}
}
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="predefined-type">String</span><span class="type">[]</span> __jdoFieldNamesInit()
{
<span class="keyword">return</span> <span class="keyword">new</span> <span class="predefined-type">String</span><span class="type">[]</span> { <span class="string"><span class="delimiter">&quot;</span><span class="content">b</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">id</span><span class="delimiter">&quot;</span></span>, <span class="string"><span class="delimiter">&quot;</span><span class="content">name</span><span class="delimiter">&quot;</span></span> };
}
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="predefined-type">Class</span><span class="type">[]</span> __jdoFieldTypesInit()
{
<span class="keyword">return</span> <span class="keyword">new</span> <span class="predefined-type">Class</span><span class="type">[]</span> { ___jdo<span class="error">$</span>loadClass(<span class="string"><span class="delimiter">&quot;</span><span class="content">org.apache.jdo.test.B</span><span class="delimiter">&quot;</span></span>), <span class="predefined-type">Long</span>.TYPE,
___jdo<span class="error">$</span>loadClass(<span class="string"><span class="delimiter">&quot;</span><span class="content">java.lang.String</span><span class="delimiter">&quot;</span></span>) };
}
<span class="directive">private</span> <span class="directive">static</span> <span class="directive">final</span> <span class="type">byte</span><span class="type">[]</span> __jdoFieldFlagsInit()
{
<span class="keyword">return</span> <span class="keyword">new</span> <span class="type">byte</span><span class="type">[]</span> { <span class="integer">10</span>, <span class="integer">24</span>, <span class="integer">21</span> };
}
<span class="directive">protected</span> <span class="directive">static</span> <span class="type">int</span> __jdoGetInheritedFieldCount()
{
<span class="keyword">return</span> <span class="integer">0</span>;
}
<span class="directive">protected</span> <span class="directive">static</span> <span class="type">int</span> jdoGetManagedFieldCount()
{
<span class="keyword">return</span> <span class="integer">3</span>;
}
<span class="directive">private</span> <span class="directive">static</span> <span class="predefined-type">Class</span> __jdoPersistenceCapableSuperclassInit()
{
<span class="keyword">return</span> <span class="predefined-constant">null</span>;
}
<span class="directive">public</span> <span class="directive">static</span> <span class="predefined-type">Class</span> ___jdo<span class="error">$</span>loadClass(<span class="predefined-type">String</span> className)
{
<span class="keyword">try</span>
{
<span class="keyword">return</span> <span class="predefined-type">Class</span>.forName(className);
}
<span class="keyword">catch</span> (<span class="exception">ClassNotFoundException</span> e)
{
<span class="keyword">throw</span> <span class="keyword">new</span> <span class="exception">NoClassDefFoundError</span>(e.getMessage());
}
}
<span class="directive">private</span> <span class="predefined-type">Object</span> jdoSuperClone()
<span class="directive">throws</span> <span class="exception">CloneNotSupportedException</span>
{
A o = (A) <span class="local-variable">super</span>.clone();
o.jdoFlags = (<span class="type">byte</span>) <span class="integer">0</span>;
o.jdoStateManager = <span class="predefined-constant">null</span>;
<span class="keyword">return</span> o;
}
<span class="directive">public</span> A()
{
<span class="comment">/* empty */</span>
}
<span class="directive">static</span> <span class="type">void</span> jdoSetb(A objPC, B b_m)
{
<span class="keyword">if</span> (objPC.jdoStateManager == <span class="predefined-constant">null</span>)
objPC.b = b_m;
<span class="keyword">else</span>
objPC.jdoStateManager.setObjectField(objPC, <span class="integer">0</span>, objPC.b, b_m);
<span class="keyword">if</span> (objPC.jdoIsDetached() == <span class="predefined-constant">true</span>)
((<span class="predefined-type">BitSet</span>) objPC.jdoDetachedState[<span class="integer">3</span>]).set(<span class="integer">0</span>);
}
<span class="directive">static</span> B jdoGetb(A objPC)
{
<span class="keyword">if</span> (objPC.jdoStateManager != <span class="predefined-constant">null</span>
&amp;&amp; !objPC.jdoStateManager.isLoaded(objPC, <span class="integer">0</span>))
<span class="keyword">return</span> (B) objPC.jdoStateManager.getObjectField(objPC, <span class="integer">0</span>, objPC.b);
<span class="keyword">if</span> (objPC.jdoIsDetached() != <span class="predefined-constant">false</span>
&amp;&amp; ((<span class="predefined-type">BitSet</span>) objPC.jdoDetachedState[<span class="integer">2</span>]).get(<span class="integer">0</span>) != <span class="predefined-constant">true</span>
&amp;&amp; ((<span class="predefined-type">BitSet</span>) objPC.jdoDetachedState[<span class="integer">3</span>]).get(<span class="integer">0</span>) != <span class="predefined-constant">true</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> JDODetachedFieldAccessException
(<span class="string"><span class="delimiter">&quot;</span><span class="content">You have just attempted to access field </span><span class="char">\&quot;</span><span class="content">b</span><span class="char">\&quot;</span><span class="content"> yet this field was not detached when you detached the object. </span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content">Either dont access this field, or detach the field when detaching the object.</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">return</span> objPC.b;
}
<span class="directive">static</span> <span class="type">void</span> jdoSetid(A objPC, <span class="type">long</span> id_n)
{
objPC.id = id_n;
}
<span class="directive">static</span> <span class="type">long</span> jdoGetid(A objPC)
{
<span class="keyword">return</span> objPC.id;
}
<span class="directive">static</span> <span class="type">void</span> jdoSetname(A objPC, <span class="predefined-type">String</span> name_c)
{
<span class="keyword">if</span> (objPC.jdoFlags != <span class="integer">0</span> &amp;&amp; objPC.jdoStateManager != <span class="predefined-constant">null</span>)
objPC.jdoStateManager.setStringField(objPC, <span class="integer">2</span>, objPC.name, name_c);
<span class="keyword">else</span>
{
objPC.name = name_c;
<span class="keyword">if</span> (objPC.jdoIsDetached() == <span class="predefined-constant">true</span>)
((<span class="predefined-type">BitSet</span>) objPC.jdoDetachedState[<span class="integer">3</span>]).set(<span class="integer">2</span>);
}
}
<span class="directive">static</span> <span class="predefined-type">String</span> jdoGetname(A objPC)
{
<span class="keyword">if</span> (objPC.jdoFlags &gt; <span class="integer">0</span> &amp;&amp; objPC.jdoStateManager != <span class="predefined-constant">null</span> &amp;&amp; !objPC.jdoStateManager.isLoaded(objPC, <span class="integer">2</span>))
<span class="keyword">return</span> objPC.jdoStateManager.getStringField(objPC, <span class="integer">2</span>, objPC.name);
<span class="keyword">if</span> (objPC.jdoIsDetached() != <span class="predefined-constant">false</span> &amp;&amp; ((<span class="predefined-type">BitSet</span>) objPC.jdoDetachedState[<span class="integer">2</span>]).get(<span class="integer">2</span>) != <span class="predefined-constant">true</span>)
<span class="keyword">throw</span> <span class="keyword">new</span> JDODetachedFieldAccessException
(<span class="string"><span class="delimiter">&quot;</span><span class="content">You have just attempted to access field </span><span class="char">\&quot;</span><span class="content">name</span><span class="char">\&quot;</span><span class="content"> yet this field was not detached when you detached the object.</span><span class="delimiter">&quot;</span></span> +
<span class="string"><span class="delimiter">&quot;</span><span class="content">Either dont access this field, or detach the field when detaching the object.</span><span class="delimiter">&quot;</span></span>);
<span class="keyword">return</span> objPC.name;
}
<span class="directive">public</span> A(<span class="predefined-type">String</span> name)
{
jdoSetname(<span class="local-variable">this</span>, name);
}
}</code></pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer style="color:#fff; background-color:#222222; padding: 5px;">
<div class="container">
<div class="row" style="margin-top:25px">
<div class="col-sm" align="center">
<a href="https://www.facebook.com/JavaDataObjects" class="externalLink" title="Facebook">Facebook</a>
|
<a href="https://twitter.com/JavaDataObjects" class="externalLink" title="Twitter">Twitter</a>
|
<a href="http://wiki.apache.org/jdo" class="externalLink" title="Wiki">Wiki</a>
|
<a href="http://issues.apache.org/jira/secure/BrowseProject.jspa?id=10630" class="externalLink" title="Issue Tracker">Issue Tracker</a>
|
<a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
|
<a href="api31/apidocs/index.html" title="Latest Javadocs">Latest Javadocs</a>
|
<a href="https://privacy.apache.org/policies/privacy-policy-public.html" title="Privacy Policy">Privacy Policy</a>
</div>
</div>
<p class="text-center" style="margin-top:16px">&copy; 2005-2022 Apache Software Foundation. All Rights Reserved.</p>
</div>
</footer>
</body>
</html>