/**
* Copyright 2010 The University of North Carolina at Chapel Hill
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package unc.lib.cdr.workbench.views;
import edu.unc.lib.staging.SharedStagingArea;
import gov.loc.mets.DivType;
import gov.loc.mets.MdSecType;
import gov.loc.mets.MetsPackage;
import gov.loc.mets.SmLinkType;
import gov.loc.mets.impl.DivTypeImpl;
import gov.loc.mets.util.METSConstants;
import gov.loc.mets.util.METSUtils;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import staging.plugin.StagingPlugin;
import unc.lib.cdr.workbench.IResourceConstants;
import unc.lib.cdr.workbench.originals.OriginalFileStore;
import unc.lib.cdr.workbench.originals.OriginalStub;
import unc.lib.cdr.workbench.views.LabelImageFactory.Icon;
public class OriginalAndDivDecorator implements ILightweightLabelDecorator {
Set<ILabelProviderListener> listeners = new HashSet<ILabelProviderListener>();
public OriginalAndDivDecorator() {
// TODO register as listener to capture and staging changes (less
// granular this time)
}
@SuppressWarnings("unused")
private static final Logger LOG = LoggerFactory
.getLogger(OriginalAndDivDecorator.class);
@Override
public void addListener(ILabelProviderListener listener) {
this.listeners.add(listener);
}
@Override
public void dispose() {
this.listeners.clear();
}
@Override
public boolean isLabelProperty(Object element, String property) {
return true;
}
@Override
public void removeListener(ILabelProviderListener listener) {
this.listeners.remove(listener);
}
@Override
public void decorate(Object element, IDecoration decoration) {
if (element instanceof OriginalStub) {
decorateOriginalStub((OriginalStub) element, decoration);
return;
}
OriginalFileStore r = null;
boolean isDiv = false;
boolean isFile = false;
// added/captured, queued/staged BR
List<String> labels = new ArrayList<String>();
if (element instanceof OriginalFileStore) {
r = (OriginalFileStore) element;
if(r.isAttached()) {
IFileInfo info = r.fetchInfo();
if(info.exists() && !info.isDirectory()) isFile = true;
}
// add prefix of "../" to these when not under volume root
if (r.getWrapped().getParent() != null) {
if (r.getOriginalStub().getStores().contains(r)) {
if (!r.getOriginalStub().getVolumeRootStore().getWrapped()
.equals(r.getWrapped().getParent())) {
decoration.addPrefix(".../");
}
}
}
} else if (DivTypeImpl.class.isInstance(element)) {
isDiv = true;
DivType d = (DivType) element;
if (METSConstants.Div_File.equals(d.getTYPE())) {
isFile = true;
}
Object adapted = Platform.getAdapterManager().getAdapter(d,
OriginalFileStore.class);
if (adapted != null && adapted instanceof OriginalFileStore) {
r = (OriginalFileStore) adapted;
}
// Descriptions Decor
boolean hasUserEdited = false;
boolean hasCrosswalked = false;
for (MdSecType md : d.getDmdSec()) {
String st = md.getSTATUS();
if (METSConstants.MD_STATUS_CROSSWALK_LINKED.equals(st)
|| METSConstants.MD_STATUS_CROSSWALK_USER_LINKED
.equals(st)) {
hasCrosswalked = true;
} else if (METSConstants.MD_STATUS_USER_EDITED.equals(st)) {
hasUserEdited = true;
}
}
if (hasUserEdited) {
decoration.addOverlay(
Icon.UserEditedDecor.getImageDescriptor(),
IDecoration.TOP_RIGHT);
} else if (hasCrosswalked) {
decoration.addOverlay(
Icon.CrosswalkedDecor.getImageDescriptor(),
IDecoration.TOP_RIGHT);
}
// ACL Decor
boolean hasCrosswalkedACL = false;
boolean hasUserACL = false;
for (MdSecType md : d.getMdSec()) {
if (MetsPackage.eINSTANCE.getAmdSecType_RightsMD().equals(
md.eContainingFeature())) {
String st = md.getSTATUS();
if (METSConstants.MD_STATUS_CROSSWALK_LINKED.equals(st)
|| METSConstants.MD_STATUS_CROSSWALK_USER_LINKED
.equals(st)) {
hasCrosswalkedACL = true;
} else if (METSConstants.MD_STATUS_USER_EDITED.equals(st)) {
hasUserACL = true;
}
}
}
if (hasUserACL) {
decoration.addOverlay(Icon.ACLDecor.getImageDescriptor(),
IDecoration.TOP_LEFT);
} else if (hasCrosswalkedACL) {
decoration.addOverlay(Icon.ACLGrayDecor.getImageDescriptor(),
IDecoration.TOP_LEFT);
}
// add labels for links of which this div is the object
for (SmLinkType sml : METSUtils.getObjectLinks(d)) {
labels.add(METSConstants.getLinkForArcRole(sml.getArcrole()).label);
}
}
ImageDescriptor overlay = null;
if (r != null && r.getProject() != null && r.getProject().isOpen()) {
boolean captured = false;
if(r.isAttached() && isFile) {
long byteLength = r.fetchInfo().getLength();
labels.add(IResourceConstants.humanReadableByteCount(byteLength, true));
}
if (r.getMetsDivType() != null) {
captured = true;
if (!isDiv) {
labels.add("captured");
}
}
// staged location == original location
SharedStagingArea prestage = StagingPlugin.getDefault().getStages().findMatchingArea(r.getWrapped().toURI());
if (prestage != null && r.getStagingLocatorType() == null) {
labels.add("pre-staged: " + prestage.getName());
}
if (r.getStagingLocatorType() != null) {
// captured file (original or the div)
overlay = Icon.StagedDecor.getImageDescriptor();
URI uri = URI.create(r.getStagingLocatorType().getHref());
if(uri.isAbsolute()) {
labels.add("staged");
} else {
labels.add("locally staged");
}
} else {
if (captured && isFile) {
overlay = Icon.CaptureDecor.getImageDescriptor();
labels.add("queued");
}
}
} else {
if (isDiv) {
labels.add("added");
}
}
if (overlay != null) {
decoration.addOverlay(overlay, IDecoration.BOTTOM_RIGHT);
}
StringBuilder sb = new StringBuilder();
if (labels.size() > 0) {
sb.append(" [");
sb.append(labels.remove(0));
for (String label : labels) {
sb.append(" ").append(label);
}
sb.append("]");
}
decoration.addSuffix(sb.toString());
}
private void decorateOriginalStub(OriginalStub stub, IDecoration decoration) {
decoration.addPrefix("Originals on ");
List<String> labels = new ArrayList<String>();
// ejected overlay for detached disks
if (!stub.isAttached()) {
decoration.addOverlay(Icon.EjectedDecore.getImageDescriptor(),
IDecoration.TOP_RIGHT);
labels.add("ejected");
}
labels.add(stub.getVolumeType());
if (labels.size() > 0) {
// decoration.setForegroundColor(org.eclipse.swt.graphics.);
StringBuilder sb = new StringBuilder();
sb.append(" [");
sb.append(labels.remove(0));
for (String label : labels) {
sb.append(" ").append(label);
}
sb.append("]");
decoration.addSuffix(sb.toString());
}
}
}