/******************************************************************************** * CruiseControl, a Continuous Integration Toolkit * Copyright (c) 2008, Paul Julius * PO Box 1812 * N Sioux City, SD 57049 * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * + Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * + Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the * names of its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************************/ package net.sourceforge.cruisecontrol.sourcecontrols; import net.sourceforge.cruisecontrol.CruiseControlException; import net.sourceforge.cruisecontrol.Modification; import net.sourceforge.cruisecontrol.util.ValidationHelper; import org.apache.ivy.Ivy; import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.log4j.Logger; import java.io.File; import java.io.IOException; import java.net.URL; import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; /** * A sourcecontrol implementation that monitors artifacts in an Ivy repository. * * @author <a href="mailto:paul@willowbark.com">Paul Julius</a> */ public class IvySourceControl extends FakeUserSourceControl { private static final Logger LOG = Logger.getLogger(IvySourceControl.class); private File ivyXml = new File("ivy.xml"); private File ivySettings = new File("ivysettings.xml"); /** * @param now IGNORED */ @Override public List<Modification> getModifications(final Date lastBuild, final Date now) { try { return getModifications(lastBuild, artifacts()); } catch (Exception e) { LOG.error(e.getMessage()); } return Collections.emptyList(); } @Override public void validate() throws CruiseControlException { ValidationHelper.assertExists(ivyXml, "ivyXml", getClass()); ValidationHelper.assertExists(ivySettings, "ivySettings", getClass()); } protected List<Modification> getModifications(final Date lastBuild, final Collection<Artifact> artifacts) { if (artifacts == null) { throw new IllegalArgumentException("Cannot process null artifact collection"); } final ArrayList<Modification> mods = new ArrayList<Modification>(); for (Artifact artifact : artifacts) { if (artifact.getPublicationDate().compareTo(lastBuild) > 0) { mods.add(modificationFor(artifact)); } } return mods; } @SuppressWarnings ("unchecked") Collection<Artifact> artifacts() throws IOException, ParseException { final Ivy ivy = Ivy.newInstance(); ivy.configure(ivySettings.toURI().toURL()); return ivy.resolve(ivyXml.toURI().toURL()).getArtifacts(); } private Modification modificationFor(final Artifact artifact) { final Modification modification = new Modification("ivy", getUserName(), "", null, artifact.getPublicationDate(), artifact.getId().toString(), new ArrayList<Modification.ModifiedFile>()); final Modification.ModifiedFile modfile = modification.createModifiedFile(artifact.getName(), folderFor(artifact.getUrl(), artifact.getName())); modfile.action = "change"; return modification; } private String folderFor(final URL url, final String name) { return url.toString().replace("/" + name, ""); } public String getIvyXml() { return ivyXml.getAbsolutePath(); } public void setIvyXml(final String ivyXml) { this.ivyXml = new File(ivyXml); } public void setIvySettings(final String ivySettings) { this.ivySettings = new File(ivySettings); } public String getIvySettings() { return ivySettings.getAbsolutePath(); } }