NIFI-4839 - Added abbreviation in simple output for name, description, and comments - Refactored so that commands produce a result which can then be written or used - Added support for back-referencing results, initially prototyped by Andrew Grande - Fixed dynamic table layout when writing simple results - Added a new command group called 'demo' with a new 'quick-import' command - Fixes/improvements after previous refactoring - Created a reusable TableWriter and updating a few result classes to use it
Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/b68eebd4 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/b68eebd4 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/b68eebd4 Branch: refs/heads/master Commit: b68eebd4293bc921148d933ad94d890c388ce4d0 Parents: cc3c1b1 Author: Bryan Bende <[email protected]> Authored: Mon Feb 12 14:19:12 2018 -0500 Committer: Pierre Villard <[email protected]> Committed: Wed Feb 28 17:23:44 2018 +0100 ---------------------------------------------------------------------- .../apache/nifi/toolkit/cli/CLICompleter.java | 10 +- .../org/apache/nifi/toolkit/cli/CLIMain.java | 5 - .../apache/nifi/toolkit/cli/api/Command.java | 17 +- .../apache/nifi/toolkit/cli/api/Context.java | 2 - .../nifi/toolkit/cli/api/ReferenceResolver.java | 37 ++ .../nifi/toolkit/cli/api/Referenceable.java | 29 ++ .../org/apache/nifi/toolkit/cli/api/Result.java | 31 ++ .../nifi/toolkit/cli/api/ResultWriter.java | 65 ---- .../nifi/toolkit/cli/api/WritableResult.java | 36 ++ .../impl/client/NiFiRegistryClientFactory.java | 1 - .../cli/impl/command/AbstractCommand.java | 61 ++-- .../cli/impl/command/AbstractCommandGroup.java | 5 + .../impl/command/AbstractPropertyCommand.java | 24 +- .../cli/impl/command/CommandFactory.java | 2 + .../toolkit/cli/impl/command/CommandOption.java | 3 + .../cli/impl/command/CommandProcessor.java | 118 +++++-- .../composite/AbstractCompositeCommand.java | 137 +++++++ .../command/composite/DemoCommandGroup.java | 42 +++ .../cli/impl/command/composite/QuickImport.java | 248 +++++++++++++ .../toolkit/cli/impl/command/misc/Exit.java | 12 +- .../toolkit/cli/impl/command/misc/Help.java | 12 +- .../impl/command/nifi/AbstractNiFiCommand.java | 20 +- .../cli/impl/command/nifi/flow/CurrentUser.java | 13 +- .../cli/impl/command/nifi/flow/GetRootId.java | 9 +- .../impl/command/nifi/pg/PGChangeVersion.java | 8 +- .../impl/command/nifi/pg/PGGetAllVersions.java | 15 +- .../cli/impl/command/nifi/pg/PGGetVars.java | 13 +- .../cli/impl/command/nifi/pg/PGGetVersion.java | 12 +- .../cli/impl/command/nifi/pg/PGImport.java | 9 +- .../cli/impl/command/nifi/pg/PGList.java | 15 +- .../cli/impl/command/nifi/pg/PGSetVar.java | 8 +- .../cli/impl/command/nifi/pg/PGStart.java | 8 +- .../cli/impl/command/nifi/pg/PGStop.java | 11 +- .../nifi/registry/CreateRegistryClient.java | 9 +- .../nifi/registry/GetRegistryClientId.java | 17 +- .../nifi/registry/ListRegistryClients.java | 13 +- .../nifi/registry/UpdateRegistryClient.java | 8 +- .../registry/AbstractNiFiRegistryCommand.java | 20 +- .../command/registry/bucket/CreateBucket.java | 10 +- .../command/registry/bucket/DeleteBucket.java | 8 +- .../command/registry/bucket/ListBuckets.java | 15 +- .../impl/command/registry/flow/CreateFlow.java | 10 +- .../impl/command/registry/flow/DeleteFlow.java | 8 +- .../registry/flow/ExportFlowVersion.java | 21 +- .../registry/flow/ImportFlowVersion.java | 15 +- .../command/registry/flow/ListFlowVersions.java | 13 +- .../impl/command/registry/flow/ListFlows.java | 12 +- .../impl/command/registry/user/CurrentUser.java | 15 +- .../cli/impl/command/session/ClearSession.java | 8 +- .../cli/impl/command/session/GetVariable.java | 11 +- .../impl/command/session/RemoveVariable.java | 8 +- .../cli/impl/command/session/SetVariable.java | 8 +- .../cli/impl/command/session/ShowKeys.java | 13 +- .../cli/impl/command/session/ShowSession.java | 8 +- .../cli/impl/context/StandardContext.java | 34 -- .../cli/impl/result/AbstractWritableResult.java | 57 +++ .../toolkit/cli/impl/result/BucketsResult.java | 106 ++++++ .../impl/result/CurrentUserEntityResult.java | 48 +++ .../cli/impl/result/CurrentUserResult.java | 47 +++ .../cli/impl/result/JsonResultWriter.java | 111 ------ .../cli/impl/result/ProcessGroupsResult.java | 57 +++ .../cli/impl/result/RegistryClientIDResult.java | 44 +++ .../cli/impl/result/RegistryClientsResult.java | 79 +++++ .../cli/impl/result/SimpleResultWriter.java | 354 ------------------- .../toolkit/cli/impl/result/StringResult.java | 45 +++ .../cli/impl/result/VariableRegistryResult.java | 60 ++++ .../impl/result/VersionControlInfoResult.java | 55 +++ .../VersionedFlowSnapshotMetadataResult.java | 79 +++++ .../VersionedFlowSnapshotMetadataSetResult.java | 64 ++++ .../result/VersionedFlowSnapshotResult.java | 65 ++++ .../cli/impl/result/VersionedFlowsResult.java | 107 ++++++ .../nifi/toolkit/cli/impl/result/Void.java | 20 ++ .../toolkit/cli/impl/result/VoidResult.java | 39 ++ .../impl/result/writer/DynamicTableWriter.java | 123 +++++++ .../toolkit/cli/impl/result/writer/Table.java | 92 +++++ .../cli/impl/result/writer/TableColumn.java | 59 ++++ .../cli/impl/result/writer/TableWriter.java | 34 ++ .../cli/impl/session/SessionVariable.java | 58 +++ .../cli/impl/session/SessionVariables.java | 58 --- .../nifi/toolkit/cli/NiFiCLIMainRunner.java | 7 +- .../nifi/toolkit/cli/TestCLICompleter.java | 11 +- .../cli/impl/result/TestBucketsResult.java | 76 ++++ .../impl/result/TestRegistryClientResult.java | 89 +++++ ...TestVersionedFlowSnapshotMetadataResult.java | 80 +++++ .../impl/result/TestVersionedFlowsResult.java | 76 ++++ .../result/writer/TestDynamicTableWriter.java | 123 +++++++ 86 files changed, 2734 insertions(+), 911 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLICompleter.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLICompleter.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLICompleter.java index dad5416..7889b30 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLICompleter.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLICompleter.java @@ -20,7 +20,7 @@ import org.apache.nifi.toolkit.cli.api.Command; import org.apache.nifi.toolkit.cli.api.CommandGroup; import org.apache.nifi.toolkit.cli.impl.command.CommandOption; import org.apache.nifi.toolkit.cli.impl.command.session.SessionCommandGroup; -import org.apache.nifi.toolkit.cli.impl.session.SessionVariables; +import org.apache.nifi.toolkit.cli.impl.session.SessionVariable; import org.jline.builtins.Completers; import org.jline.reader.Candidate; import org.jline.reader.Completer; @@ -50,14 +50,16 @@ public class CLICompleter implements Completer { args.add("-" + CommandOption.PROPERTIES.getShortName()); args.add("-" + CommandOption.INPUT_SOURCE.getShortName()); args.add("-" + CommandOption.OUTPUT_FILE.getShortName()); + args.add("-" + CommandOption.NIFI_REG_PROPS.getShortName()); + args.add("-" + CommandOption.NIFI_PROPS.getShortName()); FILE_COMPLETION_ARGS = Collections.unmodifiableSet(args); } private static final Set<String> FILE_COMPLETION_VARS; static { final Set<String> vars = new HashSet<>(); - vars.add(SessionVariables.NIFI_CLIENT_PROPS.getVariableName()); - vars.add(SessionVariables.NIFI_REGISTRY_CLIENT_PROPS.getVariableName()); + vars.add(SessionVariable.NIFI_CLIENT_PROPS.getVariableName()); + vars.add(SessionVariable.NIFI_REGISTRY_CLIENT_PROPS.getVariableName()); FILE_COMPLETION_VARS = Collections.unmodifiableSet(vars); } @@ -178,7 +180,7 @@ public class CLICompleter implements Completer { // if we have two args then we are completing the variable name // if we have three args, and the third is one a variable that is a file path, then we need a file completer if (line.wordIndex() == 2) { - addCandidates(SessionVariables.getAllVariableNames(), candidates); + addCandidates(SessionVariable.getAllVariableNames(), candidates); } else if (line.wordIndex() == 3) { final String currWord = line.word(); final String prevWord = line.words().get(line.wordIndex() - 1); http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLIMain.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLIMain.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLIMain.java index 95da2fc..643fe03 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLIMain.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/CLIMain.java @@ -23,7 +23,6 @@ import org.apache.nifi.toolkit.cli.api.ClientFactory; import org.apache.nifi.toolkit.cli.api.Command; import org.apache.nifi.toolkit.cli.api.CommandGroup; import org.apache.nifi.toolkit.cli.api.Context; -import org.apache.nifi.toolkit.cli.api.ResultType; import org.apache.nifi.toolkit.cli.api.Session; import org.apache.nifi.toolkit.cli.impl.client.NiFiClientFactory; import org.apache.nifi.toolkit.cli.impl.client.NiFiRegistryClientFactory; @@ -31,8 +30,6 @@ import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient; import org.apache.nifi.toolkit.cli.impl.command.CommandFactory; import org.apache.nifi.toolkit.cli.impl.command.CommandProcessor; import org.apache.nifi.toolkit.cli.impl.context.StandardContext; -import org.apache.nifi.toolkit.cli.impl.result.JsonResultWriter; -import org.apache.nifi.toolkit.cli.impl.result.SimpleResultWriter; import org.apache.nifi.toolkit.cli.impl.session.InMemorySession; import org.apache.nifi.toolkit.cli.impl.session.PersistentSession; import org.jline.reader.Completer; @@ -195,8 +192,6 @@ public class CLIMain { .nifiClientFactory(niFiClientFactory) .nifiRegistryClientFactory(nifiRegClientFactory) .interactive(isInteractive) - .resultWriter(ResultType.SIMPLE, new SimpleResultWriter()) - .resultWriter(ResultType.JSON, new JsonResultWriter()) .build(); } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Command.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Command.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Command.java index 1a21a8b..3dffcf7 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Command.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Command.java @@ -22,7 +22,7 @@ import org.apache.commons.cli.Options; /** * Represents a command to execute. */ -public interface Command { +public interface Command<R extends Result> { /** * Called directly after instantiation of the given command before any other method is called. @@ -57,7 +57,20 @@ public interface Command { * Executes the command with the given CLI params. * * @param cli the parsed CLI for the command + * @return the Result of the command */ - void execute(CommandLine cli) throws CommandException; + R execute(CommandLine cli) throws CommandException; + + /** + * @return the implementation class of the result + */ + Class<R> getResultImplType(); + + /** + * @return true if the type of result produced is considered Referenceable + */ + default boolean isReferencable() { + return Referenceable.class.isAssignableFrom(getResultImplType()); + } } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Context.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Context.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Context.java index 14b5186..3053f78 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Context.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Context.java @@ -36,6 +36,4 @@ public interface Context { boolean isInteractive(); - ResultWriter getResultWriter(ResultType resultType); - } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ReferenceResolver.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ReferenceResolver.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ReferenceResolver.java new file mode 100644 index 0000000..de0feb8 --- /dev/null +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ReferenceResolver.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.api; + +/** + * An object that is capable of resolving a positional reference to some value that corresponds with the reference. + */ +public interface ReferenceResolver { + + /** + * Resolves the passed in positional reference to it's corresponding value. + * + * @param position a position in this back reference + * @return the resolved value for the given position + */ + String resolve(Integer position); + + /** + * @return true if the there are no references to resolve, false otherwise + */ + boolean isEmpty(); + +} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Referenceable.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Referenceable.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Referenceable.java new file mode 100644 index 0000000..af44152 --- /dev/null +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Referenceable.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.api; + +/** + * An object that is capable of producing a ReferenceResolver. + */ +public interface Referenceable { + + /** + * @return a ReferenceResolver for this Referenceable + */ + ReferenceResolver createReferenceResolver(Context context); + +} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Result.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Result.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Result.java new file mode 100644 index 0000000..751f9d3 --- /dev/null +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/Result.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.api; + +/** + * A result returned from a command. + * + * @param <T> the type of result + */ +public interface Result<T> { + + /** + * @return the result of a command + */ + T getResult(); + +} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ResultWriter.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ResultWriter.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ResultWriter.java deleted file mode 100644 index b7b0741..0000000 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/ResultWriter.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.api; - -import org.apache.nifi.registry.authorization.CurrentUser; -import org.apache.nifi.registry.bucket.Bucket; -import org.apache.nifi.registry.flow.VersionedFlow; -import org.apache.nifi.registry.flow.VersionedFlowSnapshotMetadata; -import org.apache.nifi.web.api.entity.CurrentUserEntity; -import org.apache.nifi.web.api.entity.ProcessGroupEntity; -import org.apache.nifi.web.api.entity.RegistryClientsEntity; -import org.apache.nifi.web.api.entity.VariableRegistryEntity; -import org.apache.nifi.web.api.entity.VersionControlInformationEntity; -import org.apache.nifi.web.api.entity.VersionedFlowSnapshotMetadataSetEntity; - -import java.io.IOException; -import java.io.PrintStream; -import java.util.List; - -/** - * Responsible for writing entities to the given stream. - */ -public interface ResultWriter { - - void writeBuckets(List<Bucket> buckets, PrintStream output) throws IOException; - - void writeBucket(Bucket bucket, PrintStream output) throws IOException; - - void writeFlows(List<VersionedFlow> versionedFlows, PrintStream output) throws IOException; - - void writeFlow(VersionedFlow versionedFlow, PrintStream output) throws IOException; - - void writeSnapshotMetadata(List<VersionedFlowSnapshotMetadata> versions, PrintStream output) throws IOException; - - void writeSnapshotMetadata(VersionedFlowSnapshotMetadata version, PrintStream output) throws IOException; - - void writeRegistryClients(RegistryClientsEntity clientsEntity, PrintStream output) throws IOException; - - void writeVariables(VariableRegistryEntity variableRegistryEntity, PrintStream output) throws IOException; - - void writeSnapshotMetadata(VersionedFlowSnapshotMetadataSetEntity versionedFlowSnapshotMetadataSetEntity, PrintStream output) throws IOException; - - void writeVersionControlInfo(VersionControlInformationEntity versionControlInformationEntity, PrintStream output) throws IOException; - - void writeProcessGroups(List<ProcessGroupEntity> processGroupEntities, PrintStream output) throws IOException; - - void writeCurrentUser(CurrentUserEntity currentUserEntity, PrintStream output) throws IOException; - - void writeCurrentUser(CurrentUser currentUser, PrintStream output) throws IOException; - -} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/WritableResult.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/WritableResult.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/WritableResult.java new file mode 100644 index 0000000..c827447 --- /dev/null +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/api/WritableResult.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.api; + +import java.io.IOException; +import java.io.PrintStream; + +/** + * A result that can be written to a PrintStream. + * + * @param <T> the type of result + */ +public interface WritableResult<T> extends Result<T> { + + /** + * Writes this result to the given output stream. + * + * @param output the output stream + * @throws IOException if an error occurs writing the result + */ + void write(PrintStream output) throws IOException; +} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/client/NiFiRegistryClientFactory.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/client/NiFiRegistryClientFactory.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/client/NiFiRegistryClientFactory.java index cb12edf..a8d1608 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/client/NiFiRegistryClientFactory.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/client/NiFiRegistryClientFactory.java @@ -97,7 +97,6 @@ public class NiFiRegistryClientFactory implements ClientFactory<NiFiRegistryClie // if a proxied entity was specified then return a wrapped client, otherwise return the regular client if (!StringUtils.isBlank(proxiedEntity)) { - System.out.println("Creating client for proxied entity: " + proxiedEntity); return new ProxiedNiFiRegistryClient(client, proxiedEntity); } else { return client; http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommand.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommand.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommand.java index 05cc27d..144680c 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommand.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommand.java @@ -24,8 +24,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.nifi.toolkit.cli.api.Command; import org.apache.nifi.toolkit.cli.api.Context; +import org.apache.nifi.toolkit.cli.api.Result; import org.apache.nifi.toolkit.cli.api.ResultType; -import org.apache.nifi.toolkit.cli.api.ResultWriter; import java.io.PrintStream; import java.io.PrintWriter; @@ -34,37 +34,47 @@ import java.util.Properties; /** * Base class for all commands. */ -public abstract class AbstractCommand implements Command { +public abstract class AbstractCommand<R extends Result> implements Command<R> { private final String name; + private final Class<R> resultClass; private final Options options; private Context context; private PrintStream output; - public AbstractCommand(final String name) { + public AbstractCommand(final String name, final Class<R> resultClass) { this.name = name; + this.resultClass = resultClass; Validate.notNull(this.name); + Validate.notNull(this.resultClass); - this.options = new Options(); + this.options = createBaseOptions(); + Validate.notNull(this.options); + } + + protected Options createBaseOptions() { + final Options options = new Options(); + + options.addOption(CommandOption.URL.createOption()); + options.addOption(CommandOption.PROPERTIES.createOption()); - this.options.addOption(CommandOption.URL.createOption()); - this.options.addOption(CommandOption.PROPERTIES.createOption()); + options.addOption(CommandOption.KEYSTORE.createOption()); + options.addOption(CommandOption.KEYSTORE_TYPE.createOption()); + options.addOption(CommandOption.KEYSTORE_PASSWORD.createOption()); + options.addOption(CommandOption.KEY_PASSWORD.createOption()); - this.options.addOption(CommandOption.KEYSTORE.createOption()); - this.options.addOption(CommandOption.KEYSTORE_TYPE.createOption()); - this.options.addOption(CommandOption.KEYSTORE_PASSWORD.createOption()); - this.options.addOption(CommandOption.KEY_PASSWORD.createOption()); + options.addOption(CommandOption.TRUSTSTORE.createOption()); + options.addOption(CommandOption.TRUSTSTORE_TYPE.createOption()); + options.addOption(CommandOption.TRUSTSTORE_PASSWORD.createOption()); - this.options.addOption(CommandOption.TRUSTSTORE.createOption()); - this.options.addOption(CommandOption.TRUSTSTORE_TYPE.createOption()); - this.options.addOption(CommandOption.TRUSTSTORE_PASSWORD.createOption()); + options.addOption(CommandOption.PROXIED_ENTITY.createOption()); - this.options.addOption(CommandOption.PROXIED_ENTITY.createOption()); + options.addOption(CommandOption.OUTPUT_TYPE.createOption()); + options.addOption(CommandOption.VERBOSE.createOption()); + options.addOption(CommandOption.HELP.createOption()); - this.options.addOption(CommandOption.OUTPUT_TYPE.createOption()); - this.options.addOption(CommandOption.VERBOSE.createOption()); - this.options.addOption(CommandOption.HELP.createOption()); + return options; } @Override @@ -89,11 +99,16 @@ public abstract class AbstractCommand implements Command { } @Override - public String getName() { + public final String getName() { return name; } @Override + public final Class<R> getResultImplType() { + return resultClass; + } + + @Override public Options getOptions() { return options; } @@ -116,6 +131,11 @@ public abstract class AbstractCommand implements Command { hf.printWrapped(printWriter, width, getDescription()); hf.printWrapped(printWriter, width, ""); + if (isReferencable()) { + hf.printWrapped(printWriter, width, "PRODUCES BACK-REFERENCES"); + hf.printWrapped(printWriter, width, ""); + } + hf.printHelp(printWriter, hf.getWidth(), getName(), null, getOptions(), hf.getLeftPadding(), hf.getDescPadding(), null, false); @@ -136,11 +156,6 @@ public abstract class AbstractCommand implements Command { output.println(); } - protected ResultWriter getResultWriter(final Properties properties) { - final ResultType resultType = getResultType(properties); - return context.getResultWriter(resultType); - } - protected ResultType getResultType(final Properties properties) { final ResultType resultType; if (properties.containsKey(CommandOption.OUTPUT_TYPE.getLongName())) { http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommandGroup.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommandGroup.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommandGroup.java index 531c025..40a95da 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommandGroup.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractCommandGroup.java @@ -81,6 +81,11 @@ public abstract class AbstractCommandGroup implements CommandGroup { hf.printWrapped(printWriter, width, ""); hf.printWrapped(printWriter, width, "- " + c.getDescription()); hf.printWrapped(printWriter, width, ""); + + if (c.isReferencable()) { + hf.printWrapped(printWriter, width, "PRODUCES BACK-REFERENCES"); + hf.printWrapped(printWriter, width, ""); + } }); printWriter.flush(); http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractPropertyCommand.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractPropertyCommand.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractPropertyCommand.java index fb4dc7f..fca901c 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractPropertyCommand.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/AbstractPropertyCommand.java @@ -20,8 +20,9 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.apache.commons.lang3.StringUtils; import org.apache.nifi.toolkit.cli.api.CommandException; +import org.apache.nifi.toolkit.cli.api.Result; import org.apache.nifi.toolkit.cli.api.Session; -import org.apache.nifi.toolkit.cli.impl.session.SessionVariables; +import org.apache.nifi.toolkit.cli.impl.session.SessionVariable; import java.io.FileInputStream; import java.io.InputStream; @@ -30,14 +31,14 @@ import java.util.Properties; /** * Base class for commands that support loading properties from the session or an argument. */ -public abstract class AbstractPropertyCommand extends AbstractCommand { +public abstract class AbstractPropertyCommand<R extends Result> extends AbstractCommand<R> { - public AbstractPropertyCommand(String name) { - super(name); + public AbstractPropertyCommand(final String name, final Class<R> resultClass) { + super(name, resultClass); } @Override - public void execute(final CommandLine commandLine) throws CommandException { + public final R execute(final CommandLine commandLine) throws CommandException { try { final Properties properties = new Properties(); @@ -51,7 +52,7 @@ public abstract class AbstractPropertyCommand extends AbstractCommand { } } else { // no properties file was specified so see if there is anything in the session - final SessionVariables sessionVariable = getPropertiesSessionVariable(); + final SessionVariable sessionVariable = getPropertiesSessionVariable(); if (sessionVariable != null) { final Session session = getContext().getSession(); final String sessionPropsFiles = session.get(sessionVariable.getVariableName()); @@ -70,7 +71,7 @@ public abstract class AbstractPropertyCommand extends AbstractCommand { } // delegate to sub-classes - doExecute(properties); + return doExecute(properties); } catch (CommandException ce) { throw ce; @@ -80,16 +81,17 @@ public abstract class AbstractPropertyCommand extends AbstractCommand { } /** - * @return the SessionVariables that specifies the properties file for this command, or null if not supported + * @return the SessionVariable that specifies the properties file for this command, or null if not supported */ - protected abstract SessionVariables getPropertiesSessionVariable(); + protected abstract SessionVariable getPropertiesSessionVariable(); /** * Sub-classes implement specific command logic. * * @param properties the properties which represent the arguments - * @throws CommandException if an error occurrs + * @return the Result of executing the command + * @throws CommandException if an error occurs */ - protected abstract void doExecute(final Properties properties) throws CommandException; + public abstract R doExecute(final Properties properties) throws CommandException; } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandFactory.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandFactory.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandFactory.java index aec0ae4..c3dd791 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandFactory.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandFactory.java @@ -19,6 +19,7 @@ package org.apache.nifi.toolkit.cli.impl.command; import org.apache.nifi.toolkit.cli.api.Command; import org.apache.nifi.toolkit.cli.api.CommandGroup; import org.apache.nifi.toolkit.cli.api.Context; +import org.apache.nifi.toolkit.cli.impl.command.composite.DemoCommandGroup; import org.apache.nifi.toolkit.cli.impl.command.misc.Exit; import org.apache.nifi.toolkit.cli.impl.command.misc.Help; import org.apache.nifi.toolkit.cli.impl.command.nifi.NiFiCommandGroup; @@ -55,6 +56,7 @@ public class CommandFactory { final List<CommandGroup> groups = new ArrayList<>(); groups.add(new NiFiRegistryCommandGroup()); groups.add(new NiFiCommandGroup()); + groups.add(new DemoCommandGroup()); groups.add(new SessionCommandGroup()); final Map<String,CommandGroup> groupMap = new TreeMap<>(); http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandOption.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandOption.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandOption.java index cf325a1..9990b22 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandOption.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandOption.java @@ -30,6 +30,9 @@ public enum CommandOption { PROPERTIES("p", "properties", "A properties file to load arguments from, " + "command line values will override anything in the properties file, must contain full path to file", true), + NIFI_PROPS("nifiProps", "nifiProps", "A properties file to load for NiFi config", true), + NIFI_REG_PROPS("nifiRegProps", "nifiRegProps", "A properties file to load for NiFi Registry config", true), + // Registry - Buckets BUCKET_ID("b", "bucketIdentifier", "A bucket identifier", true), BUCKET_NAME("bn", "bucketName", "A bucket name", true), http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandProcessor.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandProcessor.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandProcessor.java index 6cf3114..98fc5f8 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandProcessor.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/CommandProcessor.java @@ -25,21 +25,30 @@ import org.apache.commons.lang3.Validate; import org.apache.nifi.toolkit.cli.api.Command; import org.apache.nifi.toolkit.cli.api.CommandGroup; import org.apache.nifi.toolkit.cli.api.Context; +import org.apache.nifi.toolkit.cli.api.ReferenceResolver; +import org.apache.nifi.toolkit.cli.api.Referenceable; +import org.apache.nifi.toolkit.cli.api.Result; +import org.apache.nifi.toolkit.cli.api.WritableResult; import java.io.PrintStream; import java.util.Arrays; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; /** * Takes the arguments from the shell and executes the appropriate command, or prints appropriate usage. */ public class CommandProcessor { + public static final String BACK_REF_INDICATOR = "&"; + private final Map<String,Command> topLevelCommands; private final Map<String,CommandGroup> commandGroups; private final Context context; private final PrintStream out; + private final AtomicReference<ReferenceResolver> backReferenceHolder = new AtomicReference<>(null); + public CommandProcessor(final Map<String,Command> topLevelCommands, final Map<String,CommandGroup> commandGroups, final Context context) { this.topLevelCommands = topLevelCommands; this.commandGroups = commandGroups; @@ -67,12 +76,17 @@ public class CommandProcessor { out.println(); commandGroups.entrySet().stream().forEach(e -> e.getValue().printUsage(verbose)); - out.println("-------------------------------------------------------------------------------"); + if (verbose) { + out.println("-------------------------------------------------------------------------------"); + } topLevelCommands.keySet().stream().forEach(k -> out.println("\t" + k)); out.println(); } - private CommandLine parseCli(Command command, String[] args) throws ParseException { + private CommandLine parseCli(final Command command, final String[] args) throws ParseException { + // resolve any back-references so the CommandLine ends up with the resolved values in the Options + resolveBackReferences(args); + final Options options = command.getOptions(); final CommandLineParser parser = new DefaultParser(); final CommandLine commandLine = parser.parse(options, args); @@ -85,6 +99,42 @@ public class CommandProcessor { return commandLine; } + /** + * Finds any args that indicate a back-reference and replaces the value of the arg with the + * resolved back-reference. + * + * If the reference does not resolve, or non-numeric position is given, then the arg is left unchanged. + * + * @param args the args to process + */ + private void resolveBackReferences(final String[] args) { + final ReferenceResolver referenceResolver = backReferenceHolder.get(); + if (referenceResolver == null) { + return; + } + + for (int i=0; i < args.length; i++) { + final String arg = args[i]; + if (arg == null || !arg.startsWith(BACK_REF_INDICATOR)) { + continue; + } + + if (context.isInteractive()) { + context.getOutput().println(); + } + + try { + final Integer pos = Integer.valueOf(arg.substring(1)); + final String resolvedReference = referenceResolver.resolve(pos); + if (resolvedReference != null) { + args[i] = resolvedReference; + } + } catch (Exception e) { + // skip + } + } + } + public void process(String[] args) { if (args == null || args.length == 0) { printBasicUsage(null); @@ -123,20 +173,7 @@ public class CommandProcessor { return; } - try { - if (otherArgs.length == 1 && CommandOption.HELP.getLongName().equalsIgnoreCase(otherArgs[0])) { - command.printUsage(null); - } else { - command.execute(commandLine); - } - } catch (Exception e) { - command.printUsage(e.getMessage()); - if (commandLine.hasOption(CommandOption.VERBOSE.getLongName())) { - out.println(); - e.printStackTrace(out); - out.println(); - } - } + processCommand(otherArgs, commandLine, command); } catch (Exception e) { out.println(); @@ -172,20 +209,7 @@ public class CommandProcessor { return; } - try { - if (otherArgs.length == 1 && CommandOption.HELP.getLongName().equalsIgnoreCase(otherArgs[0])) { - command.printUsage(null); - } else { - command.execute(commandLine); - } - } catch (Exception e) { - command.printUsage(e.getMessage()); - if (commandLine.hasOption(CommandOption.VERBOSE.getLongName())) { - out.println(); - e.printStackTrace(out); - out.println(); - } - } + processCommand(otherArgs, commandLine, command); } catch (Exception e) { out.println(); @@ -194,5 +218,39 @@ public class CommandProcessor { } } + private void processCommand(final String[] args, final CommandLine commandLine, final Command command) { + try { + if (args.length == 1 && CommandOption.HELP.getLongName().equalsIgnoreCase(args[0])) { + command.printUsage(null); + } else { + final Result result = command.execute(commandLine); + + if (result instanceof WritableResult) { + final WritableResult writableResult = (WritableResult) result; + writableResult.write(out); + } + + // if the Result is Referenceable then create the resolver and store it in the holder for the next command + if (result instanceof Referenceable) { + final Referenceable referenceable = (Referenceable) result; + final ReferenceResolver referenceResolver = referenceable.createReferenceResolver(context); + + // only set the resolve if its not empty so that a resolver that was already in there sticks around + // and can be used again if the current command didn't produce anything to resolve + if (!referenceResolver.isEmpty()) { + backReferenceHolder.set(referenceResolver); + } + } + } + } catch (Exception e) { + command.printUsage(e.getMessage()); + if (commandLine.hasOption(CommandOption.VERBOSE.getLongName())) { + out.println(); + e.printStackTrace(out); + out.println(); + } + } + } + } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/AbstractCompositeCommand.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/AbstractCompositeCommand.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/AbstractCompositeCommand.java new file mode 100644 index 0000000..1c1e8db --- /dev/null +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/AbstractCompositeCommand.java @@ -0,0 +1,137 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.impl.command.composite; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.apache.commons.lang3.StringUtils; +import org.apache.nifi.registry.client.NiFiRegistryClient; +import org.apache.nifi.registry.client.NiFiRegistryException; +import org.apache.nifi.toolkit.cli.api.ClientFactory; +import org.apache.nifi.toolkit.cli.api.CommandException; +import org.apache.nifi.toolkit.cli.api.Result; +import org.apache.nifi.toolkit.cli.api.Session; +import org.apache.nifi.toolkit.cli.api.SessionException; +import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient; +import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException; +import org.apache.nifi.toolkit.cli.impl.command.AbstractCommand; +import org.apache.nifi.toolkit.cli.impl.command.CommandOption; +import org.apache.nifi.toolkit.cli.impl.session.SessionVariable; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +/** + * Base class for higher-level marco commands that interact with NiFi & Registry to perform a series of actions. + */ +public abstract class AbstractCompositeCommand<R extends Result> extends AbstractCommand<R> { + + public AbstractCompositeCommand(final String name, final Class<R> resultClass) { + super(name, resultClass); + } + + @Override + protected final Options createBaseOptions() { + final Options options = new Options(); + options.addOption(CommandOption.NIFI_PROPS.createOption()); + options.addOption(CommandOption.NIFI_REG_PROPS.createOption()); + options.addOption(CommandOption.VERBOSE.createOption()); + return options; + } + + @Override + public final R execute(final CommandLine cli) throws CommandException { + try { + final Properties nifiProperties = createProperties(cli, CommandOption.NIFI_PROPS, SessionVariable.NIFI_CLIENT_PROPS); + if (nifiProperties == null) { + throw new CommandException("Unable to find NiFi config, must specify --" + + CommandOption.NIFI_PROPS.getLongName() + ", or setup session config"); + } + + final ClientFactory<NiFiClient> nifiClientFactory = getContext().getNiFiClientFactory(); + final NiFiClient nifiClient = nifiClientFactory.createClient(nifiProperties); + + final Properties registryProperties = createProperties(cli, CommandOption.NIFI_REG_PROPS, SessionVariable.NIFI_REGISTRY_CLIENT_PROPS); + if (registryProperties == null) { + throw new CommandException("Unable to find NiFi Registry config, must specify --" + + CommandOption.NIFI_REG_PROPS.getLongName() + ", or setup session config"); + } + + final ClientFactory<NiFiRegistryClient> registryClientFactory = getContext().getNiFiRegistryClientFactory(); + final NiFiRegistryClient registryClient = registryClientFactory.createClient(registryProperties); + + return doExecute(cli, nifiClient, nifiProperties, registryClient, registryProperties); + } catch (CommandException ce) { + throw ce; + } catch (Exception e) { + throw new CommandException("Error executing command '" + getName() + "' : " + e.getMessage(), e); + } + } + + /** + * Creates a Properties instance by looking at the propertOption and falling back to the session. + * + * @param commandLine the current command line + * @param propertyOption the options specifying a properties to load + * @param sessionVariable the session variable specifying a properties file + * @return a Properties instance or null if the option wasn't specified and nothing is in the session + */ + private Properties createProperties(final CommandLine commandLine, final CommandOption propertyOption, final SessionVariable sessionVariable) + throws IOException, SessionException { + + // use the properties file specified by the properyOption if it exists + if (commandLine.hasOption(propertyOption.getLongName())) { + final String propertiesFile = commandLine.getOptionValue(propertyOption.getLongName()); + if (!StringUtils.isBlank(propertiesFile)) { + try (final InputStream in = new FileInputStream(propertiesFile)) { + final Properties properties = new Properties(); + properties.load(in); + return properties; + } + } + } else { + // no properties file was specified so see if there is anything in the session + if (sessionVariable != null) { + final Session session = getContext().getSession(); + final String sessionPropsFiles = session.get(sessionVariable.getVariableName()); + if (!StringUtils.isBlank(sessionPropsFiles)) { + try (final InputStream in = new FileInputStream(sessionPropsFiles)) { + final Properties properties = new Properties(); + properties.load(in); + return properties; + } + } + } + } + + return null; + } + + /** + * Sub-classes implement specific logic using both clients. + */ + public abstract R doExecute(final CommandLine commandLine, + final NiFiClient nifiClient, + final Properties nifiProperties, + final NiFiRegistryClient nifiRegistryClient, + final Properties nifiRegistryProperties) + throws CommandException, IOException, NiFiRegistryException, ParseException, NiFiClientException; + +} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/DemoCommandGroup.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/DemoCommandGroup.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/DemoCommandGroup.java new file mode 100644 index 0000000..3dbfea3 --- /dev/null +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/DemoCommandGroup.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.impl.command.composite; + +import org.apache.nifi.toolkit.cli.api.Command; +import org.apache.nifi.toolkit.cli.impl.command.AbstractCommandGroup; + +import java.util.ArrayList; +import java.util.List; + +/** + * Command group for quick demo commands. + */ +public class DemoCommandGroup extends AbstractCommandGroup { + + public static final String NAME = "demo"; + + public DemoCommandGroup() { + super(NAME); + } + + @Override + protected List<Command> createCommands() { + final List<Command> commands = new ArrayList<>(); + commands.add(new QuickImport()); + return commands; + } +} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/QuickImport.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/QuickImport.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/QuickImport.java new file mode 100644 index 0000000..5c504a4 --- /dev/null +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/composite/QuickImport.java @@ -0,0 +1,248 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.nifi.toolkit.cli.impl.command.composite; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.MissingOptionException; +import org.apache.commons.cli.ParseException; +import org.apache.commons.lang3.StringUtils; +import org.apache.nifi.registry.bucket.Bucket; +import org.apache.nifi.registry.client.NiFiRegistryClient; +import org.apache.nifi.registry.client.NiFiRegistryException; +import org.apache.nifi.toolkit.cli.api.Context; +import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient; +import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException; +import org.apache.nifi.toolkit.cli.impl.command.CommandOption; +import org.apache.nifi.toolkit.cli.impl.command.nifi.pg.PGImport; +import org.apache.nifi.toolkit.cli.impl.command.nifi.registry.CreateRegistryClient; +import org.apache.nifi.toolkit.cli.impl.command.nifi.registry.GetRegistryClientId; +import org.apache.nifi.toolkit.cli.impl.command.registry.bucket.CreateBucket; +import org.apache.nifi.toolkit.cli.impl.command.registry.bucket.ListBuckets; +import org.apache.nifi.toolkit.cli.impl.command.registry.flow.CreateFlow; +import org.apache.nifi.toolkit.cli.impl.command.registry.flow.ImportFlowVersion; +import org.apache.nifi.toolkit.cli.impl.result.BucketsResult; +import org.apache.nifi.toolkit.cli.impl.result.RegistryClientIDResult; +import org.apache.nifi.toolkit.cli.impl.result.StringResult; + +import java.io.IOException; +import java.util.Date; +import java.util.Properties; + +/** + * Command to demonstrate a quick import capability. + */ +public class QuickImport extends AbstractCompositeCommand<StringResult> { + + public static final String BUCKET_NAME = "Quick Import"; + public static final String BUCKET_DESC = "Created to demonstrate quickly importing a flow with NiFi CLI."; + + public static final String FLOW_NAME = "Quick Import - "; + public static final String FLOW_DESC = "Automatically imported on "; + + public static final String REG_CLIENT_NAME = "Quick Import"; + public static final String REG_CLIENT_DESC = "Automatically created on "; + + private final ListBuckets listBuckets; + private final CreateBucket createBucket; + private final CreateFlow createFlow; + private final ImportFlowVersion importFlowVersion; + private final GetRegistryClientId getRegistryClientId; + private final CreateRegistryClient createRegistryClient; + private final PGImport pgImport; + + public QuickImport() { + super("quick-import", StringResult.class); + this.listBuckets = new ListBuckets(); + this.createBucket = new CreateBucket(); + this.createFlow = new CreateFlow(); + this.importFlowVersion = new ImportFlowVersion(); + this.getRegistryClientId = new GetRegistryClientId(); + this.createRegistryClient = new CreateRegistryClient(); + this.pgImport = new PGImport(); + } + + @Override + public String getDescription() { + return "Imports a flow from a file or a public URL into a pre-defined bucket named '" + BUCKET_NAME + "'. This command will " + + "create the bucket if it doesn't exist, and will create a new flow for each execution. The flow will then be imported " + + "to the given NiFi instance."; + } + + @Override + protected void doInitialize(Context context) { + // add additional options + addOption(CommandOption.INPUT_SOURCE.createOption()); + + // initialize sub-commands since we are managing their lifecycle ourselves here + listBuckets.initialize(context); + createBucket.initialize(context); + createFlow.initialize(context); + importFlowVersion.initialize(context); + getRegistryClientId.initialize(context); + createRegistryClient.initialize(context); + pgImport.initialize(context); + } + + @Override + public StringResult doExecute(final CommandLine cli, final NiFiClient nifiClient, final Properties nifiProps, + final NiFiRegistryClient registryClient, final Properties registryProps) + throws IOException, NiFiRegistryException, ParseException, NiFiClientException { + + final boolean isInteractive = getContext().isInteractive(); + + // determine the registry client in NiFi to use, or create one + // do this first so that we don't get through creating buckets, flows, etc, and then fail on the reg client + final String registryClientBaseUrl = registryProps.getProperty(CommandOption.URL.getLongName()); + final String registryClientId = getRegistryClientId(nifiClient, registryClientBaseUrl, isInteractive); + + // get or create the quick import bucket + final String quickImportBucketId = getQuickImportBucketId(registryClient, isInteractive); + + // create a new flow in the quick-import bucket + final String quickImportFlowId = createQuickImportFlow(registryClient, quickImportBucketId, isInteractive); + + // import the versioned flow snapshot into newly created quick-import flow + final String inputSource = cli.getOptionValue(CommandOption.INPUT_SOURCE.getLongName()); + if (StringUtils.isBlank(inputSource)) { + throw new MissingOptionException("Missing required option --" + CommandOption.INPUT_SOURCE.getLongName()); + } + + final String quickImportFlowVersion = importFlowVersion(registryClient, quickImportFlowId, isInteractive, inputSource); + + // pg-import to nifi + final Properties pgImportProps = new Properties(); + pgImportProps.setProperty(CommandOption.REGISTRY_CLIENT_ID.getLongName(), registryClientId); + pgImportProps.setProperty(CommandOption.BUCKET_ID.getLongName(), quickImportBucketId); + pgImportProps.setProperty(CommandOption.FLOW_ID.getLongName(), quickImportFlowId); + pgImportProps.setProperty(CommandOption.FLOW_VERSION.getLongName(), quickImportFlowVersion); + + final StringResult createdPgResult = pgImport.doExecute(nifiClient, pgImportProps); + + if (isInteractive) { + println(); + println("Imported process group to NiFi..."); + println(); + } + + return createdPgResult; + } + + private String importFlowVersion(final NiFiRegistryClient registryClient, final String quickImportFlowId, final boolean isInteractive, final String inputSource) + throws ParseException, IOException, NiFiRegistryException { + final Properties importVersionProps = new Properties(); + importVersionProps.setProperty(CommandOption.FLOW_ID.getLongName(), quickImportFlowId); + importVersionProps.setProperty(CommandOption.INPUT_SOURCE.getLongName(), inputSource); + + final StringResult createdVersion = importFlowVersion.doExecute(registryClient, importVersionProps); + final String quickImportFlowVersion = createdVersion.getResult(); + + if (isInteractive) { + println(); + println("Imported flow version..."); + } + return quickImportFlowVersion; + } + + private String createQuickImportFlow(final NiFiRegistryClient registryClient, final String quickImportBucketId, final boolean isInteractive) + throws ParseException, IOException, NiFiRegistryException { + final String flowName = FLOW_NAME + System.currentTimeMillis(); + final String flowDescription = FLOW_DESC + (new Date()).toString(); + + final Properties createFlowProps = new Properties(); + createFlowProps.setProperty(CommandOption.FLOW_NAME.getLongName(), flowName); + createFlowProps.setProperty(CommandOption.FLOW_DESC.getLongName(), flowDescription); + createFlowProps.setProperty(CommandOption.BUCKET_ID.getLongName(), quickImportBucketId); + + final StringResult createdFlow = createFlow.doExecute(registryClient, createFlowProps); + final String quickImportFlowId = createdFlow.getResult(); + + if (isInteractive) { + println(); + println("Created new flow '" + flowName + "'..."); + } + return quickImportFlowId; + } + + private String getQuickImportBucketId(final NiFiRegistryClient registryClient, final boolean isInteractive) + throws IOException, NiFiRegistryException, MissingOptionException { + + final BucketsResult bucketsResult = listBuckets.doExecute(registryClient, new Properties()); + + final Bucket quickImportBucket = bucketsResult.getResult().stream() + .filter(b -> BUCKET_NAME.equals(b.getName())) + .findFirst().orElse(null); + + // if it doesn't exist, then create the quick import bucket + String quickImportBucketId = null; + if (quickImportBucket != null) { + quickImportBucketId = quickImportBucket.getIdentifier(); + if (isInteractive) { + println(); + println("Found existing bucket '" + BUCKET_NAME + "'..."); + } + } else { + final Properties createBucketProps = new Properties(); + createBucketProps.setProperty(CommandOption.BUCKET_NAME.getLongName(), BUCKET_NAME); + createBucketProps.setProperty(CommandOption.BUCKET_DESC.getLongName(), BUCKET_DESC); + + final StringResult createdBucketId = createBucket.doExecute(registryClient, createBucketProps); + quickImportBucketId = createdBucketId.getResult(); + if (isInteractive) { + println(); + println("Created new bucket '" + BUCKET_NAME + "'..."); + } + } + return quickImportBucketId; + } + + private String getRegistryClientId(final NiFiClient nifiClient, final String registryClientBaseUrl, final boolean isInteractive) + throws NiFiClientException, IOException, MissingOptionException { + + final Properties getRegClientProps = new Properties(); + getRegClientProps.setProperty(CommandOption.REGISTRY_CLIENT_URL.getLongName(), registryClientBaseUrl); + + String registryClientId; + try { + final RegistryClientIDResult registryClientResult = getRegistryClientId.doExecute(nifiClient, getRegClientProps); + registryClientId = registryClientResult.getResult().getId(); + if (isInteractive) { + println(); + println("Found existing registry client '" + registryClientResult.getResult().getName() + "'..."); + } + } catch (Exception e) { + registryClientId = null; + } + + if (registryClientId == null) { + final Properties createRegClientProps = new Properties(); + createRegClientProps.setProperty(CommandOption.REGISTRY_CLIENT_NAME.getLongName(), REG_CLIENT_NAME); + createRegClientProps.setProperty(CommandOption.REGISTRY_CLIENT_DESC.getLongName(), REG_CLIENT_DESC + new Date().toString()); + createRegClientProps.setProperty(CommandOption.REGISTRY_CLIENT_URL.getLongName(), registryClientBaseUrl); + + final StringResult createdRegClient = createRegistryClient.doExecute(nifiClient, createRegClientProps); + registryClientId = createdRegClient.getResult(); + + if (isInteractive) { + println(); + println("Created new registry client '" + REG_CLIENT_NAME + "'..."); + } + } + + return registryClientId; + } + +} http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Exit.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Exit.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Exit.java index 974f7f0..c8c6166 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Exit.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Exit.java @@ -19,13 +19,13 @@ package org.apache.nifi.toolkit.cli.impl.command.misc; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.nifi.toolkit.cli.api.Command; -import org.apache.nifi.toolkit.cli.api.CommandException; import org.apache.nifi.toolkit.cli.api.Context; +import org.apache.nifi.toolkit.cli.impl.result.VoidResult; /** * Command for exiting the shell. */ -public class Exit implements Command { +public class Exit implements Command<VoidResult> { @Override public void initialize(final Context context) { @@ -53,8 +53,14 @@ public class Exit implements Command { } @Override - public void execute(final CommandLine cli) throws CommandException { + public VoidResult execute(final CommandLine cli) { System.exit(0); + return VoidResult.getInstance(); + } + + @Override + public Class<VoidResult> getResultImplType() { + return VoidResult.class; } } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Help.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Help.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Help.java index 0544089..76440e2 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Help.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/misc/Help.java @@ -19,13 +19,13 @@ package org.apache.nifi.toolkit.cli.impl.command.misc; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Options; import org.apache.nifi.toolkit.cli.api.Command; -import org.apache.nifi.toolkit.cli.api.CommandException; import org.apache.nifi.toolkit.cli.api.Context; +import org.apache.nifi.toolkit.cli.impl.result.VoidResult; /** * Place-holder so "help" shows up in top-level commands. */ -public class Help implements Command { +public class Help implements Command<VoidResult> { @Override public void initialize(final Context context) { @@ -53,8 +53,12 @@ public class Help implements Command { } @Override - public void execute(final CommandLine cli) throws CommandException { - // nothing to do + public VoidResult execute(final CommandLine cli) { + return VoidResult.getInstance(); } + @Override + public Class<VoidResult> getResultImplType() { + return VoidResult.class; + } } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/AbstractNiFiCommand.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/AbstractNiFiCommand.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/AbstractNiFiCommand.java index cfe3e53..4cf95db 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/AbstractNiFiCommand.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/AbstractNiFiCommand.java @@ -19,10 +19,11 @@ package org.apache.nifi.toolkit.cli.impl.command.nifi; import org.apache.commons.cli.MissingOptionException; import org.apache.nifi.toolkit.cli.api.ClientFactory; import org.apache.nifi.toolkit.cli.api.CommandException; +import org.apache.nifi.toolkit.cli.api.Result; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException; import org.apache.nifi.toolkit.cli.impl.command.AbstractPropertyCommand; -import org.apache.nifi.toolkit.cli.impl.session.SessionVariables; +import org.apache.nifi.toolkit.cli.impl.session.SessionVariable; import org.apache.nifi.web.api.dto.RevisionDTO; import java.io.IOException; @@ -31,22 +32,22 @@ import java.util.Properties; /** * Base class for all NiFi commands. */ -public abstract class AbstractNiFiCommand extends AbstractPropertyCommand { +public abstract class AbstractNiFiCommand<R extends Result> extends AbstractPropertyCommand<R> { - public AbstractNiFiCommand(final String name) { - super(name); + public AbstractNiFiCommand(final String name, final Class<R> resultClass) { + super(name, resultClass); } @Override - protected SessionVariables getPropertiesSessionVariable() { - return SessionVariables.NIFI_CLIENT_PROPS; + protected SessionVariable getPropertiesSessionVariable() { + return SessionVariable.NIFI_CLIENT_PROPS; } @Override - protected void doExecute(final Properties properties) throws CommandException { + public final R doExecute(final Properties properties) throws CommandException { final ClientFactory<NiFiClient> clientFactory = getContext().getNiFiClientFactory(); try (final NiFiClient client = clientFactory.createClient(properties)) { - doExecute(client, properties); + return doExecute(client, properties); } catch (Exception e) { throw new CommandException("Error executing command '" + getName() + "' : " + e.getMessage(), e); } @@ -57,8 +58,9 @@ public abstract class AbstractNiFiCommand extends AbstractPropertyCommand { * * @param client a NiFi client * @param properties properties for the command + * @return the Result of executing the command */ - protected abstract void doExecute(final NiFiClient client, final Properties properties) + public abstract R doExecute(final NiFiClient client, final Properties properties) throws NiFiClientException, IOException, MissingOptionException, CommandException; http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/CurrentUser.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/CurrentUser.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/CurrentUser.java index 4c09510..3f21dea 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/CurrentUser.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/CurrentUser.java @@ -16,11 +16,12 @@ */ package org.apache.nifi.toolkit.cli.impl.command.nifi.flow; -import org.apache.nifi.toolkit.cli.api.ResultWriter; import org.apache.nifi.toolkit.cli.impl.client.nifi.FlowClient; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException; import org.apache.nifi.toolkit.cli.impl.command.nifi.AbstractNiFiCommand; +import org.apache.nifi.toolkit.cli.impl.result.CurrentUserEntityResult; +import org.apache.nifi.web.api.entity.CurrentUserEntity; import java.io.IOException; import java.util.Properties; @@ -28,10 +29,10 @@ import java.util.Properties; /** * Command to get information about the current user accessing the NiFi instance. */ -public class CurrentUser extends AbstractNiFiCommand { +public class CurrentUser extends AbstractNiFiCommand<CurrentUserEntityResult> { public CurrentUser() { - super("current-user"); + super("current-user", CurrentUserEntityResult.class); } @Override @@ -41,10 +42,10 @@ public class CurrentUser extends AbstractNiFiCommand { } @Override - protected void doExecute(NiFiClient client, Properties properties) + public CurrentUserEntityResult doExecute(NiFiClient client, Properties properties) throws NiFiClientException, IOException { final FlowClient flowClient = client.getFlowClient(); - final ResultWriter resultWriter = getResultWriter(properties); - resultWriter.writeCurrentUser(flowClient.getCurrentUser(), getContext().getOutput()); + final CurrentUserEntity currentUserEntity = flowClient.getCurrentUser(); + return new CurrentUserEntityResult(getResultType(properties), currentUserEntity); } } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/GetRootId.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/GetRootId.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/GetRootId.java index bf1fb75..be27f33 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/GetRootId.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/flow/GetRootId.java @@ -20,6 +20,7 @@ import org.apache.nifi.toolkit.cli.impl.client.nifi.FlowClient; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException; import org.apache.nifi.toolkit.cli.impl.command.nifi.AbstractNiFiCommand; +import org.apache.nifi.toolkit.cli.impl.result.StringResult; import java.io.IOException; import java.util.Properties; @@ -27,10 +28,10 @@ import java.util.Properties; /** * Returns the id of the root process group of the given NiFi instance. */ -public class GetRootId extends AbstractNiFiCommand { +public class GetRootId extends AbstractNiFiCommand<StringResult> { public GetRootId() { - super("get-root-id"); + super("get-root-id", StringResult.class); } @Override @@ -39,10 +40,10 @@ public class GetRootId extends AbstractNiFiCommand { } @Override - protected void doExecute(final NiFiClient client, final Properties properties) + public StringResult doExecute(final NiFiClient client, final Properties properties) throws NiFiClientException, IOException { final FlowClient flowClient = client.getFlowClient(); - println(flowClient.getRootGroupId()); + return new StringResult(flowClient.getRootGroupId()); } } http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java index 87d7845..cf332b0 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGChangeVersion.java @@ -25,6 +25,7 @@ import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException; import org.apache.nifi.toolkit.cli.impl.client.nifi.VersionsClient; import org.apache.nifi.toolkit.cli.impl.command.CommandOption; import org.apache.nifi.toolkit.cli.impl.command.nifi.AbstractNiFiCommand; +import org.apache.nifi.toolkit.cli.impl.result.VoidResult; import org.apache.nifi.web.api.dto.VersionControlInformationDTO; import org.apache.nifi.web.api.entity.VersionControlInformationEntity; import org.apache.nifi.web.api.entity.VersionedFlowSnapshotMetadataEntity; @@ -37,10 +38,10 @@ import java.util.Properties; /** * Command to change the version of a version controlled process group. */ -public class PGChangeVersion extends AbstractNiFiCommand { +public class PGChangeVersion extends AbstractNiFiCommand<VoidResult> { public PGChangeVersion() { - super("pg-change-version"); + super("pg-change-version", VoidResult.class); } @Override @@ -57,7 +58,7 @@ public class PGChangeVersion extends AbstractNiFiCommand { } @Override - protected void doExecute(final NiFiClient client, final Properties properties) + public VoidResult doExecute(final NiFiClient client, final Properties properties) throws NiFiClientException, IOException, MissingOptionException, CommandException { final String pgId = getRequiredArg(properties, CommandOption.PG_ID); @@ -117,6 +118,7 @@ public class PGChangeVersion extends AbstractNiFiCommand { versionsClient.deleteUpdateRequest(updateRequestId); } + return VoidResult.getInstance(); } private int getLatestVersion(final NiFiClient client, final VersionControlInformationDTO existingVersionControlDTO) http://git-wip-us.apache.org/repos/asf/nifi/blob/b68eebd4/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGGetAllVersions.java ---------------------------------------------------------------------- diff --git a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGGetAllVersions.java b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGGetAllVersions.java index b26dffd..b3cd36c 100644 --- a/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGGetAllVersions.java +++ b/nifi-toolkit/nifi-toolkit-cli/src/main/java/org/apache/nifi/toolkit/cli/impl/command/nifi/pg/PGGetAllVersions.java @@ -17,15 +17,14 @@ package org.apache.nifi.toolkit.cli.impl.command.nifi.pg; import org.apache.commons.cli.MissingOptionException; -import org.apache.nifi.toolkit.cli.api.CommandException; import org.apache.nifi.toolkit.cli.api.Context; -import org.apache.nifi.toolkit.cli.api.ResultWriter; import org.apache.nifi.toolkit.cli.impl.client.nifi.FlowClient; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClient; import org.apache.nifi.toolkit.cli.impl.client.nifi.NiFiClientException; import org.apache.nifi.toolkit.cli.impl.client.nifi.VersionsClient; import org.apache.nifi.toolkit.cli.impl.command.CommandOption; import org.apache.nifi.toolkit.cli.impl.command.nifi.AbstractNiFiCommand; +import org.apache.nifi.toolkit.cli.impl.result.VersionedFlowSnapshotMetadataSetResult; import org.apache.nifi.web.api.dto.VersionControlInformationDTO; import org.apache.nifi.web.api.entity.VersionControlInformationEntity; import org.apache.nifi.web.api.entity.VersionedFlowSnapshotMetadataSetEntity; @@ -36,10 +35,10 @@ import java.util.Properties; /** * Command to get all the available versions for a given process group that is under version control. */ -public class PGGetAllVersions extends AbstractNiFiCommand { +public class PGGetAllVersions extends AbstractNiFiCommand<VersionedFlowSnapshotMetadataSetResult> { public PGGetAllVersions() { - super("pg-get-all-versions"); + super("pg-get-all-versions", VersionedFlowSnapshotMetadataSetResult.class); } @Override public String getDescription() { @@ -52,8 +51,9 @@ public class PGGetAllVersions extends AbstractNiFiCommand { } @Override - protected void doExecute(final NiFiClient client, final Properties properties) - throws NiFiClientException, IOException, MissingOptionException, CommandException { + public VersionedFlowSnapshotMetadataSetResult doExecute(final NiFiClient client, final Properties properties) + throws NiFiClientException, IOException, MissingOptionException { + final String pgId = getRequiredArg(properties, CommandOption.PG_ID); final VersionsClient versionsClient = client.getVersionsClient(); @@ -75,8 +75,7 @@ public class PGGetAllVersions extends AbstractNiFiCommand { throw new NiFiClientException("No versions available"); } - final ResultWriter resultWriter = getResultWriter(properties); - resultWriter.writeSnapshotMetadata(versions, getContext().getOutput()); + return new VersionedFlowSnapshotMetadataSetResult(getResultType(properties), versions); } }
