void RecordHandler::handle(StationData* stationData, Record* record) {
	RecordPtr recordAutoPtr(record);

	if ( stationData->gmGain == 0 ) return;
	if ( !record->data() ) return;

	int dataSize = record->data()->size();
	if ( dataSize <= 0 ) return;

	ArrayPtr array = record->data()->copy(Array::DOUBLE);
	double* data = static_cast<double*>(const_cast<void*>(array->data()));
	if ( !data ) return;

	stationData->gmFilter->setSamplingFrequency(record->samplingFrequency());
	stationData->gmFilter->apply(dataSize, data);

	double* begin = data;
	double* maximumSample = std::max_element(begin, data + dataSize,
	                                         std::ptr_fun(RecordHandlerCompare));

	*maximumSample = fabs(*maximumSample);

	if ( stationData->gmMaximumSample < *maximumSample ||
			Core::Time::GMT() - stationData->gmSampleReceiveTime > _sampleLifespan ) {
		stationData->gmSampleReceiveTime = Core::Time::GMT();
		stationData->gmMaximumSample= *maximumSample;
	}

	try { stationData->gmRecordReceiveTime = record->endTime(); }
	catch ( Core::ValueException& ) { stationData->gmRecordReceiveTime = Core::Time::GMT(); }

	double velocity = stationData->gmMaximumSample / stationData->gmGain * 1E9;

	stationData->gmColor = calculateColorFromVelocity(velocity);
}