Some days ago I started to use the Scala programming language to update my Livejournal tags using its XML-RPC protocol reference. First I had to check if some tags of mine were entered wrong, so I’ve done this Scala program to list all of them:
1:import org.apache.xmlrpc.client.XmlRpcClient;
2:import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
3:import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;
4:import java.net.URL;
5:import java.util.Map
6:import java.util.HashMap
7:import scala.collection.immutable.TreeSet
8:
9:object LJListTag {
10: def main(args: Array[String]) {
11: val config = new XmlRpcClientConfigImpl()
12: config.setEnabledForExtensions(true);
13: config.setServerURL(new URL("http://www.livejournal.com/interface/xmlrpc"))
14: val client = new XmlRpcClient()
15: client.setConfig(config)
16: val params = new HashMap[String, String]
17: params.put("username", "user")
18: params.put("password", "password")
19: var paramsToServer = new Array[Object](1)
20: paramsToServer(0) = params
21: val results = client.execute("LJ.XMLRPC.getusertags", paramsToServer).asInstanceOf[Map[String, String]];
22: printEachTag(results)
23: }
24:
25: def printEachTag(results: Map[String, String]) {
26: var allTags = new TreeSet[String]
27: val iterator = results.values().iterator()
28: while(iterator.hasNext()) {
29: val resultFromRPCData = iterator.next().asInstanceOf[Array[Any]]
30: resultFromRPCData.foreach(singleResult => allTags += extractTag(singleResult))
31: }
32: allTags.foreach(tag => println(tag))
33: }
34:
35: def extractTag(singleResult: Any): String = {
36: val tag = singleResult.asInstanceOf[HashMap[String, String]]
37: return tag.get("name")
38: }
39:}
Just fill your user and password to have all of your LiveJournal tags printed on the standard output. The experience was so amazing, since you can use all the Java libraries (Scala is fully interoperable with Java and runs on top of the JVM). I used a TreeSet because I wanted print my tags sorted according its alphabetical order. I’m continuously studying Scala and its API, so the code above doesn’t use any advanced Scala constructs. If you have any suggestion about the code or how to use better the Scala constructs, post your comments here. It will be all appreciated.