// ============================================================================ // // 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.engines.client.ui.wizards; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.EnumMap; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jface.dialogs.ErrorDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Font; 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.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.internal.wizards.datatransfer.WizardFileSystemResourceExportPage1; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.ui.runtime.exception.MessageBoxExceptionHandler; import org.talend.commons.ui.swt.formtools.LabelledCombo; import org.talend.core.CorePlugin; import org.talend.core.GlobalServiceRegister; import org.talend.core.language.ECodeLanguage; import org.talend.core.language.LanguageManager; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ProcessItem; import org.talend.core.model.properties.PropertiesFactory; import org.talend.core.model.properties.Property; import org.talend.core.model.properties.SpagoBiServer; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.prefs.ITalendCorePrefConstants; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.core.ui.export.ArchiveFileExportOperationFullPath; import org.talend.designer.core.model.utils.emf.talendfile.ProcessType; import org.talend.designer.runprocess.IProcessor; import org.talend.designer.runprocess.JobErrorsChecker; import org.talend.designer.runprocess.ProcessorException; import org.talend.designer.runprocess.ProcessorUtilities; import org.talend.mdm.engines.client.i18n.Messages; import org.talend.repository.documentation.ExportFileResource; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IRepositoryNode.ENodeType; import org.talend.repository.model.IRepositoryNode.EProperties; import org.talend.repository.model.RepositoryNode; import org.talend.repository.ui.utils.ZipToFile; import org.talend.repository.ui.wizards.exportjob.JavaJobExportReArchieveCreator; import org.talend.repository.ui.wizards.exportjob.scriptsmanager.JobJavaScriptsWSManager; import org.talend.repository.ui.wizards.exportjob.scriptsmanager.JobScriptsManager; import org.talend.repository.ui.wizards.exportjob.scriptsmanager.JobScriptsManager.ExportChoice; import org.talend.repository.ui.wizards.exportjob.util.ExportJobUtil; import com.amalto.workbench.service.ILegendServerDefService; import com.amalto.workbench.utils.HttpClientUtil; import com.amalto.workbench.utils.MDMServerDef; import com.amalto.workbench.utils.Util; /** * Page of the Job Scripts Export Wizard. <br/> * * $Id: DeployOnMDMExportWizardPage.java 1 2007-04-26 11:29:00 cantoine * */ public abstract class DeployOnMDMExportWizardPage extends WizardFileSystemResourceExportPage1 { /** * */ private static final String UNDERLINE = "_"; //$NON-NLS-1$ /** * */ private static final String SEPERATOR = "/"; //$NON-NLS-1$ /** * */ private static final String BLANK = ""; //$NON-NLS-1$ private static final String EXT_ZIP = ".zip"; //$NON-NLS-1$ private static final Log log = LogFactory.getLog(DeployOnMDMExportWizardPage.class); // widgets protected Button contextButton; protected ExportFileResource[] process; protected LabelledCombo serverSpagoBi; protected Combo contextCombo; protected JobScriptsManager manager; protected String jobPurposeDescription; private SpagoBiServer mdmServer = null; private RuntimeException deployException; private boolean isDeploySucceed = false; protected List<JobDeploymentInfo> jobInfoList = new ArrayList<JobDeploymentInfo>(); protected Map<ExportFileResource, RepositoryNode> processMap = new HashMap<ExportFileResource, RepositoryNode>(); protected String selectedServer; private IStructuredSelection selection; private boolean saveflag = true; /** * Create an instance of this class. * * @param name java.lang.String */ protected DeployOnMDMExportWizardPage(String name, IStructuredSelection selection, SpagoBiServer mdmserver) { super(name, null); this.selection = selection; this.mdmServer = mdmserver; manager = new JobJavaScriptsWSManager(getExportChoiceMap(needContextScript()), BLANK, JobScriptsManager.ALL_ENVIRONMENTS, IProcessor.NO_STATISTICS, IProcessor.NO_TRACES, EXT_ZIP); RepositoryNode[] nodes = (RepositoryNode[]) selection.toList().toArray(new RepositoryNode[selection.size()]); List<ExportFileResource> list = new ArrayList<ExportFileResource>(); for (RepositoryNode node : nodes) { if (node.getType() == ENodeType.SYSTEM_FOLDER || node.getType() == ENodeType.SIMPLE_FOLDER) { addTreeNode(node, node.getProperties(EProperties.LABEL).toString(), list); } if (node.getType() == ENodeType.REPOSITORY_ELEMENT) { IRepositoryViewObject repositoryObject = node.getObject(); if (repositoryObject.getProperty().getItem() instanceof ProcessItem) { ProcessItem processItem = (ProcessItem) repositoryObject.getProperty().getItem(); ProcessType processType = processItem.getProcess(); ExportFileResource resource = new ExportFileResource(processItem, processItem.getProperty().getLabel()); if (mdmserver == null) { resource.setNode(node); } jobPurposeDescription = processItem.getProperty().getPurpose(); list.add(resource); processMap.put(resource, node); JobDeploymentInfo jobInfo = new JobDeploymentInfo(); jobInfo.setJobLabelName(processItem.getProperty().getLabel()); jobInfo.setJobPath(processItem.getState().getPath()); jobInfo.setJobVersion(processItem.getProperty().getVersion()); jobInfo.setJobPurposeDescription(jobPurposeDescription); jobInfoList.add(jobInfo); } } } process = list.toArray(new ExportFileResource[list.size()]); } private void addTreeNode(RepositoryNode node, String path, List<ExportFileResource> list) { if (node != null && node.getType() == ENodeType.REPOSITORY_ELEMENT) { IRepositoryViewObject repositoryObject = node.getObject(); if (repositoryObject.getProperty().getItem() instanceof ProcessItem) { ProcessItem processItem = (ProcessItem) repositoryObject.getProperty().getItem(); ExportFileResource resource = new ExportFileResource(processItem, path); resource.setNode(node); list.add(resource); processMap.put(resource, node); } } Object[] nodes = node.getChildren().toArray(); if (nodes.length <= 0) { return; } for (Object node2 : nodes) { addTreeNode((RepositoryNode) node2, path + SEPERATOR + ((RepositoryNode) node2).getProperties(EProperties.LABEL).toString(), list); } } /** * Create an instance of this class. * * @param selection the selection */ public DeployOnMDMExportWizardPage(IStructuredSelection selection) { this("publishOnSpagoExportPage1", selection, null); //$NON-NLS-1$ setDescription(Messages.DeployOnMDMExportWizard_publishJob); setTitle(Messages.DeployOnMDMExportWizardPage_exportTitle); } /** * (non-Javadoc) Method declared on IDialogPage. */ @Override public void createControl(Composite parent) { initializeDialogUnits(parent); Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); composite.setFont(parent.getFont()); createOptionsGroup(composite); restoreResourceSpecificationWidgetValues(); // ie.- local restoreWidgetValues(); // ie.- subclass hook updateWidgetEnablements(); setPageComplete(determinePageCompletion()); setErrorMessage(null); // should not initially have error message setControl(composite); } /* * @see org.eclipse.ui.internal.wizards.datatransfer.WizardFileSystemResourceExportPage1#validateSourceGroup() */ @Override protected boolean validateSourceGroup() { return true; } /** * Create the export options specification widgets. * */ @Override protected void createOptionsGroupButtons(Group optionsGroup) { Font font = optionsGroup.getFont(); optionsGroup.setLayout(new GridLayout(1, true)); Composite left = new Composite(optionsGroup, SWT.NONE); left.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false)); left.setLayout(new GridLayout(2, true)); createOptions(left, font); } /** * Create the buttons for the group that determine if the entire or selected directory structure should be created. * * @param optionsGroup * @param font */ protected void createOptions(Composite optionsGroup, Font font) { // create directory structure radios List<MDMServerDef> listServerSapgo = com.amalto.workbench.utils.MDMServerHelper.getServers(); List<String> listEngine = new ArrayList<String>(); if (mdmServer == null) { for (MDMServerDef serv : listServerSapgo) { listEngine.add(serv.getName()); } serverSpagoBi = new LabelledCombo(optionsGroup, Messages.DeployOnMDMExportWizardPage_SpagoBI_Server, Messages.DeployOnMDMExportWizardPage_SpecifyServer_PublishJob, listEngine); serverSpagoBi.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateSelectedServer(); } }); serverSpagoBi.select(0); } Composite typeComp = new Composite(optionsGroup, SWT.NONE); typeComp.setLayout(new FillLayout(SWT.HORIZONTAL)); typeComp.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); Label typeLabel = new Label(typeComp, SWT.NONE); typeLabel.setText(Messages.DeployOnMDMExportWizardPage_ExportType); Label contentLabel = new Label(typeComp, SWT.NONE); contentLabel.setText(Messages.DeployOnMDMExportWizardPage_hostedZip); contextButton = new Button(optionsGroup, SWT.CHECK | SWT.LEFT); contextButton.setText(Messages.JobScriptsExportWizardPage_contextPerlScripts); contextButton.setSelection(true); contextButton.setFont(font); contextCombo = new Combo(optionsGroup, SWT.PUSH); } /** * DOC HHB Comment method "updateSelectedServer". */ protected void updateSelectedServer() { selectedServer = serverSpagoBi.getItem(serverSpagoBi.getSelectionIndex()); } /** * Returns a boolean indicating whether the directory portion of the passed pathname is valid and available for use. */ protected boolean ensureTargetDirectoryIsValid(final String fullPathname) { final int separatorIndex = fullPathname.lastIndexOf(File.separator); if (separatorIndex == -1) { return true; } final List<Boolean> result = new ArrayList<Boolean>(); Display.getDefault().syncExec(new Runnable() { public void run() { result.add(ensureTargetIsValid(new File(fullPathname.substring(0, separatorIndex)))); } }); return result.isEmpty() ? false : result.get(0); } /** * Returns a boolean indicating whether the passed File handle is is valid and available for use. */ protected boolean ensureTargetFileIsValid(File targetFile) { if (targetFile.exists() && targetFile.isDirectory()) { displayErrorDialog(Messages.DeployOnMDMExportWizardPage_mustBeFile); giveFocusToDestination(); return false; } if (targetFile.exists()) { if (!targetFile.canWrite()) { displayErrorDialog(Messages.DeployOnMDMExportWizardPage_alreadyExistsError); giveFocusToDestination(); return false; } } return true; } /** * Ensures that the target output file and its containing directory are both valid and able to be used. Answer a * boolean indicating validity. */ protected boolean ensureTargetIsValid(ExportFileResource p) { String targetPath = getDestinationValue(p); if (!ensureTargetDirectoryIsValid(targetPath)) { return false; } if (!ensureTargetFileIsValid(new File(targetPath))) { return false; } return true; } /** * Export the passed resource and recursively export all of its child resources (iff it's a container). Answer a * boolean indicating success. */ protected boolean executeExportOperation(final ArchiveFileExportOperationFullPath op) { op.setCreateLeadupStructure(true); op.setUseCompression(true); Display.getDefault().syncExec(new Runnable() { public void run() { try { PlatformUI.getWorkbench().getProgressService().run(true, true, op); } catch (InterruptedException e) { } catch (InvocationTargetException e) { displayErrorDialog(e.getTargetException()); } IStatus status = op.getStatus(); if (!status.isOK()) { ErrorDialog.openError(getContainer().getShell(), BLANK, null, // no // special // message status); } } }); IStatus status = op.getStatus(); if (!status.isOK()) { return false; } return true; } final int W_PREPARE_PROCESS = 10; final int W_GENERATE_PROCESS = 2; final int W_PACKAGE_PROCESS = 2; final int W_DEPLOY_PROCESS = 10; final int W_EXPORT_PROCESS = 2; class DeployJobProcess implements IRunnableWithProgress { private final boolean needContextScript; private final String context; public DeployJobProcess(boolean needContextScript, String context) { this.needContextScript = needContextScript; this.context = context; } public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { int size = process.length; int total = W_PREPARE_PROCESS + W_PREPARE_PROCESS + W_EXPORT_PROCESS * size + W_GENERATE_PROCESS * size + W_PACKAGE_PROCESS + W_DEPLOY_PROCESS * size; monitor.beginTask(Messages.DeployOnMDMExportWizardPage_DeployingJobObjects, total); if (prepareProcess(needContextScript, context, monitor)) { boolean isOK = true; for (ExportFileResource p : process) { if (exportJob(p, needContextScript, monitor)) { if (checkError(p)) { isOK = false; break; } if (generateProcess(p, monitor)) { if (!packageProcess(p, monitor)) { isOK = false; break; } } } else { isOK = false; } } if (isOK && deployJobProcess(context, monitor)) { Display.getDefault().asyncExec(new Runnable() { public void run() { MessageDialog.openInformation(getContainer().getShell(), Messages.DeployOnMDMExportWizardPage_publishJob, Messages.DeployOnMDMExportWizardPage_publishJobSuccess); } }); } } monitor.done(); } }; private boolean checkError(ExportFileResource resource) { RepositoryNode node = processMap.get(resource); IStructuredSelection selection = new StructuredSelection(node); boolean hasError = JobErrorsChecker.checkExportErrors(selection, true); if (hasError) { recordDeployException(new RuntimeException(Messages.bind(Messages.DeployOnMDMExportWizardPage_jobCompileError, resource.getItem().getProperty().getLabel()))); setDeploySucceed(false); } return hasError; } private boolean prepareProcess(boolean needContextScript, String context, IProgressMonitor monitor) { monitor.setTaskName(Messages.DeployOnMDMExportWizardPage_prepareDeployJob); monitor.worked(W_PREPARE_PROCESS); Map<ExportChoice, Object> exportChoiceMap = getExportChoiceMap(needContextScript); boolean canExport = false; for (ExportChoice choice : ExportChoice.values()) { if (exportChoiceMap.get(choice) != null && exportChoiceMap.get(choice) instanceof Boolean && (Boolean) exportChoiceMap.get(choice)) { canExport = true; break; } } if (!canExport) { Display.getDefault().asyncExec(new Runnable() { public void run() { MessageDialog.openInformation(getContainer().getShell(), Messages.DeployOnMDMExportWizardPage_publishResourceError, Messages.DeployOnMDMExportWizardPage_chooseResource); } }); setDeploySucceed(false); return false; } // reset the manager,now only support zip type manager = new JobJavaScriptsManager(exportChoiceMap, context, JobScriptsManager.ALL_ENVIRONMENTS, IProcessor.NO_STATISTICS, IProcessor.NO_TRACES); if (!saveflag) { saveflag = true; return false; } // about to invoke the operation so save our state doSaveWidgetValues(); monitor.worked(W_PREPARE_PROCESS); return true; } private boolean exportJob(ExportFileResource p, boolean needContextScript, IProgressMonitor monitor) { String label = getProcessName(p); monitor.setTaskName(Messages.bind(Messages.DeployOnMDMExportWizardPage_exporting, label)); if (!ensureTargetIsValid(p)) { setDeploySucceed(false); return false; } List<ExportFileResource> resourcesToExport = null; try { resourcesToExport = getExportResources(p); } catch (ProcessorException e) { MessageBoxExceptionHandler.process(e); setDeploySucceed(false); return false; } String topFolder = getRootFolderName(p); setTopFolder(resourcesToExport, topFolder); ArchiveFileExportOperationFullPath exporterOperation = getExporterOperation(p, resourcesToExport); boolean ok = executeExportOperation(exporterOperation); // TODO What if not ok ???? // path can like name/name manager.deleteTempFiles(); ProcessorUtilities.resetExportConfig(); monitor.worked(W_EXPORT_PROCESS); return true; } protected void doSaveWidgetValues() { Display.getDefault().syncExec(new Runnable() { public void run() { saveWidgetValues(); } }); } private String getProcessName(ExportFileResource p) { ProcessItem processItem = (ProcessItem) p.getItem(); String label = processItem.getProperty().getLabel(); return label; } private String getProcessVersion(ExportFileResource p) { ProcessItem processItem = (ProcessItem) p.getItem(); String label = processItem.getProperty().getVersion(); return label; } private boolean generateProcess(ExportFileResource p, IProgressMonitor monitor) { String label = getProcessName(p); monitor.setTaskName(Messages.bind(Messages.DeployOnMDMExportWizardPage_Generating, label)); ProcessItem processItem = (ProcessItem) p.getItem(); try { ProcessorUtilities.generateCode(processItem, processItem.getProcess().getDefaultContext(), false, false); monitor.worked(W_GENERATE_PROCESS); } catch (ProcessorException e) { MessageBoxExceptionHandler.process(e); setDeploySucceed(false); return false; } return true; } private boolean packageProcess(ExportFileResource p, IProgressMonitor monitor) { String label = getProcessName(p); monitor.setTaskName(Messages.bind(Messages.DeployOnMDMExportWizardPage_Pacakging, label)); ECodeLanguage curLanguage = LanguageManager.getCurrentLanguage(); if (curLanguage == ECodeLanguage.JAVA) { reBuildJobZipFile(p); } setDesValueForJob(p); processForEachJob(p); monitor.worked(W_PACKAGE_PROCESS); return true; } public MDMServerDef getServerDefFromList(String desc) { List<MDMServerDef> listServerSapgo = com.amalto.workbench.utils.MDMServerHelper.getServers(); if (null != listServerSapgo) { for (MDMServerDef def : listServerSapgo) { if (desc.equals(def.getName())) { return def; } } } return null; } private boolean deployJobProcess(String context, IProgressMonitor monitor) { // retrieve user, password, host, port from selected server MDMServerDef server = null; if (mdmServer == null) { String selectedSpagoBiEngineName = selectedServer; List<MDMServerDef> listServerSapgo = com.amalto.workbench.utils.MDMServerHelper.getServers(); for (MDMServerDef serv : listServerSapgo) { if (selectedSpagoBiEngineName.equals(serv.getName())) { server = serv; break; } } } else { server = getServerDefFromList(mdmServer.getShortDescription()); } if (null == server) { setDeploySucceed(false); return false; } String user = server.getUser(); String password = server.getPasswd(); String host = server.getHost(); String port = server.getPort(); // check connection before sending data monitor.setTaskName(Messages.DeployOnMDMExportWizardPage_checkConnection); boolean success = checkConnection(server.getUrl(), user, password); if (!success) { Display.getDefault().syncExec(new Runnable() { public void run() { String msg = Messages.DeployOnMDMExportWizardPage_UnableConnect; MessageDialog.openError(getContainer().getShell(), Messages.DeployOnMDMExportWizardPage_publishResourceError, msg); } }); setDeploySucceed(false); return false; } // modified by xie to fix bug 20084 ,do the multi jobs deployment in one time. for (JobDeploymentInfo jobInfo : jobInfoList) { monitor.setTaskName(Messages.bind(Messages.DeployOnMDMExportWizardPage_DeployJobOnServer, jobInfo.getJobLabelName(), server.getName())); String filename = jobInfo.getDescValue(); String contextPath = Util.getContextPath(server.getPath()); String mdmServerUploadURL = server.getProtocol() + host + ":" + port + contextPath + "/services/uploadFile?deployjob="//$NON-NLS-1$ //$NON-NLS-2$ + new File(filename).getName() + "&jobpath=" + jobInfo.getJobPath() + "&contextStr=" + context;//$NON-NLS-1$//$NON-NLS-2$ try { HttpClientUtil.uploadFileToAppServer(mdmServerUploadURL, filename, user, password); monitor.worked(W_DEPLOY_PROCESS); } catch (Exception e) { log.error(e.getMessage(), e); Display.getDefault().syncExec(new Runnable() { public void run() { MessageDialog.openError(getContainer().getShell(), Messages.DeployOnMDMExportWizardPage_publishResourceError, Messages.DeployOnMDMExportWizardPage_ErrorDeployMsg); } }); recordDeployException(new RuntimeException(e.getMessage(), e)); setDeploySucceed(false); return false; } } mdmServer = toSpagoBiServer(server); setDeploySucceed(true); return true; } private boolean needContextScript() { return (contextButton != null) ? contextButton.getSelection() : true; } /** * The Finish button was pressed. Try to do the required work now and answer a boolean indicating success. If false * is returned then the wizard will not close. * * @returns boolean */ @Override public boolean finish() { try { boolean needContextScript = needContextScript(); String context = contextCombo.getText(); DeployJobProcess deployJobProcess = new DeployJobProcess(needContextScript, context); getContainer().run(true, false, deployJobProcess); } catch (InvocationTargetException ex) { log.error(ex.getMessage(), ex); } catch (InterruptedException ex) { log.error(ex.getMessage(), ex); } return true; } private boolean checkConnection(String endpointaddress, String username, String password) { try { ILegendServerDefService serverDefService = (ILegendServerDefService) GlobalServiceRegister.getDefault().getService( ILegendServerDefService.class); if (serverDefService != null) { return serverDefService.checkServerDefConnection(endpointaddress, username, password); } } catch (Exception e) { log.error(e.getMessage(), e); } return true; } /** * * DOC aiming Comment method "reBuildJobZipFile". * */ private void reBuildJobZipFile(ExportFileResource p) { JavaJobExportReArchieveCreator creator = null; String zipFile = getDestinationValue(p); String tmpFolder = ExportJobUtil.getTmpFolder(); try { // unzip to tmpFolder ZipToFile.unZipFile(zipFile, tmpFolder); // remove jaxrpc.jar from lib , see 0021706 String javxRpc = tmpFolder + File.separator + "WEB-INF" + File.separator + "lib" + File.separator + "jaxrpc.jar";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ File rpcfile = new File(javxRpc); if (rpcfile.exists()) { rpcfile.delete(); } // build new jar if (p != null) { String jobFolderName = p.getDirectoryName(); int pos = jobFolderName.indexOf(SEPERATOR); if (pos != -1) { jobFolderName = jobFolderName.substring(pos + 1); } if (creator == null) { creator = new JavaJobExportReArchieveCreator(zipFile, jobFolderName); } else { creator.setJobFolerName(jobFolderName); } creator.buildNewJar(); } // rezip the tmpFolder to zipFile ZipToFile.zipFile(tmpFolder, zipFile); } catch (Exception e) { ExceptionHandler.process(e); } finally { ExportJobUtil.deleteTempFiles(); } } /** * process each job,unzip to a temp folder , copy the necessary folder for each job , and zip to the MDM temp folder * for uploading. */ protected void processForEachJob(ExportFileResource p) { String zipFile = getDestinationValue(p); String tmpFolder = ExportJobUtil.getTmpFolder() + File.separator + "forJob"; //$NON-NLS-1$ try { // unzip to tmpFolder ZipToFile.unZipFile(zipFile, tmpFolder); String jobLabelName = getProcessName(p); String jobVersion = getProcessVersion(p); File desFile = new File(tmpFolder + File.separator + jobLabelName + UNDERLINE + jobVersion); if (desFile.isDirectory()) { JobDeploymentInfo jobInfo = getJobDeploymentInfo(p); if (jobInfo != null) { File sourFile = new File(tmpFolder + File.separator + jobLabelName + UNDERLINE + jobVersion + File.separator + jobInfo.getJobLabelName()); File sourLibFile = new File(tmpFolder + File.separator + jobLabelName + UNDERLINE + jobVersion + File.separator + "lib"); //$NON-NLS-1$ String jobDescPath = tmpFolder + File.separator + jobInfo.getJobLabelName() + UNDERLINE + jobInfo.getJobVersion() + "job"; //$NON-NLS-1$ File jobDescDir = new File(jobDescPath); if (!jobDescDir.exists()) { jobDescDir.mkdir(); } File jobDescDir_in = new File(jobDescPath + File.separator + jobInfo.getJobLabelName() + UNDERLINE + jobInfo.getJobVersion()); if (!jobDescDir_in.exists()) { jobDescDir_in.mkdir(); } File jobDescDir_main = new File(jobDescPath + File.separator + jobInfo.getJobLabelName() + UNDERLINE + jobInfo.getJobVersion() + File.separator + jobInfo.getJobLabelName()); if (!jobDescDir_main.exists()) { jobDescDir_main.mkdir(); } File jobDescDirLib = new File(jobDescPath + File.separator + jobInfo.getJobLabelName() + UNDERLINE + jobInfo.getJobVersion() + File.separator + "lib"); //$NON-NLS-1$ if (!jobDescDirLib.exists()) { jobDescDirLib.mkdir(); } copy(sourFile.listFiles(), jobDescDir_main); copy(sourLibFile.listFiles(), jobDescDirLib); ZipToFile.zipFile(jobDescPath, jobInfo.getDescValue()); } } } catch (Exception e) { ExceptionHandler.process(e); } finally { ExportJobUtil.deleteTempFiles(); } } /** * copy all the files of this folder to another */ private void copy(File[] s, File d) { if (!d.exists()) { d.mkdir(); } for (File element : s) { if (element.isFile()) { try { FileInputStream fis = new FileInputStream(element); FileOutputStream out = new FileOutputStream(new File(d.getPath() + File.separator + element.getName())); int count = fis.available(); byte[] data = new byte[count]; if ((fis.read(data)) != -1) { out.write(data); } out.close(); fis.close(); } catch (Exception e) { e.printStackTrace(); } } if (element.isDirectory()) { File des = new File(d.getPath() + File.separator + element.getName()); des.mkdir(); copy(element.listFiles(), des); } } } /** * Get the export operation. * * @param resourcesToExport * @return */ private ArchiveFileExportOperationFullPath getExporterOperation(ExportFileResource p, List<ExportFileResource> resourcesToExport) { ArchiveFileExportOperationFullPath exporterOperation = new ArchiveFileExportOperationFullPath(resourcesToExport, getDestinationValue(p)); return exporterOperation; } private ArchiveFileExportOperationFullPath getExporterOperationForOneJob(List<ExportFileResource> resourcesToExport, String descValue) { ArchiveFileExportOperationFullPath exporterOperation = new ArchiveFileExportOperationFullPath(resourcesToExport, descValue); return exporterOperation; } /** * Returns the root folder name. * * @return */ private String getRootFolderName(ExportFileResource p) { IPath path = new Path(this.getDestinationValue(p)); String subjectString = path.lastSegment(); Pattern regex = Pattern.compile("(.*)(?=(\\.(tar|zip))\\b)", Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE //$NON-NLS-1$ | Pattern.UNICODE_CASE); Matcher regexMatcher = regex.matcher(subjectString); if (regexMatcher.find()) { subjectString = regexMatcher.group(0); } return subjectString.trim(); } private void setTopFolder(List<ExportFileResource> resourcesToExport, String topFolder) { if (resourcesToExport != null) { for (ExportFileResource fileResource : resourcesToExport) { String directory = fileResource.getDirectoryName(); fileResource.setDirectoryName(topFolder + SEPERATOR + directory); } } } /** * Answer the string to display in self as the destination type. * * @return java.lang.String */ @Override protected String getDestinationLabel() { return ""; //$NON-NLS-1$ } /** * Returns resources to be exported. This returns file - for just the files use getSelectedResources. * * @return a collection of resources currently selected for export (element type: <code>IResource</code>) * @throws ProcessorException */ protected List<ExportFileResource> getExportResources(ExportFileResource p) throws ProcessorException { Item item = p.getItem(); Resource eResource = item.eResource(); Property property = item.getProperty(); if (eResource == null && property != null) { IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); try { IRepositoryViewObject newViewObj = factory.getLastVersion(property.getId()); Item newItem = newViewObj.getProperty().getItem(); p.setProcess((ProcessItem) newItem); } catch (PersistenceException e) { log.error(e.getMessage(), e); } } return manager.getExportResources(new ExportFileResource[] { p }); } protected List<ExportFileResource> getExportResources() throws ProcessorException { return manager.getExportResources(process); } /** * set the destinationValue for each job */ protected void setDesValueForJob(ExportFileResource p) { JobDeploymentInfo jobInfo = getJobDeploymentInfo(p); if (jobInfo != null) { String path = getDestinationValue(p); jobInfo.setDescValue(path); } } private JobDeploymentInfo getJobDeploymentInfo(ExportFileResource p) { for (JobDeploymentInfo jobInfo : jobInfoList) { Item item = p.getItem(); if (item instanceof ProcessItem) { String name = getProcessName(p); if (jobInfo.getJobLabelName().equals(name)) { return jobInfo; } } } return null; } private Map<ExportChoice, Object> getExportChoiceMap(boolean needContextScript) { Map<ExportChoice, Object> exportChoiceMap = new EnumMap<ExportChoice, Object>(ExportChoice.class); // zip exportChoiceMap.put(ExportChoice.needLauncher, true); exportChoiceMap.put(ExportChoice.needSystemRoutine, true); exportChoiceMap.put(ExportChoice.needUserRoutine, true); exportChoiceMap.put(ExportChoice.needTalendLibraries, true); exportChoiceMap.put(ExportChoice.needJobItem, true); // exportChoiceMap.put(ExportChoice.needSourceCode, true); exportChoiceMap.put(ExportChoice.needDependencies, true); exportChoiceMap.put(ExportChoice.needJobScript, true); exportChoiceMap.put(ExportChoice.needContext, true); exportChoiceMap.put(ExportChoice.applyToChildren, true); exportChoiceMap.put(ExportChoice.needDependencies, true); exportChoiceMap.put(ExportChoice.needContext, needContextScript); return exportChoiceMap; } /** * Answer the contents of self's destination specification widget. If this value does not have a suffix then add it * first. */ @Override protected String getDestinationValue() { IPath tempPath; tempPath = Path.fromOSString(CorePlugin.getDefault().getPreferenceStore() .getString(ITalendCorePrefConstants.FILE_PATH_TEMP)); return tempPath.toOSString(); } protected String getDestinationValue(ExportFileResource p) { String filename = getProcessName(p) + UNDERLINE + getProcessVersion(p) + EXT_ZIP; IPath tempPath; tempPath = Path.fromOSString(CorePlugin.getDefault().getPreferenceStore() .getString(ITalendCorePrefConstants.FILE_PATH_TEMP)); tempPath = tempPath.append(filename); return tempPath.toOSString(); } /** * Open an appropriate destination browser so that the user can specify a source to import from. */ @Override protected void handleDestinationBrowseButtonPressed() { FileDialog dialog = new FileDialog(getContainer().getShell(), SWT.SAVE); dialog.setFilterExtensions(new String[] { "*.zip", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$ dialog.setText(BLANK); String currentSourceString = getDestinationValue(); int lastSeparatorIndex = currentSourceString.lastIndexOf(File.separator); if (lastSeparatorIndex != -1) { dialog.setFilterPath(currentSourceString.substring(0, lastSeparatorIndex)); } String selectedFileName = dialog.open(); if (selectedFileName != null) { setErrorMessage(null); setDestinationValue(selectedFileName); } } /** * Hook method for saving widget values for restoration by the next instance of this class. */ @Override protected void internalSaveWidgetValues() { } /** * Hook method for restoring widget values to the values that they held last time this wizard was used to * completion. */ @Override protected void restoreWidgetValues() { } /* * (non-Javadoc) * * @see org.eclipse.ui.wizards.datatransfer.WizardFileSystemResourceExportPage1#destinationEmptyMessage() */ @Override protected String destinationEmptyMessage() { return BLANK; } @Override protected void createOptionsGroup(Composite parent) { // options group Group optionsGroup = new Group(parent, SWT.NONE); GridLayout layout = new GridLayout(); optionsGroup.setLayout(layout); optionsGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL)); optionsGroup.setText(Messages.DeployOnMDMExportWizardPage_Settings); optionsGroup.setFont(parent.getFont()); createOptionsGroupButtons(optionsGroup); } private SpagoBiServer toSpagoBiServer(MDMServerDef serverDef) { SpagoBiServer spagoBiServer = PropertiesFactory.eINSTANCE.createSpagoBiServer(); spagoBiServer.setShortDescription(serverDef.getName()); spagoBiServer.setHost(serverDef.getHost()); spagoBiServer.setPort(serverDef.getPort()); spagoBiServer.setLogin(serverDef.getUser()); spagoBiServer.setPassword(serverDef.getPasswd()); return spagoBiServer; } /* * (non-Javadoc) * * @see org.eclipse.ui.internal.wizards.datatransfer.WizardFileSystemResourceExportPage1#validateDestinationGroup() */ @Override protected boolean validateDestinationGroup() { return true; } public SpagoBiServer getMdmServer() { return this.mdmServer; } public RuntimeException getDeployException() { return deployException; } private void recordDeployException(RuntimeException e) { this.deployException = e; } private void setDeploySucceed(boolean succeed) { this.isDeploySucceed = succeed; } public boolean isDeploySucceed() { return isDeploySucceed; } }