package org.wso2.carbon.mediator.bam.builders; import org.apache.axis2.engine.AxisConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.synapse.MessageContext; import org.apache.synapse.core.axis2.Axis2MessageContext; import org.wso2.carbon.base.ServerConfiguration; import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.mediator.bam.config.BamMediatorException; import org.wso2.carbon.mediator.bam.util.BamMediatorConstants; import org.wso2.carbon.utils.CarbonUtils; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; public class MetaDataBuilder { private static final Log log = LogFactory.getLog(MetaDataBuilder.class); private static final String PORTS_OFFSET = "Ports.Offset"; private static final int CARBON_SERVER_DEFAULT_PORT = 9763; private String hostAddress = ""; private boolean isHostAddressSet = false; public static final String HOST_NAME = "HostName"; private static final String UNKNOWN_HOST = "UNKNOWN_HOST"; public Object[] createMetadata(MessageContext messageContext, AxisConfiguration axisConfiguration) throws BamMediatorException { Object[] metaData = new Object[BamMediatorConstants.NUM_OF_CONST_META_PARAMS]; int i = 0; try{ if(!this.isHostAddressSet) { this.hostAddress = getHostAddress(); this.isHostAddressSet = true; } metaData[i++] = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); metaData[i++] = this.extractPropertyFromMessageContext(messageContext, "HTTP_METHOD"); metaData[i++] = this.extractPropertyFromMessageContext(messageContext, "CHARACTER_SET_ENCODING"); metaData[i++] = this.extractPropertyFromMessageContext(messageContext, "REMOTE_ADDR"); metaData[i++] = this.extractPropertyFromMessageContext(messageContext, "TransportInURL"); metaData[i++] = this.extractPropertyFromMessageContext(messageContext, "messageType"); metaData[i++] = this.extractPropertyFromMessageContext(messageContext, "REMOTE_HOST"); metaData[i++] = this.extractPropertyFromMessageContext(messageContext, "SERVICE_PREFIX"); metaData[i] = this.hostAddress; return metaData; } catch (Exception e) { String errorMsg = "Error occurred while producing values for Meta Data. " + e.getMessage(); log.error(errorMsg, e); throw new BamMediatorException(errorMsg, e); } } private static String getHostAddress() { try { String hostAddress = ServerConfiguration.getInstance().getFirstProperty(HOST_NAME); if(null == hostAddress){ hostAddress = getLocalAddress().getHostName(); if (hostAddress == null) { hostAddress = UNKNOWN_HOST; } int portsOffset = Integer.parseInt(CarbonUtils.getServerConfiguration().getFirstProperty( PORTS_OFFSET)); int portValue = CARBON_SERVER_DEFAULT_PORT + portsOffset; return hostAddress + ":" + portValue; }else { return hostAddress.trim(); } } catch (Exception e){ String errorMsg = "Error occurred while getting the Host Address. " + e.getMessage(); log.error(errorMsg, e); return ""; } } private static InetAddress getLocalAddress(){ Enumeration<NetworkInterface> iFaces; try { iFaces = NetworkInterface.getNetworkInterfaces(); if (iFaces != null) { while (iFaces.hasMoreElements()) { NetworkInterface iFace = iFaces.nextElement(); Enumeration<InetAddress> addresses = iFace.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress address = addresses.nextElement(); if (address instanceof Inet4Address && !address.isLoopbackAddress()) { return address; } } } } return null; } catch (SocketException e) { log.error("Failed to get host address", e); return null; } catch (Exception e) { log.error("Error occurred while getting host address", e); return null; } } private Object extractPropertyFromMessageContext(MessageContext messageContext, String propertyName){ try{ org.apache.axis2.context.MessageContext msgCtx = ((Axis2MessageContext) messageContext).getAxis2MessageContext(); String output = (String)msgCtx.getLocalProperty(propertyName); if(output != null && !output.equals("")){ return output; } else { return ""; } } catch (Exception e) { String errorMsg = "Error occurred while extracting a property from Message Context. " + e.getMessage(); log.error(errorMsg, e); return ""; } } }