/* * 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.sal.binding.impl; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataReader; import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter; import org.opendaylight.controller.md.sal.common.impl.service.AbstractDataBroker; import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.util.DataObjectReadingUtil; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.Maps; public class DataBrokerImpl extends AbstractDataBroker, DataObject, DataChangeListener> // implements DataProviderService, AutoCloseable { private final static class ContainsWildcarded implements Predicate> { private final InstanceIdentifier key; public ContainsWildcarded(final InstanceIdentifier key) { this.key = key; } @Override public boolean apply(final InstanceIdentifier input) { return key.containsWildcarded(input); } } private final static class IsContainedWildcarded implements Predicate> { private final InstanceIdentifier key; public IsContainedWildcarded(final InstanceIdentifier key) { this.key = key; } @Override public boolean apply(final InstanceIdentifier input) { return input.containsWildcarded(key); } } private final AtomicLong nextTransaction = new AtomicLong(); private final AtomicLong createdTransactionsCount = new AtomicLong(); private final DelegatingDataReadRouter router = new DelegatingDataReadRouter(); private DataCommitHandler, DataObject> rootCommitHandler; public DataBrokerImpl() { setDataReadRouter(router); } public void setDataReadDelegate(final DataReader, DataObject> delegate) { router.setDelegate(delegate); } public AtomicLong getCreatedTransactionsCount() { return createdTransactionsCount; } @Override public DataTransactionImpl beginTransaction() { String transactionId = "BA-" + nextTransaction.getAndIncrement(); createdTransactionsCount.getAndIncrement(); return new DataTransactionImpl(transactionId, this); } @Override public void close() { } @Override protected Predicate> createContainsPredicate( final InstanceIdentifier key) { return new ContainsWildcarded(key); } @Override protected Predicate> createIsContainedPredicate( final InstanceIdentifier key) { return new IsContainedWildcarded(key); } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override protected Map, DataObject> deepGetBySubpath( final Map, DataObject> dataSet, final InstanceIdentifier path) { Builder, DataObject> builder = ImmutableMap.builder(); Map, DataObject> potential = Maps.filterKeys(dataSet, createIsContainedPredicate(path)); for (Entry, DataObject> entry : potential.entrySet()) { try { builder.putAll(DataObjectReadingUtil.readData(entry.getValue(), (InstanceIdentifier) entry.getKey(), path)); } catch (Exception e) { // FIXME : Log exception; } } return builder.build(); } public class DelegatingDataReadRouter extends AbstractDataReadRouter, DataObject> { private DataReader, DataObject> delegate; @Override public DataObject readConfigurationData(final InstanceIdentifier path) { return delegate.readConfigurationData(path); } public void setDelegate(final DataReader, DataObject> delegate) { this.delegate = delegate; } @Override public DataObject readOperationalData(final InstanceIdentifier path) { return delegate.readOperationalData(path); } @Override protected DataObject merge(final InstanceIdentifier path, final Iterable data) { throw new UnsupportedOperationException("Not supported"); } @Override public Registration, DataObject>> registerConfigurationReader( final InstanceIdentifier path, final DataReader, DataObject> reader) { throw new UnsupportedOperationException("Not supported"); } @Override public Registration, DataObject>> registerOperationalReader( final InstanceIdentifier path, final DataReader, DataObject> reader) { throw new UnsupportedOperationException("Not supported"); } } @Override protected ImmutableList, DataObject>> affectedCommitHandlers( final Set> paths) { ImmutableList.Builder, DataObject>> handlersBuilder = ImmutableList.builder(); return handlersBuilder // .add(rootCommitHandler) // .addAll(super.affectedCommitHandlers(paths)) // .build(); } public void setRootCommitHandler(final DataCommitHandler, DataObject> commitHandler) { rootCommitHandler = commitHandler; } }