Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.bookkeeper.clients.impl.internal; import static com.google.common.base.Preconditions.checkState; import com.google.common.collect.Maps; import java.util.List; import java.util.TreeMap; import org.apache.bookkeeper.clients.exceptions.ClientException; import org.apache.bookkeeper.clients.exceptions.InternalServerException; import org.apache.bookkeeper.clients.exceptions.InvalidNamespaceNameException; import org.apache.bookkeeper.clients.exceptions.InvalidStreamNameException; import org.apache.bookkeeper.clients.exceptions.NamespaceExistsException; import org.apache.bookkeeper.clients.exceptions.NamespaceNotFoundException; import org.apache.bookkeeper.clients.exceptions.StorageContainerException; import org.apache.bookkeeper.clients.exceptions.StreamExistsException; import org.apache.bookkeeper.clients.exceptions.StreamNotFoundException; import org.apache.bookkeeper.clients.impl.internal.api.HashStreamRanges; import org.apache.bookkeeper.common.util.ExceptionalFunction; import org.apache.bookkeeper.stream.proto.RangeKeyType; import org.apache.bookkeeper.stream.proto.RangeProperties; import org.apache.bookkeeper.stream.proto.storage.GetActiveRangesResponse; import org.apache.bookkeeper.stream.proto.storage.GetStorageContainerEndpointResponse; import org.apache.bookkeeper.stream.proto.storage.OneStorageContainerEndpointResponse; import org.apache.bookkeeper.stream.proto.storage.RelatedRanges; import org.apache.bookkeeper.stream.proto.storage.StatusCode; /** * Utils for converting protocol related data structures to internal data structures. */ public final class ProtocolInternalUtils { private ProtocolInternalUtils() { } public static HashStreamRanges createActiveRanges(GetActiveRangesResponse response) { TreeMap<Long, RangeProperties> ranges = Maps.newTreeMap(); long lastEndKey = Long.MIN_VALUE; for (RelatedRanges rr : response.getRangesList()) { RangeProperties range = rr.getProps(); long startKey = range.getStartHashKey(); long endKey = range.getEndHashKey(); checkState(lastEndKey == startKey, "Invalid range key found : expected = %s, actual = %s", lastEndKey, startKey); ranges.put(startKey, range); lastEndKey = endKey; } checkState(Long.MAX_VALUE == lastEndKey, "Missing key range [%s - %s)", lastEndKey, Long.MAX_VALUE); checkState(ranges.size() > 0, "No active range found"); return HashStreamRanges.ofHash(RangeKeyType.HASH, ranges); } static final ExceptionalFunction<GetStorageContainerEndpointResponse, List<OneStorageContainerEndpointResponse>> GetStorageContainerEndpointsFunction = response -> { if (StatusCode.SUCCESS == response.getStatusCode()) { return response.getResponsesList(); } throw new StorageContainerException(response.getStatusCode(), "Fail to get storage container endpoints"); }; // // Exceptions // public static Throwable createRootRangeException(String streamName, StatusCode statusCode) { switch (statusCode) { case INVALID_NAMESPACE_NAME: return new InvalidNamespaceNameException(streamName); case NAMESPACE_EXISTS: return new NamespaceExistsException(streamName); case NAMESPACE_NOT_FOUND: return new NamespaceNotFoundException(streamName); case INVALID_STREAM_NAME: return new InvalidStreamNameException(streamName); case STREAM_EXISTS: return new StreamExistsException(streamName); case STREAM_NOT_FOUND: return new StreamNotFoundException(streamName); default: return new ClientException("fail to access its root range : code = " + statusCode); } } public static Exception createMetaRangeException(String name, StatusCode statusCode) { switch (statusCode) { case STREAM_EXISTS: return new StreamExistsException(name); case STREAM_NOT_FOUND: return new StreamNotFoundException(name); default: return new InternalServerException( "Encountered internal server exception on stream " + name + " : code = " + statusCode); } } }