docs: public final void lateInitialize() throws SevereMessageStoreException
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.entry(this, tc, "lateInitialize");
  
          AbstractItem item = getItem();
          final int priority = item.getPriority();
          if (priority > HIGHEST_PRIORITY || priority < LOWEST_PRIORITY)
          {
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  SibTr.exit(this, tc, "lateInitialize");
              throw new SevereMessageStoreException("invalid priority(" + priority + ") supplied");
          }
          getTuple().setPriority(priority);
          getTuple().setCanExpireSilently(item.canExpireSilently());
  
          long expiryTime = 0;
          long expiryDelay = item.getMaximumTimeInStore();
          if (expiryDelay != AbstractItem.NEVER_EXPIRES)
          {
              long expiryStartTime = item.getExpiryStartTime();
              if (expiryStartTime == 0)
              {
                  expiryStartTime = Expirer.timeNow();
              }
              expiryTime = expiryStartTime + expiryDelay;
          }
  
          getTuple().setExpiryTime(expiryTime);
  
          // set the delivery delay time
          long deliveryDelayTime = 0;
          long deliveryDelay = item.getDeliveryDelay();
          if (deliveryDelay != AbstractItem.DEFAULT_DELIVERY_DELAY) {
  
              /*
               * Imp thing to note here is that i am using getExpiryStartTime().
               * This is because getExpiryStartTime() internally calls getCurrentMEArrivalTimestamp(),
               * which is what is needed here.Delivery delay has nothing to do with expiry time, here we
               * are just reusing the existing functionality
               */
              long deliveryDelayStartTime = item.getExpiryStartTime();
              if (deliveryDelayStartTime == 0) {
                  deliveryDelayStartTime = DeliveryDelayManager.timeNow();
              }
              deliveryDelayTime = deliveryDelayStartTime + deliveryDelay;
          }
          getTuple().setDeliveryDelayTime(deliveryDelayTime);
  
          int newStorageStrategy = item.getStorageStrategy();
          int oldStorageStrategy = getTuple().getStorageStrategy();
          if (oldStorageStrategy != newStorageStrategy)
          {
              // check that the storage strategy is not changing in an unnacceptable way
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  SibTr.debug(this, tc, "StorageStrategy changing from " + oldStorageStrategy + " to " + newStorageStrategy);
              if (AbstractItem.STORE_NEVER == oldStorageStrategy || AbstractItem.STORE_NEVER == newStorageStrategy)
              {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      SibTr.exit(this, tc, "lateInitialize");
                  throw new SevereMessageStoreException("Invalid change of storage strategy from " + oldStorageStrategy + " to " + newStorageStrategy);
              }
              getTuple().setStorageStrategy(newStorageStrategy);
          }
  
          if (null != _owningStreamLink)
          {
              // RootMembership (link) does not have an owning streamLink.  But it
              // does not need a sequence either.....
              int streamStorageStrategy = _owningStreamLink.getTuple().getStorageStrategy();
              if (newStorageStrategy > streamStorageStrategy)
              {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      SibTr.exit(this, tc, "lateInitialize");
                  throw new InvalidAddOperation("STREAM_STORAGE_MISMATCH_SIMS0500", new Object[] { Integer.valueOf(newStorageStrategy), Integer.valueOf(streamStorageStrategy) });
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              SibTr.exit(this, tc, "lateInitialize");
      }