package org.infoglue.cms.util.webdav;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.infoglue.cms.controllers.kernel.impl.simple.AccessRightController;
import org.infoglue.cms.controllers.kernel.impl.simple.DigitalAssetController;
import org.infoglue.cms.controllers.kernel.impl.simple.UserControllerProxy;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.content.DigitalAssetVO;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.security.AuthenticationModule;
import org.infoglue.cms.security.InfoGlueGroup;
import org.infoglue.cms.security.InfoGluePrincipal;
import org.infoglue.cms.security.InfoGlueRole;
import com.bradmcevoy.http.Auth;
import com.bradmcevoy.http.CollectionResource;
import com.bradmcevoy.http.FolderResource;
import com.bradmcevoy.http.PropFindableResource;
import com.bradmcevoy.http.Range;
import com.bradmcevoy.http.Request;
import com.bradmcevoy.http.Resource;
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 ContentVersionResource implements PropFindableResource, FolderResource
{
private final static Logger logger = Logger.getLogger(ContentVersionResource.class.getName());
private InfoGluePrincipal principal = null;
private final ContentVersionVO contentVersion;
public ContentVersionResource(ContentVersionVO contentVersion) {
this.contentVersion = contentVersion;
}
public Date getCreateDate() {
// Unknown
return null;
}
public Object authenticate(String user, String pwd)
{
if(logger.isInfoEnabled())
logger.info("authenticate user in represource:" + user);
try
{
Map loginMap = new HashMap();
loginMap.put("j_username", user);
loginMap.put("j_password", pwd);
String authenticatedUserName = AuthenticationModule.getAuthenticationModule(null, null, null, true).authenticateUser(loginMap);
if(authenticatedUserName != null)
this.principal = UserControllerProxy.getController().getUser(authenticatedUserName);
return authenticatedUserName;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
public boolean authorise(Request arg0, Method arg1, Auth arg2)
{
try
{
boolean hasAccess = AccessRightController.getController().getIsPrincipalAuthorized(this.principal, "ContentVersion.Read", contentVersion.getId().toString());
if(!hasAccess)
return false;
}
catch (SystemException e)
{
e.printStackTrace();
}
return true;
}
public String checkRedirect(Request arg0) {
// No redirects
return null;
}
public Date getModifiedDate() {
// Unknown
return null;
}
public String getName() {
return contentVersion.getLanguageName();
}
public String getRealm() {
return "infoglue";
}
public String getUniqueId() {
return contentVersion.getId().toString();
}
public Resource child(String name)
{
if(logger.isInfoEnabled())
logger.info("child name:" + name);
List<? extends Resource> children = getChildren();
Iterator<? extends Resource> childrenIterator = children.iterator();
while(childrenIterator.hasNext())
{
Resource resource = childrenIterator.next();
if(resource.getName().equals(name))
{
return resource;
}
}
return null;
}
public List<? extends Resource> getChildren()
{
if(logger.isInfoEnabled())
logger.info("Looking for children on contentversion:" + this.contentVersion.getId() + ":" + this.contentVersion.getLanguageName());
List<DigitalAssetResource> assets = new ArrayList<DigitalAssetResource>();
try
{
List<DigitalAssetVO> assetVOList = DigitalAssetController.getController().getDigitalAssetVOList(this.contentVersion.getId());
if(logger.isInfoEnabled())
logger.info("assetVOList:" + assetVOList.size());
for(DigitalAssetVO asset : assetVOList)
{
assets.add( new DigitalAssetResource(asset, this.contentVersion) );
}
}
catch (Exception e)
{
e.printStackTrace();
}
return assets;
}
public CollectionResource createCollection(String arg0)
throws NotAuthorizedException, ConflictException {
// TODO Auto-generated method stub
return null;
}
public InfoGluePrincipal getInfoGluePrincipal()
{
List roles = new ArrayList();
roles.add(new InfoGlueRole("administrators", "", null));
roles.add(new InfoGlueRole("cmsUser", "", null));
List groups = new ArrayList();
groups.add(new InfoGlueGroup("administrators", "", null));
groups.add(new InfoGlueGroup("cmsUser", "", null));
InfoGluePrincipal p = new InfoGluePrincipal("mattias", "mattias", "Mattias", "Bogeblad", "mattias.bogeblad@gmail.com", roles, groups, false, null);
return p;
}
public Resource createNew(String newName, InputStream inputStream, Long length, String contentType) throws IOException, ConflictException
{
if(logger.isInfoEnabled())
logger.info("Creating new asset:" + newName + ":" + length + ":" + contentType);
Resource resource = null;
try
{
DigitalAssetVO digitalAsset = null;
List<DigitalAssetVO> assetVOList = DigitalAssetController.getController().getDigitalAssetVOList(this.contentVersion.getId());
if(logger.isInfoEnabled())
logger.info("assetVOList:" + assetVOList.size());
for(DigitalAssetVO asset : assetVOList)
{
if(asset.getAssetFileName().equalsIgnoreCase(newName))
{
digitalAsset = asset;
digitalAsset.setAssetContentType(contentType);
digitalAsset.setAssetFileName(newName);
digitalAsset.setAssetFilePath("");
digitalAsset.setAssetFileSize(length.intValue());
if(newName.lastIndexOf(".") > -1)
digitalAsset.setAssetKey(newName.substring(0,newName.lastIndexOf(".")));
else
digitalAsset.setAssetKey(newName);
digitalAsset = DigitalAssetController.update(digitalAsset, inputStream);
}
}
if(digitalAsset == null)
{
digitalAsset = new DigitalAssetVO();
digitalAsset.setAssetContentType(contentType);
digitalAsset.setAssetFileName(newName);
digitalAsset.setAssetFilePath("");
digitalAsset.setAssetFileSize(length.intValue());
if(newName.lastIndexOf(".") > -1)
digitalAsset.setAssetKey(newName.substring(0,newName.lastIndexOf(".")));
else
digitalAsset.setAssetKey(newName);
DigitalAssetVO asset = DigitalAssetController.create(digitalAsset, inputStream, this.contentVersion.getId(), getInfoGluePrincipal());
}
if(logger.isInfoEnabled())
logger.info("digitalAsset:" + digitalAsset);
resource = new DigitalAssetResource(digitalAsset, this.contentVersion);
}
catch (Exception e)
{
e.printStackTrace();
throw new IOException("Could not open file:" + e.getMessage());
}
return resource;
}
public void copyTo(CollectionResource arg0, String arg1) {
// TODO Auto-generated method stub
}
public void delete() throws NotAuthorizedException, ConflictException,
BadRequestException {
// TODO Auto-generated method stub
}
public Long getContentLength() {
// TODO Auto-generated method stub
return null;
}
public String getContentType(String arg0) {
// TODO Auto-generated method stub
return null;
}
public Long getMaxAgeSeconds(Auth arg0) {
// TODO Auto-generated method stub
return null;
}
public void sendContent(OutputStream arg0, Range arg1, Map<String, String> arg2, String arg3) throws IOException, NotAuthorizedException, BadRequestException
{
}
public void moveTo(CollectionResource arg0, String arg1)
throws ConflictException {
// TODO Auto-generated method stub
}
}