/* * 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.synapse.mediators.bean; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMText; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.synapse.MessageContext; import org.apache.synapse.SynapseException; import org.apache.synapse.config.xml.ValueFactory; import org.apache.synapse.config.xml.ValueSerializer; import org.apache.synapse.mediators.Value; import org.apache.synapse.util.xpath.SynapseXPath; import org.jaxen.JaxenException; /** * Represents a Target. Handles both static property names and dynamic(XPath) keys. */ public class Target { private static final Log log = LogFactory.getLog(Target.class); private Value value; /** * Creates a new Target from the OMElement * @param attributeName Name of the attribute where the property name/ XPath expression is * stored. * @param element OMElement where the the XPath expression and the namespaces are stored. */ public Target(String attributeName, OMElement element) { this.value = new ValueFactory().createValue(attributeName, element); } /** * Inserts the given object into the target specified by the current Target object. * @param synCtx Message Context to be enriched with the object. * @param object Object to be inserted. */ public void insert(MessageContext synCtx, Object object) { if (value.getExpression() != null && value.getExpression() instanceof SynapseXPath) { SynapseXPath expression = (SynapseXPath)value.getExpression(); Object targetObj = null; try { targetObj = expression.selectSingleNode(synCtx); } catch (JaxenException e) { handleException("Failed to select the target.", e); } if (targetObj instanceof OMText) { Object targetParent = ((OMText) targetObj).getParent(); if (targetParent != null && targetParent instanceof OMElement) { ((OMElement) targetParent).setText(object == null ? "" : object.toString()); } else { handleException("Invalid target is specified by the expression: " + expression); } } else { handleException("Invalid target is specified by the expression: " + expression); } } else if (value.getKeyValue() != null) { synCtx.setProperty(value.getKeyValue(), object); } else { handleException("Invalid target description. " + value); } } /** * Serialized this Target object into the given element with the given attribute name. * * @param attributeName Name of the attribute. * @param element Element to serialize this target in to. * @return Element after serializing this target. */ public OMElement serializeTarget(String attributeName, OMElement element) { return new ValueSerializer().serializeValue(value, attributeName, element); } private void handleException(String msg) { log.error(msg); throw new SynapseException(msg); } private void handleException(String msg, Throwable e) { log.error(msg); throw new SynapseException(msg, e); } }