1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.exoplatform.calendar.storage.jcr;
21
22 import java.util.LinkedList;
23 import java.util.List;
24
25 import javax.jcr.NodeIterator;
26 import javax.jcr.Session;
27 import javax.jcr.query.Query;
28 import javax.jcr.query.QueryManager;
29 import javax.jcr.query.QueryResult;
30
31 import org.exoplatform.calendar.model.Event;
32 import org.exoplatform.calendar.model.query.EventQuery;
33 import org.exoplatform.calendar.service.Calendar;
34 import org.exoplatform.calendar.service.CalendarEvent;
35 import org.exoplatform.calendar.service.CalendarService;
36 import org.exoplatform.calendar.service.Utils;
37 import org.exoplatform.calendar.service.impl.CalendarServiceImpl;
38 import org.exoplatform.calendar.service.impl.JCRDataStorage;
39 import org.exoplatform.calendar.storage.EventDAO;
40 import org.exoplatform.calendar.storage.Storage;
41 import org.exoplatform.commons.utils.ListAccess;
42 import org.exoplatform.services.jcr.ext.common.SessionProvider;
43 import org.exoplatform.services.log.ExoLogger;
44 import org.exoplatform.services.log.Log;
45
46
47
48
49 public class JCREventDAOImpl implements EventDAO {
50
51 private final Storage context;
52 private final JCRDataStorage dataStorage;
53
54 private static final Log LOG = ExoLogger.getExoLogger(JCRCalendarDAOImpl.class);
55
56 public JCREventDAOImpl(CalendarService calService, JCRStorage storage) {
57 this.context = storage;
58 this.dataStorage = ((CalendarServiceImpl) calService).getDataStorage();
59 }
60
61 @Override
62 public Event getById(String id) {
63 try {
64 return dataStorage.getEventById(id);
65 } catch (Exception ex) {
66 LOG.error(ex);
67 }
68 return null;
69 }
70
71 @Override
72 public Event save(Event event) {
73 return persist(event, true);
74 }
75
76 public Event update(Event event) {
77 return persist(event, false);
78 }
79
80 private Event persist(Event event, boolean isNew) {
81 try {
82 String calendarId = event.getCalendarId();
83 org.exoplatform.calendar.model.Calendar cal = context.getCalendarDAO().getById(calendarId);
84 if (cal == null) {
85 return null;
86 }
87 int calType = Calendar.TYPE_ALL;
88 if (cal instanceof Calendar) {
89 calType = ((Calendar)cal).getCalType();
90 }
91 CalendarEvent calEvent = CalendarEvent.build(event);
92 if (calType == Calendar.Type.PERSONAL.type()) {
93 dataStorage.saveUserEvent(cal.getCalendarOwner(), cal.getId(), calEvent, isNew);
94 } else if (calType == Calendar.Type.GROUP.type()) {
95 dataStorage.savePublicEvent(cal.getId(), calEvent, isNew);
96 } else {
97 return null;
98 }
99
100 return event;
101 } catch (Exception ex) {
102 LOG.error(ex);
103 }
104 return null;
105 }
106
107 @Override
108 public Event remove(String id) {
109 try {
110 Event event = this.getById(id);
111 if (event == null) {
112 return null;
113 }
114 org.exoplatform.calendar.model.Calendar cal = context.getCalendarDAO().getById(event.getCalendarId());
115 int type = Calendar.TYPE_ALL;
116 if (cal instanceof Calendar) {
117 type = ((Calendar)cal).getCalType();
118 }
119
120 if (type == Calendar.Type.PERSONAL.type()) {
121 dataStorage.removeUserEvent(cal.getCalendarOwner(), cal.getId(), id);
122 } else if (type == Calendar.Type.GROUP.type()) {
123 dataStorage.removePublicEvent(cal.getId(), id);
124 } else {
125 return null;
126 }
127
128 return event;
129
130 } catch (Exception ex) {
131 LOG.error(ex);
132 }
133 return null;
134 }
135
136 @Override
137 public Event newInstance() {
138 Event event = new Event();
139 return event;
140 }
141
142 @Override
143 public ListAccess<Event> findEventsByQuery(EventQuery query) {
144 final List<CalendarEvent> events = new LinkedList<CalendarEvent>();
145 org.exoplatform.calendar.service.EventQuery eventQuery = buildEvenQuery(query);
146
147 int type = Calendar.Type.UNDEFINED.type();
148 if (query instanceof JCREventQuery) {
149 type = ((JCREventQuery)query).getCalType();
150 }
151 try {
152 if (Calendar.Type.PERSONAL.type() == type) {
153 events.addAll(dataStorage.getUserEvents(query.getOwner(), eventQuery));
154 } else if (Calendar.Type.GROUP.type() == type) {
155 events.addAll(dataStorage.getPublicEvents(eventQuery));
156 } else if (Calendar.Type.SHARED.type() == type) {
157 events.addAll(dataStorage.getSharedEvents(query.getOwner(), eventQuery));
158 } else {
159 SessionProvider provider = dataStorage.createSystemProvider();
160 Session session = dataStorage.getSession(provider);
161 QueryManager qm = session.getWorkspace().getQueryManager();
162 Query jcrQuery = qm.createQuery(eventQuery.getQueryStatement(), eventQuery.getQueryType());
163 QueryResult result = jcrQuery.execute();
164 NodeIterator it = result.getNodes();
165 while (it.hasNext()) {
166 CalendarEvent evt = dataStorage.getEventById(it.nextNode().getProperty(Utils.EXO_ID).getString());
167 events.add(evt);
168 }
169 }
170 } catch (Exception ex) {
171 LOG.error("Can't query for event", ex);
172 }
173
174
175 return new ListAccess<Event>() {
176 @Override
177 public int getSize() throws Exception {
178 return events.size();
179 }
180
181 @Override
182 public Event[] load(int offset, int limit) throws Exception, IllegalArgumentException {
183 return Utils.subArray(events.toArray(new Event[getSize()]), offset, limit);
184 }
185 };
186 }
187
188 private org.exoplatform.calendar.service.EventQuery buildEvenQuery(EventQuery query) {
189 org.exoplatform.calendar.service.EventQuery eventQuery = new org.exoplatform.calendar.service.EventQuery();
190 eventQuery.setCalendarId(query.getCalendarIds());
191 eventQuery.setCategoryId(query.getCategoryIds());
192 eventQuery.setEventType(query.getEventType());
193 eventQuery.setExcludeRepeatEvent(query.getExcludeRepeatEvent());
194 eventQuery.setFilterCalendarIds(query.getFilterCalendarIds());
195 if (query.getFromDate() != null) {
196 java.util.Calendar from = java.util.Calendar.getInstance();
197 from.setTimeInMillis(query.getFromDate());
198 eventQuery.setFromDate(from);
199 }
200 eventQuery.setOrderBy(query.getOrderBy());
201 eventQuery.setOrderType(query.getOrderType());
202 eventQuery.setParticipants(query.getParticipants());
203 eventQuery.setPriority(query.getPriority());
204 eventQuery.setQueryType(Query.XPATH);
205 eventQuery.setState(query.getState());
206 eventQuery.setText(query.getText());
207 if (query.getToDate() != null) {
208 java.util.Calendar to = java.util.Calendar.getInstance();
209 to.setTimeInMillis(query.getToDate());
210 eventQuery.setToDate(to);
211 }
212 return eventQuery;
213 }
214 }