// ============================================================================ // // 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.core.impl.jobmodel; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EMap; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.gmf.util.DisplayUtils; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ProcessItem; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.model.repository.RepositoryViewObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.repository.ui.editor.RepositoryEditorInput; import org.talend.mdm.repository.core.command.CommandManager; import org.talend.mdm.repository.core.command.ICommand; import org.talend.mdm.repository.core.impl.AbstractRepositoryResourceChangeListener; import org.talend.mdm.repository.core.service.ContainerCacheService; import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef; import org.talend.mdm.repository.ui.navigator.MDMRepositoryView; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.repository.documentation.ERepositoryActionName; /** * DOC hbhong class global comment. Detailled comment */ public class JobResourceListener extends AbstractRepositoryResourceChangeListener { static Logger log = Logger.getLogger(JobResourceListener.class); private static final String JOB_EDITOR_ID = "org.talend.designer.core.ui.MultiPageTalendEditor"; //$NON-NLS-1$ private boolean isOpenInEditor(IRepositoryViewObject vObj) { if (!ProxyRepositoryFactory.getInstance().isFullLogonFinished()) { return false; } if (PlatformUI.getWorkbench() == null || PlatformUI.getWorkbench().getActiveWorkbenchWindow() == null || PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() == null) { return false; } IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorReference[] editorReferences = activePage.getEditorReferences(); for (IEditorReference ref : editorReferences) { String editorId = ref.getId(); if (ref != null && JOB_EDITOR_ID.equals(editorId)) { try { IEditorInput editorInput = ref.getEditorInput(); if (editorInput instanceof RepositoryEditorInput) { Item item = ((RepositoryEditorInput) editorInput).getItem(); if (item != null && item.equals(vObj.getProperty().getItem())) { return true; } } } catch (PartInitException e) { log.error(e.getMessage(), e); } } } return false; } @Override protected boolean isHandleProperty(String propertyName) { return propertyName.equals(ERepositoryActionName.SAVE.getName()) || propertyName.equals(ERepositoryActionName.CREATE.getName()) || propertyName.equals(ERepositoryActionName.IMPORT.getName()) || propertyName.equals(ERepositoryActionName.COPY.getName()); } @Override protected boolean isHandleItem(Item item) { return item instanceof ProcessItem; } @Override protected void run(String propertyName, final Item item) throws Exception { boolean jobSaved = false; boolean jobCreated = false; if (propertyName.equals(ERepositoryActionName.SAVE.getName())) { jobSaved = true; } if (propertyName.equals(ERepositoryActionName.CREATE.getName()) || propertyName.equals(ERepositoryActionName.IMPORT.getName()) || propertyName.equals(ERepositoryActionName.COPY.getName())) { jobCreated = true; } if (!jobSaved && !jobCreated) { // if the operation is not job saved or created, just don't do anything. return; } if (jobCreated) { CommandManager.getInstance().pushCommand(ICommand.CMD_ADD, item.getProperty().getId(), item.getProperty().getDisplayName()); removeLastServerInfo(item); } if (jobSaved) { // create a new object but without GUI info since it won't be used here certainly final IRepositoryViewObject viewObject = new RepositoryViewObject(item.getProperty(), true); final MDMServerDef serverDef = RepositoryResourceUtil.getLastServerDef(viewObject); DisplayUtils.getDisplay().syncExec(new Runnable() { public void run() { if (viewObject != null && serverDef != null && isOpenInEditor(viewObject)) { CommandManager.getInstance().pushCommand(ICommand.CMD_MODIFY, viewObject); final IRepositoryViewObject cacheViewObject = ContainerCacheService.get(item.getProperty()); if (cacheViewObject != null) { MDMRepositoryView.show().getCommonViewer().refresh(cacheViewObject); } else { MDMRepositoryView.show().getCommonViewer().refresh(viewObject); } } } }); } } private void removeLastServerInfo(Item item) { Property property = item.getProperty(); EMap additionalProperties = property.getAdditionalProperties(); if (additionalProperties != null && additionalProperties.containsKey(RepositoryResourceUtil.PROP_LAST_SERVER_DEF)) { RepositoryResourceUtil.setLastServerDef(item, null); ProxyRepositoryFactory factory = ProxyRepositoryFactory.getInstance(); try { item = RepositoryResourceUtil.assertItem(item); factory.save(item, true); } catch (PersistenceException e) { log.error(e.getMessage(), e); } } } }