blob: e263b5b5db63f9918889e3abab22ba2d8b24de1b [file] [log] [blame]
/*
* 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.tools.ant.types.resources;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.ByteArrayInputStream;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.util.PropertyOutputStream;
/**
* Exposes an Ant property as a Resource.
* @since Ant 1.7
*/
public class PropertyResource extends Resource {
/** Magic number */
private static final int PROPERTY_MAGIC
= Resource.getMagicNumber("PropertyResource".getBytes());
private static final InputStream UNSET = new InputStream() {
public int read() {
return -1;
}
};
/**
* Default constructor.
*/
public PropertyResource() {
}
/**
* Construct a new PropertyResource with the specified name.
* @param p the project to use.
* @param n the String name of this PropertyResource (Ant property name/key).
*/
public PropertyResource(Project p, String n) {
super(n);
setProject(p);
}
/**
* Get the value of this PropertyResource.
* @return the value of the specified Property.
*/
public String getValue() {
Project p = getProject();
return p == null ? null : p.getProperty(getName());
}
/**
* Find out whether this Resource exists.
* @return true if the Property is set, false otherwise.
*/
public boolean isExists() {
return getValue() != null;
}
/**
* Get the size of this Resource.
* @return the size, as a long, 0 if the Resource does not exist (for
* compatibility with java.io.File), or UNKNOWN_SIZE if not known.
*/
public long getSize() {
if (isReference()) {
return ((Resource) getCheckedRef()).getSize();
}
return isExists() ? (long) getValue().length() : 0L;
}
/**
* Get the hash code for this Resource.
* @return hash code as int.
*/
public int hashCode() {
if (isReference()) {
return getCheckedRef().hashCode();
}
return super.hashCode() * PROPERTY_MAGIC;
}
/**
* Get the string.
*
* @return the string contents of the resource.
* @since Ant 1.7
*/
public String toString() {
if (isReference()) {
return getCheckedRef().toString();
}
return String.valueOf(getValue());
}
/**
* Get an InputStream for the Resource.
* @return an InputStream containing this Resource's content.
* @throws IOException if unable to provide the content of this
* Resource as a stream.
* @throws UnsupportedOperationException if InputStreams are not
* supported for this Resource type.
*/
public InputStream getInputStream() throws IOException {
if (isReference()) {
return ((Resource) getCheckedRef()).getInputStream();
}
return isExists() ? new ByteArrayInputStream(getValue().getBytes()) : UNSET;
}
/**
* Get an OutputStream for the Resource.
* @return an OutputStream to which content can be written.
* @throws IOException if unable to provide the content of this
* Resource as a stream.
* @throws UnsupportedOperationException if OutputStreams are not
* supported for this Resource type.
*/
public OutputStream getOutputStream() throws IOException {
if (isReference()) {
return ((Resource) getCheckedRef()).getOutputStream();
}
if (isExists()) {
throw new ImmutableResourceException();
}
return new PropertyOutputStream(getProject(), getName());
}
}