Java tutorial
/******************************************************************************* * 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; } }