Merge lp:~slub.team/goobi-production/bug-1034373 into lp:goobi-production/1.8

Proposed by Ralf Claussnitzer
Status: Merged
Approved by: Ralf Claussnitzer
Approved revision: 109
Merged at revision: 103
Proposed branch: lp:~slub.team/goobi-production/bug-1034373
Merge into: lp:goobi-production/1.8
Diff against target: 286 lines (+176/-56)
4 files modified
config/messages_de.properties (+1/-0)
config/messages_en.properties (+1/-0)
src/de/sub/goobi/metadaten/Metadaten.java (+57/-56)
test/src/de/sub/goobi/metadaten/MetadatenTest.java (+117/-0)
To merge this branch: bzr merge lp:~slub.team/goobi-production/bug-1034373
Reviewer Review Type Date Requested Status
Henning Gerhardt Approve
Review via email: mp+123036@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Henning Gerhardt (henning-gerhardt) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'config/messages_de.properties'
2--- config/messages_de.properties 2012-07-17 14:05:47 +0000
3+++ config/messages_de.properties 2012-09-06 09:19:18 +0000
4@@ -418,6 +418,7 @@
5 metadatenBildAnzeigen=Bild anzeigen
6 metadatenBildAusblenden=Bild ausblenden
7 metadatenDennochBearbeiten=Metadaten dennoch bearbeiten
8+metadatenEditorThreadLock=Ein anderer Vorgang wurde im Hintergrund geƶffnet. Bitte versuchen Sie es in einigen Sekunden erneut.
9 metadatenFuerDMSExportieren=Metadaten f\u00FCr DMS exportieren
10 metadatenImportieren=Metadaten importieren
11 metadatenKopieren=Metadaten kopieren
12
13=== modified file 'config/messages_en.properties'
14--- config/messages_en.properties 2012-08-02 14:15:19 +0000
15+++ config/messages_en.properties 2012-09-06 09:19:18 +0000
16@@ -418,6 +418,7 @@
17 metadatenBildAnzeigen=Show image
18 metadatenBildAusblenden=Hide image
19 metadatenDennochBearbeiten=Edit metadata anyway
20+metadatenEditorThreadLock=Another file gets processed in the background. Please try again after some seconds.
21 metadatenFuerDMSExportieren=Export metadata for DMS
22 metadatenImportieren=Import metadata
23 metadatenKopieren=Copy metadata
24
25=== modified file 'src/de/sub/goobi/metadaten/Metadaten.java'
26--- src/de/sub/goobi/metadaten/Metadaten.java 2012-07-03 14:01:09 +0000
27+++ src/de/sub/goobi/metadaten/Metadaten.java 2012-09-06 09:19:18 +0000
28@@ -35,6 +35,7 @@
29 import java.util.LinkedList;
30 import java.util.List;
31 import java.util.StringTokenizer;
32+import java.util.concurrent.locks.ReentrantLock;
33
34 import javax.faces.context.FacesContext;
35 import javax.faces.model.SelectItem;
36@@ -170,6 +171,8 @@
37 private String pagesEnd="";
38 private HashMap<String, Boolean> treeProperties;
39
40+ ReentrantLock xmlReadingLock = new ReentrantLock();
41+
42 /**
43 * Konstruktor ================================================================
44 */
45@@ -508,65 +511,63 @@
46 * ## ##################################################### ####################################################
47 */
48
49- /**
50- * Metadaten Einlesen
51- *
52- */
53+
54 public String XMLlesen() {
55-
56- /*
57- * re-reading the ruleset.xml file
58- */
59- ConfigDispayRules.getInstance().refresh();
60-
61- Modes.setBindState(BindState.edit);
62- try {
63- myProzess = new ProzessDAO().get(new Integer(Helper.getRequestParameter("ProzesseID")));
64- } catch (NumberFormatException e1) {
65- Helper.setFehlerMeldung("error while loading process data" + e1.getMessage());
66- return Helper.getRequestParameter("zurueck");
67- } catch (DAOException e1) {
68- Helper.setFehlerMeldung("error while loading process data" + e1.getMessage());
69- return Helper.getRequestParameter("zurueck");
70- }
71- myBenutzerID = Helper.getRequestParameter("BenutzerID");
72- alleSeitenAuswahl_ersteSeite = "";
73- alleSeitenAuswahl_letzteSeite = "";
74- zurueck = Helper.getRequestParameter("zurueck");
75- nurLesenModus = Helper.getRequestParameter("nurLesen").equals("true") ? true : false;
76- neuesElementWohin = "1";
77- tree3 = null;
78- try {
79- XMLlesenStart();
80- } catch (SwapException e) {
81- Helper.setFehlerMeldung(e);
82- return Helper.getRequestParameter("zurueck");
83- } catch (ReadException e) {
84- Helper.setFehlerMeldung("error while loading metadata" + e.getMessage());
85- return Helper.getRequestParameter("zurueck");
86- } catch (PreferencesException e) {
87- Helper.setFehlerMeldung("error while loading metadata" + e.getMessage());
88- return Helper.getRequestParameter("zurueck");
89- } catch (WriteException e) {
90- Helper.setFehlerMeldung("error while loading metadata" + e.getMessage());
91- return Helper.getRequestParameter("zurueck");
92- } catch (IOException e) {
93- Helper.setFehlerMeldung("error while loading metadata" + e.getMessage());
94- return Helper.getRequestParameter("zurueck");
95- } catch (InterruptedException e) {
96- Helper.setFehlerMeldung("error while loading metadata" + e.getMessage());
97- return Helper.getRequestParameter("zurueck");
98- } catch (DAOException e) {
99- Helper.setFehlerMeldung("error while loading metadata" + e.getMessage());
100- return Helper.getRequestParameter("zurueck");
101- }
102-
103- TreeExpand();
104- sperrung.setLocked(myProzess.getId().intValue(), myBenutzerID);
105- return "Metadaten";
106+ String result = "";
107+
108+ if (xmlReadingLock.tryLock()) {
109+ try {
110+ result = readXmlAndBuildTree();
111+ } catch (RuntimeException rte) {
112+ throw rte;
113+ } finally {
114+ xmlReadingLock.unlock();
115+ }
116+ } else {
117+ Helper.setFehlerMeldung("metadatenEditorThreadLock");
118+ }
119+
120+ return result;
121 }
122
123- /**
124+
125+ private String readXmlAndBuildTree() {
126+
127+ // refresh ruleset in case it has changed
128+ ConfigDispayRules.getInstance().refresh();
129+
130+ Modes.setBindState(BindState.edit);
131+
132+ zurueck = Helper.getRequestParameter("zurueck");
133+
134+ try {
135+ myProzess = new ProzessDAO().get(new Integer(Helper.getRequestParameter("ProzesseID")));
136+ myBenutzerID = Helper.getRequestParameter("BenutzerID");
137+ nurLesenModus = Helper.getRequestParameter("nurLesen").equals("true");
138+ } catch (Exception e) {
139+ Helper.setFehlerMeldung("error while loading process data", e.getMessage());
140+ return zurueck;
141+ }
142+
143+ alleSeitenAuswahl_ersteSeite = "";
144+ alleSeitenAuswahl_letzteSeite = "";
145+ neuesElementWohin = "1";
146+ tree3 = null;
147+
148+ try {
149+ XMLlesenStart();
150+ } catch (Exception e) {
151+ Helper.setFehlerMeldung("error while loading metadata", e.getMessage());
152+ return zurueck;
153+ }
154+
155+ TreeExpand();
156+
157+ sperrung.setLocked(myProzess.getId(), myBenutzerID);
158+ return "Metadaten";
159+ }
160+
161+ /**
162 * Metadaten Einlesen
163 *
164 * @throws ReadException
165
166=== added file 'test/src/de/sub/goobi/metadaten/MetadatenTest.java'
167--- test/src/de/sub/goobi/metadaten/MetadatenTest.java 1970-01-01 00:00:00 +0000
168+++ test/src/de/sub/goobi/metadaten/MetadatenTest.java 2012-09-06 09:19:18 +0000
169@@ -0,0 +1,117 @@
170+/*
171+ * This file is part of the Goobi Application - a Workflow tool for the support of
172+ * mass digitization.
173+ *
174+ * Visit the websites for more information.
175+ * - http://gdz.sub.uni-goettingen.de
176+ * - http://www.goobi.org
177+ * - http://launchpad.net/goobi-production
178+ *
179+ * This program is free software; you can redistribute it and/or modify it under
180+ * the terms of the GNU General Public License as published by the Free Software
181+ * Foundation; either version 2 of the License, or (at your option) any later
182+ * version.
183+ *
184+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY
185+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
186+ * PARTICULAR PURPOSE. See the GNU General Public License for more details. You
187+ * should have received a copy of the GNU General Public License along with this
188+ * program; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
189+ * Suite 330, Boston, MA 02111-1307 USA
190+ */
191+
192+package de.sub.goobi.metadaten;
193+
194+import de.sub.goobi.helper.Messages;
195+import org.apache.log4j.BasicConfigurator;
196+
197+import org.goobi.log4j.TestAppender;
198+
199+import org.junit.Before;
200+import org.junit.Test;
201+
202+import static org.junit.Assert.assertFalse;
203+import static org.junit.Assert.assertTrue;
204+import static org.junit.Assert.assertEquals;
205+
206+public class MetadatenTest {
207+
208+ private TestAppender testAppender;
209+
210+ @Before
211+ public void setUpTestAppender() {
212+ testAppender = new TestAppender();
213+ BasicConfigurator.configure(testAppender);
214+ }
215+
216+ @Test(expected = NullPointerException.class)
217+ public void throwsNullPointerExceptionWhenCalledWithoutInitializedHelper() {
218+ Metadaten md = new Metadaten();
219+ md.XMLlesen();
220+ }
221+
222+ @Test
223+ public void xmlReadingLockIsNotAquiredAfterCreation() {
224+ Metadaten md = new Metadaten();
225+ assertFalse("XML Reading Lock is already aquired but shouldn't be.",
226+ md.xmlReadingLock.isLocked());
227+ }
228+
229+ @Test
230+ public void returnsEmptyStringIfXmlReadingLockIsAlreadyAquiredByOtherThread()
231+ throws InterruptedException {
232+ final Metadaten md = new Metadaten();
233+ final MutableString result = new MutableString();
234+ Thread t = new Thread() {
235+ public void run() {
236+ result.set(md.XMLlesen());
237+ }
238+ };
239+
240+ md.xmlReadingLock.lock();
241+ t.start();
242+ t.join();
243+
244+ assertEquals("Should return empty string is XML Reading Lock is aquired.", result.get(), "");
245+ }
246+
247+ @Test
248+ public void logsErrorIfXmlReadingLockIsAlreadyAquiredByOtherThread()
249+ throws InterruptedException {
250+ final Metadaten md = new Metadaten();
251+ Thread t = new Thread() {
252+ public void run() {
253+ md.XMLlesen();
254+ }
255+ };
256+
257+ md.xmlReadingLock.lock();
258+ t.start();
259+ t.join();
260+
261+ assertLogMessageContains(Messages.getString("metadatenEditorThreadLock"));
262+ }
263+
264+ @Test
265+ public void freesXmlReadingLockIfExceptionHappens()
266+ throws InterruptedException {
267+ final Metadaten md = new Metadaten();
268+ try {
269+ md.XMLlesen();
270+ } catch (NullPointerException npe) {
271+ assertFalse("Should free XML Reading Lock.", md.xmlReadingLock.isLocked());
272+ }
273+ }
274+
275+ private class MutableString {
276+ private String s;
277+ public void set(String val) { s = val; }
278+ public String get() { return s; }
279+ }
280+
281+ private void assertLogMessageContains(String message) {
282+ String lastMessage = (String) testAppender.getLastEvent().getMessage();
283+ assertTrue("Log message '" + lastMessage + "' does not contain '" + message + "'", lastMessage.contains(message));
284+ }
285+
286+}

Subscribers

People subscribed via source and target branches

to all changes: