anchor.diff:  
   [[tutorial-create-an-input-component]]
   In this tutorial we will create a complete working input component for xref:https://hazelcast.org/[hazelcast].
  +
   This will include :
   
  -1. The component configuration and the UI layout
  -2. The partition mapper that let the input split it self to work in a distributed environment.
  -3. The source that is responsible for connecting and reading data from the data source.
  +1. The component family registration.
  +2. The component configuration and the UI layout
  +3. The partition mapper that let the input split it self to work in a distributed environment.
  +4. The source that is responsible for connecting and reading data from the data source.
  +
  +NOTE: Getter and Setter methods are omitted for simplicity in this tutorial
  +
  +== The component family registration
  +We register the component family via a the `package-info.java` file in the package of the component.
  +[source,java,indent=0,subs="verbatim,quotes,attributes"]
  +----
  +@Icon(value = Icon.IconType.CUSTOM, custom = "hazelcast") <1>
  +@Components(family = "Hazelcast", categories = "IMDG") <2>
  +package org.talend.hazelcast;
  +----
  +<1> This define the family icon.
  +<2> In this line we define the component family and the component categories.
  +Those information are used in the web and studio applications to group the components.
   
   == The component configuration
   The component configuration define the configurable part of the component in addition to the configuration type and the UI layout.
  
positive.code:     }
      return partitions;
  }
  
  private Set<String> toIdentifiers(final Collection<Member> members) {
      return members.stream().map(Member::getUuid).collect(toSet());
  }
  
  private long getFutureValue(final Future<Long> future) {
      try {
          return future.get(configuration.getTimeout(), SECONDS);
      } catch (final InterruptedException e) {
          Thread.currentThread().interrupt();
          throw new IllegalStateException(e);
      } catch (final ExecutionException | TimeoutException e) {
          throw new IllegalArgumentException(e);
      }
  }
  ----
  
  === The Emitter method
  [source,java,indent=0,subs="verbatim,quotes,attributes"]
  ----
  //After we have splited the mapper. now every mapper will create an emitter that
  // will read the records according to the provided configuration
  @Emitter
  public HazelcastSource createSource() {
      return new HazelcastSource(configuration, jsonFactory, jsonb, service, members);
  }
  ----
  
  === The full implementation of the Partition Mapper
  Here is the full code source for the partition mapper to have a global view of it.
  
negative.code:             return localInstance.getMap(configuration.getMapName()).getLocalMapStats().getHeapCost();
          }
      };
      if (members.isEmpty()) { // == if no specific members defined, apply on all the cluster
          return executorService.submitToAllMembers(sizeComputation);
      }
      final Set<Member> members = instance.getCluster().getMembers().stream()
  