/* * 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.dynamic.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.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchWindow; 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.DataRole; import org.teiid.designer.roles.ui.wizard.DataRoleWizard; import org.teiid.designer.ui.common.table.DefaultTableProvider; import org.teiid.designer.ui.common.table.TableAndToolBar; import org.teiid.designer.ui.common.table.TextColumnProvider; import org.teiid.designer.ui.common.widget.ButtonProvider; import org.teiid.designer.ui.viewsupport.ModelIdentifier; import org.teiid.designer.vdb.VdbUtil; import org.teiid.designer.vdb.ui.VdbUiConstants; import org.teiid.designer.vdb.ui.VdbUiConstants.Images; import org.teiid.designer.vdb.ui.VdbUiPlugin; import org.teiid.designer.vdb.ui.editor.ConfirmationDialog; import org.teiid.designer.vdb.ui.editor.VdbEditor; /** * */ 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; TableAndToolBar<DataRole> dataRolesGroup; Action cloneDataRoleAction; DataRole selectedDataRole; /** * @param parent * @param editor */ public DataRolesPanel(Composite parent, VdbEditor editor) { super(); this.vdbEditor = editor; createPanel(parent); } @SuppressWarnings({ "unchecked", "rawtypes" }) private void createPanel(Composite parent) { final String DATA_POLICY_COLUMN_NAME = i18n("dataPolicyName"); //$NON-NLS-1$ final ButtonProvider editProvider = new ButtonProvider() { /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getImageDescriptor() */ @Override public ImageDescriptor getImageDescriptor() { return VdbUiPlugin.singleton.getImageDescriptor(Images.EDIT_ROLE); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getText() */ @Override public String getText() { return null; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getToolTip() */ @Override public String getToolTip() { return i18n("editRoleToolTip"); //$NON-NLS-1$ } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public boolean isEnabled( IStructuredSelection selection ) { return (selection.size() == 1); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public void selected( IStructuredSelection selection ) { DataRole dataRole = (DataRole)selection.getFirstElement(); 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); } DataRole dataPolicy = new DataRole(dataRole.getName(), dataRole.getDescription(), dataRole.isAnyAuthenticated(), dataRole.isAllowCreateTempTables(), dataRole.isGrantAll(), dataRole.getRoleNames(), dataRole.getPermissions()); final IWorkbenchWindow iww = VdbUiPlugin.singleton.getCurrentWorkbenchWindow(); Set<String> roleNames = VdbUtil.getDataRoleNames(vdbEditor.getVdb(), dataRole.getName()); final DataRoleWizard wizard = new DataRoleWizard(tempContainer, dataPolicy, 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().removeDataRole(dataRole.getName()); vdbEditor.getVdb().addDataRole(dp); } } } }; dataRolesGroup = new TableAndToolBar(parent, 1, new DefaultTableProvider<DataRole>() { /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.DefaultTableProvider#doubleClicked(java.lang.Object) */ @Override public void doubleClicked( DataRole element ) { editProvider.selected(new StructuredSelection(element)); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.TableProvider#getElements() */ @Override public DataRole[] getElements() { final Collection<DataRole> entries = vdbEditor.getVdb().getDataRoles(); return entries.toArray(new DataRole[entries.size()]); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.DefaultTableProvider#isDoubleClickSupported() */ @Override public boolean isDoubleClickSupported() { return true; } }, new TextColumnProvider<DataRole>() { /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.DefaultColumnProvider#getImage(java.lang.Object) */ @Override public Image getImage( final DataRole element ) { return null; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.ColumnProvider#getName() */ @Override public String getName() { return DATA_POLICY_COLUMN_NAME; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.ColumnProvider#getImage() */ @Override public Image getImage() { return null; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.ColumnProvider#getValue(java.lang.Object) */ @Override public String getValue( final DataRole element ) { return element.getName(); } }, new TextColumnProvider<DataRole>() { /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.ColumnProvider#getName() */ @Override public String getName() { return DESCRIPTION_COLUMN_NAME; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.ColumnProvider#getImage() */ @Override public Image getImage() { return null; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.ColumnProvider#getValue(java.lang.Object) */ @Override public String getValue( final DataRole element ) { return element.getDescription(); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.DefaultColumnProvider#isEditable(java.lang.Object) */ @Override public boolean isEditable( final DataRole element ) { return true; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.table.DefaultColumnProvider#setValue(java.lang.Object, java.lang.Object) */ @Override public void setValue( final DataRole element, final String value ) { element.setDescription(value); } }); ButtonProvider newProvider = new ButtonProvider() { /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getImageDescriptor() */ @Override public ImageDescriptor getImageDescriptor() { return VdbUiPlugin.singleton.getImageDescriptor(Images.ADD_ROLE); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getText() */ @Override public String getText() { return null; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getToolTip() */ @Override public String getToolTip() { return i18n("addRoleToolTip"); //$NON-NLS-1$ } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public boolean isEnabled( IStructuredSelection selection ) { return true; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public void selected( IStructuredSelection selection ) { 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); } } } }; dataRolesGroup.add(newProvider); dataRolesGroup.add(editProvider); ButtonProvider removeProvider = new ButtonProvider() { /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getImageDescriptor() */ @Override public ImageDescriptor getImageDescriptor() { return VdbUiPlugin.singleton.getImageDescriptor(Images.REMOVE_ROLE); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getText() */ @Override public String getText() { return null; } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#getToolTip() */ @Override public String getToolTip() { return i18n("removeRoleToolTip"); //$NON-NLS-1$ } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#isEnabled(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public boolean isEnabled( IStructuredSelection selection ) { return !selection.isEmpty(); } /** * {@inheritDoc} * * @see org.teiid.designer.ui.common.widget.ButtonProvider#selected(org.eclipse.jface.viewers.IStructuredSelection) */ @Override public void selected( IStructuredSelection selection ) { if (ConfirmationDialog.confirm(CONFIRM_REMOVE_MESSAGE)) { for (final Object element : selection.toList()) { if (element instanceof DataRole) { vdbEditor.getVdb().removeDataRole(((DataRole)element).getName()); } } } } }; dataRolesGroup.add(removeProvider); dataRolesGroup.setInput(vdbEditor.getVdb()); 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); dataRolesGroup.getTable().getViewer().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. final TableViewer dataRolesViewer = dataRolesGroup.getTable().getViewer(); final MenuManager dataRolesMenuManager = new MenuManager(); dataRolesViewer.getControl().setMenu(dataRolesMenuManager.createContextMenu(parent)); dataRolesViewer.addSelectionChangedListener(new ISelectionChangedListener() { /** * {@inheritDoc} * * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ @Override public void selectionChanged( final SelectionChangedEvent event ) { dataRolesMenuManager.removeAll(); IStructuredSelection sel = (IStructuredSelection)dataRolesViewer.getSelection(); if (sel.size() == 1) { selectedDataRole = (DataRole)sel.getFirstElement(); dataRolesMenuManager.add(cloneDataRoleAction); } } }); } /** * convenience method to refresh the viewer */ public void refresh() { dataRolesGroup.getTable().getViewer().refresh(); } }