001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.corba.transaction;
018
019 import org.omg.CORBA.Any;
020 import org.omg.CORBA.BAD_PARAM;
021 import org.omg.CORBA.INTERNAL;
022 import org.omg.CORBA.SystemException;
023 import org.omg.CosTransactions.PropagationContext;
024 import org.omg.CosTransactions.PropagationContextHelper;
025 import org.omg.IOP.Codec;
026 import org.omg.IOP.CodecPackage.FormatMismatch;
027 import org.omg.IOP.CodecPackage.TypeMismatch;
028 import org.omg.IOP.ServiceContext;
029 import org.omg.IOP.TransactionService;
030 import org.omg.PortableInterceptor.ServerRequestInfo;
031 import org.apache.geronimo.corba.util.Util;
032
033
034 /**
035 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
036 */
037 public abstract class AbstractServerTransactionPolicyConfig implements ServerTransactionPolicyConfig {
038
039 public void importTransaction(ServerRequestInfo serverRequestInfo) throws SystemException {
040 ServiceContext serviceContext = null;
041 try {
042 serviceContext = serverRequestInfo.get_request_service_context(TransactionService.value);
043 } catch (BAD_PARAM e) {
044 // do nothing
045 }
046 PropagationContext propagationContext;
047 if (serviceContext == null) {
048 propagationContext = null;
049 } else {
050 byte[] encoded = serviceContext.context_data;
051 Codec codec = Util.getCodec();
052 Any any;
053 try {
054 any = codec.decode_value(encoded, PropagationContextHelper.type());
055 } catch (FormatMismatch formatMismatch) {
056 throw (INTERNAL) new INTERNAL("Could not decode encoded propagation context").initCause(formatMismatch);
057 } catch (TypeMismatch typeMismatch) {
058 throw (INTERNAL) new INTERNAL("Could not decode encoded propagation context").initCause(typeMismatch);
059 }
060 propagationContext = PropagationContextHelper.extract(any);
061 }
062 //figure out what method is being invoked
063 //operation name is unique... it contains the mangled operation name + arg types.
064 String operation = serverRequestInfo.operation();
065 importTransaction(operation, propagationContext);
066 }
067
068 protected abstract void importTransaction(String operation, PropagationContext propagationContext) throws SystemException;
069
070 }