code: public boolean check(Version caller, Version provider) {
          if (caller == null || provider == null) {
              throw new IllegalArgumentException(format("Both caller (%s) and provider (%s) must be non-null.",
                                                        caller,
                                                        provider));
          }
          if (caller.getMajorVersion() == null || caller.getMinorVersion() == null || provider.getMajorVersion() == null
                  || provider.getMinorVersion() == null) {
              throw new IllegalArgumentException(format("Neither major nor minor version values can be null in either caller %s or provider %s.",
                                                        caller,
                                                        provider));
          }
  
          int callerMajor = caller.getMajorVersion();
          int callerMinor = caller.getMinorVersion();
          int providerMajor = provider.getMajorVersion();
          int providerMinor = provider.getMinorVersion();
  
          return callerMajor == providerMajor && callerMinor <= providerMinor;
      }
docs: Compatibility of two versions is defined as the caller and provider versions having the same major version, and
  the provider having the same or a higher minor version as the caller.
  
  @param caller
  the version of the participant performing the call. Must not be <code>null</code>. If either major or
  minor is <code>null</code>, this will be interpreted as <code>0</code>.
  @param provider
  the version of the provider who is being called. Must not be <code>null</code>. If either major or
  minor is <code>null</code>, this will be interpreted as <code>0</code>.
  
  @return <code>true</code> if the versions are compatible as described above, or <code>false</code> if not.
  
  @throws IllegalArgumentException
  if either caller or provider are <code>null</code>.