Commit 5aca2908 authored by Noel Alonso's avatar Noel Alonso
Browse files

Añade componentes para tratar capas del atlas

De esta manera de puede añadir/editar/borrar capas mediante eventos vía
kafka o realizar consultas vía rest
parent bae43297
Loading
Loading
Loading
Loading
+138 −0
Original line number Diff line number Diff line
package es.redmic.atlasview.controller.layer;

/*-
 * #%L
 * Atlas-query-endpoint
 * %%
 * Copyright (C) 2019 REDMIC Project / Server
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.annotation.KafkaHandler;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import es.redmic.atlaslib.dto.layer.LayerDTO;
import es.redmic.atlaslib.events.layer.LayerEventFactory;
import es.redmic.atlaslib.events.layer.LayerEventTypes;
import es.redmic.atlaslib.events.layer.create.CreateLayerConfirmedEvent;
import es.redmic.atlaslib.events.layer.create.CreateLayerEvent;
import es.redmic.atlaslib.events.layer.delete.DeleteLayerConfirmedEvent;
import es.redmic.atlaslib.events.layer.delete.DeleteLayerEvent;
import es.redmic.atlaslib.events.layer.update.UpdateLayerConfirmedEvent;
import es.redmic.atlaslib.events.layer.update.UpdateLayerEvent;
import es.redmic.atlasview.config.MapperScanBean;
import es.redmic.atlasview.model.layer.Layer;
import es.redmic.atlasview.service.layer.LayerESService;
import es.redmic.exception.common.ExceptionType;
import es.redmic.models.es.common.dto.EventApplicationResult;
import es.redmic.models.es.common.query.dto.SimpleQueryDTO;
import es.redmic.viewlib.data.controller.DataController;

@Controller
@RequestMapping(value = "${controller.mapping.LAYER}")
@KafkaListener(topics = "${broker.topic.layer}")
public class LayerController extends DataController<Layer, LayerDTO, SimpleQueryDTO> {

	@Value("${broker.topic.layer}")
	private String layer_topic;

	@Autowired
	protected MapperScanBean mapper;

	LayerESService service;

	public LayerController(LayerESService service) {
		super(service);
		this.service = service;
	}

	@KafkaHandler
	public void listen(CreateLayerEvent event) {

		EventApplicationResult result = null;

		String parentId = event.getLayer().getParent() != null ? event.getLayer().getParent().getId() : null;

		try {
			result = service.save(mapper.getMapperFacade().map(event.getLayer(), Layer.class), parentId);
		} catch (Exception e) {
			e.printStackTrace();
			publishFailedEvent(LayerEventFactory.getEvent(event, LayerEventTypes.CREATE_FAILED,
					ExceptionType.INTERNAL_EXCEPTION.name(), null), layer_topic);
			return;
		}

		if (result.isSuccess()) {
			publishConfirmedEvent(new CreateLayerConfirmedEvent().buildFrom(event), layer_topic);
		} else {
			publishFailedEvent(LayerEventFactory.getEvent(event, LayerEventTypes.CREATE_FAILED,
					result.getExeptionType(), result.getExceptionArguments()), layer_topic);
		}
	}

	@KafkaHandler
	public void listen(UpdateLayerEvent event) {

		EventApplicationResult result = null;

		String parentId = event.getLayer().getParent() != null ? event.getLayer().getParent().getId() : null;

		try {
			result = service.update(mapper.getMapperFacade().map(event.getLayer(), Layer.class), parentId);
		} catch (Exception e) {
			e.printStackTrace();
			publishFailedEvent(LayerEventFactory.getEvent(event, LayerEventTypes.UPDATE_FAILED,
					ExceptionType.INTERNAL_EXCEPTION.name(), null), layer_topic);
			return;
		}

		if (result.isSuccess()) {
			publishConfirmedEvent(new UpdateLayerConfirmedEvent().buildFrom(event), layer_topic);
		} else {
			publishFailedEvent(LayerEventFactory.getEvent(event, LayerEventTypes.UPDATE_FAILED,
					result.getExeptionType(), result.getExceptionArguments()), layer_topic);
		}
	}

	@KafkaHandler
	public void listen(DeleteLayerEvent event) {

		EventApplicationResult result = null;

		try {
			result = service.delete(event.getAggregateId(), event.getParentId());
		} catch (Exception e) {
			e.printStackTrace();
			publishFailedEvent(LayerEventFactory.getEvent(event, LayerEventTypes.DELETE_FAILED,
					ExceptionType.INTERNAL_EXCEPTION.name(), null), layer_topic);
			return;
		}

		if (result.isSuccess()) {
			publishConfirmedEvent(new DeleteLayerConfirmedEvent().buildFrom(event), layer_topic);
		} else {
			publishFailedEvent(LayerEventFactory.getEvent(event, LayerEventTypes.DELETE_FAILED,
					result.getExeptionType(), result.getExceptionArguments()), layer_topic);
		}
	}

	@KafkaHandler(isDefault = true)
	public void listenDefualt(Object event) {
	}
}
+160 −0
Original line number Diff line number Diff line
package es.redmic.atlasview.repository.layer;

/*-
 * #%L
 * Atlas-query-endpoint
 * %%
 * Copyright (C) 2019 REDMIC Project / Server
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

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

import org.elasticsearch.action.search.MultiSearchRequest;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.elasticsearch.action.search.MultiSearchResponse.Item;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Repository;

import es.redmic.atlasview.model.layer.Layer;
import es.redmic.elasticsearchlib.data.repository.RWDataESRepository;
import es.redmic.exception.common.ExceptionType;
import es.redmic.exception.elasticsearch.ESQueryException;
import es.redmic.models.es.common.dto.EventApplicationResult;
import es.redmic.models.es.common.query.dto.SimpleQueryDTO;
import es.redmic.viewlib.data.repository.IDataRepository;

@Repository
public class LayerESRepository extends RWDataESRepository<Layer, SimpleQueryDTO>
		implements IDataRepository<Layer, SimpleQueryDTO> {

	private static String[] INDEX = { "layer" };
	private static String TYPE = "_doc";

	// @formatter:off
	
	private final String ID_PROPERTY = "id",
			NAME_PROPERTY = "name",
			URL_SOURCE_PROPERTY = "urlSource";
	// @formatter:on

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

	@Override
	protected EventApplicationResult checkInsertConstraintsFulfilled(Layer modelToIndex) {

		QueryBuilder idTerm = QueryBuilders.termQuery(ID_PROPERTY, modelToIndex.getId()),
				nameAndUrlSourceTerm = QueryBuilders.boolQuery()
						.must(QueryBuilders.termQuery(NAME_PROPERTY, modelToIndex.getName()))
						.must(QueryBuilders.termQuery(URL_SOURCE_PROPERTY, modelToIndex.getUrlSource()));

		MultiSearchRequest request = new MultiSearchRequest();

		SearchSourceBuilder requestBuilderId = new SearchSourceBuilder().query(idTerm).size(1),
				requestBuilderNameAndUrlSource = new SearchSourceBuilder().query(nameAndUrlSourceTerm).size(1);

		request.add(new SearchRequest().indices(getIndex()).source(requestBuilderId))
				.add(new SearchRequest().indices(getIndex()).source(requestBuilderNameAndUrlSource));

		MultiSearchResponse sr;
		try {
			sr = ESProvider.getClient().msearch(request, RequestOptions.DEFAULT);
		} catch (IOException e) {
			e.printStackTrace();
			throw new ESQueryException();
		}

		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(NAME_PROPERTY, modelToIndex.getName());
			arguments.put(URL_SOURCE_PROPERTY, modelToIndex.getUrlSource());
		}

		if (arguments.size() > 0) {
			LOGGER.error(
					"No se puede modificar ya que incumple las restricciones de los datos " + arguments.toString());
			return new EventApplicationResult(ExceptionType.ES_INSERT_DOCUMENT.toString(), arguments);
		}

		return new EventApplicationResult(true);
	}

	@Override
	protected EventApplicationResult checkUpdateConstraintsFulfilled(Layer modelToIndex) {
		// @formatter:off
		
		BoolQueryBuilder nameAndUrlSourceTerm = QueryBuilders.boolQuery()
				.must(QueryBuilders.boolQuery()
						.must(QueryBuilders.termQuery(NAME_PROPERTY, modelToIndex.getName()))
						.must(QueryBuilders.termQuery(URL_SOURCE_PROPERTY, modelToIndex.getUrlSource())))
				.mustNot(QueryBuilders.termQuery(ID_PROPERTY, modelToIndex.getId()));
		
		MultiSearchRequest request = new MultiSearchRequest();
		
		SearchSourceBuilder requestBuilder = new SearchSourceBuilder().query(nameAndUrlSourceTerm).size(1);
		
		request.add(new SearchRequest().indices(getIndex()).source(requestBuilder));
		
		// @formatter:on

		MultiSearchResponse sr;
		try {
			sr = ESProvider.getClient().msearch(request, RequestOptions.DEFAULT);
		} catch (IOException e) {
			e.printStackTrace();
			throw new ESQueryException();
		}

		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());
			arguments.put(NAME_PROPERTY, modelToIndex.getName());
			arguments.put(URL_SOURCE_PROPERTY, modelToIndex.getUrlSource());
		}

		if (arguments.size() > 0) {
			LOGGER.error(
					"No se puede modificar ya que incumple las restricciones de los datos " + arguments.toString());
			return new EventApplicationResult(ExceptionType.ES_UPDATE_DOCUMENT.toString(), arguments);
		}

		return new EventApplicationResult(true);
	}

	@Override
	protected EventApplicationResult checkDeleteConstraintsFulfilled(String modelToIndexId) {

		return new EventApplicationResult(true);
	}
}
+55 −0
Original line number Diff line number Diff line
package es.redmic.atlasview.service.layer;

/*-
 * #%L
 * Atlas-query-endpoint
 * %%
 * Copyright (C) 2019 REDMIC Project / Server
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

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

import es.redmic.atlaslib.dto.layer.LayerDTO;
import es.redmic.atlasview.model.layer.Layer;
import es.redmic.atlasview.repository.layer.LayerESRepository;
import es.redmic.models.es.common.dto.EventApplicationResult;
import es.redmic.models.es.common.query.dto.SimpleQueryDTO;
import es.redmic.viewlib.data.service.RDataService;

@Service
public class LayerESService extends RDataService<Layer, LayerDTO, SimpleQueryDTO> {

	LayerESRepository repository;

	@Autowired
	public LayerESService(LayerESRepository repository) {
		super(repository);
		this.repository = repository;
	}

	public EventApplicationResult save(Layer model, String parentId) {
		return repository.save(model, parentId);
	}

	public EventApplicationResult update(Layer model, String parentId) {
		return repository.update(model, parentId);
	}

	public EventApplicationResult delete(String id, String parentId) {
		return repository.delete(id, parentId);
	}
}
+2 −2
Original line number Diff line number Diff line
@@ -71,8 +71,8 @@ controller.mapping.CATEGORY=/category

controller.mapping.FILTER_SCHEMA=/_search/_schema

#topic del broker para enviar/recibir eventos de atlas
broker.topic.atlas=atlas
#topic del broker para enviar/recibir eventos de layers
broker.topic.layer=layer

#topic del broker para enviar/recibir eventos de theme inspire
broker.topic.theme-inspire=theme-inspire