/*
 * #%L
 * ImageJ software for multidimensional image processing and analysis.
 * %%
 * Copyright (C) 2014 - 2015 Board of Regents of the University of
 * Wisconsin-Madison, University of Konstanz and Brian Northan.
 * %%
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * #L%
 */

package net.imagej.ops;

import org.scijava.module.Module;
import org.scijava.module.ModuleInfo;

/**
 * Container class for a possible operation match between an {@link OpRef} and a
 * {@link ModuleInfo}, as computed by the {@link OpMatchingService}.
 * 
 * @author Curtis Rueden
 * @param <OP> The type of {@link Op}.
 * @see OpMatchingService
 */
public class OpCandidate<OP extends Op> {

	public static enum StatusCode {
		MATCH,
		INVALID_MODULE,
		TOO_MANY_ARGS,
		TOO_FEW_ARGS,
		REQUIRED_ARG_IS_NULL,
		CANNOT_CONVERT,
		DOES_NOT_CONFORM,
		OTHER
	}

	private OpRef<OP> ref;
	private ModuleInfo info;

	private Module module;
	private StatusCode code;
	private String message;

	public OpCandidate(final OpRef<OP> ref, final ModuleInfo info) {
		this.ref = ref;
		this.info = info;
	}

	public OpRef<OP> getRef() {
		return ref;
	}

	public ModuleInfo getInfo() {
		return info;
	}

	public void setModule(final Module module) {
		this.module = module;
	}

	public Module getModule() {
		return module;
	}

	public void setStatus(StatusCode code) {
		setStatus(code, null);
	}

	public void setStatus(StatusCode code, final String message) {
		this.code = code;
		this.message = message;
	}

	public StatusCode getStatusCode() {
		return code;
	}

	public String getStatusMessage() {
		return message;
	}

}

@@ -2849,10 +2849,896 @@
 ge;%0A%09%7D%0A%0A
+%09public String getStatus() %7B%0A%09%09final StatusCode statusCode = getStatusCode();%0A%09%09if (statusCode == null) return null;%0A%0A%09%09final StringBuilder sb = new StringBuilder();%0A%09%09switch (statusCode) %7B%0A%09%09%09case MATCH:%0A%09%09%09%09sb.append(%22MATCH%22);%0A%09%09%09%09break;%0A%09%09%09case INVALID_MODULE:%0A%09%09%09%09sb.append(%22Invalid module: %22 + info.getDelegateClassName());%0A%09%09%09%09break;%0A%09%09%09case TOO_MANY_ARGS:%0A%09%09%09%09sb.append(%22Too many arguments%22);%0A%09%09%09%09break;%0A%09%09%09case TOO_FEW_ARGS:%0A%09%09%09%09sb.append(%22Not enough arguments%22);%0A%09%09%09%09break;%0A%09%09%09case REQUIRED_ARG_IS_NULL:%0A%09%09%09%09sb.append(%22Missing required argument%22);%0A%09%09%09%09break;%0A%09%09%09case CANNOT_CONVERT:%0A%09%09%09%09sb.append(%22Inconvertible type%22);%0A%09%09%09%09break;%0A%09%09%09case DOES_NOT_CONFORM:%0A%09%09%09%09sb.append(%22Contingent constraints violated%22);%0A%09%09%09%09break;%0A%09%09%09default:%0A%09%09%09%09return getStatusMessage();%0A%09%09%7D%0A%09%09final String msg = getStatusMessage();%0A%09%09if (msg != null) sb.append(%22: %22 + msg);%0A%0A%09%09return sb.toString();%0A%09%7D%0A%0A
 %7D%0A

add a convenient status builder