Index: src/test/java/hudson/plugins/twitter/ShouldIncludeURLTest.java =================================================================== --- src/test/java/hudson/plugins/twitter/ShouldIncludeURLTest.java (Revision 29189) +++ src/test/java/hudson/plugins/twitter/ShouldIncludeURLTest.java (Arbeitskopie) @@ -11,7 +11,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.includeUrl = true; - TwitterPublisher pub = new TwitterPublisher(null, null, null, null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, null, null); Assert.assertTrue(pub.shouldIncludeUrl()); ReflectionHelper.setField(pub, "includeUrl", Boolean.FALSE); @@ -25,7 +25,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.includeUrl = false; - TwitterPublisher pub = new TwitterPublisher(null, null, null, null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, null, null); Assert.assertFalse(pub.shouldIncludeUrl()); Index: src/test/java/hudson/plugins/twitter/ShouldTweetTest.java =================================================================== --- src/test/java/hudson/plugins/twitter/ShouldTweetTest.java (Revision 29189) +++ src/test/java/hudson/plugins/twitter/ShouldTweetTest.java (Arbeitskopie) @@ -20,7 +20,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.onlyOnFailureOrRecovery = true; - TwitterPublisher pub = new TwitterPublisher(null, null, null, null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, null, null); assertLimitedTweets(pub); } @@ -29,7 +29,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.onlyOnFailureOrRecovery = true; - TwitterPublisher pub = new TwitterPublisher(null, null, "false", null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, "false", null); assertAlwaysTweet(pub); } @@ -38,7 +38,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.onlyOnFailureOrRecovery = true; - TwitterPublisher pub = new TwitterPublisher(null, null, "true", null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, "true", null); assertLimitedTweets(pub); } @@ -47,7 +47,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.onlyOnFailureOrRecovery = false; - TwitterPublisher pub = new TwitterPublisher(null, null, null, null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, null, null); assertAlwaysTweet(pub); } @@ -56,7 +56,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.onlyOnFailureOrRecovery = false; - TwitterPublisher pub = new TwitterPublisher(null, null, "false", null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, "false", null); assertAlwaysTweet(pub); } @@ -65,7 +65,7 @@ DescriptorImpl descriptor = hudson.getDescriptorByType(DescriptorImpl.class); descriptor.onlyOnFailureOrRecovery = false; - TwitterPublisher pub = new TwitterPublisher(null, null, "true", null); + TwitterPublisher pub = new TwitterPublisher(null, null, null, "true", null); assertLimitedTweets(pub); } Index: src/main/java/hudson/plugins/twitter/TwitterPublisher.java =================================================================== --- src/main/java/hudson/plugins/twitter/TwitterPublisher.java (Revision 29189) +++ src/main/java/hudson/plugins/twitter/TwitterPublisher.java (Arbeitskopie) @@ -39,6 +39,7 @@ /** * @author cactusman * @author justinedelson + * @author matthub */ public class TwitterPublisher extends Notifier { @@ -49,21 +50,23 @@ private String id; private String password; + private String url; private Boolean onlyOnFailureOrRecovery; private Boolean includeUrl; - private TwitterPublisher(String id, String password, Boolean onlyOnFailureOrRecovery, + private TwitterPublisher(String id, String password, String url, Boolean onlyOnFailureOrRecovery, Boolean includeUrl) { this.onlyOnFailureOrRecovery = onlyOnFailureOrRecovery; this.includeUrl = includeUrl; this.id = id; this.password = password; + this.url = url; } @DataBoundConstructor - public TwitterPublisher(String id, String password, String onlyOnFailureOrRecovery, + public TwitterPublisher(String id, String password, String url, String onlyOnFailureOrRecovery, String includeUrl) { - this(cleanToString(id), cleanToString(password), cleanToBoolean(onlyOnFailureOrRecovery), + this(cleanToString(id), cleanToString(password), cleanToString(url), cleanToBoolean(onlyOnFailureOrRecovery), cleanToBoolean(includeUrl)); } @@ -114,13 +117,18 @@ public BuildStepMonitor getRequiredMonitorService() { return BuildStepMonitor.BUILD; } + + public String getUrl() + { + return url; + } @Override public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener) { if (shouldTweet(build)) { try { String newStatus = createTwitterStatusMessage(build); - ((DescriptorImpl) getDescriptor()).updateTwit(id, password, newStatus); + ((DescriptorImpl) getDescriptor()).updateTwit(url, id, password, newStatus); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Unable to send tweet.", e); } @@ -233,6 +241,7 @@ public String id; public String password; public String hudsonUrl; + public String url; public boolean onlyOnFailureOrRecovery; public boolean includeUrl; @@ -246,7 +255,8 @@ // set the booleans to false as defaults includeUrl = false; onlyOnFailureOrRecovery = false; - + url = ""; + req.bindParameters(this, "twitter."); hudsonUrl = Mailer.descriptor().getUrl(); save(); @@ -255,7 +265,7 @@ @Override public String getDisplayName() { - return "Twitter"; + return "Twitter/StatusNet"; } public String getId() { @@ -277,6 +287,11 @@ public boolean isOnlyOnFailureOrRecovery() { return onlyOnFailureOrRecovery; } + + public String getBaseRestUrl() + { + return url; + } @SuppressWarnings("unchecked") @Override @@ -291,18 +306,29 @@ hudsonUrl = Functions.inferHudsonURL(req); save(); } + if (url == null) + { + // if base URL is not configured yet, infer some default + url = "http://api.twitter.com/1/"; + save(); + } return super.newInstance(req, formData); } - public void updateTwit(String id, String password, String message) throws Exception { + public void updateTwit(String baseUrl, String id, String password, String message) throws Exception { if (id == null || password == null) { id = this.id; password = this.password; } + + if (baseUrl == null) + { + baseUrl = this.url; + } - LOGGER.info("Attempting to update Twitter status to: " + message); + LOGGER.info("Attempting to update status to: " + message + " (server: " + baseUrl + ")"); - AsyncTwitter twitter = new AsyncTwitter(id,password); + AsyncTwitter twitter = new AsyncTwitter(id,password,baseUrl); twitter.updateStatusAsync(message, new TwitterAdapter() { @Override public void onException(TwitterException e, int method) { Index: src/main/resources/hudson/plugins/twitter/TwitterPublisher/config.jelly =================================================================== --- src/main/resources/hudson/plugins/twitter/TwitterPublisher/config.jelly (Revision 29189) +++ src/main/resources/hudson/plugins/twitter/TwitterPublisher/config.jelly (Arbeitskopie) @@ -1,6 +1,6 @@ <j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form"> <f:advanced> - <f:entry title="Only Tweet on Failure or Recovery?" help="/plugin/twitter/help-project-failure.html"> + <f:entry title="Only Tweet on Failure or Recovery?" help="/plugin/twitter-statusnet/help-project-failure.html"> <select class="setting-input validated" name="twitter.onlyOnFailureOrRecovery"> <option>(System Default)</option> <f:option selected="${instance.onlyOnFailureOrRecovery==true}">Yes</f:option> @@ -8,7 +8,7 @@ </select> </f:entry> - <f:entry title="Include Build Url?" help="/plugin/twitter/help-project-url.html"> + <f:entry title="Include Build Url?" help="/plugin/twitter-statusnet/help-project-url.html"> <select class="setting-input validated" name="twitter.includeUrl"> <option>(System Default)</option> <f:option selected="${instance.includeUrl==true}">Yes</f:option> @@ -16,11 +16,14 @@ </select> </f:entry> - <f:entry title="ID" help="/plugin/twitter/help-project-id.html"> + <f:entry title="ID" help="/plugin/twitter-statusnet/help-project-id.html"> <input class="setting-input" name="twitter.id" type="text" value="${instance.id}" /> </f:entry> - <f:entry title="Password" help="/plugin/twitter/help-project-password.html"> + <f:entry title="Password" help="/plugin/twitter-statusnet/help-project-password.html"> <input class="setting-input" name="twitter.password" type="password" value="${instance.password}" /> </f:entry> + <f:entry title="API URL" help="/plugin/twitter-statusnet/help-project-base-url.html"> + <input class="setting-input" name="twitter.url" type="text" value="${instance.url}" /> + </f:entry> </f:advanced> </j:jelly> \ No newline at end of file Index: src/main/resources/hudson/plugins/twitter/TwitterPublisher/global.jelly =================================================================== --- src/main/resources/hudson/plugins/twitter/TwitterPublisher/global.jelly (Revision 29189) +++ src/main/resources/hudson/plugins/twitter/TwitterPublisher/global.jelly (Arbeitskopie) @@ -2,20 +2,24 @@ xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form"> <f:section title="Global Twitter Settings"> - <f:entry title="ID" help="/plugin/twitter/help-global-id.html"> + <f:entry title="ID" help="/plugin/twitter-statusnet/help-global-id.html"> <input class="setting-input" name="twitter.id" type="text" value="${descriptor.id}" /> </f:entry> - <f:entry title="Password" help="/plugin/twitter/help-global-password.html"> + <f:entry title="Password" help="/plugin/twitter-statusnet/help-global-password.html"> <input class="setting-input" name="twitter.password" type="password" value="${descriptor.password}" /> </f:entry> - - <f:entry title="Only Tweet on Failure or Recovery?" help="/plugin/twitter/help-global-failure.html"> + <f:entry title="API URL" help="/plugin/twitter-statusnet/help-global-base-url.html"> + <input class="setting-input" name="twitter.url" + type="text" value="${descriptor.url}" /> + </f:entry> + + <f:entry title="Only Tweet on Failure or Recovery?" help="/plugin/twitter-statusnet/help-global-failure.html"> <f:checkbox name="twitter.onlyOnFailureOrRecovery" checked="${descriptor.onlyOnFailureOrRecovery}" /> </f:entry> - <f:entry title="Include the Build URL in the Tweet?" help="/plugin/twitter/help-global-url.html"> + <f:entry title="Include the Build URL in the Tweet?" help="/plugin/twitter-statusnet/help-global-url.html"> <f:checkbox name="twitter.includeUrl" checked="${descriptor.includeUrl}" /> </f:entry> Index: src/main/resources/index.jelly =================================================================== --- src/main/resources/index.jelly (Revision 29189) +++ src/main/resources/index.jelly (Arbeitskopie) @@ -1,3 +1,3 @@ <div> - This plugin is a Twitter Plugin. + This plugin is a Twitter/StatusNet Plugin. </div> \ No newline at end of file Index: pom.xml =================================================================== --- pom.xml (Revision 29189) +++ pom.xml (Arbeitskopie) @@ -7,14 +7,14 @@ <relativePath>../pom.xml</relativePath> </parent> - <artifactId>twitter</artifactId> + <artifactId>twitter-statusnet</artifactId> <packaging>hpi</packaging> - <version>0.5-SNAPSHOT</version> - <name>Twitter plugin</name> + <version>0.1-SNAPSHOT</version> + <name>Twitter/StatusNet plugin</name> <description> - Plugin for Hudson that adds tweets to Twitter (http://www.twitter.com/) for build events. + Plugin for Hudson that adds tweets to Twitter (http://www.twitter.com/) or an arbitrary StatusNet (http://status.net/) for build events. </description> - <url>http://wiki.hudson-ci.org/display/HUDSON/Twitter+Plugin</url> + <url>http://wiki.hudson-ci.org/display/HUDSON/Twitter+StatusNet+Plugin</url> <dependencies> <dependency>