// ============================================================================ // // 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.command.common; import java.util.Iterator; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.EMap; import org.eclipse.ui.IEditorInput; 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.talend.commons.exception.PersistenceException; 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.repository.model.ProxyRepositoryFactory; import org.talend.core.repository.ui.editor.RepositoryEditorInput; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.designer.core.ui.editor.ProcessEditorInput; import org.talend.mdm.repository.core.command.AbstractCommand; import org.talend.mdm.repository.core.command.CommandManager; import org.talend.mdm.repository.core.command.ICommand; import org.talend.mdm.repository.core.impl.RepositoryViewObjectResourceChangeManager; import org.talend.mdm.repository.core.service.ContainerCacheService; import org.talend.mdm.repository.model.mdmmetadata.MDMServerDef; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.RepositoryNode; /** * DOC hbhong class global comment. Detailled comment */ public class UpdateLastServerCommand extends AbstractCommand { private static Logger log = Logger.getLogger(UpdateLastServerCommand.class); private static IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); private Item item; public void setItem(Item item) { this.item = item; } public void setServerDef(MDMServerDef serverDef) { this.serverDef = serverDef; } private MDMServerDef serverDef; public UpdateLastServerCommand() { } public UpdateLastServerCommand(Item item, MDMServerDef serverDef) { this.item = item; this.serverDef = serverDef; } /* * (non-Javadoc) * * @see org.talend.mdm.repository.core.command.AbstractCommand#getCommandType() */ @Override public int getCommandType() { return ICommand.CMD_UPDATE_SERVER; } /* * (non-Javadoc) * * @see org.talend.mdm.repository.core.command.AbstractCommand#execute(java.lang.Object, * org.eclipse.core.runtime.IProgressMonitor) */ @Override public IStatus execute(Object params, IProgressMonitor monitor) { if (item == null) { if (viewObject == null) { CommandManager.getInstance().fillViewObjectToCommand(this); } item = viewObject.getProperty().getItem(); } if (item != null) { saveLastServer(item, serverDef); } return Status.OK_STATUS; } private void saveLastServer(Item item, MDMServerDef serverDef) { if (item.eResource() == null) { try { IRepositoryViewObject viewObj = factory.getLastVersion(item.getProperty().getId()); if (viewObj == null) { // when object is match rule map info object,it must not exist and return null return; } Property property = viewObj.getProperty(); item = property.getItem(); ContainerCacheService.put(property, viewObj); } catch (PersistenceException e) { log.error(e.getMessage(), e); } } RepositoryResourceUtil.setLastServerDef(item, serverDef); if (!(item instanceof ProcessItem)) { // for common object except job try { factory.save(item); } catch (PersistenceException e) { log.error(e.getMessage(), e); } } else { if (isWorkInUI()) { // for job object try { RepositoryViewObjectResourceChangeManager.stopListening(); IEditorReference editorRef = getJobEditor(item); if (editorRef != null) { IEditorPart editor = editorRef.getEditor(false); if (editor != null && editor.isDirty()) { // when save job editor, it only keep the additional properties that Process have ProcessEditorInput processEditorInput = (ProcessEditorInput) editor.getEditorInput(); EMap additionalProperties = item.getProperty().getAdditionalProperties(); Iterator iterator = additionalProperties.keySet().iterator(); Map<Object, Object> processAdditionalProperties = processEditorInput.getLoadedProcess() .getAdditionalProperties(); processAdditionalProperties.putAll(additionalProperties.map()); editor.doSave(new NullProgressMonitor()); return; } } factory.save(item); } catch (PersistenceException e) { log.error(e.getMessage(), e); } finally { RepositoryViewObjectResourceChangeManager.startListening(); } } else {// save under command line try { factory.save(item); } catch (PersistenceException e) { log.error(e.getMessage(), e); } } } } private boolean isWorkInUI() { try { return PlatformUI.getWorkbench() != null; } catch (Exception e) { return false; } } private static final String JOB_EDITOR_ID = "org.talend.designer.core.ui.MultiPageTalendEditor"; //$NON-NLS-1$ private IEditorReference getJobEditor(Item item) { if (!ProxyRepositoryFactory.getInstance().isFullLogonFinished()) { return null; } if (PlatformUI.getWorkbench() == null || PlatformUI.getWorkbench().getActiveWorkbenchWindow() == null || PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() == null) { return null; } 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) { RepositoryEditorInput input = (RepositoryEditorInput) editorInput; String id = input.getId(); if (id == null) { RepositoryNode repositoryNode = input.getRepositoryNode(); if (repositoryNode != null) { id = repositoryNode.getId(); } } if (id != null && id.equals(item.getProperty().getId())) { return ref; } } } catch (PartInitException e) { log.error(e.getMessage(), e); } } } return null; } }