| /* |
| * 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 |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * 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.wicket.util.resource; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.io.Reader; |
| import java.io.UnsupportedEncodingException; |
| import java.nio.charset.Charset; |
| |
| import org.apache.wicket.util.io.IOUtils; |
| import org.apache.wicket.util.io.Streams; |
| import org.apache.wicket.util.lang.Bytes; |
| import org.apache.wicket.util.string.Strings; |
| import org.apache.wicket.util.time.Time; |
| |
| |
| /** |
| * Base class for string resources. |
| * |
| * @author Jonathan Locke |
| */ |
| public abstract class AbstractStringResourceStream extends AbstractResourceStream |
| implements |
| IStringResourceStream |
| { |
| private static final long serialVersionUID = 1L; |
| |
| /** The content-type applied in case the resource stream's default constructor is used */ |
| public static final String DEFAULT_CONTENT_TYPE = "text"; |
| |
| /** Charset name for resource */ |
| private String charsetName; |
| |
| /** MIME content type */ |
| private final String contentType; |
| |
| /** The last time this stylesheet was modified */ |
| private Time lastModified = null; |
| |
| /** |
| * Constructor. |
| */ |
| public AbstractStringResourceStream() |
| { |
| this(DEFAULT_CONTENT_TYPE); |
| } |
| |
| /** |
| * Constructor. |
| * |
| * @param contentType |
| * The mime type of this resource, such as "image/jpeg" or "text/html" |
| */ |
| public AbstractStringResourceStream(final String contentType) |
| { |
| // TODO null for contentType is allowed? or should the default be applied instead? |
| this.contentType = contentType; |
| |
| lastModified = Time.now(); |
| } |
| |
| /** |
| * @return This resource as a String. |
| */ |
| @Override |
| public String asString() |
| { |
| Reader reader = null; |
| try |
| { |
| if (charsetName == null) |
| { |
| reader = new InputStreamReader(getInputStream()); |
| } |
| else |
| { |
| reader = new InputStreamReader(getInputStream(), getCharset()); |
| } |
| return Streams.readString(reader); |
| } |
| catch (IOException e) |
| { |
| throw new RuntimeException("Unable to read resource as String", e); |
| } |
| catch (ResourceStreamNotFoundException e) |
| { |
| throw new RuntimeException("Unable to read resource as String", e); |
| } |
| finally |
| { |
| IOUtils.closeQuietly(reader); |
| IOUtils.closeQuietly(this); |
| } |
| } |
| |
| /** |
| * @return Charset for resource |
| */ |
| protected Charset getCharset() |
| { |
| // java.nio.Charset is not serializable so we can only store the name |
| return (charsetName != null) ? Charset.forName(charsetName) : null; |
| } |
| |
| /** |
| * Sets the character set used for reading this resource. |
| * |
| * @param charset |
| * Charset for component |
| */ |
| @Override |
| public void setCharset(final Charset charset) |
| { |
| // java.nio.Charset itself is not serializable so we can only store the name |
| charsetName = (charset != null) ? charset.name() : null; |
| } |
| |
| /** |
| * @see org.apache.wicket.util.resource.IResourceStream#close() |
| */ |
| @Override |
| public void close() throws IOException |
| { |
| } |
| |
| /** |
| * @see org.apache.wicket.util.resource.IResourceStream#getContentType() |
| */ |
| @Override |
| public String getContentType() |
| { |
| return contentType; |
| } |
| |
| /** |
| * @see org.apache.wicket.util.resource.IResourceStream#getInputStream() |
| */ |
| @Override |
| public InputStream getInputStream() throws ResourceStreamNotFoundException |
| { |
| final byte[] bytes; |
| if (getCharset() != null) |
| { |
| try |
| { |
| bytes = getString().getBytes(getCharset().name()); |
| } |
| catch (UnsupportedEncodingException e) |
| { |
| throw new ResourceStreamNotFoundException("Could not encode resource", e); |
| } |
| } |
| else |
| { |
| bytes = getString().getBytes(); |
| } |
| return new ByteArrayInputStream(bytes); |
| } |
| |
| /** |
| * @see org.apache.wicket.util.watch.IModifiable#lastModifiedTime() |
| */ |
| @Override |
| public Time lastModifiedTime() |
| { |
| return lastModified; |
| } |
| |
| /** |
| * @param lastModified |
| * The lastModified to set. |
| */ |
| public void setLastModified(final Time lastModified) |
| { |
| this.lastModified = lastModified; |
| } |
| |
| /** |
| * @return The string resource |
| */ |
| protected abstract String getString(); |
| |
| @Override |
| public final Bytes length() |
| { |
| int lengthInBytes = Strings.lengthInBytes(getString(), getCharset()); |
| return Bytes.bytes(lengthInBytes); |
| } |
| } |