blob: 42d397f9dd0831c9f83318beb22db0a6f93c2044 [file] [log] [blame]
alshabibab984662014-12-04 18:56:18 -08001/*
2 * Copyright 2014 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.core.impl;
Brian O'Connor520c0522014-11-23 23:50:47 -080017
Brian O'Connorabafb502014-12-02 22:26:20 -080018import org.onosproject.core.IdBlock;
19import org.onosproject.core.IdGenerator;
20import org.onosproject.core.UnavailableIdException;
Brian O'Connor520c0522014-11-23 23:50:47 -080021
Madan Jampani078394f2015-05-28 18:17:25 -070022import com.google.common.base.Supplier;
23import com.google.common.base.Suppliers;
24
Brian O'Connor520c0522014-11-23 23:50:47 -080025/**
26 * Base class of {@link IdGenerator} implementations which use {@link IdBlockAllocator} as
27 * backend.
28 */
29public class BlockAllocatorBasedIdGenerator implements IdGenerator {
30 protected final IdBlockAllocator allocator;
Madan Jampani078394f2015-05-28 18:17:25 -070031 protected Supplier<IdBlock> idBlock;
Brian O'Connor520c0522014-11-23 23:50:47 -080032
33 /**
34 * Constructs an ID generator which use {@link IdBlockAllocator} as backend.
35 *
Pavlin Radoslavov119fd5c2014-11-25 19:08:19 -080036 * @param allocator the ID block allocator to use
Brian O'Connor520c0522014-11-23 23:50:47 -080037 */
38 protected BlockAllocatorBasedIdGenerator(IdBlockAllocator allocator) {
39 this.allocator = allocator;
Madan Jampani078394f2015-05-28 18:17:25 -070040 this.idBlock = Suppliers.memoize(allocator::allocateUniqueIdBlock);
Brian O'Connor520c0522014-11-23 23:50:47 -080041 }
42
43 @Override
44 public long getNewId() {
45 try {
Madan Jampani078394f2015-05-28 18:17:25 -070046 return idBlock.get().getNextId();
Brian O'Connor520c0522014-11-23 23:50:47 -080047 } catch (UnavailableIdException e) {
48 synchronized (allocator) {
Madan Jampani078394f2015-05-28 18:17:25 -070049 idBlock = Suppliers.memoize(allocator::allocateUniqueIdBlock);
50 return idBlock.get().getNextId();
Brian O'Connor520c0522014-11-23 23:50:47 -080051 }
52 }
53 }
54}