code: public ListenableFuture<Void> register(final HiveSpec spec) {
      ListenableFuture<Void> future = this.executor.submit(new Callable<Void>() {
  
        @Override
        public Void call() throws Exception {
  
          if (spec instanceof HiveSpecWithPredicates && !evaluatePredicates((HiveSpecWithPredicates) spec)) {
            log.info("Skipping " + spec + " since predicates return false");
            return null;
          }
  
          if (spec instanceof HiveSpecWithPreActivities) {
            for (Activity activity : ((HiveSpecWithPreActivities) spec).getPreActivities()) {
              activity.execute(HiveRegister.this);
            }
          }
  
          registerPath(spec);
  
          if (spec instanceof HiveSpecWithPostActivities) {
            for (Activity activity : ((HiveSpecWithPostActivities) spec).getPostActivities()) {
              activity.execute(HiveRegister.this);
            }
          }
  
          return null;
        }
  
      });
      this.futures.put(getSpecId(spec), future);
      return future;
    }
docs: Register a table or partition given a {@link HiveSpec}. This method is asynchronous and returns immediately.
  This methods evaluates the {@link Predicate}s and executes the {@link Activity}s specified in the
  {@link HiveSpec}. The actual registration happens in {@link #registerPath(HiveSpec)}, which subclasses
  should implement.
  
  @return a {@link ListenableFuture} for the process of registering the given {@link HiveSpec}.