You are viewing a plain text version of this content. The canonical link for it is here.
Posted to graffito-dev@incubator.apache.org by Christophe Lombart <ch...@gmail.com> on 2005/05/16 22:04:47 UTC

Proposal : Graffito/J2 portlet framework

Hi all, 

I'm currently thinking about a small "Graffito portlet  frameworks"
which can solve some classic issues. I think this one can be donate
later (after some discussion between us) to Jetspeed project.
Here is a brief summary. Can you tell me what do you think about that
? In order to give you more details, I can commit the code of this
proposal this week.  I'm ready to see other solutions and if needed
I'm ready to review the complete code.

Situation : 
-------------
1. The Graffito browser portlet has to manage different kind of cms
objects (folders, binaries, simple texts, html docs, ...). It is a
nice portlet to manage the complete content tree in one place but it
contains many templates and actions to process.  This causes too many
checks and important amount of code in the different portlet methods
(doView, doEdit and processAction). This complexity will increase when
 we will add server references, articles, news, ...

2. Moving from the view mode to edit mode is not so simple. Depending
on the cms object nature, this portlet has to choose the appropriate
template and method used to retrieve the correct information.
For example : in the view mode, it is possible to navigate across the
content tree and select an HTML document. When the user switch to the
edit mode, an html editor should be display.
On the other hand, if the user select another kind of cms object,
other information has to be display in the edit mode.

3. This Graffito portlet uses tabs (in the edit mode) to show details
on the selected cms object (eg. for a folder : its children, its
attributes ans its associated permissions).

4. Last point, it should be nice to have some "wizard"
fonctionnalities to manage cms object creation, delete, ...

Features/solution :  
------------------------

Note : this framework is not usefull for simple portlets containing a
few amount of templates and actions to proceed or when no wizard and
no tab are required.

* Declarative page management :
- The framework engine uses an xml config file containing each "page"
available in the view & edit mode and the relation between them ( eg.
: the "folderView" page is linked to the "folderEdit" page).
- A page is associated to a template (VM or jsp, ...) and an action.
This action is used to retrieve the correct information. Maybe
"action" is not the correct name and can give some confusion with
"processAction". Optionnally, a page can contains one or more tabs.
There is a default page for the view mode and another one for the edit
mode.
- a template href  or a submit button can be used to forward to a page
just by specifying its name. In function of this name, the engine will
display the page template and execute the page action.
- a template href  or a submit button can execute an simple action
(like delete a cms object). After executing this action, the engine
will render the current page.

* Tab management : 
- A tab is composed of different tab page. A tab page is associated to
a template and also an action. This action is used to populate the tab
page. No additionnal code is required to navigate across the different
tab pages. It is also possible to add some condition to show a tab
page. Eg. if the document is an article, display the article editor
otherwise the html editor.

* Other features : 
- Upload support
- Populate beans from portlet request
- Velocity macros and jsp custom tags used display document links, cms
path, tabs, ...

Plan to do  :
- Wizard is not yet supported. I would like to define also the wizards
in a config file. This one can specify how to naviagate across the
different wizard pages.
- Treeview (with lazy loading) : I would like to use more and more
tools like XMLHttpRequest which can increase portlet performances. It
just an idea - let me know you point of view.

What the developer has to do ?
----------------------------------------
Programming with this framework , the developers has only to do : 
* Define the page structures in an xml config file.
* Build some action classes and templates. 
* The same portlet can be used to manage an important number of
actions and template. One ancestor portlet can be defined.


Other solutions (?)
------------------------

Another solution is to split this Browser portlet into smaller
portlets. This approach can gives more complexities in the psml file
(compare to this "all in one" portlet :-) )

Page config file sample
-----------------------------

<pages>
	<view>
		<page id = "folderViewer" action="folder.retrieve"
template="/WEB-INF/view/folder/folder-browser.vm" defaultPage="true"
/>

		<page id = "documentHtmlTextViewer" action="document.retrieve"
template="/WEB-INF/view/document/document-view-text-html.vm">
			<editpage>documentEdit</editpage>
		</page> 
		
		<page id = "documentUploadViewer" action="document.retrieve"
