/** * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.frm; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicLong; import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent; import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** * * @author Vaclav Demcak * */ public abstract class AbstractChangeListener implements DataChangeListener { private final AtomicLong txNum = new AtomicLong(); private String transactionId; @Override public void onDataChanged(DataChangeEvent, DataObject> changeEvent) { this.transactionId = this.newTransactionIdentifier().toString(); final Set, DataObject>> createdEntries = changeEvent.getCreatedConfigurationData().entrySet(); final Set, DataObject>> updatedEntries = new HashSet, DataObject>>(); Set, DataObject>> updateConfigEntrySet = changeEvent.getUpdatedConfigurationData().entrySet(); updatedEntries.addAll(updateConfigEntrySet); updatedEntries.removeAll(createdEntries); final Set> removeEntriesInstanceIdentifiers = changeEvent.getRemovedConfigurationData(); for (final Entry, DataObject> createdEntry : createdEntries) { InstanceIdentifier c_key = createdEntry.getKey(); DataObject c_value = createdEntry.getValue(); this.add(c_key, c_value); } for (final Entry, DataObject> updatedEntrie : updatedEntries) { Map, DataObject> origConfigData = changeEvent.getOriginalConfigurationData(); InstanceIdentifier u_key = updatedEntrie.getKey(); final DataObject originalFlow = origConfigData.get(u_key); final DataObject updatedFlow = updatedEntrie.getValue(); this.update(u_key, originalFlow, updatedFlow); } for (final InstanceIdentifier instanceId : removeEntriesInstanceIdentifiers) { Map, DataObject> origConfigData = changeEvent.getOriginalConfigurationData(); final DataObject removeValue = origConfigData.get(instanceId); this.remove(instanceId, removeValue); } } public String getTransactionId() { return this.transactionId; } private Object newTransactionIdentifier() { return "DOM-" + txNum.getAndIncrement(); } protected abstract void validate() throws IllegalStateException; protected abstract void remove( final InstanceIdentifier identifier, final DataObject remove); protected abstract void update( final InstanceIdentifier identifier, final DataObject original, final DataObject update); protected abstract void add( final InstanceIdentifier identifier, final DataObject add); }