/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.roles.ui.wizard;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.teiid.core.designer.ModelerCoreException;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.container.ContainerImpl;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.function.ScalarFunction;
import org.teiid.designer.metamodels.relational.Catalog;
import org.teiid.designer.metamodels.relational.Column;
import org.teiid.designer.metamodels.relational.Procedure;
import org.teiid.designer.metamodels.relational.ProcedureParameter;
import org.teiid.designer.metamodels.relational.ProcedureResult;
import org.teiid.designer.metamodels.relational.Schema;
import org.teiid.designer.metamodels.relational.Table;
import org.teiid.designer.metamodels.relational.View;
import org.teiid.designer.metamodels.webservice.Interface;
import org.teiid.designer.metamodels.webservice.Operation;
import org.teiid.designer.metamodels.xml.XmlDocument;
import org.teiid.designer.roles.ui.RolesUiPlugin;
import org.teiid.designer.ui.viewsupport.ModelIdentifier;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
*
*/
public class PermissionTreeProvider implements ILabelProvider, ITreeContentProvider {
private static final Object[] NO_CHILDREN = new Object[0];
private ITreeContentProvider modelProvider = ModelUtilities.getModelContentProvider();
private Resource[] resources;
public PermissionTreeProvider() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
if (element instanceof EObject) {
return ModelUtilities.getEMFLabelProvider().getImage(element);
} else if (element instanceof Resource) {
try {
EObject firstEObj = ((Resource)element).getContents().get(0);
ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(firstEObj);
ModelType mType = ma.getModelType();
if (ModelType.PHYSICAL_LITERAL == mType) {
return ModelIdentifier.getImage(ModelIdentifier.RELATIONAL_SOURCE_MODEL_ID);
}
if( ModelIdentifier.isFunctionModelUri(ma.getPrimaryMetamodelUri())) {
return ModelIdentifier.getImage(ModelIdentifier.FUNCTION_MODEL_ID);
}
if( ModelIdentifier.isXmlViewModel(ma.getPrimaryMetamodelUri())) {
return ModelIdentifier.getImage(ModelIdentifier.XML_VIEW_MODEL_ID);
}
if( ModelIdentifier.isWebServicesViewModel(ma.getPrimaryMetamodelUri())) {
return ModelIdentifier.getImage(ModelIdentifier.WEB_SERVICES_VIEW_MODEL_ID);
}
return ModelIdentifier.getImage(ModelIdentifier.RELATIONAL_VIEW_MODEL_ID);
} catch (ModelerCoreException e) {
RolesUiPlugin.UTIL.log(IStatus.ERROR, RolesUiPlugin.UTIL.getString("errorFindingImageForObject", element, e)); //$NON-NLS-1$
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if (element instanceof EObject) {
ILabelProvider p = ModelUtilities.getEMFLabelProvider();
return p.getText(element);
} else if (element instanceof Resource) {
return ((Resource)element).getURI().lastSegment();
}
return StringConstants.EMPTY_STRING;
}
/*
* return an array of objects that are filtered for only Relational Model object types.
*/
private Object[] getFilteredModelContents( List<EObject> eObjs ) {
Collection<EObject> relObjects = new ArrayList<EObject>();
for (EObject eObj : eObjs) {
if( eObj instanceof Table ||
eObj instanceof View ||
eObj instanceof Procedure ||
eObj instanceof ProcedureResult ||
eObj instanceof Schema ||
eObj instanceof Catalog ||
eObj instanceof Column ||
eObj instanceof ProcedureParameter ||
eObj instanceof Interface ||
eObj instanceof Operation ||
eObj instanceof XmlDocument ||
eObj instanceof ScalarFunction) {
relObjects.add(eObj);
}
}
return relObjects.toArray();
}
/*
* return an array of objects that are filtered for only Relational Model object types.
*/
private Object[] getFilteredModelContents( Object[] eObjs ) {
Collection<EObject> relObjects = new ArrayList<EObject>();
for (Object eObj : eObjs) {
if( eObj instanceof Table ||
eObj instanceof View ||
eObj instanceof Procedure ||
eObj instanceof ProcedureResult ||
eObj instanceof Schema ||
eObj instanceof Catalog ||
eObj instanceof Column ||
eObj instanceof ProcedureParameter ||
eObj instanceof Interface ||
eObj instanceof Operation ||
eObj instanceof XmlDocument) {
relObjects.add((EObject)eObj);
}
}
return relObjects.toArray();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements(Object inputElement) {
if (resources == null) {
// Filter out XSD models
List<Resource> allVdbResources = ((ContainerImpl)inputElement).getResources();
List<Resource> filteredResources = new ArrayList<Resource>();
for( Resource res : allVdbResources ) {
if( ! res.getURI().toFileString().toUpperCase().endsWith(".XSD") ) { //$NON-NLS-1$
filteredResources.add(res);
}
}
resources = filteredResources.toArray( new Resource[0]);
}
return resources;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren(Object parentElement) {
Object[] children = NO_CHILDREN;
if (parentElement instanceof EObject) {
children = getFilteredModelContents(modelProvider.getChildren(parentElement));
} else if (parentElement instanceof Resource) {
children = getFilteredModelContents(((Resource)parentElement).getContents());
}
return children;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent(Object element) {
if (element instanceof EObject) {
return ModelUtilities.getModelContentProvider().getParent(element);
} else if (element instanceof Resource) {
return ((Resource)element).getResourceSet();
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren(Object element) {
return true; //getChildren(element).length > 0;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void addListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
@Override
public void dispose() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
@Override
public boolean isLabelProperty(Object element, String property) {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void removeListener(ILabelProviderListener listener) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
}