/**
* 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 LGPL 3.0 or LGPL 2.1 or CDDL 1.0 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 LGPL 3.0 license at
* http://www.opensource.org/licenses/lgpl-3.0
*
* You can obtain a copy of the LGPL 2.1 license at
* http://www.opensource.org/licenses/lgpl-2.1
*
* You can obtain a copy of the CDDL 1.0 license at
* http://www.opensource.org/licenses/cddl1
*
* 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://www.restlet.com/products/restlet-framework
*
* Restlet is a registered trademark of Restlet
*/
package org.restlet.data;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
//import org.restlet.engine.io.IoUtils;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.util.WrapperList;
/**
* List of URI references.
*
* @author Jerome Louvel
*/
public class ReferenceList extends WrapperList<Reference> {
/** The list's identifier. */
private volatile Reference identifier;
/**
* Constructor.
*/
public ReferenceList() {
super();
}
/**
* Constructor.
*
* @param initialCapacity
* The initial list capacity.
*/
public ReferenceList(int initialCapacity) {
super(new ArrayList<Reference>(initialCapacity));
}
/**
* Constructor.
*
* @param delegate
* The delegate list.
*/
public ReferenceList(List<Reference> delegate) {
super(delegate);
}
/**
* Constructor from a "text/uri-list" representation.
*
* @param uriList
* The "text/uri-list" representation to parse.
* @throws IOException
*/
public ReferenceList(Representation uriList) throws IOException {
BufferedReader br = null;
try {
br = new BufferedReader(uriList.getReader(), /*IoUtils.BUFFER_SIZE*/8192);
String line = br.readLine();
// Checks if the list reference is specified as the first comment.
if ((line != null) && line.startsWith("#")) {
setIdentifier(new Reference(line.substring(1).trim()));
line = br.readLine();
}
while (line != null) {
if (!line.startsWith("#")) {
add(new Reference(line.trim()));
}
line = br.readLine();
}
} finally {
if (br != null) {
br.close();
}
}
}
/**
* Creates then adds a reference at the end of the list.
*
* @param uri
* The uri of the reference to add.
* @return True (as per the general contract of the Collection.add method).
*/
public boolean add(String uri) {
return add(new Reference(uri));
}
/**
* Returns the list identifier.
*
* @return The list identifier.
*/
public Reference getIdentifier() {
return this.identifier;
}
/**
* Returns a representation of the list in the "text/uri-list" format.
*
* @return A representation of the list in the "text/uri-list" format.
*/
public Representation getTextRepresentation() {
final StringBuilder sb = new StringBuilder();
if (getIdentifier() != null) {
sb.append("# ").append(getIdentifier().toString()).append("\r\n");
}
for (final Reference ref : this) {
sb.append(ref.toString()).append("\r\n");
}
return new StringRepresentation(sb.toString(), MediaType.TEXT_URI_LIST);
}
/**
* Returns a representation of the list in "text/html" format.
*
* @return A representation of the list in "text/html" format.
*/
public Representation getWebRepresentation() {
// Create a simple HTML list
final StringBuilder sb = new StringBuilder();
sb.append("<html><body style=\"font-family: sans-serif;\">\n");
if (getIdentifier() != null) {
sb.append("<h2>Listing of \"" + getIdentifier().getPath()
+ "\"</h2>\n");
final Reference parentRef = getIdentifier().getParentRef();
if (!parentRef.equals(getIdentifier())) {
sb.append("<a href=\"" + parentRef + "\">..</a><br>\n");
}
} else {
sb.append("<h2>List of references</h2>\n");
}
for (final Reference ref : this) {
sb.append("<a href=\"" + ref.toString() + "\">"
+ ref.getRelativeRef(getIdentifier()) + "</a><br>\n");
}
sb.append("</body></html>\n");
return new StringRepresentation(sb.toString(), MediaType.TEXT_HTML);
}
/**
* Sets the list reference.
*
* @param identifier
* The list identifier.
*/
public void setIdentifier(Reference identifier) {
this.identifier = identifier;
}
/**
* Sets the list reference.
*
* @param identifier
* The list identifier as a URI.
*/
public void setIdentifier(String identifier) {
setIdentifier(new Reference(identifier));
}
/**
* Returns a view of the portion of this list between the specified
* fromIndex, inclusive, and toIndex, exclusive.
*
* @param fromIndex
* The start position.
* @param toIndex
* The end position (exclusive).
* @return The sub-list.
*/
@Override
public ReferenceList subList(int fromIndex, int toIndex) {
return new ReferenceList(getDelegate().subList(fromIndex, toIndex));
}
}