Author: tchemit Date: 2012-07-19 08:50:02 +0200 (Thu, 19 Jul 2012) New Revision: 319 Url: http://nuiton.org/repositories/revision/jredmine/319 Log: refs #2197: Can use api Key to connect to redmine (prepare api but do nothing in mojo...) Modified: branches/jredmine-1.x/jredmine-client/pom.xml branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/RedmineServiceConfiguration.java branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/model/ModelHelper.java branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRequestFactory.java branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRestClient.java branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/RedmineFixtures.java branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRequestFactoryTest.java branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRestClientTest.java branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/AbstractRedmineMojo.java branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/LoginMojo.java branches/jredmine-1.x/jredmine-maven-plugin/src/test/java/org/nuiton/jredmine/RedmineFixtures.java Modified: branches/jredmine-1.x/jredmine-client/pom.xml =================================================================== --- branches/jredmine-1.x/jredmine-client/pom.xml 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/pom.xml 2012-07-19 06:50:02 UTC (rev 319) @@ -74,6 +74,11 @@ </dependency> <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + </dependency> + + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> Modified: branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/RedmineServiceConfiguration.java =================================================================== --- branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/RedmineServiceConfiguration.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/RedmineServiceConfiguration.java 2012-07-19 06:50:02 UTC (rev 319) @@ -33,5 +33,8 @@ */ public interface RedmineServiceConfiguration extends RestClientConfiguration { + String getApiKey(); + void setApiKey(String apiKey); + } \ No newline at end of file Modified: branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/model/ModelHelper.java =================================================================== --- branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/model/ModelHelper.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/model/ModelHelper.java 2012-07-19 06:50:02 UTC (rev 319) @@ -86,6 +86,8 @@ public static final String LOGIN_REQUEST_NAME = "Login"; + public static final String LOGIN_BY_API_KEY_REQUEST_NAME = "LoginByAPiKey"; + public static final String LOGOUT_REQUEST_NAME = "Logout"; public static final String PING_REQUEST_NAME = "Ping"; Modified: branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRequestFactory.java =================================================================== --- branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRequestFactory.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRequestFactory.java 2012-07-19 06:50:02 UTC (rev 319) @@ -24,6 +24,7 @@ */ import com.google.common.base.Strings; +import com.google.common.collect.Maps; import org.nuiton.io.rest.AbstractRequestFactory; import org.nuiton.io.rest.RestMethod; import org.nuiton.io.rest.RestRequestBuilder; @@ -82,6 +83,24 @@ } }); + addRequestBuilder(new DefaultRequestBuilder(ModelHelper.LOGIN_BY_API_KEY_REQUEST_NAME, RestMethod.POST, "jredmine", "login") { + + private static final long serialVersionUID = 1L; + + @Override + public void checkRequestArgs(Object... args) { + checkRequestArgs(1, "apiKey", args); + } + + @Override + public Map<String, String> getHeaders(Object... args) { + Map<String, String> headers = Maps.newHashMap(); + String apiKey = (String) args[0]; + headers.put("X-Redmine-API-Key", apiKey); + return headers; + } + }); + // data with no scope requests addRequestBuilder(new DefaultRequestBuilder(ModelHelper.GET_ALL_PROJECT_REQUEST_NAME, RestMethod.GET, "jredmine", "get_projects.xml")); Modified: branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRestClient.java =================================================================== --- branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRestClient.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/src/main/java/org/nuiton/jredmine/rest/RedmineRestClient.java 2012-07-19 06:50:02 UTC (rev 319) @@ -29,11 +29,13 @@ import org.apache.commons.httpclient.StatusLine; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.codehaus.plexus.util.StringUtils; import org.nuiton.io.rest.RequestFactory; import org.nuiton.io.rest.RestClient; import org.nuiton.io.rest.RestClientConfiguration; import org.nuiton.io.rest.RestRequest; import org.nuiton.io.rest.RestSession; +import org.nuiton.jredmine.RedmineServiceConfiguration; import org.nuiton.jredmine.model.ModelHelper; import java.io.IOException; @@ -130,10 +132,21 @@ protected void login(RestSession session) throws IOException { - RestRequest request = getRequest(ModelHelper.LOGIN_REQUEST_NAME, - configuration.getRestUsername(), - configuration.getRestPassword()); + RestRequest request; + String apiKey = getConfiguration().getApiKey(); + boolean useApiKey = StringUtils.isNotBlank(apiKey); + if (useApiKey) { + // use api key to login + request = getRequest(ModelHelper.LOGIN_BY_API_KEY_REQUEST_NAME, + apiKey); + } else { + // use normal login / password + request = getRequest(ModelHelper.LOGIN_REQUEST_NAME, + configuration.getRestUsername(), + configuration.getRestPassword()); + } + HttpMethod gm = session.doRequest(request); StatusLine sl = gm.getStatusLine(); @@ -153,4 +166,8 @@ } + @Override + public RedmineServiceConfiguration getConfiguration() { + return (RedmineServiceConfiguration) super.getConfiguration(); + } } Modified: branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/RedmineFixtures.java =================================================================== --- branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/RedmineFixtures.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/RedmineFixtures.java 2012-07-19 06:50:02 UTC (rev 319) @@ -32,7 +32,6 @@ import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.io.rest.RestClientConfiguration; import org.nuiton.io.rest.RestException; import org.nuiton.jredmine.model.Attachment; import org.nuiton.jredmine.model.Issue; @@ -69,9 +68,9 @@ private ArrayListMultimap<Class<?>, Object> model; - private RestClientConfiguration anonymousConfiguration; + private RedmineServiceConfiguration anonymousConfiguration; - private RestClientConfiguration logguedConfiguration; + private RedmineServiceConfiguration logguedConfiguration; public String projectName() { return "jredmine"; @@ -181,7 +180,7 @@ return service; } - protected RestClientConfiguration getAnonymousConfiguration() + protected RedmineServiceConfiguration getAnonymousConfiguration() throws IOException { if (anonymousConfiguration == null) { @@ -238,13 +237,13 @@ return anonymousConfiguration; } - protected RestClientConfiguration getLogguedConfiguration() + protected RedmineServiceConfiguration getLogguedConfiguration() throws IOException { if (logguedConfiguration == null) { // use anonymous configuration - RestClientConfiguration anoConf = getAnonymousConfiguration(); + RedmineServiceConfiguration anoConf = getAnonymousConfiguration(); if (anoConf != null) { logguedConfiguration = new FakeRedmineServiceConfiguration(); copyConfiguration(anoConf, logguedConfiguration); @@ -252,23 +251,28 @@ // get system login password from env String login = System.getenv("jredmine-test.login"); String password = System.getenv("jredmine-test.password"); + String apiKey = System.getenv("jredmine-test.apiKey"); if (!"null".equals(login)) { logguedConfiguration.setRestUsername(login); } if (!"null".equals(password)) { logguedConfiguration.setRestPassword(password); } + if (!"null".equals(apiKey)) { + logguedConfiguration.setApiKey(apiKey); + } logguedConfiguration.setAnonymous(false); } } return logguedConfiguration; } - protected void copyConfiguration(RestClientConfiguration src, - RestClientConfiguration dst) { + protected void copyConfiguration(RedmineServiceConfiguration src, + RedmineServiceConfiguration dst) { dst.setRestUrl(src.getRestUrl()); dst.setRestUsername(src.getRestUsername()); dst.setRestPassword(src.getRestPassword()); + dst.setApiKey(src.getApiKey()); dst.setEncoding(src.getEncoding()); dst.setVerbose(src.isVerbose()); dst.setAnonymous(src.isAnonymous()); @@ -802,6 +806,8 @@ String encoding; + String apiKey; + @Override public String getEncoding() { return encoding; @@ -879,5 +885,15 @@ b.append("verbose", verbose); return b.toString(); } + + @Override + public String getApiKey() { + return apiKey; + } + + @Override + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } } } Modified: branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRequestFactoryTest.java =================================================================== --- branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRequestFactoryTest.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRequestFactoryTest.java 2012-07-19 06:50:02 UTC (rev 319) @@ -74,6 +74,11 @@ } @Test + public void loginByApiKey() { + assertRequestParameters(assertRequestUrl("/jredmine/login", ModelHelper.LOGIN_BY_API_KEY_REQUEST_NAME, "apiKey")); + } + + @Test public void logout() { assertRequestParameters(assertRequestUrl("/jredmine/logout", ModelHelper.LOGOUT_REQUEST_NAME)); } Modified: branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRestClientTest.java =================================================================== --- branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRestClientTest.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-client/src/test/java/org/nuiton/jredmine/rest/RedmineRestClientTest.java 2012-07-19 06:50:02 UTC (rev 319) @@ -27,6 +27,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.plexus.util.IOUtil; +import org.codehaus.plexus.util.StringUtils; import org.junit.After; import org.junit.Assert; import org.junit.Assume; @@ -196,8 +197,23 @@ askData(ModelHelper.GET_ALL_ATTACHMENTS_REQUEST_NAME, projectName, versionName); } + @Test + public void login() throws Exception { + Assume.assumeTrue(!getConfiguration().isAnonymous()); + Assume.assumeTrue(StringUtils.isBlank(getConfiguration().getApiKey())); + client.open(); + } + @Test + public void loginByApiKey() throws Exception { + + Assume.assumeTrue(!getConfiguration().isAnonymous()); + Assume.assumeTrue(StringUtils.isNotBlank(getConfiguration().getApiKey())); + client.open(); + } + + @Test public void getUserProjects() throws Exception { Assume.assumeTrue(!getConfiguration().isAnonymous()); Modified: branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/AbstractRedmineMojo.java =================================================================== --- branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/AbstractRedmineMojo.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/AbstractRedmineMojo.java 2012-07-19 06:50:02 UTC (rev 319) @@ -68,11 +68,22 @@ @Parameter(property = "redmine.url") protected URL url; +// /** +// * The redmine's server login apiKey. +// * <p/> +// * <b>Note:</b> This parameter (or username/password) is mandatory if you +// * not use a {@code anonymous} service. +// * +// * @since 2.0 +// */ +// @Parameter(property = "redmine.apiKey") +// protected String apiKey; + /** * The redmine's server login. * <p/> - * <b>Note:</b> : this parameter is mandatory if you not use a {@code anonymous} service. - * configuration. + * <b>Note:</b> This parameter (or username/password) is mandatory if you + * not use a {@code anonymous} service. * * @since 1.0.0 */ @@ -82,8 +93,8 @@ /** * The redmine's server password. * <p/> - * <b>Note:</b> : this parameter is mandatory if you not use a {@code anonymous} service. - * configuration. + * <b>Note:</b> This parameter (or username/password) is mandatory if you + * not use a {@code anonymous} service. * * @since 1.0.0 */ @@ -183,9 +194,15 @@ getLog().info("Redmine anonymous configuration :\n>> host : " + getRestUrl()); } else { +// if (StringUtils.isNotBlank(apiKey)) { +// getLog().info("Redmine configuration :\n>> host : " + +// getRestUrl() + "\n>> apiKey: " + +// getApiKey()); +// } else { getLog().info("Redmine configuration :\n>> host : " + getRestUrl() + "\n>> username : " + getRestUsername()); +// } } } @@ -316,6 +333,29 @@ username = restUsername; } + /** + * <strong>Note:</strong> Still not used (will be in version 2.0) + * + * @return the api key + * @since 2.0 + */ + @Override + public String getApiKey() { + return null; +// return apiKey; + } + + /** + * <strong>Note:</strong> Still not used (will be in version 2.0) + * + * @param apiKey the niew api key to set + * @since 2.0 + */ + @Override + public void setApiKey(String apiKey) { +// this.apiKey = apiKey; + } + /////////////////////////////////////////////////////////////////////////// /// Others /////////////////////////////////////////////////////////////////////////// Modified: branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/LoginMojo.java =================================================================== --- branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/LoginMojo.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-maven-plugin/src/main/java/org/nuiton/jredmine/plugin/LoginMojo.java 2012-07-19 06:50:02 UTC (rev 319) @@ -101,6 +101,16 @@ @Parameter(property = "redmine.serverId", required = true) protected String serverId; +// /** +// * Un flag pour utiliser le clef API pluto que le login/password. +// * <p/> +// * Il faut alors que le serveur contienne en username le clef API (encrypté ou non). +// * +// * @since 2.0 +// */ +// @Parameter(property = "redmine.useApiKey", defaultValue = "false") +// private boolean useApiKey; + /** * Settings. * @@ -137,6 +147,8 @@ private static final String REDMINE_PASSWORD = "redmine.password"; + private static final String REDMINE_API_KEY = "redmine.apiKey"; + /////////////////////////////////////////////////////////////////////////// /// Plugin /////////////////////////////////////////////////////////////////////////// @@ -146,8 +158,12 @@ if (plugin == null) { plugin = new ShareServerSecretPlugin(); plugin.setServerId(serverId); - plugin.setUsernameOut(REDMINE_USERNAME); - plugin.setPasswordOut(REDMINE_PASSWORD); +// if (useApiKey) { +// plugin.setUsernameOut(REDMINE_API_KEY); +// } else { + plugin.setUsernameOut(REDMINE_USERNAME); + plugin.setPasswordOut(REDMINE_PASSWORD); +// } plugin.setRunOnce(true); plugin.setProject(project); @@ -213,7 +229,7 @@ plugin.setRunOnce(false); plugin.execute(); plugin.setRunOnce(true); - + if (!checkLogin) { // no more thing to do return; @@ -339,4 +355,12 @@ this.safe = safe; } + @Override + public String getApiKey() { + return project.getProperties().getProperty(REDMINE_API_KEY); + } + + @Override + public void setApiKey(String apiKey) { + } } Modified: branches/jredmine-1.x/jredmine-maven-plugin/src/test/java/org/nuiton/jredmine/RedmineFixtures.java =================================================================== --- branches/jredmine-1.x/jredmine-maven-plugin/src/test/java/org/nuiton/jredmine/RedmineFixtures.java 2012-07-18 00:15:23 UTC (rev 318) +++ branches/jredmine-1.x/jredmine-maven-plugin/src/test/java/org/nuiton/jredmine/RedmineFixtures.java 2012-07-19 06:50:02 UTC (rev 319) @@ -274,6 +274,8 @@ String encoding; + String apiKey; + @Override public String getEncoding() { return encoding; @@ -351,5 +353,15 @@ b.append("verbose", verbose); return b.toString(); } + + @Override + public String getApiKey() { + return apiKey; + } + + @Override + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } } }