| /* | |
| * Copyright 2010 Google Inc. | |
| * | |
| * 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 com.google.web.bindery.requestfactory.shared; | |
| import com.google.web.bindery.autobean.shared.AutoBean; | |
| import com.google.web.bindery.autobean.shared.AutoBeanUtils; | |
| import com.google.web.bindery.requestfactory.shared.impl.Constants; | |
| import java.util.Collections; | |
| import java.util.HashSet; | |
| import java.util.Set; | |
| import javax.validation.ConstraintViolation; | |
| /** | |
| * Callback object for {@link Request#fire(Receiver)} and | |
| * {@link RequestContext#fire(Receiver)}. | |
| * | |
| * @param <V> value type | |
| */ | |
| public abstract class Receiver<V> { | |
| /** | |
| * Receives general failure notifications. The default implementation looks at | |
| * {@link ServerFailure#isFatal()}, and throws a runtime exception with the | |
| * failure object's error message if it is true. | |
| * | |
| * @param error a {@link ServerFailure} instance | |
| */ | |
| public void onFailure(ServerFailure error) { | |
| if (error.isFatal()) { | |
| throw new RuntimeException(error.getMessage()); | |
| } | |
| } | |
| /** | |
| * Called when a Request has been successfully executed on the server. | |
| * | |
| * @param response a response of type V | |
| */ | |
| public abstract void onSuccess(V response); | |
| /** | |
| * Called if an object sent to the server could not be validated. The default | |
| * implementation calls {@link #onFailure(ServerFailure)} if <code>errors | |
| * </code> is not empty. | |
| * | |
| * @param errors a Set of {@link Violation} instances | |
| * @deprecated Use {@link #onConstraintViolation(Set)} instead | |
| */ | |
| @Deprecated | |
| public void onViolation(Set<Violation> errors) { | |
| if (!errors.isEmpty()) { | |
| onFailure(new ServerFailure("The call failed on the server due to a ConstraintViolation")); | |
| } | |
| } | |
| /** | |
| * Called if an object sent to the server could not be validated. The default | |
| * implementation calls {@link #onViolation(Set)}, converting the | |
| * {@link ConstraintViolation} objects to the deprecated {@link Violation} | |
| * type. | |
| * | |
| * @param violations a Set of {@link ConstraintViolation} instances | |
| */ | |
| @SuppressWarnings("deprecation") | |
| public void onConstraintViolation(Set<ConstraintViolation<?>> violations) { | |
| Set<Violation> converted = new HashSet<Violation>(); | |
| for (final ConstraintViolation<?> v : violations) { | |
| converted.add(new Violation() { | |
| public BaseProxy getInvalidProxy() { | |
| return (BaseProxy) v.getRootBean(); | |
| } | |
| public String getMessage() { | |
| return v.getMessage(); | |
| } | |
| public BaseProxy getOriginalProxy() { | |
| AutoBean<? extends BaseProxy> parent = | |
| AutoBeanUtils.getAutoBean(v.getRootBean()).getTag(Constants.PARENT_OBJECT); | |
| return parent == null ? null : parent.as(); | |
| } | |
| public String getPath() { | |
| return v.getPropertyPath().toString(); | |
| } | |
| public EntityProxyId<?> getProxyId() { | |
| return v.getRootBean() instanceof EntityProxy ? ((EntityProxy) v.getRootBean()) | |
| .stableId() : null; | |
| } | |
| }); | |
| } | |
| onViolation(Collections.unmodifiableSet(converted)); | |
| } | |
| } |