/*********************************************************************************************************************** | |
* Copyright (c) 2008 empolis GmbH and brox IT Solutions GmbH. All rights reserved. This program and the accompanying | |
* materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, | |
* and is available at http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: Daniel Stucky (empolis GmbH) - initial API and implementation | |
**********************************************************************************************************************/ | |
package org.eclipse.smila.connectivity.framework; | |
import java.util.Date; | |
import java.util.Dictionary; | |
import java.util.Iterator; | |
import org.eclipse.smila.connectivity.framework.performancecounters.AgentPerformanceCounterHelper; | |
import org.eclipse.smila.connectivity.framework.performancecounters.ConnectivityPerformanceAgent; | |
import org.eclipse.smila.connectivity.framework.schema.config.DataSourceConnectionConfig; | |
import org.eclipse.smila.connectivity.framework.util.AgentControllerCallback; | |
import org.eclipse.smila.connectivity.framework.util.AgentThreadState; | |
import org.eclipse.smila.datamodel.Record; | |
import org.osgi.service.component.ComponentContext; | |
/** | |
* Abstract base class for Agent implementations. | |
*/ | |
public abstract class AbstractAgent implements Agent { | |
/** The logger. */ | |
protected org.apache.commons.logging.Log _log = org.apache.commons.logging.LogFactory.getLog(this.getClass()); | |
/** | |
* The _counter helper. | |
*/ | |
protected AgentPerformanceCounterHelper<ConnectivityPerformanceAgent> _performanceCounters; | |
/** | |
* The agent ID. | |
*/ | |
private String _agentId; | |
/** | |
* Reference to the AgentControllerCallback. | |
*/ | |
private AgentControllerCallback _controllerCallback; | |
/** | |
* Reference to the DataSourceConnectionConfig. | |
*/ | |
private DataSourceConnectionConfig _config; | |
/** | |
* The delta indexing session. | |
*/ | |
private String _sessionId; | |
/** | |
* Flag if the agent thread should be / was stopped. | |
*/ | |
private boolean _stopThread; | |
/** | |
* Reference to the Agents thread. | |
*/ | |
private Thread _agentThread; | |
/** | |
* The state of the agent. | |
*/ | |
private AgentState _agentState; | |
/** | |
* Default Constructor. | |
*/ | |
public AbstractAgent() { | |
} | |
/** | |
* Returns the Agent Id, which is the OSGi DecarativeService Component Name. | |
* | |
* @return the AgentId | |
* @throws AgentException | |
* if any error occurs | |
*/ | |
@Override | |
public String getAgentId() throws AgentException { | |
return _agentId; | |
} | |
/** | |
* Gets the AgentState. | |
* | |
* @return the AgentState | |
*/ | |
public AgentState getAgentState() { | |
return _agentState; | |
} | |
/** | |
* {@inheritDoc} | |
* | |
* @see org.eclipse.smila.connectivity.framework.Agent#start(AgentControllerCallback, AgentState, | |
* DataSourceConnectionConfig, String) | |
*/ | |
@Override | |
public void start(final AgentControllerCallback controllerCallback, final AgentState agentState, | |
final DataSourceConnectionConfig config, final String sessionId) throws AgentException { | |
if (controllerCallback == null) { | |
throw new AgentException("parameter controllerCallback is null"); | |
} | |
if (config == null) { | |
throw new AgentException("parameter config is null"); | |
} | |
_stopThread = false; | |
_controllerCallback = controllerCallback; | |
_config = config; | |
_sessionId = sessionId; | |
// initialize the AgentState | |
_agentState = agentState; | |
_agentState.setDataSourceId(config.getDataSourceID()); | |
_agentState.setState(AgentThreadState.Running); | |
_agentState.setStartTime(System.currentTimeMillis()); | |
// initialize the agent (depends on implementation) | |
initialize(); | |
initializePerformanceCounterHelper(); | |
getCounterHelper().setImportRunId(_agentState.getImportRunId()); | |
getCounterHelper().setStartDate(new Date(_agentState.getStartTime())); | |
// initialize the Agent thread | |
_agentThread = new Thread(this, "Agent:" + getConfig().getDataSourceID()); | |
_agentThread.start(); | |
} | |
/** | |
* @return the AgentPerformanceCounterHelper | |
*/ | |
@Override | |
public AgentPerformanceCounterHelper<ConnectivityPerformanceAgent> getCounterHelper() { | |
return _performanceCounters; | |
} | |
/** | |
* creates a new AgentPerformanceCounterHelper instance. | |
*/ | |
protected void initializePerformanceCounterHelper() { | |
_performanceCounters = | |
new AgentPerformanceCounterHelper<ConnectivityPerformanceAgent>(_config, hashCode(), | |
ConnectivityPerformanceAgent.class); | |
} | |
/** | |
* {@inheritDoc} | |
* | |
* @see org.eclipse.smila.connectivity.framework.Agent#stop() | |
*/ | |
@Override | |
public void stop() throws AgentException { | |
stopThread(); | |
_agentState.setState(AgentThreadState.Stopped); | |
} | |
/** | |
* Returns the value of the flag _stopThread. | |
* | |
* @return true if the thread is stopped, false otherwise | |
*/ | |
protected boolean isStopThread() { | |
return _stopThread; | |
} | |
/** | |
* Stops the agent thread. | |
*/ | |
protected void stopThread() { | |
_agentState.setEndTime(System.currentTimeMillis()); | |
getCounterHelper().setEndDate(new Date(_agentState.getEndTime())); | |
_stopThread = true; | |
_agentThread = null; | |
_controllerCallback.unregister(_sessionId, _config.getDeltaIndexing(), _config.getDataSourceID()); | |
} | |
/** | |
* Gets the AgentControllerCallback. | |
* | |
* @return the AgentControllerCallback | |
*/ | |
protected AgentControllerCallback getControllerCallback() { | |
return _controllerCallback; | |
} | |
/** | |
* Gets the DataSourceConnectionConfig. | |
* | |
* @return the DataSourceConnectionConfig | |
*/ | |
protected DataSourceConnectionConfig getConfig() { | |
return _config; | |
} | |
/** | |
* Returns the delta indexing session id. | |
* | |
* @return the delta indexing session id | |
*/ | |
protected String getSessionId() { | |
return _sessionId; | |
} | |
/** | |
* Activate the component. | |
* | |
* @param context | |
* the ComponentContext | |
*/ | |
@SuppressWarnings("unchecked") | |
protected void activate(final ComponentContext context) { | |
final Dictionary<String, String> dictionary = context.getProperties(); | |
_agentId = dictionary.get("component.name"); | |
} | |
/** | |
* Deactivate the component. | |
* | |
* @param context | |
* the ComponentContext | |
*/ | |
protected void deactivate(final ComponentContext context) { | |
_agentId = null; | |
} | |
/** | |
* Method to contain initialization of the agent. Must be implemented by subclasses. This method is called just before | |
* the AgentThread is started. | |
* | |
* @throws AgentException | |
* if any error occurs | |
*/ | |
protected abstract void initialize() throws AgentException; | |
/** | |
* Gets the attachments bytes length. | |
* | |
* @param record | |
* the record | |
* | |
* @return the attachments size | |
*/ | |
protected long getAttachmentsByteLength(final Record record) { | |
if (!record.hasAttachments()) { | |
return 0; | |
} | |
long size = 0; | |
final Iterator<String> attachmentNames = record.getAttachmentNames(); | |
while (attachmentNames.hasNext()) { | |
final String attachmentName = attachmentNames.next(); | |
final byte[] attachment = record.getAttachment(attachmentName); | |
if (attachment != null) { | |
size += attachment.length; | |
} | |
} | |
return size; | |
} | |
} |