
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 extends DtObjectValidator> 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