// ============================================================================ // // 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.dialogs; import java.util.ArrayList; import java.util.Arrays; 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 java.util.regex.Pattern; import javax.xml.ws.WebServiceException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDIdentityConstraintDefinition; import org.eclipse.xsd.XSDXPathDefinition; import com.amalto.workbench.editors.DataModelMainPage; import com.amalto.workbench.exadapter.ExAdapterManager; import com.amalto.workbench.i18n.Messages; import com.amalto.workbench.models.Line; import com.amalto.workbench.models.TreeObject; import com.amalto.workbench.models.TreeParent; import com.amalto.workbench.providers.XObjectEditorInput; import com.amalto.workbench.utils.Util; import com.amalto.workbench.utils.XSDAnnotationsStructure; import com.amalto.workbench.webservices.TMDMService; import com.amalto.workbench.webservices.WSBoolean; import com.amalto.workbench.webservices.WSDeleteView; import com.amalto.workbench.webservices.WSGetView; import com.amalto.workbench.webservices.WSPutView; import com.amalto.workbench.webservices.WSView; import com.amalto.workbench.webservices.WSViewPK; import com.amalto.workbench.widgets.ComplexTableViewer; import com.amalto.workbench.widgets.ComplexTableViewerColumn; public class AddBrowseItemsWizard extends Wizard { private static Log log = LogFactory.getLog(AddBrowseItemsWizard.class); protected DataModelMainPage page; private TMDMService service; protected List<XSDElementDeclaration> declList = null; private Map<String, List<Line>> browseItemToRoles = new HashMap<String, List<Line>>(); protected static String INSTANCE_NAME = "Browse Item View";//$NON-NLS-1$ public static String BROWSE_ITEMS = "Browse_items_";//$NON-NLS-1$ private static ComplexTableViewerColumn[] roleConfigurationColumns = new ComplexTableViewerColumn[] { new ComplexTableViewerColumn("Role Name", false, "", "", "", ComplexTableViewerColumn.COMBO_STYLE, new String[] {}, 0),//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ new ComplexTableViewerColumn("Access", false, "", "", "", ComplexTableViewerColumn.COMBO_STYLE, new String[] {}, 0) };//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ private ConfigureRolePage configureRolePage; private IAddBrowseItemsWizardExAdapter exAdapter; public AddBrowseItemsWizard(DataModelMainPage launchPage, List<XSDElementDeclaration> list) { this(launchPage); setDeclarations(list); } public AddBrowseItemsWizard(DataModelMainPage launchPage) { super(); setWindowTitle(Messages.GenerateBrowseViews); page = launchPage; this.exAdapter = ExAdapterManager.getAdapter(this, IAddBrowseItemsWizardExAdapter.class); } public void setDeclarations(List<XSDElementDeclaration> list) { declList = list; for (XSDElementDeclaration dl : declList) { browseItemToRoles.put(BROWSE_ITEMS + dl.getName(), new ArrayList<Line>()); } } @Override public void addPages() { configureRolePage = new ConfigureRolePage(); addPage(configureRolePage); } @Override public boolean performFinish() { configureRolePage.applyChangeToRoles(); if (saveConfiguration()) { // page.getXObject().fireEvent(IXObjectModelListener.NEED_REFRESH, // null, page.getXObject().getParent().getParent()); return true; } return false; } protected void newBrowseItemView(String browseItem) { for (XSDElementDeclaration decl : declList) { String fullName = BROWSE_ITEMS + decl.getName(); if (fullName.equals(browseItem)) { TreeParent serverRoot = page.getXObject().getServerRoot(); TreeParent serverFolder = serverRoot.findServerFolder(TreeObject.VIEW); TreeObject obj = serverFolder.findObject(TreeObject.VIEW, browseItem); if (obj != null) { IEditorInput xobjectEditorinput = new XObjectEditorInput(obj, obj.getDisplayName()); final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorPart currentEditor = activePage.findEditor(xobjectEditorinput); if (currentEditor != null) {// editor is opened if (MessageDialog.openConfirm(this.getShell(), Messages.Warning, Messages.AddBrowseItemsWizard_DuplicatedView)) { refreshEditorContent(obj); } else { break; } } } obj = createNewTreeObject(decl, browseItem); TreeParent folder = obj.findServerFolder(obj.getType()); folder.addChild(obj); } } } private TreeObject createNewTreeObject(XSDElementDeclaration decl, String browseItem) { WSView view = new WSView(); view.setIsTransformerActive(new WSBoolean(false)); view.setTransformerPK("");//$NON-NLS-1$ view.setName(browseItem); EList<XSDIdentityConstraintDefinition> idtylist = decl.getIdentityConstraintDefinitions(); List<String> keys = new ArrayList<String>(); for (XSDIdentityConstraintDefinition idty : idtylist) { EList<XSDXPathDefinition> xpathList = idty.getFields(); for (XSDXPathDefinition path : xpathList) { String key = decl.getName(); // remove key = key.replaceFirst("#.*", "");//$NON-NLS-1$//$NON-NLS-2$ key += "/" + path.getValue();//$NON-NLS-1$ keys.add(key); } } view.getSearchableBusinessElements().addAll(keys); view.getViewableBusinessElements().addAll(keys); StringBuffer desc = new StringBuffer(); LinkedHashMap<String, String> labels = new LinkedHashMap<String, String>(); if (decl.getAnnotation() != null) { labels = new XSDAnnotationsStructure(decl.getAnnotation()).getLabels(); } if (labels.size() == 0) { labels.put("EN", decl.getName());//$NON-NLS-1$ } for (String lan : labels.keySet()) { desc.append("[" + lan.toUpperCase() + ":" + labels.get(lan) + "]");//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ } view.setDescription(desc.toString()); WSPutView wrap = new WSPutView(); wrap.setWsView(view); WSViewPK viewPk = new WSViewPK(); viewPk.setPk(browseItem); WSDeleteView delView = new WSDeleteView(); delView.setWsViewPK(viewPk); WSGetView getView = new WSGetView(); getView.setWsViewPK(viewPk); service.putView(wrap); // add node in the root TreeParent root = page.getXObject().getServerRoot(); TreeObject obj = new TreeObject(browseItem, root, TreeObject.VIEW, viewPk, null // no storage to save // space ); return obj; } private boolean refreshEditorContent(TreeObject obj) { IEditorInput xobjectEditorinput = new XObjectEditorInput(obj, obj.getDisplayName()); final IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorPart currentEditor = activePage.findEditor(xobjectEditorinput); if (currentEditor != null) { List<IEditorPart> editors = Arrays.asList(activePage.getDirtyEditors()); activePage.closeEditor(currentEditor, false); if (editors.contains(currentEditor)) { return true; } } return false; } protected void modifyRolesWithAttachedBrowseItem(String browseItem, List<Line> roles) { // for (Line line : roles) { // List<KeyValue> keyValues = line.keyValues; // String roleName = keyValues.get(0).value; // XtentisPort port = getXtentisPort(); // WSGetRole getRole = new WSGetRole(); // getRole.setWsRolePK(new WSRolePK(roleName)); // WSRole role = port.getRole(getRole); // for (WSRole.Specification spec : role.getSpecification()) { // if (spec.getObjectType().equals("View")) {//$NON-NLS-1$ // Instance newInstance = new Instance(); // newInstance.setInstanceName(browseItem); // newInstance.setWritable(keyValues.get(1).value.equals("Read Only") ? false : true);//$NON-NLS-1$ // spec.getInstance().add(newInstance); // break; // } // } // WSPutRole wrap = new WSPutRole(); // wrap.setWsRole(role); // port.putRole(wrap); // } } private boolean saveConfiguration() { Iterator<String> browseIterator = browseItemToRoles.keySet().iterator(); while (browseIterator.hasNext()) { String browse = browseIterator.next(); List<Line> roles = browseItemToRoles.get(browse); try { newBrowseItemView(browse); modifyRolesWithAttachedBrowseItem(browse, roles); } catch (WebServiceException e) { if (!Util.handleConnectionException(page, e, null)) { MessageDialog.openError(page.getSite().getShell(), Messages._Error, Messages.bind(Messages.ErrorOccuredSaveView, e.getLocalizedMessage())); } return false; } } return true; } public class ConfigureRolePage extends WizardPage { private TableViewer browseViewer; private ComplexTableViewer complexTableViewer; public ConfigureRolePage() { super(Messages.ConfigureBrowseViews); setTitle(Messages.ConfigureBrowseViews); setDescription(Messages.ConfigureTheBrowseViews); // Page isn't complete until an e-mail address has been added setPageComplete(true); } public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.BORDER); composite.setLayout(new GridLayout(1, false)); browseViewer = new TableViewer(composite, SWT.FULL_SELECTION | SWT.MULTI | SWT.H_SCROLL); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); gd.widthHint = 600; browseViewer.getControl().setLayoutData(gd); ((GridData) browseViewer.getControl().getLayoutData()).heightHint = 100; Table table = browseViewer.getTable(); TableColumn column = new TableColumn(table, SWT.CENTER); column.setText(INSTANCE_NAME); column.setWidth(615); table.setHeaderVisible(true); table.setLinesVisible(true); CellEditor[] editors = new CellEditor[1]; editors[0] = new TextCellEditor(table); browseViewer.setCellEditors(editors); browseViewer.setContentProvider(new IStructuredContentProvider() { public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public Object[] getElements(Object inputElement) { ArrayList<XSDElementDeclaration> values = (ArrayList<XSDElementDeclaration>) inputElement; return values.toArray(new XSDElementDeclaration[values.size()]); } }); browseViewer.setLabelProvider(new ITableLabelProvider() { public boolean isLabelProperty(Object element, String property) { return false; } public void dispose() { } public void addListener(ILabelProviderListener listener) { } public void removeListener(ILabelProviderListener listener) { } public String getColumnText(Object element, int columnIndex) { return BROWSE_ITEMS + ((XSDElementDeclaration) element).getName(); } public Image getColumnImage(Object element, int columnIndex) { return null; } }); browseViewer.setCellModifier(new ICellModifier() { public boolean canModify(Object element, String property) { return true; } public void modify(Object element, String property, Object value) { TableItem item = (TableItem) element; String tValue = value.toString().trim(); if (Pattern.compile("^\\s+\\w+\\s*").matcher(value.toString()).matches()//$NON-NLS-1$ || tValue.replaceAll("\\s", "").length() != tValue.length()) {//$NON-NLS-1$//$NON-NLS-2$ MessageDialog.openInformation(null, Messages.Warning, Messages.NotContainEmpty); return; } if (!value.toString().startsWith(BROWSE_ITEMS)) { MessageDialog.openInformation(null, Messages.Warning, Messages.bind(Messages.NameStartWith, BROWSE_ITEMS)); return; } XSDElementDeclaration elem = (XSDElementDeclaration) item.getData(); String declName = elem.getName(); if (!(BROWSE_ITEMS + declName).equals(tValue)) { for (XSDElementDeclaration theElem : declList) { if (theElem == elem) { continue; } if ((BROWSE_ITEMS + theElem.getName()).equals(tValue)) { MessageDialog.openInformation(null, Messages.Warning, Messages.BrowseNameExists); return; } } // find the real key in browseItemToRoles String key = BROWSE_ITEMS + declName; for (String k : browseItemToRoles.keySet()) { if (k.startsWith(key)) { key = k; break; } } List<Line> lines = browseItemToRoles.get(key); browseItemToRoles.remove(key); int prex = tValue.indexOf(BROWSE_ITEMS); if (prex != -1 && (prex + BROWSE_ITEMS.length()) <= tValue.length()) { elem.setName(tValue.substring(prex + BROWSE_ITEMS.length())); } browseItemToRoles.put(tValue, lines); refreshRoleView(BROWSE_ITEMS + elem.getName()); browseViewer.update(elem, null); elem.setName(declName); } } public Object getValue(Object element, String property) { XSDElementDeclaration elem = (XSDElementDeclaration) element; return BROWSE_ITEMS + elem.getName(); } }); // Listen for changes in the selection of the viewer to display additional parameters browseViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { applyChangeToRoles(); IStructuredSelection selection = (IStructuredSelection) event.getSelection(); if (selection.size() > 1) { List selectObjs = selection.toList(); refreshRoleView(selectObjs); UpdateComplexViewButton(true); } else if (selection.size() == 1) { XSDElementDeclaration decl = (XSDElementDeclaration) selection.getFirstElement(); refreshRoleView(BROWSE_ITEMS + decl.getName()); UpdateComplexViewButton(true); } } private void UpdateComplexViewButton(final boolean b) { if (exAdapter != null) { exAdapter.UpdateComplexViewButton(b); } } }); browseViewer.setInput(declList); browseViewer.setColumnProperties(new String[] { INSTANCE_NAME }); browseViewer.refresh(); if (exAdapter != null) { exAdapter.createRoleControl(composite); } setControl(composite); } /** * DOC HHB Comment method "refreshRoleView". * * @param string */ protected void refreshRoleView(String browseItem) { if (exAdapter != null) { exAdapter.refreshRoleView(browseItem); } } private Map<XSDElementDeclaration, Map<String, List<Line>>> allItemToRoles = new HashMap<XSDElementDeclaration, Map<String, List<Line>>>(); private boolean isCommitMultiChanges = false; private List selectedMultiViews = null; private List<Line> multiChanges = new LinkedList<Line>(); private void refreshRoleView(List selectObjs) { isCommitMultiChanges = true; selectedMultiViews = selectObjs; multiChanges.clear(); // if (exAdapter != null) { exAdapter.refreshRoleView(multiChanges); } } private void applyChangeToRoles() { if (isCommitMultiChanges && selectedMultiViews != null && multiChanges.size() > 0) { for (Object obj : selectedMultiViews) { XSDElementDeclaration decl = (XSDElementDeclaration) obj; String browseItem = AddBrowseItemsWizard.BROWSE_ITEMS + decl.getName(); for (Line line : multiChanges) { List<Line> lines = browseItemToRoles.get(browseItem); Line newLine = line.clone(); if (!lines.contains(newLine)) { lines.add(line); } } } selectedMultiViews = null; isCommitMultiChanges = false; multiChanges.clear(); } } } /** * DOC hbhong Comment method "getAllRoleNames". * * @return */ public List<String> getAllRoleNames() { return Util.getChildren(page.getXObject().getServerRoot(), TreeObject.ROLE); } public static ComplexTableViewerColumn[] getRoleConfigurationColumns() { return roleConfigurationColumns; } public Map<String, List<Line>> getBrowseItemToRoles() { return this.browseItemToRoles; } }