src/main/java/ru/indvdum/mywork/vaadin/EditWorkDialog.java
author indvdum
Tue, 23 Aug 2011 14:48:38 +0300
changeset 11 e576975e68f7
parent 9 6a02cfcc7460
child 12 93ea5ae33f02
permissions -rw-r--r--
Solution of a problem with JPA exceptions.
indvdum@9
     1
package ru.indvdum.mywork.vaadin;
indvdum@9
     2
indvdum@9
     3
import static ru.indvdum.mywork.MyWork.EM;
indvdum@9
     4
indvdum@9
     5
import java.util.Calendar;
indvdum@9
     6
import java.util.List;
indvdum@9
     7
indvdum@9
     8
import javax.persistence.Query;
indvdum@9
     9
indvdum@9
    10
import ru.indvdum.mywork.openjpa.model.Day;
indvdum@9
    11
import ru.indvdum.mywork.openjpa.model.Task;
indvdum@9
    12
import ru.indvdum.mywork.openjpa.model.Work;
indvdum@9
    13
indvdum@9
    14
import com.vaadin.data.Property.ValueChangeEvent;
indvdum@9
    15
import com.vaadin.data.Property.ValueChangeListener;
indvdum@9
    16
import com.vaadin.ui.Alignment;
indvdum@9
    17
import com.vaadin.ui.Button;
indvdum@9
    18
import com.vaadin.ui.ComboBox;
indvdum@9
    19
import com.vaadin.ui.HorizontalLayout;
indvdum@9
    20
import com.vaadin.ui.Label;
indvdum@9
    21
import com.vaadin.ui.RichTextArea;
indvdum@9
    22
import com.vaadin.ui.TextField;
indvdum@9
    23
import com.vaadin.ui.VerticalLayout;
indvdum@9
    24
import com.vaadin.ui.Window;
indvdum@9
    25
import com.vaadin.ui.AbstractSelect.Filtering;
indvdum@9
    26
import com.vaadin.ui.Button.ClickEvent;
indvdum@9
    27
import com.vaadin.ui.Button.ClickListener;
indvdum@9
    28
indvdum@9
    29
