// ============================================================================
//
// 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.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.xml.ws.WebServiceException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.action.Action;
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.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPartSite;
import org.talend.core.GlobalServiceRegister;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.image.ImageCache;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.models.TreeParent;
import com.amalto.workbench.service.ILegendServerDefService;
import com.amalto.workbench.utils.LineItem;
import com.amalto.workbench.utils.MDMServerDef;
import com.amalto.workbench.utils.Util;
import com.amalto.workbench.utils.WidgetUtils;
import com.amalto.workbench.utils.XtentisException;
import com.amalto.workbench.webservices.TMDMService;
import com.amalto.workbench.webservices.WSDataCluster;
import com.amalto.workbench.webservices.WSDataClusterPK;
import com.amalto.workbench.webservices.WSGetDataCluster;
import com.amalto.workbench.webservices.WSGetItem;
import com.amalto.workbench.webservices.WSItem;
import com.amalto.workbench.webservices.WSItemPK;
import com.amalto.workbench.webservices.WSRegexDataClusterPKs;
/**
* created by liusongbo on 2013-1-24
*
*/
public class DataClusterDialog extends Dialog {
private static final Log log = LogFactory.getLog(DataClusterDialog.class);
private TreeObject model;
private MDMServerDef oldServerDef = null;
private Text textViewer;
private ComboViewer serverComboViewer;
private ComboViewer containerComboViewer;
private DataClusterComposite clusterComposite;
private String recordContent;
private LineItem selected;
private IWorkbenchPartSite site;
private Color defaultColor;
private Color greyColor = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
private List<TreeObject> dataContainers;
private List<MDMServerDef> allServerDefs;
private boolean hasdefaultServer = false;
private String okLabel;
private String cancelLabel;
private SelectionListener additionSelectionListener;
public DataClusterDialog(Shell parentShell, TreeObject treeObject, IWorkbenchPartSite site) {
super(parentShell);
this.model = treeObject;
this.site = site;
setShellStyle(getShellStyle() | SWT.RESIZE);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setSize(600, 550);
newShell.setText(Messages.DataClusterDialog_0);
}
@Override
protected Control createDialogArea(Composite parent) {
//
Composite firstLine = createFirstLine(parent);
firstLine.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
Composite lastPortion = createLastPortion(parent);
lastPortion.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
hookService();
hookContextMenu();
init();
return parent;
}
@Override
protected void initializeBounds() {
super.initializeBounds();
Point location = getInitialLocation(getShell().getSize());
getShell().setLocation(location.x, location.y);
}
private Composite createFirstLine(Composite parent) {
Composite firstLine = new Composite(parent, SWT.NONE);
firstLine.setLayout(new GridLayout(4, false));
Label serverLabel = new Label(firstLine, SWT.NONE);
serverLabel.setText(Messages.DataClusterDialog_1);
serverLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
serverComboViewer = new ComboViewer(firstLine, SWT.DROP_DOWN | SWT.READ_ONLY);
Combo combo = serverComboViewer.getCombo();
GridData data = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
data.widthHint = 200;
combo.setLayoutData(data);
serverComboViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
MDMServerDef serverDef = (MDMServerDef) element;
return serverDef.getName() + " (" + serverDef.getHost() + ")"; //$NON-NLS-1$ //$NON-NLS-2$;
}
});
serverComboViewer.setContentProvider(new ArrayContentProvider());
serverComboViewer.setInput(getAllServerDefs());
Label containerLabel = new Label(firstLine, SWT.NONE);
containerLabel.setText(Messages.DataClusterDialog_2);
containerLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 1, 1));
containerComboViewer = new ComboViewer(firstLine, SWT.DROP_DOWN | SWT.READ_ONLY);
Combo containerCombo = containerComboViewer.getCombo();
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1);
layoutData.widthHint = 200;
containerCombo.setLayoutData(layoutData);
containerComboViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
TreeObject treeObj = (TreeObject) element;
return treeObj.getName();
}
});
containerComboViewer.setContentProvider(new ArrayContentProvider());
containerComboViewer.setInput(new TreeObject[0]);
containerComboViewer.getCombo().setEnabled(false);
return firstLine;
}
private List<MDMServerDef> getAllServerDefs() {
if (allServerDefs == null) {
if (GlobalServiceRegister.getDefault().isServiceRegistered(ILegendServerDefService.class)) {
ILegendServerDefService serverDefService = (ILegendServerDefService) GlobalServiceRegister.getDefault()
.getService(ILegendServerDefService.class);
allServerDefs = serverDefService.getLegendServerDefs();
}
}
return allServerDefs;
}
private Composite createLastPortion(Composite parent) {
Group group = new Group(parent, SWT.NONE);
group.setText(Messages.DataClusterDialog_3);
group.setLayout(new FillLayout());
SashForm splitter = new SashForm(group, SWT.VERTICAL);
splitter.setSashWidth(8);
clusterComposite = new DataClusterComposite(splitter, SWT.NONE, model, true, site);
clusterComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
clusterComposite.setEnabled(false);
Composite contentComp = new Composite(splitter, SWT.NONE);
contentComp.setLayout(new GridLayout());
Label recordContentLabel = new Label(contentComp, SWT.NONE);
recordContentLabel.setText(Messages.DataClusterDialog_4);
textViewer = new Text(contentComp, SWT.BORDER | SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);
textViewer.setEditable(false);
textViewer.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
textViewer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
splitter.setWeights(new int[] { 2, 1 });
defaultColor = clusterComposite.getBackground();
changeWidgetColor(greyColor);
return group;
}
private void hookService() {
serverComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
refreshDataContainerCombo();
MDMServerDef serverDef = getSelectedMdmServerDef();
if (serverDef != oldServerDef) {
oldServerDef = serverDef;
clusterComposite.changeToServer(serverDef);
changeWidgetColor(greyColor);
}
selectDefaultContainer();
}
});
containerComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection ssel = (IStructuredSelection) containerComboViewer.getSelection();
TreeObject dataContainer = (TreeObject) ssel.getFirstElement();
boolean refreshed = clusterComposite.changeToDataContainer(dataContainer);
if (refreshed) {
changeWidgetColor(defaultColor);
} else {
changeWidgetColor(greyColor);
containerComboViewer.setInput(dataContainers);
}
model = clusterComposite.getDataContainer();
}
});
TableViewer resultsViewer = clusterComposite.getResultsViewer();
resultsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection structedSelection = (IStructuredSelection) event.getSelection();
selected = (LineItem) structedSelection.getFirstElement();
showInTextWidget(selected);
}
});
}
private void hookContextMenu() {
MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
manager.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, new NewItemAction(site.getShell()));
}
});
Menu menu = menuMgr.createContextMenu(clusterComposite.getResultsViewer().getControl());
clusterComposite.getResultsViewer().getControl().setMenu(menu);
}
private void init() {
if (hasdefaultServer) {
selectDefaultServer();
selectDefaultContainer();
}
}
private void selectDefaultServer() {
for (MDMServerDef serverDef : getAllServerDefs()) {
if (serverDef.getName().equals(oldServerDef.getName())) {
serverComboViewer.setSelection(new StructuredSelection(serverDef), true);
break;
}
}
}
private void selectDefaultContainer() {
for (TreeObject treeObj : dataContainers) {
if (treeObj.getName().equals("UpdateReport")) { //$NON-NLS-1$
containerComboViewer.setSelection(new StructuredSelection(treeObj));
break;
}
}
}
private void changeWidgetColor(Color color) {
WidgetUtils.changeWidgetColor(clusterComposite, color, new boolean[] { true, false });
if (!textViewer.getEditable()) {
textViewer.setBackground(color);
}
}
private void showInTextWidget(LineItem lineItem) {
if (lineItem == null) {
textViewer.setText(""); //$NON-NLS-1$
recordContent = ""; //$NON-NLS-1$
return;
}
try {
final TMDMService service = Util.getMDMService(model);
final WSItem wsItem = service.getItem(new WSGetItem(new WSItemPK(lineItem.getConcept().trim(), Arrays.asList(lineItem
.getIds()), (WSDataClusterPK) model.getWsKey())));
recordContent = Util.formatXsdSource(wsItem.getContent());
textViewer.setText(recordContent);
} catch (WebServiceException e) {
log.error(e.getMessage(), e);
} catch (XtentisException e) {
log.error(e.getMessage(), e);
MessageDialog.openError(getShell(), Messages._Error,
Messages.bind(Messages.DataClusterBrowserMainPage_36, e.getLocalizedMessage()));
}
}
private boolean refreshDataContainerCombo() {
dataContainers = new ArrayList<TreeObject>();
boolean sucessed = getAllDataContainers(dataContainers);
containerComboViewer.setInput(dataContainers);
containerComboViewer.getCombo().setEnabled(sucessed);
return sucessed;
}
private boolean getAllDataContainers(List<TreeObject> dataContainers) {
MDMServerDef serverDef = getSelectedMdmServerDef();
String username = serverDef.getUser();
String password = serverDef.getPasswd();
String serverName = serverDef.getName();
String endpointaddress = serverDef.getUrl();
boolean canConnect = checkConnection(endpointaddress, username, password);
if (!canConnect) {
MessageDialog.openError(site.getShell(), Messages.DataClusterDialog_7, Messages.DataClusterDialog_8);
return false;
}
List<WSDataClusterPK> xdcPKs = null;
try {
TMDMService service = Util.getMDMService(new URL(endpointaddress), username, password);
TreeParent serverRoot = new TreeParent(serverName, null, TreeObject._SERVER_, endpointaddress, username
+ ":" + (password == null ? "" : password));//$NON-NLS-1$//$NON-NLS-2$
xdcPKs = service.getDataClusterPKs(new WSRegexDataClusterPKs("*")).getWsDataClusterPKs();//$NON-NLS-1$
for (WSDataClusterPK pk : xdcPKs) {
String name = pk.getPk();
if (!("CACHE".equals(name))) { //$NON-NLS-1$
WSDataCluster wsObject = null;
boolean retriveWSObject = false;
try {
if (retriveWSObject) {
wsObject = service.getDataCluster(new WSGetDataCluster(pk));
}
TreeObject obj = new TreeObject(name, serverRoot, TreeObject.DATA_CLUSTER, pk, wsObject);
dataContainers.add(obj);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
}
return true;
}
private boolean checkConnection(String endpointaddress, String username, String password) {
ILegendServerDefService serverDefService = (ILegendServerDefService) GlobalServiceRegister.getDefault().getService(
ILegendServerDefService.class);
return serverDefService.checkServerDefConnection(endpointaddress, username, password);
}
private MDMServerDef getSelectedMdmServerDef() {
IStructuredSelection structuredSelection = (IStructuredSelection) serverComboViewer.getSelection();
return (MDMServerDef) structuredSelection.getFirstElement();
}
public void setDefaultServerDef(MDMServerDef defaultServerDef) {
oldServerDef = defaultServerDef;
hasdefaultServer = true;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
Button okBtn = createButton(parent, Dialog.OK, okLabel != null ? okLabel : IDialogConstants.OK_LABEL, false);
createButton(parent, Dialog.CANCEL, cancelLabel != null ? cancelLabel : IDialogConstants.CANCEL_LABEL, false);
if (additionSelectionListener != null) {
okBtn.addSelectionListener(additionSelectionListener);
}
}
@Override
protected void okPressed() {
if (additionSelectionListener == null) {
recordContent = textViewer.getText().trim();
super.okPressed();
}
}
public void setOkLabel(String okLabel) {
this.okLabel = okLabel;
if (getButton(Dialog.OK) != null) {
getButton(Dialog.OK).setText(okLabel);
}
}
public void setCancelLabel(String cancelLabel) {
this.cancelLabel = cancelLabel;
if (getButton(Dialog.CANCEL) != null) {
getButton(Dialog.CANCEL).setText(cancelLabel);
}
}
public void setSelectionListener(SelectionListener listener) {
this.additionSelectionListener = listener;
}
public Text getText() {
return textViewer;
}
public MDMServerDef getServerDef() {
return oldServerDef;
}
public String getDataContainer() {
return model.getName();
}
public String getConcept() {
if (selected != null) {
return selected.getConcept();
}
return null;
}
public String getRecordContent() {
return recordContent;
}
public String[] getRecordIds() {
if (selected != null) {
return selected.getIds();
}
return null;
}
class NewItemAction extends Action {
private Shell shell;
public NewItemAction(Shell shell) {
this.shell = shell;
setImageDescriptor(ImageCache.getImage("icons/add_obj.gif")); //$NON-NLS-1$
setText(Messages.DataClusterBrowserMainPage_98);
setToolTipText(Messages.DataClusterBrowserMainPage_99);
}
@Override
public void run() {
try {
final TMDMService service = Util.getMDMService(new URL(oldServerDef.getUrl()), oldServerDef.getUser(),
oldServerDef.getPasswd());
boolean created = NewItemHandler.getNewInstance().createItemRecord(service, shell,
new WSDataClusterPK(getDataContainer()), true);
if (created) {
clusterComposite.doSearch();
}
} catch (MalformedURLException e) {
log.error(e.getMessage(), e);
} catch (XtentisException e) {
log.error(e.getMessage(), e);
}
}
}
}