Skip to content

Commit

Permalink
Merge pull request #1 from quintoandar/refactor-encoder
Browse files Browse the repository at this point in the history
Refactor encoder
  • Loading branch information
blrosa authored Feb 26, 2018
2 parents a6bf4c3 + f8fcc97 commit 408cff8
Show file tree
Hide file tree
Showing 12 changed files with 205 additions and 50 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
.idea
urlencoder.iml
target/
target/
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
49dc3de2b678cf3e64ee924ceb25459b
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
d27783f047fb2f74e373c513a4ef22922a58366d
74 changes: 74 additions & 0 deletions mvn-repo/br/com/quintoandar/urlencoder/1.0.0/urlencoder-1.0.0.pom
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>br.com.quintoandar</groupId>
<artifactId>urlencoder</artifactId>
<version>1.0.0</version>

<dependencies>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>${rs-api.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy-jaxrs.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy-client.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.1</version>
<configuration>
<altDeploymentRepository>internal.repo::default::file://${internal.repo.path}</altDeploymentRepository>
</configuration>
</plugin>
</plugins>
</build>

<properties>
<rs-api.version>2.1</rs-api.version>
<commons-lang3.version>3.7</commons-lang3.version>
<httpclient.version>4.5.5</httpclient.version>
<resteasy-jaxrs.version>3.1.4.Final</resteasy-jaxrs.version>
<resteasy-client.version>3.1.4.Final</resteasy-client.version>
<lombok.version>1.16.20</lombok.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<internal.repo.path>${basedir}/mvn-repo/</internal.repo.path>
</properties>

<!--<scm>-->
<!--<url>https://github.com/quintoandar/urlencoder</url>-->
<!--<connection>scm:git:[email protected]:quintoandar/urlencoder.git</connection>-->
<!--<developerConnection>scm:git:[email protected]:quintoandar/urlencoder.git</developerConnection>-->
<!--</scm>-->

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
8fec72026ee735be963ed7226cd5f567
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
d1c966308a42fd711c44bd0d46fb03a24512068f
12 changes: 12 additions & 0 deletions mvn-repo/br/com/quintoandar/urlencoder/maven-metadata.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>br.com.quintoandar</groupId>
<artifactId>urlencoder</artifactId>
<versioning>
<release>1.0.0</release>
<versions>
<version>1.0.0</version>
</versions>
<lastUpdated>20180226134832</lastUpdated>
</versioning>
</metadata>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
78cdde2bb8a5dfdaa7408bc585f72c06
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
c7e4b8690379b4e32e0a4762c649332fddb081d2
17 changes: 16 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>br.com.quintoandar</groupId>
<artifactId>urlencoder</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.0.0</version>

<dependencies>
<dependency>
Expand Down Expand Up @@ -41,13 +41,28 @@
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.1</version>
<configuration>
<altDeploymentRepository>internal.repo::default::file://${internal.repo.path}</altDeploymentRepository>
</configuration>
</plugin>
</plugins>
</build>

<properties>
<rs-api.version>2.1</rs-api.version>
<commons-lang3.version>3.7</commons-lang3.version>
<httpclient.version>4.5.5</httpclient.version>
<resteasy-jaxrs.version>3.1.4.Final</resteasy-jaxrs.version>
<resteasy-client.version>3.1.4.Final</resteasy-client.version>
<lombok.version>1.16.20</lombok.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<internal.repo.path>${basedir}/mvn-repo/</internal.repo.path>
</properties>

</project>
144 changes: 96 additions & 48 deletions src/main/java/br/com/quintoandar/urlencoder/UrlEncoder.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package br.com.quintoandar.urlencoder;

import java.util.Map;
import java.util.Optional;
import java.util.Random;
import lombok.Data;
import lombok.NonNull;
import org.apache.commons.lang3.RandomStringUtils;

@Data
public class UrlEncoder {

private static final int SIZE_SHORT_HASH = 6;

private YourlsApiService service;
private int keywordLength;
private String signature;
Expand All @@ -25,72 +30,115 @@ public UrlEncoder(String uri, int keywordLength, String signature,
@NonNull String environment) {
this(uri, keywordLength, signature);
this.withEnvironment = true;
this.environment = String.format("%s-", environment);
}

public String encodeURL(@NonNull String urlToEncode) {
return encodeURL(urlToEncode, null, false);
this.environment = environment;
}

public String encodeURLWithSufix(String urlToEncode, @NonNull String keyword) {
return encodeURL(urlToEncode, keyword, true);
}

private String encodeURL(String urlToEncode, String keyword, boolean overwrite) {
keyword = keyword == null ? generateRandomAlphanumeric() : keyword;
String keywordWithPrefix = this.environment + keyword;

keywordWithPrefix = keywordWithPrefix.toLowerCase();
Map<String, Object> map = this.service.getInstance()
.shorturl(signature, "shorturl", "json", urlToEncode, keywordWithPrefix,
"URL Shortned via QuinToUrlEncoder.java");

if (map.get("status").equals("fail")) {
if (map.get("message").toString().equalsIgnoreCase(
"Short URL " + keywordWithPrefix + " already exists in database or is reserved")) {
if (overwrite && keyword != null) {
this.service.getInstance()
.delete(signature, YourlsApi.ACTION_DELETE, YourlsApi.FORMAT_JSON, keywordWithPrefix);
return encodeURL(urlToEncode, keyword, overwrite);
}
if (!overwrite && keyword == null) {
return encodeURL(urlToEncode, null, overwrite);
}
}
public String encodeURL(String url) {
String generatedKeyword = generateRandomAlphanumeric();
String finalKeyword = isWithEnvironment() ?
generateKeywordWithEnvironment(generatedKeyword)
: generatedKeyword;
ShortUrlResponse shortUrlResponse = shortUrlWithKeyword(url, finalKeyword);
if (shortUrlResponse.isFail() && shortUrlResponse.getFailReason().equals(FailReason.KEYWORD_ALREADY_EXIST)) {
return this.encodeURL(url);
} else if (!shortUrlResponse.isFail()) {
return shortUrlResponse.getShortUrl();
}
return null;
}

if (map != null && map.containsKey("shorturl")) {
return map.get("shorturl").toString();
public String encodeUrlWithKeyword(String url, String keyword) {
String finalKeyword = isWithEnvironment() ?
generateKeywordWithEnvironment(keyword)
: keyword;
ShortUrlResponse shortUrlResponse = shortUrlWithKeyword(url, finalKeyword);
if (shortUrlResponse.isFail() && shortUrlResponse.getFailReason().equals(FailReason.KEYWORD_ALREADY_EXIST)) {
deleteKeyword(finalKeyword);
return this.encodeUrlWithKeyword(url, keyword);
} else if (!shortUrlResponse.isFail()) {
return shortUrlResponse.getShortUrl();
}
return null;
}

public String encodeURLWithHash(String urlToEncode, String hashLoginBypass, String prefix) {
int tamHashEncurtado = 6;
StringBuilder keyword = new StringBuilder(prefix);

if (hashLoginBypass != null && hashLoginBypass.length() >= tamHashEncurtado) {
int ini = (new Random()).nextInt(hashLoginBypass.length() - tamHashEncurtado);
keyword.append("-" + hashLoginBypass.substring(ini, ini + tamHashEncurtado));
}
return encodeURL(urlToEncode, keyword.toString(), true);
public String encodeURLWithHash(String url, @NonNull String hash, String prefix) {
String finalKeyword = hash.length() >= SIZE_SHORT_HASH ? generateShortHash(hash, prefix) : prefix;
return encodeUrlWithKeyword(url, finalKeyword);
}

public String encodeWithMultipleTries(String urlToEncode, String hashLoginBypass, String prefix,
int maxTries) {
int tries = 0;
while (tries < maxTries) {
public String encodeWithHashMultipleTries(String url, String hash, String prefix, int maxTries) {
int nTries = maxTries;
while (nTries > 0) {
try {
return encodeURLWithHash(urlToEncode, hashLoginBypass, prefix);
return encodeURLWithHash(url, hash, prefix);
} catch (Exception e) {
tries++;
nTries--;
}
}
throw new RuntimeException(
String.format("Url shortning unavailable: tried %d", maxTries));
String.format("Url shortning unavailable: tried %d times.", maxTries));
}

private String generateShortHash(String hash, String prefix) {
int ini = (new Random()).nextInt(hash.length() - SIZE_SHORT_HASH);
return String.format("%s-%s", prefix, hash.substring(ini, ini + SIZE_SHORT_HASH));
}

private String generateKeywordWithEnvironment(String generatedKeyword) {
return String.format("%s-%s", getEnvironment(), generatedKeyword);
}

private void deleteKeyword(String keyword) {
this.service.getInstance()
.delete(signature, YourlsApi.ACTION_DELETE, YourlsApi.FORMAT_JSON, keyword);
}

private ShortUrlResponse shortUrlWithKeyword(String urlToEncode, String keyword) {
Map<String, Object> result = this.service.getInstance()
.shorturl(signature, "shorturl", "json", urlToEncode, keyword.toLowerCase(),
"URL Shortned via UrlEncoder.java");
boolean fail = result.get("status").equals("fail");
String shorturl = Optional.ofNullable(result.get("shorturl"))
.map(o -> o.toString()).orElse(null);
FailReason failReason = Optional.ofNullable(result.get("message"))
.map(m -> {
if (fail) {
if (m.toString().equalsIgnoreCase(
String.format(
"Short URL %s already exists in database or is reserved",
keyword))
) {
return FailReason.KEYWORD_ALREADY_EXIST;
} else {
return FailReason.UNKNOWN;
}
}
return null;
}).orElse(null);

return new ShortUrlResponse(shorturl,fail,failReason);
}

private String generateRandomAlphanumeric() {
return RandomStringUtils.randomAlphanumeric(keywordLength).toLowerCase();
}

protected enum FailReason {
KEYWORD_ALREADY_EXIST,
UNKNOWN,
}

@Data
protected class ShortUrlResponse {

private String shortUrl;
private boolean fail;
private FailReason failReason;

public ShortUrlResponse(String shortUrl, boolean fail, FailReason failReason) {
this.shortUrl = shortUrl;
this.fail = fail;
this.failReason = failReason;
}
}
}

0 comments on commit 408cff8

Please sign in to comment.