@Override
 public boolean equals(Object obj) {
   if (this == obj) {
     return true;
   }
   if (obj == null) {
     return false;
   }
   if (getClass() != obj.getClass()) {
     return false;
   }
   BlockingControlLink other = (BlockingControlLink) obj;
   if (getUntilFinished() == null) {
     if (other.getUntilFinished() != null) {
       return false;
     }
   } else if (!getUntilFinished().equals(other.getUntilFinished())) {
     return false;
   }
   if (getParent() == null) {
     if (other.getParent() != null) {
       return false;
     }
   } else if (!getParent().equals(other.getParent())) {
     return false;
   }
   if (getBlock() == null) {
     if (other.getBlock() != null) {
       return false;
     }
   } else if (!getBlock().equals(other.getBlock())) {
     return false;
   }
   return true;
 }
 @SuppressWarnings("unchecked")
 @Override
 public int compareTo(Object o) {
   if (!(o instanceof BlockingControlLink)) {
     return o.getClass().getCanonicalName().compareTo(getClass().getCanonicalName());
   }
   BlockingControlLink o1 = this;
   BlockingControlLink o2 = (BlockingControlLink) o;
   int untilFinishedCompare =
       nullSafeCompare.compare(o1.getUntilFinished(), o2.getUntilFinished());
   if (untilFinishedCompare != 0) {
     return untilFinishedCompare;
   }
   return nullSafeCompare.compare(o1.getBlock(), o2.getBlock());
 }
 @Override
 protected void cloneInto(WorkflowBean clone, Cloning cloning) {
   BlockingControlLink cloneLink = (BlockingControlLink) clone;
   cloneLink.setBlock(cloning.cloneOrOriginal(getBlock()));
   cloneLink.setUntilFinished(cloning.cloneOrOriginal(getUntilFinished()));
 }