package org.fosstrak.ale.server.readers; import org.apache.log4j.Logger; import org.fosstrak.ale.exception.ImplementationException; import org.fosstrak.ale.xsd.ale.epcglobal.LRProperty; import org.fosstrak.ale.xsd.ale.epcglobal.LRSpec; /** * Factory creating logical readers. * * @author swieland * */ public class LogicalReaderFactory { /** logger. */ private static final Logger log = Logger.getLogger(LogicalReaderFactory.class); private LogicalReaderFactory() { } private static LogicalReader createCompositeReader(String name, LRSpec spec) throws ImplementationException { return new CompositeReader(); } private static LogicalReader createBaseReader(String name, LRSpec spec) throws ImplementationException { LogicalReader logicalReader; try { // get the reader type of the reader String readerType = null; for (LRProperty property : spec.getProperties().getProperty()) { if (LogicalReader.PROPERTY_READER_TYPE.equalsIgnoreCase(property.getName())) { readerType = property.getValue(); } } if (readerType == null) { log.debug("Property " + LogicalReader.PROPERTY_READER_TYPE + " not defined - aborting"); throw new ImplementationException("Property " + LogicalReader.PROPERTY_READER_TYPE + " not defined"); } Class<?> cls = Class.forName(readerType); Object result = cls.newInstance(); if (result instanceof LogicalReader) { logicalReader = (LogicalReader) result; return logicalReader; } else { log.debug("constructor resulted in wrong type - aborting: " + result.getClass().getCanonicalName()); throw new ClassCastException("constructor resulted in wrong type"); } } catch (Throwable e) { log.error("could not dynamically reflect the reader type", e); throw new ImplementationException("could not dynamically reflect the reader type", e); } } private static boolean isCompositeReader(LRSpec spec) throws ImplementationException { if (null == spec) { log.debug("spec is null - aborting"); throw new ImplementationException("spec is null"); } return spec.isIsComposite(); } /** * factory method to create a new reader. this can be a CompositeReader or a BaseReader. * @param name name of the reader * @param spec the specificationFile for a Reader * @param logicalReaderManager handle to the logical reader manager * @return a logical reader * @throws ImplementationException when the LogicalReader could not be built by reflection */ public static LogicalReader createReader(String name, LRSpec spec, LogicalReaderManager logicalReaderManager) throws ImplementationException { // first test if reader is already in the LogicalReaderManager LogicalReader logicalReader = logicalReaderManager.getLogicalReader(name); if (logicalReader != null) { log.debug("using already defined reader."); return logicalReader; } // determine whether composite or basereader if (isCompositeReader(spec)) { log.debug("creating composite reader"); logicalReader = createCompositeReader(name, spec); } else { log.debug("creating base reader"); logicalReader = createBaseReader(name, spec); } logicalReader.setLRSpec(spec); logicalReader.setLogicalReaderManager(logicalReaderManager); logicalReader.initialize(name, spec); return logicalReader; } }