All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.rcsb.cif.schema.DelegatingCifFile Maven / Gradle / Ivy

package org.rcsb.cif.schema;

import org.rcsb.cif.model.Block;
import org.rcsb.cif.model.CifFile;

import java.util.List;
import java.util.stream.Collectors;

/**
 * The schema is implemented by wrapping a {@link CifFile} and all block, category, and column data therein in dedicated
 * classes that provide the schema (category names, column names, and column types) defined by some dictionary.
 *
 * 

The implementation achieves this behavior by reimplementing all model interfaces ({@link CifFile}, {@link Block}, * {@link org.rcsb.cif.model.Category}, {@link org.rcsb.cif.model.Column}) using a delegating approach. Each * schema-supporting wraps a schema-unaware instance of the original data. Schemata subclass all model instances and * are than able to enumerate all child nodes in the data model and provide appropriate types by additional * schema-specific code. Code is generated by {@link org.rcsb.cif.schema.generator.SchemaGenerator} from dictionary files. * @param the type of Block instances according to this schema */ public abstract class DelegatingCifFile implements CifFile { protected final CifFile delegate; private final List blocks; protected DelegatingCifFile(CifFile delegate) { this.delegate = delegate; this.blocks = delegate.getBlocks() .stream() .map(this::getTypedBlock) .collect(Collectors.toList()); } @Override public List getBlocks() { return blocks; } /** * Convenience function to give access to all data in this file. {@link CifFile} does not provide this functionality * to give users a subtle indication whether a schema is in place or the model is accessed in the generic, * 'low-level' mode. * @return the typed block that wraps all data of this file */ public B getFirstBlock() { return blocks.get(0); } protected abstract B getTypedBlock(Block block); }