/**
* Copyright 2005-2014 Restlet
*
* The contents of this file are subject to the terms of one of the following
* open source licenses: Apache 2.0 or or EPL 1.0 (the "Licenses"). You can
* select the license that you prefer but you may not use this file except in
* compliance with one of these Licenses.
*
* You can obtain a copy of the Apache 2.0 license at
* http://www.opensource.org/licenses/apache-2.0
*
* You can obtain a copy of the EPL 1.0 license at
* http://www.opensource.org/licenses/eclipse-1.0
*
* See the Licenses for the specific language governing permissions and
* limitations under the Licenses.
*
* Alternatively, you can obtain a royalty free commercial license with less
* limitations, transferable or non-transferable, directly at
* http://restlet.com/products/restlet-framework
*
* Restlet is a registered trademark of Restlet S.A.S.
*/
package org.restlet.ext.html;
import java.io.IOException;
import java.util.logging.Level;
import org.restlet.Context;
import org.restlet.data.Disposition;
import org.restlet.data.MediaType;
import org.restlet.data.Reference;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.util.NamedValue;
/**
* HTML form data composed of a name and a value. The value is typically a
* string but can also be a full fledged representation for multipart form (such
* as a binary file uploaded).
*
* @author Jerome Louvel
*/
public class FormData implements NamedValue<String> {
/** The name of the associated form control. */
private volatile String name;
/**
* The value of the associated form control as a full fledged
* representation.
*/
private volatile Representation valueRepresentation;
/**
* Constructor.
*
* @param namedValue
*/
public FormData(NamedValue<String> namedValue) {
this(namedValue.getName(), namedValue.getValue());
}
/**
* Constructor.
*
* @param name
* @param valueRepresentation
*/
public FormData(String name, Representation valueRepresentation) {
this.name = name;
this.valueRepresentation = valueRepresentation;
}
/**
* Constructor.
*
* @param name
* @param value
*/
public FormData(String name, String value) {
this.name = name;
setValue(value);
}
/**
* Encodes the parameter into the target buffer.
*
* @param buffer
* The target buffer.
* @param queryString
* True if the target is a query string.
* @throws IOException
*/
public void encode(Appendable buffer, boolean queryString)
throws IOException {
if (getName() != null) {
buffer.append(Reference.encode(getName(), queryString));
if (getValue() != null) {
buffer.append('=');
buffer.append(Reference.encode(getValue(), queryString));
}
}
}
/**
* Encodes the parameter as a string.
*
* @param queryString
* True if the target is a query string.
* @return The encoded string.
* @throws IOException
*/
public String encode(boolean queryString) throws IOException {
StringBuilder sb = new StringBuilder();
encode(sb, queryString);
return sb.toString();
}
/**
* Returns the content disposition of the value representation.
*
* @return The content disposition of the value representation.
*/
public Disposition getDisposition() {
return getValueRepresentation() == null ? null
: getValueRepresentation().getDisposition();
}
/**
* Returns the file name of the value representation. To get this
* information, the {@link Disposition#getFilename()} method is invoked.
*
* @return The file name of the value representation.
*/
public String getFilename() {
return getDisposition() == null ? "" : getDisposition().getFilename();
}
/**
* Returns the media type of the value representation.
*
* @return The media type of the value representation.
*/
public MediaType getMediaType() {
return getValueRepresentation() == null ? null
: getValueRepresentation().getMediaType();
}
/**
* Returns the name of the associated form control.
*
* @return The name of the associated form control.
*/
public String getName() {
return name;
}
/**
* Returns the textual value of the associated form control.
*
* @return The textual value of the associated form control.
*/
public String getValue() {
try {
return getValueRepresentation().getText();
} catch (IOException e) {
Context.getCurrentLogger()
.log(Level.INFO,
"Unable to get the textual value of the form data value representation",
e);
return null;
}
}
/**
* Returns the value of the associated form control, either textual or
* binary.
*
* @return The value of the associated form control.
*/
public Representation getValueRepresentation() {
return valueRepresentation;
}
/**
* Sets the name of the associated form control.
*
* @param name
* The name of the associated form control.
*/
public void setName(String name) {
this.name = name;
}
/**
* Sets the textual value of the associated form control.
*
* @param value
* The textual value of the associated form control.
*/
public void setValue(String value) {
if (getValueRepresentation() instanceof StringRepresentation) {
((StringRepresentation) getValueRepresentation()).setText(value);
} else {
setValueRepresentation(new StringRepresentation(value));
}
}
/**
* Sets the value of the associated form control as a full fledged
* representation.
*
* @param valueRepresentation
* The value of the associated form control.
*/
public void setValueRepresentation(Representation valueRepresentation) {
this.valueRepresentation = valueRepresentation;
}
@Override
public String toString() {
return "(" + getName() + "," + getValueRepresentation() + ")";
}
}