yacy_search_server/source/de/anomic/kelondro/kelondroColumn.java
orbiter 740d49751d * strict type and size check in kelondroRow handling
* adopted all code to use the declaration form of kelondroRow
* fixed a bug in kelondroRow which caused wrong parsing of encoding type
* the bug caused bad database behaviour in new indexCollection data structure.
  because of this bug, all test databases are now already void. A new database is created
* the kelondroFlexTable and indexCollection data structures now store a declaration of the row definition
  into a properties file along the database files.

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@2375 6c8d7289-2bf4-0310-a012-ef5d649a1542
2006-08-11 03:20:44 +00:00

256 lines
9.8 KiB
Java

// kelondroColumn.java
// (C) 2006 by Michael Peter Christen; mc@anomic.de, Frankfurt a. M., Germany
// first published 24.05.2006 on http://www.anomic.de
//
// This is a part of the kelondro database,
// which is a part of YaCy, a peer-to-peer based web search engine
//
// $LastChangedDate: 2006-04-02 22:40:07 +0200 (So, 02 Apr 2006) $
// $LastChangedRevision: 1986 $
// $LastChangedBy: orbiter $
//
// LICENSE
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package de.anomic.kelondro;
public class kelondroColumn {
public static final int celltype_undefined = 0;
public static final int celltype_boolean = 1;
public static final int celltype_binary = 2;
public static final int celltype_string = 3;
public static final int celltype_cardinal = 4;
public static final int encoder_none = 0;
public static final int encoder_b64e = 1;
public static final int encoder_b256 = 2;
public static final int encoder_bytes = 3;
private int celltype, cellwidth, encoder;
private String nickname, description;
public kelondroColumn(String nickname, int celltype, int encoder, int cellwidth, String description) {
this.celltype = celltype;
this.cellwidth = cellwidth;
this.encoder = encoder;
this.nickname = nickname;
this.description = description;
}
public kelondroColumn(String celldef) {
// define column with column syntax
// example: <UDate-3>
// cut quotes etc.
celldef = celldef.trim();
if (celldef.startsWith("<")) celldef = celldef.substring(1);
if (celldef.endsWith(">")) celldef = celldef.substring(0, celldef.length() - 1);
// parse type definition
int p = celldef.indexOf(' ');
String typename = "";
if (p < 0) {
// no typedef
this.celltype = celltype_undefined;
this.cellwidth = -1;
} else {
typename = celldef.substring(0, p);
celldef = celldef.substring(p + 1).trim();
if (typename.equals("boolean")) {
this.celltype = celltype_boolean;
this.cellwidth = 1;
} else if (typename.equals("byte")) {
this.celltype = celltype_cardinal;
this.cellwidth = 1;
} else if (typename.equals("short")) {
this.celltype = celltype_cardinal;
this.cellwidth = 2;
} else if (typename.equals("int")) {
this.celltype = celltype_cardinal;
this.cellwidth = 4;
} else if (typename.equals("long")) {
this.celltype = celltype_cardinal;
this.cellwidth = 8;
} else if (typename.equals("byte[]")) {
this.celltype = celltype_binary;
this.cellwidth = -1; // yet undefined
} else if (typename.equals("char")) {
this.celltype = celltype_string;
this.cellwidth = 1;
} else if (typename.equals("String")) {
this.celltype = celltype_string;
this.cellwidth = -1; // yet undefined
} else if (typename.equals("Cardinal")) {
this.celltype = celltype_cardinal;
this.cellwidth = -1; // yet undefined
} else {
throw new kelondroException("kelondroColumn - undefined type def '" + typename + "'");
}
}
// parse length
p = celldef.indexOf('-');
if (p < 0) {
// if the cell was defined with a type, we dont need to give an explicit with definition
if (this.cellwidth < 0) throw new kelondroException("kelondroColumn - no cell width definition given");
int q = celldef.indexOf(' ');
if (q < 0) {
this.nickname = celldef;
celldef = "";
} else {
this.nickname = celldef.substring(0, p);
celldef = celldef.substring(q + 1);
}
} else {
this.nickname = celldef.substring(0, p);
int q = celldef.indexOf(' ');
if (q < 0) {
try {
this.cellwidth = Integer.parseInt(celldef.substring(p + 1));
} catch (NumberFormatException e) {
throw new kelondroException("kelondroColumn - cellwidth description wrong:" + celldef.substring(p + 1));
}
celldef = "";
} else {
try {
this.cellwidth = Integer.parseInt(celldef.substring(p + 1, q));
} catch (NumberFormatException e) {
throw new kelondroException("kelondroColumn - cellwidth description wrong:" + celldef.substring(p + 1, q));
}
celldef = celldef.substring(q + 1);
}
}
// check length constraints
if (this.cellwidth < 0) throw new kelondroException("kelondroColumn - no cell width given for " + this.nickname);
if (((typename.equals("boolean")) && (this.cellwidth > 1)) ||
((typename.equals("byte")) && (this.cellwidth > 1)) ||
((typename.equals("short")) && (this.cellwidth > 2)) ||
((typename.equals("int")) && (this.cellwidth > 4)) ||
((typename.equals("long")) && (this.cellwidth > 8)) ||
((typename.equals("char")) && (this.cellwidth > 1))
) throw new kelondroException("kelondroColumn - cell width " + this.cellwidth + " too wide for type " + typename);
if (((typename.equals("short")) && (this.cellwidth <= 1)) ||
((typename.equals("int")) && (this.cellwidth <= 2)) ||
((typename.equals("long")) && (this.cellwidth <= 4))
) throw new kelondroException("kelondroColumn - cell width " + this.cellwidth + " not appropriate for type " + typename);
// parse/check encoder type
if ((celldef.length() > 0) && (celldef.charAt(0) == '{')) {
p = celldef.indexOf('}');
String expf = celldef.substring(1, p);
celldef = celldef.substring(p + 1).trim();
if (expf.equals("b64e")) this.encoder = encoder_b64e;
else if (expf.equals("b256")) this.encoder = encoder_b256;
else if (expf.equals("bytes")) this.encoder = encoder_bytes;
else {
if (this.celltype == celltype_undefined) this.encoder = encoder_bytes;
else if (this.celltype == celltype_boolean) this.encoder = encoder_bytes;
else if (this.celltype == celltype_binary) this.encoder = encoder_bytes;
else if (this.celltype == celltype_string) this.encoder = encoder_bytes;
else if (this.celltype == celltype_cardinal) throw new kelondroException("kelondroColumn - encoder missing for cell " + this.nickname);
}
} else {
if (this.celltype == celltype_cardinal) throw new kelondroException("kelondroColumn - encoder missing for cell " + this.nickname);
this.encoder = encoder_bytes;
}
// parse/check description
if ((celldef.length() > 0) && (celldef.charAt(0) == '"')) {
p = celldef.indexOf('"', 1);
this.description = celldef.substring(1, p);
celldef = celldef.substring(p + 1).trim();
} else {
this.description = this.nickname;
}
}
public void setAttributes(String nickname, int celltype, int encoder) {
this.celltype = celltype;
this.encoder = encoder;
this.nickname = nickname;
}
public int celltype() {
return this.celltype;
}
public int cellwidth() {
return this.cellwidth;
}
public int encoder() {
return this.encoder;
}
public String nickname() {
return this.nickname;
}
public String description() {
return this.description;
}
public String toString() {
StringBuffer s = new StringBuffer();
switch (celltype) {
case celltype_boolean:
s.append("boolean ");
s.append(nickname);
break;
case celltype_binary:
s.append("byte[] ");
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
case celltype_string:
s.append("String ");
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
case celltype_cardinal:
s.append("Cardinal ");
s.append(nickname);
s.append('-');
s.append(cellwidth);
break;
}
switch (encoder) {
case encoder_b64e:
s.append(" {b64e}");
break;
case encoder_b256:
s.append(" {b256}");
break;
}
return new String(s);
}
public boolean equals(kelondroColumn otherCol) {
return
(this.celltype == otherCol.celltype) &&
(this.cellwidth == otherCol.cellwidth) &&
(this.encoder == otherCol.encoder) &&
(this.nickname.equals(otherCol.nickname));
}
}