Java tutorial
// ============================================================================ // // Copyright (C) 2006-2015 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.designer.runprocess.maven; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.apache.commons.lang.ArrayUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.talend.commons.exception.ExceptionHandler; import org.talend.commons.utils.generation.JavaUtils; import org.talend.commons.utils.resource.FileExtensions; import org.talend.core.GlobalServiceRegister; import org.talend.core.model.process.IProcess; import org.talend.core.model.process.JobInfo; import org.talend.core.model.process.ProcessUtils; import org.talend.core.model.properties.ProcessItem; import org.talend.core.model.properties.Property; import org.talend.core.model.utils.JavaResourcesHelper; import org.talend.core.repository.utils.ItemResourceUtil; import org.talend.core.runtime.process.ITalendProcessJavaProject; import org.talend.core.runtime.process.TalendProcessArgumentConstant; import org.talend.core.runtime.process.TalendProcessOptionConstants; import org.talend.core.ui.ITestContainerProviderService; import org.talend.designer.maven.model.TalendMavenConstants; import org.talend.designer.maven.tools.ProjectPomManager; import org.talend.designer.maven.tools.creator.CreateMavenBundleTemplatePom; import org.talend.designer.maven.tools.creator.CreateMavenJobPom; import org.talend.designer.maven.tools.creator.CreateMavenTestPom; import org.talend.designer.maven.utils.PomUtil; import org.talend.designer.runprocess.ProcessorException; import org.talend.designer.runprocess.ProcessorUtilities; import org.talend.designer.runprocess.java.JavaProcessor; import org.talend.designer.runprocess.java.JavaProcessorUtilities; /** * created by ggu on 2 Feb 2015 Detailled comment * */ public class MavenJavaProcessor extends JavaProcessor { protected String windowsClasspath, unixClasspath; public MavenJavaProcessor(IProcess process, Property property, boolean filenameFromLabel) { super(process, property, filenameFromLabel); } @Override public void generateCode(boolean statistics, boolean trace, boolean javaProperties) throws ProcessorException { super.generateCode(statistics, trace, javaProperties); // only job, now for Shadow Process/Data Preview. if (isStandardJob()) { generatePom(); // removeGeneratedJobs(null); } updateProjectPom(null); } @Override public Set<JobInfo> getBuildChildrenJobs() { if (buildChildrenJobs == null || buildChildrenJobs.isEmpty()) { buildChildrenJobs = new HashSet<JobInfo>(); if (property != null) { Set<JobInfo> infos = ProcessorUtilities.getChildrenJobInfo((ProcessItem) property.getItem()); for (JobInfo jobInfo : infos) { if (jobInfo.isTestContainer() && !ProcessUtils.isOptionChecked(getArguments(), TalendProcessArgumentConstant.ARG_GENERATE_OPTION, TalendProcessOptionConstants.GENERATE_TESTS)) { continue; } buildChildrenJobs.add(jobInfo); } } } return this.buildChildrenJobs; } public void initJobClasspath() { String oldInterpreter = ProcessorUtilities.getInterpreter(); String oldCodeLocation = ProcessorUtilities.getCodeLocation(); String oldLibraryPath = ProcessorUtilities.getLibraryPath(); boolean oldExportConfig = ProcessorUtilities.isExportConfig(); Date oldExportTimestamp = ProcessorUtilities.getExportTimestamp(); try { // FIXME, must make sure the exportConfig is true, and the classpath is same as export. String routinesJarPath = getBaseLibPath() + JavaUtils.PATH_SEPARATOR + JavaUtils.ROUTINES_JAR + ProcessorUtilities.TEMP_JAVA_CLASSPATH_SEPARATOR; ProcessorUtilities.setExportConfig(JavaUtils.JAVA_APP_NAME, routinesJarPath, getBaseLibPath()); String contextName = JavaResourcesHelper.getJobContextName(this.context); setPlatformValues(Platform.OS_WIN32, contextName); setPlatformValues(Platform.OS_LINUX, contextName); // ProcessorUtilities.resetExportConfig(); because will set back, so no used } finally { ProcessorUtilities.setExportConfig(oldInterpreter, oldCodeLocation, oldLibraryPath, oldExportConfig, oldExportTimestamp); } } /** * * copied from JobScriptsManager.getCommandByTalendJob */ protected void setPlatformValues(String tp, String contextName) { try { // maybe should just reuse current processor's getCommandLine method. // use always use new way. String[] cmds = ProcessorUtilities.getCommandLine(false, tp, true, process, null, contextName, false, -1, -1); setValuesFromCommandline(tp, cmds); } catch (ProcessorException e) { ExceptionHandler.process(e); } } protected void setValuesFromCommandline(String tp, String[] cmds) { if (cmds == null || cmds.length == 0) { return; } String cpStr = null; int cpIndex = ArrayUtils.indexOf(cmds, JavaUtils.JAVA_CP); if (cpIndex > -1) { // found // return the cp values in the next index. cpStr = cmds[cpIndex + 1]; } if (Platform.OS_WIN32.equals(tp)) { this.windowsClasspath = cpStr; } else { this.unixClasspath = cpStr; } } @Override protected String getBasePathClasspath() throws ProcessorException { final boolean exportingJob = ProcessorUtilities.isExportConfig(); String basePathClasspath = super.getBasePathClasspath(); if (!exportingJob && isTestJob) { // for test job, need add the test-classes in classpath. final String classPathSeparator = extractClassPathSeparator(); ITalendProcessJavaProject tProcessJvaProject = this.getTalendJavaProject(); IFolder testClassesFolder = tProcessJvaProject.getTestOutputFolder(); String testOutputPath = testClassesFolder.getLocation().toPortableString(); basePathClasspath = testOutputPath + classPathSeparator + basePathClasspath; } return basePathClasspath; } @Override protected String getExportJarsStr() { if (isOldBuildJob()) { return super.getExportJarsStr(); } // use the maven way for jar final String libPrefixPath = getRootWorkingDir(true); final String classPathSeparator = extractClassPathSeparator(); // Test-0.1 String jarName = JavaResourcesHelper.getJobJarName(process.getName(), process.getVersion()); String exportJar = libPrefixPath + jarName + FileExtensions.JAR_FILE_SUFFIX; Set<JobInfo> infos = getBuildChildrenJobs(); for (JobInfo jobInfo : infos) { if (jobInfo.isTestContainer()) { continue; } String childJarName = JavaResourcesHelper.getJobJarName(jobInfo.getJobName(), jobInfo.getJobVersion()); exportJar += classPathSeparator + libPrefixPath + childJarName + FileExtensions.JAR_FILE_SUFFIX; } return exportJar; } /** * .Java/pom_TestJob_0.1.xml */ protected IFile getPomFile() { if (isStandardJob()) { String pomFileName = PomUtil.getPomFileName(this.getProperty().getLabel(), this.getProperty().getVersion()); return this.getTalendJavaProject().getProject().getFile(pomFileName); } else { // not standard job, won't have pom file. return null; } } /** * .Java/src/main/assemblies/assembly_TestJob_0.1.xml */ protected IFile getAssemblyFile() { if (isStandardJob()) { String assemblyFileName = PomUtil.getAssemblyFileName(this.getProperty().getLabel(), this.getProperty().getVersion()); return this.getTalendJavaProject().getAssembliesFolder().getFile(assemblyFileName); } else { // not standard job, won't have assembly file. return null; } } protected void generatePom() { initJobClasspath(); try { CreateMavenBundleTemplatePom createTemplatePom = createMavenTemplatePom(); if (createTemplatePom != null) { createTemplatePom.setOverwrite(true); createTemplatePom.create(null); } } catch (Exception e) { ExceptionHandler.process(e); } } protected CreateMavenBundleTemplatePom createMavenTemplatePom() { boolean isTestContainer = false; if (GlobalServiceRegister.getDefault().isServiceRegistered(ITestContainerProviderService.class)) { ITestContainerProviderService testContainerService = (ITestContainerProviderService) GlobalServiceRegister .getDefault().getService(ITestContainerProviderService.class); if (testContainerService != null) { isTestContainer = testContainerService.isTestContainerItem(this.getProperty().getItem()); } } CreateMavenBundleTemplatePom createMavenPom = null; if (!isTestContainer) { CreateMavenJobPom createTemplatePom = new CreateMavenJobPom(this, getPomFile()); createTemplatePom.setUnixClasspath(this.unixClasspath); createTemplatePom.setWindowsClasspath(this.windowsClasspath); createTemplatePom.setAssemblyFile(getAssemblyFile()); IPath itemLocationPath = ItemResourceUtil.getItemLocationPath(this.getProperty()); IFolder objectTypeFolder = ItemResourceUtil.getObjectTypeFolder(this.getProperty()); if (itemLocationPath != null && objectTypeFolder != null) { IPath itemRelativePath = itemLocationPath.removeLastSegments(1) .makeRelativeTo(objectTypeFolder.getLocation()); createTemplatePom.setObjectTypeFolder(objectTypeFolder); createTemplatePom.setItemRelativePath(itemRelativePath); } createMavenPom = createTemplatePom; } else { createMavenPom = new CreateMavenTestPom(this, getPomFile()); } createMavenPom.setArgumentsMap(getArguments()); return createMavenPom; } /** * update the project pom, and make sure the standard or fake(Preview/Data view) job can be compiled still. */ protected void updateProjectPom(IProgressMonitor monitor) { try { if (monitor == null) { monitor = new NullProgressMonitor(); } JavaProcessorUtilities.checkJavaProjectLib(getNeededModules()); ProjectPomManager pomManager = new ProjectPomManager(getTalendJavaProject().getProject()) { @Override protected boolean isStandardJob() { return MavenJavaProcessor.this.isStandardJob(); } @Override protected IFile getBasePomFile() { return MavenJavaProcessor.this.getPomFile(); } }; pomManager.setUpdateModules(isStandardJob()); // won't update module for fake job. pomManager.update(monitor, this); } catch (Exception e) { ExceptionHandler.process(e); } } @Override public void build(IProgressMonitor monitor) throws Exception { final ITalendProcessJavaProject talendJavaProject = getTalendJavaProject(); final Map<String, Object> argumentsMap = new HashMap<String, Object>(); argumentsMap.put(TalendProcessArgumentConstant.ARG_GOAL, getGoals()); talendJavaProject.buildModules(monitor, null, argumentsMap); // try { // // IFolder jobSrcFolder = talendJavaProject.getProject().getFolder(this.getSrcCodePath().removeLastSegments(1)); // if (jobSrcFolder.exists()) { // jobSrcFolder.refreshLocal(IResource.DEPTH_INFINITE, null); // } // if (isTestJob) { // talendJavaProject.getTestOutputFolder().refreshLocal(IResource.DEPTH_INFINITE, null); // } else { // talendJavaProject.getOutputFolder().refreshLocal(IResource.DEPTH_INFINITE, null); // } // } catch (CoreException e) { // ExceptionHandler.process(e); // } } protected String getGoals() { if (isTestJob) { return TalendMavenConstants.GOAL_TEST_COMPILE; } return TalendMavenConstants.GOAL_COMPILE; } }