/**
* 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.data;
/**
* Modifier of a representation's media type. Useful to apply compression
* without losing the identity of the underlying media type.
*
* @author Jerome Louvel
*/
public final class Encoding extends Metadata {
/** All encodings acceptable. */
public static final Encoding ALL = new Encoding("*", "All encodings");
/** The common Unix file compression. */
public static final Encoding COMPRESS = new Encoding("compress",
"Common Unix compression");
/** The zlib format defined by RFC 1950 and 1951. */
public static final Encoding DEFLATE = new Encoding("deflate",
"Deflate compression using the zlib format");
/** The zlib format defined by RFC 1950 and 1951, without wrapping. */
public static final Encoding DEFLATE_NOWRAP = new Encoding(
"deflate-no-wrap",
"Deflate compression using the zlib format (without wrapping)");
/** The FreeMarker encoding. */
public static final Encoding FREEMARKER = new Encoding("freemarker",
"FreeMarker templated representation");
/** The GNU Zip encoding. */
public static final Encoding GZIP = new Encoding("gzip", "GZip compression");
/** The default (identity) encoding. */
public static final Encoding IDENTITY = new Encoding("identity",
"The default encoding with no transformation");
/** The Velocity encoding. */
public static final Encoding VELOCITY = new Encoding("velocity",
"Velocity templated representation");
/** The Info-Zip encoding. */
public static final Encoding ZIP = new Encoding("zip", "Zip compression");
/**
* Returns the encoding associated to a name. If an existing constant exists
* then it is returned, otherwise a new instance is created.
*
* @param name
* The name.
* @return The associated encoding.
*/
public static Encoding valueOf(final String name) {
Encoding result = null;
if ((name != null) && !name.equals("")) {
if (name.equalsIgnoreCase(ALL.getName())) {
result = ALL;
} else if (name.equalsIgnoreCase(GZIP.getName())) {
result = GZIP;
} else if (name.equalsIgnoreCase(ZIP.getName())) {
result = ZIP;
} else if (name.equalsIgnoreCase(COMPRESS.getName())) {
result = COMPRESS;
} else if (name.equalsIgnoreCase(DEFLATE.getName())) {
result = DEFLATE;
} else if (name.equalsIgnoreCase(DEFLATE_NOWRAP.getName())) {
result = DEFLATE_NOWRAP;
} else if (name.equalsIgnoreCase(IDENTITY.getName())) {
result = IDENTITY;
} else if (name.equalsIgnoreCase(FREEMARKER.getName())) {
result = FREEMARKER;
} else if (name.equalsIgnoreCase(VELOCITY.getName())) {
result = VELOCITY;
} else {
result = new Encoding(name);
}
}
return result;
}
/**
* Constructor.
*
* @param name
* The name.
*/
public Encoding(final String name) {
this(name, "Encoding applied to a representation");
}
/**
* Constructor.
*
* @param name
* The name.
* @param description
* The description.
*/
public Encoding(final String name, final String description) {
super(name, description);
}
/** {@inheritDoc} */
@Override
public boolean equals(final Object object) {
return (object instanceof Encoding)
&& getName().equalsIgnoreCase(((Encoding) object).getName());
}
@Override
public Metadata getParent() {
return equals(ALL) ? null : ALL;
}
/** {@inheritDoc} */
@Override
public int hashCode() {
return (getName() == null) ? 0 : getName().toLowerCase().hashCode();
}
/**
* Indicates if a given encoding is included in the current one. The test is
* true if both encodings are equal or if the given encoding is within the
* range of the current one. For example, ALL includes all encodings. A null
* encoding is considered as included into the current one.
* <p>
* Examples:
* <ul>
* <li>ALL.includes(COMPRESS) -> true</li>
* <li>COMPRESS.includes(ALL) -> false</li>
* </ul>
*
* @param included
* The encoding to test for inclusion.
* @return True if the given encoding is included in the current one.
* @see #isCompatible(Metadata)
*/
public boolean includes(Metadata included) {
return equals(ALL) || (included == null) || equals(included);
}
}