package com.delcyon.capo.resourcemanager.types;
import java.util.List;
import java.util.Vector;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
import javax.jcr.Value;
import com.delcyon.capo.datastream.stream_attribute_filter.MD5FilterInputStream;
import com.delcyon.capo.datastream.stream_attribute_filter.SizeFilterInputStream;
import com.delcyon.capo.resourcemanager.ContentFormatType;
import com.delcyon.capo.resourcemanager.ResourceParameter;
import com.delcyon.capo.resourcemanager.ResourceURI;
import com.delcyon.capo.resourcemanager.types.FileResourceContentMetaData.FileAttributes;
import com.delcyon.capo.server.jackrabbit.CapoJcrServer;
public class JcrContentMetaData implements ContentMetaData
{
public static final String CAPO_METADATA_PREFIX = "";
private ResourceURI resourceURI = null;
private ResourceParameter[] resourceParameters = new ResourceParameter[0];
private JcrContentMetaData()
{
//Serialization
}
// @Override
// public void preClone(Object parentClonedObject, Object clonedObject) throws Exception {} //don't need to do anything
//
// @Override
// public void postClone(Object parentClonedObject, Object clonedObject) throws Exception
// {
// ((JcrContentMetaData)clonedObject).node = this.node;
// }
public JcrContentMetaData(ResourceURI resourceURI,ResourceParameter...resourceParameters)
{
this.resourceParameters = resourceParameters;
this.resourceURI = resourceURI;
}
// private JcrContentMetaData(Node node) throws ValueFormatException, PathNotFoundException, RepositoryException
// {
// // System.out.println(node.getName()+"==>"+node.getPath());
// //this.node = node;
// if(node.hasProperty(CAPO_METADATA_PREFIX+"resourceURI"))
// {
// this.resourceURI = new ResourceURI(node.getProperty(CAPO_METADATA_PREFIX+"resourceURI").getString());
// }
// else
// {
// this.resourceURI = new ResourceURI("repo:"+node.getPath());
// }
// }
// protected void setNode(Node node)
// {
// this.node = node;
// }
@Override
public boolean isDynamic()
{
return false;
}
@Override
public boolean areDynamicAttributeLoaded()
{
return true;
}
@Override
public void refresh(ResourceParameter... resourceParameters) throws Exception
{
}
@Override
public boolean isInitialized()
{
return true;
}
@Override
public void setInitialized(boolean isInitialized)
{
}
@Override
public ContentFormatType getContentFormatType()
{
try
{
return ContentFormatType.valueOf(getValue(ContentFormatType.ATTRIBUTE_NAME));
}
catch (Exception exception)
{
//exception.printStackTrace();
return ContentFormatType.NO_CONTENT;
}
}
@Override
public void setContentFormatType(ContentFormatType contentFormatType)
{
setValue(ContentFormatType.ATTRIBUTE_NAME, contentFormatType.toString());
}
@Override
public Boolean exists()
{
if(getNode() == null)
{
return false;
}
else
{
return true;
}
}
@Override
public Boolean isReadable()
{
return Boolean.parseBoolean(getValue("readable"));
}
@Override
public Long getLength()
{
if(getValue(SizeFilterInputStream.ATTRIBUTE_NAME) != null)
{
return Long.parseLong(getValue(SizeFilterInputStream.ATTRIBUTE_NAME));
}
else
{
return 0L;
}
}
@Override
public Boolean isWriteable()
{
return Boolean.parseBoolean(getValue("writeable"));
}
@Override
public String getMD5()
{
return getValue(MD5FilterInputStream.ATTRIBUTE_NAME);
}
@Override
public Boolean isContainer()
{
if(getNode() == null)
{
return true;
}
//check for root node
try
{
if(getNode().getDepth() == 0)
{
return true;
}
}
catch (RepositoryException e)
{
e.printStackTrace();
}
return Boolean.parseBoolean(getValue("container"));
}
@Override
public void clearAttributes()
{
// TODO Auto-generated method stub
}
@Override
public Long getLastModified()
{
return Long.parseLong(getValue("lastmodified"));
}
@Override
public void setValue(String name, String value)
{
try
{
getNode().setProperty(name, value);
}
catch (RepositoryException e)
{
e.printStackTrace();
}
}
@Override
public String getValue(String name)
{
try
{
if(getNode() == null)
{
return null;
}
if(getNode().hasProperty(CAPO_METADATA_PREFIX+name) == false)
{
return null;
}
Property property = getNode().getProperty(CAPO_METADATA_PREFIX+name);
if(property.isMultiple() == false)
{
return property.getString().substring(CAPO_METADATA_PREFIX.length());
}
else
{
Value[] values = property.getValues();
StringBuilder builder = new StringBuilder("{");
for (Value value : values)
{
builder.append(value.getString()+",");
}
builder.setCharAt(builder.length()-1, '}');
return builder.toString();
}
}
catch (Exception exception)
{
exception.printStackTrace();
return null;
}
}
@Override
public String getValue(Enum name)
{
return getValue(name.toString());
}
@Override
public boolean isSupported(String attributeName)
{
return true;
}
@Override
public boolean hasAttribute(String attributeName)
{
return (getValue(attributeName) != null);
}
@Override
public List<String> getSupportedAttributes()
{
List<String> properties = new Vector<String>();
try
{
if(getNode() == null)
{
//default to file attributes
for (Enum attributeEnum : new Enum[]{Attributes.exists,Attributes.executable,Attributes.readable,Attributes.writeable,Attributes.container,Attributes.lastModified,Attributes.MD5,FileAttributes.absolutePath,FileAttributes.canonicalPath,FileAttributes.symlink,FileAttributes.regular})
{
properties.add(attributeEnum.toString());
}
return properties;
}
PropertyIterator propertyIterator = getNode().getProperties();
//JcrResourceDescriptor.dump(getNode());
while(propertyIterator.hasNext())
{
Property property = propertyIterator.nextProperty();
properties.add(property.getName());
}
} catch (Exception e){
e.printStackTrace();
}
return properties;
}
@Override
public List<ContentMetaData> getContainedResources()
{
List<ContentMetaData> childNodeList = new Vector<ContentMetaData>();
if(getNode() == null)
{
return childNodeList;
}
NodeIterator nodeIterator;
try
{
nodeIterator = getNode().getNodes();
while(nodeIterator.hasNext())
{
Node childNode = nodeIterator.nextNode();
childNodeList.add(new JcrContentMetaData(new ResourceURI("repo:"+childNode.getPath())));
}
}
catch (RepositoryException e)
{
e.printStackTrace();
}
return childNodeList;
}
@Override
public void addContainedResource(ContentMetaData contentMetaData)
{
//node.addNode()
}
@Override
public ResourceURI getResourceURI()
{
return this.resourceURI;
}
@Override
public void init()
{
}
protected Node getNode()
{
try
{
if(CapoJcrServer.getSession().nodeExists(resourceURI.getPath()) == true)
{
return CapoJcrServer.getSession().getNode(resourceURI.getPath());
}
} catch (Exception exception)
{
exception.printStackTrace();
}
return null;
}
@Override
public ResourceParameter[] getResourceParameters()
{
return resourceParameters;
}
}