3045d8c00c66f3d6b9629841cf72e3f6452c84b8
[simdecs.git] / src / java / org / ufcspa / simdecs / bn / ui / AnswerController.java
1 package org.ufcspa.simdecs.bn.ui;
2
3 import org.ufcspa.simdecs.bn.entity.Answer;
4 import org.ufcspa.simdecs.bn.ui.util.JsfUtil;
5 import org.ufcspa.simdecs.bn.ui.util.PaginationHelper;
6 import org.ufcspa.simdecs.bn.jpa.AnswerJpaController;
7
8 import java.io.Serializable;
9 import java.util.ResourceBundle;
10 import javax.annotation.Resource;
11 import javax.faces.bean.ManagedBean;
12 import javax.faces.bean.SessionScoped;
13 import javax.faces.component.UIComponent;
14 import javax.faces.context.FacesContext;
15 import javax.faces.convert.Converter;
16 import javax.faces.convert.FacesConverter;
17 import javax.faces.model.DataModel;
18 import javax.faces.model.ListDataModel;
19 import javax.faces.model.SelectItem;
20 import javax.persistence.EntityManagerFactory;
21 import javax.persistence.PersistenceUnit;
22 import javax.transaction.UserTransaction;
23
24 @ManagedBean(name = "answerController")
25 @SessionScoped
26 public class AnswerController implements Serializable {
27
28     @Resource
29     private UserTransaction utx = null;
30     @PersistenceUnit(unitName = "simdecsEclipseLinkPU")
31     private EntityManagerFactory emf = null;
32     private Answer current;
33     private DataModel items = null;
34     private AnswerJpaController jpaController = null;
35     private PaginationHelper pagination;
36     private int selectedItemIndex;
37
38     public AnswerController() {
39     }
40
41     public Answer getSelected() {
42         if (current == null) {
43             current = new Answer();
44             selectedItemIndex = -1;
45         }
46         return current;
47     }
48
49     private AnswerJpaController getJpaController() {
50         if (jpaController == null) {
51             jpaController = new AnswerJpaController(utx, emf);
52         }
53         return jpaController;
54     }
55
56     public PaginationHelper getPagination() {
57         if (pagination == null) {
58             pagination = new PaginationHelper(10) {
59
60                 @Override
61                 public int getItemsCount() {
62                     return getJpaController().getAnswerCount();
63                 }
64
65                 @Override
66                 public DataModel createPageDataModel() {
67                     return new ListDataModel(getJpaController().findAnswerEntities(getPageSize(), getPageFirstItem()));
68                 }
69             };
70         }
71         return pagination;
72     }
73
74     public String prepareList() {
75         recreateModel();
76         return "List";
77     }
78
79     public String prepareView() {
80         current = (Answer) getItems().getRowData();
81         selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
82         return "View";
83     }
84
85     public String prepareCreate() {
86         current = new Answer();
87         selectedItemIndex = -1;
88         return "Create";
89     }
90
91     public String create() {
92         try {
93             getJpaController().create(current);
94             JsfUtil.addSuccessMessage(ResourceBundle.getBundle("org/ufcspa/simdecs/bn/Bundle").getString("AnswerCreated"));
95             return prepareCreate();
96         } catch (Exception e) {
97             JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("org/ufcspa/simdecs/bn/Bundle").getString("PersistenceErrorOccured"));
98             return null;
99         }
100     }
101
102     public String prepareEdit() {
103         current = (Answer) getItems().getRowData();
104         selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
105         return "Edit";
106     }
107
108     public String update() {
109         try {
110             getJpaController().edit(current);
111             JsfUtil.addSuccessMessage(ResourceBundle.getBundle("org/ufcspa/simdecs/bn/Bundle").getString("AnswerUpdated"));
112             return "View";
113         } catch (Exception e) {
114             JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("org/ufcspa/simdecs/bn/Bundle").getString("PersistenceErrorOccured"));
115             return null;
116         }
117     }
118
119     public String destroy() {
120         current = (Answer) getItems().getRowData();
121         selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
122         performDestroy();
123         recreatePagination();
124         recreateModel();
125         return "List";
126     }
127
128     public String destroyAndView() {
129         performDestroy();
130         recreateModel();
131         updateCurrentItem();
132         if (selectedItemIndex >= 0) {
133             return "View";
134         } else {
135             // all items were removed - go back to list
136             recreateModel();
137             return "List";
138         }
139     }
140
141     private void performDestroy() {
142         try {
143             getJpaController().destroy(current.getId());
144             JsfUtil.addSuccessMessage(ResourceBundle.getBundle("org/ufcspa/simdecs/bn/Bundle").getString("AnswerDeleted"));
145         } catch (Exception e) {
146             JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("org/ufcspa/simdecs/bn/Bundle").getString("PersistenceErrorOccured"));
147         }
148     }
149
150     private void updateCurrentItem() {
151         int count = getJpaController().getAnswerCount();
152         if (selectedItemIndex >= count) {
153             // selected index cannot be bigger than number of items:
154             selectedItemIndex = count - 1;
155             // go to previous page if last page disappeared:
156             if (pagination.getPageFirstItem() >= count) {
157                 pagination.previousPage();
158             }
159         }
160         if (selectedItemIndex >= 0) {
161             current = getJpaController().findAnswerEntities(1, selectedItemIndex).get(0);
162         }
163     }
164
165     public DataModel getPaginatedItems() {
166         if (items == null) {
167             items = getPagination().createPageDataModel();
168         }
169         return items;
170     }
171     
172     public DataModel getItems() {
173         if (items == null) {
174             items = new ListDataModel(getJpaController().findAnswerEntities());
175         }
176         return items;
177     }
178
179     public void recreateModel() {
180         items = null;
181     }
182
183     private void recreatePagination() {
184         pagination = null;
185     }
186
187     public String next() {
188         getPagination().nextPage();
189         recreateModel();
190         return "List";
191     }
192
193     public String previous() {
194         getPagination().previousPage();
195         recreateModel();
196         return "List";
197     }
198
199     public SelectItem[] getItemsAvailableSelectMany() {
200         return JsfUtil.getSelectItems(getJpaController().findAnswerEntities(), false);
201     }
202
203     public SelectItem[] getItemsAvailableSelectOne() {
204         return JsfUtil.getSelectItems(getJpaController().findAnswerEntities(), true);
205     }
206
207     @FacesConverter(forClass = Answer.class)
208     public static class AnswerControllerConverter implements Converter {
209
210         public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
211             if (value == null || value.length() == 0) {
212                 return null;
213             }
214             AnswerController controller = (AnswerController) facesContext.getApplication().getELResolver().
215                     getValue(facesContext.getELContext(), null, "answerController");
216             return controller.getJpaController().findAnswer(getKey(value));
217         }
218
219         java.lang.Long getKey(String value) {
220             java.lang.Long key;
221             key = Long.valueOf(value);
222             return key;
223         }
224
225         String getStringKey(java.lang.Long value) {
226             StringBuffer sb = new StringBuffer();
227             sb.append(value);
228             return sb.toString();
229         }
230
231         public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
232             if (object == null) {
233                 return null;
234             }
235             if (object instanceof Answer) {
236                 Answer o = (Answer) object;
237                 return getStringKey(o.getId());
238             } else {
239                 throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + AnswerController.class.getName());
240             }
241         }
242     }
243 }