/** * 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.xwalk; import gov.loc.mets.MdSecType; import gov.loc.mets.util.METSUtils; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.widgets.Display; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import unc.lib.cdr.workbench.IResourceConstants; import unc.lib.cdr.workbench.project.MetsProjectNature; public class CrosswalkContentProvider implements ITreeContentProvider, IResourceChangeListener { @SuppressWarnings("unused") private static final Logger LOG = LoggerFactory.getLogger(CrosswalkContentProvider.class); Viewer viewer = null; private static Object[] EMPTY_ARRAY = new Object[] {}; public CrosswalkContentProvider() { ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); } @Override public void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = viewer; } @Override public Object[] getElements(Object inputElement) { return this.getChildren(inputElement); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang. Object) */ @Override public Object[] getChildren(Object parent) { // log.debug("getChildren: {}", parent.toString()); try { if (parent instanceof IFile) { IFile f = (IFile) parent; if (IResourceConstants.CROSSWALK_EXTENSION.equals(f.getFileExtension())) { Map<Integer, MetadataCompartment> results = new HashMap<Integer, MetadataCompartment>(); IProject p = f.getProject(); MetsProjectNature n = (MetsProjectNature) p.getNature(MetsProjectNature.NATURE_ID); Collection<MdSecType> mdSecs = METSUtils.getAllMdSecTypes(n.getMets()); for (MdSecType mdSec : mdSecs) { if (f.getName().equals(mdSec.getGROUPID())) { // crosswalk record IDs end in underscore and row number String row = mdSec.getID().substring(mdSec.getID().lastIndexOf("_")+1); Integer r = Integer.valueOf(Integer.parseInt(row)); MetadataCompartment mc = null; if(results.get(Integer.valueOf(r)) == null) { mc = new MetadataCompartment(); mc.row = r.intValue(); results.put(r, mc); } else { mc = results.get(r); } mc.metadataSections.add(mdSec); } } return results.values().toArray(); } } else if(parent instanceof MetadataCompartment) { MetadataCompartment mc = (MetadataCompartment)parent; return mc.metadataSections.toArray(); } } catch (CoreException e) { throw new Error(e); } return EMPTY_ARRAY; } @Override public Object getParent(Object element) { Object result = null; if (element instanceof IResource) { IResource r = (IResource) element; // should be a resource within an originals folder, use // getParent() return r.getParent(); } else { return result; } } @Override public boolean hasChildren(Object element) { if (element instanceof IFile || element instanceof MetadataCompartment) { return true; } return false; } /* * (non-Javadoc) * * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org * .eclipse.core.resources.IResourceChangeEvent) */ @Override public void resourceChanged(IResourceChangeEvent event) { Display.getDefault().asyncExec(new Runnable() { public void run() { if (!viewer.getControl().isDisposed()) { viewer.refresh(); } } }); } }