/* * Copyright (c) 2012 Big Switch Networks, Inc. * * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html * * 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. * * This file incorporates work covered by the following copyright and * permission notice: * * Originally created by David Erickson, Stanford University * * 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 org.opendaylight.controller.hosttracker.internal; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.opendaylight.controller.hosttracker.Entity; import org.opendaylight.controller.hosttracker.IDeviceService.DeviceField; import org.opendaylight.controller.sal.utils.IterableIterator; /** * An index that maps key fields of an entity to device keys, with multiple * device keys allowed per entity */ public class DeviceMultiIndex extends DeviceIndex { /** * The index */ private ConcurrentHashMap> index; /** * @param keyFields */ public DeviceMultiIndex(EnumSet keyFields) { super(keyFields); index = new ConcurrentHashMap>(); } // *********** // DeviceIndex // *********** @Override public Iterator queryByEntity(Entity entity) { IndexedEntity ie = new IndexedEntity(keyFields, entity); Collection devices = index.get(ie); if (devices != null) return devices.iterator(); return Collections. emptySet().iterator(); } @Override public Iterator getAll() { Iterator> iter = index.values().iterator(); return new IterableIterator(iter); } @Override public boolean updateIndex(Device device, Long deviceKey) { for (Entity e : device.entities) { updateIndex(e, deviceKey); } return true; } @Override public void updateIndex(Entity entity, Long deviceKey) { Collection devices = null; IndexedEntity ie = new IndexedEntity(keyFields, entity); if (!ie.hasNonNullKeys()) return; devices = index.get(ie); if (devices == null) { Map chm = new ConcurrentHashMap(); devices = Collections.newSetFromMap(chm); Collection r = index.putIfAbsent(ie, devices); if (r != null) devices = r; } devices.add(deviceKey); } @Override public void removeEntity(Entity entity) { IndexedEntity ie = new IndexedEntity(keyFields, entity); index.remove(ie); } @Override public void removeEntity(Entity entity, Long deviceKey) { IndexedEntity ie = new IndexedEntity(keyFields, entity); Collection devices = index.get(ie); if (devices != null) devices.remove(deviceKey); } }