Github user kevdoran commented on a diff in the pull request: https://github.com/apache/nifi-minifi/pull/118#discussion_r176297389 --- Diff: minifi-c2/minifi-c2-commons/src/main/java/org/apache/nifi/minifi/c2/model/extension/ExtensionComponent.java --- @@ -0,0 +1,85 @@ +/* + * 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.minifi.c2.model.extension; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; +import java.util.Set; + +/** + * A component provided by an extension bundle + */ +@ApiModel +public class ExtensionComponent extends DefinedType { + + // TODO, does arch/binary/compiler metadata need to be added here? --- End diff -- Ok, so here is what I came up with for now: An extension component is uniquely identified by (bundle, type), where bundle = (group, artifact, version) and type is a fully qualified class name. Bundle is optional in the case that you have an extension component outside of a bundle (common in the C++ case for now), in which case the fully qualified type must be globally unique. An extension component implementation is uniquely identified (bundle, type, build) where build = (version, revision, timestamp, target architecture, compiler, compiler flags) In general, a flow designer should only have to target an extension component in order to author a flow. Whether or not a flow can run on a given agent depends on if the extension component has an available implementation on that agent. It's still a bit hand-wavy (at least for now), but I think this distinction should work once we have more dynamic authoring and deployment logic that leverages a fully featured device registry and extension registry. For now, we will focus on agent class name compatibility, so we will have to assume that manifests for classes don't change (or at least, don't remove capabilities) and use the intersection of all agent manifest capabilities when designing against a an agent class label. I need to flesh it out a bit more, but I think it should work. To get a sense of what some of this looks like in code, look at the equals/hashcode methods for DefinedType and ExtensionComponent after I push my next commit.
---