package railo.commons.io.res.type.ram;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* Core of a Ram Resource, holds the concrete data for a existing resource
*/
public final class RamResourceCore implements Serializable {
/**
* Directory Resource
*/
public static final int TYPE_DIRECTORY=1;
/**
* Directory Resource
*/
public static final int TYPE_FILE=2;
private static final String[] EMPTY_NAMES = new String[0];
private int type;
private String name;
private byte[] data;
private List children;
private long lastModified=System.currentTimeMillis();
private int mode=0777;
private int attributes=0;
private RamResourceCore parent;
/**
* Konstruktor
* @param parent
* @param type
* @param name
* @param caseSensitive
*/
public RamResourceCore(RamResourceCore parent, int type,String name) {
if(parent!=null) {
parent.addChild(this);
}
this.parent=parent;
this.type=type;
this.name=name;
}
/**
* Gibt den Feldnamen lastModified zurueck.
* @return lastModified
*/
public long getLastModified() {
return this.lastModified;
}
/**
* Setzt den Feldnamen lastModified.
* @param lastModified lastModified
*/
public void setLastModified(long lastModified) {
this.lastModified = lastModified;
}
/**
* Gibt den Feldnamen children zurueck.
* @return children
*/
public String[] getChildNames() {
if(children==null || children.size()==0) return EMPTY_NAMES;
String[] arr = new String[children.size()];
for(int i=0;i<arr.length;i++) {
arr[i]=((RamResourceCore)children.get(i)).getName();
}
return arr;
}
/**
* Setzt den Feldnamen children.
* @param children children
*/
public void setChildren(List children) {
this.children = children;
}
/**
* Gibt den Feldnamen data zurueck.
* @return data
*/
public byte[] getData() {
return this.data;
}
/**
* Setzt den Feldnamen data.
* @param data data
* @param append
*/
public void setData(byte[] data,boolean append) {
lastModified=System.currentTimeMillis();
// set data
if(append) {
if(this.data!=null && data!=null) {
byte[] newData=new byte[this.data.length+data.length];
int i=0;
for(;i<this.data.length;i++) {
newData[i]=this.data[i];
}
for(;i<this.data.length+data.length;i++) {
newData[i]=data[i-this.data.length];
}
this.data=newData;
}
else if(data!=null) {
this.data=data;
}
}
else {
this.data=data;
}
// set type
if(this.data!=null) this.type=RamResourceCore.TYPE_FILE;
}
/**
* Gibt den Feldnamen name zurueck.
* @return name
*/
public String getName() {
return this.name;
}
/**
* Setzt den Feldnamen name.
* @param name name
*/
public void setName(String name) {
lastModified=System.currentTimeMillis();
this.name = name;
}
/**
* Gibt den Feldnamen type zurueck.
* @return type
*/
public int getType() {
return this.type;
}
/**
* Setzt den Feldnamen type.
* @param type type
*/
public void setType(int type) {
lastModified=System.currentTimeMillis();
this.type = type;
}
public void addChild(RamResourceCore child) {
if(children==null)children=new ArrayList();
children.add(child);
}
/**
* returns a child that match given name
* @param name
* @return matching child
*/
public RamResourceCore getChild(String name, boolean caseSensitive) {
if(children==null) return null;
RamResourceCore child;
for(int i=children.size()-1;i>=0;i--) {
child=(RamResourceCore) children.get(i);
if(child!=null
&& (caseSensitive?child.getName().equals(name):child.getName().equalsIgnoreCase(name)))
return child;
}
return null;
}
/**
* returns the parent if this core
* @return parent core or null if no parent available
*/
public RamResourceCore getParent() {
return parent;
}
/**
* remove given child from this core
* @param core
*/
public void removeChild(RamResourceCore core) {
if(children==null) return;
RamResourceCore child;
for(int i=children.size()-1;i>=0;i--) {
child=(RamResourceCore) children.get(i);
if(child==core) {
children.remove(i);
break;
}
}
}
/**
* @return the mode
*/
public int getMode() {
return mode;
}
/**
* @param mode the mode to set
*/
public void setMode(int mode) {
this.mode=mode;
}
public int getAttributes() {
return attributes;
}
public void setAttributes(int attributes) {
this.attributes=attributes;
}
public void remove() {
setType(0);
setData(null,false);
setChildren(null);
RamResourceCore p=getParent();
if(p!=null)p.removeChild(this);
}
}