blob: 542dbb56f99a1b36bf5083b70d5fe56af4a8d6f1 [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.xmlbeans.impl.store;
import org.apache.xmlbeans.XmlCursor;
class Bookmark implements XmlCursor.XmlMark {
boolean isOnList(Bookmark head) {
for (; head != null; head = head._next)
if (head == this)
return true;
return false;
}
Bookmark listInsert(Bookmark head) {
assert _next == null && _prev == null;
if (head == null)
head = _prev = this;
else {
_prev = head._prev;
head._prev = head._prev._next = this;
}
return head;
}
Bookmark listRemove(Bookmark head) {
assert _prev != null && isOnList(head);
if (_prev == this) {
head = null;
} else {
if (head == this) {
head = _next;
} else {
_prev._next = _next;
}
if (_next == null) {
if (head != null) {
head._prev = _prev;
}
} else {
_next._prev = _prev;
_next = null;
}
}
_prev = null;
assert _next == null;
return head;
}
void moveTo(Xobj x, int p) {
assert isOnList(_xobj._bookmarks);
if (_xobj != x) {
_xobj._bookmarks = listRemove(_xobj._bookmarks);
x._bookmarks = listInsert(x._bookmarks);
_xobj = x;
}
_pos = p;
}
//
// XmlCursor.XmlMark method
//
public XmlCursor createCursor() {
if (_xobj == null) {
throw new IllegalStateException(
"Attempting to create a cursor on a bookmark that " +
"has been cleared or replaced.");
}
return Cursor.newCursor(_xobj, _pos);
}
//
//
//
Xobj _xobj;
int _pos;
Bookmark _next;
Bookmark _prev;
Object _key;
Object _value;
}