package mapper; import api.v1.*; import com.ibm.util.CoordinateConversion; import exceptions.PoseidonException; import models.PositionModel; import models.PositionTagModel; import play.mvc.Http; import java.util.*; public class PositionMapper { public List<Position> mapToApi(List<PositionModel> mPositions) { List<Position> PositionList = new ArrayList<>(); for (PositionModel mPosition : mPositions) { Position Position = mapToApi(mPosition); PositionList.add(Position); } return PositionList; } public Position mapToApi(PositionModel mPosition) { Position position = null; if ( mPosition != null ) { position = new Position(); position.id = mPosition.id; position.name = mPosition.name; position.alias = mPosition.alias; position.dec = new PositionDecimalDegrees(); position.dec.setLatitude(mPosition.latitude); position.dec.setLongitude(mPosition.longitude); position.isDeletable = mPosition.isDeletable; CoordinateConversion coordinateConversion = new CoordinateConversion(); double[] dms = coordinateConversion.latLon2dms(mPosition.latitude, mPosition.longitude); position.dms = new PositionDMS(); position.dms.latDirection = dms[0] >= 0.0 ? "N":"S"; position.dms.latDeg = (int) Math.abs(dms[0]); position.dms.latMin = (int) dms[1]; position.dms.latSec = (int) dms[2]; position.utm = new PositionUTM(); position.dms.longDirection = dms[3] >= 0.0 ? "E":"W"; position.dms.longDeg = (int) Math.abs(dms[3]); position.dms.longMin = (int) dms[4]; position.dms.longSec = (int) dms[5]; CoordinateConversion.UTM utm = coordinateConversion.latLon2UTM(mPosition.latitude, mPosition.longitude); position.utm = convertUTM(utm); if (mPosition.tags != null && mPosition.tags.size() > 0) { position.tags = new PositionTag[mPosition.tags.size()]; } else { position.tags = new PositionTag[0]; } int i = 0; for (Iterator<PositionTagModel> itr = mPosition.tags.iterator(); itr.hasNext(); i++) { PositionTagModel tagModel = itr.next(); int numPositionsWithThisTag = tagModel.positionModels != null ? tagModel.positionModels.size():0; position.tags[i] = new PositionTag(tagModel.id, tagModel.name, numPositionsWithThisTag); } } return position; } private PositionUTM convertUTM(CoordinateConversion.UTM utm) { PositionUTM result = new PositionUTM(); result.zone = utm.zone; result.band = utm.band; result.easting = utm.easting; result.northing = utm.northing; return result; } private CoordinateConversion.UTM convertUTM(PositionUTM utm) { CoordinateConversion.UTM result = new CoordinateConversion.UTM(); result.zone = utm.zone; result.band = utm.band; result.northing= utm.northing; result.easting= utm.easting; return result; } private CoordinateConversion.DMS convertGMS(PositionDMS gms) { CoordinateConversion.DMS result = new CoordinateConversion.DMS(); result.latD = gms.latDeg; result.latM = gms.latMin; result.latS = gms.latSec; result.latDirection = gms.latDirection; result.lngD = gms.longDeg; result.lngM = gms.longMin; result.lngS = gms.longSec; result.longDirection = gms.longDirection; return result; } public PositionModel mapToModel(Position aPosition) { PositionModel model = new PositionModel(); if (aPosition == null) { return null; } if (aPosition.id != null) { model.id = aPosition.id; } model.name = aPosition.name; model.alias= aPosition.alias; model.isDeletable = aPosition.isDeletable; mapCoordinate(aPosition, model); if ( aPosition.tags != null ) { model.tags = new ArrayList<>(); for(PositionTag tag : aPosition.tags){ PositionTagModel mTag = PositionTagModel.findByName(tag.name); if ( mTag == null) { mTag = new PositionTagModel(); mTag.name = tag.name; } model.tags.add(mTag); } } return model; } public void mapCoordinate(Position aPosition, PositionModel model) { CoordinateConversion coordinateConversion = new CoordinateConversion(); switch (aPosition.coordinateFormat){ case DEGREES_MINUTES_SECONDS: if ( aPosition.dms == null) throw new PoseidonException(Http.Status.BAD_REQUEST,"Ugyldig koordinat"); CoordinateConversion.DMS DMS = convertGMS(aPosition.dms); double[] latlonDms = coordinateConversion.dms2LatLon(DMS); model.latitude = latlonDms[0]; model.longitude = latlonDms[1]; break; case UTM: if ( aPosition.utm == null) throw new PoseidonException(Http.Status.BAD_REQUEST,"Ugyldig koordinat"); CoordinateConversion.UTM utm = convertUTM(aPosition.utm); double[] latlonUtm = coordinateConversion.utm2LatLon(utm); model.latitude = latlonUtm[0]; model.longitude = latlonUtm[1]; break; case DECIMAL_DEGREES: default: if ( aPosition.dec == null) throw new PoseidonException(Http.Status.BAD_REQUEST,"Ugyldig koordinat"); model.latitude = aPosition.dec.getLatitude(); model.longitude = aPosition.dec.getLongitude(); } } }