/* $Revision:$
*
* Copyright (C) 2005-2008 Nina Jeliazkova <nina@acad.bg>
*
* Contact: cdk-devel@lists.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.openscience.cdk.io.random;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Iterator;
import org.openscience.cdk.annotations.TestMethod;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.interfaces.IChemFile;
import org.openscience.cdk.interfaces.IChemModel;
import org.openscience.cdk.interfaces.IChemObject;
import org.openscience.cdk.interfaces.IChemObjectBuilder;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.io.ISimpleChemObjectReader;
import org.openscience.cdk.io.MDLV2000Reader;
import org.openscience.cdk.io.formats.IResourceFormat;
import org.openscience.cdk.io.formats.MDLFormat;
import org.openscience.cdk.io.listener.IReaderListener;
/**
* Random access of SDF file. Doesn't load molecules in memory, uses prebuilt
* index and seeks to find the correct record offset.
*
* @author Nina Jeliazkova <nina@acad.bg>
* @cdk.module io
*/
public class RandomAccessSDFReader extends RandomAccessReader {
/**
* @param file
* @param builder
* @throws IOException
*/
public RandomAccessSDFReader(File file, IChemObjectBuilder builder)
throws IOException {
this(file, builder,null);
}
public RandomAccessSDFReader(File file, IChemObjectBuilder builder, IReaderListener listener)
throws IOException {
super(file, builder,listener);
}
@Override
public ISimpleChemObjectReader createChemObjectReader() {
return new MDLV2000Reader();
}
protected boolean isRecordEnd(String line) {
return line.equals("$$$$");
}
/* (non-Javadoc)
* @see org.openscience.cdk.io.IChemObjectIO#getFormat()
*/
@TestMethod("testGetFormat")
public IResourceFormat getFormat() {
return MDLFormat.getInstance();
}
protected IChemObject processContent() throws CDKException {
/*
return chemObjectReader.read(builder.newMolecule());
*/
//read(IMolecule) doesn't read properties ...
IChemObject co = chemObjectReader.read(builder.newChemFile());
if (co instanceof IChemFile) {
int c = ((IChemFile) co).getChemSequenceCount();
for (int i=0; i <c;i++) {
Iterator cm = ((IChemFile) co).getChemSequence(i).chemModels().iterator();
while (cm.hasNext()) {
Iterator sm = ((IChemModel)cm.next()).getMoleculeSet().molecules().iterator();
while (sm.hasNext()) {
co = (IMolecule) sm.next();
break;
}
break;
}
cm = null;
break;
}
//cs = null;
}
return co;
}
@TestMethod("testSetReader_Reader")
public void setReader(Reader reader) throws CDKException {
throw new UnsupportedOperationException();
}
@TestMethod("testSetReader_InputStream")
public void setReader(InputStream reader) throws CDKException {
throw new UnsupportedOperationException();
}
@TestMethod("testAccepts")
public boolean accepts(Class classObject) {
return chemObjectReader.accepts(classObject);
}
public void remove() {
throw new UnsupportedOperationException("Cannot remove entries with " +
"the RandomAccessSDFReader");
}
}