From 0feed84b79a373fefbfc3a2f14034d5d43023eae Mon Sep 17 00:00:00 2001
From: "Barbara B. Frosik" <bfrosik@aps.anl.gov>
Date: Tue, 4 Nov 2014 21:12:18 +0000
Subject: [PATCH] Fixed resources

---
 .../anl/aps/dm/portal/constants/DmStatus.java |   1 +
 .../controllers/ExperimentController.java     | 130 ++++++++++++++++++
 .../dm/portal/exceptions/IncorrectDate.java   |  61 ++++++++
 .../portal/model/beans/ExperimentFacade.java  |  16 +++
 .../dm/portal/model/entities/Experiment.java  |  16 ++-
 .../DmWebPortal/src/java/resources.properties |   2 +
 .../resources/js/experiment/list.filter.js    |   6 +
 .../templates/contentViewTemplate4x3.xhtml    |   1 +
 .../web/views/experiment/create.xhtml         |  30 ++++
 .../web/views/experiment/edit.xhtml           |  33 +++++
 .../experimentCreatePanelGrid.xhtml           |  44 ++++++
 .../experiment/experimentDestroyDialog.xhtml  |  15 ++
 .../experiment/experimentEditPanelGrid.xhtml  |  46 +++++++
 .../experiment/experimentListDataTable.xhtml  |  68 +++++++++
 .../experiment/experimentViewPanelGrid.xhtml  |  41 ++++++
 .../web/views/experiment/list.xhtml           |  31 +++++
 .../web/views/experiment/view.xhtml           |  42 ++++++
 17 files changed, 581 insertions(+), 2 deletions(-)
 create mode 100644 src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
 create mode 100644 src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/exceptions/IncorrectDate.java
 create mode 100644 src/java/DmWebPortal/web/resources/js/experiment/list.filter.js
 create mode 100644 src/java/DmWebPortal/web/views/experiment/create.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/edit.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/experimentCreatePanelGrid.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/experimentDestroyDialog.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/list.xhtml
 create mode 100644 src/java/DmWebPortal/web/views/experiment/view.xhtml

diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/DmStatus.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/DmStatus.java
index 5f6e205b..5722ffea 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/DmStatus.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/constants/DmStatus.java
@@ -14,4 +14,5 @@ public class DmStatus
     public static final int DM_INVALID_OBJECT_STATE = 5;
     public static final int DM_OBJECT_ALREADY_EXISTS = 6;
     public static final int DM_OBJECT_NOT_FOUND = 7;
+    public static final int DM_INVALID_DATES = 8;
 }
