Commit 3a892cba authored by Noel Alonso's avatar Noel Alonso
Browse files

Añade repositorio y servicio de vessel tracking

parent f71e774c
Loading
Loading
Loading
Loading
+152 −0
Original line number Diff line number Diff line
package es.redmic.vesselsview.repository.vesseltracking;

import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.elasticsearch.action.search.MultiSearchRequestBuilder;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.MultiSearchResponse.Item;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.stereotype.Repository;

import es.redmic.elasticsearchlib.geodata.repository.RWGeoDataESRepository;
import es.redmic.exception.common.ExceptionType;
import es.redmic.models.es.common.dto.EventApplicationResult;
import es.redmic.models.es.common.query.dto.DataQueryDTO;
import es.redmic.vesselsview.model.vessel.Vessel;
import es.redmic.vesselsview.model.vesseltracking.VesselTracking;
import es.redmic.viewlib.geodata.repository.IGeoDataRepository;

@Repository
public class VesselTrackingESRepository extends RWGeoDataESRepository<VesselTracking, DataQueryDTO>
		implements IGeoDataRepository<VesselTracking, DataQueryDTO> {

	private static String[] INDEX = { "vessel" };
	private static String[] TYPE = { "tracking" };

	// @formatter:off
 
		private final String ID_PROPERTY = "id",
				UUID_PROPERTY = "uuid",
				MMSI_PROPERTY = "properties.vessel.mmsi.id",
				DATE_PROPERTY = "properties.date";
	// @formatter:on

	public VesselTrackingESRepository() {
		super(INDEX, TYPE);
	}

	@SuppressWarnings("unchecked")
	public EventApplicationResult updateVesselTypeInVessel(String vesselTrackingId, Vessel vessel) {

		XContentBuilder doc;

		try {
			doc = jsonBuilder().startObject().field("type", objectMapper.convertValue(vessel, Map.class)).endObject();
		} catch (IllegalArgumentException | IOException e1) {
			LOGGER.debug("Error modificando el item con id " + vesselTrackingId + " en " + getIndex()[0] + " "
					+ getType()[0]);
			return new EventApplicationResult(ExceptionType.ES_UPDATE_DOCUMENT.toString());
		}

		return update(vesselTrackingId, doc);
	}

	@Override
	protected EventApplicationResult checkInsertConstraintsFulfilled(VesselTracking modelToIndex) {

		// @formatter:off

		QueryBuilder idTerm = QueryBuilders.termQuery(ID_PROPERTY, modelToIndex.getId()),
				uuidTerm = QueryBuilders.termQuery(UUID_PROPERTY, modelToIndex.getUuid());
		
		SearchRequestBuilder requestBuilderId = ESProvider.getClient().prepareSearch(getIndex()).setTypes(getType())
				.setQuery(idTerm).setSize(1),
			requestBuilderUuid = ESProvider.getClient().prepareSearch(getIndex()).setTypes(getType())
				.setQuery(uuidTerm).setSize(1);

		MultiSearchRequestBuilder multiSearchRequestBuilder = ESProvider.getClient().prepareMultiSearch()
			.add(requestBuilderId)
			.add(requestBuilderUuid);
		
		MultiSearchResponse sr = multiSearchRequestBuilder.get();

		// @formatter:on

		Map<String, String> arguments = new HashMap<>();

		Item[] responses = sr.getResponses();

		if (responses != null && responses[0].getResponse().getHits().getTotalHits() > 0) {
			arguments.put(ID_PROPERTY, modelToIndex.getId());
		}

		if (responses != null && responses[1].getResponse().getHits().getTotalHits() > 0) {
			arguments.put(UUID_PROPERTY, modelToIndex.getUuid().toString());
		}

		if (arguments.size() > 0) {
			return new EventApplicationResult(ExceptionType.ES_INSERT_DOCUMENT.toString(), arguments);
		}

		return new EventApplicationResult(true);
	}

	@Override
	protected EventApplicationResult checkUpdateConstraintsFulfilled(VesselTracking modelToIndex) {

		// @formatter:off

		BoolQueryBuilder idTerm = QueryBuilders.boolQuery()
				.must(QueryBuilders.termQuery(ID_PROPERTY, modelToIndex.getId()))
				.mustNot(QueryBuilders.termQuery(UUID_PROPERTY, modelToIndex.getUuid())),
				
				mmsiTerm = QueryBuilders.boolQuery()
					.must(QueryBuilders.termQuery(MMSI_PROPERTY, modelToIndex.getProperties().getVessel().getMmsi()))
					.must(QueryBuilders.termQuery(DATE_PROPERTY, modelToIndex.getProperties().getDate()))
					.mustNot(QueryBuilders.termQuery(ID_PROPERTY, modelToIndex.getId()));
		
		SearchRequestBuilder requestBuilderId = ESProvider.getClient().prepareSearch(getIndex()).setTypes(getType())
				.setQuery(idTerm).setSize(1),
			requestBuilderMmsi = ESProvider.getClient().prepareSearch(getIndex()).setTypes(getType())
				.setQuery(mmsiTerm).setSize(1);

		MultiSearchRequestBuilder multiSearchRequestBuilder = ESProvider.getClient().prepareMultiSearch()
			.add(requestBuilderId)
			.add(requestBuilderMmsi);
		
		MultiSearchResponse sr = multiSearchRequestBuilder.get();

		// @formatter:on

		Map<String, String> arguments = new HashMap<>();

		Item[] responses = sr.getResponses();

		if (responses != null && responses[0].getResponse().getHits().getTotalHits() > 0) {
			arguments.put(ID_PROPERTY, modelToIndex.getId().toString());
		}

		if (responses != null && responses[1].getResponse().getHits().getTotalHits() > 0) {
			arguments.put(MMSI_PROPERTY, modelToIndex.getProperties().getVessel().getMmsi().toString());
		}

		if (arguments.size() > 0) {
			return new EventApplicationResult(ExceptionType.ES_UPDATE_DOCUMENT.toString(), arguments);
		}

		return new EventApplicationResult(true);
	}

	@Override
	protected EventApplicationResult checkDeleteConstraintsFulfilled(String modelToIndexId) {
		return new EventApplicationResult(true);
	}
}
+77 −0
Original line number Diff line number Diff line
package es.redmic.vesselsview.service.vesseltracking;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import es.redmic.models.es.common.dto.EventApplicationResult;
import es.redmic.models.es.common.query.dto.DataQueryDTO;
import es.redmic.vesselslib.dto.tracking.VesselTrackingDTO;
import es.redmic.vesselsview.model.vessel.Vessel;
import es.redmic.vesselsview.model.vesseltracking.VesselTracking;
import es.redmic.vesselsview.repository.vesseltracking.VesselTrackingESRepository;
import es.redmic.viewlib.geodata.service.RWGeoDataService;

