/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.ode.jacob.soup;

/**
 * Base class for items we find in the {@link ExecutionQueue}.
 *
 * @author Maciej Szefler <a href="mailto:mbs@fivesight.com">mbs</a>
 */
public class ExecutionQueueObject {

    /**
     * A unique idefntifer for this object in the queue (should only be set by queue).
     */
    private Integer _id;

    /**
     * A human-readable description of the object.
     */
    private String _description;

    public String getDescription() {
        return _description;
    }

    public void setDescription(String description) {
        if (_description != null) {
            throw new IllegalStateException("Description already set for " + this);
        }
        _description = description;
    }

    public void setId(Integer id) {
        if (_id != null) {
            throw new IllegalStateException("Object id already set for " + this);
        }
        _id = id;
    }

    public Integer getId() {
        return _id;
    }

    public boolean equals(Object obj) {
        if (_id == null || ((ExecutionQueueObject) obj)._id == null) {
            return this == obj;
        }
        return ((ExecutionQueueObject) obj)._id.equals(_id);
    }
}
