/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* MetaMatrix, Inc - repackaging and updates for use as a metadata store
*******************************************************************************/
package org.teiid.designer.core.index;
import java.io.IOException;
import java.util.ArrayList;
import org.teiid.core.designer.util.StringUtilities;
/**
* @since 8.0
*/
public class FileListBlock extends Block {
protected int offset = 0;
protected String prevPath = null;
protected String[] paths = null;
public FileListBlock( int blockSize ) {
super(blockSize);
}
/**
* add the name of the indexedfile to the buffr of the field. The name is not the entire name of the indexedfile, but the
* difference between its name and the name of the previous indexedfile ...
*/
public boolean addFile( IndexedFile indexedFile ) {
int offset = this.offset;
if (isEmpty()) {
field.putInt4(offset, indexedFile.getFileNumber());
offset += 4;
}
String path = indexedFile.getPath();
int prefixLen = prevPath == null ? 0 : StringUtilities.prefixLength(prevPath, path);
int sizeEstimate = 2 + 2 + (path.length() - prefixLen) * 3;
if (offset + sizeEstimate > blockSize - 2)
return false;
field.putInt2(offset, prefixLen);
offset += 2;
char[] chars = new char[path.length() - prefixLen];
path.getChars(prefixLen, path.length(), chars, 0);
offset += field.putUTF(offset, chars);
this.offset = offset;
prevPath = path;
return true;
}
@Override
public void clear() {
reset();
super.clear();
}
@Override
public void flush() {
if (offset > 0) {
field.putInt2(offset, 0);
field.putInt2(offset + 2, 0);
offset = 0;
}
}
public IndexedFile getFile( int fileNum ) {
IndexedFile resp = null;
try {
String[] paths = getPaths();
int i = fileNum - field.getInt4(0);
resp = new IndexedFile(paths[i], fileNum);
} catch (Exception e) {
// fileNum too big
}
return resp;
}
/**
* Creates a vector of paths reading the buffer of the field.
*/
protected String[] getPaths() throws IOException {
if (paths == null) {
ArrayList v = new ArrayList();
int offset = 4;
char[] prevPath = null;
for (;;) {
int prefixLen = field.getUInt2(offset);
offset += 2;
int utfLen = field.getUInt2(offset);
char[] path = field.getUTF(offset);
offset += 2 + utfLen;
if (prefixLen != 0) {
char[] temp = new char[prefixLen + path.length];
System.arraycopy(prevPath, 0, temp, 0, prefixLen);
System.arraycopy(path, 0, temp, prefixLen, path.length);
path = temp;
}
if (path.length == 0) break;
v.add(new String(path));
prevPath = path;
}
paths = new String[v.size()];
v.toArray(paths);
}
return paths;
}
public boolean isEmpty() {
return offset == 0;
}
public void reset() {
offset = 0;
prevPath = null;
}
}