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.camel.model.language;
018    
019    import java.util.Map;
020    
021    import javax.xml.bind.annotation.XmlAccessType;
022    import javax.xml.bind.annotation.XmlAccessorType;
023    import javax.xml.bind.annotation.XmlTransient;
024    
025    import org.apache.camel.CamelContext;
026    import org.apache.camel.Expression;
027    import org.apache.camel.Predicate;
028    import org.apache.camel.spi.NamespaceAware;
029    
030    /**
031     * A useful base class for any expression which may be namespace or XML content aware
032     * such as {@link XPathExpression} or {@link XQueryExpression}
033     *
034     * @version 
035     */
036    @XmlAccessorType(XmlAccessType.FIELD)
037    public abstract class NamespaceAwareExpression extends ExpressionDefinition implements NamespaceAware {
038        @XmlTransient
039        private Map<String, String> namespaces;
040    
041        public NamespaceAwareExpression() {
042        }
043    
044        public NamespaceAwareExpression(String expression) {
045            super(expression);
046        }
047    
048    
049        public Map<String, String> getNamespaces() {
050            return namespaces;
051        }
052    
053        /**
054         * Injects the XML Namespaces of prefix -> uri mappings
055         *
056         * @param namespaces the XML namespaces with the key of prefixes and the value the URIs
057         */
058        public void setNamespaces(Map<String, String> namespaces) {
059            this.namespaces = namespaces;
060        }
061    
062        @Override
063        protected void configureExpression(CamelContext camelContext, Expression expression) {
064            configureNamespaceAware(expression);
065        }
066    
067        @Override
068        protected void configurePredicate(CamelContext camelContext, Predicate predicate) {
069            configureNamespaceAware(predicate);
070        }
071    
072        protected void configureNamespaceAware(Object builder) {
073            if (namespaces != null && builder instanceof NamespaceAware) {
074                NamespaceAware namespaceAware = (NamespaceAware) builder;
075                namespaceAware.setNamespaces(namespaces);
076            }
077        }
078    }