001package org.granite.messaging.jmf.codec.std.impl;
002
003import java.io.IOException;
004import java.lang.reflect.InvocationTargetException;
005
006import org.granite.messaging.jmf.DumpContext;
007import org.granite.messaging.jmf.InputContext;
008import org.granite.messaging.jmf.OutputContext;
009import org.granite.messaging.jmf.codec.std.ClassCodec;
010
011public class ClassCodecImpl extends AbstractIntegerStringCodec<Object> implements ClassCodec {
012
013        protected static final StringTypeHandler TYPE_HANDLER = new StringTypeHandler() {
014
015                public int type(IntegerComponents ics, boolean reference) {
016                        return (reference ? (0x40 | (ics.length << 4) | JMF_CLASS) : ((ics.length << 4) | JMF_CLASS));
017                }
018
019                public int indexOrLengthBytesCount(int parameterizedJmfType) {
020                        return (parameterizedJmfType >> 4) & 0x03;
021                }
022
023                public boolean isReference(int parameterizedJmfType) {
024                        return (parameterizedJmfType & 0x40) != 0;
025                }
026        };
027
028        public int getObjectType() {
029                return JMF_CLASS;
030        }
031
032        public boolean canEncode(Object v) {
033                return (v instanceof Class);
034        }
035
036        public void encode(OutputContext ctx, Object v) throws IOException, IllegalAccessException {
037                writeString(ctx, ctx.getAlias(((Class<?>)v).getName()), TYPE_HANDLER);
038        }
039
040        public Object decode(InputContext ctx, int parameterizedJmfType)
041                        throws IOException, ClassNotFoundException, InstantiationException,
042                        IllegalAccessException, InvocationTargetException,
043                        SecurityException, NoSuchMethodException {
044                int jmfType = ctx.getSharedContext().getCodecRegistry().extractJmfType(parameterizedJmfType);
045                
046                if (jmfType != JMF_CLASS)
047                        throw newBadTypeJMFEncodingException(jmfType, parameterizedJmfType);
048                
049                String className = readString(ctx, parameterizedJmfType, TYPE_HANDLER);
050                className = ctx.getAlias(className);
051                return ctx.getReflection().loadClass(className);
052        }
053
054        public void dump(DumpContext ctx, int parameterizedJmfType) throws IOException {
055                int jmfType = ctx.getSharedContext().getCodecRegistry().extractJmfType(parameterizedJmfType);
056                
057                if (jmfType != JMF_CLASS)
058                        throw newBadTypeJMFEncodingException(jmfType, parameterizedJmfType);
059                
060                String className = readString(ctx, parameterizedJmfType, TYPE_HANDLER);
061                className = ctx.getAlias(className);
062                ctx.indentPrintLn(Class.class.getName() + ": " + className + ".class");
063        }
064}