template="/WEB-INF/view/document/document-view-upload.vm">
			<editpage>documentEdit</editpage>
		</page>
			
	</view>
	<edit>
		<page id = "folderEdit"
template="/WEB-INF/view/folder/folder-tab.vm" defaultPage="true">
			<tab id="folder-edit">
				<page id="children" label="tab.folder-edit.children"
template="/WEB-INF/view/folder/folder-children.vm" action =
					"folder.retrieve" defaultTabPage="true" />
				<page id="metadata" label="tab.folder-edit.metadata"
template="/WEB-INF/view/folder/folder-metadata.vm" action =
					"folder.retrieve" />
				<page id="security" label="tab.security"
template="/WEB-INF/view/security/security-browser.vm" action
					="permission.retrieve" />
			</tab>
		</page>
		<page id = "folderCreate" action="folder.create"
template="/WEB-INF/view/folder/folder-metadata.vm" >
			<viewPage>folderViewer</viewPage>			
		</page>

		<page id = "documentEdit" template="/WEB-INF/view/document/document-tab.vm">
			<tab id="document-edit">
				<page id="content" label="tab.document-edit.content" template=
"/WEB-INF/view/document/document-edit-content.vm"
					action="document.retrieve" defaultTabPage="true" />
				<page id="metadata" label="tab.document-edit.metadata" template= 
					"/WEB-INF/view/document/document-edit-metadata.vm"
action="document.retrieve" />
				<page id="security" label="tab.security" template=
"/WEB-INF/view/security/security-browser.vm"
					action="permission.retrieve" />
			</tab>
			<viewPage condition='documentDTO.getDocument().getContentType().equals("text/plain")
|| documentDTO.getDocument().getContentType().equals("text/html")'>documentHtmlTextViewer</viewPage>
			<viewPage condition='documentDTO.getDocument().getContentType().equals("text/html")'>documentUploadViewer</viewPage>
		</page>
		<page id = "documentCreate" action="document.createWizard"
template="/WEB-INF/view/document/document-edit-metadata.vm" />
		
		<page id = "textEdit" action="document.createWizard"
template="/WEB-INF/view/document/document-edit-text.vm" >
			<viewPage>documentHtmlTextViewer</viewPage>
		</page>
		<page id = "htmlEdit" action="document.createWizard"
template="/kupu/kupu.vm" >
			<viewPage>documentHtmlTextViewer</viewPage>
		</page>
		<page id = "uploadEdit" action="document.createWizard"
template="/WEB-INF/view/document/document-edit-upload.vm" >
			<viewPage>documentUploadViewer</viewPage>
		</page>
		<page id = "permissionCreate" action="permission.create"
template="/WEB-INF/view/security/security-permission.vm" />
	</edit>
</pages>


What do you think ?

Kind regards, 
Christophe

Re: Proposal : Graffito/J2 portlet framework

Posted by Christophe Lombart <ch...@gmail.com>.
On 5/17/05, Markus Joschko <ma...@gmail.com> wrote:
> Sounds cool. I read you are using spring. So you might want to have a
> look at the spring webflow framework for the wizards. That allows for
> declarative configuration of flows.
> 
Yes that seems to be the same idea (for the wizards). Anyway, I found
the Spring MVC portlet framework too complex (or maybe it is due to
the fact that there is no simple examples).


> Another topic: I'm subscribed now on your mailinglist for quite some
> time. I hoped to get an impression of the current state of graffito
> (as I have very limited time in the moment I refused to setup jetspeed
> and graffito to test it). But as the mailinglist is very quite I still
> don't have a clue what the status of graffito is. Is there something
> substantial yet or are you in a conceptiual state? That means, is
> graffito as a framework usable or is there still a lot of work to be
> done? How many commiters are on the project?
> 
Graffito provides nice portlets to view/manage the content tree. it is
already integrated with JAAS and the J2 security services. it is also
integrated with an HTML editor (kupu).
We are working on JCR integration and finalizing the current portlets.
We plan also to support other content server (Webdav, ...). I think
Graffito is providing a very simple api.

Later, we plan to add workflow and version management. J2 integration
is almost done. A graffito implementation will be  implemented for the
Jetspeed 2 page manager.

