Project

General

Profile

Wiki » History » Version 21

Henning Blohm, 24.01.2015 15:29

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 13 Henning Blohm
* The <z2 home> layout is completely new and more flexible
11 3 Henning Blohm
* The essential component types that can be _invoked_ from the core is *system state* and *main program*.
12 14 Henning Blohm
* While Jetty is still contained to support Eclipsoid and z2Unit, we support a pre-installed Tomcat as application container (and with TomEE would even get a Java EE profile)
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 13 Henning Blohm
* Make the lower parts of z2 more accessible and easier to understand: While z2 previously started System Centric, we now close the gap from the ordinary main program.
20 12 Henning Blohm
* Increase the OSS flavor of z2
21
22 15 Henning Blohm
Obvious TODOs:
23
* Finish Java 8 support
24
* Test TomEE
25
* Fix Eclipsoid templates
26
* Support MVNCR, also for distributions
27 12 Henning Blohm
28 9 Henning Blohm
h1. Draft Intro Documentation
29 1 Henning Blohm
30 2 Henning Blohm
h2. Getting Started
31 1 Henning Blohm
32 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. 
33 1 Henning Blohm
34 6 Henning Blohm
Check out [[wiki#Understanding-Z2|understanding-z2]] for that.
35 1 Henning Blohm
36 2 Henning Blohm
It is simplest to start by running a simple Java main program in z2 or a simple Web App. 
37 1 Henning Blohm
38 2 Henning Blohm
Follow this trail:
39 1 Henning Blohm
40 4 Henning Blohm
* [[wiki#Building-z2env-core|Building the core]]
41 7 Henning Blohm
* [[wiki#Running-a-Hello-World-main-program|Running a Hello World main program]]
42 10 Henning Blohm
* [[wiki#Running-a-Hello-World-Web-App|Running a Hello World Web App]]
43 1 Henning Blohm
44 3 Henning Blohm
h2. Building z2env-core
45 1 Henning Blohm
46 17 Henning Blohm
(For now, we need to build the core).
47
48
h3. Pre-requisites
49
50
* You need Git installed
51
* You need a JDK, at least version 7
52
* You need the ANT build tool
53
54 3 Henning Blohm
First clone http://git.z2-environment.net/z2env.core
55
56
<pre>
57
git clone http://git.z2-environment.net/z2env.core
58
</pre>
59
60
Switch into *org.z2env.core.main* and run 
61
62
<pre>
63 18 Henning Blohm
ant -Doutput=<z2home> -Dsetup=<setup> 
64 3 Henning Blohm
</pre>
65
66 18 Henning Blohm
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.
67 3 Henning Blohm
68
If you omit *output* it will default to *gen/dist*. If you omit *setup*, no content will be pre-configured will be modified. 
69
70
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).
71
72 1 Henning Blohm
In general this build always updates only boot, z.jar, roots. It will not remove anything.
73
74 18 Henning Blohm
75 3 Henning Blohm
Example to install/update a core only into ../../z2env:
76
77
<pre>
78
ant -Doutput=here 
79
</pre>
80
81 1 Henning Blohm
To install/update a web-basic setup (with tomcat and eclipsoid support) with updates from remote repos:
82
83
<pre>
84 3 Henning Blohm
ant -Doutput=../../z2env -Dsetup=web-basic-remote
85
</pre>
86 19 Henning Blohm
87
Check out [[wiki#Understanding-the-ltHOMEgt|Understanding the <HOME>]] to learn more about the generated structure.
88
89 7 Henning Blohm
90
h2. Running a Hello World main program
91
92
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. 
93
94
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 
95
96
<pre>
97
greeter/hello
98
</pre>
99
100
Finally, as this component actually has implementation code, we need to declare a Java component. By convention this is 
101
102
<pre>
103
greeter/java
104
</pre>
105
106
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:
107
108
| <HOME>/modules/greeter/hello.properties | 
109
<pre><code class="ruby">org.z2env.component.type=org.z2env.main
110
component.className=greetings.Main
111
</code></pre> |
112
| <HOME>/modules/greeter/java/z.properties | 
113
<pre><code class="ruby">org.z2env.component.type=org.z2env.java
114
</code></pre> |
115
| <HOME>/modules/greeter/java/src.impl/greetings/Main.java |
116
<pre><code class="java">
117
package greetings;
118
119
public class Main {
120
  public static void main(String[] args) {
121 8 Henning Blohm
    System.out.println("Hello!");
122 7 Henning Blohm
  }
123
}
124
</code></pre> |
125
126
That gives us the two components of module greeter. To run this on the command line, run
127
128
<pre>
129
java -DcomponentName=greeter/hello -jar z.jar
130
</pre>
131
132 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.
133 10 Henning Blohm
134
h2. Running a Hello World Web App
135
136 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.
137 7 Henning Blohm
138 11 Henning Blohm
Furthermore it describes how to use the Dev Repository and the Eclipsoid plugin for the Eclipse or the IntelliJ development environment.
139 7 Henning Blohm
140 11 Henning Blohm
h3. Pre-Requisites
141
142
* We assume the Eclipse IDE.
143
* Please install the Eclipsoid Plugin from http://z2-environment.net/eclipsoid/update/site.xml
144
* We assume a development workspace in *workspace*.
145
* Have a local Tomcat (7 or higher) installation.*
146
147
h3. Steps we are going to take
148
149
# Create a module with a simple Web app
150
# Make it visible to Z2
151
# Run the Web App in a Tomcat Web Container
152
153
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 
154
155
<pre>
156
ant -Doutput=workspace/z2env -Dsetup=web-basic-remote
157
</pre>
158
159
Using your IDE create a new project *hello* in *workspace* with the following structure:
160
161
162
| java/z.properties | 
163
<pre><code class="ruby">
164
org.z2env.component.type=org.z2env.java
165
java.privateReferences=\
166
	javax.servlet
167
</code></pre> |
168
| web/z.properties |
169
<pre><code class="ruby">
170
org.z2env.component.type=org.z2env.tomcat.webapp
171
webapp.path=/hello
172
</code></pre> |
173
| web/WebContent/index.jsp |
174
<pre><code class="html"><html><body>Hello! Did you know that 7*7=<%=7*7%>?</body></html></code></pre> |
175
| LOCAL | <empty file> |
176
177 20 Henning Blohm
Your *workspace* folder now contains two subfolders *z2env* and *hello*.
178
179 11 Henning Blohm
So far, that's it.  We will touch on the LOCAL file later. 
180
181
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. 
182
183
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*. 
184
185
To be on the safe side and assuming the location is */home/me/tomcat*, we open a terminal, change into *workspace/z2env* and run
186
187
<pre>
188
java -Dcatalina.home=/home/me/tomcat -jar z.jar hello/web
189
</pre>
190
191
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 
192
193
<pre>
194
http://localhost:8080/hello
195
</pre>
196
197
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. 
198
199
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.
200
201
Try this: 
202
203
# Remove LOCAL
204
# Enter „s“ for synchronization. 
205
# Check the URL above (should say „not found“)
206
# Create a LOCAL file again
207
# Synchronize
208
# Check again.
209
210
Similarly, from now on, changes made to the hello module will be picked up, whenever you synchronize.
211 1 Henning Blohm
212
h2. Developing with Eclipsoid
213
214 21 Henning Blohm
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.
215 1 Henning Blohm
216 21 Henning Blohm
h3. Pre-Requisite
217 1 Henning Blohm
218 21 Henning Blohm
* Have an Eclipse or IntelliJ installation
219
* Install the Eclipsoid plugin from http://z2-environment.net/eclipsoid/update/site.xml or by searching for "z2" in the IntelliJ Plugin Repository respectively
220
221
h3. Steps we are going to take
222
223
# Complete the development workspace setup
224
# Add a simple Controller
225
226
h4. In Eclipse
227
228
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. 
229
230
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. 
231
232
Go into Window/Preferences, pick "z2-Environment". Change the port to 8081, set the user to "z*" and the password to "z". Done.
233
234
h4. In IntelliJ
235
236
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.
237
238
h4. IDE Indepently
239
240
Start z2 as in the previous section but make sure the development support is enabled. Use this command line:
241
242
<pre>
243
java -Dcatalina.home=/home/me/tomcat -jar z.jar org.z2env.dev.shared/ready hello/web
244
</pre>
245
246
(possibly you want to turn this into a shell script)
247
248
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. 
249
250
Now add a class *SimpleController* and change the following files:
251
252
253
| java/src.impl/hello/SimpleController | 
254
<pre><code class="java">
255
package hello;
256
257
import javax.servlet.*;
258
import javax.servlet.http.*;
259
import java.io.IOException;
260
261
public class SimpleController extends HttpServlet {
262
263
    @Override
264
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
265
        String input = req.getParameter("input");
266
        if (input!=null && input.trim().length()>0) {
267
            req.setAttribute("output","You said: "+input);
268
        }
269
        req.getRequestDispatcher("/").forward(req,resp);
270
    }
271
}
272
</code></pre> |
273
| java/z.properties | 
274
<pre><code class="ruby">
275
org.z2env.component.type = org.z2env.java
276
277
java.privateReferences=\
278
  javax.servlet,\
279
  javax.servlet.jsp.jstl
280
</code></pre> |
281
| web/WebContent/WEB-INF/web.xml | 
282
<pre><code class="xml">
283
<?xml version="1.0" encoding="UTF-8"?>
284
<web-app id="hello" version="2.5"
285
		xmlns="http://java.sun.com/xml/ns/javaee"
286
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
287
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
288
289
    <servlet>
290
        <servlet-name>controller</servlet-name>
291
        <servlet-class>hello.SimpleController</servlet-class>
292
    </servlet>
293
    
294
    <servlet-mapping>
295
        <servlet-name>controller</servlet-name>
296
        <url-pattern>/do</url-pattern>
297
    </servlet-mapping>    
298
</web-app>
299
</code></pre> |
300
| web/WebContent/index.jsp |
301
<pre><code class="html">
302
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core_1_1" %>
303
<html>
304
<body>
305
  <c:if test="${not empty output}">
306
    <p><c:out value="${output}"/></p>
307
  </c:if>
308
  <form method="POST" action="<c:url value='/do'/>">
309
    Input: <input type="text" name="input"><input type="submit" value="go!">
310
  </form>
311
</body>
312
</html>
313
</code></pre>|
314
315
Make sure the *hello* module is armed (right-click) by having a LOCAL file.
316
317
Now synchronize your running z2 by either:
318
319
* Pressing the "Sync with z2-Environment" button in the toolbar
320
* Pressing ALT+y in your IDE
321
* Entering "s" on the command line running z2.
322
323
Go to http://localhost:8080/hello and check it out.
324
325
326
h2. Going Multi-Module
327 12 Henning Blohm
328
TBD
329
330
h2. Going System-Centric
331
332
TBD
333
334
Getting more real by adding a remote repo as system repo.
335
336
Develop by checking out modules and using the Dev Repo.
337 3 Henning Blohm
338 1 Henning Blohm
339 3 Henning Blohm
h2. Understanding the <HOME>
340 1 Henning Blohm
341 18 Henning Blohm
We call an installation of a z2env core a *<home>*. The file structure of the *<home>* consists of few but important locations
342 3 Henning Blohm
343 18 Henning Blohm
h3. Layout
344
345 3 Henning Blohm
| z.jar | The actual core implementation. This is precompiled.|
346
| boot/ | A component repository adding to the core and provides the most basic capabilities such as compiling Java code and running a main program. |
347
| 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. |
348 1 Henning Blohm
| modules/ | A file system repository declared under roots/ that is useful to locally augment a core installation.|
349
350
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.
351 18 Henning Blohm
352
h3. Folders and Properties
353
354
When running z2 from the command line, some logic is applied to derive where stuff is and some defaults apply:
355
356
|_. What |_. System property |_. Defaults |
357
| 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 |
358
| 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 |
359
360 5 Henning Blohm
361
h2. Understanding Z2
362
363
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.
364
365
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.
366
367
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. 
368
369
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.
370
371
*Component Repositories* provides modules and components to z2. A component is prefixed by the module name:
372
373
<pre>
374
<global component name> = <module name>/<local component name>
375
</pre>
376
377
In fact, the typical component repository has a file system style structure that is made up exactly like that. 
378
379
Structure from repo root:
380
381
| /<module>/<cmp>.properties | A component <cmp> in module <module> that has no resources on its own.|
382
| /<module>/<cmp>/z.properties | A component <cmp> in module <module> that may have additional resources on its own.|
383
384
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.
385
386
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.
387
388
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). 
389
390
!uml1.png!
391
392
Dependencies, for example those between Java components, translate into dependencies between resources that are observed during invalidation of resources. This introduces invalidation and synchronization.
393
394 16 Henning Blohm
h3. A crucial concept of z2 is that of a synchronization. 
395 5 Henning Blohm
396
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. 
397
398
In z2 a synchronization describes the following process:
399
400
# Check for changes in component repositories
401
# Based on changes found, identify components affected and invalidate associated runtime resources incl. dependent resources.
402
# Try to attain target states
403
404 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.
405 16 Henning Blohm
406
h3. A second crucial concept of z2 is that of *System Centric Development*
407
408
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. 
409
410
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.
411
412
h3. The third and final concept is that of a compile-free environment
413
414
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.
415 9 Henning Blohm
416
h2. The Component Model
417
418
See [[z2-environment:Z2_Modules_intro]]
419
420
h2. Java Components
421
422
See [[z2-environment:Z2_Java_components_intro]]