// ============================================================================ // // Copyright (C) 2006-2012 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.repository.ui.actions; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Display; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.ui.runtime.image.EImage; import org.talend.commons.ui.runtime.image.ImageProvider; import org.talend.core.model.metadata.builder.connection.AbstractMetadataObject; import org.talend.core.model.metadata.builder.connection.CDCConnection; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.connection.MetadataTable; import org.talend.core.model.metadata.builder.connection.SubscriberTable; import org.talend.core.model.metadata.builder.connection.impl.SalesforceModuleUnitImpl; import org.talend.core.model.properties.ConnectionItem; import org.talend.core.model.properties.DatabaseConnectionItem; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.SalesforceSchemaConnectionItem; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.model.repository.RepositoryManager; import org.talend.core.repository.i18n.Messages; import org.talend.core.repository.model.ISubRepositoryObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.repository.model.repositoryObject.MetadataTableRepositoryObject; import org.talend.core.repository.utils.AbstractResourceChangesService; import org.talend.core.repository.utils.TDQServiceRegister; import org.talend.cwm.helper.SubItemHelper; import org.talend.repository.model.ERepositoryStatus; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IRepositoryNode.ENodeType; import org.talend.repository.model.IRepositoryNode.EProperties; import org.talend.repository.model.RepositoryConstants; import org.talend.repository.model.RepositoryNode; /** * DOC tguiu class global comment. Detailled comment <br/> * * $Id: DeleteTableAction.java 77219 2012-01-24 01:14:15Z mhirt $ * */ public class DeleteTableAction extends AContextualAction { private static final String DELETE_LOGICAL_TITLE = Messages.getString("DeleteAction.action.logicalTitle"); //$NON-NLS-1$ private static final String DELETE_FOREVER_TITLE = Messages.getString("DeleteAction.action.foreverTitle"); //$NON-NLS-1$ private static final String DELETE_LOGICAL_TOOLTIP = Messages.getString("DeleteAction.action.logicalToolTipText"); //$NON-NLS-1$ private static final String DELETE_FOREVER_TOOLTIP = Messages.getString("DeleteAction.action.logicalToolTipText"); //$NON-NLS-1$ public DeleteTableAction() { super(); this.setImageDescriptor(ImageProvider.getImageDesc(EImage.DELETE_ICON)); } @Override protected void doRun() { ISelection selection = getSelection(); Boolean confirm = null; // used to store the database connection object that are used to notify the sqlBuilder. final List<IRepositoryViewObject> connections = new ArrayList<IRepositoryViewObject>(); final Set<ERepositoryObjectType> types = new HashSet<ERepositoryObjectType>(); Map<String, Item> procItems = new HashMap<String, Item>(); for (Object obj : ((IStructuredSelection) selection).toArray()) { if (obj instanceof RepositoryNode) { RepositoryNode node = (RepositoryNode) obj; ERepositoryObjectType nodeType = (ERepositoryObjectType) node.getProperties(EProperties.CONTENT_TYPE); if (node.getType() == ENodeType.REPOSITORY_ELEMENT && nodeType.isSubItem()) { Connection connection = null; ERepositoryObjectType parentNodeType = (ERepositoryObjectType) node.getParent().getProperties( EProperties.CONTENT_TYPE); if (parentNodeType == null) { parentNodeType = node.getParent().getParent().getObjectType(); // for db connection } if (parentNodeType != null) { types.add(parentNodeType); } ConnectionItem item = (ConnectionItem) node.getObject().getProperty().getItem(); connection = (item).getConnection(); ISubRepositoryObject subRepositoryObject = (ISubRepositoryObject) node.getObject(); // this one is the old metadataObject AbstractMetadataObject abstractMetadataObject = subRepositoryObject.getAbstractMetadataObject(); if (abstractMetadataObject instanceof SubscriberTable) { return; } // for (Object table : connection.getTables()) { // if (table instanceof AbstractMetadataObject) { // AbstractMetadataObject metadataTable = (AbstractMetadataObject) table; // if (metadataTable.getLabel() != null // && metadataTable.getLabel().equals(abstractMetadataObject.getLabel())) { // abstractMetadataObject = metadataTable; // } // } // } if (abstractMetadataObject == null) { return; } boolean isSave = true; if (item instanceof ConnectionItem) { AbstractResourceChangesService resChangeService = TDQServiceRegister.getInstance() .getResourceChangeService(AbstractResourceChangesService.class); if (resChangeService != null) { isSave = resChangeService.handleResourceChange(((ConnectionItem) item).getConnection()); } } if (isSave) { // String sfm = null; String sf = null; EObject eContainer = abstractMetadataObject.eContainer(); if (eContainer != null && eContainer instanceof SalesforceModuleUnitImpl) { sfm = ((SalesforceModuleUnitImpl) eContainer).getModuleName(); sf = abstractMetadataObject.getLabel(); } if (SubItemHelper.isDeleted(abstractMetadataObject) && isSave) { if (confirm == null) { String title = Messages.getString("DeleteAction.dialog.title"); //$NON-NLS-1$ String message = Messages.getString("DeleteAction.dialog.message1") + "\n" //$NON-NLS-1$ //$NON-NLS-2$ + Messages.getString("DeleteAction.dialog.message2"); //$NON-NLS-1$ confirm = (MessageDialog.openQuestion(Display.getCurrent().getActiveShell(), title, message)); } if (confirm) { subRepositoryObject.removeFromParent(); } } // bug 20963 else if (item instanceof SalesforceSchemaConnectionItem && parentNodeType.getType() != null && parentNodeType.getType().equals("METADATA_SALESFORCE_MODULE") && sfm != null && sf != null && sfm.equals(sf)) { // Nothing to do } else { SubItemHelper.setDeleted(abstractMetadataObject, true); } final String id = item.getProperty().getId(); Item tmpItem = procItems.get(id); if (tmpItem == null) { procItems.put(id, item); } connections.add(node.getObject()); } } } } try { IProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); for (String id : procItems.keySet()) { Item item = procItems.get(id); factory.save(item); } } catch (PersistenceException e) { ExceptionHandler.process(e); } Display.getCurrent().syncExec(new Runnable() { public void run() { RepositoryManager.refreshDeletedNode(types); } }); notifySQLBuilder(connections); // IViewPart viewPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView( // RepositoryView.VIEW_ID); // IRepositoryView repositoryView = (IRepositoryView) viewPart; // // Find Metadata node // RepositoryNode recycleBinNode = repositoryView.getRoot().getChildren().get(8); // // // Force focus to the repository View ans erase the current user selection // viewPart.setFocus(); // repositoryView.getViewSite().getSelectionProvider().setSelection(null); // repositoryView.expand(recycleBinNode, true); } /* * (non-Javadoc) * * @see org.talend.repository.ui.actions.ITreeContextualAction#init(org.eclipse.jface.viewers.TreeViewer, * org.eclipse.jface.viewers.IStructuredSelection) */ public void init(TreeViewer viewer, IStructuredSelection selection) { boolean canWork = false; setText(null); for (Object o : (selection).toArray()) { RepositoryNode node = (RepositoryNode) o; switch (node.getType()) { case STABLE_SYSTEM_FOLDER: case SYSTEM_FOLDER: case SIMPLE_FOLDER: canWork = false; break; case REPOSITORY_ELEMENT: IRepositoryViewObject repObj = node.getObject(); ERepositoryObjectType nodeType = (ERepositoryObjectType) node.getProperties(EProperties.CONTENT_TYPE); if (!nodeType.isSubItem()) { canWork = false; break; } if (node.getObjectType() == ERepositoryObjectType.METADATA_CON_TABLE) { canWork = true; IRepositoryViewObject repositoryObject = node.getObject(); if (repositoryObject != null) { Item item2 = repositoryObject.getProperty().getItem(); if (item2 instanceof DatabaseConnectionItem) { DatabaseConnectionItem item = (DatabaseConnectionItem) repositoryObject.getProperty().getItem(); DatabaseConnection connection = (DatabaseConnection) item.getConnection(); CDCConnection cdcConns = connection.getCdcConns(); if (cdcConns != null) { if (repositoryObject instanceof MetadataTableRepositoryObject) { MetadataTable table = ((MetadataTableRepositoryObject) repositoryObject).getTable(); String tableType = table.getTableType(); boolean is = RepositoryConstants.TABLE.equals(tableType); canWork = is && !table.isAttachedCDC(); } } } else if (item2 instanceof SalesforceSchemaConnectionItem) { IRepositoryViewObject parent = node.getParent().getObject(); if (parent != null && parent.getLabel().equals(repositoryObject.getLabel())) { canWork = false; } } } } else if (node.getObjectType() == ERepositoryObjectType.METADATA_CON_CDC) { canWork = false; } else if (node.getObjectType() == ERepositoryObjectType.METADATA_CON_QUERY) { canWork = true; } if (!canWork) { break; } IProxyRepositoryFactory repFactory = ProxyRepositoryFactory.getInstance(); boolean isLocked = false; boolean isDeleted = false; isLocked = !repFactory.isPotentiallyEditable(repObj); isDeleted = (repFactory.getStatus(node.getObject()) == ERepositoryStatus.DELETED); if (isLocked) { canWork = false; } else if (isDeleted) { if (getText() == null || DELETE_FOREVER_TITLE.equals(getText())) { this.setText(DELETE_FOREVER_TITLE); this.setToolTipText(DELETE_FOREVER_TOOLTIP); } else { canWork = false; } } else { setText(DELETE_LOGICAL_TITLE); setToolTipText(DELETE_LOGICAL_TOOLTIP); } break; default: // Nothing to do break; } if (!canWork) { break; } } setEnabled(canWork); } }