On the top of that, you should see later application like forums, news
management, articles management, ... but all of this is not yet ready
to use in production.

Christophe

Re: Proposal : Graffito/J2 portlet framework

Posted by Markus Joschko <ma...@gmail.com>.
Sounds cool. I read you are using spring. So you might want to have a
look at the spring webflow framework for the wizards. That allows for
declarative configuration of flows.

Another topic: I'm subscribed now on your mailinglist for quite some
time. I hoped to get an impression of the current state of graffito
(as I have very limited time in the moment I refused to setup jetspeed
and graffito to test it). But as the mailinglist is very quite I still
don't have a clue what the status of graffito is. Is there something
substantial yet or are you in a conceptiual state? That means, is
graffito as a framework usable or is there still a lot of work to be
done? How many commiters are on the project?

Thanks,
 Markus 


On 5/17/05, Christophe Lombart <ch...@gmail.com> wrote:
> Hi all,
> 
> I'm currently thinking about a small "Graffito portlet  frameworks"
> which can solve some classic issues. I think this one can be donate
> later (after some discussion between us) to Jetspeed project.
> Here is a brief summary. Can you tell me what do you think about that
> ? In order to give you more details, I can commit the code of this
> proposal this week.  I'm ready to see other solutions and if needed
> I'm ready to review the complete code.
> 
> Situation :
> -------------
> 1. The Graffito browser portlet has to manage different kind of cms
> objects (folders, binaries, simple texts, html docs, ...). It is a
> nice portlet to manage the complete content tree in one place but it
> contains many templates and actions to process.  This causes too many
> checks and important amount of code in the different portlet methods
> (doView, doEdit and processAction). This complexity will increase when
>  we will add server references, articles, news, ...
> 
> 2. Moving from the view mode to edit mode is not so simple. Depending
> on the cms object nature, this portlet has to choose the appropriate
> template and method used to retrieve the correct information.
> For example : in the view mode, it is possible to navigate across the
> content tree and select an HTML document. When the user switch to the
> edit mode, an html editor should be display.
> On the other hand, if the user select another kind of cms object,
> other information has to be display in the edit mode.
> 
> 3. This Graffito portlet uses tabs (in the edit mode) to show details
> on the selected cms object (eg. for a folder : its children, its
> attributes ans its associated permissions).
> 
> 4. Last point, it should be nice to have some "wizard"
> fonctionnalities to manage cms object creation, delete, ...
> 
> Features/solution :
> ------------------------
> 
> Note : this framework is not usefull for simple portlets containing a
> few amount of templates and actions to proceed or when no wizard and
> no tab are required.
> 
> * Declarative page management :
> - The framework engine uses an xml config file containing each "page"
> available in the view & edit mode and the relation between them ( eg.
> : the "folderView" page is linked to the "folderEdit" page).
> - A page is associated to a template (VM or jsp, ...) and an action.
> This action is used to retrieve the correct information. Maybe
> "action" is not the correct name and can give some confusion with
> "processAction". Optionnally, a page can contains one or more tabs.
> There is a default page for the view mode and another one for the edit
> mode.
> - a template href  or a submit button can be used to forward to a page
> just by specifying its name. In function of this name, the engine will
> display the page template and execute the page action.
> - a template href  or a submit button can execute an simple action
> (like delete a cms object). After executing this action, the engine
> will render the current page.
> 
> * Tab management :
> - A tab is composed of different tab page. A tab page is associated to
> a template and also an action. This action is used to populate the tab
> page. No additionnal code is required to navigate across the different
> tab pages. It is also possible to add some condition to show a tab
> page. Eg. if the document is an article, display the article editor
> otherwise the html editor.
> 
> * Other features :
> - Upload support
> - Populate beans from portlet request
> - Velocity macros and jsp custom tags used display document links, cms
> path, tabs, ...
> 
> Plan to do  :
> - Wizard is not yet supported. I would like to define also the wizards
> in a config file. This one can specify how to naviagate across the
> different wizard pages.
> - Treeview (with lazy loading) : I would like to use more and more
> tools like XMLHttpRequest which can increase portlet performances. It
> just an idea - let me know you point of view.
> 
> What the developer has to do ?
> ----------------------------------------
> Programming with this framework , the developers has only to do :
> * Define the page structures in an xml config file.
> * Build some action classes and templates.
> * The same portlet can be used to manage an important number of
> actions and template. One ancestor portlet can be defined.
> 
> Other solutions (?)
> ------------------------
> 
> Another solution is to split this Browser portlet into smaller
> portlets. This approach can gives more complexities in the psml file
> (compare to this "all in one" portlet :-) )
> 
> Page config file sample
> -----------------------------
> 
> <pages>
>         <view>
>                 <page id = "folderViewer" action="folder.retrieve"
> template="/WEB-INF/view/folder/folder-browser.vm" defaultPage="true"
> />
> 
>                 <page id = "documentHtmlTextViewer" action="document.retrieve"
> template="/WEB-INF/view/document/document-view-text-html.vm">
>                         <editpage>documentEdit</editpage>
>                 </page>
> 
>                 <page id = "documentUploadViewer" action="document.retrieve"
> template="/WEB-INF/view/document/document-view-upload.vm">
>                         <editpage>documentEdit</editpage>
>                 </page>
> 
>         </view>
>         <edit>
>                 <page id = "folderEdit"
> template="/WEB-INF/view/folder/folder-tab.vm" defaultPage="true">
>                         <tab id="folder-edit">
>                                 <page id="children" label="tab.folder-edit.children"
> template="/WEB-INF/view/folder/folder-children.vm" action =
>                                         "folder.retrieve" defaultTabPage="true" />
>                                 <page id="metadata" label="tab.folder-edit.metadata"
> template="/WEB-INF/view/folder/folder-metadata.vm" action =
>                                         "folder.retrieve" />
>                                 <page id="security" label="tab.security"
> template="/WEB-INF/view/security/security-browser.vm" action
>                                         ="permission.retrieve" />
>                         </tab>
>                 </page>
>                 <page id = "folderCreate" action="folder.create"
> template="/WEB-INF/view/folder/folder-metadata.vm" >
>                         <viewPage>folderViewer</viewPage>
>                 </page>
> 
>                 <page id = "documentEdit" template="/WEB-INF/view/document/document-tab.vm">
>                         <tab id="document-edit">
>                                 <page id="content" label="tab.document-edit.content" template=
> "/WEB-INF/view/document/document-edit-content.vm"
>                                         action="document.retrieve" defaultTabPage="true" />
>                                 <page id="metadata" label="tab.document-edit.metadata" template=
>                                         "/WEB-INF/view/document/document-edit-metadata.vm"
> action="document.retrieve" />
>                                 <page id="security" label="tab.security" template=
> "/WEB-INF/view/security/security-browser.vm"
>                                         action="permission.retrieve" />
>                         </tab>
>                         <viewPage condition='documentDTO.getDocument().getContentType().equals("text/plain")
> || documentDTO.getDocument().getContentType().equals("text/html")'>documentHtmlTextViewer</viewPage>
>                         <viewPage condition='documentDTO.getDocument().getContentType().equals("text/html")'>documentUploadViewer</viewPage>
>                 </page>
>                 <page id = "documentCreate" action="document.createWizard"
> template="/WEB-INF/view/document/document-edit-metadata.vm" />
> 
>                 <page id = "textEdit" action="document.createWizard"
> template="/WEB-INF/view/document/document-edit-text.vm" >
>                         <viewPage>documentHtmlTextViewer</viewPage>
>                 </page>
>                 <page id = "htmlEdit" action="document.createWizard"
> template="/kupu/kupu.vm" >
>                         <viewPage>documentHtmlTextViewer</viewPage>
>                 </page>
>                 <page id = "uploadEdit" action="document.createWizard"
> template="/WEB-INF/view/document/document-edit-upload.vm" >
>                         <viewPage>documentUploadViewer</viewPage>
>                 </page>
>                 <page id = "permissionCreate" action="permission.create"
> template="/WEB-INF/view/security/security-permission.vm" />
>         </edit>
> </pages>
> 
> What do you think ?
> 
> Kind regards,
> Christophe
>