On October 6, 2012, Matthias Müller sent me an e-mail, telling me that the download functionality of ADSdroid was broken. As it turned out, AllDataSheet changed their website a little bit, resulting in the following exception getting thrown during download.
java.lang.IllegalArgumentException: Malformed URL: javascript:mo_search('444344','ATMEL','ATATMEGA168P');
at org.jsoup.helper.HttpConnection.url(HttpConnection.java:53)
at org.jsoup.helper.HttpConnection.connect(HttpConnection.java:25)
at org.jsoup.Jsoup.connect(Jsoup.java:73)
at hu.vsza.adsapi.Part.getPdfConnection(Part.java:32)
at hu.vsza.adsdroid.PartList$DownloadDatasheet.doInBackground(PartList.java:56)
at hu.vsza.adsdroid.PartList$DownloadDatasheet.doInBackground(PartList.java:48)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.net.MalformedURLException: Unknown protocol: javascript
at java.net.URL.<init>(URL.java:184)
at java.net.URL.<init>(URL.java:127)
at org.jsoup.helper.HttpConnection.url(HttpConnection.java:51)
... 12 more
The address (href
) of the link (<a>
) used for PDF download has changed from
a simple HTTP one to a JavaScript call that JSoup, the library I used for
HTML parsing and doing HTTP requests couldn't possibly handle. The source of
the mo_search
function can be found in js/datasheet_view.js
. The relevant
part can be seen below, I just inserted some whitespace for easier readability.
function mo_search(m1, m2, m3) {
frmSearch2.ss_chk.value = m1;
frmSearch2.sub_chk.value = m2;
frmSearch2.pname_chk.value = m3;
frmSearch2.action = 'http://www.alldatasheet.com/datasheet-pdf/pdf/'
+ frmSearch2.ss_chk.value + '/' + frmSearch2.sub_chk.value
+ '/' + frmSearch2.pname_chk.value + '.html';
frmSearch2.submit();
}
That didn't seem that bad, so I wrote a simple regular expression to handle the issue.
import java.util.regex.*;
Pattern jsPattern = Pattern.compile(
"'([^']+)'[^']*'([^']+)'[^']*'([^']+)'");
final Matcher m = jsPattern.matcher(foundPartHref);
if (m.find()) {
foundPartHref = new StringBuilder(
"http://www.alldatasheet.com/datasheet-pdf/pdf/")
.append(m.group(1)).append('/')
.append(m.group(2)).append('/')
.append(m.group(3)).append(".html").toString();
}
The regular expression is overly liberal on purpose, in the hope that it can handle small changes in the AllDataSheet website in the future without upgrading the application. I pushed version 1.2 to GitHub, and it contains many other optimizations, too, including enabling ProGuard. The resulting APK is 30% smaller than previous versions, and it can be downloaded by using the link in the beginning of this sentence, or using the QR code below. It's also available from the F-Droid Android FOSS repository, which also ensures automatic upgrades.