package org.mongodb.morphia.geo; import com.mongodb.BasicDBObject; import org.mongodb.morphia.converters.SimpleValueConverter; import org.mongodb.morphia.converters.TypeConverter; import org.mongodb.morphia.mapping.MappedField; /** * A Morphia TypeConverter that knows how to turn things that are labelled with the Geometry interface into the correct concrete class, * based on the GeoJSON type. * <p/> * Only implements the decode method as the concrete classes can encode themselves without needing a converter. It's when they come out of * the database that there's not enough information for Morphia to automatically create Geometry instances. */ public class NamedCoordinateReferenceSystemConverter extends TypeConverter implements SimpleValueConverter { /** * Sets up this converter to work with things that implement the Geometry interface */ public NamedCoordinateReferenceSystemConverter() { super(NamedCoordinateReferenceSystem.class); } @Override public Object decode(final Class<?> targetClass, final Object fromDBObject, final MappedField optionalExtraInfo) { throw new UnsupportedOperationException("We should never need to decode these"); } @Override public Object encode(final Object value, final MappedField optionalExtraInfo) { NamedCoordinateReferenceSystem crs = (NamedCoordinateReferenceSystem) value; final BasicDBObject dbObject = new BasicDBObject("type", crs.getType().getTypeName()); dbObject.put("properties", new BasicDBObject("name", crs.getName())); return dbObject; } @Override protected boolean isSupported(final Class<?> c, final MappedField optionalExtraInfo) { return CoordinateReferenceSystem.class.isAssignableFrom(c); } }