Preparatory patch, bulk-removes all trailing whitespace from Java files.
Change-Id: I1fbef5746df7277b3865429d4faa82fc8ba8cbb5
Signed-off-by: Robert Varga <rovarga@cisco.com>
private ServiceTracker<BindingAwareBroker, BindingAwareBroker> tracker;
private BindingAwareBroker broker;
private ServiceTrackerCustomizer<BindingAwareBroker, BindingAwareBroker> customizer = new ServiceTrackerCustomizer<BindingAwareBroker, BindingAwareBroker>() {
-
+
@Override
public BindingAwareBroker addingService(ServiceReference<BindingAwareBroker> reference) {
broker = context.getService(reference);
mdActivationPool.execute(new Runnable() {
-
+
@Override
public void run() {
onBrokerAvailable(broker, context);;
});
return broker;
}
-
+
@Override
public void modifiedService(ServiceReference<BindingAwareBroker> reference, BindingAwareBroker service) {
// TODO Auto-generated method stub
-
+
}
@Override
public void removedService(ServiceReference<BindingAwareBroker> reference, BindingAwareBroker service) {
// TODO Auto-generated method stub
-
+
}
};
-
-
+
+
@Override
public final void start(BundleContext context) throws Exception {
this.context = context;
startImpl(context);
tracker = new ServiceTracker<>(context, BindingAwareBroker.class, customizer);
tracker.open();
-
+
}
-
+
@Override
public final void stop(BundleContext context) throws Exception {
tracker.close();
stopImpl(context);
}
-
-
+
+
/**
* Called when this bundle is started (before
* {@link #onSessionInitiated(ProviderContext)} so the Framework can perform
* the bundle-specific activities necessary to start this bundle. This
* method can be used to register services or to allocate any resources that
* this bundle needs.
- *
+ *
* <p>
* This method must complete and return to its caller in a timely manner.
- *
+ *
* @param context
* The execution context of the bundle being started.
* @throws Exception
* started. There should be no active threads that were started by this
* bundle when this bundle returns. A stopped bundle must not call any
* Framework objects.
- *
+ *
* <p>
* This method must complete and return to its caller in a timely manner.
- *
+ *
* @param context The execution context of the bundle being stopped.
* @throws Exception If this method throws an exception, the bundle is still
* marked as stopped, and the Framework will remove the bundle's
protected void stopImpl(BundleContext context) {
// NOOP
}
-
+
protected abstract void onBrokerAvailable(BindingAwareBroker broker, BundleContext context);
-
+
protected void onBrokerRemoved(BindingAwareBroker broker, BundleContext context) {
-
+
}
}
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
/**
- *
+ *
* Defines the component of controller and supplies additional metadata. A
* component of the controller or application supplies a concrete implementation
* of this interface.
- *
+ *
* A user-implemented component (application) which facilitates the SAL and SAL
* services to access infrastructure services or providers' functionality.
- *
- *
- *
+ *
+ *
+ *
*/
public interface BindingAwareConsumer {
/**
* Callback signaling initialization of the consumer session to the SAL.
- *
+ *
* The consumer MUST use the session for all communication with SAL or
* retrieving SAL infrastructure services.
- *
+ *
* This method is invoked by
* {@link BindingAwareBroker#registerConsumer(BindingAwareConsumer)}
- *
+ *
* @param session
* Unique session between consumer and SAL.
*/
import org.opendaylight.yangtools.yang.binding.RpcService;
/**
- *
+ *
* Defines the component of controller and supplies additional metadata. A
* component of the controller or application supplies a concrete implementation
* of this interface.
- *
+ *
* <p>
* A user-implemented component (application) which facilitates the SAL and SAL
* services to access infrastructure services and to provide functionality to
* {@link Consumer}s and other providers.
- *
- *
+ *
+ *
*/
public interface BindingAwareProvider {
/**
* Returns a set of provided implementations of YANG modules and their rpcs.
- *
- *
+ *
+ *
* @return Set of provided implementation of YANG modules and their Rpcs
*/
Collection<? extends RpcService> getImplementations();
/**
* Gets a set of implementations of provider functionality to be registered
* into system during the provider registration to the SAL.
- *
+ *
* <p>
* This method is invoked by {@link Broker#registerProvider(Provider)} to
* learn the initial provided functionality
- *
+ *
* @return Set of provider's functionality.
*/
Collection<? extends ProviderFunctionality> getFunctionality();
/**
* Functionality provided by the {@link BindingAwareProvider}
- *
+ *
* <p>
* Marker interface used to mark the interfaces describing specific
* functionality which could be exposed by providers to other components.
- *
- *
- *
+ *
+ *
+ *
*/
public interface ProviderFunctionality {
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
/**
- *
+ *
* Session-specific instance of the broker functionality.
- *
+ *
* <p>
* BindingAwareService is marker interface for infrastructure services provided
* by the SAL. These services are session-specific, each
* {@link BindingAwareConsumer} and {@link BindingAwareProvider} usually has own
* instance of the service with it's own context.
- *
+ *
* <p>
* The consumer's (or provider's) instance of specific service could be obtained
* by invoking {@link ConsumerContext#getSALService(Class)} method on session
* assigned to the consumer.
- *
+ *
* <p>
* {@link BindingAwareService} and {@link BindingAwareProvider} may seem
* similar, but provider provides YANG model-based functionality and
* to implement specific functionality of YANG and to reuse it in the
* development of {@link BindingAwareConsumer}s and {@link BindingAwareProvider}
* s.
- *
- *
- *
+ *
+ *
+ *
*/
public interface BindingAwareService {
/**
* Base interface defining contract for retrieving MD-SAL
* version of RpcServices
- *
+ *
*/
public interface RpcConsumerRegistry extends BindingAwareService {
/**
* Returns a session specific instance (implementation) of requested
* YANG module implementation / service provided by consumer.
- *
+ *
* @return Session specific implementation of service
*/
<T extends RpcService> T getRpcService(Class<T> module);
* Provider's version of Mount Point, this version allows access to MD-SAL
* services specific for this mountpoint and registration / provision of
* interfaces for mount point.
- *
+ *
* @author ttkacik
- *
+ *
*/
public interface MountProviderInstance //
extends //
public final Class<? extends RpcService> rpcService;
public final Class<? extends BaseIdentity> routingContext;
-
+
private RpcContextIdentifier(Class<? extends RpcService> rpcService, Class<? extends BaseIdentity> routingContext) {
super();
this.rpcService = rpcService;
public Class<? extends BaseIdentity> getRoutingContext() {
return routingContext;
}
-
+
public static final RpcContextIdentifier contextForGlobalRpc(Class<? extends RpcService> serviceType) {
return new RpcContextIdentifier(serviceType, null);
}
-
+
public static final RpcContextIdentifier contextFor(Class<? extends RpcService> serviceType,Class<? extends BaseIdentity> routingContext) {
return new RpcContextIdentifier(serviceType, routingContext);
}
/**
* Updates route for particular path to specified instance of
* {@link RpcService}.
- *
+ *
* @param path
* Path for which RpcService routing is to be updated
* @param service
/**
* Deletes a route for particular path
- *
+ *
* @param path
* Path for which
*/
void removeRoute(InstanceIdentifier<?> path);
/**
- *
+ *
*/
S getRoute(InstanceIdentifier<?> nodeInstance);
/**
- *
+ *
* @return
*/
Map<InstanceIdentifier<?>, S> getRoutes();
*/
public class BindingBrokerImplModuleFactory extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModuleFactory {
-
+
@Override
public Module createModule(String instanceName, DependencyResolver dependencyResolver, BundleContext bundleContext) {
BindingBrokerImplModule module = (BindingBrokerImplModule) super.createModule(instanceName, dependencyResolver, bundleContext);
module.setBundleContext(bundleContext);
return module;
}
-
+
@Override
public Module createModule(String instanceName, DependencyResolver dependencyResolver,
DynamicMBeanWithInstance old, BundleContext bundleContext) throws Exception {
/**
* Returns an instance of provided RpcService type which delegates all calls
* to the delegate.
- *
+ *
* <p>
* Returned instance:
* <ul>
* all calls are delegated.
* <li>{@link DelegateProxy#setDelegate(Object)} - sets the delegate for
* particular instance
- *
+ *
* </ul>
- *
+ *
* @param serviceType
* - Subclass of RpcService for which direct proxy is to be
* generated.
* @return Instance of RpcService of provided serviceType which implements
* and {@link DelegateProxy}
* @throws IllegalArgumentException
- *
+ *
*/
<T extends RpcService> T getDirectProxyFor(Class<T> serviceType) throws IllegalArgumentException;
/**
* Returns an instance of provided RpcService type which routes all calls to
* other instances selected on particular input field.
- *
+ *
* <p>
* Returned instance:
* <ul>
* is not present on any field invocation will be delegated to default
* service {@link RpcRouter#getDefaultService()}.
* </ul>
- *
+ *
* @param serviceType
* - Subclass of RpcService for which Router is to be generated.
* @return Instance of RpcService of provided serviceType which implements
LOG.info("Starting Binding Aware Broker: {}", identifier);
controllerRoot = new RootSalInstance(getRpcProviderRegistry(), getNotificationBroker(), getDataBroker());
-
+
supportedConsumerServices = ImmutableClassToInstanceMap.<BindingAwareService> builder()
.put(NotificationService.class, getRoot()) //
public void close() throws Exception {
// FIXME: Close all sessions
}
-
+
@Override
public <T extends RpcService> RoutedRpcRegistration<T> addRoutedRpcImplementation(Class<T> type, T implementation)
throws IllegalStateException {
return getRoot().addRoutedRpcImplementation(type, implementation);
}
-
+
@Override
public <T extends RpcService> RpcRegistration<T> addRpcImplementation(Class<T> type, T implementation)
throws IllegalStateException {
return getRoot().addRpcImplementation(type, implementation);
}
-
+
@Override
public <T extends RpcService> T getRpcService(Class<T> module) {
return getRoot().getRpcService(module);
L arg0) {
return getRoot().registerRouteChangeListener(arg0);
}
-
+
public class RootSalInstance extends
AbstractBindingSalProviderInstance<DataProviderService, NotificationProviderService, RpcProviderRegistry> {
connector.startDataForwarding();
}
- public static void startNotificationForwarding(BindingIndependentConnector connector,
+ public static void startNotificationForwarding(BindingIndependentConnector connector,
NotificationProviderService baService, NotificationPublishService domService) {
if(connector.isNotificationForwarding()) {
return;
DomForwardedBroker forwardedSource = (DomForwardedBroker) source;
DomForwardedBroker forwardedTarget = (DomForwardedBroker) target;
reuseForwardingFrom(forwardedTarget, forwardedSource);
-
+
}
private static void reuseForwardingFrom(DomForwardedBroker target, DomForwardedBroker source) {
package org.opendaylight.controller.sal.binding.spi;
public interface DelegateProxy<T> {
-
+
void setDelegate(T delegate);
T getDelegate();
}
public interface RemoteRpcRouter {
-
-
-
-
+
+
+
+
ListenerRegistration<RouteChangeListener> registerRouteChangeListener(RouteChangeListener listener);
-
-
+
+
}
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
public class UnionSerializationTest extends AbstractDataServiceTest {
-
+
public static final String PREFIX_STRING = "192.168.0.1/32";
-
-
+
+
@Test
public void testPrefixSerialization() throws Exception {
-
+
Ipv4Prefix ipv4prefix = new Ipv4Prefix(PREFIX_STRING);
IpPrefix ipPrefix = new IpPrefix(ipv4prefix);
Prefix prefix = new PrefixBuilder().setPrefix(ipPrefix).build();
-
+
CompositeNode serialized = testContext.getBindingToDomMappingService().toDataDom(prefix);
assertNotNull(serialized);
assertNotNull(serialized.getFirstSimpleByName(Prefix.QNAME));
assertEquals(PREFIX_STRING, serialized.getFirstSimpleByName(Prefix.QNAME).getValue());
-
+
Prefix deserialized = (Prefix) testContext.getBindingToDomMappingService().dataObjectFromDataDom(Prefix.class, serialized);
assertNotNull(deserialized);
assertNotNull(deserialized.getPrefix());
public interface BarListener extends NotificationListener {
void onBarUpdate(BarUpdate notification);
-
+
void onFlowDelete(FlowDelete notification);
}
public interface FooListener extends NotificationListener {
void onFooUpdate(FooUpdate notification);
-
+
}
import org.opendaylight.yangtools.yang.common.RpcResult;
public interface FooService extends RpcService {
-
+
Future<RpcResult<Void>> foo();
-
+
Future<RpcResult<Void>> simple(SimpleInput obj);
-
+
Future<RpcResult<Void>> inheritedContext(InheritedContextInput obj);
}
public interface RegistrationListener<T extends Registration<?>> extends EventListener {
void onRegister(T registration);
-
+
void onUnregister(T registration);
}
public interface DataProvisionService<P extends Path<P> , D> {
public Registration<DataCommitHandler<P, D>> registerCommitHandler(P path, DataCommitHandler<P, D> commitHandler);
-
- public ListenerRegistration<RegistrationListener<DataCommitHandlerRegistration<P, D>>>
+
+ public ListenerRegistration<RegistrationListener<DataCommitHandlerRegistration<P, D>>>
registerCommitHandlerListener(RegistrationListener<DataCommitHandlerRegistration<P, D>> commitHandlerListener);
}
public interface NotificationPublishService<N> {
void publish(N notification);
-
+
void publish(N notification,ExecutorService executor);
}
import org.opendaylight.yangtools.concepts.Path;
public interface MutableRoutingTable<C, P extends Path<P>, T> extends RoutingTable<C,P,T>, Mutable {
-
+
void setDefaultRoute(T target);
void updateRoute(P path,T target);
void removeRoute(P path);
public interface Route<C,P> extends Immutable {
C getType();
-
+
P getPath();
}
public interface RoutingTable<C, P extends Path<P>, T> {
C getIdentifier();
-
+
T getDefaultRoute();
-
+
Map<P,T> getRoutes();
-
+
T getRoute(P path);
}
/**
* Base abstract implementation of DataReadRouter, which performs
* a read operation on multiple data readers and then merges result.
- *
+ *
* @param <P>
* @param <D>
*/
/**
* Merges data readed by reader instances from specified path
- *
+ *
* @param path Path on which read was performed
* @param data Data which was returned by read operation.
* @return Merged result.
/**
* Returns a function which performs configuration read for supplied path
- *
+ *
* @param path
* @return function which performs configuration read for supplied path
*/
-
+
private Function<DataReader<P, D>, D> configurationRead(final P path) {
return new Function<DataReader<P, D>, D>() {
@Override
/**
* Returns a function which performs operational read for supplied path
- *
+ *
* @param path
* @return function which performs operational read for supplied path
*/
/**
* Register's a reader for operational data.
- *
+ *
* @param path Path which is served by this reader
* @param reader Reader instance which is responsible for reading particular subpath.
- * @return
+ * @return
*/
public Registration<DataReader<P, D>> registerOperationalReader(P path, DataReader<P, D> reader) {
OperationalDataReaderRegistration<P, D> ret = new OperationalDataReaderRegistration<>(path, reader);
}
private Predicate<? super Entry<P, DataReaderRegistration<P, D>>> affects(final P path) {
-
+
return new Predicate<Entry<P, DataReaderRegistration<P, D>>>() {
-
+
@Override
public boolean apply(Entry<P, DataReaderRegistration<P, D>> input) {
final P key = input.getKey();
return key.contains(path) || ((P) path).contains(key);
}
-
+
};
}
private final D updatedOperationalSubtree;
private final D updatedConfigurationSubtree;
-
-
-
+
+
+
public DataChangeEventImpl(DataChange<P, D> dataChange, D originalConfigurationSubtree,
D originalOperationalSubtree, D updatedOperationalSubtree, D updatedConfigurationSubtree) {
super();
updatedConfigurationData = Collections.emptyMap();
updatedOperationalData = Collections.emptyMap();
}
-
+
public InitialDataChangeEventImpl(D configTree, D operTree, Map<P, D> updatedCfgData, Map<P, D> updatedOperData) {
updatedConfigurationTree = configTree;
updatedOperationalTree = operTree;
updatedConfigurationData = updatedCfgData;
updatedOperationalData = updatedOperData;
}
-
+
@Override
public Map<P, D> getCreatedConfigurationData() {
return Collections.emptyMap();
}
-
+
@Override
public Map<P, D> getCreatedOperationalData() {
return Collections.emptyMap();
}
-
+
@Override
public Map<P, D> getOriginalConfigurationData() {
return Collections.emptyMap();
public Map<P, D> getUpdatedConfigurationData() {
return updatedConfigurationData;
}
-
+
@Override
public D getUpdatedConfigurationSubtree() {
return updatedConfigurationTree;
public D getUpdatedOperationalSubtree() {
return updatedOperationalTree;
}
-
+
@Override
public D getOriginalConfigurationSubtree() {
return updatedConfigurationTree;
}
-
+
@Override
public D getOriginalOperationalSubtree() {
return updatedOperationalTree;
}
-
+
@Override
public Map<P, D> getUpdatedOperationalData() {
return updatedOperationalData;
}
-
+
}
public class CommitHandlerTransactions {
private static class AllwaysSuccessfulTransaction<P extends Path<P>,D> implements DataCommitTransaction<P, D> {
-
+
private final DataModification<P, D> modification;
public AllwaysSuccessfulTransaction(DataModification<P, D> modification) {
public RpcResult<Void> finish() throws IllegalStateException {
return Rpcs.<Void>getRpcResult(true, null, Collections.<RpcError>emptyList());
}
-
+
@Override
public DataModification<P, D> getModification() {
return modification;
}
}
-
+
public static final <P extends Path<P>,D> AllwaysSuccessfulTransaction<P, D> allwaysSuccessfulTransaction(DataModification<P, D> modification) {
return new AllwaysSuccessfulTransaction<>(modification);
}
*
*/
public class RpcErrors {
-
+
/**
* @param applicationTag
* @param tag
* @param info
* @param severity
* @param message
- * @param errorType
- * @param cause
+ * @param errorType
+ * @param cause
* @return {@link RpcError} implementation
*/
public static RpcError getRpcError(String applicationTag, String tag, String info,
ErrorSeverity severity, String message, ErrorType errorType, Throwable cause) {
- RpcErrorTO ret = new RpcErrorTO(applicationTag, tag, info, severity, message,
+ RpcErrorTO ret = new RpcErrorTO(applicationTag, tag, info, severity, message,
errorType, cause);
return ret;
}
public Throwable getCause() {
return cause;
}
-
+
@Override
public ErrorType getErrorType() {
return errorType;
public abstract class AbstractConsumer implements Consumer, BundleActivator,ServiceTrackerCustomizer<Broker, Broker> {
-
-
-
+
+
+
private BundleContext context;
private ServiceTracker<Broker, Broker> tracker;
private Broker broker;
return Collections.emptySet();
}
-
+
@Override
public Broker addingService(ServiceReference<Broker> reference) {
if(broker == null) {
broker.registerConsumer(this, context);
return broker;
}
-
+
return null;
}
-
+
@Override
public void modifiedService(ServiceReference<Broker> reference, Broker service) {
// NOOP
}
-
+
@Override
public void removedService(ServiceReference<Broker> reference, Broker service) {
stopImpl(context);
import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;
/**
- *
+ *
* Session-specific instance of the broker functionality.
- *
+ *
* <p>
* BrokerService is marker interface for infrastructure services provided by the
* SAL. These services are session-specific, each {@link Provider} and
* {@link Consumer} usually has own instance of the service with it's own
* context.
- *
+ *
* <p>
* The consumer's (or provider's) instance of specific service could be obtained
* by invoking {@link ConsumerSession#getService(Class)} method on session
* assigned to the consumer.
- *
+ *
* <p>
* {@link BrokerService} and {@link Provider} may seem similar, but provider
* provides YANG model-based functionality and {@link BrokerService} exposes the
* necessary supporting functionality to implement specific functionality of
* YANG and to reuse it in the development of {@link Consumer}s and
* {@link Provider}s.
- *
- *
+ *
+ *
*/
public interface BrokerService {
import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;
/**
- *
+ *
* Defines the component of controller and supplies additional metadata. A
* component of the controller or application supplies a concrete implementation
* of this interface.
- *
+ *
* A user-implemented component (application) which facilitates the SAL and SAL
* services to access infrastructure services or providers' functionality.
- *
- *
+ *
+ *
*/
public interface Consumer {
/**
* Callback signaling initialization of the consumer session to the SAL.
- *
+ *
* The consumer MUST use the session for all communication with SAL or
* retrieving SAL infrastructure services.
- *
+ *
* This method is invoked by {@link Broker#registerConsumer(Consumer)}
- *
+ *
* @param session
* Unique session between consumer and SAL.
*/
/**
* Get a set of implementations of consumer functionality to be registered
* into system during the consumer registration to the SAL.
- *
+ *
* This method is invoked by {@link Broker#registerConsumer(Consumer)}.
- *
+ *
* @return Set of consumer functionality.
*/
public Collection<ConsumerFunctionality> getConsumerFunctionality();
/**
* The marker interface for the interfaces describing the consumer
* functionality contracts.
- *
- *
+ *
+ *
*/
public interface ConsumerFunctionality {
import org.opendaylight.controller.sal.core.api.Broker.ProviderSession;
/**
- *
+ *
* Defines the component of controller and supplies additional metadata. A
* component of the controller or application supplies a concrete implementation
* of this interface.
- *
+ *
* <p>
* A user-implemented component (application) which facilitates the SAL and SAL
* services to access infrastructure services and to provide functionality to
* {@link Consumer}s and other providers.
- *
- *
+ *
+ *
*/
public interface Provider {
/**
* Callback signaling initialization of the provider session to the SAL.
- *
+ *
* <p>
* The provider <b>MUST use the session</b> for all communication with SAL
* or retrieving SAL infrastructure services.
- *
+ *
* <p>
* This method is invoked by {@link Broker#registerConsumer(Consumer)}
- *
+ *
* @param session
* Unique session between provider and SAL.
*/
/**
* Gets a set of implementations of provider functionality to be registered
* into system during the provider registration to the SAL.
- *
+ *
* <p>
* This method is invoked by {@link Broker#registerProvider(Provider)} to
* learn the initial provided functionality
- *
+ *
* @return Set of provider's functionality.
*/
public Collection<ProviderFunctionality> getProviderFunctionality();
/**
* Functionality provided by the {@link Provider}
- *
+ *
* <p>
* Marker interface used to mark the interfaces describing specific
* functionality which could be exposed by providers to other components.
- *
+ *
- *
+ *
*/
public interface ProviderFunctionality {
public interface RpcConsumptionRegistry {
/**
* Sends an RPC to other components registered to the broker.
- *
+ *
* @see RpcImplementation
* @param rpc
* Name of RPC
/**
* Registers an implementation of the rpc.
- *
+ *
* <p>
* The registered rpc functionality will be available to all other
* consumers and providers registered to the broker, which are aware of
* the {@link QName} assigned to the rpc.
- *
+ *
* <p>
* There is no assumption that rpc type is in the set returned by
* invoking {@link RpcImplementation#getSupportedRpcs()}. This allows
* for dynamic rpc implementations.
- *
+ *
* @param rpcType
* Name of Rpc
* @param implementation
*/
RpcRegistration addRpcImplementation(QName rpcType, RpcImplementation implementation)
throws IllegalArgumentException;
-
+
ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(RpcRegistrationListener listener);
RoutedRpcRegistration addRoutedRpcImplementation(QName rpcType, RpcImplementation implementation);
import org.opendaylight.yangtools.yang.common.QName;
public interface RpcRegistrationListener extends EventListener {
-
+
public void onRpcImplementationAdded(QName name);
-
+
public void onRpcImplementationRemoved(QName name);
}
public class RpcRoutingContext implements Immutable, Serializable {
/**
- *
+ *
*/
private static final long serialVersionUID = -9079324728075883325L;
-
+
private final QName context;
private final QName rpc;
-
-
+
+
private RpcRoutingContext(QName context, QName rpc) {
super();
this.context = context;
this.rpc = rpc;
}
-
+
public static final RpcRoutingContext create(QName context, QName rpc) {
return new RpcRoutingContext(context, rpc);
}
/**
* DataBrokerService provides unified access to the data stores available in the
* system.
- *
- *
+ *
+ *
* @see DataProviderService
- *
+ *
*/
-public interface DataBrokerService extends
+public interface DataBrokerService extends
BrokerService, //
DataReader<InstanceIdentifier, CompositeNode>, //
DataModificationTransactionFactory<InstanceIdentifier, CompositeNode>, //
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import org.opendaylight.controller.md.sal.common.api.data.DataReader;;
-public interface DataProviderService extends
+public interface DataProviderService extends
DataBrokerService, //
DataProvisionService<InstanceIdentifier, CompositeNode>
{
/**
* Adds {@link DataValidator} for specified Data Store
- *
+ *
* @param store
* Data Store
* @param validator
/**
* Removes {@link DataValidator} from specified Data Store
- *
+ *
* @param store
* @param validator
* Validator
/**
* Adds {@link DataRefresher} for specified data store
- *
+ *
* @param store
* @param refresher
*/
/**
* Removes {@link DataRefresher} from specified data store
- *
+ *
* @param store
* @param refresher
*/
void removeRefresher(DataStoreIdentifier store, DataRefresher refresher);
-
+
Registration<DataReader<InstanceIdentifier, CompositeNode>> registerConfigurationReader(InstanceIdentifier path, DataReader<InstanceIdentifier, CompositeNode> reader);
Registration<DataReader<InstanceIdentifier, CompositeNode>> registerOperationalReader(InstanceIdentifier path, DataReader<InstanceIdentifier, CompositeNode> reader);
-
+
public interface DataRefresher extends Provider.ProviderFunctionality {
/**
* Fired when some component explicitly requested the data refresh.
- *
+ *
* The provider which exposed the {@link DataRefresher} should republish
* its provided data by editing the data in all affected data stores.
*/
public interface DataStore extends //
DataReader<InstanceIdentifier, CompositeNode>,
DataCommitHandler<InstanceIdentifier, CompositeNode> {
-
-
+
+
Iterable<InstanceIdentifier> getStoredConfigurationPaths();
Iterable<InstanceIdentifier> getStoredOperationalPaths();
-
+
boolean containsConfigurationPath(InstanceIdentifier path);
boolean containsOperationalPath(InstanceIdentifier path);
/**
* {@link Provider}-supplied Validator of the data.
- *
+ *
* <p>
* The registration could be done by :
* <ul>
* as arguments to the
* {@link DataProviderService#addValidator(DataStoreIdentifier, DataValidator)}
* </ul>
- *
+ *
**/
public interface DataValidator extends Provider.ProviderFunctionality {
/**
* A set of Data Stores supported by implementation.
- *
+ *
* The set of {@link DataStoreIdentifier}s which identifies target data
* stores which are supported by this implementation. This set is used, when
* {@link Provider} is registered to the SAL, to register and expose the
* validation functionality to affected data stores.
- *
+ *
* @return Set of Data Store identifiers
*/
Set<DataStoreIdentifier> getSupportedDataStores();
/**
* Performs validation on supplied data.
- *
+ *
* @param toValidate
* Data to validate
* @return Validation result. The
public interface NotificationListener extends Consumer.ConsumerFunctionality, EventListener {
/**
* A set of notification types supported by listeners.
- *
+ *
* The set of notification {@link QName}s which are supported by this
* listener. This set is used, when {@link Consumer} is registered to the
* SAL, to automatically register the listener.
- *
+ *
* @return Set of QNames identifying supported notifications.
*/
Set<QName> getSupportedNotifications();
/**
* Fired when the notification occurs.
- *
+ *
* The type of the notification could be learned by
* <code>QName type = notification.getNodeType();</code>
- *
+ *
* @param notification
* Notification content
*/
/**
* Notification Publishing Service
- *
+ *
* The simplified process of the notification publishing is following:
- *
+ *
* <ol>
* <li> {@link Provider} invokes {@link #sendNotification(CompositeNode)}
* <li> {@link Broker} finds {@link NotificationListener}s which subscribed for
* the notification type.
- *
+ *
* <li>For each subscriber {@link Broker} invokes
* {@link NotificationListener#onNotification(CompositeNode)}
* </ol>
public interface NotificationPublishService extends NotificationService {
/**
* Publishes a notification.
- *
+ *
* Notification type is determined by the
* {@link CompositeNode#getNodeType()} of the
* <code>notification<code> parameter.
- *
+ *
* @param notification
* Notification to publish
*/
/**
* NotificationService provides access to the notification functionality of the
* SAL.
- *
+ *
* NotificationService allows for consumption of notifications by registering
* implementations of NotificationListener.
- *
+ *
* The registration of notification listeners could be done by:
* <ul>
* <li>returning an instance of implementation in the return value of
* arguments to the
* {@link ProviderSession#addRpcImplementation(QName, RpcImplementation)}
* </ul>
- *
- *
+ *
+ *
*/
public interface NotificationService extends BrokerService {
/**
* Registers a notification listener for supplied notification type.
- *
+ *
* @param notification
* @param listener
*/
public class DomBrokerRuntimeMXBeanImpl implements
DomBrokerImplRuntimeMXBean {
-
+
private final DataBrokerImpl dataService;
private final Transactions transactions = new Transactions();
private final Data data = new Data();
-
+
public DomBrokerRuntimeMXBeanImpl(DataBrokerImpl dataService) {
- this.dataService = dataService;
+ this.dataService = dataService;
}
public Transactions getTransactions() {
/**
* In-memory DOM Data Store
- *
+ *
* Implementation of {@link DOMStore} which uses {@link DataTree} and other
* classes such as {@link SnapshotBackedWriteTransaction}.
* {@link SnapshotBackedReadTransaction} and {@link ResolveDataChangeEventsTask}
* to implement {@link DOMStore} contract.
- *
+ *
*/
public class InMemoryDOMDataStore implements DOMStore, Identifiable<String>, SchemaContextListener,
TransactionReadyPrototype {
/*
* Make sure commit is not occurring right now. Listener has to be
* registered and its state capture enqueued at a consistent point.
- *
+ *
* FIXME: improve this to read-write lock, such that multiple listener
* registrations can occur simultaneously
*/
* Implementation of Write transaction which is backed by
* {@link DataTreeSnapshot} and executed according to
* {@link TransactionReadyPrototype}.
- *
+ *
*/
class SnapshotBackedWriteTransaction extends AbstractDOMStoreTransaction implements DOMStoreWriteTransaction {
/**
* Creates new write-only transaction.
- *
+ *
* @param identifier
* transaction Identifier
* @param snapshot
/**
* Prototype implementation of
* {@link #ready(SnapshotBackedWriteTransaction)}
- *
+ *
* This class is intended to be implemented by Transaction factories
* responsible for allocation of {@link SnapshotBackedWriteTransaction} and
* providing underlying logic for applying implementation.
- *
+ *
*/
public static interface TransactionReadyPrototype {
/**
* Returns a commit coordinator associated with supplied transactions.
- *
+ *
* This call must not fail.
- *
+ *
* @param tx
* Transaction on which ready was invoked.
* @return DOMStoreThreePhaseCommitCohort associated with transaction
/**
* Copyright (c) 2013 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
private AtomicLong nextTransaction = new AtomicLong();
private final AtomicLong createdTransactionsCount = new AtomicLong();
-
+
public DataBrokerImpl() {
setDataReadRouter(new DataReaderRouter());
setExecutor(MoreExecutors.sameThreadExecutor());
}
-
+
public AtomicLong getCreatedTransactionsCount() {
return createdTransactionsCount;
}
-
+
@Override
public DataTransactionImpl beginTransaction() {
String transactionId = "DOM-" + nextTransaction.getAndIncrement();
@Override
public void close() throws Exception {
-
+
}
}
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
-public class DataTransactionImpl extends AbstractDataTransaction<InstanceIdentifier, CompositeNode>
+public class DataTransactionImpl extends AbstractDataTransaction<InstanceIdentifier, CompositeNode>
implements DataModificationTransaction {
private final ListenerRegistry<DataTransactionListener> listeners = new ListenerRegistry<DataTransactionListener>();
-
-
-
+
+
+
public DataTransactionImpl(Object identifier,DataBrokerImpl dataBroker) {
super(identifier,dataBroker);
}
public DataModificationTransaction beginTransaction() {
return getDelegate().beginTransaction();
}
-
-
+
+
}
public void removeValidator(DataStoreIdentifier store, DataValidator validator) {
getDelegate().removeValidator(store, validator);
}
-
+
@Override
public ListenerRegistration<RegistrationListener<DataCommitHandlerRegistration<InstanceIdentifier, CompositeNode>>> registerCommitHandlerListener(
RegistrationListener<DataCommitHandlerRegistration<InstanceIdentifier, CompositeNode>> commitHandlerListener) {
/**
* Registers a notification listener for supplied notification type.
- *
+ *
* @param notification
* @param listener
*/
// TODO Auto-generated constructor stub
}
-
-
+
+
public static Map<Map<QName,Object>,CompositeNode> toIndexMap(List<CompositeNode> nodes,List<QName> keys) {
ConcurrentHashMap<Map<QName,Object>,CompositeNode> ret = new ConcurrentHashMap<>();
for(CompositeNode node : nodes) {
checkArgument(keyNode != null,"Node must contains all keys.");
Object value = keyNode.getValue();
map.put(key, value);
-
+
}
return map;
}
public class YangSchemaUtils {
private static final Function<PathArgument, QName> QNAME_FROM_PATH_ARGUMENT = new Function<PathArgument, QName>(){
-
+
@Override
public QName apply(PathArgument input) {
if(input == null) {
private YangSchemaUtils() {
throw new UnsupportedOperationException("Utility class.");
}
-
-
+
+
public static DataSchemaNode getSchemaNode(SchemaContext schema,InstanceIdentifier path) {
checkArgument(schema != null,"YANG Schema must not be null.");
checkArgument(path != null,"Path must not be null.");
return getSchemaNode(schema, FluentIterable.from(path.getPath()).transform(QNAME_FROM_PATH_ARGUMENT));
}
-
+
public static DataSchemaNode getSchemaNode(SchemaContext schema,Iterable<QName> path) {
checkArgument(schema != null,"YANG Schema must not be null.");
checkArgument(path != null,"Path must not be null.");
if(!path.iterator().hasNext()){
return toRootDataNode(schema);
}
-
+
QName firstNode = path.iterator().next();
DataNodeContainer previous = schema.findModuleByNamespaceAndRevision(firstNode.getNamespace(),
firstNode.getRevision());
Iterator<QName> iterator = path.iterator();
-
+
while (iterator.hasNext()) {
checkArgument(previous!= null, "Supplied path does not resolve into valid schema node.");
QName arg = iterator.next();
}
private static final class NetconfDataRootNode implements ContainerSchemaNode {
-
+
public NetconfDataRootNode(SchemaContext schema) {
// TODO Auto-generated constructor stub
}
-
+
@Override
public Set<TypeDefinition<?>> getTypeDefinitions() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public Set<DataSchemaNode> getChildNodes() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public Set<GroupingDefinition> getGroupings() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public DataSchemaNode getDataChildByName(QName name) {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public DataSchemaNode getDataChildByName(String name) {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public Set<UsesNode> getUses() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public Set<AugmentationSchema> getAvailableAugmentations() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public boolean isAugmenting() {
// TODO Auto-generated method stub
return false;
}
-
+
@Override
public boolean isAddedByUses() {
// TODO Auto-generated method stub
return false;
}
-
+
@Override
public boolean isConfiguration() {
// TODO Auto-generated method stub
return false;
}
-
+
@Override
public ConstraintDefinition getConstraints() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public QName getQName() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public SchemaPath getPath() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public String getDescription() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public String getReference() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public Status getStatus() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public List<UnknownSchemaNode> getUnknownSchemaNodes() {
// TODO Auto-generated method stub
return null;
}
-
+
@Override
public boolean isPresenceContainer() {
// TODO Auto-generated method stub
return false;
}
-
+
}
}
DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction();
assertNotNull(writeTx);
/**
- *
+ *
* Writes /test in writeTx
- *
+ *
*/
writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
/**
- *
+ *
* Reads /test from writeTx Read should return container.
- *
+ *
*/
ListenableFuture<Optional<NormalizedNode<?, ?>>> writeTxContainer = writeTx.read(TestModel.TEST_PATH);
assertTrue(writeTxContainer.get().isPresent());
/**
- *
+ *
* Reads /test from readTx Read should return Absent.
- *
+ *
*/
ListenableFuture<Optional<NormalizedNode<?, ?>>> readTxContainer = readTx.read(TestModel.TEST_PATH);
assertFalse(readTxContainer.get().isPresent());
DOMStoreReadWriteTransaction writeTx = domStore.newReadWriteTransaction();
assertNotNull(writeTx);
/**
- *
+ *
* Writes /test in writeTx
- *
+ *
*/
writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
/**
- *
+ *
* Reads /test from writeTx Read should return container.
- *
+ *
*/
ListenableFuture<Optional<NormalizedNode<?, ?>>> writeTxContainer = writeTx.read(TestModel.TEST_PATH);
assertTrue(writeTxContainer.get().isPresent());
/**
* We alocate new read-write transaction and write /test
- *
- *
+ *
+ *
*/
DOMStoreReadWriteTransaction firstTx = txChain.newReadWriteTransaction();
assertTestContainerWrite(firstTx);
DOMStoreReadTransaction secondReadTx = txChain.newReadOnlyTransaction();
/**
- *
+ *
* We test if we are able to read data from tx, read should not fail
* since we are using chained transaction.
- *
- *
+ *
+ *
*/
assertTestContainerExists(secondReadTx);
/**
- *
+ *
* We alocate next transaction, which is still based on first one, but
* is read-write.
- *
+ *
*/
DOMStoreReadWriteTransaction thirdDeleteTx = txChain.newReadWriteTransaction();
/**
* We test existence of /test in third transaction container should
* still be visible from first one (which is still uncommmited).
- *
- *
+ *
+ *
*/
assertTestContainerExists(thirdDeleteTx);
/**
* We commit first transaction
- *
+ *
*/
assertThreePhaseCommit(firstWriteTxCohort);
assertTestContainerExists(storeReadTx);
/**
* We commit third transaction
- *
+ *
*/
assertThreePhaseCommit(thirdDeleteTxCohort);
}
private static Optional<NormalizedNode<?, ?>> assertTestContainerWrite(final DOMStoreReadWriteTransaction writeTx)
throws InterruptedException, ExecutionException {
/**
- *
+ *
* Writes /test in writeTx
- *
+ *
*/
writeTx.write(TestModel.TEST_PATH, ImmutableNodes.containerNode(TestModel.TEST_QNAME));
}
/**
- *
+ *
* Reads /test from readTx Read should return container.
- *
+ *
*/
private static Optional<NormalizedNode<?, ?>> assertTestContainerExists(DOMStoreReadTransaction readTx)
throws InterruptedException, ExecutionException {