eu.planets_project.tb.gui.backing.data.DigitalObjectTreeNode.java Source code

Java tutorial

Introduction

Here is the source code for eu.planets_project.tb.gui.backing.data.DigitalObjectTreeNode.java

Source

/*******************************************************************************
 * Copyright (c) 2007, 2010 The Planets Project Partners.
 *
 * All rights reserved. This program and the accompanying 
 * materials are made available under the terms of the 
 * Apache License, Version 2.0 which accompanies 
 * this distribution, and is available at 
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 *******************************************************************************/
/**
 * 
 */
package eu.planets_project.tb.gui.backing.data;

import java.io.FileNotFoundException;
import java.net.URI;
import java.util.List;

import javax.activation.MimetypesFileTypeMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.myfaces.custom.tree2.TreeNodeBase;

import eu.planets_project.ifr.core.storage.api.DataRegistry;
import eu.planets_project.ifr.core.storage.api.DigitalObjectManager.DigitalObjectNotFoundException;
import eu.planets_project.services.datatypes.DigitalObject;
import eu.planets_project.services.datatypes.Property;
import eu.planets_project.tb.api.data.util.DataHandler;
import eu.planets_project.tb.gui.util.JSFUtil;
import eu.planets_project.tb.impl.data.XcdlCorpusDigitalObjectManagerImpl;
import eu.planets_project.tb.impl.data.util.DataHandlerImpl;

/**
 * 
 * URGENT Cache the DigitalObjectRefBean instead of the DOB explicitly?
 * URGENT Push the property lookups (and others) down to the RefBean instead of here?
 * 
 * @author AnJackson
 *
 */
public class DigitalObjectTreeNode extends TreeNodeBase implements java.io.Serializable {
    static final long serialVersionUID = 82362318283823293l;

    static private Log log = LogFactory.getLog(DigitalObjectTreeNode.class);

    private DataRegistry dataReg;
    private DigitalObject dob_cache = null;
    private URI uri;
    private String leafname;
    private boolean selectable;
    private boolean expanded = false;

    private DataHandler dh = DataHandlerImpl.findDataHandler();

    /**
     * Constructor based on Digital Object:
     */
    public DigitalObjectTreeNode(URI uri, DataRegistry dataReg) {
        log.debug("Creating bean for Digital Object at: " + uri);
        this.setUri(uri);
        this.dataReg = dataReg;
        this.setType("file");
        this.setLeaf(true);
        this.setSelectable(true);
    }

    public DigitalObjectTreeNode(URI uri) {
        this.setUri(uri);
        this.dataReg = null;
        this.setType("folder");
        this.setLeaf(false);
        this.setSelectable(false);
    }

    public DigitalObjectTreeNode() {
        this.uri = null;
    }

    /** */
    private void setUri(URI uri) {
        this.uri = uri;
        if (this.uri != null) {
            this.leafname = uri.getPath();
            if (this.leafname != null) {
                String[] parts = this.leafname.split("/");
                if (parts != null && parts.length > 0)
                    this.leafname = parts[parts.length - 1];
            }
        } else {
            this.leafname = "/";
        }
    }

    /**
     * @return the dob
     */
    public DigitalObject getDob() {
        if (dataReg == null)
            return null;
        if (dob_cache == null) {
            try {
                log.info("Looking for Digital Object at " + this.getUri());
                this.dob_cache = this.dataReg.retrieve(getUri());
            } catch (DigitalObjectNotFoundException e) {
                log.error("Could not locate DOB: " + this.getUri());
                return null;
            }
        }
        return dob_cache;
    }

