/* AWE - Amanzi Wireless Explorer
* http://awe.amanzi.org
* (C) 2008-2009, AmanziTel AB
*
* This library is provided under the terms of the Eclipse Public License
* as described at http://www.eclipse.org/legal/epl-v10.html. Any use,
* reproduction or distribution of the library constitutes recipient's
* acceptance of this agreement.
*
* This library is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.amanzi.awe.drive.ui.wrapper;
import java.util.Iterator;
import org.amanzi.awe.drive.ui.DriveTreePlugin;
import org.amanzi.awe.drive.ui.item.PeriodItem;
import org.amanzi.awe.drive.ui.preferences.DriveLabelsInitializer;
import org.amanzi.awe.ui.dto.IPeriodItem;
import org.amanzi.awe.ui.tree.item.ITreeItem;
import org.amanzi.awe.ui.tree.wrapper.impl.AbstractModelWrapper;
import org.amanzi.neo.core.period.Period;
import org.amanzi.neo.core.period.PeriodManager;
import org.amanzi.neo.dto.IDataElement;
import org.amanzi.neo.models.exceptions.ModelException;
import org.amanzi.neo.models.measurement.IMeasurementModel;
import org.eclipse.jface.preference.IPreferenceStore;
/**
* TODO Purpose of
* <p>
* </p>
*
* @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com)
* @since 1.0.0
*/
public class DriveModelWrapper extends AbstractModelWrapper<IMeasurementModel> {
private class PeriodItemIterator implements Iterator<ITreeItem> {
private final Period period;
private long startTime;
private final long endTime;
private PeriodItem next;
public PeriodItemIterator(final Period period, final long startTime, final long endTime) {
this.period = period;
this.startTime = startTime;
this.endTime = endTime;
}
@Override
public boolean hasNext() {
if (startTime < endTime && next == null) {
gotoNext();
}
return next != null;
}
private void gotoNext() {
PeriodItem result = null;
do {
final long tempEndTime = period.getUnderlyingPeriod().getEndTime(startTime);
if (haveElements(startTime, tempEndTime)) {
result = new PeriodItem(getModel(), DriveModelWrapper.this, period.getUnderlyingPeriod(), startTime);
}
startTime = tempEndTime;
} while (result == null && startTime < endTime);
next = result;
}
@Override
public ITreeItem next() {
if (next == null) {
gotoNext();
}
final ITreeItem result = next;
next = null;
return result;
}
@Override
public void remove() {
// TODO: LN: 15.10.2012, throw exception
}
}
/**
* @param wrapper
* @param model
*/
protected DriveModelWrapper(final IMeasurementModel model) {
super(model);
}
@Override
protected ITreeItem getParentInternal(final ITreeItem item) throws ModelException {
return null;
}
@Override
protected Iterator<ITreeItem> getChildrenInternal(final ITreeItem item) throws ModelException {
if (item instanceof PeriodItem) {
final IPeriodItem period = (IPeriodItem)item;
final Iterator<IDataElement> elementsIterator = getModel().getElements(period.getStartTime(), period.getEndTime())
.iterator();
if (!period.getPeriod().equals(Period.HOURLY)) {
if (elementsIterator.hasNext()) {
return new PeriodItemIterator(period.getPeriod(), period.getStartTime(), period.getEndTime());
}
} else {
return new TreeItemIterator(elementsIterator);
}
} else {
final IMeasurementModel model = item.castChild(IMeasurementModel.class);
if (model != null) {
final Period period = Period.getHighestPeriod(model.getMinTimestamp(), model.getMaxTimestamp());
return new PeriodItemIterator(period, model.getMinTimestamp(), model.getMaxTimestamp());
}
}
return null;
}
private boolean haveElements(final long startTime, final long endTime) {
try {
final Iterator<IDataElement> elementsIterator = getModel().getElements(startTime, endTime).iterator();
return elementsIterator.hasNext();
} catch (final ModelException e) {
// TODO: LN: 15.10.2012, log error
return false;
}
}
@Override
public String getTitle(final ITreeItem item) {
if (item instanceof PeriodItem) {
final IPeriodItem period = (IPeriodItem)item;
return PeriodManager.getPeriodName(period.getPeriod(), period.getStartTime(), period.getEndTime());
} else {
return super.getTitle(item);
}
}
@Override
protected String getPreferenceKey() {
return DriveLabelsInitializer.DRIVE_LABEL_TEMPLATE;
}
@Override
protected IPreferenceStore getPreferenceStore() {
return DriveTreePlugin.getDefault().getPreferenceStore();
}
}