Project

General

Profile

Getting Started » History » Version 14

Henning Blohm, 01.03.2015 21:53

1 3 Henning Blohm
h1. Getting Started with org.z2env
2 1 Henning Blohm
3
See also [[FAQ]]
4
5
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. 
6
7
Check out [[wiki#Understanding-Z2|understanding-z2]] for that.
8
9
It is simplest to start by running a simple Java main program in z2 or a simple Web App. 
10
11
Follow this trail:
12
13
* [[Getting Started#Building-z2env-core|Building the core]]
14
* [[Getting Started#Running-a-Hello-World-main-program|Running a Hello World main program]]
15
* [[Getting Started#Running-a-Hello-World-Web-App|Running a Hello World Web App]]
16
* [[Getting Started#Developing-with-Eclipse-or-IntelliJ|Developing with Eclipse or IntelliJ]]
17
* [[Getting Started#Going-Multi-Module|Going Multi Module]]
18 14 Henning Blohm
* [[Getting Started#Going-System-Centric|Going System Centric]]
19 1 Henning Blohm
20 9 Henning Blohm
---
21 1 Henning Blohm
22
h2. Building z2env-core
23
24
(For now, we need to build the core).
25
26 4 Henning Blohm
{{collapse
27 1 Henning Blohm
h3. Pre-requisites
28
29
* You need Git installed
30
* You need a JDK, at least version 7
31
* You need the ANT build tool
32
33
First clone http://git.z2-environment.net/z2env.core
34
35
<pre>
36
git clone http://git.z2-environment.net/z2env.core
37
</pre>
38
39
Change into *org.z2env.core.main* and run 
40
41
<pre>
42
ant -Doutput=<z2home> -Dsetup=<setup> 
43
</pre>
44
45
where <z2home> is where you want to install z2 (the *z2 home* that is) and <setup> is a choice of pre-configured content, actually component repositories.
46
47
If you omit *output* it will default to *gen/dist*. If you omit *setup*, no content will be pre-configured will be modified. 
48
49
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).
50
51
In general this build always updates only boot, z.jar, roots. It will not remove anything.
52
53
54
Example to install/update a core only into ../../z2env:
55
56
<pre>
57
ant -Doutput=../../z2env 
58
</pre>
59
60
To install/update a web-basic setup (with tomcat and eclipsoid support) with updates from remote repos:
61
62
<pre>
63
ant -Doutput=../../z2env -Dsetup=web-basic-remote
64
</pre>
65
66
Check out [[wiki#Understanding-the-ltHOMEgt|Understanding the <HOME>]] to learn more about the generated structure.
67
68 2 Henning Blohm
h4. Summary
69 1 Henning Blohm
70 2 Henning Blohm
* At any time you can update a z2 core installation by running the core build and using the *output* property to point to your installation
71
* Using the *setup* property you can choose between completely local setups (no remote access required - no automatic synchronization from remote either) or mostly remote setups (all except the core will be synchronized from remote repositories). 
72
73 4 Henning Blohm
}}
74
75 9 Henning Blohm
76
---
77
78 1 Henning Blohm
h2. Running a Hello World main program
79
80 5 Henning Blohm
In this section we will let z2 do what it is actually made for: Run some Java program in a modular environment without build and deploy.
81
82 4 Henning Blohm
{{collapse
83 1 Henning Blohm
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. 
84
85
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 
86
87
<pre>
88
greeter/hello
89
</pre>
90
91
Finally, as this component actually has implementation code, we need to declare a Java component. By convention this is 
92
93
<pre>
94
greeter/java
95
</pre>
96
97
Now, after installing in <HOME> the place to simply drop a module is under <HOME>/modules. You might need to create that folder.
98
99
All in all, here is the complete structure to create:
100
101
| <HOME>/modules/greeter/hello.properties | 
102
<pre><code class="ruby">org.z2env.component.type=org.z2env.main
103
component.className=greetings.Main
104
</code></pre> |
105
| <HOME>/modules/greeter/java/z.properties | 
106
<pre><code class="ruby">org.z2env.component.type=org.z2env.java
107
</code></pre> |
108
| <HOME>/modules/greeter/java/src.impl/greetings/Main.java |
109
<pre><code class="java">
110
package greetings;
111
112
public class Main {
113
  public static void main(String[] args) {
114
    System.out.println("Hello!");
115
  }
116
}
117
</code></pre> |
118
119
That gives us the two components of module greeter. To run this on the command line, run
120
121
<pre>
122
java -DcomponentName=greeter/hello -jar z.jar
123
</pre>
124
125
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.
126
127 2 Henning Blohm
h4. Summary
128
129
* Running a simple program in a modular environment requires no more than declaring the modules and add some code
130
* Apart from more technical component types, at the heart of the z2 core is to run simple Java main programs
131
132 4 Henning Blohm
}}
133 2 Henning Blohm
134 9 Henning Blohm
135
---
136
137 1 Henning Blohm
h2. Running a Hello World Web App
138
139 6 Henning Blohm
Rather than just running a Main program, using the Tomcat add-on we might as well run full-featured Web applications - of course: From anywhere, without build and deploy.
140
141 4 Henning Blohm
{{collapse
142
143 1 Henning Blohm
This introduction explains how to connect a z2 core to a given Tomcat installation and how to develop a simple Web Application.
144
145
Furthermore it describes how to use the Dev Repository and the Eclipsoid plugin for the Eclipse or the IntelliJ development environment.
146
147
h3. Pre-Requisites
148
149
* We assume a development workspace in *workspace*.
150
* Have a local Tomcat (7 or higher) installation.*
151
152
h3. Steps we are going to take
153
154
# Create a module with a simple Web app
155
# Make it visible to Z2
156
# Run the Web App in a Tomcat Web Container
157
158
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 
159
160
<pre>
161
ant -Doutput=workspace/z2env -Dsetup=web-basic-remote
162
</pre>
163
164
(*Note:* If in doubt, use an absolute path for *workspace*)
165
166
Using your IDE create a new project *hello* in *workspace* with the following structure:
167
168
| java/z.properties | 
169
<pre><code class="ruby">
170
org.z2env.component.type=org.z2env.java
171
java.privateReferences=\
172
	javax.servlet
173
</code></pre> |
174
| web/z.properties |
175
<pre><code class="ruby">
176
org.z2env.component.type=org.z2env.tomcat.webapp
177
webapp.path=/hello
178
</code></pre> |
179
| web/WebContent/index.jsp |
180
<pre><code class="html"><html><body>Hello! Did you know that 7*7=<%=7*7%>?</body></html></code></pre> |
181
| LOCAL | <empty file> |
182
183
Your *workspace* folder now contains two subfolders *z2env* and *hello*.
184
185
So far, that's it.  We will touch on the LOCAL file later. 
186
187
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. 
188
189
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*. 
190
191
To be on the safe side and assuming the location is */home/me/tomcat*, we open a terminal, change into *workspace/z2env* and run
192
193
<pre>
194
java -Dcatalina.home=/home/me/tomcat -jar z.jar hello/web
195
</pre>
196
197
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 
198
199
<pre>
200
http://localhost:8080/hello
201
</pre>
202
203
*Note:* What you just created is a prototypical z2 module structure containing a Java component *java* (holding implementation) and a Web component *web*. 
204
205
Instead of creating the structure yourself, you could use the Eclipsoid plugin (introduced below) for that:
206
* In Eclipse: New / Others / new z2...., 
207
* In IntelliJ: New / Module / z2....
208
209
... but beware of the pre-generated configuration. Where it says *com.zfabrik* change to *org.z2env*.
210
211
212
*Note:* 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. 
213
214
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.
215
216
We call modules with a LOCAL file _armed_.
217
218
*Note:* By default the dev repo looks for modules beneath the parent folder of the <home> location. Use the system property *org.z2env.dev.local.workspace* to specify other locations (separated by comma) to check for modules.
219
220
221
Try this: 
222
223
# Remove LOCAL
224
# Enter „s“ for synchronization. 
225
# Check the URL above (should say „not found“)
226
# Create a LOCAL file again
227
# Synchronize
228
# Check again.
229
230
Similarly, from now on, changes made to the hello module will be picked up, whenever you synchronize.
231
232 2 Henning Blohm
h4. Summary
233
234
* Addons extend z2 with capabilities, such as a Tomcat hosted Web application (albeit running in z2's module environment)
235
* The _dev repository_ allows to flexibly define local modules. Modules can put into or out visibility by a simple LOCAL marker file.
236
237 4 Henning Blohm
}}
238
239 9 Henning Blohm
240
---
241
242 1 Henning Blohm
h2. Developing with Eclipse or IntelliJ
243
244
In this section we will add some code to the hello Web app and see how to develop using an integrated development environment like the Eclipse IDE or Jetbrains' IntelliJ IDEA.
245
246 4 Henning Blohm
{{collapse
247
248 1 Henning Blohm
h3. Pre-Requisite
249
250
* Have an Eclipse or IntelliJ installation
251
* Install the Eclipsoid plugin from http://z2-environment.net/eclipsoid/update/site.xml or by searching for "z2" in the IntelliJ Plugin Repository respectively
252
253
h3. Steps we are going to take
254
255
# Complete the development workspace setup
256
# Add a simple Controller
257
258
h4. In Eclipse
259
260
Use the workspace *workspace*. Create a Java project *hello* where we created the *hello* module. That is, we use the existing module as project content. You should now have an Eclipse development workspace that has one Java project named "hello". Right-click on the project and choose "Transform into z2 Project". A small "Z" icon should not decorate the project icon. 
261
262
Add a source folder *java/src.impl* to the project.
263
264
Try "Arm Z2 Projects" and "Disarm Z2 Projects" from the context menu. You should see a LOCAL file showing up and disappearing as well as the "Z" decoration showing a green halo and going back to normal. 
265
266
Go into Window/Preferences, pick "z2-Environment". Change the port to 8081, set the user to "z*" and the password to "z". Done.
267
268
h4. In IntelliJ
269
270
Add a source folder *java/src.impl* to the module.
271
272
Start a new Project with root folder *workspace*. Press the "Manage z2-Modules" button in the toolbar. Import the *hello* module into your IntelliJ project. Open the Settings dialog, pick "z2-Environment". Change the port to 8081, set the user to "z*" and the password to "z". Done.
273
274
h4. Independently of whether you use IntelliJ or Eclipse
275
276
Start z2 as in the previous section but make sure the development support is enabled. Use this command line:
277
278
<pre>
279
java -Dcatalina.home=/home/me/tomcat -jar z.jar org.z2env.dev.shared/ready hello/web
280
</pre>
281
282
(possibly you want to turn this into a shell script)
283
284
*Note:* The _system state_ *org.z2env.dev.shared/ready* will pull up all necessary development support components. Make sure this is part of your to-be-run list.
285
286
287
Regardless whether you are using Eclipse or IntelliJ, press the "Resolve Classpath from Z2" button in the toolbar. This will make sure that all required dependencies for Z2 modules, as far as Java code is concerned, will be resolved for your workspace. 
288
289
Now add a class *SimpleController* and change the following files:
290
291
| java/src.impl/hello/SimpleController.java | 
292
<pre><code class="java">
293
package hello;
294
295 11 Henning Blohm
import goodbye.GoodbyeService;
296
297 1 Henning Blohm
import java.io.IOException;
298
299 11 Henning Blohm
import javax.servlet.ServletException;
300
import javax.servlet.annotation.WebServlet;
301
import javax.servlet.http.HttpServlet;
302
import javax.servlet.http.HttpServletRequest;
303
import javax.servlet.http.HttpServletResponse;
304 1 Henning Blohm
305 11 Henning Blohm
import org.z2env.components.IComponentsLookup;
306
307
@WebServlet(urlPatterns="/do")
308
public class SimpleController extends HttpServlet {
309
	private static final long serialVersionUID = 1L;
310
	
311
	@Override
312 1 Henning Blohm
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
313 11 Henning Blohm
        GoodbyeService gb = IComponentsLookup.CL.lookup("goodbye/service", GoodbyeService.class);
314 1 Henning Blohm
        String input = req.getParameter("input");
315 13 Henning Blohm
        if (input!=null && input.trim().length()>0)package hello;
316
317
import goodbye.GoodbyeService;
318
319
import java.io.IOException;
320
321
import javax.servlet.ServletException;
322
import javax.servlet.annotation.WebServlet;
323
import javax.servlet.http.HttpServlet;
324
import javax.servlet.http.HttpServletRequest;
325
import javax.servlet.http.HttpServletResponse;
326
327
import org.z2env.components.IComponentsLookup;
328
329
@WebServlet(urlPatterns="/do")
330
public class SimpleController extends HttpServlet {
331
    private static final long serialVersionUID = 1L;
332
333
    @Override
334
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
335
        GoodbyeService gb = IComponentsLookup.CL.lookup("goodbye/service", GoodbyeService.class);
336
        String input = req.getParameter("input");
337 1 Henning Blohm
        if (input!=null && input.trim().length()>0) {
338 11 Henning Blohm
            req.setAttribute(
339
                "output",
340 12 Henning Blohm
                "Hello "+input
341 11 Henning Blohm
            );
342
            req.setAttribute("input",input);
343 1 Henning Blohm
        }
344
        req.getRequestDispatcher("/").forward(req,resp);
345
    }
346 13 Henning Blohm
} {
347
            req.setAttribute(
348
                "output",
349
                "Hello "+input
350
            );
351
            req.setAttribute("input",input);
352
        }
353
        req.getRequestDispatcher("/").forward(req,resp);
354
    }
355 1 Henning Blohm
}
356
</code></pre> |
357
| java/z.properties | 
358
<pre><code class="ruby">
359
org.z2env.component.type = org.z2env.java
360
361
java.privateReferences=\
362
  javax.servlet,\
363
  javax.servlet.jsp.jstl
364
</code></pre> |
365
| web/WebContent/index.jsp |
366
<pre><code class="html">
367
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core_1_1" %>
368
<html>
369
<body>
370
  <c:if test="${not empty output}">
371
    <p><c:out value="${output}"/></p>
372
  </c:if>
373
  <form method="POST" action="<c:url value='/do'/>">
374
    Input: <input type="text" name="input"><input type="submit" value="go!">
375
  </form>
376
</body>
377
</html>
378
</code></pre>|
379
380
Make sure the *hello* module is armed (right-click) by having a LOCAL file.
381
382
Now synchronize your running z2 by either:
383
384
* Pressing the "Sync with z2-Environment" button in the toolbar
385
* Pressing ALT+y in your IDE
386
* Entering "s" on the command line running z2.
387
388
Go to http://localhost:8080/hello and check it out.
389
390 2 Henning Blohm
h4. Summary
391 1 Henning Blohm
392 2 Henning Blohm
* Using IDE plugins for Eclipse or IntelliJ you can conveniently develop for Z2.
393
* Regardless of the component types in use, all class path considerations will be resolved from Z2 and you will never need to change IDE configuration.
394
* Using the interplay of IDE plugin and the dev repository (see also [[FAQ#Development]]) synchronization from the IDE and overlay of modules with local development versions is simple and fast. 
395
396 4 Henning Blohm
}}
397
398 9 Henning Blohm
399
---
400
401 1 Henning Blohm
h2. Going Multi-Module
402
403
In this section we will extend the previous work by a simple service module. 
404
405 4 Henning Blohm
{{collapse
406 1 Henning Blohm
h3. Pre-Requisites
407
408
# Have all the results from the previous section ready.
409
# Start IDE and z2 as above.
410
411
412
h3. Steps we are going to take
413
414
# add a new module with a service API
415
# reference the module API from the *hello* module and invoke the service.
416
417
418
In your workspace, use Eclipsoid to create a new z2 Java module *goodbye*. Open *java/z.properties* and change all *com.zfabrik.* prefixes to *org.z2env*. Essentially the file only needs the line
419
420
<pre><code class="ruby">
421
org.z2env.component.type=org.z2env.java
422
</code></pre>
423
424
In our API we will only expose an interface and rather leave the implementation hidden in the implementation parts of the module. We do that, as we prefer a strong separation of API and implementation. This is not at all required but a conscious design choice. 
425
426
427
| java/src.api/goodbye/GoodbyeService.java | 
428
<pre><code class="java">
429
package goodbye;
430
431
public interface GoodbyeService {
432
433
	String sayGoodbye(String in);
434
	
435
}
436
437
</code></pre> |
438
| java/src.impl/goodbye/GoodbyeServiceImpl.java | 
439
<pre><code class="java">
440
package goodbye;
441
442
public class GoodbyeServiceImpl implements GoodbyeService {
443
444
	@Override
445
	public String sayGoodbye(String in) {
446
		return "Goodbye "+in+"!";
447
	}
448
449
}
450
</code></pre> |
451 10 Henning Blohm
| service.properties | 
452 1 Henning Blohm
<pre><code class="ruby">
453
org.z2env.component.type=org.z2env.any
454
component.className=goodbye.GoodbyeServiceImpl
455
</code></pre> |
456
| java/z.properties | 
457
<pre><code class="ruby">
458
org.z2env.component.type=org.z2env.java
459
</code></pre> |
460
461
In effect we created the following:
462
463
* A module *goodbye* that has 
464
* A Java component with API and Implementation source code
465
* An _any_ component *goodbye/service* that manages the service implementation (as we will see below)
466
467
Back in the *hello* module, we want to use the _goodbye service_. We apply the following changes:
468
469
| java/z.properties | 
470
<pre><code class="ruby">
471
org.z2env.component.type=org.z2env.java
472
473
java.privateReferences=\
474
    javax.servlet,\
475
    javax.servlet.jsp.jstl,\
476
    goodbye
477
</code></pre> |
478
| java/src.impl/hello/SimpleController.java | 
479
<pre><code class="java">
480
package hello;
481
482
import goodbye.GoodbyeService;
483
484
import java.io.IOException;
485
486
import javax.servlet.ServletException;
487 13 Henning Blohm
import javax.servlet.annotation.WebServlet;
488 1 Henning Blohm
import javax.servlet.http.HttpServlet;
489
import javax.servlet.http.HttpServletRequest;
490
import javax.servlet.http.HttpServletResponse;
491
492
import org.z2env.components.IComponentsLookup;
493
494 13 Henning Blohm
@WebServlet(urlPatterns="/do")
495 1 Henning Blohm
public class SimpleController extends HttpServlet {
496 13 Henning Blohm
    private static final long serialVersionUID = 1L;
497 1 Henning Blohm
498
    @Override
499
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
500 13 Henning Blohm
        GoodbyeService gb = IComponentsLookup.CL.lookup("goodbye/service", GoodbyeService.class);
501 1 Henning Blohm
        String input = req.getParameter("input");
502
        if (input!=null && input.trim().length()>0) {
503
            req.setAttribute(
504 13 Henning Blohm
                "output",
505
                gb.sayGoodbye(input)
506
            );
507
            req.setAttribute("input",input);
508 1 Henning Blohm
        }
509
        req.getRequestDispatcher("/").forward(req,resp);
510
    }
511
}
512
</code></pre> |
513
514
After you have changed the Java references in *java/z.properties* you might want to press Alt-R or the "Resolve Classpath from Z2" button in the toolbar to have the IDE resolve the dependency for the *goodbye* module and so that
515
your IDE will not complain about using the *GoodbyeService* interface.
516
517
Now synchronize your running z2 by either:
518
519
* Pressing the "Sync with z2-Environment" button in the toolbar
520
* Pressing ALT+y in your IDE
521
* Entering "s" on the command line running z2.
522
523
Go to http://localhost:8080/hello and check it out.
524
525
h3. Discussion
526
527
What you just implemented is a programmatic component lookup. The first time <code>IComponentsLookup.CL.lookup("goodbye/service", GoodbyeService.class)</code> was invoked, z2 searched for a factory for *org.z2env.any* components. This specific factory simply created a singleton instance of the Goodbye Service and checked whether the requested interface is implemented. As that held, it returned the actual instance.
528
529
In later sections (for now check out [[z2-environment:How_to_Spring]]) we will explain how to that extends to the Spring Framework and Dependency Injection in general.
530 2 Henning Blohm
531
h4. Summary
532
533
* Being a modular runtime environment, Z2 offers an effective yet simple Java modularization approach
534
* The module concept of Z2 goes beyond code considerations and includes arbitrary component types such as Web applications
535 1 Henning Blohm
536
Feel free to apply changes to the Goodbye Service implementation class and have them made effective by synchronizing Z2.
537 4 Henning Blohm
538
}}
539 8 Henning Blohm
540 1 Henning Blohm
541 9 Henning Blohm
---
542
543 1 Henning Blohm
h2. Going System-Centric
544 2 Henning Blohm
545
In this section we show how to turn your z2 installation into a mere execution node of a system (which is what it really should be). That is, in team development situations for systems of non-trivial size of distribution requirements, it is crucial to be integrated with a common source code level. 
546 1 Henning Blohm
547 4 Henning Blohm
{{collapse
548
549 2 Henning Blohm
Using remote repositories in combination with the dev repository, z2 offers just that: Integration for all but those pieces you do actually need isolation from changes.
550
551
Using z2's synchronization approach rolling out changes to remote installation and scale-outs become a non-issue.
552 8 Henning Blohm
553
h3. Pre-Requisites
554
555
# Have the multi-module setup from the previous section at hand
556
# Start IDE and z2 as above.
557
558 2 Henning Blohm
559
h3. Steps we are going to take
560
561
# check our modules in with some new Git repository
562
# add a Git-based component repository component 
563
# develop with partial overlays
564
565
566 1 Henning Blohm
567 4 Henning Blohm
}}
568 1 Henning Blohm
569 9 Henning Blohm
570
571
---
572 1 Henning Blohm
573
h2. Understanding the <HOME>
574
575 4 Henning Blohm
We call an installation of a z2env core a *<home>*. The file structure of the *<home>* consists of few but important locations.
576 1 Henning Blohm
577 4 Henning Blohm
{{collapse
578 1 Henning Blohm
h3. Layout
579
580
| z.jar | The actual core implementation. This is precompiled.|
581
| boot/ | A component repository adding to the core and provides the most basic capabilities such as compiling Java code and running a main program. |
582
| 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. |
583
| modules/ | A file system repository declared under roots/ that is useful to locally augment a core installation.|
584
585
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.
586
587 4 Henning Blohm
588
589
590 1 Henning Blohm
h3. Folders and Properties
591
592
When running z2 from the command line, some logic is applied to derive where stuff is and some defaults apply:
593
594
|_. What |_. System property |_. Defaults |
595
| Z2 home - the installation location | org.z2env.home | If no system property is set, the environment variable Z2_HOME will be checked. If that is not set, the z2 home location will be derived from the location of the z.jar file |
596
| Dev Repo workspaces - where the Dev Repo checks for local modules | org.z2env.dev.local.workspaces | Defaults to ${z2.home}/.. assuming modules will be next to the home or one level deeper |
597
598 4 Henning Blohm
See also [[Core Layout]]
599 1 Henning Blohm
600 4 Henning Blohm
}}
601
602 1 Henning Blohm
h2. Understanding Z2
603
604
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.
605
606 4 Henning Blohm
{{collapse
607 1 Henning Blohm
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.
608
609
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. 
610
611
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.
612
613
*Component Repositories* provides modules and components to z2. A component is prefixed by the module name:
614
615
<pre>
616
<global component name> = <module name>/<local component name>
617
</pre>
618
619
In fact, the typical component repository has a file system style structure that is made up exactly like that. 
620
621
Structure from repo root:
622
623
| /<module>/<cmp>.properties | A component <cmp> in module <module> that has no resources on its own.|
624
| /<module>/<cmp>/z.properties | A component <cmp> in module <module> that may have additional resources on its own.|
625
626
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.
627
628
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.
629
630
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). 
631
632
!uml1.png!
633
634
Dependencies, for example those between Java components, translate into dependencies between resources that are observed during invalidation of resources. This introduces invalidation and synchronization.
635
636
h3. A crucial concept of z2 is that of a synchronization. 
637
638
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. 
639
640
In z2 a synchronization describes the following process:
641
642
# Check for changes in component repositories
643
# Based on changes found, identify components affected and invalidate associated runtime resources incl. dependent resources.
644
# Try to attain target states
645
646
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.
647
648
h3. A second crucial concept of z2 is that of *System Centric Development*
649
650
When working on a software system with many access points and high re-use on a service level, as is typical for business systems, staying quick integration with a team's changes is key. Component repositories can be fed from remotely accessible version control systems such as Subversion and Git. When connecting to a central, team-shared repository, every synchronization will make sure that you are up-to-date with the real source of truth. 
651
652
Using the dev repo, you can still isolate yourself from changes on part of the system that you are actively working on. After your modifications are completed, rebased, and locally tested, getting a clean and consistent state is just one synchronization away.
653
654
h3. The third and final concept is that of a compile-free environment
655
656
It is within the nature of the synchronization concept, that anything required to happen to have your software available for execution must have happened after synchronization completed. Most preparation steps are executed at first use. This includes the compilation of Java code. Z2 uses the Eclipse Java Compiler for that purpose.
657
658
h2. The Component Model
659
660
See [[z2-environment:Z2_Modules_intro]]
661
662
h2. Java Components
663
664
See [[z2-environment:Z2_Java_components_intro]]
665 4 Henning Blohm
666
}}