Revision: 3343
Author: ferguson.sebastian
Date: Fri Feb 26 15:05:34 2010
Log: Fixed what could have been a concurrency issue in the sending
mechanism of the architect client side session by making one of the
booleans atomic. Added annotations to SQLDatabase so that the data source
would be available while persisting its children. (this was a problem when
getting objects from a server)
http://code.google.com/p/power-architect/source/detail?r=3343
Modified:
/trunk/src/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java
=======================================
---
/trunk/src/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java
Fri Feb 26 12:26:46 2010
+++
/trunk/src/ca/sqlpower/architect/enterprise/ArchitectClientSideSession.java
Fri Feb 26 15:05:34 2010
@@ -12,6 +12,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.prefs.Preferences;
import javax.swing.SwingUtilities;
@@ -545,7 +546,7 @@
// Contained classes
--------------------------------------------------------------------
- boolean persistingToServer = false;
+ private AtomicBoolean persistingToServer = new AtomicBoolean();
/**
* Sends outgoing JSON
@@ -566,47 +567,46 @@
private boolean flushAgain = false;
public void flush() throws SPPersistenceException {
try {
- if (persistingToServer) {
- flushAgain = true;
- return;
- }
-
- persistingToServer = true;
- flushAgain = false;
-
- URI serverURI = getServerURI();
- HttpPost postRequest = new HttpPost(serverURI);
-
- postRequest.setEntity(new
StringEntity(message.toString()));
- postRequest.setHeader("Content-Type", "application/json");
- HttpUriRequest request = postRequest;
- clear();
-
- final JSONMessage response =
getHttpClient().execute(request, new JSONResponseHandler());
- runInForeground(new Runnable() {
- public void run() {
- try {
- if (response.isSuccessful()) {
- // Message was sent successfully and accepted by
the server.
- currentRevision = (new
JSONObject(response.getBody())).getInt("currentRevision");
- } else {
- // Message was sent successfully but rejected by
the server. We must rollback our
- // changes and update to the head revision.
- logger.debug("Response unsuccessful");
- throw new RuntimeException("Out of sync with
server");
- }
- } catch (JSONException e) {
- throw new RuntimeException(e);
- } finally {
- persistingToServer = false;
- try {
- if (flushAgain) flush();
- } catch (SPPersistenceException e) {
- throw new RuntimeException(e);
- }
- }
- }
- });
+ if (persistingToServer.compareAndSet(false, true)) {
+ flushAgain = false;
+
+ URI serverURI = getServerURI();
+ HttpPost postRequest = new HttpPost(serverURI);
+
+ postRequest.setEntity(new
StringEntity(message.toString()));
+
postRequest.setHeader("Content-Type", "application/json");
+ HttpUriRequest request = postRequest;
+ clear();
+
+ final JSONMessage response =
getHttpClient().execute(request, new JSONResponseHandler());
+ runInForeground(new Runnable() {
+ public void run() {
+ try {
+ if (response.isSuccessful()) {
+ // Message was sent successfully and
accepted by the server.
+ currentRevision = (new
JSONObject(response.getBody())).getInt("currentRevision");
+ } else {
+ // Message was sent successfully but
rejected by the server. We must rollback our
+ // changes and update to the head
revision.
+ logger.debug("Response
unsuccessful");
+ throw new RuntimeException("Out of sync with
server");
+ }
+ } catch (JSONException e) {
+ throw new RuntimeException(e);
+ } finally {
+ persistingToServer.set(false);
+ try {
+ if (flushAgain) flush();
+ } catch (SPPersistenceException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ });
+ } else {
+ flushAgain = true;
+ return;
+ }
} catch (UnsupportedEncodingException e) {
throw new SPPersistenceException(null, e);
} catch (URISyntaxException e) {
@@ -699,7 +699,7 @@
runInForeground(new Runnable() {
public void run() {
try {
- if (!persistingToServer) {
+ if (!persistingToServer.get()) {
int newRevision =
json.getInt("currentRevision");
if (currentRevision < newRevision)
{
currentRevision = newRevision;