/**************************************************************************************
* Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.expression;
import org.codehaus.aspectwerkz.exception.DefinitionException;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
/**
* The expression namespace as well as a repository for the namespaces. <p/>A namespace is usually defined by the name
* of the class defining the expression.
*
* @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a>
*/
public final class ExpressionNamespace {
/**
* Namespace container.
*/
private static final Map s_namespaces = new WeakHashMap();
/**
* Map with all the expressions in the namespace, [name:expression] pairs.
*/
private final Map m_expressions = new HashMap();
/**
* The namespace.
*/
private final String m_namespace;
/**
* Creates a new expression namespace.
*
* @param namespace
*/
private ExpressionNamespace(final String namespace) {
m_namespace = namespace;
}
/**
* Returns the expression namespace for a specific namespace.
*
* @param namespace the expression namespace
* @return the expression namespace abstraction
*/
public static synchronized ExpressionNamespace getNamespace(final String namespace) {
if (!s_namespaces.containsKey(namespace)) {
s_namespaces.put(namespace, new ExpressionNamespace(namespace));
}
return (ExpressionNamespace) s_namespaces.get(namespace);
}
/**
* Adds an expression info to the namespace.
*
* @param name the name mapped to the expression
* @param expressionInfo the expression info to add
*/
public void addExpressionInfo(final String name, final ExpressionInfo expressionInfo) {
m_expressions.put(name, expressionInfo);
}
/**
* Returns the expression info with a specific name or null if it could not be found.
*
* @param name the name of the expression
* @return the expression info
*/
public ExpressionInfo getExpressionInfoOrNull(final String name) {
int index = name.lastIndexOf('.');
if (index != -1) {
// stay in the same CflowStack
//TODO: allow for lookup in other CflowStack providing they are in the same hierarchy
return getNamespace(name.substring(0, index)).getExpressionInfoOrNull(
name.substring(index + 1, name.length())
);
} else {
final ExpressionInfo expressionInfo = ((ExpressionInfo) m_expressions.get(name));
// if (expressionInfo == null) {
// throw new DefinitionException(
// new StringBuffer().
// append("could not resolve reference to pointcut [").
// append(name).
// append("] in namespace [").
// append(m_namespace).
// append("]").toString()
// );
// }
return expressionInfo;
}
}
/**
* Returns the expression info with a specific name or throw an exception if it could not be found.
*
* @param name the name of the expression
* @return the expression info
*/
public ExpressionInfo getExpressionInfo(final String name) {
int index = name.lastIndexOf('.');
if (index != -1) {
// stay in the same CflowStack
//TODO: allow for lookup in other CflowStack providing they are in the same hierarchy
return getNamespace(name.substring(0, index)).getExpressionInfo(name.substring(index + 1, name.length()));
} else {
final ExpressionInfo expressionInfo = ((ExpressionInfo) m_expressions.get(name));
if (expressionInfo == null) {
throw new DefinitionException(
new StringBuffer().
append("could not resolve reference to pointcut [").
append(name).
append("] in namespace [").
append(m_namespace).
append("]").toString()
);
}
return expressionInfo;
}
}
/**
* Returns the expression with a specific name.
*
* @param name the name of the expression
* @return the expression
*/
public ExpressionVisitor getExpression(final String name) {
return getExpressionInfo(name).getExpression();
}
/**
* Returns the advised class expression with a specific name.
*
* @param name the name of the expression
* @return the expression
*/
public AdvisedClassFilterExpressionVisitor getAdvisedClassExpression(final String name) {
return getExpressionInfo(name).getAdvisedClassFilterExpression();
}
/**
* Returns the name of the namespace.
*
* @return the name of the namespace
*/
public String getName() {
return m_namespace;
}
}