blob: 4d894c54c57b06176ee167dff41c2ebaa1ffb4c2 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.sling.hapi.client.forms.internal;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.jsoup.nodes.Element;
/**
*
*/
public class FormValues {
private Element form;
private Iterable<NameValuePair> values;
private Vals list = new Vals();
public FormValues(Element form, Iterable<NameValuePair> values) {
this.form = form;
this.values = values;
build();
resolve();
}
/**
* @return
* {@see http://www.w3.org/TR/html5/forms.html#constructing-the-form-data-set}
*/
private FormValues build() {
for (Element input : form.select("button, input, select, textarea")) {
String type = input.attr("type");
if (input.hasAttr("disabled")) continue;
if (input.tagName().equalsIgnoreCase("button") && !type.equals("submit")) continue;
if (input.tagName().equalsIgnoreCase("input") && (type.equals("button") || type.equals("reset"))) continue;
if (type.equals("checkbox") && input.hasAttr("checked")) continue;
if (type.equals("radio") && input.hasAttr("checked")) continue;
if (!type.equals("image") && input.attr("name").length() == 0) continue;
if (input.parents().is("datalist")) continue;
if (type.equals("image") || type.equals("file")) continue; // don't support files for now
String name = input.attr("name");
if (input.tagName().equalsIgnoreCase("select")) {
for (Element o : input.select("option[selected]")) {
if (o.hasAttr("disabled")) continue;
list.add(name, new BasicNameValuePair(name, o.val()));
}
} else if (type.equals("checkbox") || type.equals("radio")) {
String value = input.hasAttr("value") ? input.val() : "on";
list.add(name, new BasicNameValuePair(name, value));
} else {
list.add(name, new BasicNameValuePair(name, input.val()));
}
}
return this;
}
private FormValues resolve() {
for (NameValuePair o : values) {
if (list.has(o.getName())) {
list.set(o);
} else {
// for now just set the value even if the form doesn't have a submittable input for the name.
// this is to support custom field that generate input dynamically
list.set(o);
}
}
return this;
}
public String toString() {
return URLEncodedUtils.format(list.flatten(), "UTF-8");
}
public HttpEntity toUrlEncodedEntity() {
try {
return new UrlEncodedFormEntity(list.flatten(), "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
public HttpEntity toMultipartEntity() {
MultipartEntityBuilder eb = MultipartEntityBuilder.create();
for (NameValuePair p : list.flatten()) {
eb.addTextBody(p.getName(), p.getValue());
}
return eb.build();
}
}