Skip to content

Commit 86f12eb

Browse files
added optional commons-codec dependency
there are some platforms (e.g. android) that do not have by default the java.xml.bind package. The solution is to use the commons-codec implementation if it's on the classpath and fallback to java.xml.bind
1 parent c9401eb commit 86f12eb

File tree

7 files changed

+107
-10
lines changed

7 files changed

+107
-10
lines changed

pom.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,19 @@
3838
</scm>
3939

4040
<dependencies>
41-
4241
<dependency>
4342
<groupId>junit</groupId>
4443
<artifactId>junit</artifactId>
4544
<version>4.8.1</version>
4645
<scope>test</scope>
4746
</dependency>
48-
47+
<dependency>
48+
<groupId>commons-codec</groupId>
49+
<artifactId>commons-codec</artifactId>
50+
<version>1.4</version>
51+
<scope>compile</scope>
52+
<optional>true</optional>
53+
</dependency>
4954
</dependencies>
5055
<build>
5156
<plugins>

src/main/java/org/scribe/oauth/OAuth10aServiceImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import org.scribe.builder.api.*;
66
import org.scribe.model.*;
7+
import org.scribe.services.*;
78
import org.scribe.utils.*;
89
import java.util.concurrent.TimeUnit;
910

@@ -139,6 +140,7 @@ public String getAuthorizationUrl(Token requestToken)
139140
private String getSignature(OAuthRequest request, Token token)
140141
{
141142
config.log("generating signature...");
143+
config.log("using base64 encoder: " + Base64Encoder.type());
142144
String baseString = api.getBaseStringExtractor().extract(request);
143145
String signature = api.getSignatureService().getSignature(baseString, config.getApiSecret(), token.getSecret());
144146

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.scribe.services;
2+
3+
public abstract class Base64Encoder
4+
{
5+
private static Base64Encoder instance;
6+
7+
public static synchronized Base64Encoder getInstance()
8+
{
9+
if (instance == null)
10+
{
11+
instance = createEncoderInstance();
12+
}
13+
return instance;
14+
}
15+
16+
private static Base64Encoder createEncoderInstance()
17+
{
18+
if (CommonsEncoder.isPresent())
19+
{
20+
return new CommonsEncoder();
21+
}
22+
else
23+
{
24+
return new DatatypeConverterEncoder();
25+
}
26+
}
27+
28+
public static String type()
29+
{
30+
return getInstance().getType();
31+
}
32+
33+
public abstract String encode(byte[] bytes);
34+
35+
public abstract String getType();
36+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.scribe.services;
2+
3+
import org.apache.commons.codec.binary.*;
4+
import org.scribe.exceptions.*;
5+
6+
import java.io.UnsupportedEncodingException;
7+
8+
public class CommonsEncoder extends Base64Encoder
9+
{
10+
11+
@Override
12+
public String encode(byte[] bytes)
13+
{
14+
try
15+
{
16+
return new String(Base64.encodeBase64(bytes), "UTF-8");
17+
}
18+
catch (UnsupportedEncodingException e)
19+
{
20+
throw new OAuthSignatureException("Can't perform base64 encoding", e);
21+
}
22+
}
23+
24+
@Override
25+
public String getType()
26+
{
27+
return "CommonsCodec";
28+
}
29+
30+
public static boolean isPresent()
31+
{
32+
try
33+
{
34+
Class.forName("org.apache.commons.codec.binary.Base64");
35+
return true;
36+
}
37+
catch (ClassNotFoundException e)
38+
{
39+
return false;
40+
}
41+
}
42+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.scribe.services;
2+
3+
import javax.xml.bind.*;
4+
5+
public class DatatypeConverterEncoder extends Base64Encoder
6+
{
7+
@Override
8+
public String encode(byte[] bytes)
9+
{
10+
return DatatypeConverter.printBase64Binary(bytes);
11+
}
12+
13+
@Override
14+
public String getType()
15+
{
16+
return "DatatypeConverter";
17+
}
18+
}

src/main/java/org/scribe/services/HMACSha1SignatureService.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
import org.scribe.exceptions.*;
77
import org.scribe.utils.*;
88

9-
// implementation of base64 encoding lives here.
10-
import javax.xml.bind.DatatypeConverter;
11-
129
/**
1310
* HMAC-SHA1 implementation of {@SignatureService}
1411
*
@@ -51,7 +48,7 @@ private String doSign(String toSign, String keyString) throws Exception
5148

5249
private String bytesToBase64String(byte[] bytes)
5350
{
54-
return DatatypeConverter.printBase64Binary(bytes);
51+
return Base64Encoder.getInstance().encode(bytes);
5552
}
5653

5754
/**

src/main/java/org/scribe/services/RSASha1SignatureService.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
import org.scribe.exceptions.*;
44
import java.security.*;
55

6-
// implementation of base64 encoding lives here.
7-
import javax.xml.bind.DatatypeConverter;
8-
96
/**
107
* A signature service that uses the RSA-SHA1 algorithm.
118
*/
@@ -42,7 +39,7 @@ public String getSignature(String baseString, String apiSecret, String tokenSecr
4239

4340
private String bytesToBase64String(Signature signature) throws SignatureException
4441
{
45-
return DatatypeConverter.printBase64Binary(signature.sign());
42+
return Base64Encoder.getInstance().encode(signature.sign());
4643
}
4744

4845
/**

0 commit comments

Comments
 (0)