public class EditWorkDialog extends Window implements ClickListener {
indvdum@9
    30
	
indvdum@9
    31
	private MyWorkApplication myApp = null;
indvdum@9
    32
	private EditState state = null;
indvdum@9
    33
	private Work work = null;
indvdum@9
    34
	private ComboBox workDay = null;
indvdum@9
    35
	private ComboBox workTask = null;
indvdum@9
    36
	private TextField workHours = null;
indvdum@9
    37
	private RichTextArea workResult = null;
indvdum@9
    38
indvdum@9
    39
	public EditWorkDialog(MyWorkApplication myApp, EditState state, Work work) throws Exception {
indvdum@9
    40
		super();
indvdum@9
    41
		this.myApp = myApp;
indvdum@9
    42
		this.state = state;
indvdum@9
    43
		switch(state){
indvdum@9
    44
		case CREATE:
indvdum@9
    45
			setCaption("Creating new work");
indvdum@9
    46
			if(work != null)
indvdum@9
    47
				throw new Exception("Illegal argument: work must be null in creating state.");
indvdum@9
    48
			work = new Work();
indvdum@9
    49
			work.setHours(0f);
indvdum@9
    50
			work.setResult("");
indvdum@9
    51
			this.work = work;
indvdum@9
    52
			break;
indvdum@9
    53
		case EDIT:
indvdum@9
    54
			setCaption("Editing work");
indvdum@9
    55
			if(work == null)
indvdum@9
    56
				throw new Exception("Illegal argument: work must be not null in editing state.");
indvdum@9
    57
			this.work = work;
indvdum@9
    58
			break;
indvdum@9
    59
		}
indvdum@9
    60
		init();
indvdum@9
    61
	}
indvdum@9
    62
	
indvdum@9
    63
	private void init(){
indvdum@9
    64
		setModal(true);
indvdum@9
    65
		setWidth("640px");
indvdum@9
    66
		setHeight("480px");
indvdum@9
    67
		VerticalLayout vl = new VerticalLayout();
indvdum@9
    68
		vl.setSizeFull();
indvdum@9
    69
		vl.setSpacing(true);
indvdum@9
    70
		vl.setMargin(true);
indvdum@9
    71
		setContent(vl);
indvdum@9
    72
		
indvdum@9
    73
		HorizontalLayout hlDay = new HorizontalLayout();
indvdum@9
    74
		hlDay.setWidth("100%");
indvdum@9
    75
		Label lblDay = new Label("Day:");
indvdum@9
    76
		lblDay.setWidth("100%");
indvdum@9
    77
		hlDay.addComponent(lblDay);
indvdum@9
    78
		hlDay.setExpandRatio(lblDay, 1f);
indvdum@9
    79
		workDay = new ComboBox();
indvdum@9
    80
		workDay.setWidth("100%");
indvdum@9
    81
		workDay.setImmediate(true);
indvdum@9
    82
		workDay.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
indvdum@9
    83
		updateDays("select d from " + Day.class.getName() + " d order by d.day");
indvdum@9
    84
		workDay.addListener(new ValueChangeListener(){
indvdum@9
    85
indvdum@9
    86
			@Override
indvdum@9
    87
			public void valueChange(ValueChangeEvent event) {
indvdum@9
    88
				Day day = (Day)event.getProperty().getValue();
indvdum@9
    89
				if(day == null)
indvdum@9
    90
					updateTasks("select t from " + Task.class.getName() + " t order by t.id desc");
indvdum@9
    91
				else
indvdum@9
    92
					updateTasks("select t from " + Task.class.getName() + " t where t.id not in (select w.task.id from " + Work.class.getName() + " w where w.day.id = " + day.getId() + ") order by t.id desc");
indvdum@9
    93
			}
indvdum@9
    94
			
indvdum@9
    95
		});
indvdum@9
    96
		hlDay.addComponent(workDay);
indvdum@9
    97
		hlDay.setExpandRatio(workDay, 5f);
indvdum@9
    98
		vl.addComponent(hlDay);
indvdum@9
    99
		
indvdum@9
   100
		HorizontalLayout hlTask = new HorizontalLayout();
indvdum@9
   101
		hlTask.setWidth("100%");
indvdum@9
   102
		Label lblStart = new Label("Task:");
indvdum@9
   103
		lblStart.setWidth("100%");
indvdum@9
   104
		hlTask.addComponent(lblStart);
indvdum@9
   105
		hlTask.setExpandRatio(lblStart, 1f);
indvdum@9
   106
		workTask = new ComboBox();
indvdum@9
   107
		workTask.setWidth("100%");
indvdum@9
   108
		workTask.setImmediate(true);
indvdum@9
   109
		workTask.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
indvdum@9
   110
		Day day = (Day)workDay.getValue();
indvdum@9
   111
		if(day == null)
indvdum@9
   112
			updateTasks("select t from " + Task.class.getName() + " t order by t.id desc");
indvdum@9
   113
		else
indvdum@9
   114
			updateTasks("select t from " + Task.class.getName() + " t where t.id not in (select w.task.id from " + Work.class.getName() + " w where w.day.id = " + day.getId() + ") order by t.id desc");
indvdum@9
   115
		workTask.addListener(new ValueChangeListener(){
indvdum@9
   116
indvdum@9
   117
			@Override
indvdum@9
   118
			public void valueChange(ValueChangeEvent event) {
indvdum@9
   119
				Task task = (Task)event.getProperty().getValue();
indvdum@9
   120
				if(task == null)
indvdum@9
   121
					updateDays("select d from " + Day.class.getName() + " d order by d.day");
indvdum@9
   122
				else
indvdum@9
   123
					updateDays("select d from " + Day.class.getName() + " d where d.id not in (select w.day.id from " + Work.class.getName() + " w where w.task.id = " + task.getId() + ") order by d.day");
indvdum@9
   124
			}
indvdum@9
   125
			
indvdum@9
   126
		});
indvdum@9
   127
		hlTask.addComponent(workTask);
indvdum@9
   128
		hlTask.setExpandRatio(workTask, 5f);
indvdum@9
   129
		vl.addComponent(hlTask);
indvdum@9
   130
		
indvdum@9
   131
		HorizontalLayout hlHours = new HorizontalLayout();
indvdum@9
   132
		hlHours.setWidth("100%");
indvdum@9
   133
		Label lblHours = new Label("Hours:");
indvdum@9
   134
		lblHours.setWidth("100%");
indvdum@9
   135
		hlHours.addComponent(lblHours);
indvdum@9
   136
		hlHours.setExpandRatio(lblHours, 1f);
indvdum@9
   137
		workHours = new TextField();
indvdum@9
   138
		workHours.setWidth("100%");
indvdum@9
   139
		workHours.setValue(work.getHours());
indvdum@9
   140
		workHours.setImmediate(true);
indvdum@9
   141
		hlHours.addComponent(workHours);
indvdum@9
   142
		hlHours.setExpandRatio(workHours, 5f);
indvdum@9
   143
		vl.addComponent(hlHours);
indvdum@9
   144
		
indvdum@9
   145
		workResult = new RichTextArea("Result");
indvdum@9
   146
		workResult.setValue(work.getResult());
indvdum@9
   147
		workResult.setSizeFull();
indvdum@9
   148
		vl.addComponent(workResult);
indvdum@9
   149
		vl.setExpandRatio(workResult, 5f);
indvdum@9
   150
		
indvdum@9
   151
		HorizontalLayout hlOk = new HorizontalLayout();
indvdum@9
   152
		hlOk.setWidth("100%");
indvdum@9
   153
		Button okButton = new Button();
indvdum@9
   154
		switch(state){
indvdum@9
   155
		case CREATE:
indvdum@9
   156
			okButton.setCaption("Create");
indvdum@9
   157
			break;
indvdum@9
   158
		case EDIT:
indvdum@9
   159
			okButton.setCaption("Save");
indvdum@9
   160
			break;
indvdum@9
   161
		}
indvdum@9
   162
		okButton.addListener((ClickListener)this);
indvdum@9
   163
		hlOk.addComponent(okButton);
indvdum@9
   164
		hlOk.setComponentAlignment(okButton, Alignment.MIDDLE_RIGHT);
indvdum@9
   165
		vl.addComponent(hlOk);
indvdum@9
   166
	}
indvdum@9
   167
	
indvdum@9
   168
	private void updateDays(String jpql){
indvdum@9
   169
		if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null)
indvdum@9
   170
			return;
indvdum@9
   171
		workDay.removeAllItems();
indvdum@9
   172
		Query query = EM.createQuery(jpql);
indvdum@9
   173
		List list = query.getResultList();
indvdum@9
   174
		for(Day day: (List<Day>)list){
indvdum@9
   175
			workDay.addItem(day);
indvdum@9
   176
			Calendar currCal = Calendar.getInstance();
indvdum@9
   177
			currCal.set(Calendar.HOUR_OF_DAY, 0);
indvdum@9
   178
			currCal.set(Calendar.MINUTE, 0);
indvdum@9
   179
			currCal.set(Calendar.SECOND, 0);
indvdum@9
   180
			currCal.set(Calendar.MILLISECOND, 0);
indvdum@9
   181
			if(day.getDay().equals(currCal.getTime()))
indvdum@9
   182
				workDay.select(day);
indvdum@9
   183
		}
indvdum@9
   184
	}
