Logo von Guschtel.de Nicht eingeloggt.  
Main |  Privat |  Linux |  Clausthal |  Studium |  Stuff |  UniInfos II |  Userbereich |  Block |  Admin | 

 
Sie sind hier: Main > Linux > Cocoon, OJB and JDO with Cforms
KrabbelViech

Cocoon, OJB and JDO with Cforms

Content

Non-Decomposed m:n Relationship

  • Database Design
  • Java Classes
  • package.jdo
  • repository.xml
  • Flow
  • Cforms Definition
  • Cforms Binding
  • Cforms Template
Thanks for Tim Larsons help and Support when building this examples.

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 &lt; 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>




Main |  Privat |  Linux |  Clausthal |  Studium |  Stuff |  UniInfos II |  Userbereich |  Block |  Admin |   
Mittwoch, 23. Mai 2012 18:30:22 - http://old.guschtel.de/HP5/linux/ojbjdo_ndmton.php - Impressum
krabbel