package com.delcyon.capo.controller.elements;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import org.w3c.dom.Element;
import com.delcyon.capo.CapoApplication;
import com.delcyon.capo.controller.AbstractControl;
import com.delcyon.capo.controller.ControlElementProvider;
import com.delcyon.capo.datastream.NullOutputStream;
import com.delcyon.capo.datastream.StreamUtil;
import com.delcyon.capo.resourcemanager.ResourceDescriptor;
import com.delcyon.capo.resourcemanager.ResourceParameter;
import com.delcyon.capo.resourcemanager.ResourceParameterBuilder;
import com.delcyon.capo.resourcemanager.types.ContentMetaData;
import com.delcyon.capo.server.CapoServer;
@ControlElementProvider(name="resourceMetaData") //TODO contentMetatDataElement
public class ResourceMetaDataElement extends AbstractControl
{
public enum Attributes
{
name,
resource,
forceOpen,
forceRead,
useLastRead,
depth,
useRelativePaths,
attributes, requiredAttributes
}
private static final String[] supportedNamespaces = {CapoApplication.SERVER_NAMESPACE_URI};
@Override
public Attributes[] getAttributes()
{
return Attributes.values();
}
@Override
public Attributes[] getRequiredAttributes()
{
return new Attributes[]{Attributes.resource};
}
@Override
public String[] getSupportedNamespaces()
{
return supportedNamespaces;
}
@Override
public Object processServerSideElement() throws Exception
{
String resource = getAttributeValue(Attributes.resource);
ResourceParameterBuilder resourceParameterBuilder = new ResourceParameterBuilder();
resourceParameterBuilder.addAll(getControlElementDeclaration());
if (getAttributeValue(Attributes.depth).isEmpty() == false)
{
resourceParameterBuilder.addParameter(ContentMetaData.Parameters.DEPTH, getAttributeValue(Attributes.depth));
}
if (getAttributeValue(Attributes.useRelativePaths).equalsIgnoreCase("true"))
{
resourceParameterBuilder.addParameter(ContentMetaData.Parameters.USE_RELATIVE_PATHS, getAttributeValue(Attributes.useRelativePaths).toLowerCase());
resourceParameterBuilder.addParameter(ContentMetaData.Parameters.ROOT_PATH, resource);
}
ResourceParameter[] resourceParameters = resourceParameterBuilder.getParameters();
Boolean result = false;
//get attributes to display
String[] attributes = null;
if (getAttributeValue(Attributes.attributes).isEmpty() == false)
{
attributes = getAttributeValue(Attributes.attributes).split(",");
}
ResourceDescriptor resourceDescriptor = null;
if (getAttributeValue(Attributes.forceOpen).equalsIgnoreCase("true"))
{
resourceDescriptor = getParentGroup().openResourceDescriptor(this, resource);
}
else
{
resourceDescriptor = getParentGroup().getResourceDescriptor(this, resource);
}
if (resourceDescriptor != null)
{
if (getAttributeValue(Attributes.forceRead).equalsIgnoreCase("true"))
{
StreamUtil.readInputStreamIntoOutputStream(resourceDescriptor.getInputStream(getParentGroup(),resourceParameters),new NullOutputStream());
}
ContentMetaData contentMetaData = null;
if (getAttributeValue(Attributes.useLastRead).equalsIgnoreCase("true"))
{
StreamUtil.readInputStreamIntoOutputStream(resourceDescriptor.getInputStream(getParentGroup(),resourceParameters),new NullOutputStream());
contentMetaData = resourceDescriptor.getContentMetaData(getParentGroup(),resourceParameters);
}
else
{
contentMetaData = resourceDescriptor.getResourceMetaData(getParentGroup(),resourceParameters);
}
resourceDescriptor.close(getParentGroup(), resourceParameters);
buildElementContent(contentMetaData,getControlElementDeclaration(),attributes);
}
else
{
CapoServer.logger.log(Level.SEVERE," no resource found matching: "+getAttributeValue(Attributes.resource));
}
return result;
}
private void buildElementContent(ContentMetaData contentMetaData, Element containerElement, String... attributes)
{
List<String> supportedAttributeList = contentMetaData.getSupportedAttributes();
for (String attributeName : supportedAttributeList)
{
if (attributes != null && Arrays.binarySearch(attributes, attributeName) < 0)
{
continue;
}
if (contentMetaData.getValue(attributeName) != null)
{
containerElement.setAttribute(attributeName, contentMetaData.getValue(attributeName));
}
}
if (contentMetaData.isContainer())
{
for (ContentMetaData childContentMetaData : contentMetaData.getContainedResources()) //hmmm....
{
if (getAttributeValue(Attributes.requiredAttributes).isEmpty() == false)
{
String[] requiredAttributes = getAttributeValue(Attributes.requiredAttributes).split(",");
boolean foundAllAttributes = true;
for (String requiredAttribute : requiredAttributes)
{
if (childContentMetaData.getValue(requiredAttribute) == null)
{
foundAllAttributes = false;
break;
}
}
if (foundAllAttributes == false)
{
continue;
}
}
Element resourceElement = containerElement.getOwnerDocument().createElement("resource");
if (childContentMetaData.getResourceURI() == null)
{
System.err.println("got here");
}
else
{
resourceElement.setAttribute("uri", childContentMetaData.getResourceURI().getResourceURIString());
}
//resourceElement.setAttribute("uri", resourceDescriptor.isRemoteResource() ? "remote:"+ childContentMetaData.getResourceURI().toString() : childContentMetaData.getResourceURI().toString());
containerElement.appendChild(resourceElement);
buildElementContent(childContentMetaData, resourceElement,attributes);
}
}
}
}