Github user kevdoran commented on a diff in the pull request:

    https://github.com/apache/nifi-minifi/pull/118#discussion_r175587202
  
    --- 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?
    +
    +    private List<DefinedType> providedApiImplementations;
    +
    +    private String description;
    +    private Set<String> tags;
    +
    +    private Boolean deprecated;
    +    private String deprecationReason;
    +
    +    @ApiModelProperty("If this type represents a provider for an 
interface, this lists the APIs it implements")
    +    public List<DefinedType> getProvidedApiImplementations() {
    +        return providedApiImplementations;
    +    }
    +
    +    public void setProvidedApiImplementations(List<DefinedType> 
providedApiImplementations) {
    +        this.providedApiImplementations = providedApiImplementations;
    --- End diff --
    
    The intention of this field is to allow a component to declare that it 
provides an implementation of an interface defined by another DefinedType. 
    
    The goal (the details of which can change) is to allow bundles to declare 
interfaces/headers as DefinedTypes that other components can provide 
implementations for.  
    
    This is used in the NiFi UI, so will also likely be useful in the [Flow 
Designer](https://lists.apache.org/thread.html/b720ff7b6e4e88fb23163b279f2d71eb125df18d1be8a7fca1c9b28d@%3Cdev.nifi.apache.org%3E).
 In NiFi, it is used so that property descriptors can mark a property as 
requiring an API implementation selection as its value, so that those options 
can be presented in a drop down selection. That is one thought of how this will 
be used in this context.
    
    Another possible use case of this is defining an interface in version 1.0 
of and extension bundle and letting implementations of that interface 
explicitly declare support for in future versions of the bundle. For example, 
you could have:
    
        MyBundle v1.0.0
            apis: [org::apache:nifi:minifi::DatabaseService]
            controllerServices: org::apache:nifi:minifi::DatabaseServiceImpl
                provides: 
[MyBundle/v1.0.0/org::apache:nifi:minifi::DatabaseService]
    
        MyBundle v1.0.1
            controllerServices: org::apache:nifi:minifi::DatabaseServiceImpl
                provides: 
[MyBundle/v1.0.0/org::apache:nifi:minifi::DatabaseService]
    
        MyBundle v1.1.0
            apis: [org::apache:nifi:minifi::DatabaseService]
            controllerServices: org::apache:nifi:minifi::DatabaseServiceImpl
                provides: 
[MyBundle/v1.0.0/org::apache:nifi:minifi::DatabaseService, 
                           
MyBundle/v1.1.0/org::apache:nifi:minifi::DatabaseService]
    
        MyBundle v2.0.0
            apis: [org::apache:nifi:minifi::DatabaseService]
            controllerServices: org::apache:nifi:minifi::DatabaseServiceImpl
                provides: 
[MyBundle/v2.0.0/org::apache:nifi:minifi::DatabaseService]
    
    In this example, an API is defined in a 1.0, improved in a patch release, 
evolved in a minor release, and then ultimately rethought with breaking changes 
in a 2.0. The implementation of the ControllerService API, which happens to be 
in the same bundle in this example, can declare compatibility with current or 
previous versions.



---

Reply via email to