The document discusses various ways to map between different data models representing company structures, including:
- Serializing Java objects to an XML or binary format
- Using JAXB annotations to map between XML and Java classes
- Generating Java classes from an Ecore metamodel
- Specifying Hibernate mappings between Java classes and relational database tables
- Directly mapping between relational tables and Java classes with Hibernate
Choose'10: Ralf Laemmel - Dealing Confortably with the Confusion of Tongues
1. Dealing comfortably with
the confusion of tongues
Ralf Lämmel
Software Languages Team, Koblenz
http://en.wikipedia.org/wiki/Tower_of_Babel_(M._C._Escher)
4. Technology used in the
5th edition of Channel9
ASP.NET MVC
SparkView engine
jQuery
Silverlight 4
Windows Azure, SQL Azure, “other Azures”
ECN for the Content Delivery Network (videos)
http://channel9.msdn.com/Blogs/C9Team/Welcome-to-the-all-new-Channel-9
7. • What domain?
• Programming
• X/O/R mapping
• XML/database processing
• GUI
• ...
• What engineering?
• megamodeling programming
• software language engineering
CH
O
O
SE
Forum
2012
D
om
ain-specific
Engineering
8. A simpler riddle: how to usefully
characterize these XML technologies?
DOM
SAX
StAX
9. DOM [Wikipedia]
The Document Object Model (DOM) is a cross-platform
and language-independent convention for
representing and interacting with objects in HTML,
XHTML and XML documents. Aspects of the DOM
(such as its "Elements") may be addressed and
manipulated within the syntax of the programming
language in use. The public interface of a DOM is
specified in its Application Programming Interface
(API). ...
10. SAX [Wikipedia]
SAX (Simple API for XML) is a sequential access
parser API for XML. SAX provides a mechanism for
reading data from an XML document. It is a popular
alternative to the Document Object Model (DOM). ... A
parser which implements SAX (ie, a SAX Parser)
functions as a stream parser, with an event-driven API.
The user defines a number of callback methods that
will be called when events occur during parsing. ...
11. StAX [Wikipedia]
Streaming API for XML (StAX) is an application
programming interface (API) to read and write XML
documents, originating from the Java programming
language community. Traditionally, XML APIs are
either: tree based, ..., event based. ... These two access
metaphors can be thought of as polar opposites. ...
StAX was designed as a median between these two
opposites. ...
12. DOM SAX StAX
Read (parse, query) XML • • •
Write XML • •
Metadata! Metadata! Metadata!
13. DOM SAX StAX
In-memory XML processing •
Push-based XML parsing •
Pull-based XML parsing •
Metadata! Metadata! Metadata!
15. Follow-up questions?
How to usefully abstract from XML in
defining “push-based”?
How to usefully share conceptual
understanding across DOM and JAXB?
... between JAXB and Hibernate?
...
16. An advanced programming class
The Expression Problem
The Visitor Design Pattern
Parsing
XML Processing
XML Validation
XML Data Binding
Database Access
O/R Mapping
Model View Controller
More Design Patterns
Reflection
Aspect-Oriented Programming
Functional OO Programming
Combinator Libraries
Generic Programming
Programming with Threads
Distributed Programming
WebService Programming
17. Our ultimate goal:
heavily annotate programmig
and language technologies and
their uses with metadata
facilitating understanding.
25. A few variation points
X vs. O vs. R vs. λ etc.
Static typing vs. dynamic typing
Textual vs. abstract vs. visual syntax
GPPL vs. DSL vs. embedding vs. API
Instance- vs. operation-based mapping
Type checking vs. inference vs. reasoning
Code first vs. schema first vs. mapping only
In-memory processing vs. push vs. pull parsing
Pure vs. impure transformations (or in between)
Code vs. generative vs. model-driven vs. mapping
28. Model ANTLR
company : 'company' STRING '{' dept* '}';
dept :
'department' STRING '{'
('manager' employee)
('employee' employee)*
dept* '}';
employee :
STRING '{'
'address' STRING
'salary' FLOAT '}';
WS : (' '|'r'? 'n'|'t')+ {skip();};
STRING : '"' (~'"')* '"';
FLOAT : ('0'..'9')+ ('.' ('0'..'9')+)?;
CFGs for HR notation.
The aspect of “sharing
knowledge” is
underestimated.
Purity of CFGs
is an i!usion.
29. Model Haske!
type Company = [Dept]
data Dept = Dept Name Manager [SubUnit]
type Manager = Employee
data Employee = Employee Name Address Salary
data SubUnit = PU Employee | DU Dept
type Name = String
type Address = String
type Salary = Float
Structure is defined by
sequence, cases, and
recursion.
Algebraic datatypes
imply tree shape of
data instances.
Models use nominal
& structural types,
and aliases.
30. Model Ecore
There are recurring
themes for
primitive types.
Lists or co!ections
may in fact be
distinguished
structural forms.
31. Model Ecore/Java/EMF
/**
* @model
*/
public interface Person extends EObject {
/**
* @model required="true" ordered="false"
*/
String getName();
void setName(String value);
/**
* @model required="true" ordered="false"
*/
String getAddress();
void setAddress(String value);
}
Programs
are
models.
Models
are
programs.
38. Total XML/DOM/XPath
public static double total(Document doc)
throws Exception {
double total = 0;
NodeList nodelist =
XPathAPI.selectNodeList(doc, "//salary");
for (int i=0; i<nodelist.getLength(); i++) {
Element elem = (Element)nodelist.item(i);
total += Double.parseDouble(elem.getTextContent());
}
return total;
} Host language may run embedded programs
and inspect results.
39. Total XML/Java/JAXB
public class Total {
public static double total(Company c) {
double total = 0;
if (c.getDept() != null)
for (Dept d : c.getDept())
total += total(d);
return total;
}
public static double total(Dept d) { ... }
public static double total(Employee e) { ... }
public static double total(Subunit s) { ... }
}
POJOs
Time and again.
40. Total SQL DML
SELECT SUM(salary)
FROM employee;
What’s the XML/OO
counterpart to
projection?
Query languages
provide aggregators.
41. Total Java / JDBC
public static double total(MyConnection myConnection)
throws SQLException {
double total = 0;
String query =
"SELECT salary FROM employee";
PreparedStatement pstmtEmployees =
myConnection
.getConn()
.prepareStatement(query);
ResultSet salaries = pstmtEmployees.executeQuery();
while (salaries.next())
total += salaries.getDouble("salary");
return total;
}
Iterators on lazy
server results
42. Total RDF/Java/Jena
public static double total(CompanyModel c) {
double total = 0;
StmtIterator i =
c.getModel().listStatements(
new SimpleSelector(
null, c.SALARY, (RDFNode) null));
while (i.hasNext()) {
Statement s = i.next();
total += s.getDouble();
}
return total;
}
Selection
(quantification) over
graphs requires
identities.
43. Ecore/ATL
module Total;
create OUT: Total from IN: Company;
rule Company2Total {
from
company : Company!Company
to
t : Total!TotalWrapper (
total <- Company!Employee.allInstances()
-> collect(e | e.salary)
-> sum()
)
}
Total
Quantification,
Projection,
A'regation
45. Cut Haske!
cut :: Company -> Company
cut = everywhere (mkT (/(2::Float)))
The type of a pure function reveals
its nature of being a transformation.
46. Cut EMF/Java
public class Cut {
public static void cutCompany(Company company) {
for (Dept dept : company.getDepts())
cut(dept);
}
private static void cut(Dept dept) { ... }
private static void cut(Subunit subunit) { ... }
private static void cut(Employee employee) {
employee.setSalary(employee.getSalary() / 2);
}
}
The appearance of “void” in an
imperative (OO) language su'ests
impure transformation.
47. Cut XML/XQuery
copy $copy := .
modify
for $salary in $copy//salary
return
replace value of node $salary
with $salary div 2
return $copy
The distinction of pure vs.
impure is not always easy.
53. Map Java/Serializable
import org.softlang.company.*;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
FileInputStream fis =
new FileInputStream("sampleCompany.ser");
ObjectInputStream in =
new ObjectInputStream(fis);
Object o =
in.readObject();
in.close();
Company c = (Company)o; Use a universal object
representation.
54. XML/Java/JAXBMap
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"name", "address"})
@XmlRootElement(name = "person")
public class Person {
@XmlElement(required = true)
protected String name;
@XmlElement(required = true)
protected String address;
public String getName() { return name; }
public void setName(String value) { name = value; }
public String getAddress() { return address; }
public void setAddress(String value) { address = value; }
}
Annotations capture mapping
including constraints.
55. XML/Java/JAXB
import org.softlang.company.*;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.File;
File input =
new File("sampleCompany.xml");
JAXBContext jaxbContext =
JAXBContext.newInstance("org.softlang.company");
Unmarshaller unMarshaller =
jaxbContext.createUnmarshaller();
Company c =
(Company) unMarshaller.unmarshal(input);
Map
There is a 1:1 mapping
between
names of program types &
serialization-level names.