/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.axis2.classloader; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import org.apache.axis2.Constants; import org.apache.axis2.context.MessageContext; import org.apache.axis2.description.AxisService; public class ThreadContextDescriptor { private ClassLoader oldClassLoader; private MessageContext oldMessageContext; public ClassLoader getOldClassLoader() { return oldClassLoader; } public void setOldClassLoader(ClassLoader oldClassLoader) { this.oldClassLoader = oldClassLoader; } public MessageContext getOldMessageContext() { return oldMessageContext; } public void setOldMessageContext(MessageContext oldMessageContext) { this.oldMessageContext = oldMessageContext; } public static ThreadContextDescriptor setThreadContext(final AxisService service) { ThreadContextDescriptor tc = new ThreadContextDescriptor(); tc.oldMessageContext = (MessageContext) MessageContext.currentMessageContext.get(); final ClassLoader contextClassLoader = getContextClassLoader_doPriv(); tc.oldClassLoader = contextClassLoader; String serviceTCCL = (String) service.getParameterValue(Constants.SERVICE_TCCL); if (serviceTCCL != null) { serviceTCCL = serviceTCCL.trim().toLowerCase(); if (serviceTCCL.equals(Constants.TCCL_COMPOSITE)) { final ClassLoader loader = (ClassLoader) AccessController .doPrivileged(new PrivilegedAction() { public Object run() { return new MultiParentClassLoader(new URL[] {}, new ClassLoader[] { service.getClassLoader(), contextClassLoader }); } }); org.apache.axis2.java.security.AccessController .doPrivileged(new PrivilegedAction() { public Object run() { Thread.currentThread().setContextClassLoader(loader); return null; } }); } else if (serviceTCCL.equals(Constants.TCCL_SERVICE)) { org.apache.axis2.java.security.AccessController .doPrivileged(new PrivilegedAction() { public Object run() { Thread.currentThread().setContextClassLoader( service.getClassLoader()); return null; } }); } } return tc; } /** * Several pieces of information need to be available to the service * implementation class. For one, the ThreadContextClassLoader needs to be * correct, and for another we need to give the service code access to the * MessageContext (getCurrentContext()). So we toss these things in TLS. * * @param msgContext * the current MessageContext * @return a ThreadContextDescriptor containing the old values */ public static ThreadContextDescriptor setThreadContext(final MessageContext msgContext) { AxisService service = msgContext.getAxisService(); ThreadContextDescriptor tc = setThreadContext(service); MessageContext.setCurrentMessageContext(msgContext); return tc; } private static ClassLoader getContextClassLoader_doPriv() { return (ClassLoader) org.apache.axis2.java.security.AccessController .doPrivileged(new PrivilegedAction() { public Object run() { return Thread.currentThread().getContextClassLoader(); } }); } }