/*
 */
package org.taverna.server.master.utils;

import javax.ws.rs.OPTIONS;
import javax.ws.rs.core.Response;

/**
 * Utilities that make it easier to write REST services.
 * 
 * @author Donal Fellows
 */
public class RestUtils {
	/**
	 * Generate a response to an HTTP OPTIONS request.
	 * 
	 * @param methods
	 *            The state-changing methods supported, if any.
	 * @return the required response
	 * @see OPTIONS
	 */
	public static Response opt(String... methods) {
		StringBuilder sb = new StringBuilder("GET,");
		for (String m : methods)
			sb.append(m).append(",");
		sb.append("HEAD,OPTIONS");
		return Response.ok().header("Allow", sb.toString()).entity("").build();
	}
}
