Changes for page WebObjects with Scala
Last modified by Ravi Mendis on 2011/05/10 02:10
From version 335.1
edited by Ravi Mendis
on 2010/03/04 22:54
on 2010/03/04 22:54
Change comment:
There is no comment for this version
To version 339.1
edited by Ravi Mendis
on 2009/10/13 18:54
on 2009/10/13 18:54
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,18 +1,15 @@ 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: 10 - 11 11 |= |= Objective-C |= Java |= Scala 12 12 |= Mutable/Immuable Datatypes | Collections //e.g: NSArray/NSMutableArray// | No | Yes 13 13 |= Closures | Blocks (//Extension//) | No | Anonymous Functions 14 14 |= Static variables | Yes | Yes | No 15 -|= Static methods orfunctions| Yes | Yes | No12 +|= Static methods/functions | Yes | Yes | No 16 16 |= Concurrency | [[Grand Central Dispatch>>http://en.wikipedia.org/wiki/Grand_Central_Dispatch]] (//Extension//)| //Threads// |[[Actors>>http://en.wikipedia.org/wiki/Actor_model]] 17 17 |= |= Weakly Typed |=--Strongly Typed--|= Strongly Typed 18 18 ... ... @@ -22,13 +22,18 @@ 22 22 |= Parametered methods | Yes //e.g: addObject: to~:// | No | Yes //e.g: add(object= ,to=)// 23 23 |= 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 -So for WebObjects developers, Scala offers itself as a powerful, safe and easy-to-use solution for [[concurrent applications>>Building Concurrent Applications with WebObjects and Scala]]. (In other words, Scala Actors can be used for problems that would have normally required threads). 29 +Scala offers concurrency that is (effectively) built-in to the language and is inherently thread-safe. 30 +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. 31 31 32 +In addition it may offer new solutions for concurrency in WebObjects and EOF. 33 + 32 32 === Can WebObjects be Programmed In Scala? === 33 33 34 34 Yes. It is very simple. ... ... @@ -45,22 +45,20 @@ 45 45 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. 46 46 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. 47 47 48 - The followingis an example of the use of a //Companion Object// for Talent in Scala instead of Talent static fields inJava.50 +In Java: 49 49 50 - Java:52 +{{code}} 51 51 52 -{{code value="java"}} 53 - 54 54 public class _Talent extends EOGenericRecord { 55 55 public static final String ENTITY_NAME = "Talent"; 56 56 57 57 {{/code}} 58 58 59 -Scala: 59 +In Scala: 60 60 61 61 {{code}} 62 62 63 -object Talent extends EOGenericRecord { 63 +object _Talent extends EOGenericRecord { 64 64 val ENTITY_NAME = "Talent" 65 65 66 66 {{/code}} ... ... @@ -71,7 +71,7 @@ 71 71 72 72 In Java: 73 73 74 -{{code value="java"}}74 +{{code}} 75 75 76 76 import com.webobjects.eocontrol.EOGenericRecord; 77 77 import com.webobjects.eocontrol.EORelationshipManipulation; ... ... @@ -94,7 +94,7 @@ 94 94 95 95 In Java: 96 96 97 -{{code value="java"}}97 +{{code}} 98 98 99 99 public class MenuHeader extends WOComponent { 100 100 ... ... @@ -115,11 +115,11 @@ 115 115 ==== Simplified Exception Handling ==== 116 116 117 117 Scala doesn't force you to catch exceptions unlike in Java. 118 -In addition, the syntax employs Scala's very powerful **pattern matching**to handle exceptions.118 +In addition, the syntax employs Scala's very powerful pattern matching to handle different exceptions. 119 119 120 120 In Java: 121 121 122 -{{code value="java"}}122 +{{code}} 123 123 124 124 try { 125 125 EditPageInterface epi = D2W.factory().editPageForNewObjectWithEntityNamed(_manipulatedEntityName, session()); ... ... @@ -153,33 +153,9 @@ 153 153 154 154 {{/code}} 155 155 156 -==== Scala Annotations vs. Generated Accessors ==== 157 - 158 -An example of accessing variables in WebObjects with the following languages: 159 - 160 -|= |= Objective-C |= Java |= Scala 161 -|= getter | ##object name## | ##object.name()## | ##object.name## 162 -|= setter | ##object setName:aName## | ##object.setName(aName)## | ##object.name = aName## 163 - 164 -Of course in Java, we may generate WebObjects classes with "get" methods as well in order to stick to convention. 165 -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. 166 - 167 -E.g, in Main.scala we annotate our component keys with ##@BeanProperty## to automatically create public "set" and "get" methods. 168 -These variables can then be accessed via //KVC//. 169 - 170 -{{code}} 171 - 172 -import scala.reflect.BeanProperty 173 - 174 -@BeanProperty var username = new String() 175 -@BeanProperty var password = new String() 176 -@BeanProperty var isAssistantCheckboxVisible = false 177 - 178 -{{/code}} 179 - 180 180 == How to Use Scala Collections with EOF == 181 181 182 -One of the benefits of Scala is its very powerful, concurrency-ready collection classes - primarily ##List##, ##Map## and ##Set##. 158 +One of the benefits of Scala is its very powerful, concurrency-ready collection classes - primarily ##List##, ##Map##, ##Seq## and ##Set##. 183 183 Employing these instead of ##NSArray## and ##NSDictionary## in WebObjects/EOF may be challenging. 184 184 185 185 But one may modify the EO templates to produce API such as: ... ... @@ -219,21 +219,15 @@ 219 219 === Setup === 220 220 221 221 1. [[Install the Scala eclipse IDE>>http://www.scala-lang.org/node/94]] 222 -1. Install and startthe OpenBase OBMovies database.198 +1. Install and run the OpenBase OBMovies database. 223 223 1. Right-click on Application.java and run as a WOApplication (as usual). 224 224 225 225 ==== EO Templates ==== 226 226 203 +See: [[Scala templates>>http://wiki.objectstyle.org/confluence/display/WOL/EOGenerator+Templates+and+Additions]] 204 + 227 227 When you create your ##.eogen## file, be sure to make the following changes in the EOGenerator Editor: 228 228 229 -1. Point to the local [[Scala versions>>http://wiki.objectstyle.org/confluence/display/WOL/EOGenerator+Templates+and+Additions]]ofthe .eotemplate files for ##Entity## and ##//Entity//##207 +1. Point to the local .eotemplate files for ##Entity## and ##//Entity//## 230 230 1. Change the File Names Extension to "scala" 231 -1. In Destination Paths set the Superclass Package (e.g: base) 232 232 1. Uncheck Java under Options 233 - 234 -== How to Build & Deploy a WebObjects Scala Project with Ant == 235 - 236 -1. [[Download>>http://www.scala-lang.org/downloads]] and install Scala 237 -1. Set ##scala.home## (the location Scala has been installed onto) in the project ##build.properties## file 238 -1. [[Add the scalac task and properties>>Configuring Ant to Build Scala with WebObjects]] to the ant build.xml file 239 -1. Run from the project directory: ##sudo ant clean install##