// ============================================================================ // // 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 org.talend.mdm.repository.ui.actions; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.apache.log4j.Logger; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.intro.IIntroSite; import org.eclipse.ui.intro.config.IIntroAction; import org.eclipse.ui.progress.UIJob; import org.talend.commons.exception.PersistenceException; import org.talend.commons.runtime.model.repository.ERepositoryStatus; import org.talend.core.GlobalServiceRegister; import org.talend.core.model.properties.Item; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.mdm.repository.core.AbstractRepositoryAction; import org.talend.mdm.repository.core.IRepositoryNodeActionProvider; import org.talend.mdm.repository.core.IRepositoryNodeConfiguration; import org.talend.mdm.repository.core.IRepositoryViewGlobalActionHandler; import org.talend.mdm.repository.core.IServerObjectRepositoryType; import org.talend.mdm.repository.core.service.IMDMSVNProviderService; import org.talend.mdm.repository.extension.RepositoryNodeConfigurationManager; import org.talend.mdm.repository.i18n.Messages; import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef; import org.talend.mdm.repository.model.mdmproperties.ContainerItem; import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem; import org.talend.mdm.repository.model.mdmserverobject.MDMServerObject; import org.talend.mdm.repository.models.WSRootRepositoryObject; import org.talend.mdm.repository.ui.editors.IRepositoryViewEditorInput; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.mdm.workbench.serverexplorer.ui.dialogs.SelectServerDefDialog; import org.talend.repository.model.IProxyRepositoryFactory; import com.amalto.workbench.exadapter.ExAdapterManager; import com.amalto.workbench.models.TreeObject; import com.amalto.workbench.models.TreeParent; import com.amalto.workbench.providers.XObjectBrowserInput; import com.amalto.workbench.providers.XObjectEditorInput; import com.amalto.workbench.service.MissingJarService; import com.amalto.workbench.utils.EXtentisObjects; import com.amalto.workbench.utils.UserInfo; import com.amalto.workbench.webservices.WSDataClusterPK; /** * DOC hbhong class global comment. Detailled comment <br/> * */ public class OpenObjectAction extends AbstractRepositoryAction implements IIntroAction { private static Logger log = Logger.getLogger(OpenObjectAction.class); private List<Object> selObjects; private IOpenObjectActionExAdapter exAdapter; public void setSelObjects(List<Object> selObjects) { this.selObjects = selObjects; } public OpenObjectAction() { super(Messages.OpenObjectAction_open); setId(IRepositoryViewGlobalActionHandler.OPEN); setActionDefinitionId(IRepositoryViewGlobalActionHandler.OPEN); exAdapter = ExAdapterManager.getAdapter(this, IOpenObjectActionExAdapter.class); } private IWorkbenchPage page = null; IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); private IMarker marker; private IEditorPart activeEditor; public IEditorPart getOpenedEditor() { return this.activeEditor; } @Override protected boolean isLocked() { List<Object> selectedObject = getSelectedObject(); if (!selectedObject.isEmpty()) { Object object = selectedObject.get(0); if (object instanceof IRepositoryViewObject) { IRepositoryViewObject viewObj = (IRepositoryViewObject) object; ERepositoryStatus status = factory.getStatus(viewObj); if (status == ERepositoryStatus.LOCK_BY_USER) { return !status.isEditable(); } else if (status == ERepositoryStatus.LOCK_BY_OTHER) { return false; } } } return false; } private void updateEditorInputVersionInfo(IRepositoryViewEditorInput editorInput, IRepositoryViewObject viewObject) { String version = viewObject.getVersion(); try { if (!factory.isLocalConnectionProvider()) { if (GlobalServiceRegister.getDefault().isServiceRegistered(IMDMSVNProviderService.class)) { IMDMSVNProviderService service = (IMDMSVNProviderService) GlobalServiceRegister.getDefault() .getService(IMDMSVNProviderService.class); if (service != null && service.isProjectInSvnMode()) { String revisionNumStr = service.getCurrentSVNRevision(viewObject); if (revisionNumStr != null) { revisionNumStr = ".r" + revisionNumStr; //$NON-NLS-1$ version += revisionNumStr; } } } } } catch (PersistenceException e) { log.error(e.getMessage(), e); } editorInput.setVersion(version); } public class OpenJob extends UIJob { boolean isOpened = false; public boolean isOpened() { return this.isOpened; } public OpenJob() { super("Open Object"); //$NON-NLS-1$ setUser(true); } @Override public IStatus runInUIThread(IProgressMonitor monitor) { isOpened = doOpen(); monitor.done(); return Status.OK_STATUS; } } @Override protected void doRun() { new Thread(new Runnable() { @Override public void run() { UIJob openJob = new OpenJob(); if (exAdapter != null) { if (toOpenDatamodel()) { exAdapter.beforeRun(openJob); } } openJob.schedule(); } private boolean toOpenDatamodel() { boolean toOpenDatamodel = false; List<Object> selectedObject = getSelectedObject(); if (!selectedObject.isEmpty()) { Object object = selectedObject.get(0); if (object instanceof IRepositoryViewObject) { IRepositoryViewObject viewObj = (IRepositoryViewObject) object; toOpenDatamodel = viewObj.getRepositoryObjectType() == IServerObjectRepositoryType.TYPE_DATAMODEL; } } return toOpenDatamodel; } }).start(); } public boolean doOpen() { List<Object> sels = getSelectedObject(); if (selObjects != null) { sels = selObjects; } if (sels.isEmpty()) { return false; } Object obj = sels.get(0); if (obj instanceof IRepositoryViewObject) { if (obj instanceof WSRootRepositoryObject) { return false; } IRepositoryViewObject viewObject = (IRepositoryViewObject) obj; Item item = viewObject.getProperty().getItem(); if (item instanceof ContainerItem) { if (viewObject.getRepositoryObjectType().equals(IServerObjectRepositoryType.TYPE_SERVICECONFIGURATION)) {// service boolean checkMissingJar = MissingJarService.getInstance().checkMissingJar(true); if (!checkMissingJar) { return false; } // configuration MDMServerDef serverDef = openServerDialog(null); openServiceConfig(serverDef); } else { getCommonViewer().expandToLevel(obj, 1); } } else { IEditorReference editorRef = RepositoryResourceUtil.isOpenedInEditor(viewObject); if (editorRef != null) { if (page == null) { page = getCommonViewer().getCommonNavigator().getSite().getWorkbenchWindow().getActivePage(); } if (page != null) { page.bringToTop(editorRef.getPart(false)); } if (marker != null) { IDE.gotoMarker(editorRef.getEditor(true), marker); } return false; } else { openItem(viewObject); return true; } } } return true; } private void openServiceConfig(MDMServerDef serverDef) { TreeParent serverRoot = getServerRoot(serverDef); if (!isNull(serverRoot)) { TreeObject xobject = new TreeObject(EXtentisObjects.ServiceConfiguration.getDisplayName(), serverRoot, TreeObject.SERVICE_CONFIGURATION, null, null); try { if (page == null) { this.page = getCommonViewer().getCommonNavigator().getSite().getWorkbenchWindow().getActivePage(); } page.openEditor(new XObjectEditorInput(xobject, xobject.getDisplayName()), "com.amalto.workbench.editors.XObjectEditor"); //$NON-NLS-1$ } catch (PartInitException e) { log.error(e.getMessage(), e); } } } private void openItem(IRepositoryViewObject viewObject) { Item item = viewObject.getProperty().getItem(); item = RepositoryResourceUtil.assertItem(item); IRepositoryNodeConfiguration configuration = RepositoryNodeConfigurationManager.getConfiguration(item); if (configuration != null) { IRepositoryNodeActionProvider actionProvider = configuration.getActionProvider(); if (actionProvider != null) { IRepositoryViewEditorInput editorInput = actionProvider.getOpenEditorInput(viewObject); if (editorInput != null) { if (page == null) { this.page = getCommonViewer().getCommonNavigator().getSite().getWorkbenchWindow().getActivePage(); } // do extra action MDMServerObject serverObject = ((MDMServerObjectItem) item).getMDMServerObject(); if (!checkMissingJar(serverObject)) { return; } boolean selected = doSelectServer(item, editorInput); if (!selected) { return; } try { // svn lock ERepositoryStatus status = factory.getStatus(item); boolean isEditable = factory.isEditableAndLockIfPossible(item); if (isEditable) { getCommonViewer().refresh(viewObject); } // editorInput.setReadOnly(status == ERepositoryStatus.LOCK_BY_OTHER || status == ERepositoryStatus.READ_ONLY || !isEditable); if (!editorInput.isReadOnly()) { editorInput.setReadOnly(item.getState().isDeleted()); } updateEditorInputVersionInfo(editorInput, viewObject); activeEditor = this.page.openEditor(editorInput, editorInput.getEditorId()); if (marker != null) { IDE.gotoMarker(activeEditor, marker); } } catch (PartInitException e) { log.error(e.getMessage(), e); } } else { AbstractRepositoryAction openAction = actionProvider.getOpenAction(viewObject); if (openAction != null) { openAction.selectionChanged(getStructuredSelection()); openAction.run(); } } } } } @Override public IStructuredSelection getStructuredSelection() { if (selObjects != null) { return new StructuredSelection(selObjects); } return super.getStructuredSelection(); } @Override protected boolean needValidateLockedObject() { return true; } @Override public String getGroupName() { // this action not be shown in context menu,so Nothing need to do in here return null; } public TreeParent getServerRoot(MDMServerDef serverDef) { if (isNull(serverDef)) { return null; } String serverName = serverDef.getName(); String username = serverDef.getUser(); String password = serverDef.getPasswd(); String endpointaddress = serverDef.getProtocol() + serverDef.getHost() + ":" + serverDef.getPort() //$NON-NLS-1$ + serverDef.getPath(); TreeParent serverRoot = new TreeParent(serverName, null, TreeObject._SERVER_, endpointaddress, username + ":" + (password == null ? "" : password));//$NON-NLS-1$//$NON-NLS-2$ UserInfo user = new UserInfo(); user.setUsername(username); user.setPassword(password); user.setServerUrl(endpointaddress); serverRoot.setUser(user); return serverRoot; } private boolean checkMissingJar(MDMServerObject serverObject) { int type = serverObject.getType(); switch (type) { case TreeObject.DATA_CLUSTER: case TreeObject.TRANSFORMER: case TreeObject.ROUTING_RULE: boolean checkMissingJar = MissingJarService.getInstance().checkMissingJar(true); if (!checkMissingJar) { return false; } } return true; } public boolean doSelectServer(Item item, IRepositoryViewEditorInput editorInput) { MDMServerObject serverObject = ((MDMServerObjectItem) item).getMDMServerObject(); if (serverObject.getType() == TreeObject.DATA_CLUSTER) {// Data Cluster MDMServerDef lastServerDef = RepositoryResourceUtil.getLastServerDef(item); MDMServerDef serverDef = openServerDialog(lastServerDef); if (serverDef != null) { XObjectBrowserInput input = (XObjectBrowserInput) editorInput; TreeObject xobject = (TreeObject) input.getModel(); if (xobject != null && xobject.getWsKey() != null) { TreeParent serverRoot = getServerRoot(serverDef); xobject.setWsKey(new WSDataClusterPK(xobject.getWsKey().toString())); xobject.setServerRoot(serverRoot); return true; } } return false; } return true; } /** * return a decrypted server def * * @param serverObject * @return a decrypted server def */ public MDMServerDef openServerDialog(MDMServerDef serverObject) { SelectServerDefDialog dlg = new SelectServerDefDialog(getShell()); dlg.create(); dlg.setSelectServer(serverObject); if (dlg.open() == IDialogConstants.OK_ID) { MDMServerDef serverDef = dlg.getSelectedServerDef(); return serverDef; } return null; } private boolean isNull(Object obj) { return obj == null; } public void openMarker(IRepositoryViewObject viewObj, IMarker marker) { this.marker = marker; List<Object> selObjs = new ArrayList<Object>(); selObjs.add(viewObj); setSelObjects(selObjs); run(); } @Override public void run(IIntroSite site, Properties params) { PlatformUI.getWorkbench().getIntroManager().closeIntro(PlatformUI.getWorkbench().getIntroManager().getIntro()); Object id = params.get("nodeId"); //$NON-NLS-1$ if (id != null) { try { IRepositoryViewObject selectedObj = factory.getLastVersion((String) id); List selObjs = new ArrayList(1); selObjs.add(selectedObj); setSelObjects(selObjs); run(); } catch (PersistenceException e) { log.error(e.getMessage(), e); } } } }