\ No newline at end of file
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
new file mode 100644
index 00000000..d5fa1945
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/controllers/ExperimentController.java
@@ -0,0 +1,130 @@
+package gov.anl.aps.dm.portal.controllers;
+
+import gov.anl.aps.dm.portal.exceptions.DmPortalException;
+import gov.anl.aps.dm.portal.exceptions.ObjectAlreadyExists;
+import gov.anl.aps.dm.portal.exceptions.IncorrectDate;
+import gov.anl.aps.dm.portal.model.entities.Experiment;
+import gov.anl.aps.dm.portal.model.beans.ExperimentFacade;
+import java.util.List;
+
+import javax.ejb.EJB;
+import javax.inject.Named;
+import javax.enterprise.context.SessionScoped;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import javax.faces.convert.FacesConverter;
+import org.apache.log4j.Logger;
+
+@Named("experimentController")
+@SessionScoped
+public class ExperimentController extends CrudEntityController<Experiment, ExperimentFacade>
+{
+
+    private static final Logger logger = Logger.getLogger(ExperimentController.class.getName());
+
+    @EJB
+    private ExperimentFacade experimentFacade;
+
+    public ExperimentController() {
+    }
+
+    @Override
+    protected ExperimentFacade getFacade() {
+        return experimentFacade;
+    }
+
+    @Override
+    protected Experiment createEntityInstance() {
+        return new Experiment();
+    }
+
+    @Override
+    public String getEntityTypeName() {
+        return "experiment";
+    }
+
+    @Override
+    public String getCurrentEntityInstanceName() {
+        if (getCurrent() != null) {
+            return getCurrent().getName();
+        }
+        return "";
+    }
+
+    @Override
+    public List<Experiment> getAvailableItems() {
+        return super.getAvailableItems();
+    }
+
+    @Override
+    public String prepareEdit(Experiment experiment) {
+        return super.prepareEdit(experiment);
+    }
+
+    @Override
+    public void prepareEntityInsert(Experiment experiment) throws ObjectAlreadyExists, IncorrectDate {
+        Experiment existingExperiment = experimentFacade.findByName(experiment.getName());
+        if (existingExperiment != null) {
+            throw new ObjectAlreadyExists("Experiment " + experiment.getName() + " already exists.");
+        }
+        
+        if ((experiment.getStartDate() != null) && (experiment.getEndDate() != null) && (experiment.getEndDate().before(experiment.getStartDate()))) {
+            throw new IncorrectDate("Experiment end date is before start date.");
+        }
+        
+        logger.debug("Inserting new experiment " + experiment.getName());                
+    }
+
+    @Override
+    public void prepareEntityUpdate(Experiment experiment) throws DmPortalException {
+        super.prepareEntityUpdate(experiment);
+        if ((experiment.getStartDate() != null) && (experiment.getEndDate() != null) && (experiment.getEndDate().before(experiment.getStartDate()))) {
+            throw new IncorrectDate("Experiment end date is before start date.");
+        }        
+    }
+   
+
+    @FacesConverter(forClass = Experiment.class)
+    public static class ExperimentControllerConverter implements Converter
+    {
+
+        @Override
+        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
+            if (value == null || value.length() == 0) {
+                return null;
+            }
+            ExperimentController controller = (ExperimentController) facesContext.getApplication().getELResolver().
+                    getValue(facesContext.getELContext(), null, "experimentController");
+            return controller.getEntity(getKey(value));
+        }
+
+        java.lang.Integer getKey(String value) {
+            java.lang.Integer key;
+            key = Integer.valueOf(value);
+            return key;
+        }
+
+        String getStringKey(java.lang.Integer value) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(value);
+            return sb.toString();
+        }
+
+        @Override
+        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
+            if (object == null) {
+                return null;
+            }
+            if (object instanceof Experiment) {
+                Experiment o = (Experiment) object;
+                return getStringKey(o.getId());
+            }
+            else {
+                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Experiment.class.getName());
+            }
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/exceptions/IncorrectDate.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/exceptions/IncorrectDate.java
new file mode 100644
index 00000000..1b1f1a4b
--- /dev/null
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/exceptions/IncorrectDate.java
@@ -0,0 +1,61 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package gov.anl.aps.dm.portal.exceptions;
+
+
+import gov.anl.aps.dm.portal.constants.DmStatus;
+
+/**
+ * Object already exists exception class.
+ */
+public class IncorrectDate extends DmPortalException 
+{
+
+    /**
+     * Constructor.
+     */
+    public IncorrectDate() 
+    {
+        super();
+        setErrorCode(DmStatus.DM_INVALID_DATES);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param message Error message
+     */
+    public IncorrectDate(String message) 
+    {
+        super(message);
+        setErrorCode(DmStatus.DM_INVALID_DATES);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param throwable Throwable object
+     */
+    public IncorrectDate(Throwable throwable) 
+    {
+        super(throwable);
+        setErrorCode(DmStatus.DM_INVALID_DATES);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param message Error message
+     * @param throwable Throwable object
+     */
+    public IncorrectDate(String message, Throwable throwable) 
+    {
+        super(message, throwable);
+        setErrorCode(DmStatus.DM_INVALID_DATES);
+    }
+
+}
\ No newline at end of file
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentFacade.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentFacade.java
index d292111b..ebf51d3f 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentFacade.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/beans/ExperimentFacade.java
@@ -9,6 +9,7 @@ package gov.anl.aps.dm.portal.model.beans;
 import gov.anl.aps.dm.portal.model.entities.Experiment;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
 
 /**
@@ -30,4 +31,19 @@ public class ExperimentFacade extends AbstractFacade<Experiment>
         super(Experiment.class);
     }
     
+    public Experiment findByName(String name) {
+        try {
+            return (Experiment) em.createNamedQuery("Experiment.findByName")
+                    .setParameter("name", name)
+                    .getSingleResult();
+        }
+        catch (NoResultException ex) {
+        }
+        return null;
+    }
+
+    public boolean checkIfNameExists(String name) {
+        return findByName(name) != null;
+    }
+
 }
diff --git a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java
index d22df348..0285c5d6 100644
--- a/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java
+++ b/src/java/DmWebPortal/src/java/gov/anl/aps/dm/portal/model/entities/Experiment.java
@@ -118,7 +118,13 @@ public class Experiment extends CloneableEntity
         this.startDate = startDate;
     }
 
-    public Date getEndDate() {
+//     public void setStartDate(String startDate) {
+//         Date sDate = new Date();
+//         
+//        setStartDate(sDate);
+//    }
+
+   public Date getEndDate() {
         return endDate;
     }
 
@@ -126,6 +132,12 @@ public class Experiment extends CloneableEntity
         this.endDate = endDate;
     }
 
+//     public void setEndDate(String endDate) {
+//         Date eDate = new Date();
+//         
+//        setEndDate(eDate);
+//    }
+
     @XmlTransient
     public List<DataFolder> getDataFolderList() {
         return dataFolderList;
@@ -161,7 +173,7 @@ public class Experiment extends CloneableEntity
         this.experimentType = experimentType;
     }
 
-    @Override
+     @Override
     public int hashCode() {
         int hash = 0;
         hash += (id != null ? id.hashCode() : 0);
diff --git a/src/java/DmWebPortal/src/java/resources.properties b/src/java/DmWebPortal/src/java/resources.properties
index e33fd814..01b751cd 100644
--- a/src/java/DmWebPortal/src/java/resources.properties
+++ b/src/java/DmWebPortal/src/java/resources.properties
@@ -1,3 +1,5 @@
+DatePattern=MM-dd-yyy
+
 PersistenceErrorOccured=A persistence error occurred.
 Previous=Previous
 Next=Next
diff --git a/src/java/DmWebPortal/web/resources/js/experiment/list.filter.js b/src/java/DmWebPortal/web/resources/js/experiment/list.filter.js
new file mode 100644
index 00000000..0cb3f029
--- /dev/null
+++ b/src/java/DmWebPortal/web/resources/js/experiment/list.filter.js
@@ -0,0 +1,6 @@
+
+jQuery(document).ready(function() {
+    PF('experimentListWidget').filter();
+});
+
+
diff --git a/src/java/DmWebPortal/web/templates/contentViewTemplate4x3.xhtml b/src/java/DmWebPortal/web/templates/contentViewTemplate4x3.xhtml
index 5ae9816d..b90a1633 100644
--- a/src/java/DmWebPortal/web/templates/contentViewTemplate4x3.xhtml
+++ b/src/java/DmWebPortal/web/templates/contentViewTemplate4x3.xhtml
@@ -59,6 +59,7 @@
                                     <p:menuitem value="Experiment Types" url="/views/experimentType/list.xhtml"/>
                                     <p:menuitem value="Role Types" url="/views/roleType/list.xhtml"/>
                                     <p:menuitem value="Users" url="/views/userInfo/list.xhtml"/>
+                                    <p:menuitem value="Experiments" url="/views/experiment/list.xhtml"/>                                    
                                     <p:menuitem value="Login" onclick="PF('loginDialog').show();" rendered="#{!loginController.loggedIn}" icon="ui-icon-person"/>
                                     <p:menuitem value="Logout" action="#{loginController.logout()}" rendered="#{loginController.loggedIn}" icon="ui-icon-close"/>                                </p:menubar>
                             </h:form>
diff --git a/src/java/DmWebPortal/web/views/experiment/create.xhtml b/src/java/DmWebPortal/web/views/experiment/create.xhtml
new file mode 100644
index 00000000..f9a48d18
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/create.xhtml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
+                template="../../templates/contentViewTemplate4x3.xhtml">
+
+    <ui:define name="middleCenter">
+        <div class="pageTitle">
+            <h1>Add Experiment</h1>
+        </div>
+
+        <h:form id="addExperimentForm">
+
+            <ui:include src="experimentCreatePanelGrid.xhtml"/>
+
+            <p/>
+            <div class="actionButton">
+                <p:commandButton action="#{experimentController.create()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+                <p:commandButton action="#{experimentController.prepareList()}" immediate="true" value="Cancel" alt="Cancel" icon="ui-icon-cancel"/>
+            </div>
+        </h:form>
+
+    </ui:define>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/edit.xhtml b/src/java/DmWebPortal/web/views/experiment/edit.xhtml
new file mode 100644
index 00000000..63a6f528
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/edit.xhtml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
+                template="../../templates/contentViewTemplate4x3.xhtml">
+
+    <ui:define name="middleCenter">
+        <h:form id="editExperimentForm">
+
+            <div class="middleCenterLeftContent">
+                <div class="pageTitle">
+                    <h1>Edit Experiment</h1>
+                </div>
+
+                <ui:include src="experimentEditPanelGrid.xhtml"/>
+                <p/>
+                <div class="actionButton">
+                    <p:commandButton action="#{experimentController.update()}" value="Save" alt="Save" icon="ui-icon-check" update="@form"/>
+<!--                    <p:commandButton action="list.xhtml?faces-redirect=true" immediate="true" value="Done" alt="Done" icon="ui-icon-arrowreturnthick-1-w"/>-->
+                    <p:commandButton action="#{experimentController.prepareList()}" immediate="true" value="Done" alt="Done" icon="ui-icon-arrowreturnthick-1-w"/>
+                </div>
+            </div>
+
+        </h:form>
+
+    </ui:define>
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentCreatePanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentCreatePanelGrid.xhtml
new file mode 100644
index 00000000..7bb29ad0
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/experimentCreatePanelGrid.xhtml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:f="http://java.sun.com/jsf/core"        
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
+
+    <c:set var="experimentObject" value="#{experimentController.selected}"/>
+    
+    <p:panelGrid columns="3" styleClass="createEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="name" value="#{experimentObject.name}" title="Name" required="true" styleClass="entityDataEmphasizedText"/>
+        <p:message for="name"/> 
+
+        <h:outputLabel for="experimentType" value="Experiment Type" styleClass="entityDataLabel"/>
+        <p:selectOneMenu id="experimentType" value="#{experimentObject.experimentType}" styleClass="entityDataText">
+            <f:selectItem itemLabel="Select Type" itemValue="" noSelectionOption="true" />
+            <f:selectItems value="#{experimentTypeController.getAvailableItems()}" 
+                           var="n"
+                           itemValue="#{n}"
+                           itemLabel="#{n.name}"/>
+        </p:selectOneMenu>
+        <p:message for="experimentType"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{experimentObject.description}" title="Description" styleClass="entityDataText"/>
+        <p:message for="description"/>        
+
+        <h:outputLabel for="startDate" value="Start Date" styleClass="entityDataLabel"/>
+        <p:calendar id="startDate" value="#{experimentObject.startDate}" />
+        <p:message for="startDate"/>
+        
+        <h:outputLabel for="endDate" value="End Date" styleClass="entityDataLabel"/>
+        <p:calendar id="endDate" value="#{experimentObject.endDate}" />
+        <p:message for="endDate"/>
+        
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentDestroyDialog.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentDestroyDialog.xhtml
new file mode 100644
index 00000000..1f8af3d4
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/experimentDestroyDialog.xhtml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
+
+    <p:confirmDialog id="experimentDestroyDialog" message="Destroy experiment #{experimentController.getCurrentEntityInstanceName()}?"
+                     header="Destroy Experiment" severity="alert" widgetVar="experimentDestroyDialogWidget"
+                     styleClass="dialog">
+        <p:commandButton value="Yes" oncomplete="experimentDestroyDialogWidget.hide()" action="#{experimentController.destroy()}"/>
+        <p:commandButton value="No" onclick="PF('experimentDestroyDialogWidget').hide()" type="button" />
+    </p:confirmDialog>  
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.xhtml
new file mode 100644
index 00000000..7163ffcd
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/experimentEditPanelGrid.xhtml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
+                xmlns:f="http://xmlns.jcp.org/jsf/core">
+
+    <c:set var="experimentObject" value="#{experimentController.selected}"/>
+    <c:set var="isFieldWriteable" value="#{loginController.loggedIn}"/>
+
+    <p:panelGrid columns="3" styleClass="editEntityDetails"> 
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:inputText id="name" value="#{experimentObject.name}" title="Name" required="true" styleClass="entityDataEmphasizedText"/>
+        <p:message for="name"/> 
+
+        <h:outputLabel for="id" value="Id" styleClass="entityDataLabel"/>
+        <h:outputText id="id" value="#{experimentObject.id}" title="Id" styleClass="entityDataText"/>
+        <p:message for="id"/>
+
+        <h:outputLabel for="experimentType" value="Experiment Type" styleClass="entityDataLabel"/>
+        <p:selectOneMenu id="experimentType" value="#{experimentObject.experimentType}" styleClass="entityDataText">
+            <f:selectItem itemLabel="Select Type" itemValue="" noSelectionOption="true" />
+            <f:selectItems value="#{experimentTypeController.getAvailableItems()}" 
+                           var="n"
+                           itemValue="#{n}"
+                           itemLabel="#{n.name}"/>
+        </p:selectOneMenu>
+        <p:message for="experimentType"/> 
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:inputText id="description" value="#{experimentObject.description}" title="Description" styleClass="entityDataText"/>
+        <p:message for="description"/>  
+        
+        <h:outputLabel for="startDate" value="Start Date" styleClass="entityDataLabel"/>
+        <p:calendar id="startDate" value="#{experimentObject.startDate}" />
+        <p:message for="startDate"/>
+        
+        <h:outputLabel for="endDate" value="End Date" styleClass="entityDataLabel"/>
+        <p:calendar id="endDate" value="#{experimentObject.endDate}" />
+        <p:message for="endDate"/>
+
+    </p:panelGrid>
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
new file mode 100644
index 00000000..940327f3
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/experimentListDataTable.xhtml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
+
+    <p:dataTable id="experimentListDataTable"                              
+                 var="experimentObject" 
+                 value="#{experimentController.listDataModel}" 
+                 filteredValue="#{experimentController.filteredObjectList}"
+                 paginator="true" 
+                 paginatorAlwaysVisible="false" 
+                 rows="25"
+                 binding="#{experimentController.listDataTable}"
+                 widgetVar="experimentListWidget" 
+                 emptyMessage="No experiments found.">
+
+        <p:column sortBy="#{experimentObject.id}" headerText="Id" width="40">
+            <h:outputText value="#{experimentObject.id}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.name}" headerText="Name" 
+                  filterBy="#{experimentObject.name}" filterMatchMode="contains" width="120">
+            <h:outputText value="#{experimentObject.name}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.experimentType.name}" headerText="Type" 
+                  filterBy="#{experimentObject.experimentType.name}" filterMatchMode="contains" width="120">
+            <h:outputText value="#{experimentObject.experimentType.name}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.description}" headerText="Description" 
+                  filterBy="#{experimentObject.description}" filterMatchMode="contains">
+            <h:outputText value="#{experimentObject.description}"/>
+        </p:column>
+
+        <p:column sortBy="#{experimentObject.startDate}" headerText="Start Date" 
+                  filterBy="#{experimentObject.startDate}" filterMatchMode="contains" width="120">
+
+            <h:outputText value="#{experimentObject.startDate}">
+                          <f:convertDateTime pattern="#{resources.DatePattern}" type="date" />
+            </h:outputText>
+        </p:column>
+        
+        <p:column sortBy="#{experimentObject.endDate}" headerText="End Date" 
+                  filterBy="#{experimentObject.endDate}" filterMatchMode="contains" width="120">
+
+            <h:outputText value="#{experimentObject.endDate}">
+                          <f:convertDateTime pattern="#{resources.DatePattern}" type="date" />
+            </h:outputText>
+        </p:column>
+        
+        <c:set var="isEntityWriteable" value="#{loginController.loggedIn}"/>
+        <p:column headerText="Actions" width="70">
+            <div class="actionLink">
+                <p:commandLink action="#{experimentController.prepareView(experimentObject)}" styleClass="ui-icon ui-icon-info" title="View"/>
+                <p:commandLink action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{isEntityWriteable}" styleClass="ui-icon ui-icon-pencil" title="Edit"/>
+                <p:commandLink oncomplete="PF('experimentDestroyDialogWidget').show()" rendered="#{loginController.loggedIn}" styleClass="ui-icon ui-icon-trash" title="Delete" update="@form">
+                    <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentController.current}"/>
+                </p:commandLink>
+            </div>
+        </p:column>
+    </p:dataTable>
+
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml b/src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml
new file mode 100644
index 00000000..a8561042
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/experimentViewPanelGrid.xhtml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
+                xmlns:f="http://xmlns.jcp.org/jsf/core">
+
+    <c:set var="experimentObject" value="#{experimentController.selected}"/>
+
+    <p:panelGrid columns="2" styleClass="viewEntityDetails">
+
+        <h:outputLabel for="name" value="Name" styleClass="entityDataEmphasizedLabel"/>
+        <h:outputText id="name" value="#{experimentObject.name}" title="Name" styleClass="entityDataEmphasizedText"/>
+
+        <h:outputLabel for="id" value="Id" styleClass="entityDataLabel"/>
+        <h:outputText id="id" value="#{experimentObject.id}" title="Id" styleClass="entityDataText"/>
+
+        <h:outputLabel for="experimentType" value="Type" styleClass="entityDataLabel"/>
+        <h:outputText id="experimentType" value="#{experimentObject.experimentType.name}" title="Name" styleClass="entityDataText"/>
+
+        <h:outputLabel for="description" value="Description" styleClass="entityDataLabel"/>
+        <h:outputText id="description" value="#{experimentObject.description}" title="Description" styleClass="entityDataText"/>
+ 
+        <h:outputLabel for="startDate" value="Start Date" styleClass="entityDataLabel"/>
+        <h:outputText  id="startDate" value="#{experimentObject.startDate}" styleClass="entityDataText">
+            <f:convertDateTime pattern="#{resources.DatePattern}" type="date" />
+        </h:outputText>
+
+        
+        <h:outputLabel for="endDate" value="End Date" styleClass="entityDataLabel"/>
+        <h:outputText  id="endDate" value="#{experimentObject.endDate}" styleClass="entityDataText">
+            <f:convertDateTime pattern="#{resources.DatePattern}" type="date" />
+        </h:outputText>
+       
+    </p:panelGrid>
+
+</ui:composition>
+
+
diff --git a/src/java/DmWebPortal/web/views/experiment/list.xhtml b/src/java/DmWebPortal/web/views/experiment/list.xhtml
new file mode 100644
index 00000000..21d4a729
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/list.xhtml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
+                template="../../templates/contentViewTemplate4x3.xhtml">
+
+    <ui:define name="middleCenter">
+        <div class="pageTitle">
+            <h1>Experiments</h1>
+        </div>
+
+        <h:form id="viewExperimentListForm">
+            <c:set var="entityController" value="#{experimentController}"/>
+            <ui:include src="../common/commonListActionButtons.xhtml"/>
+
+            <h:panelGroup>  
+                <ui:include src="experimentListDataTable.xhtml"/>
+            </h:panelGroup>
+
+            <ui:include src="experimentDestroyDialog.xhtml"/>
+
+            <h:outputScript library="js/experiment" name="list.filter.js" rendered="#{loginController.loggedIn}"/>
+
+        </h:form>
+
+    </ui:define>
+</ui:composition>
diff --git a/src/java/DmWebPortal/web/views/experiment/view.xhtml b/src/java/DmWebPortal/web/views/experiment/view.xhtml
new file mode 100644
index 00000000..b521d96c
--- /dev/null
+++ b/src/java/DmWebPortal/web/views/experiment/view.xhtml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+                xmlns:h="http://java.sun.com/jsf/html"
+                xmlns:p="http://primefaces.org/ui"
+                xmlns:f="http://java.sun.com/jsf/core"
+                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
+                xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
+                template="../../templates/contentViewTemplate4x3.xhtml">
+
+    <ui:define name="middleCenter">
+        <h:form id="viewExperimentForm">
+
+            <div class="middleCenterLeftContent">
+                <div class="pageTitle">
+                    <h1>Experiment Details</h1>
+                </div>
+
+                <ui:include src="experimentViewPanelGrid.xhtml"/>
+                
+                <p/>
+                    <c:set var="experimentObject" value="#{experimentController.selected}"/>
+                <c:set var="isEntityWriteable" value="#{loginController.loggedIn}"/>
+                <div class="actionButton">
+                    <p:commandButton action="#{experimentController.prepareEdit(experimentObject)}" rendered="#{isEntityWriteable}" value="Edit" alt="Edit" icon="ui-icon-pencil"/>
+                    <p:commandButton onclick="PF('experimentDestroyDialogWidget').show();" rendered="#{loginController.loggedIn}" value="Delete" alt="Delete" icon="ui-icon-trash">
+                        <f:setPropertyActionListener value="#{experimentObject}" target="#{experimentController.current}"/>
+                    </p:commandButton>  
+                    <p:commandButton action="#{experimentController.prepareList()}" value="Done" alt="Done" icon="ui-icon-arrowreturnthick-1-w"/>
+                </div>
+
+                <ui:include src="experimentDestroyDialog.xhtml"/>
+                
+            </div>
+
+        </h:form>
+
+    </ui:define>
+
+</ui:composition>
+
+
-- 
GitLab