--- /dev/null
+/*
+ * 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.netconf.cli;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+import java.util.Map;
+import org.opendaylight.controller.netconf.cli.io.ConsoleIO;
+import org.opendaylight.controller.netconf.cli.reader.Reader;
+import org.opendaylight.controller.netconf.cli.reader.custom.ConfigReader;
+import org.opendaylight.controller.netconf.cli.reader.custom.EditContentReader;
+import org.opendaylight.controller.netconf.cli.reader.custom.FilterReader;
+import org.opendaylight.controller.netconf.cli.reader.custom.PasswordReader;
+import org.opendaylight.controller.netconf.cli.reader.impl.GenericReader;
+import org.opendaylight.controller.netconf.cli.writer.OutFormatter;
+import org.opendaylight.controller.netconf.cli.writer.Writer;
+import org.opendaylight.controller.netconf.cli.writer.custom.DataWriter;
+import org.opendaylight.controller.netconf.cli.writer.impl.NormalizedNodeWriter;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+
+/**
+ * Keeps custom and generic input/output arguments handlers. Custom handlers are
+ * constructed lazily, due to remote schema context acquisition.
+ */
+public class CommandArgHandlerRegistry {
+
+ private final ConsoleIO consoleIO;
+ private final SchemaContextRegistry schemaContextRegistry;
+
+ private final Map<Class<? extends Reader<? extends DataSchemaNode>>, ReaderProvider> customReaders = Maps
+ .newHashMap();
+ private final Map<Class<? extends Writer<DataSchemaNode>>, WriterProvider> customWriters = Maps.newHashMap();
+
+ public CommandArgHandlerRegistry(final ConsoleIO consoleIO, final SchemaContextRegistry schemaContextRegistry) {
+ this.consoleIO = consoleIO;
+ this.schemaContextRegistry = schemaContextRegistry;
+
+ setUpReaders();
+ setUpWriters();
+ }
+
+ private void setUpWriters() {
+ customWriters.put(DataWriter.class, new DataWriterProvider());
+ }
+
+ private void setUpReaders() {
+ customReaders.put(PasswordReader.class, new PasswordReaderProvider());
+ customReaders.put(FilterReader.class, new FilterReaderProvider());
+ customReaders.put(ConfigReader.class, new ConfigReaderProvider());
+ customReaders.put(EditContentReader.class, new EditContentReaderProvider());
+ }
+
+ public synchronized Reader<? extends DataSchemaNode> getCustomReader(
+ final Class<? extends Reader<DataSchemaNode>> readerType) {
+ return customReaders.get(readerType).provide(consoleIO, this, schemaContextRegistry);
+ }
+
+ private static SchemaContext getRemoteSchema(final Class<?> handlerType,
+ final SchemaContextRegistry schemaContextRegistry) {
+ final Optional<SchemaContext> remoteSchemaContext = schemaContextRegistry.getRemoteSchemaContext();
+ Preconditions.checkState(remoteSchemaContext.isPresent(),
+ "Remote schema context not acquired yet, cannot get handler %s", handlerType);
+ return remoteSchemaContext.get();
+ }
+
+ public synchronized Reader<DataSchemaNode> getGenericReader(final SchemaContext schemaContext) {
+ return new GenericReader(consoleIO, this, schemaContext);
+ }
+
+ public synchronized Reader<DataSchemaNode> getGenericReader(final SchemaContext schemaContext,
+ final boolean readConfigNode) {
+ return new GenericReader(consoleIO, this, schemaContext, readConfigNode);
+ }
+
+ public synchronized Writer<DataSchemaNode> getCustomWriter(final Class<? extends Writer<DataSchemaNode>> writerType) {
+ return customWriters.get(writerType).provide(consoleIO, getRemoteSchema(writerType, schemaContextRegistry),
+ this);
+ }
+
+ public synchronized Writer<DataSchemaNode> getGenericWriter() {
+ return new NormalizedNodeWriter(consoleIO, new OutFormatter());
+ }
+
+ /**
+ * Reader providers, in order to construct readers lazily
+ */
+ private static interface ReaderProvider {
+ Reader<? extends DataSchemaNode> provide(ConsoleIO consoleIO,
+ final CommandArgHandlerRegistry commandArgHandlerRegistry,
+ final SchemaContextRegistry schemaContextRegistry);
+ }
+
+ private static final class FilterReaderProvider implements ReaderProvider {
+ @Override
+ public Reader<? extends DataSchemaNode> provide(final ConsoleIO consoleIO,
+ final CommandArgHandlerRegistry commandArgHandlerRegistry,
+ final SchemaContextRegistry schemaContextRegistry) {
+ return new FilterReader(consoleIO, getRemoteSchema(FilterReader.class, schemaContextRegistry));
+ }
+ }
+
+ private static final class ConfigReaderProvider implements ReaderProvider {
+ @Override
+ public Reader<? extends DataSchemaNode> provide(final ConsoleIO consoleIO,
+ final CommandArgHandlerRegistry commandArgHandlerRegistry,
+ final SchemaContextRegistry schemaContextRegistry) {
+ return new ConfigReader(consoleIO, getRemoteSchema(ConfigReader.class, schemaContextRegistry),
+ commandArgHandlerRegistry);
+ }
+ }
+
+ private static final class EditContentReaderProvider implements ReaderProvider {
+ @Override
+ public Reader<? extends DataSchemaNode> provide(final ConsoleIO consoleIO,
+ final CommandArgHandlerRegistry commandArgHandlerRegistry,
+ final SchemaContextRegistry schemaContextRegistry) {
+ return new EditContentReader(consoleIO, commandArgHandlerRegistry, getRemoteSchema(EditContentReader.class,
+ schemaContextRegistry));
+ }
+ }
+
+ private static final class PasswordReaderProvider implements ReaderProvider {
+ @Override
+ public Reader<? extends DataSchemaNode> provide(final ConsoleIO consoleIO,
+ final CommandArgHandlerRegistry commandArgHandlerRegistry,
+ final SchemaContextRegistry schemaContextRegistry) {
+ return new PasswordReader(consoleIO, schemaContextRegistry.getLocalSchemaContext());
+ }
+ }
+
+ /**
+ * Writer providers, in order to construct readers lazily
+ */
+ private static interface WriterProvider {
+ Writer<DataSchemaNode> provide(ConsoleIO consoleIO, SchemaContext schema,
+ final CommandArgHandlerRegistry commandArgHandlerRegistry);
+ }
+
+ private class DataWriterProvider implements WriterProvider {
+ @Override
+ public Writer<DataSchemaNode> provide(final ConsoleIO consoleIO, final SchemaContext schema,
+ final CommandArgHandlerRegistry commandArgHandlerRegistry) {
+ return new DataWriter(consoleIO, new OutFormatter(), schema);
+ }
+ }
+}