/* * Copyright 2016 LinkedIn, 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.linkedin.restli.client; import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; import com.linkedin.data.template.RecordTemplate; import com.linkedin.r2.message.RequestContext; import com.linkedin.restli.client.config.RequestConfig; /** * Class used for deduplication. Two requests are considered equal * when Request and RequestContext objects are equal. */ class RestRequestBatchKey { private final Request<?> _request; private final RequestContext _requestContext; private final RequestConfig _bathcingConfig; private Set<String> _extractedIds; public RestRequestBatchKey(Request<Object> request, RequestContext requestContext, RequestConfig bathcingConfig) { _request = request; _requestContext = requestContext; _bathcingConfig = bathcingConfig; } public Request<?> getRequest() { return _request; } public RequestContext getRequestContext() { return _requestContext; } public RequestConfig getRequestConfig() { return _bathcingConfig; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((_request == null) ? 0 : _request.hashCode()); result = prime * result + ((_requestContext == null) ? 0 : _requestContext.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; RestRequestBatchKey other = (RestRequestBatchKey) obj; if (_request == null) { if (other._request != null) return false; } else if (!_request.equals(other._request)) return false; if (_requestContext == null) { if (other._requestContext != null) return false; } else if (!_requestContext.equals(other._requestContext)) return false; return true; } @Override public String toString() { return "RestRequestBatchKey [request=" + _request + ", requestContext=" + _requestContext + "]"; } public Set<String> ids() { if (_extractedIds == null) { _extractedIds = extractIds(); } return _extractedIds; } @SuppressWarnings("unchecked") private <RT extends RecordTemplate> Set<String> extractIds() { if (_request instanceof GetRequest) { return Collections.singleton(((GetRequest<?>) _request).getObjectId().toString()); } else { return extractIds((BatchRequest<RT>) _request); } } private <RT extends RecordTemplate> Set<String> extractIds(BatchRequest<RT> request) { return request.getObjectIds().stream().map(Object::toString).collect(Collectors.toSet()); } }