diff options
Diffstat (limited to 'basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src_rss/org/eclipse/releng/services/rss/RSSFeedPublisherTask.java')
-rw-r--r-- | basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src_rss/org/eclipse/releng/services/rss/RSSFeedPublisherTask.java | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src_rss/org/eclipse/releng/services/rss/RSSFeedPublisherTask.java b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src_rss/org/eclipse/releng/services/rss/RSSFeedPublisherTask.java new file mode 100644 index 0000000..b26e7f9 --- /dev/null +++ b/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.build.tools/src_rss/org/eclipse/releng/services/rss/RSSFeedPublisherTask.java @@ -0,0 +1,236 @@ +/******************************************************************************* + * Copyright (c) 2005, 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.releng.services.rss; + +//TODO: enable support for running task on Windows (problems with ssh, scp, cvs) +//TODO: enable support for connecting to Windows server? (`mkdir -p` not supported) + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Task; + +import org.eclipse.releng.util.rss.Messages; +import org.eclipse.releng.util.rss.RSSFeedUtil; + +/** + * Parameters: + * debug - more output to console - eg., 0|1|2 + * + * file - path to the XML file that will be published - eg., /path/to/file.to.publish.xml + * + * cvsExec - path to the executable for cvs, eg., /usr/bin/cvs + * cvsRoot - cvs root used to commit the file - eg., username@cvsserver:/cvsroot/path + * cvsPath - cvs module to update - eg., project/news/ (into which builds.xml would go) + * cvsTemp - path to the temp folder to use for cvs checkout + * + * scpExec - path to the executable for scp, eg., /usr/bin/scp + * scpTarget - scp target path for publishing the file - eg., username@server:/path/to/target/file.xml + * + * Optionally, if the target folder might not exist, you can use ssh to create it before scp'ing + * sshExec - path to the executable for ssh, eg., /usr/bin/ssh + * + * @author nickb + * + */ +public class RSSFeedPublisherTask extends Task { + + private int debug = 0; + + private static final String CL = ":"; //$NON-NLS-1$ + private static final String FS = File.separator; + private static final String SP = " "; //$NON-NLS-1$ + + // default values for optional fields + private static final String DEFAULT_CVSTemp = "/tmp/tmp-RSSFeedPublisherTask"; //$NON-NLS-1$ + private static final String DEFAULT_CVSExec = "cvs"; //$NON-NLS-1$ + private static final String DEFAULT_SCPExec = "scp"; //$NON-NLS-1$ + + private static final RSSFeedUtil util = new RSSFeedUtil(); + + //required fields + private File file; + + // required if doing CVS + private String CVSExec; + private String CVSRoot; + private String CVSPath; + private String CVSTemp; + + // required if doing SCP + private String SCPExec; + private String SCPTarget; + + // required if doing SCP and target dir may not already exist + private String SSHExec; + + //optional + public void setDebug(int debug) { this.debug = debug; } + + //required + public void setFile(String file) { + if (!isNullString(file)) { this.file = new File(file); } + } + + //required for CVS commit (with default) + public void setCVSExec(String CVSExec) { + if (!isNullString(CVSExec)) { + this.CVSExec = CVSExec; + } else { + this.CVSExec = DEFAULT_CVSExec; + } + } + + //required for CVS commit + public void setCVSRoot(String CVSRoot) { this.CVSRoot = CVSRoot; } + public void setCVSPath(String CVSPath) { this.CVSPath = CVSPath; } + + //required for CVS commit (with default) + public void setCVSTemp(String CVSTemp) { + if (!isNullString(CVSTemp)) { + this.CVSTemp = CVSTemp; + } else { + this.CVSTemp = DEFAULT_CVSTemp; + } + } + + //required for CVS commit (with default) + public void setSCPExec(String SCPExec) { + if (!isNullString(SCPExec)) { + this.SCPExec = SCPExec; + } else { + this.SCPExec = DEFAULT_SCPExec; + } + } + public void setSCPTarget(String SCPTarget) { this.SCPTarget = SCPTarget; } + + // required if doing SCP and target dir may not already exist (with default, not assigned) + public void setSSHExec(String SSHExec) { + this.SSHExec = SSHExec; + } + + // The method executing the task + public void execute() throws BuildException { + + if (file==null || !file.exists() || !file.isFile()) { + System.err.println(Messages.getString("RSSFeedPublisherTask.ErrorInvalidFile") + CL + SP + file + "!"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + if (debug>0) { System.out.println(Messages.getString("RSSFeedPublisherTask.Publish") + SP + file); } //$NON-NLS-1$ + if ((!isNullString(CVSRoot) && !isNullString(CVSPath)) || !isNullString(SCPTarget)) { + if ((!isNullString(CVSRoot) && !isNullString(CVSPath))) { + commitFeedToCVS(); + } + if (!isNullString(SCPTarget)) { + publishFeedWithSCP(); + } + } else { + System.err.println(Messages.getString("RSSFeedPublisherTask.ErrorNothingToDo")); //$NON-NLS-1$ + } + } + } + + private void commitFeedToCVS() + { + if (debug>1) { + System.out.println(Messages.getString("RSSFeedPublisherTask.UsingCVSRoot") + SP + CVSRoot); //$NON-NLS-1$ + System.out.println(Messages.getString("RSSFeedPublisherTask.UsingCVSPath") + SP + CVSPath); //$NON-NLS-1$ + } +// <!-- 3. get filename (eg., builds.xml) from file (which could include a path, eg. ./data/news/builds.xml) --> +// <pathconvert property="filename"><path path="${file}"/><mapper type="flatten"/></pathconvert> + String filename = file.getName(); + +// <!-- 4. create target temp folder & check out existing version from CVS --> +// <mkdir dir="${cvsTemp}"/> + File CVSTempDir = new File(CVSTemp); + if (CVSTempDir.isFile()) { // if dir exists as a file, we need a new tmp folder name + CVSTemp += ".tmp"; //$NON-NLS-1$ + CVSTempDir = new File(CVSTemp); + } + if (CVSTempDir.isDirectory()) { + if (!CVSTempDir.delete()) { + System.err.println(Messages.getString("RSSFeedPublisherTask.ErrorCouldNotDeleteTempFolder") + SP + CVSTempDir); //$NON-NLS-1$ + } + } + CVSTempDir.mkdir(); + if (debug>1) { + System.out.println(Messages.getString("RSSFeedPublisherTask.UsingCVSTemp") + SP + CVSTempDir); //$NON-NLS-1$ + } + +// <exec executable="${cvsExec}" dir="${cvsTemp}"><arg line="-d ${cvsRoot} co -d checkoutDir ${cvsPath}"/></exec> + runCVSExecTask("co -d checkoutDir" + SP + CVSPath, CVSTemp); //$NON-NLS-1$ + +// <!-- 5. check if the file already exists in CVS to see if we need to add it --> +// <available file="${cvsTemp}/checkoutDir/${filename}" type="file" property="fileInCVS"/> + File destFile = new File(CVSTemp + FS + "checkoutDir" + FS + filename); //$NON-NLS-1$ + boolean fileInCVS = destFile.isFile(); + +// <!-- 6. overwrite CVS copy with new version; or if new, copy file to destination for add then check-in --> +// <copy file="../${file}" overwrite="true" todir="${cvsTemp}/checkoutDir"/> + try + { + RSSFeedUtil.transferData(new FileInputStream(file),new FileOutputStream(destFile)); + } + catch (FileNotFoundException e) + { + e.printStackTrace(); + } + catch (IOException e) + { + e.printStackTrace(); + } + +// <!-- 7. add to CVS (if new) --> +// <antcall target="addFileToCVS"/> +// <!-- 7. Add file to CVS (if file is new) --> +// <target name="addFileToCVS" depends="init" unless="fileInCVS" description="Add file to CVS (if file is new)"> +// <exec executable="${cvsExec}" dir="${cvsTemp}/checkoutDir"><arg line="-d ${cvsRoot} add ${filename}"/></exec> +// </target> + if (!fileInCVS) { + runCVSExecTask("add " + filename, CVSTemp + FS + "checkoutDir"); //$NON-NLS-1$ //$NON-NLS-2$ + } + +// <!-- 8. check in file --> +// <exec executable="${cvsExec}" dir="${cvsTemp}/checkoutDir"><arg line="-d ${cvsRoot} ci -m '' ${filename}"/></exec> + runCVSExecTask("ci -m '' " + filename, CVSTemp + FS + "checkoutDir"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + private void publishFeedWithSCP() + { + if (debug>1) { + System.out.println(Messages.getString("RSSFeedPublisherTask.PublishToSCPTarget") + SP + SCPTarget); //$NON-NLS-1$ + } + +// <exec executable="${sshExec}"><arg line="${sshMakeDirCommand}"/></exec> + if (!isNullString(SSHExec) && SCPTarget.indexOf(CL)>0) { + String userAtHost = SCPTarget.substring(0, SCPTarget.indexOf(CL)); + String targetPath = SCPTarget.substring(SCPTarget.indexOf(CL)+1,SCPTarget.lastIndexOf(FS)); + util.runExecTask(SSHExec, userAtHost + " \"mkdir -p" + SP + targetPath + "\"", null); //$NON-NLS-1$ //$NON-NLS-2$ + } + +// <exec executable="${scpExec}" dir="../"><arg line="${file} ${scpTarget}"/></exec> + util.runExecTask(SCPExec, file.toString() + SP + SCPTarget, null); + } + + private void runCVSExecTask(String task, String dir) + { + util.runExecTask(CVSExec, "-d " + CVSRoot + " -q " + task, dir); //$NON-NLS-1$ //$NON-NLS-2$ + } + + private static boolean isNullString(String str) + { + return RSSFeedUtil.isNullString(str); + } + +}
\ No newline at end of file |