/*******************************************************************************
 * Copyright (c) 2004 Composent, Inc. and others. All rights reserved. This
 * program and the accompanying materials are made available under the terms of
 * the Eclipse Public License v1.0 which accompanies this distribution, and is
 * available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: Composent, Inc. - initial API and implementation
 ******************************************************************************/
package org.eclipse.ecf.provider.remoteservice.generic;

import java.io.Serializable;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.remoteservice.IRemoteCallListener;

public class Request implements Serializable {

	private static final long serialVersionUID = -6428866228973362178L;

	private static long nextRequestId = 0;

	long requestId;

	ID requestContainerID;

	long serviceId;

	RemoteCallImpl call;

	Response response;

	boolean done = false;

	transient IRemoteCallListener listener = null;

	private synchronized static long getNextRequestId() {
		long result = nextRequestId;
		nextRequestId = (nextRequestId == Long.MAX_VALUE) ? 0L : nextRequestId + 1;
		return result;
	}

	public Request(ID requestContainerID, long serviceId, RemoteCallImpl call) {
		this(requestContainerID, serviceId, call, null);
	}

	public Request(ID requestContainerID, long serviceId, RemoteCallImpl call, IRemoteCallListener listener) {
		this.requestContainerID = requestContainerID;
		this.serviceId = serviceId;
		this.call = call;
		this.requestId = getNextRequestId();
		this.listener = listener;
	}

	public long getRequestId() {
		return requestId;
	}

	public ID getRequestContainerID() {
		return requestContainerID;
	}

	public long getServiceId() {
		return serviceId;
	}

	public RemoteCallImpl getCall() {
		return call;
	}

	protected void setResponse(Response response) {
		this.response = response;
	}

	protected Response getResponse() {
		return response;
	}

	protected boolean isDone() {
		return done;
	}

	protected void setDone(boolean val) {
		this.done = val;
	}

	protected IRemoteCallListener getListener() {
		return listener;
	}

	public String toString() {
		final StringBuffer buf = new StringBuffer("Request["); //$NON-NLS-1$
		buf.append("requestId=").append(requestId).append(";cont=").append( //$NON-NLS-1$ //$NON-NLS-2$
				requestContainerID).append(";serviceId=").append(serviceId) //$NON-NLS-1$
				.append(";call=").append(call).append(";done=").append(done) //$NON-NLS-1$ //$NON-NLS-2$
				.append(";response=").append(response).append(";listener=") //$NON-NLS-1$ //$NON-NLS-2$
				.append(listener).append("]"); //$NON-NLS-1$
		return buf.toString();
	}

}
