| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- package me.ag2s.epublib.domain;
- import java.io.ByteArrayInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.Reader;
- import java.io.Serializable;
- import me.ag2s.epublib.Constants;
- import me.ag2s.epublib.util.IOUtil;
- import me.ag2s.epublib.util.StringUtil;
- import me.ag2s.epublib.util.commons.io.XmlStreamReader;
- /**
- * Represents a resource that is part of the epub.
- * A resource can be a html file, image, xml, etc.
- *
- * @author paul
- *
- */
- public class Resource implements Serializable {
- private static final long serialVersionUID = 1043946707835004037L;
- private String id;
- private String title;
- private String href;
- private String properties;
- protected final String originalHref;
- private MediaType mediaType;
- private String inputEncoding;
- protected byte[] data;
- /**
- * Creates an empty Resource with the given href.
- *
- * Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
- *
- * @param href The location of the resource within the epub. Example: "chapter1.html".
- */
- public Resource(String href) {
- this(null, new byte[0], href, MediaTypes.determineMediaType(href));
- }
- /**
- * Creates a Resource with the given data and MediaType.
- * The href will be automatically generated.
- *
- * Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
- *
- * @param data The Resource's contents
- * @param mediaType The MediaType of the Resource
- */
- public Resource(byte[] data, MediaType mediaType) {
- this(null, data, null, mediaType);
- }
- /**
- * Creates a resource with the given data at the specified href.
- * The MediaType will be determined based on the href extension.
- *
- * Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
- *
- * @see MediaTypes#determineMediaType(String)
- *
- * @param data The Resource's contents
- * @param href The location of the resource within the epub. Example: "chapter1.html".
- */
- public Resource(byte[] data, String href) {
- this(null, data, href, MediaTypes.determineMediaType(href),
- Constants.CHARACTER_ENCODING);
- }
- /**
- * Creates a resource with the data from the given Reader at the specified href.
- * The MediaType will be determined based on the href extension.
- *
- * @see MediaTypes#determineMediaType(String)
- *
- * @param in The Resource's contents
- * @param href The location of the resource within the epub. Example: "cover.jpg".
- */
- public Resource(Reader in, String href) throws IOException {
- this(null, IOUtil.toByteArray(in, Constants.CHARACTER_ENCODING), href,
- MediaTypes.determineMediaType(href),
- Constants.CHARACTER_ENCODING);
- }
- /**
- * Creates a resource with the data from the given InputStream at the specified href.
- * The MediaType will be determined based on the href extension.
- *
- * @see MediaTypes#determineMediaType(String)
- *
- * Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
- *
- * It is recommended to us the {@link #Resource(Reader, String)} method for creating textual
- * (html/css/etc) resources to prevent encoding problems.
- * Use this method only for binary Resources like images, fonts, etc.
- *
- *
- * @param in The Resource's contents
- * @param href The location of the resource within the epub. Example: "cover.jpg".
- */
- public Resource(InputStream in, String href) throws IOException {
- this(null, IOUtil.toByteArray(in), href,
- MediaTypes.determineMediaType(href));
- }
- /**
- * Creates a resource with the given id, data, mediatype at the specified href.
- * Assumes that if the data is of a text type (html/css/etc) then the encoding will be UTF-8
- *
- * @param id The id of the Resource. Internal use only. Will be auto-generated if it has a null-value.
- * @param data The Resource's contents
- * @param href The location of the resource within the epub. Example: "chapter1.html".
- * @param mediaType The resources MediaType
- */
- public Resource(String id, byte[] data, String href, MediaType mediaType) {
- this(id, data, href, mediaType, Constants.CHARACTER_ENCODING);
- }
- public Resource(String id, byte[] data, String href, String originalHref, MediaType mediaType) {
- this(id, data, href, originalHref, mediaType, Constants.CHARACTER_ENCODING);
- }
- /**
- * Creates a resource with the given id, data, mediatype at the specified href.
- * If the data is of a text type (html/css/etc) then it will use the given inputEncoding.
- *
- * @param id The id of the Resource. Internal use only. Will be auto-generated if it has a null-value.
- * @param data The Resource's contents
- * @param href The location of the resource within the epub. Example: "chapter1.html".
- * @param mediaType The resources MediaType
- * @param inputEncoding If the data is of a text type (html/css/etc) then it will use the given inputEncoding.
- */
- public Resource(String id, byte[] data, String href, MediaType mediaType,
- String inputEncoding) {
- this.id = id;
- this.href = href;
- this.originalHref = href;
- this.mediaType = mediaType;
- this.inputEncoding = inputEncoding;
- this.data = data;
- }
- public Resource(String id, byte[] data, String href, String originalHref, MediaType mediaType,
- String inputEncoding) {
- this.id = id;
- this.href = href;
- this.originalHref = originalHref;
- this.mediaType = mediaType;
- this.inputEncoding = inputEncoding;
- this.data = data;
- }
- /**
- * Gets the contents of the Resource as an InputStream.
- *
- * @return The contents of the Resource.
- *
- * @throws IOException IOException
- */
- public InputStream getInputStream() throws IOException {
- return new ByteArrayInputStream(getData());
- }
- /**
- * The contents of the resource as a byte[]
- *
- * @return The contents of the resource
- */
- public byte[] getData() throws IOException {
- return data;
- }
- /**
- * Tells this resource to release its cached data.
- *
- * If this resource was not lazy-loaded, this is a no-op.
- */
- public void close() {
- }
- /**
- * Sets the data of the Resource.
- * If the data is a of a different type then the original data then make sure to change the MediaType.
- *
- * @param data the data of the Resource
- */
- public void setData(byte[] data) {
- this.data = data;
- }
- /**
- * Returns the size of this resource in bytes.
- *
- * @return the size.
- */
- public long getSize() {
- return data.length;
- }
- /**
- * If the title is found by scanning the underlying html document then it is cached here.
- *
- * @return the title
- */
- public String getTitle() {
- return title;
- }
- /**
- * Sets the Resource's id: Make sure it is unique and a valid identifier.
- *
- * @param id Resource's id
- */
- public void setId(String id) {
- this.id = id;
- }
- /**
- * The resources Id.
- *
- * Must be both unique within all the resources of this book and a valid identifier.
- * @return The resources Id.
- */
- public String getId() {
- return id;
- }
- /**
- * The location of the resource within the contents folder of the epub file.
- *
- * Example:<br/>
- * images/cover.jpg<br/>
- * content/chapter1.xhtml<br/>
- *
- * @return The location of the resource within the contents folder of the epub file.
- */
- public String getHref() {
- return href;
- }
- /**
- * Sets the Resource's href.
- *
- * @param href Resource's href.
- */
- public void setHref(String href) {
- this.href = href;
- }
- /**
- * The character encoding of the resource.
- * Is allowed to be null for non-text resources like images.
- *
- * @return The character encoding of the resource.
- */
- public String getInputEncoding() {
- return inputEncoding;
- }
- /**
- * Sets the Resource's input character encoding.
- *
- * @param encoding Resource's input character encoding.
- */
- public void setInputEncoding(String encoding) {
- this.inputEncoding = encoding;
- }
- /**
- * Gets the contents of the Resource as Reader.
- *
- * Does all sorts of smart things (courtesy of apache commons io XMLStreamREader) to handle encodings, byte order markers, etc.
- *
- * @return the contents of the Resource as Reader.
- * @throws IOException IOException
- */
- public Reader getReader() throws IOException {
- return new XmlStreamReader(new ByteArrayInputStream(getData()),
- getInputEncoding());
- }
- /**
- * Gets the hashCode of the Resource's href.
- *
- */
- public int hashCode() {
- return href.hashCode();
- }
- /**
- * Checks to see of the given resourceObject is a resource and whether its href is equal to this one.
- *
- * @return whether the given resourceObject is a resource and whether its href is equal to this one.
- */
- public boolean equals(Object resourceObject) {
- if (!(resourceObject instanceof Resource)) {
- return false;
- }
- return href.equals(((Resource) resourceObject).getHref());
- }
- /**
- * This resource's mediaType.
- *
- * @return This resource's mediaType.
- */
- public MediaType getMediaType() {
- return mediaType;
- }
- public void setMediaType(MediaType mediaType) {
- this.mediaType = mediaType;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- public String getProperties() {
- return properties;
- }
- public void setProperties(String properties) {
- this.properties = properties;
- }
- @SuppressWarnings("NullableProblems")
- public String toString() {
- return StringUtil.toString("id", id,
- "title", title,
- "encoding", inputEncoding,
- "mediaType", mediaType,
- "href", href,
- "size", (data == null ? 0 : data.length));
- }
- }
|