indvdum@9
   185
	
indvdum@9
   186
	private void updateTasks(String jpql){
indvdum@9
   187
		if(workTask != null && workTask.getValue() != null && workDay != null && workDay.getValue() != null)
indvdum@9
   188
			return;
indvdum@9
   189
		workTask.removeAllItems();
indvdum@9
   190
		Query query = EM.createQuery(jpql);
indvdum@9
   191
		List list = query.getResultList();
indvdum@9
   192
		for(Task task: (List<Task>)list)
indvdum@9
   193
			workTask.addItem(task);
indvdum@9
   194
	}
indvdum@9
   195
indvdum@9
   196
	@Override
indvdum@9
   197
	public void buttonClick(ClickEvent event) {
indvdum@9
   198
		Object dayObj = workDay.getValue();
indvdum@9
   199
		Object taskObj = workTask.getValue();
indvdum@9
   200
		Object hoursObj = workHours.getValue();
indvdum@9
   201
		String result = workResult.getValue().toString();
indvdum@9
   202
		if (
indvdum@9
   203
				!(dayObj instanceof Day) 
indvdum@9
   204
				|| !(taskObj instanceof Task) 
indvdum@9
   205
				|| !(hoursObj.toString().matches("^[0-9]+[\\.]{0,1}[0-9]*"))
indvdum@9
   206
				) {
indvdum@9
   207
			getWindow().showNotification("Invalid information entered");
indvdum@9
   208
		} else {
indvdum@9
   209
			Day day = (Day)dayObj;
indvdum@9
   210
			Task task = (Task)taskObj;
indvdum@9
   211
			Float hours = Float.parseFloat(hoursObj.toString());
indvdum@9
   212
			work.setDay(day);
indvdum@9
   213
			work.setTask(task);
indvdum@9
   214
			work.setHours(hours);
indvdum@9
   215
			work.setResult(result);
indvdum@9
   216
			try{
indvdum@9
   217
				EM.getTransaction().begin();
indvdum@9
   218
				EM.persist(work);
indvdum@9
   219
				EM.getTransaction().commit();
indvdum@11
   220
				EM.clear();
indvdum@9
   221
			} finally {
indvdum@9
   222
				if(EM.getTransaction().isActive())
indvdum@9
   223
					EM.getTransaction().rollback();
indvdum@9
   224
			}
indvdum@9
   225
			getParent().removeWindow(this);
indvdum@9
   226
			myApp.getWorkTable().requestRepaint();
indvdum@9
   227
		}
indvdum@9
   228
	}
indvdum@9
   229
indvdum@9
   230
}