Package org.openstreetmap.osmosis.core.sort.v0_6

Source Code of org.openstreetmap.osmosis.core.sort.v0_6.ChangeForSeekableApplierComparator

// 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);
  }

}
TOP

Related Classes of org.openstreetmap.osmosis.core.sort.v0_6.ChangeForSeekableApplierComparator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.