With help from the Imixs Workflow project you can implement a simple data access object with a minimal effort. The open source project provides a EJB service class named EntityService to store data based on a generic data object.
Before your data can be managed by the EntityService you need to create a simple data object – called ItemCollection. A ItemCollection contains a list of items that can store any type of data. There are no restrictions in the amount or size of the data stored into an ItemCollection. This is a example how to use the ItemCollection object:
import org.imixs.workflow.ItemCollection;
.....
ItemCollection workitem=new ItemCollection();
workitem.replaceItemValue("name","Anna");
workitem.replaceItemValue("age",new Integer(32));
Each item stored into a ItemCollection has a item-name and a item-value. The item-name identifies a specific part of data contained in a ItemCollection. You can access a item-value by its name:
....
String name=workitem.getItemValueString("name");
int age=workitem.getItemValueInteger("age");
....
To store a ItemColleciton using the EntityService is symply by calling the method save(); This method returns an updats ItemCollection cotaning the property ‘$uniqueID’ which identifies the data object and the property ‘type’ which is used to categorize different kind of data objects.
This is an example of an implementation in a JSF ManagedBean class.
@javax.inject.Named("teamController")
@javax.enterprise.context.SessionScoped
public class TeamController implements Serializable {
....
@EJB
private org.imixs.workflow.jee.ejb.EntityService entityService;
....
public String createAction(String action) {
workitemItemCollection = new ItemCollection();
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
String sUser = externalContext.getRemoteUser();
workitemItemCollection.replaceItemValue("namCreator", sUser);
workitemItemCollection.replaceItemValue("$WriteAccess", sUser);
workitemItemCollection.replaceItemValue("type", "team");
return action;
}
public String saveAction(String action) throws AccessDeniedException {
// save workitem now...
workitemItemCollection = entityService.save(workitemItemCollection);
return action;
}
....
}
Note that in this example the property ‘type’ is set to the value ‘team’ to categorize the dataobjects. Additional the property ‘$writeAccess’ is set to the current users name to grant access to the new data object.
To get a list of all cWith help from the Imixs Workflow project you can implement a simple data access object with a minimal effort. The open source project provides a EJB service class named EntityService to store data based on a generic data object.reated ItemCollections the EnityService also provides a simple load and find method:
public List<ItemCollection> getTeams() {
teams = new ArrayList<ItemCollection>();
Collection<ItemCollecti/imixsworkflow/on> col = null;
String sQuery = "SELECT wi FROM Entity AS wi " + " WHERE wi.type= '"
+ getType() + "' ORDER BY wi.modified desc";
col = entityService.findAllEntities(sQuery, row, maxSearchResult);
endOfList = col.size() < maxSearchResult;
for (ItemCollection aworkitem : col) {
teams.add((aworkitem));
}
return teams;
}
To access the dataobject from a JSF page is also very simple as all property are accessible through a Map interface.
....
<h:outputLabel for="subject_id" value="#{global.name}:">
<h:message style="color: red" for="subject_id" showSummary="true" showDetail="true" />
</h:outputLabel>
<h:inputText style="width: 20em;" required="true"
value="#{teamController.workitem.item['txtname']}" id="subject_id"/>
.....
<h:commandButton action="#{teamController.saveAction('teamlist')}"
value="#{global.save}" />
This is an example to display all data objects in a JSF table element:
<h:dataTable id="datatable_id" columns="7" value="#{teamController.teams}" var="record">
<h:column>
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{record.item['txtName']} " />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{global.modified}" />
</f:facet>
<h:outputText value="#{record.item['$modified']}">
<f:convertDateTime type="both" dateStyle="short"
pattern="dd.MM.yy HH:mm:ss" />
</h:outputText>
</h:column>
<!-- edit -->
<h:column>
<h:commandLink action="#{teamController.editAction(record,'team')}">
<h:outputText value="#{global.edit}" />
</h:commandLink>
</h:column>
<!-- delete -->
<h:column>
<h:commandLink value="#{global.delete}" action="#{teamController.deleteAction(record,null)}"/>
</h:column>
</h:dataTable>
You can find more examples on the Imixs Workflow project site. You can also checkout the complete sample application from the source code repository
http://java.net/projects/imixs-workflow/sources/svn/show/imixs-workflow-samples/imixs-workflow-web-sample/trunk
