Changes for page WebObjects with Scala
Last modified by Ravi Mendis on 2011/05/10 02:10
From version 510.1
edited by Ravi Mendis
on 2010/12/24 01:42
on 2010/12/24 01:42
Change comment:
There is no comment for this version
To version 515.1
edited by Ravi Mendis
on 2009/09/30 18:01
on 2009/09/30 18:01
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,37 +1,41 @@ 1 1 === What is Scala? === 2 2 3 -[[Scala>>http://www.scala-lang.org/]] is a modern, multi-paradigm JVM language that is most often compared to [[Groovy>>http://en.wikipedia.org/wiki/Groovy_(programming_language)]], [[Clojure>>http://en.wikipedia.org/wiki/Clojure]] or [[Erlang>>http://en.wikipedia.org/wiki/Erlang_(programming_language)]]. Its [[functional language>>http://en.wikipedia.org/wiki/Functional_programming]] foundations and built-in [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] library make it especially attractive for concurrent computing. (Scala is an abbreviation for "scalable" hinting at its design goals). In this day and age of multi-core processors concurrent computing can not be ignored. 3 +Scala is a modern language not unlike Groovy. 4 +It is said to be more powerful (and faster) than Groovy or Ruby which has been the reason for its adoption at sites like Twitter. 4 4 5 -Many of t he designfeaturesofScalahave been chosenwith concurrencyin mind, some ofwhichmay not be unfamiliar to Objective-CorWebObjects developers. Here's a summary:6 +Many of its features and paradigms favor multi-threading and concurrency. Some of these may not be unfamiliar to Objective-C and WebObjects developers. Here's a summary: 6 6 7 -|= |= Objective-C |= Java |= Scala 8 -|= Immu tability| Partial-via collections //e.g: NSArray/NSMutableArray// | No | Yes9 -|= Closures | Yes-viaBlocks (//Extension//) | No | Yes-viaAnonymousFunctions10 -|= Static variables | Yes | Yes | No 11 -|= Static methods | Yes | Yes | No 12 -|= Concurrency |Yes-via [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//)Yes - viaThreads//|Yes-via [[Actors>>http://en.wikipedia.org/wiki/Actor_model]]13 -|= |= Weakly Typed |= 8 +|= |= Objective-C |= Java |= Scala 9 +|= Mutable/Immuable Datatypes | Collections //e.g: NSArray/NSMutableArray// | No | Yes 10 +|= Closures | Blocks (//Extension//) | No | Yes 11 +|= Static variables | Yes | Yes | No 12 +|= Static methods/functions | Yes | Yes | No 13 +|= Concurrency | [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//)| //Threads// |[[Actors>>http://en.wikipedia.org/wiki/Actor_model]] 14 +|= |= Weakly Typed |=--Strongly Typed--|= Strongly Typed 14 14 15 15 Other notable features include: 16 16 17 -|= |= Objective-C |= Java |= Scala 18 -|= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)// 19 -|= Class composition |Yes-viaCategories|Yes-viaInterfaces |Yes - via [[Traits>>http://en.wikipedia.org/wiki/Trait_(computer_science)]]18 +|= |= Objective-C |= Java |= Scala 19 +|= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)// 20 +|= Class composition | Categories | Interfaces | Traits 20 20 22 +A fuller description of Scala can be found [[here>>http://en.wikipedia.org/wiki/Scala_(programming_language)]]. 23 + 21 21 === Why Use Scala? === 22 22 23 -For WebObjects developers, Scala offers itself as a powerful, safe and easy-to-use solution for [[concurrent computing>>Building Concurrent Applications with WebObjects and Scala]]. (In other words, Scala Actors can be used for problems that would have normally required threads). 26 +With Web 2.0, building concurrent WebObjects applications is a must. 27 +Developing and maintaining a concurrent or multi-threaded WebObjects application can be challenging. 24 24 25 - === CanWebObjectsbeProgrammedInScala? ===29 +Scala offers concurrency that is (effectively) built-in to the language and is inherently thread-safe. 26 26 27 -Yes. It is very simple. 28 -By virtue of being a JVM-language, Scala compiles to java bytecode. 31 +In other words, developing Ajax (i.e asynchronous communication) with WO will require concurrent request handling and thread-safe code, for which Scala is a better choice than Java. 29 29 30 - Furthermore,beingamulti-paradigmlanguagegrantsScalaeasy WebObjects-interoperability.33 +In addition it may offer new solutions for concurrency in WebObjects and EOF. 31 31 32 -=== ==Caveats =====35 +=== Can WebObjects be Programmed In Scala? === 33 33 34 -Legacy tool support is often cited as a weak point. The [[Eclipse Scala plugin>>http://www.scala-ide.org]] has been found to be slow at times and sometimes buggy. 37 +Yes. It is very simple. 38 +Scala compiles to java bytecode. Hence using it with WebObjects is fairly straightforward. 35 35 36 36 = WebObjects In Scala = 37 37 ... ... @@ -39,46 +39,36 @@ 39 39 40 40 == EOs in Scala == 41 41 42 -=== Thread-Safe Shared Vars === 46 +=== Thread-Safe Shared Vars === 43 43 44 -Scala doesn't have static variables or methods. Instead Scala employs the [[Singleton Pattern>>http://en.wikipedia.org/wiki/Singleton_pattern]] which is built into the language and is **thread-safe**: a class can have a //Companion Object// that will allow you to achieve something equivalent to static variables - but better. 48 +Scala doesn't have static variables or methods. However, a class can have a //Companion Object// that will allow you to achieve something equivalent to static variables. 49 +One of the advantages of this approach is that it is **thread-safe**, so you don't have to worry about synchronizing access to these fields in a concurrent application. 45 45 46 -You don't have to worry about synchronizing access to shared mutable fields in a concurrent application. 47 -(This is not however true when for example you have a ##val## declared as a ##NSMutableArray##. You will still have to synchronize when adding to or removing from this mutable field). 51 +In Java: 48 48 49 - The following is an example of the use of a //Companion Object// for Talent in Scala insteadof Talent static fields in Java.53 +{{code}} 50 50 51 -Java: 52 - 53 -{{code value="java"}} 54 - 55 55 public class _Talent extends EOGenericRecord { 56 56 public static final String ENTITY_NAME = "Talent"; 57 57 58 58 {{/code}} 59 59 60 -Scala: 60 +In Scala: 61 61 62 62 {{code}} 63 63 64 -object Talent { 64 +object _Talent extends EOGenericRecord { 65 65 val ENTITY_NAME = "Talent" 66 66 67 67 {{/code}} 68 68 69 -This value will be accessed exactly the same way in both languages: 70 - 71 -{{code}} 72 - 73 -Talent.ENTITY_NAME 74 - 75 -{{/code}} 76 - 77 77 ==== Compacted imports ==== 78 78 71 +Two lines in Java are compacted into one in Scala. 72 + 79 79 In Java: 80 80 81 -{{code value="java"}}75 +{{code}} 82 82 83 83 import com.webobjects.eocontrol.EOGenericRecord; 84 84 import com.webobjects.eocontrol.EORelationshipManipulation; ... ... @@ -101,7 +101,7 @@ 101 101 102 102 In Java: 103 103 104 -{{code value="java"}}98 +{{code}} 105 105 106 106 public class MenuHeader extends WOComponent { 107 107 ... ... @@ -122,11 +122,11 @@ 122 122 ==== Simplified Exception Handling ==== 123 123 124 124 Scala doesn't force you to catch exceptions unlike in Java. 125 -In addition, the syntax employs Scala's very powerful **pattern matching**to handle exceptions.119 +In addition, the syntax employs Scala's very powerful pattern matching to handle different exceptions. 126 126 127 127 In Java: 128 128 129 -{{code value="java"}}123 +{{code}} 130 130 131 131 try { 132 132 EditPageInterface epi = D2W.factory().editPageForNewObjectWithEntityNamed(_manipulatedEntityName, session()); ... ... @@ -160,79 +160,35 @@ 160 160 161 161 {{/code}} 162 162 163 -== ==ScalaAnnotationsvs.Generated Accessors====157 +== How to Add Scala to a WO Project == 164 164 165 - AnexampleofaccessingvariablesinWebObjects with the followinglanguages:159 +{{include value="WOL:Adding Scala Support to a WOLips Project"}}{{/include}} 166 166 167 -|= |= Objective-C |= Java |= Scala 168 -|= getter | ##object name## | ##object.name()## | ##object.name## 169 -|= setter | ##object setName:aName## | ##object.setName(aName)## | ##object.name = aName## 161 +{{note title="Note"}} 170 170 171 -Of course in Java, we may generate WebObjects classes with "get" methods as well in order to stick to convention. 172 -In scala there is an additional convenience we may use to produce "get" and "set" methods in addition to the default Scala accessors - Scala Annotations. 163 +This is for Eclipse/WOLips IDE 173 173 174 -E.g, in Main.scala we annotate our component keys with ##@BeanProperty## to automatically create public "set" and "get" methods. 175 -These variables can then be accessed via //KVC//. 165 +{{/note}} 176 176 177 -{{code}} 178 - 179 -import scala.reflect.BeanProperty 180 - 181 -@BeanProperty var username = new String() 182 -@BeanProperty var password = new String() 183 -@BeanProperty var isAssistantCheckboxVisible = false 184 - 185 -{{/code}} 186 - 187 -== How to Use Scala Collections with EOF == 188 - 189 -To use the Scala Collections API with an NSArray or NSDictionary you simply need to add an import: 190 - 191 -{{code value="java"}} 192 - 193 -import scala.collection.JavaConversions._ 194 - 195 -{{/code}} 196 - 197 -After that, you may access the typical Scala collection methods directly on NSArray. This employs a feature of Scala known as implicit conversions to automagically cast a NSArray (a Java Iterable) into a Scala Iterable while leaving the actual object unchanged. 198 - 199 -== How to Add Scala to a WO Project (in Eclipse) == 200 - 201 -{{include value="WOL:Adding Scala Support to a WOLips Project"}}{{/include}} 202 - 203 203 == WO Scala Example == 204 204 205 -The following example is a nalmost100%ScalaWO app. In realityitisa mixedJava/Scalaapp:169 +The following example is a mixed Java/Scala version of the WO Movies D2W app. 206 206 All the EO logic and WO components are in Scala. 207 -Only the Application class remains Java.171 +Only the Application class is Java. 208 208 209 -It is based on the D2W Movies example. 210 - 211 211 {{attachments patterns=".*zip"}}{{/attachments}} 212 212 213 213 === Setup === 214 214 215 -1. [[Install the Scala eclipse IDE>>http://www.scala-ide.org/]] 177 +1. [[Install the Scala eclipse IDE>>http://www.scala-lang.org/node/94]] 178 +1. Install and run the OpenBase OBMovies database. 216 216 1. Right-click on Application.java and run as a WOApplication (as usual). 217 217 218 - {{note}}181 +==== EO Templates ==== 219 219 220 - Application can bemadeinto aScalaclass aswell,buthenyouwill havecreatelauncherin Eclipse manually.183 +See: [[Scala templates>>http://wiki.objectstyle.org/confluence/display/WOL/EOGenerator+Templates+and+Additions]] 221 221 222 -{{/note}} 223 - 224 -== EO Templates == 225 - 226 226 When you create your ##.eogen## file, be sure to make the following changes in the EOGenerator Editor: 227 227 228 -1. Point to the local [[Scala versions>>http://wiki.objectstyle.org/confluence/display/WOL/EOGenerator+Templates+and+Additions]] of the .eotemplate files for ##Entity## and ##Entity## 229 229 1. Change the File Names Extension to "scala" 230 -1. In Destination Paths set the Superclass Package (e.g: base) 231 231 1. Uncheck Java under Options 232 - 233 -== How to Build & Deploy a WebObjects Scala Project with Ant == 234 - 235 -1. [[Download>>http://www.scala-lang.org/downloads]] and install Scala 236 -1. Set ##scala.home## (the location Scala has been installed onto) in the project ##build.properties## file 237 -1. [[Add the scalac task and properties>>Configuring Ant to Build Scala with WebObjects]] to the ant build.xml file 238 -1. Run from the project directory: ##sudo ant clean install##