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
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;
}
}

