|
|||
|
|||
|
Linux Backup Umstieg Tipps nVidia & 2.6.8er Kernel Cocoon OJB JDO CForms Passwort vergessen? Noch keinen Account? SSL aktivieren |
Cocoon, OJB and JDO with CformsContentNon-Decomposed m:n Relationship
Database Design
/*
* Table Users
*/
CREATE TABLE users (
id INT8 DEFAULT nextval('users_id_seq'::text) NOT NULL,
nick VARCHAR(255) NOT NULL,
firstname VARCHAR(255) NOT NULL,
lastname VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
pass VARCHAR(32) NOT NULL,
CONSTRAINT users_id_pkey PRIMARY KEY(id),
CONSTRAINT users_nick_ukey UNIQUE(nick)
);
CREATE SEQUENCE users_id_seq start 1 increment 1 maxvalue 9223372036854775807 minvalue 1 cache 1;
/*
* Table rights
*/
CREATE TABLE rights (
id INT8 DEFAULT nextval('rights_id_seq'::text) NOT NULL,
name VARCHAR(255) NOT NULL,
CONSTRAINT rights_id_pkey PRIMARY KEY(id),
CONSTRAINT rights_name_ukey UNIQUE(name)
);
CREATE SEQUENCE rights_id_seq start 1 increment 1 maxvalue 9223372036854775807 minvalue 1 cache 1;
/*
* Table rel_users_rights
* User has Rights
*/
CREATE TABLE rel_users_rights (
users_id INT8 NOT NULL REFERENCES users(id),
rights_id INT8 NOT NULL REFERENCES rights(id),
CONSTRAINT rel_users_rights_pkey PRIMARY KEY(users_id,rights_id)
);
Java Classes
/**
* Users.java
*/
package papillon;
import java.util.ArrayList;
import java.util.Collection;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String nick;
private String firstname;
private String lastname;
private String email;
private String pass;
private Collection rights = new ArrayList();
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getNick() {
return this.nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public String getFirstName() {
return this.firstname;
}
public void setFirstName(String firstname) {
this.firstname = firstname;
}
public String getLastName() {
return this.lastname;
}
public void setLastName(String lastname) {
this.lastname = lastname;
}
public String getEMail() {
return this.email;
}
public void setEMail(String email) {
this.email = email;
}
public String getPass() {
return this.pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public Collection getRights() {
return this.rights;
}
public void setRights(Collection rights) {
this.rights = rights;
}
public void addRight(Right right) {
right.addUser(this);
this.rights.add(right);
}
}
/**
* Right.java
*/
package papillon;
import java.util.ArrayList;
import java.util.Collection;
import java.io.Serializable;
public class Right implements Serializable {
private int id;
private String name;
private Collection users = new ArrayList();
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Collection getUsers() {
return this.users;
}
public void setUsers(Collection users) {
this.users = users;
}
public void addUser(User user) {
this.users.add(user);
}
}
package.jdo
<?xml version="1.0"?>
<!DOCTYPE jdo SYSTEM "http://java.sun.com/dtd/jdo_1_0.dtd">
<jdo>
<package name="papillon">
<class name="User" identity-type="datastore">
<field name="id" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="id"/>
</field>
<field name="nick" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="nick"/>
</field>
<field name="firstname" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="firstname"/>
</field>
<field name="lastname" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="lastname"/>
</field>
<field name="email" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="email"/>
</field>
<field name="pass" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="pass"/>
</field>
<field name="rights" embedded="true">
<collection element-type="papillon.Right" embedded-element="true"/>
</field>
</class>
<class name="Right" identity-type="datastore">
<field name="id" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="id"/>
</field>
<field name="name" persistence-modifier="persistent">
<extension vendor-name="ojb" key="column" value="name"/>
</field>
<field name="users" embedded="true">
<collection element-type="papillon.User" embedded-element="true"/>
</field>
</class>
</package>
</jdo>
Repository.xml
<?xml version="1.0"?>
<!DOCTYPE descriptor-repository PUBLIC "-//Apache Software Foundation//DTD OJB Repository//EN" "repository.dtd">
<descriptor-repository version="1.0" isolation-level="read-uncommitted">
<jdbc-connection-descriptor jcd-alias="cocoon" default-connection="false" platform="PostgreSQL" subprotocol="postgresql">
<sequence-manager className="org.apache.ojb.broker.util.sequence.SequenceManagerNextValImpl"/>
</jdbc-connection-descriptor>
<class-descriptor class="papillon.User" table="users">
<field-descriptor name="id" primarykey="true" nullable="false" default-fetch="true" autoincrement="true" column="id" sequence-name="users_id_seq" jdbc-type="INTEGER"/>
<field-descriptor name="nick" nullable="false" default-fetch="true" column="nick" jdbc-type="VARCHAR"/>
<field-descriptor name="firstname" nullable="false" default-fetch="true" column="firstname" jdbc-type="VARCHAR"/>
<field-descriptor name="lastname" nullable="false" default-fetch="true" column="lastname" jdbc-type="VARCHAR"/>
<field-descriptor name="email" nullable="false" default-fetch="true" column="email" jdbc-type="VARCHAR"/>
<field-descriptor name="pass" nullable="false" default-fetch="true" column="pass" jdbc-type="VARCHAR"/>
<collection-descriptor name="rights" element-class-ref="papillon.Right" auto-retrieve="true" auto-update="link" auto-delete="link" indirection-table="rel_users_rights" otm-dependent="false" collection-class="org.apache.ojb.broker.util.collections.ManageableArrayList">
<fk-pointing-to-this-class column="users_id"/>
<fk-pointing-to-element-class column="rights_id"/>
</collection-descriptor>
</class-descriptor>
<class-descriptor class="papillon.Right" table="rights">
<field-descriptor name="id" primarykey="true" nullable="false" default-fetch="true" autoincrement="true" column="id" sequence-name="rights_id_seq" jdbc-type="INTEGER"/>
<field-descriptor name="name" nullable="false" default-fetch="true" column="name" jdbc-type="VARCHAR"/>
<collection-descriptor name="users" element-class-ref="papillon.User" auto-retrieve="true" auto-update="link" auto-delete="link" indirection-table="rel_users_rights" otm-dependent="false" collection-class="org.apache.ojb.broker.util.collections.ManageableArrayList">
<fk-pointing-to-this-class column="rights_id"/>
<fk-pointing-to-element-class column="users_id"/>
</collection-descriptor>
</class-descriptor>
</descriptor-repository>
Flow
var data;
function starttest () {
var factory = cocoon.getComponent(Packages.org.apache.cocoon.ojb.jdo.components.JdoPMF.ROLE);
var dao = new Packages.papillon.SimpleDAO(factory, "cocoon");
var id;
var name;
var firstname;
var lastname;
var email;
var pass;
var nick;
var right = new Packages.papillon.Right();
var user = new Packages.papillon.User();
right.setName('testhihi123');
dao.insert(right);
name = right.getName();
id = right.getId();
right = new Packages.papillon.Right();
right.setId(93);
right = dao.retrieve(right);
name = right.getName();
// neuen User anlegen
user.setNick('Testnick3399');
user.setFirstName('Ich33');
user.setLastName('Du33');
user.setEMail('1233@guschtel.de33');
user.setPass('geheeiiiiiiiiim33');
// user das Recht 64 geben
user.addRight(right);
dao.insert(user);
//Wenn hier und geklappt *jippie*
user = new Packages.papillon.User();
user.setId(15);
user = dao.retrieve(user);
firstname = user.getFirstName();
right = new Packages.papillon.Right();
right.setId(93);
rights = new Packages.java.util.ArrayList();
rights.add(right);
user.setRights(rights);
dao.update(user);
cocoon.releaseComponent(factory);
cocoon.redirectTo ("ok.html");
}
cocoon.load("resource://org/apache/cocoon/forms/flow/javascript/Form.js");
function getAllRights() {
var factory = cocoon.getComponent(Packages.org.apache.cocoon.ojb.jdo.components.JdoPMF.ROLE);
var dao = new Packages.papillon.SimpleDAO(factory, "cocoon");
var criteria = new Packages.org.apache.ojb.broker.query.Criteria();
// criteria.addLike("articleName", "C%");
var right = new Packages.papillon.Right();
var query = Packages.org.apache.ojb.broker.query.QueryFactory.newReportQuery(Packages.papillon.Right, criteria);
var attributes = new Array(1);
attributes[0] = "count(*)";
query.setAttributes(attributes);
var cnt;
dao.begin();
var it = dao.getReport (query);
while ( it.hasNext() == true) {
var o = it.next();
var count = o[0].intValue();
cnt = count;
}
dao.commit();
criteria = new Packages.org.apache.ojb.broker.query.Criteria();
query = Packages.org.apache.ojb.broker.query.QueryByCriteria(Packages.papillon.Right,criteria);
var rights = dao.retrieve(query);
var i;
var right = new Packages.papillon.Right();
var id;
var name;
var allrights = new Array(count);
for (i=0; i < count; i++) {
right = rights.elementAt(i);
id = right.getId();
name = right.getName();
allrights[i] = new Object();
allrights[i].value = name;
allrights[i].label = name;
allrights[i].id = id;
allrights[i].name = name;
}
cocoon.releaseComponent(factory);
return allrights;
}
function startform() {
var form = new Form("forms/definition/newuser_definition.xml");
form.createBinding("forms/binding/newuser_binding.xml");
var factory = cocoon.getComponent(Packages.org.apache.cocoon.ojb.jdo.components.JdoPMF.ROLE);
var dao = new Packages.papillon.SimpleDAO(factory, "cocoon");
//omitted the "var data;" so its a global var
data = new Object();
data.allrights = getAllRights();
var bean = new Packages.papillon.User();
var id = cocoon.request.get("id");
if (id == null) {
id = 15;
}
bean.setId (id);
bean = dao.retrieve (bean);
form.load(bean);
form.showForm("form-display-pipeline-newuser",data);
form.save(bean);
dao.update (bean);
cocoon.releaseComponent(factory);
cocoon.sendPage("form-success-pipeline");
}
CForms Definition
<?xml version="1.0"?>
<fd:form
xmlns:fd="http://apache.org/cocoon/forms/1.0#definition"
>
<fd:widgets>
<!-- Id of the User -->
<fd:field id="id">
<fd:datatype base="integer" />
</fd:field>
<!-- Nickname -->
<fd:field id="nick" required="true">
<fd:datatype base="string" />
<fd:label>Nickname</fd:label>
</fd:field>
<!-- FirstName -->
<fd:field id="firstname" required="true">
<fd:datatype base="string" />
<fd:label>Firstname</fd:label>
</fd:field>
<!-- LastName -->
<fd:field id="lastname" required="true">
<fd:datatype base="string" />
<fd:label>Lastname</fd:label>
</fd:field>
<!-- E-Mail -->
<fd:field id="email" required="true">
<fd:datatype base="string" />
<fd:label>E-Mail</fd:label>
<fd:validation>
<fd:email/>
</fd:validation>
</fd:field>
<!-- Pass -->
<fd:field id="pass" required="true">
<fd:datatype base="string" />
<fd:label>Password</fd:label>
<fd:validation>
<fd:length min="5" max="20"/>
</fd:validation>
</fd:field>
<!-- confirmPass -->
<fd:field id="confirmpass" required="true">
<fd:label>Re-enter Password</fd:label>
<fd:datatype base="string"/>
<fd:validation>
<fd:assert test="pass = confirmpass">
<fd:failmessage>The two passwords are not equal.</fd:failmessage>
</fd:assert>
</fd:validation>
</fd:field>
<!-- Rights -->
<fd:repeater id="rights" initial-size="1">
<fd:widgets>
<!-- Message -->
<fd:output id="message">
<fd:datatype base="string"/>
</fd:output>
<fd:field id="id">
<fd:datatype base="integer" />
</fd:field>
<fd:booleanfield id="select">
<fd:label>Select</fd:label>
</fd:booleanfield>
<fd:field id="name">
<fd:label>Right</fd:label>
<fd:datatype base="string"/>
<fd:selection-list type="flow-jxpath" list-path="allrights" value-path="value" label-path="label" dynamic="true"/>
<fd:on-value-changed>
<javascript>
var value = event.source.value;
// Debug var
var output = "";
// The new id to be set
var newid;
if (value != null) {
for (var j = 0; j < data.allrights.length; j++) {
if (data.allrights[j].name + "" == value + "") {
newid = data.allrights[j].id;
}
}
// Convert to Integer
var num = new Packages.java.lang.Integer(newid);
// Get the Id Widget
var id = event.source.lookupWidget("../id");
id.value = num;
output += value + "Newid: " + newid;
var msg = event.source.lookupWidget("../message");
if (msg != null) {
msg.value = "You selected: " + value.toString() + ": " + output;
}
}
</javascript>
</fd:on-value-changed>
</fd:field>
</fd:widgets>
</fd:repeater>
<fd:repeater-action id="addright" action-command="add-row" repeater="rights">
<fd:label>New Right</fd:label>
</fd:repeater-action>
<fd:repeater-action id="removeright" action-command="delete-rows" repeater="rights" select="select">
<fd:label>Remove Right(s)</fd:label>
</fd:repeater-action>
</fd:widgets>
</fd:form>
Cforms binding
<?xml version="1.0"?>
<fb:context
xmlns:fb="http://apache.org/cocoon/forms/1.0#binding" path="/"
>
<fb:value id="id" path="id" direction="load"/>
<fb:value id="nick" path="nick" />
<fb:value id="firstname" path="firstName"/>
<fb:value id="lastname" path="lastName" />
<fb:value id="email" path="EMail" />
<fb:value id="pass" path="pass" />
<fb:value id="confirmpass" path="pass" direction="load" />
<fb:repeater id="rights" parent-path="." row-path="rights">
<fb:identity>
<fb:value id="id" path="@id"/>
</fb:identity>
<fb:on-bind>
<!-- executed on updates AND right after the insert -->
<fb:value id="id" path="id" />
<fb:value id="name" path="name" />
</fb:on-bind>
<fb:on-delete-row>
<fb:delete-node />
</fb:on-delete-row>
<fb:on-insert-row>
<fb:insert-bean classname="papillon.Right" addmethod="addRight"/>
</fb:on-insert-row>
</fb:repeater>
</fb:context>
Cforms Template
<?xml version="1.0"?>
<page
xmlns:ft="http://apache.org/cocoon/forms/1.0#template"
xmlns:fi="http://apache.org/cocoon/forms/1.0#instance"
>
<title>New User</title>
<content>
<ft:form-template action="#{$continuation/id}.continue" method="POST">
<!-- Id -->
<ft:widget id="id">
<fi:styling type="hidden" />
</ft:widget>
<table border="0">
<!-- Nick -->
<tr>
<td>
<ft:widget-label id="nick"/>
</td>
<td>
<ft:widget id="nick"/>
</td>
</tr>
<!-- FirstName -->
<tr>
<td>
<ft:widget-label id="firstname"/>
</td>
<td>
<ft:widget id="firstname"/><br/>
</td>
</tr>
<!-- LastName -->
<tr>
<td>
<ft:widget-label id="lastname"/>
</td>
<td>
<ft:widget id="lastname"/><br/>
</td>
</tr>
<!-- EMail -->
<tr>
<td>
<ft:widget-label id="email"/>
</td>
<td>
<ft:widget id="email"/><br/>
</td>
</tr>
<!-- Pass -->
<tr>
<td>
<ft:widget-label id="pass"/>
</td>
<td>
<ft:widget id="pass">
<fi:styling type="password" />
</ft:widget>
</td>
</tr>
<!-- confirmPass -->
<tr>
<td>
<ft:widget-label id="confirmpass"/>
</td>
<td>
<ft:widget id="confirmpass">
<fi:styling type="password" />
</ft:widget>
</td>
</tr>
<!-- Rights -->
<tr>
<td>
Rights:<br />
</td>
<td>
<table border="1">
<tr>
<th><ft:repeater-widget-label id="rights" widget-id="select"/></th>
<th><ft:repeater-widget-label id="rights" widget-id="name"/></th>
</tr>
<ft:repeater-widget id="rights">
<tr>
<ft:widget id="id">
<fi:styling type="hidden" />
</ft:widget>
<td>
<ft:widget id="select" />
</td>
<td>
<ft:widget id="name">
<fi:styling list-type="listbox" listbox-size="1" submit-on-change="true"/>
</ft:widget>
<ft:widget id="message"/>
</td>
</tr>
</ft:repeater-widget>
<tr>
<td>
<ft:widget id="addright"/>
</td>
<td>
<ft:widget id="removeright"/>
</td>
</tr>
</table>
</td>
</tr>
</table>
<br />
<input type="submit" />
</ft:form-template>
</content>
</page>
|
|
|||
|