/*
*
*/
package org.smartly.commons.network.shorturl;
import org.smartly.commons.network.shorturl.impl.TinyUrl;
import org.smartly.commons.util.CollectionUtils;
import org.smartly.commons.util.StringUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* @author angelo.geminiani
*/
public class ShortURL {
public static final String TINYURL = "tinyurl";
private static final String DEFAULT_SERVICE = TINYURL;
private final Map<String, Class<? extends IURLShortener>> _services;
private ShortURL() {
_services = Collections.synchronizedMap(
new HashMap<String, Class<? extends IURLShortener>>());
this.init();
}
@Override
protected void finalize() throws Throwable {
try {
_services.clear();
} catch (Exception ignored) {
}
super.finalize();
}
public final String getShortUrl(final String serviceId, final String url) {
try {
return tryShortUrl(serviceId, url);
} catch (Exception e) {
return this.tryShortUrl(url);
}
}
// ------------------------------------------------------------------------
// p r i v a t e
// ------------------------------------------------------------------------
private void init() {
//-- register services --//
_services.put(TINYURL, TinyUrl.class);
}
private IURLShortener getService(final String serviceId) {
synchronized (_services) {
final Class srvcClass = _services.get(serviceId);
final IURLShortener result = this.createService(srvcClass);
return null != result ? result : new TinyUrl();
}
}
private IURLShortener createService(final Class srvcClass) {
if (null != srvcClass) {
try {
return (IURLShortener) srvcClass.newInstance();
} catch (Throwable ignored) {
}
}
return null;
}
private String tryShortUrl(final String url) {
synchronized (_services) {
if (!CollectionUtils.isEmpty(_services)) {
final Collection<Class<? extends IURLShortener>> services = _services.values();
for (final Class<? extends IURLShortener> srvcClass : services) {
final IURLShortener srvc = this.createService(srvcClass);
if (null != srvc) {
try {
return srvc.getShortUrl(url);
} catch (Exception ignored) {
}
}
}
}
return url;
}
}
private String tryShortUrl(final String serviceId, final String url)
throws Exception {
if (StringUtils.hasText(url)) {
final IURLShortener srvc = this.getService(serviceId);
if (null != serviceId) {
final String shorturi = srvc.getShortUrl(url);
if (StringUtils.hasText(shorturi)) {
if (shorturi.length() < url.length()) {
return shorturi;
}
}
}
}
return url;
}
// ------------------------------------------------------------------------
// S T A T I C
// ------------------------------------------------------------------------
private static ShortURL __instance;
private static ShortURL getInstance() {
if (null == __instance) {
__instance = new ShortURL();
}
return __instance;
}
public static String get(final String url) {
final ShortURL instance = getInstance();
return instance.getShortUrl(DEFAULT_SERVICE, url);
}
public static String get(final String serviceId, final String url) {
final ShortURL instance = getInstance();
return instance.getShortUrl(serviceId, url);
}
}