You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2017/09/28 16:06:44 UTC
[092/100] [abbrv] jena git commit: JENA-1397: Rename java packages
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/MetaFile.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/MetaFile.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/MetaFile.java
deleted file mode 100644
index b379f40..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/MetaFile.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.file;
-
-import java.io.* ;
-import java.util.* ;
-
-import org.apache.jena.atlas.lib.* ;
-import org.apache.jena.atlas.lib.Closeable ;
-import org.seaborne.dboe.DBOpEnvException ;
-import org.seaborne.dboe.sys.Names ;
-import org.slf4j.Logger ;
-import org.slf4j.LoggerFactory ;
-
-/** Abstraction and many convenience operations on metadata.
- * Metadata is recorded in Java properties style - not RDF - because it's relative to the file or context used.
- * Keys and values are always strings.
- */
-public class MetaFile implements Sync, Closeable
-{
- private static Comparator<String> comparator = new ComparatorKeys() ;
- private static Logger log = LoggerFactory.getLogger(MetaFile.class) ;
- private String metaFilename = null ;
- private Properties properties = null ;
- private String label = null ;
- private boolean changed = false ;
- private boolean closed = false ;
-
- /** Create a MetaFile
- *
- * @param label Convenience label.
- * @param fn On disk filename; {@link Names#memName} for in-memory
- */
- public MetaFile(String label, String fn)
- {
- this.label = label ;
- this.metaFilename = fn ;
-
- if ( fn == null || Names.isMem(fn) )
- // In-memory.
- return ;
-
- // Make absolute (current directory may change later)
- if ( ! fn.endsWith(Names.extMeta) )
- fn = fn+"."+Names.extMeta ;
- File f = new File(fn) ;
- this.metaFilename = f.getAbsolutePath() ;
- // Does not load the details yet.
- // JDI
- ensureInit() ;
- }
-
- private void ensureInit()
- {
- if ( properties == null )
- {
- properties = new PropertiesSorted(comparator) ;
- if ( metaFilename != null )
- loadProperties() ;
- }
- }
-
- /** Does this metafile exist on disk? (In-memory MetaFiles always exist) */
- public boolean existsMetaData()
- {
- if ( isMem() )
- return true ;
- File f = new File(metaFilename) ;
- if ( f.isDirectory() )
- log.warn("Metadata file clashes with a directory") ;
- return f.exists() && f.isFile() ;
- }
-
- public String getFilename() { return metaFilename ; }
-
- /** Test for the presence of a property */
- public boolean hasProperty(String key)
- {
- return _getProperty(key, null) != null ;
- }
-
- /** Get the property value or null. */
- public String getProperty(String key)
- {
- return _getProperty(key, null) ;
- }
-
- /** Get the property value or return supplied default. */
- public String getProperty(String key, String defaultString)
- {
- return _getProperty(key, defaultString) ;
- }
-
- /** Get the property value and parse as an integer */
- public int getPropertyAsInteger(String key)
- {
- return Integer.parseInt(_getProperty(key, null)) ;
- }
-
- /** Get the property value and parse as an integer or return default value. */
- public int getPropertyAsInteger(String key, int defaultValue)
- {
- String x = getProperty(key) ;
- if ( x == null )
- return defaultValue ;
- return Integer.parseInt(x) ;
- }
-
- /** Get property as a string and split on ",". */
- public String[] getPropertySplit(String key)
- {
- String str = getProperty(key) ;
- if ( str == null )
- return null ;
- return str.split(",") ;
- }
-
- /** Get property as a string and split on ",", using the default string if not present in the MetaFile. */
- public String[] getPropertySplit(String key, String defaultString)
- {
- String str = getProperty(key, defaultString) ;
- return str.split(",") ;
- }
-
- /** Set property */
- public void setProperty(String key, String value)
- {
- _setProperty(key, value) ;
- }
-
- /** Set property, turning integer into a string. */
- public void setProperty(String key, int value)
- {
- _setProperty(key, Integer.toString(value)) ;
- }
-
- /** Test whether a property has a value. Null tests equal to not present. */
- public boolean propertyEquals(String key, String value)
- {
- return Objects.equals(getProperty(key), value) ;
- }
-
- /** Set property if not already set. */
- public void ensurePropertySet(String key, String expected)
- {
- getOrSetDefault(key, expected) ;
- }
-
- /** Get property or the default value - also set the default value if not present */
- public String getOrSetDefault(String key, String expected)
- {
- String x = getProperty(key) ;
- if ( x == null )
- {
- setProperty(key, expected) ;
- x = expected ;
- }
- return x ;
- }
-
- /** Check property is an expected value or set if missing */
- public void checkOrSetMetadata(String key, String expected)
- {
- String x = getProperty(key) ;
- if ( x == null )
- {
- setProperty(key, expected) ;
- return ;
- }
- if ( x.equals(expected) )
- return ;
-
- inconsistent(key, x, expected) ;
- }
-
- /** Check property has the value given - throw exception if not. */
- public void checkMetadata(String key, String expected)
- {
- String value = getProperty(key) ;
-
- if ( !Objects.equals(value, value) )
- inconsistent(key, value, expected) ;
- }
-
- private static void inconsistent(String key, String actual, String expected)
- {
- String msg = String.format("Inconsistent: key=%s value=%s expected=%s",
- key,
- (actual==null?"<null>":actual),
- (expected==null?"<null>":expected) ) ;
- throw new MetaFileException(msg) ;
- }
-
- /** Clear all properties. */
- public void clear()
- {
- _clear() ;
- }
-
- // ---- All get/set access through these operations
- private String _getProperty(String key, String dft)
- {
- ensureInit() ;
- return properties.getProperty(key, dft) ;
- }
-
- private void _setProperty(String key, String value)
- {
- ensureInit() ;
- properties.setProperty(key, value) ;
- changedEvent() ;
- }
-
- /** Clear all properties. */
- private void _clear()
- {
- ensureInit() ;
- properties.clear() ;
- changedEvent() ;
- }
-
- private void changedEvent() { changed = true ; }
- // ----
-
- private boolean isMem() { return Names.isMem(metaFilename) ; }
-
- /** Write to backing file if changed */
- public void flush()
- {
- if ( log.isDebugEnabled() )
- log.debug("Flush metadata ("+changed+"): "+this.label) ;
- if ( ! changed )
- return ;
-
-
- if ( log.isDebugEnabled() )
- {
- ByteArrayOutputStream out = new ByteArrayOutputStream() ;
- PrintStream ps = new PrintStream(out) ;
- properties.list(ps) ;
- ps.flush() ;
- log.debug("\n"+out.toString()) ;
- }
-
- //properties.list(System.out) ;
-
- saveProperties() ;
- changed = false ;
- }
-
- private void saveProperties()
- {
- if ( isMem() )
- return ;
- String str = label ;
- if ( str == null )
- str = metaFilename ;
- str = "Metadata: "+str ;
-
- try {
- PropertyUtils.storeToFile(properties, str, metaFilename) ;
- }
- catch (IOException ex)
- {
- log.error("Failed to store properties: "+metaFilename, ex) ;
- }
- }
-
-
- private void loadProperties()
- {
- if ( isMem() )
- {
- properties = new Properties() ;
- return ;
- }
-
- if ( properties == null )
- properties = new Properties() ;
-
- // if ( metaFilename == null )
- InputStream in = null ;
- try {
- // Copes with UTF-8 for Java5.
- PropertyUtils.loadFromFile(properties, metaFilename) ;
- }
- catch (FileNotFoundException ex) {}
- catch (IOException ex)
- {
- log.error("Failed to load properties: "+metaFilename, ex) ;
- }
- }
-
- /** Debugging */
- public void dump(PrintStream output)
- {
- output.println("Metafile: "+metaFilename) ;
- output.println("Label: "+label) ;
- output.println("Status: "+(changed?"changed":"unchanged")) ;
-
- if ( properties == null )
- {
- output.println("#<null>") ;
- return ;
- }
- // properties.list() ;
- SortedSet<Object> x = new TreeSet<>() ;
- x.addAll(properties.keySet()) ;
-
- for ( Object k : x )
- {
- String key = (String)k ;
- String value = properties.getProperty(key) ;
- output.print(key) ;
- output.print("=") ;
- output.print(value) ;
- output.println() ;
- }
- }
-
- @Override
- public void sync() { flush() ; }
-
- @Override
- public void close()
- {
- flush() ;
- closed = true ;
- metaFilename = null ;
- properties = null ;
-
- }
-
- private static class ComparatorKeys implements Comparator<String>
- {
- @Override
- public int compare(String o1, String o2)
- {
- return - o1.compareTo(o2) ;
- }
-
- }
-
- private static class MetaFileException extends DBOpEnvException
- {
- MetaFileException(String msg) { super(msg) ; }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/ProcessFileLock.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/ProcessFileLock.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/ProcessFileLock.java
deleted file mode 100644
index 990dcab..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/ProcessFileLock.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.file;
-
-import static java.nio.file.StandardOpenOption.CREATE;
-import static java.nio.file.StandardOpenOption.DSYNC;
-import static java.nio.file.StandardOpenOption.READ;
-import static java.nio.file.StandardOpenOption.WRITE;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileLock;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.jena.atlas.RuntimeIOException;
-import org.apache.jena.atlas.io.IO;
-import org.apache.jena.atlas.lib.StrUtils;
-import org.apache.jena.atlas.logging.Log;
-import org.seaborne.dboe.DBOpEnvException;
-import org.seaborne.dboe.sys.ProcessUtils;
-
-/** A simple packaging around a {@link java.nio.channels.FileLock}.
- * {@code ProcessFileLock} are not reentrant.
- */
-public class ProcessFileLock {
-
- // Static (process-wide) sync.
- private static Object sync = new Object();
-
- // Map from path of the file to a ProcessFileLock
- private static ConcurrentHashMap<Path, ProcessFileLock> locks = new ConcurrentHashMap<>();
-
- private final Path filepath;
- private final FileChannel fileChannel;
- private FileLock fileLock;
-
- // Different variations for what to do when a lock can not be taken.
- private enum NoLockAction { EXCEPTION, RETURN, WAIT }
-
- /** Create a {@code ProcessFileLock} using the named file.
- * Locks are JVM-wide; each filename is assocauted with one lock object.
- */
- public static ProcessFileLock create(String filename) {
- try {
- Path abspath = Paths.get(filename).toRealPath();
- return locks.computeIfAbsent(abspath, ProcessFileLock::new);
- }
- catch (IOException e) { IO.exception(e); return null; }
- }
-
- /** Return the lock, unlocking the file if this process has it locked. */
- public static void release(ProcessFileLock lockFile) {
- if ( lockFile == null )
- return ;
- if ( lockFile.isLockedHere() )
- lockFile.unlock();
- locks.remove(lockFile.getPath());
- }
- /** Create the structure for a ProcessFileLock on file {@code filename}.
- * This does not take the lock
- *
- * @see #lockEx()
- * @see #tryLock()
- * @see #unlock()
- */
- private ProcessFileLock(Path filename) {
- try {
- this.filepath = filename ;
- // Much the same as ...
-// randomAccessFile = new RandomAccessFile(filename, "rw");
-// fileChannel = randomAccessFile.getChannel();
- // Quite heavy weight but only used to lock long-term objects.
- this.fileChannel = FileChannel.open(filename, CREATE, WRITE, READ, DSYNC);
- fileLock = null;
- }
- catch (NoSuchFileException | FileNotFoundException ex) {
- // The path does not name a possible file in an exists directory.
- throw new RuntimeIOException("No such file '"+filename+"'", ex);
- }
- catch (IOException ex) {
- throw new RuntimeIOException("Failed to open '"+filename+"'", ex);
- }
- }
-
- /** Lock the file or throw {@link DBOpEnvException} */
- public void lockEx() {
- lockOperation(NoLockAction.EXCEPTION);
- }
-
- /** Lock the file or wait. */
- public void lockWait() {
- lockOperation(NoLockAction.EXCEPTION);
- }
-
- /** Lock a file, return true on success else false. */
- public boolean tryLock() {
- return lockOperation(NoLockAction.RETURN);
- }
-
- /** Release the lock - this must be paired with a "lock" operation. */
- public void unlock() {
- synchronized(sync) {
- try {
- fileLock.release();
- } catch (IOException ex) { throw new RuntimeIOException("Failed to unlock '"+filepath+"'", ex); }
- }
- }
-
- /** Return true if this process holds the lock. */
- public boolean isLockedHere() {
- if ( fileLock == null )
- return false;
- return fileLock.isValid();
- }
-
- public Path getPath() {
- return filepath;
- }
-
- /** Take the lock.
- * <p>
- * Write our PID into the file and return true if it succeeds.
- * <p>
- * Try to get the existing PID if it fails.
- */
- private boolean lockOperation(NoLockAction action) {
- synchronized(sync) {
- if ( fileLock != null )
- throw new AlreadyLocked("Failed to get a lock: file='"+filepath+"': Lock already held");
-
- try {
- fileLock = (action == NoLockAction.WAIT) ? fileChannel.lock() : fileChannel.tryLock();
- if ( fileLock == null ) {
- if ( action == NoLockAction.RETURN )
- return false ;
- // Read without the lock.
- // This isn't perfect but it is only providing helpful information.
- int pid = readProcessId(-99);
- if ( pid >= 0 )
- throw new DBOpEnvException("Failed to get a lock: file='"+filepath+"': held by process "+pid);
- throw new DBOpEnvException("Failed to get a lock: file='"+filepath+"': failed to get the holder's process id");
- }
- // Got the lock. Record our process id.
- int pid = ProcessUtils.getPid(-1);
- writeProcessId(pid);
- return true;
- } catch (IOException ex) {
- if ( action == NoLockAction.RETURN )
- return false;
- throw new DBOpEnvException("Failed to get a lock: file='"+filepath+"'", ex);
- }
- }
- }
-
- // I/O for a process id.
- /** Read the file to get a process id */
- private int readProcessId(int dft) throws IOException {
- ByteBuffer bb = ByteBuffer.allocate(128);
- fileChannel.position(0);
- int len = fileChannel.read(bb);
- fileChannel.position(0);
- if ( len == 0 )
- return dft;
- if ( len == 128 )
- // Too much.
- return dft;
- // Bug in Jena 3.3.0
- //byte[] b = ByteBufferLib.bb2array(bb, 0, len);
- bb.flip();
- byte[] b = new byte[len];
- bb.get(b);
-
- String pidStr = StrUtils.fromUTF8bytes(b);
- // Remove all leadign and trailing (vertical and horizontal) whitespace.
- pidStr = pidStr.replaceAll("[\\s\\t\\n\\r]+$", "");
- pidStr = pidStr.replaceAll("^[\\s\\t\\n\\r]+", "");
- try {
- // Process id.
- return Integer.parseInt(pidStr);
- } catch (NumberFormatException ex) {
- ex.printStackTrace();
- Log.warn(this, "Bad process id: file='"+filepath+"': read='"+pidStr+"'");
- return dft;
- }
- }
-
- /** Write the process id to the file. */
- private void writeProcessId(int pid) throws IOException {
- byte b[] = StrUtils.asUTF8bytes(Integer.toString(pid)+"\n");
- fileChannel.truncate(0);
- int len = fileChannel.write(ByteBuffer.wrap(b));
- fileChannel.position(0);
- }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/SegmentedMemBuffer.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/SegmentedMemBuffer.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/SegmentedMemBuffer.java
deleted file mode 100644
index 00ae2ba..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/file/SegmentedMemBuffer.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.file;
-
-import java.nio.ByteBuffer ;
-import java.util.ArrayList ;
-import java.util.List ;
-
-import org.apache.jena.atlas.io.IO ;
-import org.apache.jena.atlas.lib.ByteBufferLib ;
-import org.apache.jena.atlas.logging.FmtLog ;
-import org.slf4j.Logger ;
-import org.slf4j.LoggerFactory ;
-
-/** A segmented, expanding buffer of bytes.
- * This class does not copy the underlying bytes when the file grows.
- * Hence, the performance is more predictable.
- * (Resizing a fixed size buffer is a copy c.f. performance issues with
- * {@code ArrayList} or {@code ByteArrayOutputStream}
- * as they go from small to large.
- */
-public class SegmentedMemBuffer {
- private static Logger log = LoggerFactory.getLogger(SegmentedMemBuffer.class) ;
-
- // See java.nio.channels.FileChannel
- private static int DFT_CHUNK = 1024*1024 ;
- private static int DFT_SEGMENTS = 1000 ;
- private final int CHUNK ;
- // The file pointer and marker of the allocated end point.
- private long dataLength = 0 ;
- private List<byte[]> space = null ;
- private boolean isOpen ;
- private final boolean TRACKING = false ;
-
- public SegmentedMemBuffer() { this(DFT_CHUNK) ; }
-
- public SegmentedMemBuffer(int chunk) {
- this.CHUNK = chunk ;
- space = new ArrayList<>(DFT_SEGMENTS) ;
- // "Auto open"
- isOpen = true ;
- }
-
- public void open() {
- isOpen = true ;
-// if ( storage != null )
-// throw new RuntimeIOException("Already open") ;
-// storage = new ArrayList<>(DFT_SEGMENTS) ;
- }
-
- public boolean isOpen() {
- return space != null ;
- }
-
- public int read(long posn, ByteBuffer bb) {
- if ( TRACKING )
- log("read<<%s", ByteBufferLib.details(bb));
- checkOpen() ;
- checkPosition(posn) ;
- int len = bb.remaining() ;
- if ( posn+dataLength > dataLength )
- len = (int)(dataLength-posn) ;
- arrayCopyOut(space, posn, bb);
- return len ;
- }
-
- public int read(long posn, byte[] b) {
- if ( TRACKING )
- log("read<<[%d]", b.length) ;
- return read$(posn, b, 0, b.length) ;
- }
-
- public int read(long posn, byte[] b, int start, int length) {
- if ( TRACKING )
- log("read<<[%d],%s,%s", b.length, start, length) ;
- return read$(posn, b, start, length) ;
- }
-
- private int read$(long posn, byte[] b, int start, int length) {
- checkOpen() ;
- if ( posn >= dataLength )
- return -1 ;
- checkPosition(posn) ;
- if ( length == 0 )
- return 0 ;
- checkByteArray(b, start, length) ;
- int len = length ;
- if ( posn+length > dataLength )
- len = (int)(dataLength-posn) ;
- arrayCopyOut(space, posn, b, start, len) ;
- return len ;
- }
-
- public void write(long posn, ByteBuffer bb ) {
- if ( TRACKING )
- log("read<<%s", ByteBufferLib.details(bb));
- checkOpen() ;
- if ( posn != dataLength )
- checkPosition(posn) ;
- arrayCopyIn(bb, space, posn) ;
- }
-
- public void write(long posn, byte[] b ) {
- if ( TRACKING )
- log("read<<[%d]", b.length) ;
- write$(posn, b, 0, b.length) ;
- }
-
- public void write(long posn, byte[] b, int start, int length) {
- if ( TRACKING )
- log("read<<[%d],%d,%d", b.length, start, length) ;
- write$(posn, b, start, length);
- }
-
- private void write$(long posn, byte[] b, int start, int length) {
- checkOpen() ;
- checkPosition(posn) ;
- if ( length == 0 )
- return ;
- checkByteArray(b,start,length) ;
- arrayCopyIn(b, start, space, dataLength, length) ;
- }
-
- public void truncate(long length) {
- if ( TRACKING )
- log("truncate(%d)", length) ;
- if ( length < 0 )
- IO.exception(String.format("truncate: bad length : %d", length)) ;
- checkOpen() ;
- dataLength = Math.min(dataLength, length) ;
- // clear above?
- }
-
- public void sync() {
- checkOpen() ;
- }
-
- public void close() {
- if ( ! isOpen() )
- return ;
- isOpen = false ;
- space.clear() ;
- space = null ;
- }
-
- public long length() {
- return dataLength ;
- }
-
- private void checkOpen() {
- if ( ! isOpen )
- IO.exception("Not open") ;
- }
-
- private void checkPosition(long posn) {
- // Allows posn to be exactly the byte beyond the end
- if ( posn < 0 || posn > dataLength )
- IO.exception(String.format("Position out of bounds: %d in [0,%d]", posn, dataLength)) ;
- }
-
- private void checkByteArray(byte[] b, int start, int length) {
- if ( start < 0 || start >= b.length )
- IO.exception(String.format("Start point out of bounds of byte array: %d in [0,%d)", start, b.length)) ;
- if ( length < 0 || start+length > b.length )
- IO.exception(String.format("Start/length out of bounds of byte array: %d/%d in [0,%d)", start, length, b.length)) ;
- }
-
- private int getSegment(long posn) { return (int)(posn / CHUNK) ; }
-
- private int getOffset(long posn) { return (int) (posn % CHUNK) ; }
-
- // c.f. System.arrayCopy
- private void arrayCopyIn(byte[] src, final int srcStart, List<byte[]> dest, final long destStart, final int length) {
- if ( length == 0 )
- return ;
- int len = length ;
- int srcPosn = srcStart ;
- int seg = getSegment(destStart) ;
- int offset = getOffset(destStart) ;
- while( len > 0 ) {
- int z = Math.min(len, CHUNK-offset) ;
- // Beyond end of file?
- if ( seg >= dest.size() ) {
- byte[] buffer = new byte[CHUNK] ;
- space.add(buffer) ;
- }
- System.arraycopy(src, srcPosn, dest.get(seg), offset, z);
- srcPosn += z ;
- len -= z ;
- seg += 1 ;
- offset += z ;
- offset %= CHUNK ;
- }
- dataLength = Math.max(dataLength, destStart+length) ;
- }
-
- private void arrayCopyOut(List<byte[]> src, final long srcStart, byte[] dest, final int destStart, final int length) {
- int len = length ;
- len = Math.min(len, (int)(dataLength-srcStart)) ;
- int dstPosn = destStart ;
- int seg = getSegment(srcStart) ;
- int offset = getOffset(srcStart) ;
- while( len > 0 ) {
- int z = Math.min(len, CHUNK-offset) ;
- System.arraycopy(src.get(seg), offset, dest, dstPosn, z);
- dstPosn += z ;
- len -= z ;
- seg += 1 ;
- offset += z ;
- offset %= CHUNK ;
- }
- }
-
- private void arrayCopyIn(ByteBuffer bb, List<byte[]> dest, long destStart) {
- if ( bb.remaining() == 0 )
- return ;
- int length = bb.remaining() ;
- int len = bb.remaining() ;
- int srcPosn = bb.position() ;
- int seg = getSegment(destStart) ;
- int offset = getOffset(destStart) ;
- while( len > 0 ) {
- int z = Math.min(len, CHUNK-offset) ;
- // Beyond end of file?
- if ( seg >= dest.size() ) {
- byte[] buffer = new byte[CHUNK] ;
- space.add(buffer) ;
- }
- byte[] bytes = dest.get(seg) ;
- bb.get(bytes, offset, z) ;
- srcPosn += z ;
- len -= z ;
- seg += 1 ;
- offset += z ;
- offset %= CHUNK ;
- }
- dataLength = Math.max(dataLength, destStart+length) ;
- }
-
- private void arrayCopyOut(List<byte[]> src, long srcStart, ByteBuffer bb) {
- int len = bb.remaining() ;
- len = Math.min(len, (int)(dataLength-srcStart)) ;
- int dstPosn = bb.position() ;
- int seg = getSegment(srcStart) ;
- int offset = getOffset(srcStart) ;
- while( len > 0 ) {
- int z = Math.min(len, CHUNK-offset) ;
- byte[] bytes = src.get(seg) ;
- bb.put(bytes, offset, z) ;
- dstPosn += z ;
- len -= z ;
- seg += 1 ;
- offset += z ;
- offset %= CHUNK ;
- }
- }
-
- private void log(String fmt, Object... args) {
- if ( TRACKING )
- FmtLog.debug(log, fmt, args);
- }
-
-}
-
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/BlockConverter.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/BlockConverter.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/BlockConverter.java
deleted file mode 100644
index e809604..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/BlockConverter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.page;
-
-import org.seaborne.dboe.base.block.Block ;
-import org.seaborne.dboe.base.block.BlockType ;
-
-/** Convert between Blocks and typed Pages */
-public interface BlockConverter<T extends Page>
-{
- /** Create a T, given an existing Block */
- public T fromBlock(Block block) ;
-
- /** Make a block, given a T */
- public Block toBlock(T t) ;
-
- /** Create a new T from an uninitialized Block */
- public T createFromBlock(Block block, BlockType bType) ;
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/Page.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/Page.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/Page.java
deleted file mode 100644
index d39d8d2..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/Page.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.page;
-
-import org.apache.jena.atlas.io.Printable ;
-import org.seaborne.dboe.base.block.Block ;
-
-public interface Page extends Printable
-{
- public static final int NO_ID = -1 ;
-
- /** Pages are addressed ints (a page ref does in on-disk blocks)
- * although block are address in longs
- */
- public int getId() ;
-
- /** Return a string for display that identifies this Page */
- public String getRefStr() ;
-
- /** Return the block associated with this page */
- public Block getBackingBlock() ;
-
- /**
- * The underlying block for this page has changed (e.g. it's been
- * promoted and the promotion may have caused the block to change.
- */
- public abstract void reset(Block block) ;
-
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBase.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBase.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBase.java
deleted file mode 100644
index 0482b73..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBase.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.page;
-
-import org.seaborne.dboe.DBOpEnvException ;
-import org.seaborne.dboe.base.block.Block ;
-
-/** A page with a byte buffer */
-public abstract class PageBase implements Page
-{
- private int id ;
- private Block block ;
-
- protected PageBase(Block block)
- {
- this.block = block ;
- long x = block.getId() ;
- if ( x < 0 )
- throw new DBOpEnvException("Page id is negative: "+x) ;
- if ( x > Integer.MAX_VALUE )
- throw new DBOpEnvException("Page id is large than MAX_INT: "+x) ;
- this.id = block.getId().intValue() ;
- }
-
- @Override
- final public void reset(Block block2)
- {
-// if ( block2.getId() != id )
-// Log.warn(this, "Block id changed: "+id+" => "+block2.getId()) ;
- id = block2.getId().intValue() ;
- _reset(block2) ;
- this.block = block2 ;
- }
-
- protected abstract void _reset(Block block) ;
-
- @Override
- final public Block getBackingBlock() { return block ; }
-
- @Override
- final public int getId() { return id ; }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBlockMgr.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBlockMgr.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBlockMgr.java
deleted file mode 100644
index 38b93f1..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/page/PageBlockMgr.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.page;
-
-import org.apache.jena.atlas.lib.Closeable ;
-import org.apache.jena.atlas.lib.InternalErrorException ;
-import org.apache.jena.atlas.logging.Log ;
-import org.seaborne.dboe.base.block.Block ;
-import org.seaborne.dboe.base.block.BlockMgr ;
-import org.seaborne.dboe.base.block.BlockType ;
-
-/** Engine that wraps from blocks to typed pages. */
-
-public class PageBlockMgr<T extends Page> implements Closeable
-{
- protected final BlockMgr blockMgr ;
- protected BlockConverter<T> pageFactory ;
-
- protected PageBlockMgr(BlockConverter<T> pageFactory, BlockMgr blockMgr) {
- this.pageFactory = pageFactory ;
- this.blockMgr = blockMgr ;
- }
-
- // Sometimes, the subclass must pass null to the constructor then call this.
- protected void setConverter(BlockConverter<T> pageFactory) { this.pageFactory = pageFactory ; }
-
- public BlockMgr getBlockMgr() { return blockMgr ; }
-
- public long allocLimit() { return blockMgr.allocLimit() ; }
-
- public void resetAlloc(long boundary) {
- blockMgr.resetAlloc(boundary) ;
- }
-
- /** Allocate a new thing */
- public T create(BlockType bType) {
- Block block = blockMgr.allocate(-1) ;
- block.setModified(true) ;
- T page = pageFactory.createFromBlock(block, bType) ;
- return page ;
- }
-
- /**
- * Fetch a block for reading.
- * @param id Block to fetch
- */
- public T getRead(int id) {
- return getRead$(id) ;
- }
-
- /**
- * Fetch a block for reading.
- *
- * @param id Block to fetch
- * @param referencingId
- * Id of block referring to this one.
- * For example, a parent in a tree.
- * May be negative for "none" or "meaningless".
- */
- public T getRead(int id, int referencingId) {
- return getRead$(id) ;
- }
-
- /**
- * Fetch a block for writing.
- * @param id Block to fetch
- */
- public T getWrite(int id) {
- return getWrite$(id) ;
- }
-
- /**
- * Fetch a block for writing.
- *
- * @param id Block to fetch
- * @param referencingId
- * Id of block referring to this one.
- * For example, a parent in a tree.
- * May be -1 for "none" or "meaningless".
- */
- public T getWrite(int id, int referencingId) {
- return getWrite$(id) ;
- }
-
- // ---- The read and write worker operations.
-
- final protected T getRead$(int id) {
- Block block = blockMgr.getRead(id) ;
- // Blocks from the BlockMgrCache may be write-dirty so this test
- // is wrong in that situation. It is better to use the block as-is
- // otherwise we'd have two blocks of a given id with different flags
- // that confuse the block caching.
-// if ( block.isModified() ) {
-// System.err.println("getRead - isModified - "+blockMgr.getLabel()+"["+id+"]") ;
-//// block = new Block(block.getId(), block.getByteBuffer());
-//// block.setModified(false);
-// // Debug.
-// //blockMgr.getRead(id) ;
-// }
- T page = pageFactory.fromBlock(block) ;
- return page ;
- }
-
- final protected T getWrite$(int id) {
- Block block = blockMgr.getWrite(id) ;
- block.setReadOnly(false) ;
- T page = pageFactory.fromBlock(block) ;
- return page ;
- }
-
- // ----
-
- public void put(T page) {
- write(page) ;
- release(page) ;
- }
-
- public void write(T page) {
- Block blk = pageFactory.toBlock(page) ;
- blockMgr.write(blk) ;
- }
-
- public void release(Page page) {
- Block block = page.getBackingBlock() ;
- blockMgr.release(block) ;
- }
-
- private void warn(String string) {
- Log.warn(this, string) ;
- }
-
- public void free(Page page) {
- Block block = page.getBackingBlock() ;
- blockMgr.free(block) ;
- }
-
-
- /** Promote a page to be writable in-place (block id does not change, hnce page does not change id). */
- public void promoteInPlace(Page page) {
- Block block = page.getBackingBlock() ;
- block.getByteBuffer().rewind() ;
- Block block2 = blockMgr.promote(block) ;
- block2.setReadOnly(false) ;
- if ( block2.getId() != block.getId() )
- throw new InternalErrorException("Block id changed") ;
- if ( block2 == block )
- return ;
- // Change - reset Block in page.
- // The details should not have changed.
- // page.reset(block2) ;
- }
-
- /** Promote a page - return 'true' if the block changed (.reset()) will have been called */
- public boolean promoteDuplicate(Page page) {
- Block block = page.getBackingBlock() ;
- block.getByteBuffer().rewind() ;
-
- // --- TODO Always new
- Block block2 = blockMgr.allocate(-1) ;
- block2.getByteBuffer().put(block.getByteBuffer()) ;
- block2.getByteBuffer().rewind() ;
- block2.setReadOnly(false) ;
-
- if ( block2 == block )
- return false ;
- // Change - reset Block in page.
- page.reset(block2) ;
- return true ;
- }
-
- public boolean valid(int id) {
- return blockMgr.valid(id) ;
- }
-
- public void dump() {
- for ( int idx = 0 ; valid(idx) ; idx++ ) {
- T page = getRead(idx, -1) ;
- System.out.println(page) ;
- release(page) ;
- }
- }
-
- /** Signal the start of an update operation */
- public void startUpdate() { blockMgr.beginUpdate() ; }
-
- /** Signal the completion of an update operation */
- public void finishUpdate() { blockMgr.endUpdate() ; }
-
- /** Signal the start of an update operation */
- public void startRead() { blockMgr.beginRead() ; }
-
- /** Signal the completeion of an update operation */
- public void finishRead() { blockMgr.endRead() ; }
-
- @Override
- public void close() { blockMgr.close(); }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/Record.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/Record.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/Record.java
deleted file mode 100644
index f06d383..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/Record.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.record;
-
-import static java.lang.String.format ;
-
-import java.util.Arrays ;
-
-import org.apache.jena.atlas.lib.Bytes ;
-import org.seaborne.dboe.sys.SystemIndex ;
-
-/** A record is pair of key and value. It may be all key, in which case value is null. */
-
-final
-public class Record //implements Comparable<Record>
-{
- /*
- * Records of fixed size (controlled by the factory).
- */
- public static final Record NO_REC = null ;
-
- final private byte[] key ;
- final private byte[] value ;
-
- public Record(byte[] key, byte[] value)
- {
- this.key = key ;
- this.value = value ;
- if ( SystemIndex.Checking )
- {
- if ( value != null && value.length == 0 )
- throw new RecordException("Zero length value") ;
- }
- }
-
- public byte[] getKey() { return key ; }
- public byte[] getValue() { return value ; }
-
- public boolean hasSeparateValue() { return value!=null ; }
-
- @Override
- public int hashCode()
- {
- return Arrays.hashCode(key) ^ Arrays.hashCode(value) ;
- }
-
- @Override
- public boolean equals(Object other)
- {
- if ( this == other ) return true ;
- if ( ! ( other instanceof Record ) ) return false ;
- Record r = (Record)other ;
- return compareByKeyValue(this, r) == 0 ;
- }
-
- @Override
- public String toString()
- {
- if ( value == null )
- return str(key) ;
- return str(key)+":"+str(value) ;
- }
-
- /** Is the key of record1 == key of record2 */
- public static boolean keyEQ(Record record1, Record record2)
- {
- int x = compareByKey(record1, record2) ;
- return x == 0 ;
- }
-
- /** Is the key of record1 != key of record2 */
- public static boolean keyNE(Record record1, Record record2)
- {
- int x = compareByKey(record1, record2) ;
- return x != 0 ;
- }
-
- /** Is the key of record1 < key of record2 */
- public static boolean keyLT(Record record1, Record record2)
- {
- int x = compareByKey(record1, record2) ;
- return x < 0 ;
- }
-
- /** Is the key of record1 <= key of record2 */
- public static boolean keyLE(Record record1, Record record2)
- {
- int x = compareByKey(record1, record2) ;
- return x <= 0 ;
- }
-
- /** Is the key of record1 >= key of record2 */
- public static boolean keyGE(Record record1, Record record2)
- {
- int x = compareByKey(record1, record2) ;
- return x >= 0 ;
- }
-
- /** Is the key of record1 > key of record2 */
- public static boolean keyGT(Record record1, Record record2)
- {
- int x = compareByKey(record1, record2) ;
- return x > 0 ;
- }
-
- /** Is (key, value) of record1 equal to (key,value) of record2 */
- public static boolean equals(Record record1, Record record2)
- {
- int x = compareByKeyValue(record1, record2) ;
- return x == 0 ;
- }
-
-
-
- static public String str(byte[] b)
- {
- StringBuilder str = new StringBuilder() ;
- for ( byte aB : b )
- {
- str.append( format( "%02x", aB ) );
- }
- return str.toString() ;
- }
-
- public static int compareByKey(Record record1, Record record2)
- {
- checkKeyCompatible(record1, record2) ;
- return Bytes.compare(record1.key, record2.key) ;
- }
-
- public static int compareByKeyValue(Record record1, Record record2)
- {
- checkCompatible(record1, record2) ;
- int x = Bytes.compare(record1.key, record2.key) ;
- if ( x == 0 )
- {
- if ( record1.value != null )
- x = Bytes.compare(record1.value, record2.value) ;
- }
- return x ;
- }
-
- static void checkCompatible(Record record1, Record record2)
- {
- if ( ! compatible(record1, record2, true) )
- throw new RecordException(format("Incompatible: %s, %s", record1, record2)) ;
- }
-
- static void checkKeyCompatible(Record record1, Record record2)
- {
- if ( ! compatible(record1, record2, false) )
- throw new RecordException(format("Incompatible: %s, %s", record1, record2)) ;
- }
-
- static boolean compatible(Record record1, Record record2, boolean checkValue)
- {
- if ( record1.key.length != record2.key.length )
- return false ;
-
- if ( checkValue )
- {
- if ( record1.value == null && record2.value == null )
- return true ;
- if ( record1.value == null )
- return false ;
- if ( record2.value == null )
- return false ;
- if ( record1.value.length != record2.value.length )
- return false;
- }
- return true ;
- }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordException.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordException.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordException.java
deleted file mode 100644
index 4b0301a..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordException.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.record;
-
-import org.seaborne.dboe.DBOpEnvException ;
-
-public class RecordException extends DBOpEnvException
-{
- public RecordException() {}
- public RecordException(String msg) { super(msg) ; }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordFactory.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordFactory.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordFactory.java
deleted file mode 100644
index a4c9cbb..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordFactory.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.record;
-
-import static java.lang.String.format;
-
-import java.nio.ByteBuffer;
-
-/** Record creator */
-final
-public class RecordFactory
-{
- private final int keyLength;
- private final int valueLength;
- private final int slotLen;
- private final boolean checking = false;
-
- public RecordFactory(int keyLength, int valueLength) {
- if ( keyLength <= 0 )
- throw new IllegalArgumentException("Bad key length: " + keyLength);
- if ( valueLength < 0 )
- throw new IllegalArgumentException("Bad value length: " + valueLength);
-
- this.keyLength = keyLength;
- this.valueLength = valueLength;
- this.slotLen = keyLength + valueLength;
- }
-
- /** Return a RecordFactory that makes key-only records of the same key size */
- public RecordFactory keyFactory() {
- return new RecordFactory(keyLength, 0);
- }
-
- /** Create a key-only record, allocating blank space for the key */
- public Record createKeyOnly() {
- return create(new byte[keyLength], null);
- }
-
- /** Create a key-only record */
- public Record createKeyOnly(Record record) {
- checkKey(record.getKey());
- if ( record.getValue() == null )
- return record;
-
- return create(record.getKey(), null);
- }
-
- /** Create a key and value record (value uninitialized) */
- public Record create(byte[] key) {
- checkKey(key);
- byte[] v = null;
- if ( valueLength > 0 )
- v = new byte[valueLength];
- return create(key, v);
- }
-
- /** Create a record, allocating space for the key and value (if any) */
- public Record create() {
- return create(new byte[keyLength], (valueLength > 0) ? new byte[valueLength] : null);
- }
-
- /** Create a key and value record */
- public Record create(byte[] key, byte[] value) {
- check(key, value);
- return new Record(key, value);
- }
-
- public void insertInto(Record record, ByteBuffer bb, int idx) {
- check(record);
- bb.position(idx * slotLen);
- bb.put(record.getKey(), 0, keyLength);
- if ( hasValue() && record.getValue() != null )
- bb.put(record.getValue(), 0, valueLength);
- }
-
- public static final RecordMapper<Record> mapperRecord = new RecordMapper<Record>() {
- /*
- * RecordRangeIterator calls getRecordBuffer().get(slotidx);
- */
- @Override
- public Record map(ByteBuffer bb, int idx, byte[] keyBytes, RecordFactory factory) {
- byte[] key = new byte[factory.keyLength];
- byte[] value = (factory.hasValue() ? new byte[factory.valueLength] :null );
- // Is it better to avoid the synchronize needed for bb.position./bb.get
- // but not use a (relative) bulk bb.get(byte[],,) which may be a native operation?
-
-// int posnKey = idx*slotLen;
-// // Avoid using position() so we can avoid needing synchronized.
-// copyInto(key, bb, posnKey, keyLength);
-// if ( value != null )
-// {
-// int posnValue = idx*slotLen+keyLength;
-// copyInto(value, bb, posnValue, valueLength);
-// }
-
- // Using bb.get(byte[],,) may be potentially faster but requires the synchronized
- // There's no absolute version.
- synchronized(bb)
- {
- bb.position(idx*factory.slotLen);
- bb.get(key, 0, factory.keyLength);
- if ( value != null )
- bb.get(value, 0, factory.valueLength);
- }
- if ( keyBytes != null )
- System.arraycopy(key, 0, keyBytes, 0, factory.keyLength);
- return factory.create(key, value);
- }
- };
-
- public <X> X access(ByteBuffer bb, int idx, byte[] keyBytes, RecordMapper<X> mapper) {
- return mapper.map(bb, idx, keyBytes, this);
- }
-
- public Record buildFrom(ByteBuffer bb, int idx) {
- return access(bb, idx, null, mapperRecord);
- }
-
- private final void copyInto(byte[] dst, ByteBuffer src, int start, int length) {
- // Thread safe.
- for ( int i = 0; i < length; i++ )
- dst[i] = src.get(start+i);
- // Would otherwise be ...
-// src.position(start);
-// src.get(dst, 0, length);
- }
-
- public boolean hasValue() { return valueLength > 0; }
-
- public int recordLength() { return keyLength + valueLength; }
-
- public int keyLength() { return keyLength; }
-
- public int valueLength() { return valueLength; }
-
- @Override
- public String toString() {
- return format("<RecordFactory k=%d v=%d>", keyLength, valueLength);
- }
-
- private final void check(Record record) {
- if ( ! checking ) return;
- check(record.getKey(), record.getValue());
- }
-
- private final void checkKey(byte[] k) {
- if ( ! checking ) return;
- if ( k == null )
- throw new RecordException("Null key byte[]");
- if ( keyLength != k.length )
- throw new RecordException(format("Key length error: This RecordFactory manages records of key length %d, not %d", keyLength,
- k.length));
- }
-
- private final void check(byte[] k, byte[] v) {
- if ( ! checking ) return;
- checkKey(k);
- if ( valueLength <= 0 ) {
- if ( v != null )
- throw new RecordException("Value array error: This RecordFactory manages records that are all key");
- } else {
- // v == null for a key-only record from this factory.
- if ( v != null && v.length != valueLength )
- throw new RecordException(format("This RecordFactory manages record of value length %d, not (%d,-)", valueLength,
- v.length));
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordMapper.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordMapper.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordMapper.java
deleted file mode 100644
index faf3037..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/record/RecordMapper.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.record;
-
-import java.nio.ByteBuffer ;
-
-/** Allow bytes to pull directly out of storage with no copy to record;
- * also extract the key bytes into an array.
- * This operation MUST not retain any references to the ByteBuffer storage space.
- * All in order to avoid remapping Records to higher level objects,
- * which churns objects (GC issue) and avoids a copy.
- */
-public interface RecordMapper<X> {
- X map(ByteBuffer bb, int entryIdx, byte key[], RecordFactory recFactory) ;
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPage.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPage.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPage.java
deleted file mode 100644
index db93043..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPage.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.recordbuffer;
-
-import org.seaborne.dboe.base.block.Block ;
-import org.seaborne.dboe.base.page.Page ;
-import org.seaborne.dboe.base.record.RecordFactory ;
-import org.seaborne.dboe.sys.Sys ;
-
-/**
- * B+Tree records nodes and hash buckets.
- * Add link field to a RecordBufferPageBase
- */
-
-public final class RecordBufferPage extends RecordBufferPageBase
-{
- // Why not straight to BPlusTreeRecords?
- // 1 - this may be useful in its own right as a sequence of records on-disk.
- // 2 - BPlusTreeRecords inherits from BPlusTreePage
-
-
- // To Constants
- // Offsets
- // final public static int COUNT = 0 ;
- // Adds this field over RecordBufferPageBase
- final public static int LINK = 4 ;
- final private static int FIELD_LENGTH = Sys.SizeOfInt ; // Length of the space needed here (not count)
-
- private int link = Page.NO_ID ;
-
- public final int getLink() { return link ; }
-
- public void setLink(int link)
- {
- this.link = link ;
- getBackingBlock().getByteBuffer().putInt(LINK, link) ;
- }
-
- @Override
- protected void _reset(Block block)
- {
- // TODO -- should this be format?
- // Print this
- super.rebuild(block, this.getCount()) ;
- //?? use .format
-// // TODO WRONG : block is overlying.
-// this.link = block.getByteBuffer().getInt(LINK) ;
- }
-
- public static int calcRecordSize(RecordFactory factory, int blkSize)
- { return RecordBufferPageBase.calcRecordSize(factory, blkSize, FIELD_LENGTH) ; }
-
- public static int calcBlockSize(RecordFactory factory, int maxRec)
- { return RecordBufferPageBase.calcBlockSize(factory, maxRec, FIELD_LENGTH) ; }
-
- /** The construction methods */
- public static RecordBufferPage createBlank(Block block,RecordFactory factory)
- {
- int count = 0 ;
- int linkId = NO_ID ;
- return new RecordBufferPage(block, factory, count, linkId) ;
- }
-
- public static RecordBufferPage format(Block block, RecordFactory factory)
- {
- int count = block.getByteBuffer().getInt(COUNT) ;
- int linkId = block.getByteBuffer().getInt(LINK) ;
- return new RecordBufferPage(block, factory, count, linkId) ;
- }
-
- private RecordBufferPage(Block block, RecordFactory factory, int count, int linkId)
- {
- super(block, FIELD_LENGTH, factory, count) ;
- this.link = linkId ;
- }
-
- @Override
- public String toString()
- { return String.format("RecordBufferPage[id=%d,link=%d]: %s", getBackingBlock().getId(), getLink(), recBuff) ; }
-
- @Override
- public String getRefStr() {
- return String.format("RecordBufferPage[id=%d]", getBackingBlock().getId()) ;
- }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageBase.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageBase.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageBase.java
deleted file mode 100644
index 0390e3b..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageBase.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.recordbuffer ;
-
-import java.nio.ByteBuffer ;
-
-import org.apache.jena.atlas.io.IndentedWriter ;
-import org.seaborne.dboe.base.block.Block ;
-import org.seaborne.dboe.base.buffer.RecordBuffer ;
-import org.seaborne.dboe.base.page.PageBase ;
-import org.seaborne.dboe.base.record.RecordFactory ;
-import org.seaborne.dboe.sys.Sys ;
-
-/**
- * The on-disk form of a block of a single RecordBuffer
- * (i.e. this is not part of a BTree/BPlusTree branch node).
- * This must be compatible with B+Tree records nodes and hashbuckets.
- */
-
-public abstract class RecordBufferPageBase extends PageBase // implements Page
-{
- // Field offsets
- final public static int COUNT = 0 ;
- // Length due to this class - subclasses may use more overhead.
- final private static int FIELD_LENGTH = Sys.SizeOfInt ;
-
- protected final int headerLength ;
-
- // Interface: "Page" - id, byteBuffer, count
- protected RecordBuffer recBuff ;
- private final RecordFactory factory ;
-
- // private int offset ; // Bytes of overhead.
-
- public static int calcRecordSize(RecordFactory factory, int blkSize, int headerOffset) {
- // Length = X*recordLength + HEADER
- int x = blkSize - totalOffset(headerOffset) ;
- return x / factory.recordLength() ;
- }
-
- public static int calcBlockSize(RecordFactory factory, int maxRec, int headerOffset) {
- return totalOffset(headerOffset) + factory.recordLength() * maxRec ;
- }
-
- private static int totalOffset(int headerOffset) {
- return FIELD_LENGTH + headerOffset ;
- }
-
- protected RecordBufferPageBase(Block block, int offset, RecordFactory factory, int count) {
- // This code knows the alignment of the records in the ByteBuffer.
- super(block) ;
- this.headerLength = FIELD_LENGTH + offset ; // NB +4 for the count field
- this.factory = factory ;
- rebuild(block, count) ;
- }
-
- protected void rebuild(Block block, int count) {
- ByteBuffer bb = block.getByteBuffer() ;
- bb.clear() ;
- bb.position(headerLength) ;
- bb = bb.slice() ;
- this.recBuff = new RecordBuffer(bb, factory, count) ;
- }
-
- public final RecordBuffer getRecordBuffer() {
- return recBuff ;
- }
-
- public final int getCount() {
- return recBuff.size() ;
- }
-
- public final int getMaxSize() {
- return recBuff.maxSize() ;
- }
-
- public void setCount(int count) {
- recBuff.setSize(count) ;
- }
-
- @Override
- public String toString() {
- return String.format("RecordBufferPageBase[id=%d]: %s", getBackingBlock().getId(), recBuff) ;
- }
-
- @Override
- public void output(IndentedWriter out) {
- out.print(toString()) ;
- }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageMgr.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageMgr.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageMgr.java
deleted file mode 100644
index 015a5d6..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordBufferPageMgr.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.recordbuffer;
-
-import static org.seaborne.dboe.base.recordbuffer.RecordBufferPage.* ;
-
-import java.nio.ByteBuffer;
-
-import org.seaborne.dboe.base.block.Block ;
-import org.seaborne.dboe.base.block.BlockMgr ;
-import org.seaborne.dboe.base.block.BlockType ;
-import org.seaborne.dboe.base.page.BlockConverter ;
-import org.seaborne.dboe.base.page.PageBlockMgr ;
-import org.seaborne.dboe.base.record.RecordException ;
-import org.seaborne.dboe.base.record.RecordFactory ;
-
-/** Manager for a block that is all records.
- * This must be compatible with B+Tree records nodes and with hash buckets.
- */
-
-final
-public class RecordBufferPageMgr extends PageBlockMgr<RecordBufferPage>
-{
- private final RecordFactory factory ;
-
- public RecordBufferPageMgr(RecordFactory factory, BlockMgr blockMgr) {
- super(new Block2RecordBufferPage(factory), blockMgr) ;
- this.factory = factory ;
- }
-
- public RecordFactory getRecordFactory() { return factory ; }
-
- public RecordBufferPage create() {
- return super.create(BlockType.RECORD_BLOCK) ;
- }
-
- public static class Block2RecordBufferPage implements BlockConverter<RecordBufferPage> {
- private RecordFactory factory ;
-
- public Block2RecordBufferPage(RecordFactory factory) {
- this.factory = factory ;
- }
-
- @Override
- public RecordBufferPage createFromBlock(Block block, BlockType blkType) {
- if ( blkType != BlockType.RECORD_BLOCK )
- throw new RecordException("Not RECORD_BLOCK: " + blkType) ;
- // Initially empty
- RecordBufferPage rb = RecordBufferPage.createBlank(block, factory) ;
- return rb ;
- }
-
- @Override
- public RecordBufferPage fromBlock(Block block) {
- synchronized (block) // [[TxTDB:TODO] needed? Right place?
- {
- RecordBufferPage rb = RecordBufferPage.format(block, factory) ;
- // int count = block.getByteBuffer().getInt(COUNT) ;
- // int linkId = block.getByteBuffer().getInt(LINK) ;
- // RecordBufferPage rb = new RecordBufferPage(block, linkId,
- // factory, count) ;
- return rb ;
- }
- }
-
- @Override
- public Block toBlock(RecordBufferPage rbp) {
- int count = rbp.getRecordBuffer().size() ;
- ByteBuffer bb = rbp.getBackingBlock().getByteBuffer() ;
- bb.putInt(COUNT, rbp.getCount()) ;
- bb.putInt(LINK, rbp.getLink()) ;
- return rbp.getBackingBlock() ;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordRangeIterator.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordRangeIterator.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordRangeIterator.java
deleted file mode 100644
index 0ec19c3..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/base/recordbuffer/RecordRangeIterator.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.base.recordbuffer;
-
-import static org.apache.jena.atlas.lib.Alg.decodeIndex ;
-
-import java.util.Iterator ;
-import java.util.NoSuchElementException ;
-
-import org.apache.jena.atlas.lib.Bytes ;
-import org.apache.jena.atlas.lib.Closeable ;
-import org.seaborne.dboe.base.StorageException ;
-import org.seaborne.dboe.base.block.BlockException ;
-import org.seaborne.dboe.base.record.Record ;
-import org.seaborne.dboe.base.record.RecordMapper ;
-
-final public
-class RecordRangeIterator<X> implements Iterator<X>, Closeable
-{
- /** Iterate over a range of fromRec (inclusive) to toRec (exclusive) */
- public static <X> Iterator<X> iterator(int pageId, Record fromRec, Record toRec, RecordBufferPageMgr pageMgr, RecordMapper<X> mapper)
- {
- if ( ! pageMgr.valid(pageId) ) {
- String msg = "RecordRangeIterator.iterator -- No such block (pageId="+pageId+", fromRec="+fromRec+", toRec="+toRec+ ")" ;
-// System.err.println(msg) ;
-// System.exit(0) ;
- throw new BlockException(msg) ;
- }
- return new RecordRangeIterator<>(pageId, fromRec, toRec, pageMgr, mapper) ;
- }
-
- private final RecordMapper<X> mapper ;
-
- private RecordBufferPage currentPage ; // Set null when finished.
-
- private int currentIdx ;
- private final RecordBufferPageMgr pageMgr ;
- private final Record maxRec ;
- private final Record minRec ;
-
- private X slot = null ;
- private final byte[] keySlot ;
-
- private long countRecords = 0 ;
- private long countBlocks = 0 ;
-
- private RecordRangeIterator(int id, Record fromRec, Record toRec, RecordBufferPageMgr pageMgr, RecordMapper<X> mapper) {
- currentIdx = 0 ;
- this.pageMgr = pageMgr;
- this.minRec = fromRec ;
- this.maxRec = toRec ;
- this.mapper = mapper ;
- this.keySlot = new byte[pageMgr.getRecordFactory().keyLength()] ;
-
- if ( toRec != null && fromRec != null && Record.keyLE(toRec, fromRec) ) {
- currentPage = null ;
- return ;
- }
-
- pageMgr.startRead();
- currentPage = pageMgr.getRead(id) ;
-
- if ( currentPage.getCount() == 0 ) {
- // Empty page.
- close() ;
- return ;
- }
-
- if ( fromRec != null ) {
- currentIdx = currentPage.getRecordBuffer().find(fromRec) ;
- if ( currentIdx < 0 )
- currentIdx = decodeIndex(currentIdx) ;
- }
- }
-
- @Override
- public boolean hasNext() {
- if ( slot != null )
- return true ;
- if ( currentPage == null )
- return false ;
- // Set slot.
- while (currentIdx >= currentPage.getCount()) {
- // Move to next.
- int link = currentPage.getLink() ;
- if ( link < 0 ) {
- close() ;
- return false ;
- }
-
- if ( currentPage != null )
- pageMgr.release(currentPage) ;
-
- RecordBufferPage nextPage = pageMgr.getRead(link) ;
- // Check currentPage -> nextPage is strictly increasing keys.
- if ( false ) {
- Record r1 = currentPage.getRecordBuffer().getHigh() ;
- Record r2 = nextPage.getRecordBuffer().getLow() ;
- if ( Record.keyGE(r1, r2) )
- throw new StorageException("RecordRangeIterator: records not strictly increasing: " + r1 + " // " + r2) ;
- }
- currentPage = nextPage ;
- countBlocks++ ;
- currentIdx = 0 ;
- }
-
- slot = currentPage.getRecordBuffer().access(currentIdx, keySlot, mapper) ;
- currentIdx++ ;
-
- if ( maxRec != null && Bytes.compare(keySlot, maxRec.getKey()) >= 0 ) {
- close() ;
- return false ;
- }
-
- if ( slot == null ) {
- close() ;
- return false ;
- }
- countRecords++ ;
- return true ;
- }
-
- @Override
- public void close() {
- if ( currentPage == null )
- return ;
- pageMgr.release(currentPage) ;
- pageMgr.finishRead();
- currentPage = null ;
- currentIdx = -99 ;
- slot = null ;
- }
-
- @Override
- public X next() {
- if ( !hasNext() )
- throw new NoSuchElementException() ;
- X x = slot ;
- slot = null ;
- return x ;
- }
-
- final public long getCountRecords() { return countRecords ; }
-
- final public long getCountBlocks() { return countBlocks ; }
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/3d456654/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/jenax/Txn.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/jenax/Txn.java b/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/jenax/Txn.java
deleted file mode 100644
index c91438b..0000000
--- a/jena-db/jena-dboe-base/src/main/java/org/seaborne/dboe/jenax/Txn.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you 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.seaborne.dboe.jenax;
-
-import java.util.function.Supplier ;
-
-import org.apache.jena.sparql.core.Transactional ;
-
-/** Indirection to allow for modification for TDB2 capabilities */
-public class Txn {
- public static <T extends Transactional> void executeRead(T txn, Runnable r) {
- org.apache.jena.system.Txn.executeRead(txn, r);
- }
-
- public static <T extends Transactional, X> X calculateRead(T txn, Supplier<X> r) {
- return org.apache.jena.system.Txn.calculateRead(txn, r);
- }
-
- public static <T extends Transactional> void executeWrite(T txn, Runnable r) {
- org.apache.jena.system.Txn.executeWrite(txn, r);
- }
-
- public static <T extends Transactional, X> X calculateWrite(T txn, Supplier<X> r) {
- return org.apache.jena.system.Txn.calculateWrite(txn, r);
- }
-}