1 package org.gnomekr.potron.service;
2
3 import java.io.IOException;
4 import java.io.Reader;
5 import java.util.ArrayList;
6 import java.util.Date;
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10
11 import org.apache.commons.lang.NullArgumentException;
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.gnomekr.potron.data.Entry;
15 import org.gnomekr.potron.data.Header;
16 import org.gnomekr.potron.data.LanguageTeam;
17 import org.gnomekr.potron.data.Project;
18 import org.gnomekr.potron.data.Template;
19 import org.gnomekr.potron.data.TranslatedEntry;
20 import org.gnomekr.potron.data.Translation;
21 import org.gnomekr.potron.parser.IPOParserCallback;
22 import org.gnomekr.potron.parser.POParser;
23 import org.gnomekr.potron.parser.ParseException;
24 import org.gnomekr.potron.parser.ParserEntry;
25 import org.hibernate.Session;
26 import org.springframework.orm.hibernate3.SessionFactoryUtils;
27 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
28
29 /***
30 * ProjectManager.java
31 * @author Xavier Cho
32 * @version $Revision 1.1 $ $Date: 2005/09/11 05:49:44 $
33 */
34 public class ProjectManager extends HibernateDaoSupport implements
35 IProjectManager {
36
37 private static Log log = LogFactory.getLog(ProjectManager.class);
38
39 /***
40 * @see org.gnomekr.potron.service.IProjectManager#createProject(org.gnomekr.potron.data.Project)
41 */
42 public void createProject(Project project) throws ProjectExistsException {
43 if (project == null) {
44 throw new NullArgumentException("project");
45 }
46
47 String id = project.getId();
48
49 if (log.isDebugEnabled()) {
50 log.debug("Creating new project : " + id);
51 }
52
53 Session session = SessionFactoryUtils.getSession(
54 getSessionFactory(),
55 false);
56
57 if (session.get(Project.class, id) != null) {
58 String msg = "The specified project name id exists : " + id;
59 throw new ProjectExistsException(msg);
60 }
61
62 project.setRegisteredDate(new Date(System.currentTimeMillis()));
63
64 session.save(project);
65
66 if (log.isInfoEnabled()) {
67 log.info("Project has been created successfully : ");
68 log.debug(project);
69 }
70 }
71
72 /***
73 * @see org.gnomekr.potron.service.IProjectManager#getProject(java.lang.String)
74 */
75 public Project getProject(String id) {
76 if (id == null) {
77 throw new NullArgumentException("id");
78 }
79
80 if (log.isDebugEnabled()) {
81 log.debug("Retrieving project info : " + id);
82 }
83
84 Session session = SessionFactoryUtils.getSession(
85 getSessionFactory(),
86 false);
87
88 return (Project) session.get(Project.class, id);
89 }
90
91 /***
92 * @see org.gnomekr.potron.service.IProjectManager#getProjects()
93 */
94 @SuppressWarnings("unchecked")
95 public List<Project> getProjects() {
96 if (log.isDebugEnabled()) {
97 log.debug("Retrieving all projects.");
98 }
99
100 Session session = SessionFactoryUtils.getSession(
101 getSessionFactory(),
102 false);
103
104 return session.createCriteria(Project.class).setCacheable(true).list();
105 }
106
107 /***
108 * @see org.gnomekr.potron.service.IProjectManager#updateProject(org.gnomekr.potron.data.Project)
109 */
110 public void updateProject(Project project) {
111 if (project == null) {
112 throw new NullArgumentException("project");
113 }
114
115 if (log.isDebugEnabled()) {
116 log.debug("Updating project info : " + project.getName());
117 }
118
119 Session session = SessionFactoryUtils.getSession(
120 getSessionFactory(),
121 false);
122
123 session.merge(project);
124
125 if (log.isInfoEnabled()) {
126 log.info("Project has been updated successfully : ");
127 log.debug(project);
128 }
129 }
130
131 /***
132 * @see org.gnomekr.potron.service.IProjectManager#deleteProject(java.lang.String)
133 */
134 public void deleteProject(String id) {
135 if (id == null) {
136 throw new NullArgumentException("id");
137 }
138
139 if (log.isDebugEnabled()) {
140 log.debug("Deleting project info : " + id);
141 }
142
143 Session session = SessionFactoryUtils.getSession(
144 getSessionFactory(),
145 false);
146
147 Project project = getProject(id);
148
149 session.delete(project);
150
151 if (log.isInfoEnabled()) {
152 log.info("Project has been deleted successfully : ");
153 log.info(" - project : " + project);
154 }
155 }
156
157 /***
158 * @see org.gnomekr.potron.service.IProjectManager#addLanguageTeam(org.gnomekr.potron.data.LanguageTeam)
159 */
160 public long addLanguageTeam(LanguageTeam team) {
161 if (team == null) {
162 throw new NullArgumentException("team");
163 }
164 if (log.isDebugEnabled()) {
165 log.debug("Adding new language team.");
166 }
167
168 Session session = SessionFactoryUtils.getSession(
169 getSessionFactory(),
170 false);
171
172 team.setRegisteredDate(new Date(System.currentTimeMillis()));
173
174 long id = (Long) session.save(team);
175
176 if (log.isInfoEnabled()) {
177 log.info("Language team has been registered successfully : ");
178 log.debug(" - team : " + team);
179 }
180
181 return id;
182 }
183
184 /***
185 * @see org.gnomekr.potron.service.IProjectManager#getLanguageTeam(long)
186 */
187 public LanguageTeam getLanguageTeam(long id) {
188 if (log.isDebugEnabled()) {
189 log.debug("Retrieving language team info : " + id);
190 }
191
192 Session session = SessionFactoryUtils.getSession(
193 getSessionFactory(),
194 false);
195
196 return (LanguageTeam) session.get(LanguageTeam.class, id);
197 }
198
199 /***
200 * @see org.gnomekr.potron.service.IProjectManager#getLanguageTeams()
201 */
202 @SuppressWarnings("unchecked")
203 public List<LanguageTeam> getLanguageTeams() {
204 if (log.isDebugEnabled()) {
205 log.debug("Retrieving all language teams.");
206 }
207
208 Session session = SessionFactoryUtils.getSession(
209 getSessionFactory(),
210 false);
211
212 return session.createCriteria(LanguageTeam.class).setCacheable(true)
213 .list();
214 }
215
216 /***
217 * @see org.gnomekr.potron.service.IProjectManager#updateLanguageTeam(org.gnomekr.potron.data.LanguageTeam)
218 */
219 public void updateLanguageTeam(LanguageTeam team) {
220 if (team == null) {
221 throw new NullArgumentException("team");
222 }
223
224 if (log.isDebugEnabled()) {
225 log.debug("Updating language team info : " + team.getId());
226 }
227
228 Session session = SessionFactoryUtils.getSession(
229 getSessionFactory(),
230 false);
231
232 session.merge(team);
233
234 if (log.isInfoEnabled()) {
235 log.info("Language team has been updated successfully : ");
236 log.debug(team);
237 }
238 }
239
240 /***
241 * @see org.gnomekr.potron.service.IProjectManager#removeLanguageTeam(long)
242 */
243 public void removeLanguageTeam(long id) {
244 if (log.isDebugEnabled()) {
245 log.debug("Deleting language team : " + id);
246 }
247
248 Session session = SessionFactoryUtils.getSession(
249 getSessionFactory(),
250 false);
251
252 LanguageTeam team = getLanguageTeam(id);
253
254 session.delete(team);
255
256 if (log.isInfoEnabled()) {
257 log.info("Language team has been deleted successfully : ");
258 log.info(" - team : " + team);
259 }
260 }
261
262 /***
263 * @throws IOException
264 * @throws ParseException
265 * @see org.gnomekr.potron.service.IProjectManager#addTemplate(java.lang.String, java.lang.String, java.lang.String, java.io.Reader)
266 */
267 public long addTemplate(
268 String projectId,
269 String name,
270 String description,
271 Reader content) throws ParseException, IOException {
272 if (projectId == null) {
273 throw new NullArgumentException("projectId");
274 }
275
276 if (name == null) {
277 throw new NullArgumentException("name");
278 }
279
280 if (content == null) {
281 throw new NullArgumentException("content");
282 }
283
284 if (log.isDebugEnabled()) {
285 log.debug("Adding new template to the project :");
286 log.debug(" - project id : " + projectId);
287 log.debug(" - name : " + name);
288 }
289
290 final Session session = SessionFactoryUtils.getSession(
291 getSessionFactory(),
292 false);
293
294 Project project = getProject(projectId);
295
296 final Template template = new Template();
297 template.setName(name);
298 template.setDescription(description);
299 template.setRegisteredDate(new Date(System.currentTimeMillis()));
300 template.setProject(project);
301
302 final List<Header> headers = new ArrayList<Header>();
303 final List<Entry> entries = new ArrayList<Entry>();
304
305 IPOParserCallback callback = new IPOParserCallback() {
306
307 public void startDocument() {
308 }
309
310 public void onComment(String comment) {
311 template.setComment(comment);
312 }
313
314 public void onHeader(String key, String value) {
315 headers.add(new Header(key, value));
316 }
317
318 public void onHeaderPluralForm(int nplural, String expression) {
319 }
320
321 public void onEntry(ParserEntry entry) {
322 entries.add(new Entry(entry, template));
323 }
324
325 public void endDocument() {
326 }
327 };
328
329 POParser parser = new POParser(callback);
330 parser.parse(content);
331
332 template.setHeaders(headers);
333 template.setEntries(entries);
334
335 long id = (Long) session.save(template);
336
337 if (log.isInfoEnabled()) {
338 log.info("Project template has been registered successfully : ");
339 log.debug(" - template : " + template);
340 }
341
342 return id;
343 }
344
345 /***
346 * @see org.gnomekr.potron.service.IProjectManager#getTemplate(long)
347 */
348 public Template getTemplate(long id) {
349 if (log.isDebugEnabled()) {
350 log.debug("Retrieving translation template : " + id);
351 }
352
353 Session session = SessionFactoryUtils.getSession(
354 getSessionFactory(),
355 false);
356
357 return (Template) session.get(Template.class, id);
358 }
359
360 /***
361 * @see org.gnomekr.potron.service.IProjectManager#updateTemplate(long, java.lang.String, java.lang.String, java.lang.String)
362 */
363 public void updateTemplate(
364 long id,
365 String name,
366 String description,
367 String comment) {
368 if (name == null) {
369 throw new NullArgumentException("name");
370 }
371
372 if (log.isDebugEnabled()) {
373 log.debug("Updating translation template : " + name);
374 }
375
376 Session session = SessionFactoryUtils.getSession(
377 getSessionFactory(),
378 false);
379
380 Template template = getTemplate(id);
381
382 template.setName(name);
383 template.setComment(comment);
384 template.setDescription(description);
385
386 session.update(template);
387
388 if (log.isInfoEnabled()) {
389 log.info("Template has been updated successfully : ");
390 log.debug(template);
391 }
392 }
393
394 /***
395 * @see org.gnomekr.potron.service.IProjectManager#updateTemplate(long, java.lang.String, java.lang.String, java.io.Reader)
396 */
397 public void updateTemplate(
398 long id,
399 String name,
400 String description,
401 Reader content) throws ParseException, IOException {
402 if (name == null) {
403 throw new NullArgumentException("template");
404 }
405
406 if (content == null) {
407 throw new NullArgumentException("content");
408 }
409
410 if (log.isDebugEnabled()) {
411 log.debug("Updating translation template : " + name);
412 }
413
414 Session session = SessionFactoryUtils.getSession(
415 getSessionFactory(),
416 false);
417
418 final Template template = getTemplate(id);
419
420 final Map<String, Entry> oldEntries = new HashMap<String, Entry>();
421
422 for (Entry entry : template.getEntries()) {
423 if (entry != null) {
424 oldEntries.put(entry.getKey(), entry);
425 }
426 }
427
428 final List<Header> headers = new ArrayList<Header>();
429 final List<Entry> entries = new ArrayList<Entry>();
430 final List<Entry> newEntries = new ArrayList<Entry>();
431
432 IPOParserCallback callback = new IPOParserCallback() {
433
434 public void startDocument() {
435 }
436
437 public void onComment(String comment) {
438 template.setComment(comment);
439 }
440
441 public void onHeader(String key, String value) {
442 headers.add(new Header(key, value));
443 }
444
445 public void onHeaderPluralForm(int nplural, String expression) {
446 }
447
448 public void onEntry(ParserEntry entry) {
449 if (oldEntries.containsKey(entry.getMsgId())) {
450 entries.add(oldEntries.get(entry.getMsgId()));
451 } else {
452 Entry e = new Entry(entry, template);
453 entries.add(e);
454 newEntries.add(e);
455 }
456 }
457
458 public void endDocument() {
459 }
460 };
461
462 POParser parser = new POParser(callback);
463 parser.parse(content);
464
465 template.setName(name);
466 template.setDescription(description);
467
468 template.getHeaders().clear();
469 template.getHeaders().addAll(headers);
470
471 template.getEntries().clear();
472 template.getEntries().addAll(entries);
473
474 session.update(template);
475
476 for (Translation translation : template.getTranslations()) {
477 for (Entry entry : newEntries) {
478 TranslatedEntry tentry = new TranslatedEntry(entry, translation);
479 translation.getEntries().add(tentry);
480 }
481
482 session.update(translation);
483 }
484
485 if (log.isInfoEnabled()) {
486 log.info("Template has been updated successfully : ");
487 log.debug(template);
488 }
489 }
490
491 /***
492 * @see org.gnomekr.potron.service.IProjectManager#removeTemplate(long)
493 */
494 public void removeTemplate(long id) {
495 if (log.isDebugEnabled()) {
496 log.debug("Deleting translation template : " + id);
497 }
498
499 Session session = SessionFactoryUtils.getSession(
500 getSessionFactory(),
501 false);
502
503 Template template = getTemplate(id);
504
505 session.delete(template);
506
507 if (log.isInfoEnabled()) {
508 log.info("Template has been deleted successfully : ");
509 log.info(" - template : " + template);
510 }
511 }
512 }