package org.singinst.uf.model; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.singinst.uf.math.MathUtil; import org.singinst.uf.math.SimplePoint; import org.singinst.uf.presenter.ScalarValuePointList; import org.singinst.uf.presenter.LineBounds; public class ResearchersNodeMetadataContentsFactory { private final List scalarSchemata = new ArrayList(); private final ScalarRelation relation; private final Map extremeByYear = new HashMap(); private final List pointLists = new ArrayList(); private final List conjectureList = new ArrayList(); private final LineBounds domain; public ResearchersNodeMetadataContentsFactory(Node node) { final LineBounds range = new LineBounds(1, 7, true); domain = new LineBounds(0, ModelUtil.LATEST_IA_DELAY); final List extremes = ResearcherExtreme.createList(node, range, domain); for (YearExtremeNodeMetadataContentsFactory extreme : extremes) { extremeByYear.put(extreme.getYear(), extreme); scalarSchemata.addAll(extreme.getScalars()); } for (ScalarSchema scalarSchema : scalarSchemata) { conjectureList.add(scalarSchema.getScalarValueHolder()); } for (final NotablePercentile percentile : NotablePercentile.values()) { PercentileDraggableLine pointList = new PercentileDraggableLine(percentile) { @Override public void dragTo(SimplePoint point) { ResearchersNodeMetadataContentsFactory.this.dragTo(percentile, point); }}; pointLists.add(pointList); } relation = new ScalarRelation(new Axis(domain), new Axis(range)) { @Override public List getPointLists() { for (PercentileDraggableLine incidentLine : pointLists) { List points = new ArrayList(); for (YearExtremeNodeMetadataContentsFactory extreme : extremes) { points.add(new SimplePoint(extreme.getYear(), extreme.getScalarSchema(incidentLine.getPercentile()).getScalarValueHolder().getValue())); } incidentLine.setHypothesisPoints(points); } return pointLists; } public List getConclusionGenerators() { List retVal = new ArrayList(); for (YearExtremeNodeMetadataContentsFactory extreme : extremes) { retVal.add(extreme.getConclusionGenerator()); } return retVal; } public List getScalarValues() { return conjectureList ; } }; } public Collection getScalars() { return scalarSchemata; } public ScalarRelation getRelation() { return relation; } public void dragTo(NotablePercentile percentile, SimplePoint point) { boolean selectLeft = point.x < domain.getMidpoint(); double year = selectLeft ? domain.getFirst() : domain.getSecond(); double anchorYear = selectLeft ? domain.getSecond() : domain.getFirst(); YearExtremeNodeMetadataContentsFactory extreme = extremeByYear.get(year); if (extreme == null) { throw new NullPointerException("" + year); } YearExtremeNodeMetadataContentsFactory anchorExtreme = extremeByYear.get(anchorYear); if (anchorExtreme == null) { throw new NullPointerException("" + year); } SimplePoint anchorPoint = new SimplePoint( anchorYear, anchorExtreme.getScalarSchema(percentile).getScalarValueHolder().getValue()); double newExtremeY = MathUtil.interpolate( anchorPoint, point, year); extreme.getScalarSchema(percentile).getScalarValueHolder().setValue(newExtremeY); } }