package hudson.plugins.accurev.cmd; import hudson.EnvVars; import hudson.FilePath; import hudson.Launcher; import hudson.model.TaskListener; import hudson.plugins.accurev.AccurevLauncher; import hudson.plugins.accurev.AccurevSCM; import hudson.plugins.accurev.AccurevSCM.AccurevServer; import hudson.plugins.accurev.AccurevStream; import hudson.plugins.accurev.XmlParserFactory; import hudson.plugins.accurev.parsers.xml.ParseShowStreams; import hudson.util.ArgumentListBuilder; import hudson.util.ComboBoxModel; import jenkins.model.Jenkins; import org.xmlpull.v1.XmlPullParserFactory; import javax.annotation.CheckForNull; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.logging.Logger; import java.util.stream.Collectors; public class ShowStreams extends Command { private static final Logger LOGGER = Logger.getLogger(ShowStreams.class.getName()); @CheckForNull public static Map<String, AccurevStream> getStreams(// final AccurevSCM scm, // final String nameOfStreamRequired, // final AccurevServer server, // final EnvVars accurevEnv, // final FilePath workspace, // final TaskListener listener, // final Launcher launcher) throws IOException { final Map<String, AccurevStream> streams; if (scm.isIgnoreStreamParent()) { streams = getOneStream(nameOfStreamRequired, accurevEnv, workspace, listener, launcher, scm); } else if (server.isUseRestrictedShowStreams()) { streams = getAllAncestorStreams(nameOfStreamRequired, scm, accurevEnv, workspace, listener, launcher); } else { streams = getAllStreams(scm, server, scm.getDepot(), scm.getOptionalLock(), accurevEnv, workspace, listener, launcher); } return streams; } public static Map<String, AccurevStream> getAllStreams(// AccurevSCM scm, final AccurevServer server, // final String depot, // final Lock lock, // final EnvVars accurevEnv, // final FilePath workspace, // final TaskListener listener, // final Launcher launcher) throws IOException { final ArgumentListBuilder cmd = new ArgumentListBuilder(); String accurevTool = scm == null ? null : scm.getAccurevTool(); cmd.add("show"); addServer(cmd, server); cmd.add("-fx"); cmd.add("-p"); cmd.add(depot); cmd.add("streams"); XmlPullParserFactory parser = XmlParserFactory.getFactory(); if (parser == null) throw new IOException("No XML Parser"); final Map<String, AccurevStream> streams = AccurevLauncher.runCommand("Show streams command", accurevTool, launcher, cmd, lock, accurevEnv, workspace, listener, LOGGER, parser, new ParseShowStreams(), depot); setParents(streams); return streams; } private static Map<String, AccurevStream> getAllAncestorStreams(// final String nameOfStreamRequired, // final AccurevSCM scm, final EnvVars accurevEnv, // final FilePath workspace, // final TaskListener listener, // final Launcher launcher) throws IOException { final Map<String, AccurevStream> streams = new HashMap<>(); String streamName = nameOfStreamRequired; while (streamName != null && !streamName.isEmpty()) { final Map<String, AccurevStream> oneStream = getOneStream(streamName, accurevEnv, workspace, listener, launcher, scm); final AccurevStream theStream = oneStream == null ? null : oneStream.get(streamName); streamName = null; if (theStream != null) { if (theStream.getBasisName() != null) { streamName = theStream.getBasisName(); } else if (theStream.getBasisNumber() != null) { streamName = theStream.getBasisNumber().toString(); } streams.putAll(oneStream); } } setParents(streams); return streams; } private static Map<String, AccurevStream> getOneStream(// final String streamName, // final EnvVars accurevEnv, // final FilePath workspace, // final TaskListener listener, // final Launcher launcher, AccurevSCM scm) throws IOException { final ArgumentListBuilder cmd = new ArgumentListBuilder(); cmd.add("show"); addServer(cmd, scm.getServer()); cmd.add("-fx"); cmd.add("-p"); cmd.add(scm.getDepot()); cmd.add("-s"); cmd.add(streamName); cmd.add("streams"); XmlPullParserFactory parser = XmlParserFactory.getFactory(); if (parser == null) throw new IOException("No XML Parser"); return AccurevLauncher.runCommand("Restricted show streams command", scm.getAccurevTool(), launcher, cmd, scm.getOptionalLock(), accurevEnv, workspace, listener, LOGGER, parser, new ParseShowStreams(), scm.getDepot()); } private static void setParents(Map<String, AccurevStream> streams) { //build the tree if (streams != null && streams.size() > 1) streams.values() .stream() .filter(stream -> stream.getBasisName() != null) .forEach(stream -> stream.setParent(streams.get(stream.getBasisName()))); } //Populating streams dynamically in the global config page public static ComboBoxModel getStreamsForGlobalConfig(// final AccurevServer server, final String depot, final ComboBoxModel cbm ) throws IOException { Jenkins jenkins = Jenkins.getInstance(); TaskListener listener = TaskListener.NULL; Launcher launcher = jenkins.createLauncher(listener); EnvVars accurevEnv = new EnvVars(); Map<String, AccurevStream> allStreams = getAllStreams(null, server, depot, null, accurevEnv, jenkins.getRootPath(), listener, launcher); if (allStreams == null) return cbm; if (allStreams.isEmpty()) return cbm; List<String> streamNames = allStreams .values() .stream() .map(AccurevStream::getName) .collect(Collectors.toList()); cbm.addAll(streamNames); Collections.sort(cbm); return cbm; } }