/* * Copyright (c) 2005 - 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * Licensed 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.wso2.carbon.event.publisher.core.internal.util; import org.apache.axis2.engine.AxisConfiguration; import org.wso2.carbon.context.CarbonContext; import org.wso2.carbon.core.multitenancy.utils.TenantAxisUtils; import org.wso2.carbon.event.publisher.core.config.EventPublisherConfiguration; import org.wso2.carbon.event.publisher.core.config.EventPublisherConstants; import org.wso2.carbon.event.publisher.core.exception.EventPublisherConfigurationException; import org.wso2.carbon.event.publisher.core.exception.EventPublisherStreamValidationException; import org.wso2.carbon.event.publisher.core.internal.ds.EventPublisherServiceValueHolder; import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import org.wso2.siddhi.core.event.Event; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; public class EventPublisherUtil { private static final String JVM_BIT_ARCH_SYSTEM_PROPERTY = "sun.arch.data.model"; private static int referenceSize; static { String arch = System.getProperty(JVM_BIT_ARCH_SYSTEM_PROPERTY); if (arch.equals("32")) { //32-bit architecture referenceSize = 4; } else { referenceSize = 8; } } public static String generateFilePath(String eventPublisherName, String repositoryPath) throws EventPublisherConfigurationException { File repoDir = new File(repositoryPath); if (!repoDir.exists()) { synchronized (repositoryPath.intern()) { if (!repoDir.exists()) { if (!repoDir.mkdir()) { throw new EventPublisherConfigurationException("Cannot create directory to add tenant specific event publisher :" + eventPublisherName); } } } } String path = repoDir.getAbsolutePath() + File.separator + EventPublisherConstants.EF_CONFIG_DIRECTORY; File subDir = new File(path); if (!subDir.exists()) { synchronized (path.intern()) { if (!subDir.exists()) { if (!subDir.mkdir()) { throw new EventPublisherConfigurationException("Cannot create directory " + EventPublisherConstants.EF_CONFIG_DIRECTORY + " to add tenant specific event publisher :" + eventPublisherName); } } } } return subDir.getAbsolutePath() + File.separator + eventPublisherName + EventPublisherConstants.EF_CONFIG_FILE_EXTENSION_WITH_DOT; } public static String getImportedStreamIdFrom( EventPublisherConfiguration eventPublisherConfiguration) { String streamId = null; if (eventPublisherConfiguration != null && eventPublisherConfiguration.getFromStreamName() != null && !eventPublisherConfiguration.getFromStreamName().isEmpty()) { streamId = eventPublisherConfiguration.getFromStreamName() + EventPublisherConstants.STREAM_ID_SEPERATOR + ((eventPublisherConfiguration.getFromStreamVersion() != null && !eventPublisherConfiguration.getFromStreamVersion().isEmpty()) ? eventPublisherConfiguration.getFromStreamVersion() : EventPublisherConstants.DEFAULT_STREAM_VERSION); } return streamId; } public static AxisConfiguration getAxisConfiguration() { AxisConfiguration axisConfiguration = null; if (CarbonContext.getThreadLocalCarbonContext().getTenantId() == MultitenantConstants.SUPER_TENANT_ID) { axisConfiguration = EventPublisherServiceValueHolder.getConfigurationContextService(). getServerConfigContext().getAxisConfiguration(); } else { axisConfiguration = TenantAxisUtils.getTenantAxisConfiguration(CarbonContext. getThreadLocalCarbonContext().getTenantDomain(), EventPublisherServiceValueHolder.getConfigurationContextService(). getServerConfigContext()); } return axisConfiguration; } public static int getSize(Event event) { int size = 8; // For long timestamp field size += getSize(event.getData()); size += 1; // for expired field return size; } public static int getSize(org.wso2.carbon.databridge.commons.Event event) { int size = 8; // For long timestamp field size += getSize(event.getStreamId()); if (event.getMetaData() != null) { size += getSize(event.getMetaData()); } if (event.getCorrelationData() != null) { size += getSize(event.getCorrelationData()); } if (event.getPayloadData() != null) { size += getSize(event.getPayloadData()); } size += referenceSize; // for the arbitrary map reference if (event.getArbitraryDataMap() != null) { size += getSize(event.getArbitraryDataMap()); } return size; } private static int getSize(Map<String, String> arbitraryDataMap) { int size = 0; if (arbitraryDataMap != null) { for (Map.Entry<String, String> entry : arbitraryDataMap.entrySet()) { size += getSize(entry.getKey()); size += getSize(entry.getValue()); size += referenceSize * 2; // Two string references for key and value } } return size; } private static int getSize(Object[] objects) { int size = 0; for (Object object : objects) { if (object != null) { if (object instanceof Integer) { size += 4; } else if (object instanceof Long) { size += 8; } else if (object instanceof Boolean) { size += 1; } else if (object instanceof Double) { size += 8; } else if (object instanceof Float) { size += 4; } else if (object instanceof String) { size += getSize(object.toString()); } } } size += referenceSize * objects.length; // for the object reference holders return size; } public static int getSize(String value) { int size = 0; if (value != null) { try { size = value.getBytes("UTF8").length; } catch (UnsupportedEncodingException e) { size = value.getBytes().length; } } return size; } public static Event convertToSiddhiEvent(org.wso2.carbon.databridge.commons.Event inputEvent, int inputStreamSize) { Object[] data = new Object[inputStreamSize]; int dataArrayCount = 0; if (inputEvent.getMetaData() != null) { for (Object attribute : inputEvent.getMetaData()) { data[dataArrayCount++] = attribute; } } if (inputEvent.getCorrelationData() != null) { for (Object attribute : inputEvent.getCorrelationData()) { data[dataArrayCount++] = attribute; } } if (inputEvent.getPayloadData() != null) { for (Object attribute : inputEvent.getPayloadData()) { data[dataArrayCount++] = attribute; } } Event event = new Event(inputEvent.getTimeStamp(), data); // Unchecked assignment is required to convert Map<String, String> to Map<String, Object> Map map = inputEvent.getArbitraryDataMap(); event.setArbitraryDataMap(map); return event; } public static void validateStreamDefinitionWithOutputProperties(String actualMappingText, Map<String, Integer> propertyPositionMap, Map<String, Object> arbitraryDataMap) throws EventPublisherConfigurationException { List<String> mappingProperties = EventPublisherUtil.getOutputMappingPropertyList(actualMappingText); for (String property : mappingProperties) { if (!propertyPositionMap.containsKey(property) && (arbitraryDataMap == null || !arbitraryDataMap.containsKey(property))) { throw new EventPublisherStreamValidationException("Property " + property + " is neither in the input stream attributes nor in runtime arbitrary data map."); } } } public static List<String> getOutputMappingPropertyList(String mappingText) throws EventPublisherConfigurationException { List<String> mappingTextList = new ArrayList<String>(); String text = mappingText; int prefixIndex = text.indexOf(EventPublisherConstants.TEMPLATE_EVENT_ATTRIBUTE_PREFIX); int postFixIndex; while (prefixIndex > 0) { postFixIndex = text.indexOf(EventPublisherConstants.TEMPLATE_EVENT_ATTRIBUTE_POSTFIX); if (postFixIndex > prefixIndex) { mappingTextList.add(text.substring(prefixIndex + 2, postFixIndex)); text = text.substring(postFixIndex + 2); } else { throw new EventPublisherConfigurationException("Found template attribute prefix " + EventPublisherConstants.TEMPLATE_EVENT_ATTRIBUTE_PREFIX + " without corresponding postfix " + EventPublisherConstants.TEMPLATE_EVENT_ATTRIBUTE_POSTFIX + ". Please verify your template."); } prefixIndex = text.indexOf(EventPublisherConstants.TEMPLATE_EVENT_ATTRIBUTE_PREFIX); } return mappingTextList; } public static void validateFilePath(String fileName) throws EventPublisherConfigurationException { if (fileName.contains("../") || fileName.contains("..\\")) { throw new EventPublisherConfigurationException("File name contains restricted path elements. " + fileName); } } }