[Registry-dev] svn commit r16845 - in trunk/registry/modules/core:
. src/main/java/org/wso2/registry/jdbc
src/main/java/org/wso2/registry/jdbc/dao
src/main/java/org/wso2/registry/jdbc/filecache
svn at wso2.org
svn at wso2.org
Mon May 12 01:25:31 PDT 2008
Author: chathura
Date: Mon May 12 01:25:31 2008
New Revision: 16845
Log:
Made the FileManager thread safe.
Added functionality to use an alternative temporary directory in case where the java.io.tempdir is not set.
This could be the cause of the file caching problem under windows.
Uncommented the version handling test.
Modified:
trunk/registry/modules/core/pom.xml
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceDAO.java
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceVersionDAO.java
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileCleanerTask.java
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileManager.java
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/RegistryFileInputStream.java
Modified: trunk/registry/modules/core/pom.xml
==============================================================================
--- trunk/registry/modules/core/pom.xml (original)
+++ trunk/registry/modules/core/pom.xml Mon May 12 01:25:31 2008
@@ -42,7 +42,6 @@
<exclude>**/JDBCBasedSecureRegistryTest.java</exclude>
<exclude>**/ResourceRenamingTest.java</exclude>
<exclude>**/SecureRegistryTest.java</exclude>
- <exclude>**/VersionHandlingTest.java</exclude>
</excludes>
</configuration>
</plugin>
Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java (original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/JDBCRegistry.java Mon May 12 01:25:31 2008
@@ -112,7 +112,7 @@
private void init(UserRealm realm) throws RegistryException {
- FileManager.init();
+ FileManager.getInstance().init();
defaultRealm = realm;
Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceDAO.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceDAO.java (original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceDAO.java Mon May 12 01:25:31 2008
@@ -679,9 +679,9 @@
public InputStream getResourceContentStream(String contentID, Connection conn)
throws RegistryException {
- if (FileManager.hasFileBasedContent(contentID)) {
- return FileManager.getFileBasedInputStream(contentID);
-
+ InputStream contentStream = FileManager.getInstance().getFileBasedInputStream(contentID);
+ if (contentStream != null) {
+ return contentStream;
}
try {
@@ -692,10 +692,9 @@
ResultSet result = ps.executeQuery();
- InputStream contentStream = null;
if (result.next()) {
//contentStream = getDisconnectedStream(result.getBinaryStream("CONTENT_DATA"));
- contentStream = FileManager.
+ contentStream = FileManager.getInstance().
createFileBasedInputStream(contentID, result.getBinaryStream("CONTENT_DATA"));
}
ps.close();
@@ -1014,9 +1013,9 @@
contentID = UUID.randomUUID().toString();
- InputStream tempFileStream =
- FileManager.createFileBasedInputStream(contentID, contentStream);
- long contentLength = FileManager.getFile(contentID).length();
+ InputStream tempFileStream = FileManager.getInstance().
+ createFileBasedInputStream(contentID, contentStream);
+ long contentLength = FileManager.getInstance().getFile(contentID).length();
String sql = "INSERT INTO CONTENT (CONTENT_ID, CONTENT_DATA) VALUES (?, ?)";
@@ -1046,7 +1045,7 @@
public void updateContent(String contentID, InputStream contentStream)
throws RegistryException {
- FileManager.deleteFileBasedContent(contentID);
+ FileManager.getInstance().deleteFileBasedContent(contentID);
Connection conn = Transaction.getConnection();
@@ -1078,9 +1077,9 @@
try {
- InputStream tempFileStream =
- FileManager.createFileBasedInputStream(contentID, contentStream);
- long contentLength = FileManager.getFile(contentID).length();
+ InputStream tempFileStream = FileManager.getInstance().
+ createFileBasedInputStream(contentID, contentStream);
+ long contentLength = FileManager.getInstance().getFile(contentID).length();
String sql = "UPDATE CONTENT SET CONTENT_DATA=? WHERE CONTENT_ID=?";
@@ -1247,8 +1246,8 @@
//InputStream tempFileStream = new BufferedInputStream(new FileInputStream(tempFile));
InputStream tempFileStream =
- FileManager.createFileBasedInputStream(contentID, contentStream);
- long contentLength = FileManager.getFile(contentID).length();
+ FileManager.getInstance().createFileBasedInputStream(contentID, contentStream);
+ long contentLength = FileManager.getInstance().getFile(contentID).length();
String sql = "INSERT INTO CONTENT (CONTENT_ID, CONTENT_DATA) VALUES (?, ?)";
Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceVersionDAO.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceVersionDAO.java (original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/ResourceVersionDAO.java Mon May 12 01:25:31 2008
@@ -530,9 +530,9 @@
try {
//InputStream tempFileStream = new BufferedInputStream(new FileInputStream(tempFile));
- InputStream tempFileStream =
- FileManager.createFileBasedInputStream(contentID, contentStream);
- long contentLength = FileManager.getFile(contentID).length();
+ InputStream tempFileStream = FileManager.getInstance().
+ createFileBasedInputStream(contentID, contentStream);
+ long contentLength = FileManager.getInstance().getFile(contentID).length();
String sql = "INSERT INTO CONTENT_VERSION " +
"(CONTENT_VERSION_ID, CONTENT_DATA) VALUES (?, ?)";
@@ -563,12 +563,11 @@
public InputStream getResourceContentStream(String contentID, Connection conn)
throws RegistryException {
- if (FileManager.hasFileBasedContent(contentID)) {
- return FileManager.getFileBasedInputStream(contentID);
+ InputStream contentStream = FileManager.getInstance().getFileBasedInputStream(contentID);
+ if (contentStream != null) {
+ return contentStream;
}
- InputStream contentStream = null;
-
try {
String sql = "SELECT CONTENT_DATA FROM CONTENT_VERSION WHERE CONTENT_VERSION_ID=?";
@@ -578,7 +577,7 @@
ResultSet result = ps.executeQuery();
if (result.next()) {
//contentStream = getDisconnectedStream(result.getBinaryStream("CONTENT_DATA"));
- contentStream = FileManager.
+ contentStream = FileManager.getInstance().
createFileBasedInputStream(contentID, result.getBinaryStream("CONTENT_DATA"));
}
ps.close();
Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileCleanerTask.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileCleanerTask.java (original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileCleanerTask.java Mon May 12 01:25:31 2008
@@ -21,6 +21,6 @@
public class FileCleanerTask extends TimerTask {
public void run() {
- FileManager.cleanupFiles();
+ FileManager.getInstance().cleanupFiles();
}
}
Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileManager.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileManager.java (original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/FileManager.java Mon May 12 01:25:31 2008
@@ -21,10 +21,7 @@
import org.wso2.registry.exceptions.RegistryException;
import java.io.*;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Timer;
+import java.util.*;
public class FileManager {
@@ -34,22 +31,38 @@
private static final long PREFERRED_FILE_COUNT = 100;
- private static Map <String, FileData> fileDataMap = new HashMap <String, FileData> ();
+ private static final String ALTERNATIVE_TEMP_DIRECTORY = "temp/";
- private static String tempDir;
+ private Map <String, FileData> fileDataMap =
+ Collections.synchronizedMap(new HashMap <String, FileData> ());
- public static void init() {
+ private String tempDir;
+
+ private static FileManager fileManager = new FileManager();
+
+ public static FileManager getInstance() {
+ return fileManager;
+ }
+
+ private FileManager() {}
+
+ public void init() {
long oneHour = 60 * 60 * 1000;
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new FileCleanerTask(), oneHour, oneHour);
}
- public static boolean hasFileBasedContent(String contentID) {
- return fileDataMap.containsKey(contentID);
- }
+ public InputStream getFileBasedInputStream(String contentID) throws RegistryException {
- public static InputStream getFileBasedInputStream(String contentID) throws RegistryException {
+ synchronized (this) {
+ FileData fileData = fileDataMap.get(contentID);
+ if (fileData == null) {
+ return null;
+ }
+
+ fileData.incrementConnection();
+ }
String tempDir = getTempDirectory();
String tempFilePath = tempDir + "reg" + contentID;
@@ -57,16 +70,17 @@
if (!tempFile.exists()) {
String msg = "Temporary content file is not created for content " + contentID;
log.error(msg);
+
+ fileDataMap.remove(contentID);
+
throw new RegistryException(msg);
}
+ InputStream inputStream = null;
try {
- InputStream inputStream = new RegistryFileInputStream(
+ inputStream = new RegistryFileInputStream(
new BufferedInputStream(new FileInputStream(tempFile)), contentID);
- FileData fileData = fileDataMap.get(contentID);
- fileData.incrementConnection();
-
return inputStream;
} catch (FileNotFoundException e) {
@@ -74,11 +88,22 @@
String msg = "Failed to create an input stream from the temp file " +
tempFilePath + ". " + e.getMessage();
log.error(msg, e);
+
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e1) {
+ String msg2 =
+ "Failed to close the inputstream after failure. " + e.getMessage();
+ log.error(msg2, e);
+ }
+ }
+
throw new RegistryException(msg, e);
}
}
- public static InputStream createFileBasedInputStream(String contentID, InputStream inputStream)
+ public synchronized InputStream createFileBasedInputStream(String contentID, InputStream inputStream)
throws RegistryException {
if (inputStream == null) {
@@ -96,10 +121,6 @@
tempFile.createNewFile();
tempFile.deleteOnExit();
- // we increment the file data only after obtaining the input stream from file
- FileData fileData = new FileData();
- fileDataMap.put(contentID, fileData);
-
out = new BufferedOutputStream(new FileOutputStream(tempFile));
byte[] contentChunk = new byte[1024];
int byteCount;
@@ -108,6 +129,10 @@
}
out.flush();
+ // we increment the file data only after obtaining the input stream from file
+ FileData fileData = new FileData();
+ fileDataMap.put(contentID, fileData);
+
} catch (IOException e) {
String msg = "Failed to write data to the temporary file " +
@@ -153,7 +178,7 @@
}
}
- public static File getFile(String contentID) {
+ public File getFile(String contentID) {
String tempDir = getTempDirectory();
String tempFilePath = tempDir + "reg" + contentID;
@@ -165,7 +190,7 @@
return null;
}
- public static synchronized void onStreamClosed(String contentID) {
+ public synchronized void onStreamClosed(String contentID) {
FileData fileData = fileDataMap.get(contentID);
if (fileData != null) {
@@ -176,7 +201,7 @@
}
}
- public static void cleanupFiles() {
+ public synchronized void cleanupFiles() {
long currentTime = System.currentTimeMillis();
@@ -195,7 +220,7 @@
}
}
- public static void deleteFileBasedContent(String contentID) {
+ public synchronized void deleteFileBasedContent(String contentID) {
fileDataMap.remove(contentID);
@@ -206,12 +231,24 @@
}
}
- private static String getTempDirectory() {
+ private String getTempDirectory() {
if (tempDir == null) {
tempDir = System.getProperty("java.io.tmpdir");
- if (!tempDir.endsWith(File.separator)) {
- tempDir = tempDir + File.separator;
+ if (tempDir !=null) {
+ if (!tempDir.endsWith(File.separator)) {
+ tempDir = tempDir + File.separator;
+ }
+
+ } else {
+ tempDir = ALTERNATIVE_TEMP_DIRECTORY;
+ File tempDirectory = new File(tempDir);
+
+ synchronized (this) {
+ if (tempDirectory.exists()) {
+ tempDirectory.mkdir();
+ }
+ }
}
}
Modified: trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/RegistryFileInputStream.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/RegistryFileInputStream.java (original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/filecache/RegistryFileInputStream.java Mon May 12 01:25:31 2008
@@ -50,7 +50,7 @@
}
public void close() throws IOException {
- FileManager.onStreamClosed(contentID);
+ FileManager.getInstance().onStreamClosed(contentID);
inputStream.close();
}
More information about the Registry-dev
mailing list