All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertigo.vega.plugins.webservice.handler.ValidatorWebServiceHandlerPlugin Maven / Gradle / Ivy

The newest version!
/**
 * vertigo - simple java starter
 *
 * Copyright (C) 2013, KleeGroup, [email protected] (http://www.kleegroup.com)
 * KleeGroup, Centre d'affaire la Boursidiere - BP 159 - 92357 Le Plessis Robinson Cedex - France
 *
 * 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.
 */
package io.vertigo.vega.plugins.webservice.handler;

import io.vertigo.dynamo.domain.model.DtList;
import io.vertigo.dynamo.domain.model.DtObject;
import io.vertigo.util.ClassUtil;
import io.vertigo.vega.engines.webservice.json.UiList;
import io.vertigo.vega.engines.webservice.json.UiListDelta;
import io.vertigo.vega.engines.webservice.json.UiObject;
import io.vertigo.vega.impl.webservice.WebServiceHandlerPlugin;
import io.vertigo.vega.webservice.exception.SessionException;
import io.vertigo.vega.webservice.metamodel.WebServiceDefinition;
import io.vertigo.vega.webservice.metamodel.WebServiceParam;
import io.vertigo.vega.webservice.model.DtListDelta;
import io.vertigo.vega.webservice.model.ExtendedObject;
import io.vertigo.vega.webservice.validation.DtObjectValidator;
import io.vertigo.vega.webservice.validation.UiMessageStack;
import io.vertigo.vega.webservice.validation.ValidationUserException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import spark.Request;
import spark.Response;

/**
 * Params handler. Extract and Json convert.
 * @author npiedeloup
 */
public final class ValidatorWebServiceHandlerPlugin implements WebServiceHandlerPlugin {

	/** {@inheritDoc} */
	@Override
	public boolean accept(final WebServiceDefinition webServiceDefinition) {
		return true;
	}

	/** {@inheritDoc}  */
	@Override
	public Object handle(final Request request, final Response response, final WebServiceCallContext routeContext, final HandlerChain chain) throws SessionException {
		final WebServiceDefinition webServiceDefinition = routeContext.getWebServiceDefinition();
		final UiMessageStack uiMessageStack = routeContext.getUiMessageStack();
		for (final WebServiceParam webServiceParam : webServiceDefinition.getWebServiceParams()) {
			final Object value = routeContext.getParamValue(webServiceParam);
			validateParam(value, uiMessageStack, webServiceParam, routeContext);
		}
		if (uiMessageStack.hasErrors()) {
			throw new ValidationUserException();
		}
		return chain.handle(request, response, routeContext);
	}

	private void validateParam(final Object value, final UiMessageStack uiMessageStack, final WebServiceParam webServiceParam, final WebServiceCallContext routeContext) {
		if (value instanceof UiObject) {
			final UiObject uiObject = (UiObject) value;
			final List> dtObjectValidators = obtainDtObjectValidators(webServiceParam);
			//Only authorized fields have already been checked (JsonConverterHandler)
			final DtObject updatedDto = uiObject.mergeAndCheckInput(dtObjectValidators, uiMessageStack);
			routeContext.registerUpdatedDto(webServiceParam, uiObject.getInputKey(), updatedDto);
		} else if (value instanceof UiListDelta) {
			final UiListDelta uiListDelta = (UiListDelta) value;
			final List> dtObjectValidators = obtainDtObjectValidators(webServiceParam);
			final Map contextKeyMap = new HashMap<>();

			//Only authorized fields have already been checked (JsonConverterHandler)
			final DtList dtListCreates = mergeAndCheckInput(uiListDelta.getObjectType(), uiListDelta.getCreatesMap(), dtObjectValidators, uiMessageStack, contextKeyMap);
			final DtList dtListUpdates = mergeAndCheckInput(uiListDelta.getObjectType(), uiListDelta.getUpdatesMap(), dtObjectValidators, uiMessageStack, contextKeyMap);
			final DtList dtListDeletes = mergeAndCheckInput(uiListDelta.getObjectType(), uiListDelta.getDeletesMap(), dtObjectValidators, uiMessageStack, contextKeyMap);
			final DtListDelta dtListDelta = new DtListDelta<>(dtListCreates, dtListUpdates, dtListDeletes);
			routeContext.registerUpdatedDtListDelta(webServiceParam, dtListDelta, contextKeyMap);
		} else if (value instanceof UiList) {
			final UiList uiList = (UiList) value;
			final List> dtObjectValidators = obtainDtObjectValidators(webServiceParam);
			final Map contextKeyMap = new HashMap<>();

			//Only authorized fields have already been checked (JsonConverterHandler)
			final DtList dtList = mergeAndCheckInput(uiList.getObjectType(), uiList, dtObjectValidators, uiMessageStack, contextKeyMap);
			routeContext.registerUpdatedDtList(webServiceParam, dtList, contextKeyMap);
		} else if (value instanceof ExtendedObject) {
			final ExtendedObject extendedObject = (ExtendedObject) value;
			validateParam(extendedObject.getInnerObject(), uiMessageStack, webServiceParam, routeContext);
			final Object updatedValue = routeContext.getParamValue(webServiceParam);
			final ExtendedObject updatedExtendedObject = new ExtendedObject(updatedValue);
			updatedExtendedObject.putAll(extendedObject);
			routeContext.setParamValue(webServiceParam, updatedExtendedObject);
		}
	}

	private static List> obtainDtObjectValidators(final WebServiceParam webServiceParam) {
		final List> dtObjectValidatorClasses = webServiceParam.getDtObjectValidatorClasses();
		final List> dtObjectValidators = new ArrayList<>(dtObjectValidatorClasses.size());
		for (final Class dtObjectValidatorClass : dtObjectValidatorClasses) {
			dtObjectValidators.add(ClassUtil.newInstance(dtObjectValidatorClass));
		}
		return dtObjectValidators;
	}

	private static  DtList mergeAndCheckInput(final Class objectType, final Map> uiObjectMap, final List> dtObjectValidators, final UiMessageStack uiMessageStack, final Map contextKeyMap) {
		final DtList dtList = new DtList<>(objectType);
		for (final Map.Entry> entry : uiObjectMap.entrySet()) {
			final D dto = entry.getValue().mergeAndCheckInput(dtObjectValidators, uiMessageStack);
			dtList.add(dto);
			contextKeyMap.put(entry.getValue().getInputKey(), dto);
		}
		return dtList;
	}

	private static  DtList mergeAndCheckInput(final Class objectType, final UiList uiList, final List> dtObjectValidators, final UiMessageStack uiMessageStack, final Map contextKeyMap) {
		final DtList dtList = new DtList<>(objectType);
		for (final UiObject element : uiList) {
			final D dto = element.mergeAndCheckInput(dtObjectValidators, uiMessageStack);
			dtList.add(dto);
			contextKeyMap.put(element.getInputKey(), dto);
		}
		return dtList;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy