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

org.openscience.cdk.debug.DebugChemObjectBuilder Maven / Gradle / Ivy

There is a newer version: 2.10
Show newest version
/* Copyright (C) 2010  Egon Willighagen 
 *               2012  John May 
 *
 * Contact: [email protected]
 *
 * 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.
 *
 * 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.debug;

import org.openscience.cdk.DynamicFactory;
import org.openscience.cdk.interfaces.IAdductFormula;
import org.openscience.cdk.interfaces.IAminoAcid;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IAtomContainerSet;
import org.openscience.cdk.interfaces.IAtomType;
import org.openscience.cdk.interfaces.IBioPolymer;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.ICDKObject;
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.IChemSequence;
import org.openscience.cdk.interfaces.ICrystal;
import org.openscience.cdk.interfaces.IDoubleBondStereochemistry;
import org.openscience.cdk.interfaces.IElectronContainer;
import org.openscience.cdk.interfaces.IElement;
import org.openscience.cdk.interfaces.IFragmentAtom;
import org.openscience.cdk.interfaces.IIsotope;
import org.openscience.cdk.interfaces.ILonePair;
import org.openscience.cdk.interfaces.IMapping;
import org.openscience.cdk.interfaces.IMolecularFormula;
import org.openscience.cdk.interfaces.IMolecularFormulaSet;
import org.openscience.cdk.interfaces.IMonomer;
import org.openscience.cdk.interfaces.IPDBAtom;
import org.openscience.cdk.interfaces.IPDBMonomer;
import org.openscience.cdk.interfaces.IPDBPolymer;
import org.openscience.cdk.interfaces.IPDBStructure;
import org.openscience.cdk.interfaces.IPolymer;
import org.openscience.cdk.interfaces.IPseudoAtom;
import org.openscience.cdk.interfaces.IReaction;
import org.openscience.cdk.interfaces.IReactionScheme;
import org.openscience.cdk.interfaces.IReactionSet;
import org.openscience.cdk.interfaces.IRing;
import org.openscience.cdk.interfaces.IRingSet;
import org.openscience.cdk.interfaces.ISingleElectron;
import org.openscience.cdk.interfaces.IStrand;
import org.openscience.cdk.interfaces.ISubstance;
import org.openscience.cdk.interfaces.ITetrahedralChirality;
import org.openscience.cdk.stereo.DoubleBondStereochemistry;
import org.openscience.cdk.stereo.TetrahedralChirality;

/**
 * A helper class to instantiate a {@link IChemObject} for the original CDK
 * implementation. The factory create debug objects which will log their
 * behaviour when used.
 *
 * 

*

{@code
 *     IChemObjectBuilder builder = DebugChemObjectBuilder.getInstance();
 *
 *     IAtom a = builder.newInstance(IAtom.class);
 *     IAtom c12 = builder.newInstance(IAtom.class, "C");
 *     IAtom c13 = builder.newInstance(IAtom.class,
 *                                     builder.newInstance(IIsotope.class,
 *                                                         "C", 13));
 * }
* * * @author egonw * @author john may * @cdk.module datadebug * @cdk.githash */ public class DebugChemObjectBuilder implements IChemObjectBuilder { private static volatile IChemObjectBuilder instance = null; private static final Object LOCK = new Object(); private final DynamicFactory factory = new DynamicFactory(200); private DebugChemObjectBuilder() { // self reference required for stereo-elements final IChemObjectBuilder self = this; // elements factory.register(IAtom.class, DebugAtom.class); factory.register(IPseudoAtom.class, DebugPseudoAtom.class); factory.register(IElement.class, DebugElement.class); factory.register(IAtomType.class, DebugAtomType.class); factory.register(IFragmentAtom.class, DebugFragmentAtom.class); factory.register(IPDBAtom.class, DebugPDBAtom.class); factory.register(IIsotope.class, DebugIsotope.class); // electron containers factory.register(IBond.class, DebugBond.class); factory.register(IElectronContainer.class, DebugElectronContainer.class); factory.register(ISingleElectron.class, DebugSingleElectron.class); factory.register(ILonePair.class, DebugLonePair.class); // atom containers factory.register(IAtomContainer.class, DebugAtomContainer.class); factory.register(IRing.class, DebugRing.class); factory.register(ICrystal.class, DebugCrystal.class); factory.register(IPolymer.class, DebugPolymer.class); factory.register(IPDBPolymer.class, DebugPDBPolymer.class); factory.register(IMonomer.class, DebugMonomer.class); factory.register(IPDBMonomer.class, DebugPDBMonomer.class); factory.register(IBioPolymer.class, DebugBioPolymer.class); factory.register(IPDBStructure.class, DebugPDBStructure.class); factory.register(IAminoAcid.class, DebugAminoAcid.class); factory.register(IStrand.class, DebugStrand.class); // reactions factory.register(IReaction.class, DebugReaction.class); factory.register(IReactionScheme.class, DebugReactionScheme.class); // formula factory.register(IMolecularFormula.class, DebugMolecularFormula.class); factory.register(IAdductFormula.class, DebugAdductFormula.class); // chem object sets factory.register(IAtomContainerSet.class, DebugAtomContainerSet.class); factory.register(IMolecularFormulaSet.class, DebugMolecularFormulaSet.class); factory.register(IReactionSet.class, DebugReactionSet.class); factory.register(IRingSet.class, DebugRingSet.class); factory.register(IChemModel.class, DebugChemModel.class); factory.register(IChemFile.class, DebugChemFile.class); factory.register(IChemSequence.class, DebugChemSequence.class); factory.register(ISubstance.class, DebugSubstance.class); // stereo components (requires some modification after instantiation) factory.register(ITetrahedralChirality.class, TetrahedralChirality.class, new DynamicFactory.CreationModifier() { @Override public void modify(TetrahedralChirality instance) { instance.setBuilder(self); } }); factory.register(IDoubleBondStereochemistry.class, DoubleBondStereochemistry.class, new DynamicFactory.CreationModifier() { @Override public void modify(DoubleBondStereochemistry instance) { instance.setBuilder(self); } }); // miscellaneous factory.register(IMapping.class, DebugMapping.class); factory.register(IChemObject.class, DebugChemObject.class); } /** * Access the singleton instance of this DebugChemObjectBuilder.

*

{@code
     *
     * // get the builder instance
     * IChemObjectBuilder builder = DebugChemObjectBuilder.getInstance();
     *
     * // using the builder...
     * // create an IAtom using the default constructor
     * IAtom atom = builder.newInstance(IAtom.class);
     *
     * // create a carbon atom
     * IAtom c1 = builder.newInstance(IAtom.class, "C");
     * }
* * @return a DebugChemObjectBuilder instance */ public static IChemObjectBuilder getInstance() { IChemObjectBuilder result = instance; if (result == null) { result = instance; synchronized (LOCK) { if (result == null) { instance = result = new DebugChemObjectBuilder(); } } } return result; } /** * @inheritDoc */ @Override public T newInstance(Class clazz, Object... params) { return factory.ofClass(clazz, params); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy