Changes for page WebObjects with Scala
Last modified by Ravi Mendis on 2011/05/10 02:10
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,34 +1,37 @@ 1 1 === What is Scala? === 2 2 3 - [[Scala>>http://en.wikipedia.org/wiki/Scala_(programming_language)]]is a languageforconcurrentcomputing.4 -I nthisdayand age ofmulti-coreprocessors,concurrentcomputingcan'tbe 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. 5 5 6 -Many of Scala's features have been designed with concurrency in mind. 7 -Some of these may not be unfamiliar to Objective-C or WebObjects developers. 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: 8 8 9 -Here's a quick summary: 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 10 10 11 -|= |= Objective-C |= Java |= Scala 12 -|= Separation of Mutable & Immuable Datatypes | Collections //e.g: NSArray/NSMutableArray// | No | Yes 13 -|= Closures | Blocks (//Extension//) | No | Anonymous Functions 14 -|= Static variables | Yes | Yes | No 15 -|= Static methods or functions | Yes | Yes | No 16 -|= Concurrency | [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//) | //Threads// | [[Actors>>http://en.wikipedia.org/wiki/Actor_model]] 17 -|= |= Weakly Typed |= --Strongly Typed-- |= Strongly Typed 18 - 19 19 Other notable features include: 20 20 21 -|= |= Objective-C |= Java |= Scala 22 -|= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)// 23 -|= Class composition | Categories | Interfaces | Traits 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 24 24 22 +A fuller description of Scala can be found [[here>>http://en.wikipedia.org/wiki/Scala_(programming_language)]]. 23 + 25 25 === Why Use Scala? === 26 26 27 - Scalaisinherentlythread-safe.28 - Ithasconcurrencythatiseffectivelybuilt-intothelanguage.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. 29 29 30 -S o for WebObjects developers, Scala offersitself as a powerful, safe and easy-to-use solution for [[concurrentapplications>>BuildingConcurrentApplicationswithWebObjectsand Scala]]. (Inotherwords,Scala Actorscanbeused forproblemsthat would have normallyrequiredthreads).29 +Scala offers concurrency that is (effectively) built-in to the language and is inherently thread-safe. 31 31 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. 32 + 33 +In addition it may offer new solutions for concurrency in WebObjects and EOF. 34 + 32 32 === Can WebObjects be Programmed In Scala? === 33 33 34 34 Yes. It is very simple. ... ... @@ -40,40 +40,29 @@ 40 40 41 41 == EOs in Scala == 42 42 43 -=== Thread-Safe Shared Vars === 46 +=== Thread-Safe Shared Vars === 44 44 45 -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. 46 46 47 - So you don'thave to worryabout synchronizing access to shared mutable fields in a concurrent application.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 extends EOGenericRecord { 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 79 79 Two lines in Java are compacted into one in Scala. ... ... @@ -80,7 +80,7 @@ 80 80 81 81 In Java: 82 82 83 -{{code value="java"}}75 +{{code}} 84 84 85 85 import com.webobjects.eocontrol.EOGenericRecord; 86 86 import com.webobjects.eocontrol.EORelationshipManipulation; ... ... @@ -103,7 +103,7 @@ 103 103 104 104 In Java: 105 105 106 -{{code value="java"}}98 +{{code}} 107 107 108 108 public class MenuHeader extends WOComponent { 109 109 ... ... @@ -124,11 +124,11 @@ 124 124 ==== Simplified Exception Handling ==== 125 125 126 126 Scala doesn't force you to catch exceptions unlike in Java. 127 -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. 128 128 129 129 In Java: 130 130 131 -{{code value="java"}}123 +{{code}} 132 132 133 133 try { 134 134 EditPageInterface epi = D2W.factory().editPageForNewObjectWithEntityNamed(_manipulatedEntityName, session()); ... ... @@ -162,58 +162,11 @@ 162 162 163 163 {{/code}} 164 164 165 -==== Scala Annotations vs. Generated Accessors ==== 166 - 167 -An example of accessing variables in WebObjects with the following languages: 168 - 169 -|= |= Objective-C |= Java |= Scala 170 -|= getter | ##object name## | ##object.name()## | ##object.name## 171 -|= setter | ##object setName:aName## | ##object.setName(aName)## | ##object.name = aName## 172 - 173 -Of course in Java, we may generate WebObjects classes with "get" methods as well in order to stick to convention. 174 -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. 175 - 176 -E.g, in Main.scala we annotate our component keys with ##@BeanProperty## to automatically create public "set" and "get" methods. 177 -These variables can then be accessed via //KVC//. 178 - 179 -{{code}} 180 - 181 -import scala.reflect.BeanProperty 182 - 183 -@BeanProperty var username = new String() 184 -@BeanProperty var password = new String() 185 -@BeanProperty var isAssistantCheckboxVisible = false 186 - 187 -{{/code}} 188 - 189 -== How to Use Scala Collections with EOF == 190 - 191 -One of the benefits of Scala is its very powerful, concurrency-ready collection classes - primarily ##List##, ##Map## and ##Set##. 192 -Employing these instead of ##NSArray## and ##NSDictionary## in WebObjects/EOF may be challenging. 193 - 194 -But one may modify the EO templates to produce API such as: 195 - 196 -{{code}} 197 - 198 -import scala.collection.JavaConversions._ 199 - 200 -def movies = { 201 - storedValueForKey(_Studio.Keys.MOVIES).asInstanceOf[NSArray[Movie]] 202 -} 203 - 204 -def moviesList = { 205 - movies.asInstanceOf[java.lang.Iterable[Movie]].toList 206 -} 207 - 208 -{{/code}} 209 - 210 -This employs a feature of Scala known as **implicit conversions** to automagically convert a NSArray (a Java Iterable) into a Scala Iterable. 211 - 212 212 == How to Add Scala to a WO Project == 213 213 214 214 {{include value="WOL:Adding Scala Support to a WOLips Project"}}{{/include}} 215 215 216 -{{note}} 161 +{{note title="Note"}} 217 217 218 218 This is for Eclipse/WOLips IDE 219 219 ... ... @@ -221,31 +221,23 @@ 221 221 222 222 == WO Scala Example == 223 223 224 -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. 225 225 All the EO logic and WO components are in Scala. 226 226 Only the Application class is Java. 227 227 228 -It is based on the D2W Movies example. 229 - 230 230 {{attachments patterns=".*zip"}}{{/attachments}} 231 231 232 232 === Setup === 233 233 234 -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. 235 235 1. Right-click on Application.java and run as a WOApplication (as usual). 236 236 237 -== EO Templates == 181 +==== EO Templates ==== 238 238 183 +See: [[Scala templates>>http://wiki.objectstyle.org/confluence/display/WOL/EOGenerator+Templates+and+Additions]] 184 + 239 239 When you create your ##.eogen## file, be sure to make the following changes in the EOGenerator Editor: 240 240 241 -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## 242 242 1. Change the File Names Extension to "scala" 243 -1. In Destination Paths set the Superclass Package (e.g: base) 244 244 1. Uncheck Java under Options 245 - 246 -== How to Build & Deploy a WebObjects Scala Project with Ant == 247 - 248 -1. [[Download>>http://www.scala-lang.org/downloads]] and install Scala 249 -1. Set ##scala.home## (the location Scala has been installed onto) in the project ##build.properties## file 250 -1. [[Add the scalac task and properties>>Configuring Ant to Build Scala with WebObjects]] to the ant build.xml file 251 -1. Run from the project directory: ##sudo ant clean install##