/**
*
* 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.tomee.common;
import org.apache.catalina.core.StandardContext;
import org.apache.naming.EjbRef;
import javax.naming.RefAddr;
import javax.naming.Reference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class NamingUtil {
public static final String NAME = "name";
public static final String DEPLOYMENT_ID = "deploymentid";
public static final String EXTERNAL = "external";
public static final String LOCAL = "local";
public static final String LOCALBEAN = "localbean";
public static final String REMOTE = EjbRef.REMOTE;
public static final String JNDI_NAME = "jndiname";
public static final String JNDI_PROVIDER_ID = "jndiproviderid";
public static final String UNIT = "unit";
public static final String EXTENDED = "extended";
public static final String PROPERTIES = "properties";
public static final String RESOURCE_ID = "resourceid";
public static final String COMPONENT_TYPE = "componenttype";
public static final String WS_ID = "wsid";
public static final String WS_CLASS = "wsclass";
public static final String WS_QNAME = "wsqname";
public static final String WS_PORT_QNAME = "wsportqname";
public static final String WSDL_URL = "wsdlurl";
private static final AtomicInteger id = new AtomicInteger(31);
private static final Map<String,Object> registry = new ConcurrentHashMap<String, Object>();
// these two attributes are used to be able to cleanup quickly the registry (otherwise we need to duplicate a lot of logic)
private static StandardContext currentContext;
private static Map<StandardContext, Collection<String>> ID_BY_CONTEXT = new HashMap<StandardContext, Collection<String>>();
public static String getProperty(final Reference ref, final String name) {
final RefAddr addr = ref.get(name);
if (addr == null) {
return null;
}
final Object value = addr.getContent();
return (String) value;
}
public static boolean isPropertyTrue(final Reference ref, final String name) {
final RefAddr addr = ref.get(name);
if (addr == null) {
return false;
}
final Object value = addr.getContent();
return Boolean.parseBoolean(String.valueOf(value));
}
public static void setStaticValue(final Resource resource, final Object value) {
setStaticValue(resource, null, value);
}
public static void setStaticValue(final Resource resource, final String name, final Object value) {
final String token = String.valueOf(id.incrementAndGet());
registry.put(token, value);
resource.setProperty("static-token" + (name != null ? "-" + name : ""), token);
if (currentContext != null) {
Collection<String> ids = ID_BY_CONTEXT.get(currentContext);
if (ids == null) {
ids = new ArrayList<String>();
ID_BY_CONTEXT.put(currentContext, ids);
}
ids.add(token);
}
}
@SuppressWarnings({"unchecked"})
public static<T> T getStaticValue(final Reference ref) {
return (T) getStaticValue(ref, null);
}
@SuppressWarnings({"unchecked"})
public static <T> T getStaticValue(final Reference ref, String name) {
name = name != null ? "-" + name : "";
final String token = getProperty(ref, "static-token" + name);
if (token == null) {
return null;
}
final T object = (T) registry.get(token);
return object;
}
public static Class<?> loadClass(final String className) {
if (className == null) {
return null;
}
try {
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader != null) {
try {
final Class clazz = classLoader.loadClass(className);
return clazz;
} catch(final ClassNotFoundException e) {
// no-op
}
}
return Class.forName(className);
} catch (final ClassNotFoundException e) {
return null;
}
}
/**
* This interface exists because the class org.apache.catalina.deploy.ContextResource
* is not available in the common classloader in tomcat 55
*/
public interface Resource {
void setProperty(String name, Object value);
}
public static void setCurrentContext(final StandardContext currentContext) {
NamingUtil.currentContext = currentContext;
}
public static void cleanUpContextResource(final StandardContext context) {
final Collection<String> keys = ID_BY_CONTEXT.remove(context);
if (keys != null) {
for (final String k : keys) {
registry.remove(k);
}
}
}
}