class MetadataRemoveProposedMessage implements DiscoveryCustomMessage {
    /** */
    private static final long serialVersionUID = 0L;

    /** */
    private final IgniteUuid id = IgniteUuid.randomUuid();

    /** Node UUID which initiated metadata update. */
    private final UUID origNodeId;

    /** Metadata type id. */
    private final int typeId;

    /** Message acceptance status. */
    private ProposalStatus status = ProposalStatus.SUCCESSFUL;

    /** Message received on coordinator. */
    private boolean onCoordinator = true;

    /** */
    private BinaryObjectException err;

    /**
     * @param typeId Binary type ID.
     * @param origNodeId ID of node requested update.
     */
    public MetadataRemoveProposedMessage(int typeId, UUID origNodeId) {
        assert origNodeId != null;

        this.origNodeId = origNodeId;

        this.typeId = typeId;
    }

    /** {@inheritDoc} */
    @Override public IgniteUuid id() {
        return id;
    }

    /** {@inheritDoc} */
    @Nullable @Override public DiscoveryCustomMessage ackMessage() {<FILL_FUNCTION_BODY>}

    /** {@inheritDoc} */
    @Override public boolean isMutable() {
        return true;
    }


    /** {@inheritDoc} */
    @Nullable @Override public DiscoCache createDiscoCache(GridDiscoveryManager mgr,
        AffinityTopologyVersion topVer, DiscoCache discoCache) {
        throw new UnsupportedOperationException();
    }

    /**
     * @param err Error caused this update to be rejected.
     */
    void markRejected(BinaryObjectException err) {
        status = ProposalStatus.REJECTED;
        this.err = err;
    }

    /** */
    boolean rejected() {
        return status == ProposalStatus.REJECTED;
    }

    /** */
    BinaryObjectException rejectionError() {
        return err;
    }

    /** */
    UUID origNodeId() {
        return origNodeId;
    }

    /** */
    public int typeId() {
        return typeId;
    }

    /** */
    public boolean isOnCoordinator() {
        return onCoordinator;
    }

    /** */
    public void setOnCoordinator(boolean onCoordinator) {
        this.onCoordinator = onCoordinator;
    }

    /** Message acceptance status. */
    private enum ProposalStatus {
        /** */
        SUCCESSFUL,

        /** */
        REJECTED
    }

    /** {@inheritDoc} */
    @Override public String toString() {
        return S.toString(MetadataRemoveProposedMessage.class, this);
    }
}

        return (status == ProposalStatus.SUCCESSFUL) ? new MetadataRemoveAcceptedMessage(typeId) : null;
    
<no_super_class>