// ============================================================================ // // Copyright (C) 2006-2016 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 com.amalto.workbench.editors; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.rmi.ServerException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.xml.ws.WebServiceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.IFormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.talend.mdm.commmon.metadata.ComplexTypeMetadata; import org.talend.mdm.commmon.metadata.FieldMetadata; import org.talend.mdm.commmon.metadata.MetadataRepository; import org.talend.mdm.commmon.metadata.SimpleTypeFieldMetadata; import org.talend.mdm.commmon.metadata.TypeMetadata; import org.talend.mdm.commmon.util.core.EUUIDCustomType; import com.amalto.workbench.availablemodel.AvailableModelUtil; import com.amalto.workbench.availablemodel.IAvailableModel; import com.amalto.workbench.compare.CompareHeadInfo; import com.amalto.workbench.compare.CompareManager; import com.amalto.workbench.dialogs.DOMViewDialog; import com.amalto.workbench.dialogs.datacontainer.AutoIncrementHelper; import com.amalto.workbench.dialogs.datacontainer.DataContainerDOMViewDialog; import com.amalto.workbench.dialogs.datacontainer.UpdateAutoIncrementDialog; import com.amalto.workbench.editors.dialog.ConfirmFireEventMessageDialog; import com.amalto.workbench.editors.dialog.ConfirmFireEventWithInputDialog; import com.amalto.workbench.exadapter.ExAdapterManager; import com.amalto.workbench.i18n.Messages; import com.amalto.workbench.image.EImage; import com.amalto.workbench.image.ImageCache; import com.amalto.workbench.models.IXObjectModelListener; import com.amalto.workbench.models.TreeObject; import com.amalto.workbench.models.TreeParent; import com.amalto.workbench.providers.XObjectBrowserInput; import com.amalto.workbench.providers.XtentisServerObjectsRetriever; import com.amalto.workbench.utils.LineItem; import com.amalto.workbench.utils.UserInfo; import com.amalto.workbench.utils.Util; import com.amalto.workbench.utils.XtentisException; import com.amalto.workbench.webservices.TMDMService; import com.amalto.workbench.webservices.WSBoolean; import com.amalto.workbench.webservices.WSDataClusterPK; import com.amalto.workbench.webservices.WSDataModel; import com.amalto.workbench.webservices.WSDataModelPK; import com.amalto.workbench.webservices.WSDeleteItemWithReport; import com.amalto.workbench.webservices.WSExistsItem; import com.amalto.workbench.webservices.WSGetConceptsInDataCluster; import com.amalto.workbench.webservices.WSGetDataModel; import com.amalto.workbench.webservices.WSGetItem; import com.amalto.workbench.webservices.WSIsItemModifiedByOther; import com.amalto.workbench.webservices.WSItem; import com.amalto.workbench.webservices.WSItemPK; import com.amalto.workbench.webservices.WSPutItem; import com.amalto.workbench.webservices.WSPutItemWithReport; import com.amalto.workbench.webservices.WSRegexDataModelPKs; import com.amalto.workbench.webservices.WSRouteItemV2; import com.amalto.workbench.webservices.WSStringArray; public class DataClusterBrowserMainPage extends AMainPage implements IXObjectModelListener { private static final Log log = LogFactory.getLog(DataClusterBrowserMainPage.class); protected static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");//$NON-NLS-1$ protected TableViewer resultsViewer; protected ListViewer wcListViewer; private DataClusterComposite clusterComp; protected IDataClusterBrowserMainPageExAdapter exAdapter; private boolean isMaster = true; public DataClusterBrowserMainPage(FormEditor editor) { super(editor, DataClusterBrowserMainPage.class.getName(), Messages.bind( Messages.DataClusterBrowserMainPage_masterDataContainerBrowserTitle, ((XObjectBrowserInput) editor.getEditorInput()).getName())); // listen to events ((XObjectBrowserInput) editor.getEditorInput()).addListener(this); initAdapter(); } private void initAdapter() { exAdapter = ExAdapterManager.getAdapter(this, IDataClusterBrowserMainPageExAdapter.class); } @Override protected void createFormContent(IManagedForm managedForm) { try { // sets the title managedForm.getForm().setText(this.getTitle()); // get the body Composite composite = managedForm.getForm().getBody(); // composite.setLayout(new GridLayout(9, false)); composite.setLayout(new GridLayout()); clusterComp = new DataClusterComposite(composite, SWT.NONE, getXObject(), isMaster(), this, getSite()); clusterComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); resultsViewer = clusterComp.getResultsViewer(); hookDoubleClick(); hookKeyboard(); hookContextMenu(); hookToolBarItem(); managedForm.reflow(true); // nothng will show on the form if not called } catch (Exception e) { log.error(e.getMessage(), e); } }// createFormContent @Override protected void createCharacteristicsContent(FormToolkit toolkit, Composite charComposite) { // Everything is implemented in createFormContent } public void doSearch() { clusterComp.doSearch(); } @Override protected void refreshData() { clusterComp.refreshData(); } protected LineItem[] getResults(boolean showResultInfo) { return clusterComp.getResults(showResultInfo); } @Override protected void commit() { try { } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(this.getSite().getShell(), Messages.DataClusterBrowserMainPage_18, Messages.bind(Messages.DataClusterBrowserMainPage_19, e.getLocalizedMessage())); } } @Override protected void createActions() { } protected void hookDoubleClick() { resultsViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { resultsViewer.setSelection(event.getSelection()); try { editItem(); } catch (Exception e) { MessageDialog.openError(getShell(), Messages._Error, Messages.bind(Messages.DataClusterBrowserMainPage_10, e .getClass().getName(), e.getLocalizedMessage())); } } }); } protected void editItem() { new EditItemAction(getShell(), resultsViewer).run(); } protected void hookKeyboard() { resultsViewer.getControl().addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { if (e.keyCode == SWT.DEL) { new PhysicalDeleteItemsAction(getShell(), resultsViewer).run(); } } }); } protected void hookContextMenu() { MenuManager menuMgr = new MenuManager(); menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { // ViewBrowserMainPage.this.fillContextMenu(manager); manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS)); manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new NewItemAction(getShell(), resultsViewer)); IStructuredSelection selection = ((IStructuredSelection) resultsViewer.getSelection()); if (exAdapter != null) { exAdapter.menuAboutToShow(manager, IWorkbenchActionConstants.MB_ADDITIONS, resultsViewer, selection, getShell(), getXObject()); } if (selection.size() == 1) { manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new EditItemAction(getShell(), resultsViewer)); } if (selection.size() > 0) { manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new PhysicalDeleteItemsAction(getShell(), resultsViewer)); manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new LogicalDeleteItemsAction(getShell(), resultsViewer)); manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new SubmitItemsAction(getShell(), resultsViewer)); } // compare item with each other if (selection.size() == 2) { manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new CompareItemWithEachOtherAction(getShell(), resultsViewer)); } // available models if (selection.size() == 1) { java.util.List<IAvailableModel> availablemodels = AvailableModelUtil.getAvailableModels(); for (IAvailableModel model : availablemodels) { model.menuAboutToShow(manager, DataClusterBrowserMainPage.this); } } } }); Menu menu = menuMgr.createContextMenu(resultsViewer.getControl()); resultsViewer.getControl().setMenu(menu); getSite().registerContextMenu(menuMgr, resultsViewer); } protected void hookToolBarItem() { FormEditor editor = getEditor(); if (editor instanceof XObjectBrowser) { XObjectBrowser xobjectEditor = (XObjectBrowser) editor; // remove refresh action xobjectEditor.getToolBar().getToolBarManager().removeAll(); // ActionContributionItem manageAutoIncrementItem = new ActionContributionItem(new ManageAutoIncrementAction()); manageAutoIncrementItem.setMode(ActionContributionItem.MODE_FORCE_TEXT); xobjectEditor.getToolBar().addActions(manageAutoIncrementItem); } } protected void fillContextMenu(IMenuManager manager) { } public TableViewer getResultsViewer() { return resultsViewer; } /********************************* * IXObjectModelListener interface */ public void handleEvent(int type, TreeObject parent, TreeObject child) { refreshData(); } protected DataContainerDOMViewDialog getDomViewDialog(final TMDMService service, final WSItem wsItem, String xml, ArrayList<String> dataModels) throws Exception { DataContainerDOMViewDialog d = new DataContainerDOMViewDialog(getShell(), service, Util.parse(xml), dataModels, DOMViewDialog.TREE_VIEWER, wsItem.getDataModelName(), isMaster()); return d; } /* * Empty string for 'Master' type data cluster,'#STAGING' for 'staging' type data cluster */ protected String getPkAddition() { return ""; //$NON-NLS-1$ } protected Shell getShell() { return getSite().getShell(); } public boolean isMaster() { return isMaster; } public void setMaster(boolean isMaster) { this.isMaster = isMaster; } class ManageAutoIncrementAction extends Action { public ManageAutoIncrementAction() { setImageDescriptor(ImageCache.getImage(EImage.ADD_OBJ.getPath())); setText(Messages.DataClusterBrowserMainPage_ManageAutoIncrement); } @Override public void run() { UpdateAutoIncrementKeyCommand updateCommand = new UpdateAutoIncrementKeyCommand(getShell(), resultsViewer); updateCommand.execute(); } } class UpdateAutoIncrementKeyCommand { protected Shell shell = null; protected Viewer viewer; private MetadataRepository repository; private String schema; public UpdateAutoIncrementKeyCommand(Shell shell, Viewer viewer) { this.shell = shell; this.viewer = viewer; } public void execute() { try { TreeObject xObject = getXObject(); String dataContainer = getDataContainer(xObject); final TMDMService service = Util.getMDMService(xObject); List<String> entityToRevisions = getAllEntityInDataContainer(service, dataContainer); String conent = getAutoIncrementRecord(service); Map<String, String> entityToAutoIncrementValues = getEntityAutoIncrementValues(conent, dataContainer, entityToRevisions); if (entityToAutoIncrementValues == null || entityToAutoIncrementValues.isEmpty()) { MessageDialog.openInformation(shell, Messages.Warnning, Messages.DataClusterBrowserMainPage_noAutoIncrementToManage); return; } UpdateAutoIncrementDialog dialog = new UpdateAutoIncrementDialog(shell, entityToAutoIncrementValues); if (dialog.open() == IDialogConstants.OK_ID) { String updatedContent = updateAutoIncrement(dataContainer, conent, entityToRevisions, dialog.getResults()); saveAutoIncrement(service, updatedContent); } } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(getSite().getShell(), Messages._Error, e.getLocalizedMessage()); } } private String getDataContainer(TreeObject xObject) { String dataContainer = xObject.getName(); FormEditor editor = getEditor(); if (editor instanceof XObjectBrowser) { XObjectBrowser xobjectEditor = (XObjectBrowser) editor; IFormPage activeMainPage = xobjectEditor.getActivePageInstance(); if (activeMainPage instanceof DataClusterBrowserMainPage) { DataClusterBrowserMainPage mainPage = (DataClusterBrowserMainPage) activeMainPage; String pkAddition = mainPage.getPkAddition(); dataContainer = dataContainer + pkAddition; } } return dataContainer; } private String getAutoIncrementRecord(final TMDMService service) { String record = emptyRecord(); WSBoolean existsItem = service.existsItem(new WSExistsItem(new WSItemPK("AutoIncrement", //$NON-NLS-1$ Arrays.asList(new String[] { "AutoIncrement" }), new WSDataClusterPK("CONF")))); //$NON-NLS-1$ //$NON-NLS-2$ if (existsItem.isTrue()) { WSItem wsItem = service.getItem(new WSGetItem(new WSItemPK("AutoIncrement", //$NON-NLS-1$ Arrays.asList(new String[] { "AutoIncrement" }), new WSDataClusterPK("CONF")))); //$NON-NLS-1$ if (wsItem != null) { record = wsItem.getContent(); } } return record; } private Map<String, String> getEntityAutoIncrementValues(String content, String dataContainer, List<String> entityToRevisions) { Iterator<String> iterator = entityToRevisions.iterator(); Map<String, String> entityToKeys = new HashMap<String, String>(); while (iterator.hasNext()) { String entity = iterator.next(); String fieldName = getAutoIncrementKeyFieldNames(entity); if (fieldName != null) { String key = formKey(dataContainer, entity, fieldName); entityToKeys.put(entity, key); } } Map<String, String> entityValues = null; try { entityValues = AutoIncrementHelper.getCurrentValue(content, entityToKeys); } catch (Exception e) { log.error(e.getMessage(), e); } return entityValues; } private String updateAutoIncrement(String cluster, String content, List<String> entityToRevisions, Map<String, String> results) throws Exception { Map<String, String> keyvalues = new HashMap<String, String>(); for (String concept : results.keySet()) { String fieldName = getAutoIncrementKeyFieldNames(concept); String key = formKey(cluster, concept, fieldName); String value = results.get(concept); if (value.isEmpty()) { value = "0"; //$NON-NLS-1$ } keyvalues.put(key, value); } String updatedValue = AutoIncrementHelper.updateValue(content, keyvalues); return updatedValue; } private String formKey(String cluster, String concept, String fieldName) { return cluster + "." + concept + "." + fieldName; //$NON-NLS-1$//$NON-NLS-2$ } private List<String> getAllEntityInDataContainer(final TMDMService service, String dataContainer) { List<String> entityToRevisions = new ArrayList<String>(); WSStringArray conceptArray = service.getConceptsInDataCluster(new WSGetConceptsInDataCluster(new WSDataClusterPK( dataContainer))); if (conceptArray != null) { List<String> concepts = conceptArray.getStrings(); for (String concept : concepts) { entityToRevisions.add(concept); } } return entityToRevisions; } private String getAutoIncrementKeyFieldNames(String concept) { String fieldName = null; ComplexTypeMetadata complexType = getRepository().getComplexType(concept); if (complexType != null) { Collection<FieldMetadata> keyFields = complexType.getKeyFields(); for (FieldMetadata fieldMeta : keyFields) { SimpleTypeFieldMetadata simpleFieldMeta = (SimpleTypeFieldMetadata) fieldMeta; TypeMetadata type = simpleFieldMeta.getType(); if (type.getName().equals(EUUIDCustomType.AUTO_INCREMENT.getName())) { fieldName = simpleFieldMeta.getName(); } } } return fieldName; } private void saveAutoIncrement(TMDMService service, String content) { String pk = "CONF"; //$NON-NLS-1$ WSPutItem putItem = new WSPutItem(false, new WSDataClusterPK(pk), new WSDataModelPK(pk), content); service.putItem(putItem); } private MetadataRepository getRepository() { if (getSchema() == null) { throw new IllegalStateException("Schema has not been set"); //$NON-NLS-1$ } if (repository == null) { repository = new MetadataRepository(); try { repository.load(new ByteArrayInputStream(getSchema().getBytes("UTF-8"))); //$NON-NLS-1$ } catch (UnsupportedEncodingException e) { // ignore it } } return repository; } private String getSchema() { if (schema == null) { TreeObject xObject = getXObject(); String dataContainer = xObject.getName(); TMDMService service = null; try { service = Util.getMDMService(xObject); } catch (XtentisException e) { } if (service != null) { WSDataModel dataModel = service.getDataModel(new WSGetDataModel(new WSDataModelPK(dataContainer))); schema = dataModel.getXsdSchema(); } } return schema; } private String emptyRecord() { String emptyRecord = "<AutoIncrement>\n <id>AutoIncrement</id>\n</AutoIncrement>\n"; //$NON-NLS-1$ return emptyRecord; } } public class EditItemAction extends Action { protected Shell shell = null; protected Viewer viewer; public EditItemAction(Shell shell, Viewer viewer) { super(); this.shell = shell; this.viewer = viewer; setImageDescriptor(ImageCache.getImage("icons/edit_obj.gif"));//$NON-NLS-1$ setText(Messages.DataClusterBrowserMainPage_29); setToolTipText(Messages.DataClusterBrowserMainPage_30); } @Override public void run() { try { super.run(); final TMDMService service = Util.getMDMService(getXObject()); IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); LineItem li = (LineItem) selection.getFirstElement(); if (li == null) { return; } String pk = ((WSDataClusterPK) getXObject().getWsKey()).getPk(); final WSDataClusterPK dataClusterPk = new WSDataClusterPK(pk + getPkAddition()); final WSItem wsItem = service.getItem(new WSGetItem(new WSItemPK(li.getConcept().trim(), Arrays.asList(li .getIds()), dataClusterPk))); String xml = Util.formatXsdSource(wsItem.getContent()); List<WSDataModelPK> dmPKs = service.getDataModelPKs(new WSRegexDataModelPKs("*")).getWsDataModelPKs();//$NON-NLS-1$ ArrayList<String> dataModels = new ArrayList<String>(); if (dmPKs != null) { for (WSDataModelPK mpk : dmPKs) { if (!"XMLSCHEMA---".equals(mpk.getPk())) { //$NON-NLS-1$ dataModels.add(mpk.getPk()); } } } final DataContainerDOMViewDialog d = getDomViewDialog(service, wsItem, xml, dataModels); d.addListener(new Listener() { public void handleEvent(Event event) { if (event.button == DOMViewDialog.BUTTON_SAVE) { // attempt to save try { // check the item is modified by others? boolean isModified = service.isItemModifiedByOther(new WSIsItemModifiedByOther(wsItem)).isTrue(); WSPutItem putItem = new WSPutItem(false, dataClusterPk, "".equals(d //$NON-NLS-1$ .getDataModelName()) ? null : new WSDataModelPK(d.getDataModelName()), d.getXML()); WSPutItemWithReport itemWithReport = new WSPutItemWithReport(d.isBeforeVerification(), "genericUI", putItem);//$NON-NLS-1$ if (isModified) { if (MessageDialog.openConfirm(shell, Messages.DataClusterBrowserMainPage_31, Messages.DataClusterBrowserMainPage_32)) { if (d.isTriggerProcess()) { service.putItemWithReport(itemWithReport); } else { service.putItem(putItem); } } } else { if (d.isTriggerProcess()) { service.putItemWithReport(itemWithReport); } else { service.putItem(putItem); } } } catch (Exception e) { log.error(e.getMessage(), e); if (!Util.handleConnectionException(shell, e, Messages.DataClusterBrowserMainPage_33)) { MessageDialog.openError(shell, Messages.DataClusterBrowserMainPage_33, Messages.bind(Messages.DataClusterBrowserMainPage_34, e.getLocalizedMessage())); } return; } }// if d.close(); }// handleEvent }); d.setBlockOnOpen(true); d.open(); } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(shell, Messages._Error, Messages.bind(Messages.DataClusterBrowserMainPage_36, e.getLocalizedMessage())); } } @Override public void runWithEvent(Event event) { super.runWithEvent(event); } } /*************************************************************** * Compare item with each other ***************************************************************/ public class CompareItemWithEachOtherAction extends Action { protected Shell shell = null; protected Viewer viewer; public CompareItemWithEachOtherAction(Shell shell, Viewer viewer) { super(); this.shell = shell; this.viewer = viewer; setImageDescriptor(ImageCache.getImage(EImage.SYNCH.getPath())); setText(Messages.DataClusterBrowserMainPage_43); setToolTipText(Messages.DataClusterBrowserMainPage_44); } @Override public void run() { try { super.run(); IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); int selectSize = selection.size(); if (selectSize != 2) { MessageDialog.openWarning(shell, Messages.Warning, Messages.DataClusterBrowserMainPage_46); return; } @SuppressWarnings("unchecked") List<LineItem> liList = selection.toList(); LineItem leftLineItem = liList.get(0); LineItem rightLineItem = liList.get(1); String pk = ((WSDataClusterPK) getXObject().getWsKey()).getPk(); WSDataClusterPK dataClusterPk = new WSDataClusterPK(pk + getPkAddition()); // left WSItemPK leftWSItemPK = new WSItemPK(leftLineItem.getConcept().trim(), Arrays.asList(leftLineItem.getIds()), dataClusterPk); WSItem leftWSItem = Util.getMDMService(getXObject()).getItem(new WSGetItem(leftWSItemPK)); String leftItemXmlContent = leftWSItem.getContent(); // right WSItemPK rightWSItemPK = new WSItemPK(rightLineItem.getConcept().trim(), Arrays.asList(rightLineItem.getIds()), dataClusterPk); WSItem rightWSItem = Util.getMDMService(getXObject()).getItem(new WSGetItem(rightWSItemPK)); String rightItemXmlContent = rightWSItem.getContent(); if (leftItemXmlContent != null && rightItemXmlContent != null) { CompareHeadInfo compareHeadInfo = new CompareHeadInfo(getXObject()); compareHeadInfo.setItem(true); compareHeadInfo.setDataModelName(leftWSItem.getDataModelName()); CompareManager.getInstance().compareTwoStream(leftItemXmlContent, rightItemXmlContent, true, compareHeadInfo, leftWSItemPK.getConceptName() + "." + Util.joinStrings(leftWSItemPK.getIds(), "."),//$NON-NLS-1$//$NON-NLS-2$ rightWSItemPK.getConceptName() + "." + Util.joinStrings(rightWSItemPK.getIds(), "."), true, false);//$NON-NLS-1$//$NON-NLS-2$ } } catch (Exception e) { log.error(e.getMessage(), e); if (!Util.handleConnectionException(shell, e, null)) { MessageDialog.openError(shell, Messages._Error, Messages.bind(Messages.DataClusterBrowserMainPage_48, e.getLocalizedMessage())); } } } } /*************************************************************** * Delete Items Action * * @author bgrieder * ***************************************************************/ class LogicalDeleteItemsAction extends Action { protected Shell shell = null; protected Viewer viewer; public LogicalDeleteItemsAction(Shell shell, Viewer viewer) { super(); this.shell = shell; this.viewer = viewer; setImageDescriptor(ImageCache.getImage("icons/delete_obj.gif"));//$NON-NLS-1$ IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); if (selection.size() == 1) { setText(Messages.DataClusterBrowserMainPage_60); } else { setText(Messages.bind(Messages.DataClusterBrowserMainPage_61, selection.size())); } setToolTipText(Messages.bind(Messages.DataClusterBrowserMainPage_62, (selection.size() > 1 ? Messages.DataClusterBrowserMainPage_108 : Messages.DataClusterBrowserMainPage_63))); } @Override public void run() { try { super.run(); // retrieve the list of items IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); @SuppressWarnings("unchecked") List<LineItem> lineItems = selection.toList(); if (lineItems.size() == 0) { return; } ConfirmFireEventWithInputDialog id = new ConfirmFireEventWithInputDialog(this.shell, Messages.DataClusterBrowserMainPage_64, Messages.bind(Messages.DataClusterBrowserMainPage_65, lineItems.size()), Messages.DataClusterBrowserMainPage_67, new IInputValidator() { public String isValid(String newText) { if ((newText == null) || !newText.matches("^\\/.*$")) { //$NON-NLS-1$ return Messages.DataClusterBrowserMainPage_68; } return null; }; }); id.setBlockOnOpen(true); int ret = id.open(); if (ret == Dialog.CANCEL) { return; } // Instantiate the Monitor with actual deletes LogicalDeleteItemsWithProgress diwp = new LogicalDeleteItemsWithProgress(getXObject(), lineItems, id.getValue(), id.isFireEvent(), id.isInvokeBeforeProcess(), id.getSource(), this.shell); // run new ProgressMonitorDialog(this.shell).run(false, // fork true, // cancelable diwp); // refresh the search resultsViewer.setInput(getResults(false)); } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(shell, Messages._Error, Messages.bind(Messages.DataClusterBrowserMainPage_70, e.getLocalizedMessage())); } } @Override public void runWithEvent(Event event) { super.runWithEvent(event); } // Progress Monitor that implements the actual delete class LogicalDeleteItemsWithProgress implements IRunnableWithProgress { TreeObject xObject; Collection<LineItem> lineItems; String partPath; Shell parentShell; private boolean fireEvent; private boolean invokeBeforeProcess; private String source; public LogicalDeleteItemsWithProgress(TreeObject object, Collection<LineItem> lineItems, String partPath, boolean fireEvent, boolean invokeBeforeProcess, String source, Shell shell) { super(); this.xObject = object; this.lineItems = lineItems; this.partPath = partPath; this.fireEvent = fireEvent; this.invokeBeforeProcess = invokeBeforeProcess; this.source = source; this.parentShell = shell; } public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { monitor.beginTask(Messages.DataClusterBrowserMainPage_71, lineItems.size()); TMDMService service = Util.getMDMService(xObject); int i = 0; for (LineItem lineItem : lineItems) { String itemID = ((WSDataClusterPK) xObject.getWsKey()).getPk() + "." + lineItem.getConcept() + "."//$NON-NLS-1$//$NON-NLS-2$ + Util.joinStrings(lineItem.getIds(), ".");//$NON-NLS-1$ monitor.subTask(Messages.bind(Messages.DataClusterBrowserMainPage_72, (i++), itemID)); if (monitor.isCanceled()) { MessageDialog.openWarning(this.parentShell, Messages.DataClusterBrowserMainPage_74, Messages.bind(Messages.DataClusterBrowserMainPage_75, i)); return; } WSItemPK itempk = new WSItemPK(lineItem.getConcept(), Arrays.asList(lineItem.getIds()), (WSDataClusterPK) xObject.getWsKey()); if (source.isEmpty()) { source = "genericUI"; //$NON-NLS-1$ } service.deleteItemWithReport(new WSDeleteItemWithReport(invokeBeforeProcess, "LOGIC_DELETE", false, fireEvent, source, partPath, getXObject().getUsername(), itempk));//$NON-NLS-1$ // port.dropItem(new WSDropItem(new WSItemPK((WSDataClusterPK) xObject.getWSKey(), // lineItem.getConcept(), // lineItem.getIds()), partPath)); monitor.worked(1); }// for monitor.done(); } catch (Exception e) { log.error(e.getMessage(), e); if (!Util.handleConnectionException(shell, e, null)) { MessageDialog.openError(shell, Messages.DataClusterBrowserMainPage_78, Messages.bind(Messages.DataClusterBrowserMainPage_79, e.getLocalizedMessage())); } }// try }// run }// class DeleteItemsWithProgress }// class DeletItemsAction class PhysicalDeleteItemsAction extends Action { protected Shell shell = null; protected Viewer viewer; public PhysicalDeleteItemsAction(Shell shell, Viewer viewer) { super(); this.shell = shell; this.viewer = viewer; setImageDescriptor(ImageCache.getImage("icons/delete_obj.gif"));//$NON-NLS-1$ IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); if (selection.size() == 1) { setText(Messages.DataClusterBrowserMainPage_80); } else { setText(Messages.bind(Messages.DataClusterBrowserMainPage_81, selection.size())); } setToolTipText(Messages.bind(Messages.DataClusterBrowserMainPage_82, (selection.size() > 1 ? Messages.DataClusterBrowserMainPage_108 : Messages.DataClusterBrowserMainPage_83))); } @Override public void run() { try { super.run(); // retrieve the list of items IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); @SuppressWarnings("unchecked") List<LineItem> lineItems = selection.toList(); if (lineItems.size() == 0) { return; } ConfirmFireEventMessageDialog confirmDlg = ConfirmFireEventMessageDialog.createConfirmDialog(shell, Messages.DataClusterBrowserMainPage_64, Messages.bind(Messages.DataClusterBrowserMainPage_85, lineItems.size())); if (confirmDlg.open() != Dialog.OK) { return; } // Instantiate the Monitor with actual deletes PhysicalDeleteItemsWithProgress diwp = new PhysicalDeleteItemsWithProgress(getXObject(), lineItems, confirmDlg.isFireEvent(), confirmDlg.isInvokeBeforeProcess(), confirmDlg.getSource(), this.shell); // run new ProgressMonitorDialog(this.shell).run(false, // fork true, // cancelable diwp); // refresh the search resultsViewer.setInput(getResults(false)); } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(shell, Messages._Error, Messages.bind(Messages.DataClusterBrowserMainPage_88, e.getLocalizedMessage())); } } @Override public void runWithEvent(Event event) { super.runWithEvent(event); } // Progress Monitor that implements the actual delete class PhysicalDeleteItemsWithProgress implements IRunnableWithProgress { TreeObject xObject; Collection<LineItem> lineItems; Shell parentShell; private boolean fireEvent; private boolean invokeBeforeProcess; private String source; public PhysicalDeleteItemsWithProgress(TreeObject object, Collection<LineItem> lineItems, boolean fireEvent, boolean invokeBeforeProcess, String source, Shell shell) { super(); this.xObject = object; this.lineItems = lineItems; this.fireEvent = fireEvent; this.invokeBeforeProcess = invokeBeforeProcess; this.source = source; this.parentShell = shell; } private List<LineItem> orderItems(TMDMService service) { WSDataClusterPK pk = (WSDataClusterPK) getXObject().getWsKey(); WSGetConceptsInDataCluster param = new WSGetConceptsInDataCluster(pk); List<LineItem> orderItems = new LinkedList<LineItem>(); try { WSStringArray concepts = service.getConceptsInDataCluster(param); if (concepts == null || concepts.getStrings() == null || concepts.getStrings().isEmpty()) { orderItems.addAll(lineItems); } else { Map<String, List<LineItem>> orderMap = new LinkedHashMap<String, List<LineItem>>(); for (String concept : concepts.getStrings()) { orderMap.put(concept, new LinkedList<LineItem>()); } // order List<LineItem> otherItems = new LinkedList<LineItem>(); for (LineItem lineItem : lineItems) { String concept = lineItem.getConcept(); if (orderMap.containsKey(concept)) { List<LineItem> items = orderMap.get(concept); items.add(lineItem); } else { otherItems.add(lineItem); } } // generate for (List<LineItem> items : orderMap.values()) { orderItems.addAll(0, items); } orderItems.addAll(otherItems); } } catch (WebServiceException e) { log.error(e.getMessage(), e); } return orderItems; } public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { try { monitor.beginTask(Messages.DataClusterBrowserMainPage_89, lineItems.size()); TMDMService service = Util.getMDMService(getXObject()); List<LineItem> orderItems = orderItems(service); int i = 0; for (LineItem lineItem : orderItems) { String itemID = ((WSDataClusterPK) getXObject().getWsKey()).getPk() + "." + lineItem.getConcept() + "."//$NON-NLS-1$//$NON-NLS-2$ + Util.joinStrings(lineItem.getIds(), ".");//$NON-NLS-1$ monitor.subTask(Messages.bind(Messages.DataClusterBrowserMainPage_90, (i++), itemID)); if (monitor.isCanceled()) { MessageDialog.openWarning(this.parentShell, Messages.DataClusterBrowserMainPage_92, Messages.bind(Messages.DataClusterBrowserMainPage_93, i)); return; } WSItemPK itempk = new WSItemPK(lineItem.getConcept(), Arrays.asList(lineItem.getIds()), (WSDataClusterPK) getXObject().getWsKey()); if (source.isEmpty()) { source = "genericUI"; //$NON-NLS-1$ } service.deleteItemWithReport(new WSDeleteItemWithReport(invokeBeforeProcess, "PHYSICAL_DELETE", false, fireEvent, source, null, getXObject().getUsername(), itempk));//$NON-NLS-1$ monitor.worked(1); }// for monitor.done(); } catch (Exception e) { String constraintMsg = getConstraintViolationExceptionMsg(e); if (constraintMsg != null) { MessageDialog.openError(shell, Messages.DataClusterBrowserMainPage_96, Messages.bind(Messages.DataClusterBrowserMainPage_referedRecord, constraintMsg)); } else { log.error(e.getMessage(), e); if (!Util.handleConnectionException(shell, e, null)) { MessageDialog.openError(shell, Messages.DataClusterBrowserMainPage_96, Messages.bind(Messages.DataClusterBrowserMainPage_97, e.getLocalizedMessage())); } } }// try }// run private String getConstraintViolationExceptionMsg(Exception ex) { if (ex instanceof ServerException) { String message = ex.getMessage().trim(); if (message.indexOf("org.hibernate.exception.ConstraintViolationException") > 0) { //$NON-NLS-1$ String prefix = ": com.amalto.core.util.XtentisException:"; //$NON-NLS-1$ int begin = message.indexOf(prefix); if (begin > 0) { return message.substring(0, begin); } } } return null; } }// class DeleteItemsWithProgress }// class DeletItemsAction /*************************************************************** * New Item Action * * @author bgrieder * ***************************************************************/ public class NewItemAction extends Action { protected Shell shell = null; protected Viewer viewer; public NewItemAction(Shell shell, Viewer viewer) { super(); this.shell = shell; this.viewer = viewer; setImageDescriptor(ImageCache.getImage("icons/add_obj.gif")); //$NON-NLS-1$ setText(Messages.DataClusterBrowserMainPage_98); setToolTipText(Messages.DataClusterBrowserMainPage_99); } @Override public void run() { try { TMDMService service = Util.getMDMService(getXObject()); String dataClusterPk = ((WSDataClusterPK) getXObject().getWsKey()).getPk(); boolean created = NewItemHandler.getNewInstance().createItemRecord(service, shell, new WSDataClusterPK(dataClusterPk + getPkAddition()), isMaster()); if (created) { doSearch(); } } catch (XtentisException e) { log.error(e.getMessage(), e); } } @Override public void runWithEvent(Event event) { super.runWithEvent(event); } } /*************************************************************** * SubmitItems Action * * @author bgrieder * ***************************************************************/ class SubmitItemsAction extends Action { protected Shell shell = null; protected Viewer viewer; public SubmitItemsAction(Shell shell, Viewer viewer) { super(); this.shell = shell; this.viewer = viewer; setImageDescriptor(ImageCache.getImage("icons/execute.gif"));//$NON-NLS-1$ IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); if (selection.size() == 1) { setText(Messages.DataClusterBrowserMainPage_104); } else { setText(Messages.bind(Messages.DataClusterBrowserMainPage_105, selection.size())); } setToolTipText(Messages.bind(Messages.DataClusterBrowserMainPage_107, (selection.size() > 1 ? Messages.DataClusterBrowserMainPage_108 : "")));//$NON-NLS-1$ } @Override public void run() { try { super.run(); // retrieve the list of items IStructuredSelection selection = ((IStructuredSelection) viewer.getSelection()); @SuppressWarnings("unchecked") List<LineItem> lineItems = selection.toList(); if (lineItems.size() == 0) { return; } if (!MessageDialog.openConfirm(this.shell, Messages.DataClusterBrowserMainPage_110, Messages.bind( Messages.DataClusterBrowserMainPage_111, (lineItems.size() > 1 ? lineItems.size() + " " : "")))) { //$NON-NLS-1$ //$NON-NLS-2$ return; } // Instantiate the Monitor with actual deletes SubmitItemsWithProgress diwp = new SubmitItemsWithProgress(getXObject(), lineItems, this.shell); // run new ProgressMonitorDialog(this.shell).run(false, // fork true, // cancelable diwp); } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(shell, Messages._Error, Messages.bind(Messages.DataClusterBrowserMainPage_116, e.getLocalizedMessage())); } } @Override public void runWithEvent(Event event) { super.runWithEvent(event); } // Progress Monitor that implements the actual delete class SubmitItemsWithProgress implements IRunnableWithProgress { TreeObject xObject; Collection<LineItem> lineItems; Shell parentShell; public SubmitItemsWithProgress(TreeObject object, Collection<LineItem> lineItems, Shell shell) { super(); this.xObject = object; this.lineItems = lineItems; this.parentShell = shell; } public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask(Messages.DataClusterBrowserMainPage_117, lineItems.size()); TMDMService service = null; try { service = Util.getMDMService(getXObject()); } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(shell, Messages.DataClusterBrowserMainPage_118, Messages.bind(Messages.DataClusterBrowserMainPage_119, e.getLocalizedMessage())); }// try if (service != null) { int i = 0; for (LineItem lineItem : lineItems) { String itemID = ((WSDataClusterPK) getXObject().getWsKey()).getPk() + "." + lineItem.getConcept() + "." //$NON-NLS-1$ //$NON-NLS-2$ + Util.joinStrings(lineItem.getIds(), Messages.DataClusterBrowserMainPage_120); monitor.subTask(Messages.bind(Messages.DataClusterBrowserMainPage_121, (i++), itemID)); if (monitor.isCanceled()) { MessageDialog.openWarning(this.parentShell, Messages.DataClusterBrowserMainPage_123, Messages.bind(Messages.DataClusterBrowserMainPage_124, i)); return; } try { service.routeItemV2(new WSRouteItemV2(new WSItemPK(lineItem.getConcept(), Arrays.asList(lineItem .getIds()), (WSDataClusterPK) getXObject().getWsKey()))); } catch (Exception e) { log.error(e.getMessage(), e); if (!Util.handleConnectionException(shell, e, null)) { MessageDialog.openError(shell, Messages.DataClusterBrowserMainPage_127, Messages.bind(Messages.DataClusterBrowserMainPage_128, itemID)); } }// try monitor.worked(1); }// for } monitor.done(); }// run }// class DeleteItemsWithProgress }// class DeletItemsAction /*************************************************************** * Table Label Provider * * @author bgrieder * ***************************************************************/ class ClusterTableLabelProvider implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { LineItem li = (LineItem) element; switch (columnIndex) { case 0: return sdf.format(new Date(li.getTime())); case 1: return li.getConcept(); case 2: return Util.joinStrings(li.getIds(), "."); //$NON-NLS-1$ case 3: return li.getTaskId(); default: return "???????"; //$NON-NLS-1$ } } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } /*************************************************************** * Table Sorter * * @author bgrieder * ***************************************************************/ class TableSorter extends ViewerSorter { int column = 0; boolean asc = true; public TableSorter(int column, boolean ascending) { super(); this.column = column; this.asc = ascending; } @Override public int compare(Viewer viewer, Object e1, Object e2) { LineItem li1 = (LineItem) e1; LineItem li2 = (LineItem) e2; int res = 0; switch (column) { case 0: res = (int) (li1.getTime() - li2.getTime()); break; case 1: res = li1.getConcept().compareToIgnoreCase(li2.getConcept()); break; case 2: res = Util .joinStrings(li1.getIds(), ".").compareToIgnoreCase(Util.joinStrings(li2.getIds(), Messages.DataClusterBrowserMainPage_130)); //$NON-NLS-1$ break; default: res = 0; } if (asc) { return res; } else { return -res; } } } // Modified by hbhong,to fix bug 21784 @Override public Object getAdapter(Class adapter) { if (adapter == TreeParent.class) { TreeParent treeParent = Util.getServerTreeParent(getXObject()); if (treeParent == null || treeParent.getChildren().length == 0) { TreeParent serverRoot = getRealTreeParent(); if (serverRoot != null) { treeParent = serverRoot; } } return treeParent; } return super.getAdapter(adapter); } // The ending| bug:21784 private TreeParent getRealTreeParent() { TreeParent treeParent = null; TreeObject xObject = getXObject(); if (xObject != null) { TreeParent serverRoot = xObject.getServerRoot(); UserInfo user = serverRoot.getUser(); String serverName = serverRoot.getName(); String password = user.getPassword(); String url = user.getServerUrl(); String username = user.getUsername(); final XtentisServerObjectsRetriever retriever = new XtentisServerObjectsRetriever(serverName, url, username, password); retriever.setRetriveWSObject(true); try { retriever.run(new NullProgressMonitor()); treeParent = retriever.getServerRoot();// get the real server root as the treeParent } catch (InvocationTargetException e) { log.error(e.getMessage(), e); } catch (InterruptedException e) { log.error(e.getMessage(), e); } } return treeParent; } }