/*
* 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.vdb.ui.editor.panels;
import java.io.File;
import java.util.Collection;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IWorkbenchWindow;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.designer.core.ModelEditorImpl;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.container.ContainerImpl;
import org.teiid.designer.core.workspace.ModelUtil;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.relational.RelationalPackage;
import org.teiid.designer.metamodels.xml.XmlDocumentPackage;
import org.teiid.designer.roles.Crud.Type;
import org.teiid.designer.roles.DataRole;
import org.teiid.designer.roles.Permission;
import org.teiid.designer.roles.ui.wizard.DataRoleWizard;
import org.teiid.designer.ui.common.UILabelUtil;
import org.teiid.designer.ui.common.UiLabelConstants;
import org.teiid.designer.ui.common.table.TableViewerBuilder;
import org.teiid.designer.ui.common.util.WidgetFactory;
import org.teiid.designer.ui.viewsupport.ModelIdentifier;
import org.teiid.designer.vdb.Vdb;
import org.teiid.designer.vdb.Vdb.Event;
import org.teiid.designer.vdb.VdbUtil;
import org.teiid.designer.vdb.ui.VdbUiConstants;
import org.teiid.designer.vdb.ui.VdbUiPlugin;
import org.teiid.designer.vdb.ui.VdbUiConstants.Images;
import org.teiid.designer.vdb.ui.editor.ConfirmationDialog;
import org.teiid.designer.vdb.ui.editor.VdbEditor;
/**
* @author blafond
*
*/
public class DataRolesPanel {
static final String CONFIRM_OVERWRITE_UDFJAR_MESSAGE = i18n("confirmOverwriteUdfJarMessage"); //$NON-NLS-1$
static final String INFORM_DATA_ROLES_ON_ADD_MESSAGE = i18n("informDataRolesExistOnAddMessage"); //$NON-NLS-1$
static final String WEB_SERVICES_VIEW_MODEL_URI = "http://www.metamatrix.com/metamodels/WebService"; //$NON-NLS-1$
static final String DESCRIPTION_COLUMN_NAME = i18n("descriptionColumnName"); //$NON-NLS-1$;
static final String CONFIRM_REMOVE_MESSAGE = i18n("confirmRemoveMessage"); //$NON-NLS-1$
static String i18n( final String id ) {
return VdbUiConstants.Util.getString(id);
}
VdbEditor vdbEditor;
Action cloneDataRoleAction;
DataRole selectedDataRole;
TableViewerBuilder dataRolesViewer;
Button newButton, editButton, deleteButton;
/**
* @param parent
* @param editor
*/
public DataRolesPanel(Composite parent, VdbEditor editor) {
super();
this.vdbEditor = editor;
createPanel(parent);
}
private void createPanel(Composite parent) {
// Need a top Table Viewer containing Name and Description strings
this.dataRolesViewer = new TableViewerBuilder(parent, (SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER));
this.dataRolesViewer.setContentProvider( new DataRolesContentProvider());
this.dataRolesViewer.setInput(vdbEditor);
// create columns
TableViewerColumn column = this.dataRolesViewer.createColumn(SWT.LEFT, 30, 40, true);
column.getColumn().setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.NAME));
column.setLabelProvider(new DataRoleLabelProvider(0));
column = this.dataRolesViewer.createColumn(SWT.LEFT, 30, 40, true);
column.getColumn().setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.DESCRIPTION));
column.setLabelProvider(new DataRoleLabelProvider(1));
this.dataRolesViewer.setInput(this.vdbEditor.getVdb());
final MenuManager dataRolesMenuManager = new MenuManager();
dataRolesViewer.getControl().setMenu(dataRolesMenuManager.createContextMenu(parent));
this.dataRolesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
if( sel.isEmpty()) {
deleteButton.setEnabled(false);
editButton.setEnabled(false);
} else {
Object[] objs = sel.toArray();
deleteButton.setEnabled(true);
editButton.setEnabled(objs.length == 1);
}
dataRolesMenuManager.removeAll();
if (sel.size() == 1) {
selectedDataRole = (DataRole)sel.getFirstElement();
dataRolesMenuManager.add(cloneDataRoleAction);
}
}
});
this.dataRolesViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
Object[] objs = sel.toArray();
if( objs.length == 1 && objs[0] instanceof DataRole) {
handleEdit((DataRole)objs[0]);
}
}
});
this.cloneDataRoleAction = new Action(i18n("cloneDataRoleActionLabel")) { //$NON-NLS-1$
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
if (selectedDataRole != null) {
DataRole newDR = new DataRole(
selectedDataRole.getName() + i18n("cloneDataRoleAction.copySuffix"), //$NON-NLS-1$
selectedDataRole.getDescription(), selectedDataRole.isAnyAuthenticated(),
selectedDataRole.isAllowCreateTempTables(), selectedDataRole.isGrantAll(),
selectedDataRole.getRoleNames(), selectedDataRole.getPermissions());
vdbEditor.getVdb().addDataRole(newDR);
dataRolesViewer.refresh();
}
}
};
this.cloneDataRoleAction.setEnabled(true);
// Add selection changed listener so if a Physical Source model is selected, the applicable menu actions are
// retrieved via the SourceHandler extension point and interface.
// This allows changing Translator and JNDI names via existing deployed objects on Teiid Instances that are
// connected in the user's workspace.
dataRolesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged( final SelectionChangedEvent event ) {
}
});
Composite buttonPanel = WidgetFactory.createPanel(parent, SWT.NONE, 1, 5);
GridLayoutFactory.fillDefaults().numColumns(5).applyTo(buttonPanel);
GridDataFactory.fillDefaults().grab(true, false).applyTo(buttonPanel);
newButton = new Button(buttonPanel, SWT.PUSH);
newButton.setImage(VdbUiPlugin.singleton.getImage(Images.ADD_ROLE));
// newButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.ADD));
GridDataFactory.fillDefaults().applyTo(newButton);
newButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleNew();
}
});
editButton = new Button(buttonPanel, SWT.PUSH);
editButton.setImage(VdbUiPlugin.singleton.getImage(Images.EDIT_ROLE));
// editButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.EDIT));
GridDataFactory.fillDefaults().applyTo(newButton);
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleEdit((DataRole)(((IStructuredSelection)dataRolesViewer.getSelection()).getFirstElement()));
}
});
deleteButton = new Button(buttonPanel, SWT.PUSH);
deleteButton.setImage(VdbUiPlugin.singleton.getImage(Images.REMOVE_ROLE));
// deleteButton.setText(UILabelUtil.getLabel(UiLabelConstants.LABEL_IDS.DELETE));
GridDataFactory.fillDefaults().applyTo(newButton);
deleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (ConfirmationDialog.confirm(CONFIRM_REMOVE_MESSAGE)) {
DataRole role = (DataRole)(((IStructuredSelection)dataRolesViewer.getSelection()).getFirstElement());
vdbEditor.getVdb().removeDataRole(role.getName());
refresh();
}
}
});
}
/**
* convenience method to refresh the viewer
*/
public void refresh() {
dataRolesViewer.refresh();
}
void handleNew() {
ContainerImpl tempContainer = null;
try {
Collection<File> modelFiles = vdbEditor.getVdb().getModelFiles();
tempContainer = (ContainerImpl)ModelerCore.createContainer("tempVdbModelContainer"); //$NON-NLS-1$
ModelEditorImpl.setContainer(tempContainer);
for (File modelFile : modelFiles) {
boolean isVisible = true;
Resource r = tempContainer.getResource(URI.createFileURI(modelFile.getPath()), true);
if (isVisible && ModelUtil.isModelFile(r) && !ModelUtil.isXsdFile(r)) {
EObject firstEObj = r.getContents().get(0);
ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(firstEObj);
String mmURI = ma.getPrimaryMetamodelUri();
if (RelationalPackage.eNS_URI.equalsIgnoreCase(mmURI)
|| XmlDocumentPackage.eNS_URI.equalsIgnoreCase(mmURI)
|| WEB_SERVICES_VIEW_MODEL_URI.equalsIgnoreCase(mmURI)
|| ModelIdentifier.FUNCTION_MODEL_URI.equals(mmURI)) {
// DO NOTHING. This leaves the resource in the temp container
} else {
tempContainer.getResources().remove(r);
}
} else {
tempContainer.getResources().remove(r);
}
}
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
ModelEditorImpl.setContainer(null);
}
final IWorkbenchWindow iww = VdbUiPlugin.singleton.getCurrentWorkbenchWindow();
Set<String> roleNames = VdbUtil.getDataRoleNames(vdbEditor.getVdb(), null);
final DataRoleWizard wizard = new DataRoleWizard(tempContainer, null, vdbEditor.getVdb().getAllowedLanguages(), roleNames);
wizard.init(iww.getWorkbench(), new StructuredSelection(vdbEditor.getVdb().getModelEntries()));
final WizardDialog dialog = new WizardDialog(wizard.getShell(), wizard);
final int rc = dialog.open();
if (rc == Window.OK) {
// Get the Data Policy
DataRole dp = wizard.getFinalDataRole();
if (dp != null) {
vdbEditor.getVdb().addDataRole(dp);
refresh();
}
}
}
void handleEdit(DataRole dataRole) {
if (dataRole == null) {
return;
}
ContainerImpl tempContainer = null;
try {
Collection<File> modelFiles = vdbEditor.getVdb().getModelFiles();
tempContainer = (ContainerImpl)ModelerCore.createContainer("tempVdbModelContainer"); //$NON-NLS-1$
ModelEditorImpl.setContainer(tempContainer);
for (File modelFile : modelFiles) {
boolean isVisible = true;
Resource r = tempContainer.getResource(URI.createFileURI(modelFile.getPath()), true);
if (isVisible && ModelUtil.isModelFile(r) && !ModelUtil.isXsdFile(r)) {
EObject firstEObj = r.getContents().get(0);
ModelAnnotation ma = ModelerCore.getModelEditor().getModelAnnotation(firstEObj);
String mmURI = ma.getPrimaryMetamodelUri();
if (RelationalPackage.eNS_URI.equalsIgnoreCase(mmURI)
|| XmlDocumentPackage.eNS_URI.equalsIgnoreCase(mmURI)
|| WEB_SERVICES_VIEW_MODEL_URI.equalsIgnoreCase(mmURI)
|| ModelIdentifier.FUNCTION_MODEL_URI.equals(mmURI)) {
// DO NOTHING. This leaves the resource in the temp container
} else {
tempContainer.getResources().remove(r);
}
} else {
tempContainer.getResources().remove(r);
}
}
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
ModelEditorImpl.setContainer(null);
}
final IWorkbenchWindow iww = VdbUiPlugin.singleton.getCurrentWorkbenchWindow();
Set<String> roleNames = VdbUtil.getDataRoleNames(vdbEditor.getVdb(), dataRole.getName());
final DataRoleWizard wizard = new DataRoleWizard(tempContainer, dataRole, vdbEditor.getVdb().getAllowedLanguages(), roleNames);
wizard.init(iww.getWorkbench(), new StructuredSelection(vdbEditor.getVdb().getModelEntries()));
final WizardDialog dialog = new WizardDialog(wizard.getShell(), wizard);
final int rc = dialog.open();
if (rc == Window.OK) {
// Get the Data Policy
DataRole dp = wizard.getFinalDataRole();
// 1) Check to see if the name changed.. if changed, we need to remove the OLD
if (dp != null) {
if( vdbEditor.getVdb().getDataRoles().contains(dataRole) ) {
dataRole.setName(dp.getName());
dataRole.setAnyAuthenticated(dp.isAnyAuthenticated());
dataRole.setAllowCreateTempTables(dp.isAllowCreateTempTables());
dataRole.setGrantAll(dp.isGrantAll());
dataRole.setDescription(dp.getDescription());
dataRole.setPermissions(dp.getPermissions());
Permission systemPerm = dataRole.getPermission(DataRole.SYS_ADMIN_TABLE_TARGET);
if( systemPerm != null ) {
dataRole.addPermission(new Permission(DataRole.SYS_ADMIN_TABLE_TARGET,
false, systemPerm.getCRUDValue(Type.READ).booleanValue(), false,
false, systemPerm.getCRUDValue(Type.EXECUTE).booleanValue(), false));
}
if (!dataRole.isAnyAuthenticated() && !dp.getRoleNames().isEmpty()) {
dataRole.setRoleNames(dp.getRoleNames());
}
vdbEditor.getVdb().setModified(this, Event.DATA_POLICY_REMOVED, dataRole, dataRole);
refresh();
}
}
}
}
class DataRoleLabelProvider extends ColumnLabelProvider {
private final int columnNumber;
public DataRoleLabelProvider(int columnNumber) {
this.columnNumber = columnNumber;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if( element instanceof DataRole ) {
switch (this.columnNumber) {
case 0: {
return ((DataRole)element).getName();
}
case 1: {
return ((DataRole)element).getDescription();
}
}
}
return StringConstants.EMPTY_STRING;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object)
*/
@Override
public String getToolTipText(Object element) {
switch (this.columnNumber) {
case 0: {
return "Tooltip 1"; //getString("columnNameColumnTooltip"); //$NON-NLS-1$
}
case 1: {
return "Tooltip 2"; //getString("datatypeColumnTooltip"); //$NON-NLS-1$
}
}
return "unknown tooltip"; //$NON-NLS-1$
}
@Override
public Image getImage(Object element) {
if( this.columnNumber == 0 ) {
return VdbUiPlugin.singleton.getImage(VdbUiConstants.Images.DATA_ROLE);
}
return null;
}
}
class DataRolesContentProvider implements ITreeContentProvider {
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
@Override
public Object[] getElements(Object inputElement) {
if( inputElement instanceof Vdb ) {
Collection<DataRole> roles = ((Vdb)inputElement).getDataRoles();
return roles.toArray();
}
return new Object[0];
}
@Override
public Object[] getChildren(Object parentElement) {
// TODO Auto-generated method stub
return new Object[0];
}
@Override
public Object getParent(Object element) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean hasChildren(Object element) {
if( element instanceof Vdb ) {
Collection<DataRole> roles = ((Vdb)element).getDataRoles();
return !roles.isEmpty();
}
return false;
}
}
}