/******************************************************************************* * Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University * as Operator of the SLAC National Accelerator Laboratory. * Copyright (c) 2011 Brookhaven National Laboratory. * EPICS archiver appliance is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. *******************************************************************************/ package edu.stanford.slac.archiverappliance.PB.data; import java.lang.reflect.Constructor; import java.util.HashMap; import org.apache.log4j.Logger; import org.epics.archiverappliance.ByteArray; import org.epics.archiverappliance.config.ArchDBRTypes; import org.epics.archiverappliance.data.DBRTimeEvent; /** * Maps ArchDBRTypes to PB classes. * This functions much like a methodtable. * @author mshankar * */ public class DBR2PBTypeMapping { private static Logger logger = Logger.getLogger(DBR2PBTypeMapping.class.getName()); private static HashMap<ArchDBRTypes, DBR2PBTypeMapping> typemap = new HashMap<ArchDBRTypes, DBR2PBTypeMapping>(); static { typemap.put(ArchDBRTypes.DBR_SCALAR_STRING, new DBR2PBTypeMapping(PBScalarString.class)); typemap.put(ArchDBRTypes.DBR_SCALAR_SHORT, new DBR2PBTypeMapping(PBScalarShort.class)); typemap.put(ArchDBRTypes.DBR_SCALAR_FLOAT, new DBR2PBTypeMapping(PBScalarFloat.class)); typemap.put(ArchDBRTypes.DBR_SCALAR_ENUM, new DBR2PBTypeMapping(PBScalarEnum.class)); typemap.put(ArchDBRTypes.DBR_SCALAR_BYTE, new DBR2PBTypeMapping(PBScalarByte.class)); typemap.put(ArchDBRTypes.DBR_SCALAR_INT, new DBR2PBTypeMapping(PBScalarInt.class)); typemap.put(ArchDBRTypes.DBR_SCALAR_DOUBLE, new DBR2PBTypeMapping(PBScalarDouble.class)); typemap.put(ArchDBRTypes.DBR_WAVEFORM_STRING, new DBR2PBTypeMapping(PBVectorString.class)); typemap.put(ArchDBRTypes.DBR_WAVEFORM_SHORT, new DBR2PBTypeMapping(PBVectorShort.class)); typemap.put(ArchDBRTypes.DBR_WAVEFORM_FLOAT, new DBR2PBTypeMapping(PBVectorFloat.class)); typemap.put(ArchDBRTypes.DBR_WAVEFORM_ENUM, new DBR2PBTypeMapping(PBVectorEnum.class)); typemap.put(ArchDBRTypes.DBR_WAVEFORM_BYTE, new DBR2PBTypeMapping(PBVectorByte.class)); typemap.put(ArchDBRTypes.DBR_WAVEFORM_INT, new DBR2PBTypeMapping(PBVectorInt.class)); typemap.put(ArchDBRTypes.DBR_WAVEFORM_DOUBLE, new DBR2PBTypeMapping(PBVectorDouble.class)); typemap.put(ArchDBRTypes.DBR_V4_GENERIC_BYTES, new DBR2PBTypeMapping(PBV4GenericBytes.class)); for(ArchDBRTypes t : ArchDBRTypes.values()) { if(typemap.get(t) == null) { throw new RuntimeException("We have a type in DBR type that does have an equivalent PB type"); } } } public static DBR2PBTypeMapping getPBClassFor(ArchDBRTypes type) { return typemap.get(type); } Class<? extends DBRTimeEvent> pbclass; private Constructor<? extends DBRTimeEvent> unmarshallingFromByteArrayConstructor; private Constructor<? extends DBRTimeEvent> serializingConstructor; private DBR2PBTypeMapping(Class<? extends DBRTimeEvent> pblass) { this.pbclass = pblass; try { unmarshallingFromByteArrayConstructor = this.pbclass.getConstructor(Short.TYPE, ByteArray.class); } catch (Exception ex) { logger.error("Cannot get unmarshalling constructor from ByteArray for PB event for class " + pbclass.getName(), ex); throw new RuntimeException("Cannot get unmarshalling constructor from ByteArray for PB event for class " + pbclass.getName()); } try { serializingConstructor = this.pbclass.getConstructor(DBRTimeEvent.class); } catch (Exception ex) { logger.error("Cannot get serializing constructor for PB event for class " + pbclass.getName(), ex); throw new RuntimeException("Cannot get serializing constructor for PB event for class " + pbclass.getName()); } assert(unmarshallingFromByteArrayConstructor != null); assert(serializingConstructor != null); } public Constructor<? extends DBRTimeEvent> getSerializingConstructor() { return serializingConstructor; } public Constructor<? extends DBRTimeEvent> getUnmarshallingFromByteArrayConstructor() { return unmarshallingFromByteArrayConstructor; } }