@Service
public class VesselTrackingESService extends RWGeoDataService<VesselTracking, VesselTrackingDTO, DataQueryDTO> {

	VesselTrackingESRepository repository;

	@Autowired
	public VesselTrackingESService(VesselTrackingESRepository repository) {
		super(repository);
		this.repository = repository;
	}

	public EventApplicationResult updateVesselInVesselTracking(String vesselTrackingId, Vessel model) {
		return repository.updateVesselTypeInVessel(vesselTrackingId, model);
	}

	@Override
	protected String[] getDefaultSearchFields() {
		// @formatter:off
		return new String[] {
			"properties.dest",
			"properties.vessel.name",
			"properties.vessel.mmsi",
			"properties.vessel.imo",
			"properties.vessel.type.name",
			"properties.vessel.type.name_en",
			
			"properties.dest.suggest",
			"properties.vessel.name.suggest",
			"properties.vessel.mmsi.suggest",
			"properties.vessel.imo.suggest",
			"properties.vessel.type.name.suggest",
			"properties.vessel.type.name_en.suggest"
		};
		// @formatter:on
	}

	@Override
	protected String[] getDefaultHighlightFields() {
		// @formatter:off
		return new String[] {
			"properties.dest.suggest",
			"properties.vessel.name.suggest",
			"properties.vessel.mmsi.suggest",
			"properties.vessel.imo.suggest",
			"properties.vessel.type.name.suggest",
			"properties.vessel.type.name_en.suggest"
		};
		// @formatter:on
	}

	@Override
	protected String[] getDefaultSuggestFields() {
		// @formatter:off
		return new String[] {
			"properties.dest",
			"properties.vessel.name",
			"properties.vessel.mmsi",
			"properties.vessel.imo",
			"properties.vessel.type.name",
			"properties.vessel.type.name_en"
		};
		// @formatter:on
	}
}