1 package org
.argeo
.slc
.detached
.drivers
;
4 import java
.io
.FileInputStream
;
5 import java
.io
.FileOutputStream
;
6 import java
.io
.IOException
;
7 import java
.io
.ObjectInputStream
;
8 import java
.io
.ObjectOutputStream
;
10 import org
.apache
.commons
.logging
.Log
;
11 import org
.apache
.commons
.logging
.LogFactory
;
12 import org
.argeo
.slc
.detached
.DetachedAnswer
;
13 import org
.argeo
.slc
.detached
.DetachedClient
;
14 import org
.argeo
.slc
.detached
.DetachedCommunication
;
15 import org
.argeo
.slc
.detached
.DetachedException
;
16 import org
.argeo
.slc
.detached
.DetachedRequest
;
17 import org
.springframework
.beans
.factory
.InitializingBean
;
19 public class FileDriver
extends AbstractDriver
implements DetachedClient
,
21 private final static Log log
= LogFactory
.getLog(FileDriver
.class);
24 private File requestsDir
;
25 private File answersDir
;
26 private File processedRequestsDir
;
27 private File processedAnswersDir
;
29 public synchronized DetachedRequest
receiveRequest() throws Exception
{
30 DetachedRequest request
= (DetachedRequest
) receiveFile(requestsDir
,
31 processedRequestsDir
);
33 log
.debug("Received detached request #" + request
.getUuid()
34 + " for ref '" + request
.getRef() + "', path="
39 public void sendAnswer(DetachedAnswer answer
) throws Exception
{
40 sendFile(answersDir
, answer
);
41 log
.debug("Sent detached answer #" + answer
.getUuid());
44 public DetachedAnswer
receiveAnswer() throws Exception
{
45 DetachedAnswer answer
= (DetachedAnswer
) receiveFile(answersDir
,
48 log
.debug("Received detached answer #" + answer
.getUuid());
52 public void sendRequest(DetachedRequest request
) throws Exception
{
53 sendFile(requestsDir
, request
);
54 log
.debug("Sent detached request #" + request
.getUuid()
55 + " for ref '" + request
.getRef() + "', path="
59 protected void sendFile(File dir
, DetachedCommunication detCom
)
61 File file
= new File(dir
.getPath() + File
.separator
+ detCom
.getUuid());
62 File lockFile
= createLockFile(file
);
63 ObjectOutputStream out
= new ObjectOutputStream(new FileOutputStream(
65 out
.writeObject(detCom
);
70 protected synchronized DetachedCommunication
receiveFile(File dir
,
71 File processedDir
) throws Exception
{
73 while (file
== null && isActive()) {
75 throw new DetachedException("Dir " + dir
+ " does not exist.");
77 File
[] files
= dir
.listFiles();
83 } catch (InterruptedException e
) {
92 File lockFile
= nameLockFile(file
);
93 while (lockFile
.exists())
94 // TODO: implements time out
97 ObjectInputStream in
= new ObjectInputStream(new FileInputStream(file
));
98 DetachedCommunication detCom
= (DetachedCommunication
) in
.readObject();
101 // Move to processed dir
102 file
.renameTo(new File(processedDir
.getAbsolutePath() + File
.separator
108 protected File
createLockFile(File file
) {
109 File lockFile
= nameLockFile(file
);
111 lockFile
.createNewFile();
112 } catch (IOException e
) {
113 throw new DetachedException("Cannot create lock file " + lockFile
);
118 protected File
nameLockFile(File file
) {
119 return new File(file
.getAbsolutePath() + ".lck");
122 public void setBaseDir(File baseDir
) {
123 this.baseDir
= baseDir
;
126 private void createIfNotExist(File dir
) {
128 log
.warn("Dir " + dir
.getAbsolutePath()
129 + " does not exist. Creating it...");
134 public void afterPropertiesSet() throws Exception
{
135 this.requestsDir
= new File(baseDir
.getAbsolutePath() + File
.separator
137 this.answersDir
= new File(baseDir
.getAbsolutePath() + File
.separator
139 this.processedRequestsDir
= new File(baseDir
.getAbsolutePath()
140 + File
.separator
+ "processed" + File
.separator
+ "requests");
141 this.processedAnswersDir
= new File(baseDir
.getAbsolutePath()
142 + File
.separator
+ "processed" + File
.separator
+ "answers");
144 createIfNotExist(requestsDir
);
145 createIfNotExist(answersDir
);
146 createIfNotExist(processedRequestsDir
);
147 createIfNotExist(processedAnswersDir
);