// This software is released into the Public Domain. See copying.txt for details. package org.openstreetmap.osmosis.core.sort.v0_6; import java.util.Comparator; import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer; import org.openstreetmap.osmosis.core.OsmosisRuntimeException; import org.openstreetmap.osmosis.core.domain.v0_6.Entity; import org.openstreetmap.osmosis.core.domain.v0_6.EntityType; import org.openstreetmap.osmosis.core.task.common.ChangeAction; /** * Orders changes in such a way that they can be applied to a data store while * maintaining data integrity (ie. a database). For example, the ordering * prevents a way being added before the underlying nodes are created. The * changes are ordered as follows: * <ul> * <li>Bound creation</li> * <li>Node creation</li> * <li>Way creation</li> * <li>Relation creation</li> * <li>Relation modification</li> * <li>Way modification</li> * <li>Node modification</li> * <li>Bound modification</li> * <li>Relation deletion</li> * <li>Way deletion</li> * <li>Node deletion</li> * <li>Bound deletion</li> * </ul> * * @author Brett Henderson */ public class ChangeForSeekableApplierComparator implements Comparator<ChangeContainer> { /** * Create a weighting for the change. The weighting is the index into the * sorting list implemented by this class. * * @param changeEntity * The change to be analysed. * @return The sort weighting. */ private int calculateSortWeight(ChangeContainer changeEntity) { ChangeAction action = changeEntity.getAction(); Entity entity = changeEntity.getEntityContainer().getEntity(); if (entity.getType().equals(EntityType.Bound)) { if (action.equals(ChangeAction.Create)) { return 1; } if (action.equals(ChangeAction.Modify)) { return 8; } if (action.equals(ChangeAction.Delete)) { return 12; } } else if (entity.getType().equals(EntityType.Node)) { if (action.equals(ChangeAction.Create)) { return 2; } if (action.equals(ChangeAction.Modify)) { return 7; } if (action.equals(ChangeAction.Delete)) { return 11; } } else if (entity.getType().equals(EntityType.Way)) { if (action.equals(ChangeAction.Create)) { return 3; } if (action.equals(ChangeAction.Modify)) { return 6; } if (action.equals(ChangeAction.Delete)) { return 10; } } else if (entity.getType().equals(EntityType.Relation)) { if (action.equals(ChangeAction.Create)) { return 4; } if (action.equals(ChangeAction.Modify)) { return 5; } if (action.equals(ChangeAction.Delete)) { return 9; } } throw new OsmosisRuntimeException( "The change entity with action " + action + " type " + entity.getType() + " and id " + entity.getId() + " was not recognised." ); } /** * {@inheritDoc} */ public int compare(ChangeContainer o1, ChangeContainer o2) { return calculateSortWeight(o1) - calculateSortWeight(o2); } }