CodecFactoryImpl.java revision 608:7e06bf1dcb09
1/* 2 * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.corba.se.impl.interceptors; 27 28import org.omg.IOP.Codec; 29import org.omg.IOP.CodecFactory; 30import org.omg.IOP.CodecFactoryPackage.UnknownEncoding; 31import org.omg.IOP.Encoding; 32import org.omg.IOP.ENCODING_CDR_ENCAPS; 33 34import com.sun.corba.se.spi.logging.CORBALogDomains; 35 36import com.sun.corba.se.impl.logging.ORBUtilSystemException; 37 38import org.omg.CORBA.ORB; 39import org.omg.CORBA.LocalObject; 40 41/** 42 * CodecFactoryImpl is the implementation of the Codec Factory, as described 43 * in orbos/99-12-02. 44 */ 45public final class CodecFactoryImpl 46 extends org.omg.CORBA.LocalObject 47 implements CodecFactory 48{ 49 // The ORB that created this Codec Factory 50 private ORB orb; 51 private ORBUtilSystemException wrapper ; 52 53 // The maximum minor version of GIOP supported by this codec factory. 54 // Currently, this is 1.2. 55 private static final int MAX_MINOR_VERSION_SUPPORTED = 2; 56 57 // The pre-created minor versions of Codec version 1.0, 1.1, ..., 58 // 1.(MAX_MINOR_VERSION_SUPPORTED) 59 private Codec codecs[] = new Codec[MAX_MINOR_VERSION_SUPPORTED + 1]; 60 61 /** 62 * Creates a new CodecFactory implementation. Stores the ORB that 63 * created this factory, for later use by the Codec. 64 */ 65 public CodecFactoryImpl( ORB orb ) { 66 this.orb = orb; 67 wrapper = ORBUtilSystemException.get( 68 (com.sun.corba.se.spi.orb.ORB)orb, 69 CORBALogDomains.RPC_PROTOCOL ) ; 70 71 // Precreate a codec for version 1.0 through 72 // 1.(MAX_MINOR_VERSION_SUPPORTED). This can be 73 // done since Codecs are immutable in their current implementation. 74 // This is an optimization that eliminates the overhead of creating 75 // a new Codec each time create_codec is called. 76 for( int minor = 0; minor <= MAX_MINOR_VERSION_SUPPORTED; minor++ ) { 77 codecs[minor] = new CDREncapsCodec( orb, 1, minor ); 78 } 79 } 80 81 /** 82 * Creates a codec of the given encoding. The only format recognized 83 * by this factory is ENCODING_CDR_ENCAPS, versions 1.0 through 84 * 1.(MAX_MINOR_VERSION_SUPPORTED). 85 * 86 * @exception UnknownEncoding Thrown if this factory cannot create a 87 * Codec of the given encoding. 88 */ 89 public Codec create_codec ( Encoding enc ) 90 throws UnknownEncoding 91 { 92 if( enc == null ) nullParam(); 93 94 Codec result = null; 95 96 // This is the only format we can currently create codecs for: 97 if( (enc.format == ENCODING_CDR_ENCAPS.value) && 98 (enc.major_version == 1) ) 99 { 100 if( (enc.minor_version >= 0) && 101 (enc.minor_version <= MAX_MINOR_VERSION_SUPPORTED) ) 102 { 103 result = codecs[enc.minor_version]; 104 } 105 } 106 107 if( result == null ) { 108 throw new UnknownEncoding(); 109 } 110 111 return result; 112 } 113 114 /** 115 * Called when an invalid null parameter was passed. Throws a 116 * BAD_PARAM with a minor code of 1 117 */ 118 private void nullParam() 119 { 120 throw wrapper.nullParam() ; 121 } 122} 123