package org.archive.format.arc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; public class FiledescRecordParser { public boolean strict = false; public FiledescRecord parse(InputStream is) throws IOException { FiledescRecord rec = new FiledescRecord(); try { // TODO: count input bytes read... BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8")); String line = br.readLine(); parseLine1(rec,line); line = br.readLine(); if(line == null) { if(strict) { throw new IOException("No format line"); } rec.setFormat("Unknown"); } else { rec.setFormat(line); } // TODO: only parse metadata if format 1.1? line = br.readLine(); while(line != null) { addMetaDataLine(rec,line); line = br.readLine(); } } catch(UnsupportedEncodingException e) { // nope } return rec; } private void addMetaDataLine(FiledescRecord rec, String metaLine) { if(metaLine.startsWith("<")) { int endOfTag = metaLine.indexOf('>'); if(endOfTag > 0) { String name = metaLine.substring(1,endOfTag); String tail = "</"+name+">"; if(metaLine.endsWith(tail)) { // looks good: int nameLength = name.length(); int wrapperLength = (nameLength * 2) + 5; int valueLength = metaLine.length() - wrapperLength; if(valueLength > 0) { String value = metaLine.substring(nameLength + 2, nameLength + valueLength + 2); rec.addMetaData(name,value); } } } } } private void parseLine1(FiledescRecord rec, String line1) throws IOException { if(line1 == null) { if(strict) { throw new IOException("Empty filedesc record"); } rec.setMajorVersion(0); rec.setMinorVersion(0); rec.setOrganization("Unknown"); return; } String parts[] = line1.split(" "); if(parts.length < 3) { //hrm... if(strict) { throw new IOException("Bad Filedesc line 1:"+line1); } rec.setOrganization(line1); if(parts.length < 2) { rec.setMinorVersion(0); } else { rec.setMinorVersion(parseIntOrVal(parts[1],0)); } if(parts.length < 1) { rec.setMajorVersion(0); } else { rec.setMajorVersion(parseIntOrVal(parts[0],0)); } } else { if(parts.length == 3) { rec.setOrganization(parts[2]); } else { StringBuilder sb = new StringBuilder(line1.length()); for(int i = 2; i < parts.length; i++) { if(i > 2) { sb.append(" "); } sb.append(parts[i]); rec.setOrganization(sb.toString()); } } rec.setMajorVersion(parseIntOrVal(parts[0],0)); rec.setMinorVersion(parseIntOrVal(parts[1],0)); } } private int parseIntOrVal(String string, int val) { try { return Integer.parseInt(string); } catch (NumberFormatException e) {} return val; } }