Hi Jérôme,

> Does it make more sense now?

Yes :)

I added the support of multi-value & multi-style parameters (see the
attached Services.java).

If you load the attached webapp, then try
http://localhost:8080/my-webapp/restlet/service/0;service=hihi?service=foo

You get this:
0;service=hihi hihi foo

Knowing the route is "/service/{service}", this means the "hihi" value is
returned via the matrix form, _but_ the template value also contains it.
Is it normal?

Regards,
-- 
Vincent Ricard

Attachment: sample.tgz
Description: GNU Unix tar archive

package com.mycompany.app;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.restlet.Context;
import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Parameter;
import org.restlet.data.Reference;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.ext.wadl.ParameterInfo;
import org.restlet.ext.wadl.ParameterStyle;
import org.restlet.ext.wadl.RequestInfo;
import org.restlet.ext.wadl.WadlResource;
import org.restlet.resource.Representation;
import org.restlet.resource.StringRepresentation;
import org.restlet.resource.Variant;
import org.restlet.util.Series;

import com.noelios.restlet.http.HttpConstants;

public class Services extends WadlResource {
	public Services(Context context, Request request, Response response) {
		super(context, request, response);

		this.getVariants().add(new Variant(MediaType.TEXT_PLAIN));
	}

	@Override
    public Representation represent(@SuppressWarnings("unused") Variant variant) {
		Representation rep = new StringRepresentation(getService(),
                MediaType.TEXT_PLAIN);
		return rep;
	}

	private String getService() {
		String s = "";
		for (Parameter parameter : getParams(getRequestInfo(), "service")) {
			s += " " + parameter.getValue();
		}
		return s;
	}
	
	/* -- */
	protected RequestInfo getRequestInfo() {
		RequestInfo requestInfo = new RequestInfo();
		requestInfo.getParameters().add(new ParameterInfo("service", false, "string", ParameterStyle.TEMPLATE, "some doc"));
		requestInfo.getParameters().add(new ParameterInfo("service", false, "string", ParameterStyle.MATRIX, "some doc"));
		requestInfo.getParameters().add(new ParameterInfo("service", false, "string", ParameterStyle.QUERY, "some doc"));
		return requestInfo;
	}

	/* -- */
	protected String getParam(RequestInfo requestInfo, String parameterName) {
		return getParams(requestInfo, parameterName).getFirstValue(parameterName);
	}

	protected Form getParams(RequestInfo requestInfo, String parameterName) {
		List<Parameter> params = new ArrayList<Parameter>();
		for (ParameterInfo parameter : requestInfo.getParameters()) {
			if (parameterName.equals(parameter.getName())) {
				addParams(parameter, params);
			}
		}
		return new Form(params);
	}

	private void addParams(ParameterInfo parameterInfo, List<Parameter> params) {
		if (parameterInfo.getFixed() != null) {
			params.add(new Parameter(parameterInfo.getName(), parameterInfo.getFixed()));
			return;
		}

		if (ParameterStyle.HEADER.equals(parameterInfo.getStyle())) {
			params.addAll(getParamsFromForm(getHeader(), parameterInfo.getName()));
		} else if (ParameterStyle.TEMPLATE.equals(parameterInfo.getStyle())) {
			Object parameter = getRequest().getAttributes().get(parameterInfo.getName());
			if (parameter != null) {
				params.add(new Parameter(parameterInfo.getName(), "#" + Reference.decode((String) parameter) + "#"));
			}
		} else if (ParameterStyle.MATRIX.equals(parameterInfo.getStyle())) {
			params.addAll(getParamsFromForm(getMatrix(), parameterInfo.getName()));
		} else if (ParameterStyle.QUERY.equals(parameterInfo.getStyle())) {
			params.addAll(getParamsFromForm(getQuery(), parameterInfo.getName()));
		} else if (ParameterStyle.PLAIN.equals(parameterInfo.getStyle())) {
			// not yet implemented
		}

		if (params.isEmpty() && parameterInfo.getDefaultValue() != null) {
			params.add(new Parameter(parameterInfo.getName(), parameterInfo.getDefaultValue()));
		}
	}

	private List<Parameter> getParamsFromForm(Form pForm, String pName) {
		List<Parameter> params = pForm.subList(pName);
		if (params == null) {
			params = Collections.emptyList();
		}
		return params;
	}

	@SuppressWarnings("unchecked")
	protected Form getHeader() {
    	Form form = null;
    	Series<Parameter> headers =
    		(Series<Parameter>) getRequest().getAttributes().get(HttpConstants.ATTRIBUTE_HEADERS);
    	if (headers != null) {
    		form = new Form(headers);
    	}
        return form;
    }
}

Reply via email to