package org.infoglue.cms.util.webdav;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.Map;
import org.apache.log4j.Logger;
import org.infoglue.cms.controllers.kernel.impl.simple.DigitalAssetController;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.content.DigitalAssetVO;
import com.bradmcevoy.http.Auth;
import com.bradmcevoy.http.CollectionResource;
import com.bradmcevoy.http.FileItem;
import com.bradmcevoy.http.FileResource;
import com.bradmcevoy.http.PropFindableResource;
import com.bradmcevoy.http.Range;
import com.bradmcevoy.http.Request;
import com.bradmcevoy.http.Request.Method;
import com.bradmcevoy.http.exceptions.BadRequestException;
import com.bradmcevoy.http.exceptions.ConflictException;
import com.bradmcevoy.http.exceptions.NotAuthorizedException;
public class DigitalAssetResource implements PropFindableResource, FileResource
{
private final static Logger logger = Logger.getLogger(DigitalAssetResource.class.getName());
private final DigitalAssetVO digitalAsset;
private final ContentVersionVO cv;
public DigitalAssetResource(DigitalAssetVO digitalAsset, ContentVersionVO cv) {
this.digitalAsset = digitalAsset;
this.cv = cv;
}
public Date getCreateDate() {
return new Date();
}
public Object authenticate(String user, String pwd) {
return user;
}
public boolean authorise(Request arg0, Method arg1, Auth arg2) {
return true;
}
public String checkRedirect(Request arg0) {
return null;
}
public Date getModifiedDate() {
return new Date();
}
public String getName() {
return digitalAsset.getAssetFileName().toString(); //.getLanguageName();
}
public String getRealm() {
return "infoglue";
}
public String getUniqueId() {
return digitalAsset.getId().toString();
}
public void copyTo(CollectionResource arg0, String arg1)
{
}
public void delete() throws NotAuthorizedException, ConflictException, BadRequestException
{
if(logger.isInfoEnabled())
logger.info("Deleting asset:" + this.digitalAsset.getId() + " and decoupling it from " + cv.getId());
try
{
DigitalAssetController.getController().delete(this.digitalAsset.getId(), "ContentVersion", cv.getId());
}
catch (Exception e)
{
e.printStackTrace();
throw new NotAuthorizedException(this);
}
}
public Long getContentLength() {
return new Long(digitalAsset.getAssetFileSize());
}
public String getContentType(String arg0) {
return digitalAsset.getAssetContentType();
}
public Long getMaxAgeSeconds(Auth arg0)
{
return null;
}
public void sendContent(OutputStream out, Range arg1, Map<String, String> params, String contentType) throws IOException, NotAuthorizedException, BadRequestException
{
try
{
String filePath = DigitalAssetController.getDigitalAssetFilePath(digitalAsset.getId());
if(logger.isInfoEnabled())
logger.info("filePath:" + filePath);
File file = new File(filePath);
if(logger.isInfoEnabled())
logger.info("file:" + file.getPath());
FileInputStream fis = new FileInputStream(filePath);
BufferedInputStream bin = new BufferedInputStream(fis);
final byte[] buffer = new byte[ 1024 ];
int n = 0;
while( -1 != (n = bin.read( buffer )) ) {
out.write( buffer, 0, n );
}
}
catch (Exception e)
{
e.printStackTrace();
throw new IOException("Could not open file:" + e.getMessage());
}
}
public void moveTo(CollectionResource newTargetResource, String newName) throws ConflictException
{
try
{
if(!(newTargetResource instanceof ContentVersionResource))
throw new Exception("Could not move to an entity not based on a content version");
else
{
ContentVersionResource newTargetContentVersionResource = (ContentVersionResource)newTargetResource;
if(!newTargetContentVersionResource.getUniqueId().equals(this.cv.getId().toString()))
throw new Exception("We do not support moving assets between content versions yet...");
}
digitalAsset.setAssetFileName(newName);
if(newName.lastIndexOf(".") > -1)
digitalAsset.setAssetKey(newName.substring(0,newName.lastIndexOf(".")));
else
digitalAsset.setAssetKey(newName);
DigitalAssetController.update(digitalAsset, null);
}
catch (Exception e)
{
e.printStackTrace();
throw new ConflictException(this);
}
}
public String processForm(Map<String, String> arg0,
Map<String, FileItem> arg1) throws BadRequestException,
NotAuthorizedException, ConflictException {
// TODO Auto-generated method stub
return null;
}
}