// This software is released into the Public Domain. See copying.txt for details.
package org.openstreetmap.osmosis.xml.v0_6.impl;
import java.io.Writer;
import org.openstreetmap.osmosis.core.container.v0_6.ChangeContainer;
import org.openstreetmap.osmosis.core.OsmosisConstants;
import org.openstreetmap.osmosis.core.OsmosisRuntimeException;
import org.openstreetmap.osmosis.core.task.common.ChangeAction;
import org.openstreetmap.osmosis.xml.common.ElementWriter;
/**
* Renders OSM changes as xml.
*
* @author Brett Henderson
*/
public class OsmChangeWriter extends ElementWriter {
/**
* The OsmWriter to use for created elements.
*/
private OsmWriter osmCreateWriter;
/**
* The OsmWriter to use for modified elements.
*/
private OsmWriter osmModifyWriter;
/**
* The OsmWriter to use for deleted elements.
*/
private OsmWriter osmDeleteWriter;
/**
* @see #updateActiveOsmWriter(ChangeAction)
*/
private OsmWriter activeOsmWriter;
/**
* The last action (add, modify, delete)
* that we processed.
*/
private ChangeAction lastAction;
/**
* Creates a new instance that
* starts with an <osmChange> -element
* at indent-level 0.
*/
public OsmChangeWriter() {
this("osmChange", 0);
}
/**
* Creates a new instance.
*
* @param elementName
* The name of the element to be written.
* @param indentLevel
* The indent level of the element.
*/
public OsmChangeWriter(final String elementName, final int indentLevel) {
super(elementName, indentLevel);
osmCreateWriter = new OsmWriter("create", indentLevel + 1, false, false);
osmModifyWriter = new OsmWriter("modify", indentLevel + 1, false, false);
osmDeleteWriter = new OsmWriter("delete", indentLevel + 1, false, false);
activeOsmWriter = null;
lastAction = null;
}
/**
* {@inheritDoc}
*/
@Override
public void setWriter(final Writer aWriter) {
super.setWriter(aWriter);
this.osmCreateWriter.setWriter(aWriter);
this.osmModifyWriter.setWriter(aWriter);
this.osmDeleteWriter.setWriter(aWriter);
}
/**
* Begins an <osmchange>-element.
*/
public void begin() {
beginOpenElement();
addAttribute("version", XmlConstants.OSM_VERSION);
addAttribute("generator", "Osmosis " + OsmosisConstants.VERSION);
endOpenElement(false);
}
/**
* Ends an <osmchange>-element.
*/
public void end() {
if (activeOsmWriter != null) {
activeOsmWriter.end();
activeOsmWriter = null;
}
lastAction = null;
closeElement();
}
/**
* Returns the appropriate osm writer for the particular change type.
*
* @param action
* The change action to be performed.
* @return The osm writer for the change type.
*/
private OsmWriter getWriterForAction(final ChangeAction action) {
if (action.equals(ChangeAction.Create)) {
return osmCreateWriter;
} else if (action.equals(ChangeAction.Modify)) {
return osmModifyWriter;
} else if (action.equals(ChangeAction.Delete)) {
return osmDeleteWriter;
} else {
throw new OsmosisRuntimeException("The change action " + action + " is not recognised.");
}
}
/**
* Switch to another type of change.
* @param action the action to apply to the next elements.
*/
private void updateActiveOsmWriter(final ChangeAction action) {
if (action != lastAction) {
if (activeOsmWriter != null) {
activeOsmWriter.end();
}
activeOsmWriter = getWriterForAction(action);
activeOsmWriter.begin();
lastAction = action;
}
}
/**
* Writes the change in the container.
*
* @param changeContainer
* The container holding the change.
*/
public void process(final ChangeContainer changeContainer) {
updateActiveOsmWriter(changeContainer.getAction());
activeOsmWriter.process(changeContainer.getEntityContainer());
}
}