/* * Copyright (c) 2015, 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.input.adapter.filetail; import org.apache.commons.io.input.Tailer; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.event.input.adapter.core.EventAdapterConstants; import org.wso2.carbon.event.input.adapter.core.InputEventAdapter; import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration; import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener; import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException; import org.wso2.carbon.event.input.adapter.core.exception.TestConnectionNotSupportedException; import org.wso2.carbon.event.input.adapter.filetail.internal.listener.FileTailerListener; import org.wso2.carbon.event.input.adapter.filetail.internal.util.FileTailEventAdapterConstants; import org.wso2.carbon.event.input.adapter.filetail.internal.util.FileTailerManager; import java.io.File; import java.util.*; import java.util.concurrent.*; /** * Input FileTailEventAdapter will be used to receive events from specified event file. */ public class FileTailEventAdapter implements InputEventAdapter { private final InputEventAdapterConfiguration eventAdapterConfiguration; private final Map<String, String> globalProperties; private InputEventAdapterListener eventAdapterListener; private final String id = UUID.randomUUID().toString(); private static final Log log = LogFactory.getLog(FileTailEventAdapter.class); private FileTailerManager fileTailerManager; private ExecutorService singleThreadedExecutor; public FileTailEventAdapter(InputEventAdapterConfiguration eventAdapterConfiguration, Map<String, String> globalProperties) { this.eventAdapterConfiguration = eventAdapterConfiguration; this.globalProperties = globalProperties; this.singleThreadedExecutor = Executors.newSingleThreadExecutor(); } @Override public void init(InputEventAdapterListener eventAdapterListener) throws InputEventAdapterException { validateInputEventAdapterConfigurations(); this.eventAdapterListener = eventAdapterListener; } @Override public void testConnect() throws TestConnectionNotSupportedException { throw new TestConnectionNotSupportedException("not-supported"); } @Override public void connect() { createFileAdapterListener(); } @Override public void disconnect() { if (fileTailerManager != null) { fileTailerManager.getTailer().stop(); } } @Override public void destroy() { } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof FileTailEventAdapter)) return false; FileTailEventAdapter that = (FileTailEventAdapter) o; return id.equals(that.id); } @Override public int hashCode() { return id.hashCode(); } private void createFileAdapterListener() { if(log.isDebugEnabled()){ log.debug("New subscriber added for " + eventAdapterConfiguration.getName()); } String delayInMillisProperty = eventAdapterConfiguration.getProperties().get(FileTailEventAdapterConstants.EVENT_ADAPTER_DELAY_MILLIS); int delayInMillis = FileTailEventAdapterConstants.DEFAULT_DELAY_MILLIS; if (delayInMillisProperty != null && (!delayInMillisProperty.trim().isEmpty())) { delayInMillis = Integer.parseInt(delayInMillisProperty); } boolean startFromEnd = false; String startFromEndProperty = eventAdapterConfiguration.getProperties().get(FileTailEventAdapterConstants.EVENT_ADAPTER_START_FROM_END); if (startFromEndProperty != null && (!startFromEndProperty.trim().isEmpty())) { startFromEnd = Boolean.parseBoolean(startFromEndProperty); } String filePath = eventAdapterConfiguration.getProperties().get( FileTailEventAdapterConstants.EVENT_ADAPTER_CONF_FILEPATH); FileTailerListener listener = new FileTailerListener(new File(filePath).getName(), eventAdapterListener); Tailer tailer = new Tailer(new File(filePath), listener, delayInMillis, startFromEnd); fileTailerManager = new FileTailerManager(tailer, listener); singleThreadedExecutor.execute(tailer); } @Override public boolean isEventDuplicatedInCluster() { return Boolean.parseBoolean(globalProperties.get(EventAdapterConstants.EVENTS_DUPLICATED_IN_CLUSTER)); } @Override public boolean isPolling() { return true; } private void validateInputEventAdapterConfigurations() throws InputEventAdapterException { String delayInMillisProperty = eventAdapterConfiguration.getProperties().get(FileTailEventAdapterConstants.EVENT_ADAPTER_DELAY_MILLIS); try{ if(delayInMillisProperty != null){ Integer.parseInt(delayInMillisProperty); } } catch (NumberFormatException e){ throw new InputEventAdapterException("Invalid value set for property Delay: " + delayInMillisProperty, e); } } }