Project

General

Profile

Wiki » History » Version 12

Henning Blohm, 23.01.2015 09:55

1 1 Henning Blohm
h1. Intro
2
3 2 Henning Blohm
This project is for the development of [[z2-environment:wiki|z2-environment]] version 3.0.
4 1 Henning Blohm
5 2 Henning Blohm
Version 3.0 is a major refactoring release of z2 with new repository code lines and complete package renaming.
6 1 Henning Blohm
7 2 Henning Blohm
h1. Essential Differences between v2.3 and v3.
8 1 Henning Blohm
9 2 Henning Blohm
* All the typical declarations and package names are no longer *com.zfabrik.<something>* but rather *org.z2env.<something>*
10 3 Henning Blohm
* The <z2 home> layout is completely new.
11
* The essential component types that can be _invoked_ from the core is *system state* and *main program*.
12 2 Henning Blohm
* While Jetty is still contained to support Eclipsoid and z2Unit, we support a pre-installed Tomcat as application container.
13 1 Henning Blohm
* The core is lighter and more dedicated. 
14 12 Henning Blohm
* There will be substantially less built-in application support like
15
** a local JTA implementation 
16
** No worker suppport without a corresponding add-on.
17 1 Henning Blohm
18 12 Henning Blohm
The main task of v3 is:
19
* Make the lower parts of z2 more accessible and easier to understand
20
* Increase the OSS flavor of z2
21
22
23 9 Henning Blohm
h1. Draft Intro Documentation
24 1 Henning Blohm
25 2 Henning Blohm
h2. Getting Started
26 1 Henning Blohm
27 2 Henning Blohm
To understand how z2 works, you need to understand at most what are z2 modules and components and what are component repositories and how these concepts interplay. 
28 1 Henning Blohm
29 6 Henning Blohm
Check out [[wiki#Understanding-Z2|understanding-z2]] for that.
30 1 Henning Blohm
31 2 Henning Blohm
It is simplest to start by running a simple Java main program in z2 or a simple Web App. 
32 1 Henning Blohm
33 2 Henning Blohm
Follow this trail:
34 1 Henning Blohm
35 4 Henning Blohm
* [[wiki#Building-z2env-core|Building the core]]
36 7 Henning Blohm
* [[wiki#Running-a-Hello-World-main-program|Running a Hello World main program]]
37 10 Henning Blohm
* [[wiki#Running-a-Hello-World-Web-App|Running a Hello World Web App]]
38 1 Henning Blohm
39 3 Henning Blohm
h2. Building z2env-core
40 1 Henning Blohm
41 3 Henning Blohm
First clone http://git.z2-environment.net/z2env.core
42
43
<pre>
44
git clone http://git.z2-environment.net/z2env.core
45
</pre>
46
47
Switch into *org.z2env.core.main* and run 
48
49
<pre>
50 5 Henning Blohm
ant -Doutput=<location of z2 home> -Dsetup=<preconfigured roots> 
51 3 Henning Blohm
</pre>
52
53 5 Henning Blohm
where <location of z2 home> is where you want to install z2 (the <z2-home>) and <preconfigured roots> is a choice of pre-configured content, actually component repositories.
54 3 Henning Blohm
55
If you omit *output* it will default to *gen/dist*. If you omit *setup*, no content will be pre-configured will be modified. 
56
57
Check the folder *setups* for available setups of the core build. These can be local (all repos will be cloned locally) or remote (repos will be remoted).
58
59
In general this build always updates only boot, z.jar, roots. It will not remove anything.
60
61
Example to install/update a core only into ../../z2env:
62
63
<pre>
64
ant -Doutput=here 
65
</pre>
66
67
To install/update a web-basic setup (with tomcat and eclipsoid support) with updates from remote repos:
68
69
<pre>
70
ant -Doutput=../../z2env -Dsetup=web-basic-remote
71 1 Henning Blohm
</pre>
72 7 Henning Blohm
73
h2. Running a Hello World main program
74
75
For now, we will assume you have a z2 core installed in <HOME>. In its purest form, all the core can actually execute is simple Java main programs. 
76
77
Being in a modular environment, even if we only want to say „Hello World“, we need a module. Let's call it the greeter module. In order to have a main program run by z2, we need to also declare a  component for it, as that is what we tell z2 to run (not a class – mind you – but rather a component in a module). Assuming we use the local component name hello, than the absolut component name is 
78
79
<pre>
80
greeter/hello
81
</pre>
82
83
Finally, as this component actually has implementation code, we need to declare a Java component. By convention this is 
84
85
<pre>
86
greeter/java
87
</pre>
88
89
Now, after installing in <HOME> the place to simply drop a module is under <HOME>/modules. All in all, here is the complete structure to create:
90
91
| <HOME>/modules/greeter/hello.properties | 
92
<pre><code class="ruby">org.z2env.component.type=org.z2env.main
93
component.className=greetings.Main
94
</code></pre> |
95
| <HOME>/modules/greeter/java/z.properties | 
96
<pre><code class="ruby">org.z2env.component.type=org.z2env.java
97
</code></pre> |
98
| <HOME>/modules/greeter/java/src.impl/greetings/Main.java |
99
<pre><code class="java">
100
package greetings;
101
102
public class Main {
103
  public static void main(String[] args) {
104 8 Henning Blohm
    System.out.println("Hello!");
105 7 Henning Blohm
  }
106
}
107
</code></pre> |
108
109
That gives us the two components of module greeter. To run this on the command line, run
110
111
<pre>
112
java -DcomponentName=greeter/hello -jar z.jar
113
</pre>
114
115 1 Henning Blohm
Now, obviously this sample is not worth a modular execution environment. But even from here, you could check your module in with some Git repository that is referenced from the roots and all other users of the same repo would be able to run your component without installing anything.
116 10 Henning Blohm
117
h2. Running a Hello World Web App
118
119 11 Henning Blohm
This introduction explains how to connect a z2 core to a given Tomcat installation and how to develop a simple Web Application.
120 7 Henning Blohm
121 11 Henning Blohm
Furthermore it describes how to use the Dev Repository and the Eclipsoid plugin for the Eclipse or the IntelliJ development environment.
122 7 Henning Blohm
123 11 Henning Blohm
h3. Pre-Requisites
124
125
* We assume the Eclipse IDE.
126
* Please install the Eclipsoid Plugin from http://z2-environment.net/eclipsoid/update/site.xml
127
* We assume a development workspace in *workspace*.
128
* Have a local Tomcat (7 or higher) installation.*
129
130
h3. Steps we are going to take
131
132
# Create a module with a simple Web app
133
# Make it visible to Z2
134
# Run the Web App in a Tomcat Web Container
135
136
At first get yourself a z2env core with the *web-basic-local* or *web-basic-remote* setup. Make sure it is in your *workspace*. If you follow [[wiki#Building-z2env-core|Building the core]] this means running 
137
138
<pre>
139
ant -Doutput=workspace/z2env -Dsetup=web-basic-remote
140
</pre>
141
142
Using your IDE create a new project *hello* in *workspace* with the following structure:
143
144
145
| java/z.properties | 
146
<pre><code class="ruby">
147
org.z2env.component.type=org.z2env.java
148
java.privateReferences=\
149
	javax.servlet
150
</code></pre> |
151
| web/z.properties |
152
<pre><code class="ruby">
153
org.z2env.component.type=org.z2env.tomcat.webapp
154
webapp.path=/hello
155
</code></pre> |
156
| web/WebContent/index.jsp |
157
<pre><code class="html"><html><body>Hello! Did you know that 7*7=<%=7*7%>?</body></html></code></pre> |
158
| LOCAL | <empty file> |
159
160
So far, that's it.  We will touch on the LOCAL file later. 
161
162
When we run Z2 knowing this Web Application, it will attempt to start a Tomcat Web Container that will serve the application's content. To do that, it needs to find one. 
163
164
In order to tell Z2 where to look, you can either set an environment variable *CATALINA_HOME* (you might have already – it's the Tomcat standard) or specify an environment variable *catalina.home*. 
165
166
To be on the safe side and assuming the location is */home/me/tomcat*, we open a terminal, change into *workspace/z2env* and run
167
168
<pre>
169
java -Dcatalina.home=/home/me/tomcat -jar z.jar hello/web
170
</pre>
171
172
Note, unlike for the main program, the command line will not return. Instead you can enter „q“ to quit or „s“ to synchronize. But first let's open a browser and check out 
173
174
<pre>
175
http://localhost:8080/hello
176
</pre>
177
178
Now on to that LOCAL file. Unlike for the Hello World main program, this time it was to so-called Dev Repo that made our module available to z2. 
179
180
The dev repo is a key component to the development approach with z2. It checks for all modules that have a LOCAL file and that are stored some levels deep, relative to the parent folder of the z2 home (by default), which not so coincidentally is our workspace.
181
182
Try this: 
183
184
# Remove LOCAL
185
# Enter „s“ for synchronization. 
186
# Check the URL above (should say „not found“)
187
# Create a LOCAL file again
188
# Synchronize
189
# Check again.
190
191
Similarly, from now on, changes made to the hello module will be picked up, whenever you synchronize.
192
193 1 Henning Blohm
h2. Developing with Eclipsoid
194
195 12 Henning Blohm
Add some real code for the web app, resolve classpath in IDE with Eclipsoid
196
197 1 Henning Blohm
TBD
198 12 Henning Blohm
199
h2. Multi-Module Development
200
201
TBD
202
203
h2. Going System-Centric
204
205
TBD
206
207
Getting more real by adding a remote repo as system repo.
208
209
Develop by checking out modules and using the Dev Repo.
210
211 3 Henning Blohm
212
h2. Understanding the <HOME>
213
214
We call an installation of a z2env core a *<home>*. The file structure of the *<home>* consists of few but important locations:
215
216
| z.jar | The actual core implementation. This is precompiled.|
217
| boot/ | A component repository adding to the core and provides the most basic capabilities such as compiling Java code and running a main program. |
218
| roots/ | A file system component repository that is always registered by the core. This is typically filled with other repository components linking to remote or local component repositories. |
219
| modules/ | A file system repository declared under roots/ that is useful to locally augment a core installation.|
220 1 Henning Blohm
221
We use the modules repository for example for command line experiments and simple hacks. It is not as useful for regular development operations as is the dev repo.
222 5 Henning Blohm
223
h2. Understanding Z2
224
225
Most of the concepts that make up z2 can be derived from the desire to efficiently develop standard Java Web Applications that are defined in a central system definition. Add to that the wish to avoid all that build complexity and the desire for a practically usable modularization approach.
226
227
Once you loose the ability to tweak some build script or configuration to describe how to package a Web app or some libraries, you need some structural hint and simple declarations providing sufficient information.
228
229
Secondy, assuming you want to apply changes at runtime, you need some way of determining what to unload at runtime, given some changed file. Again: Structural information needs to present that maps to runtime state. 
230
231
Finally, as we want some support for modular application development anyway, why not make modules our essential structure. As we have not only code but also Web Applications, Data Sources,  Background Jobs and much more to consider, we add components with type into the mix. Voila.
232
233
*Component Repositories* provides modules and components to z2. A component is prefixed by the module name:
234
235
<pre>
236
<global component name> = <module name>/<local component name>
237
</pre>
238
239
In fact, the typical component repository has a file system style structure that is made up exactly like that. 
240
241
Structure from repo root:
242
243
| /<module>/<cmp>.properties | A component <cmp> in module <module> that has no resources on its own.|
244
| /<module>/<cmp>/z.properties | A component <cmp> in module <module> that may have additional resources on its own.|
245
246
Note that some components, like Web applications and typically Java components have file resources, such as HTML files or Java source code files, while other components, such as main program declarations or data source declarations, so not.
247
248
There are some conventions around this naming scheme. In particular, by convention, whenever a component requires Java implementation, z2 will first look for a component named *java* of the same module. As for example in the Hello World example.
249
250
To give you an idea what this model translates to at runtime consider this: At runtime, the static component is turned into a Resource instance by a component type implementation (that, in fact, is provided by another, built-in component type). 
251
252
!uml1.png!
253
254
Dependencies, for example those between Java components, translate into dependencies between resources that are observed during invalidation of resources. This introduces invalidation and synchronization.
255
256
A crucial concept of z2 is that of a synchronization. 
257
258
For fast development roundtrips and in some cases for general configuration updates, it is desirable to not require a complete restart of a Java Virtual Machine process but rather just to change runtime state accordingly. 
259
260
In z2 a synchronization describes the following process:
261
262
# Check for changes in component repositories
263
# Based on changes found, identify components affected and invalidate associated runtime resources incl. dependent resources.
264
# Try to attain target states
265
266 1 Henning Blohm
That is, whenever you do a change and trigger a synchronization from your IDE, this is exactly what happens: Identify what needs to be thrown away, make sure to remove dependent stuff as well,  bring up what needs to be running.
267 9 Henning Blohm
268
h2. The Component Model
269
270
See [[z2-environment:Z2_Modules_intro]]
271
272
h2. Java Components
273
274
See [[z2-environment:Z2_Java_components_intro]]