package org.compass.core.config.binding; import java.io.InputStream; import org.compass.core.config.CompassSettings; import org.compass.core.config.ConfigurationException; import org.compass.core.config.binding.metadata.ClassMetaData; import org.compass.core.config.binding.metadata.MetaDataReader; import org.compass.core.config.binding.metadata.MetaDataReaderFactory; import org.compass.core.mapping.MappingException; import org.compass.core.mapping.internal.InternalCompassMapping; import org.compass.core.metadata.CompassMetaData; import org.compass.core.util.ClassUtils; /** * @author kimchy */ public abstract class AbstractClassMetaDataMappingBinding extends AbstractInputStreamMappingBinding { private MetaDataReader metaDataReader; public void setUpBinding(InternalCompassMapping mapping, CompassMetaData metaData, CompassSettings settings) { super.setUpBinding(mapping, metaData, settings); metaDataReader = MetaDataReaderFactory.getMetaDataReader(settings); if (metaDataReader == null) { log.debug("No meta data reader found, automatic detection is disabled"); } } protected boolean doAddInputStream(InputStream is, String resourceName) throws ConfigurationException, MappingException { if (metaDataReader == null) { return false; } ClassMetaData classMetaData = metaDataReader.getClassMetaData(is, resourceName); if (!isApplicable(classMetaData)) { return false; } try { addClass(ClassUtils.forName(classMetaData.getClassName(), settings.getClassLoader())); } catch (ClassNotFoundException e) { throw new MappingException("Failed to find class [" + classMetaData.getClassName() + "]", e); } return true; } protected abstract boolean isApplicable(ClassMetaData classMetaData); public String[] getSuffixes() { return new String[] {".class"}; } }