    /**
     * @return a TB download URI:
     */
    public String getDownloadUri() {
        if (this.getUri() == null)
            return null;
        try {
            URI duri = dh.get(this.getUri().toString()).getDownloadUri();
            log.debug("Returning download location: " + duri);
            if (duri == null)
                return null;
            return duri.toASCIIString();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @return the underlying URI
     */
    public URI getUri() {
        return uri;
    }

    /**
     * @return
     */
    public String getUriString() {
        if (uri == null)
            return null;
        return uri.toASCIIString();
    }

    /**
     * @return
     */
    public List<DigitalObjectTreeNode> getParents() {
        DigitalObjectBrowser db = (DigitalObjectBrowser) JSFUtil.getManagedObject("DobBrowser");
        return db.getBreadcrumb(this.getUri());
    }

    /**
     * @return the leafname
     */
    public String getLeafname() {
        return this.leafname;
    }

    /**
     * @param string
     */
    protected void setLeafname(String leafname) {
        this.leafname = leafname;
    }

    /**
     * @return the size of the object.
     */
    public long getSize() {
        if (dataReg == null)
            return -1;

        DigitalObject dob = this.getDob();
        if (dob == null)
            return -1;
        if (dob.getContent() == null)
            return -1;
        return dob.getContent().length();
    }

    /**
     * Look for properties attached to this DOB.
     * @return Any properties that this framework understands. NULL if there are none.
     */
    public List<Property> getProperties() {
        if (XcdlCorpusDigitalObjectManagerImpl.hasXcdlPropertied(this.getDob())) {
            return XcdlCorpusDigitalObjectManagerImpl.getXcdlProperties(this.getDob());
        }
        return null;
    }

    /**
     * @return
     */
    public String getMimeType() {
        String mimetype = null;

        // Lookup in this:
        MimetypesFileTypeMap mimeMap = new MimetypesFileTypeMap();
        // Ensure the image/png mapping is present, as it appears to be broken in Java 6
        // See http://furiouspurpose.blogspot.com/2009/01/what-does-java-6-have-against-imagepng.html
        mimeMap.addMimeTypes("image/png png");

        // Based only on URI:
        if (getUri() != null)
            mimetype = mimeMap.getContentType(getUri().getPath());

        // Return this if it worked.
        if (mimetype != null)
            return mimetype;

        // Otherwise, inspect content of the Digital Object: Title:
        if (getDob() != null && getDob().getTitle() != null)
            mimetype = mimeMap.getContentType(getDob().getTitle());

        return mimetype;
    }

    /**
     * @return true if this entity can be displayed as a thumbnail.
     */
    public boolean isThumbnailable() {
        String mimeType = this.getMimeType();
        log.info("Checking mime type: " + mimeType);
        if ("image/jpeg".equals(mimeType) || "image/gif".equals(mimeType) || "image/png".equals(mimeType)) {
            return true;
        }
        return false;
    }

    /**
     * @return
     */
    public String getThumbnailUri() {
        try {
            String duri = dh.get(this.getUri().toString()).getThumbnailUri().toASCIIString();
            log.debug("Returning thumbnail location: " + duri);
            return duri;
        } catch (Exception e) {
            log.error("Exception while generating thumbnail URI: " + e);
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @return the directory
     */
    public boolean isDirectory() {
        return (dataReg == null);
    }

    /**
     * @return the selected
     */
    public boolean isSelected() {
        DigitalObjectBrowser db = (DigitalObjectBrowser) JSFUtil.getManagedObject("DobBrowser");
        if (db.getSelectedUris().contains(this.getUri())) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * @param selected the selected to set
     */
    public void setSelected(boolean selected) {
        DigitalObjectBrowser db = (DigitalObjectBrowser) JSFUtil.getManagedObject("DobBrowser");
        if (selected == true) {
            db.addToSelection(this.getUri());
        } else {
            db.removeFromSelection(this.getUri());
        }
        log.debug("Setting 'Selected' to: " + selected);
        db.setSelectedPanel(DigitalObjectBrowser.SELECTION_PANEL);
    }

    /**
     * 
     */
    public void deselectThis() {
        this.setSelected(false);
    }

    /**
     * 
     */
    public void selectThis() {
        this.setSelected(true);
    }

    /**
     * @return the selectable
     */
    public boolean isSelectable() {
        return selectable;
    }

    /**
     * @param selectable the selectable to set
     */
    public void setSelectable(boolean selectable) {
        this.selectable = selectable;
    }

    /**
     * @return the expanded
     */
    public boolean isExpanded() {
        return expanded;
    }

    /**
     * @param expanded the expanded to set
     */
    public void setExpanded(boolean expanded) {
        this.expanded = expanded;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((uri == null) ? 0 : uri.hashCode());
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        DigitalObjectTreeNode other = (DigitalObjectTreeNode) obj;
        if (uri == null) {
            if (other.uri != null)
                return false;
        } else if (!uri.equals(other.uri))
            return false;
        return true;
    }

}