View Javadoc

1   /*
2    * Created on 14 Apr 2009
3    *
4    */
5   package org.sourceforge.jemm.database.debug;
6   
7   import java.util.Arrays;
8   
9   import org.apache.log4j.Logger;
10  import org.sourceforge.jemm.database.ClassId;
11  import org.sourceforge.jemm.database.ClassInfo;
12  import org.sourceforge.jemm.database.ClientId;
13  import org.sourceforge.jemm.database.ClientThreadId;
14  import org.sourceforge.jemm.database.Database;
15  import org.sourceforge.jemm.database.DatabaseDebugIF;
16  import org.sourceforge.jemm.database.EnumId;
17  import org.sourceforge.jemm.database.EnumInfo;
18  import org.sourceforge.jemm.database.GetObjectResp;
19  import org.sourceforge.jemm.database.LockAcquiredListener;
20  import org.sourceforge.jemm.database.ObjectSyncData;
21  import org.sourceforge.jemm.database.ObjectSyncResp;
22  import org.sourceforge.jemm.database.StructureModifiedException;
23  import org.sourceforge.jemm.lifecycle.TypeRequest;
24  import org.sourceforge.jemm.lifecycle.TypeResponse;
25  import org.sourceforge.jemm.types.ID;
26  
27  /**
28   * The DebugDatabase is a pass-through logger to an underlying database.  All calls are
29   * logged and then passed through to the underlying implementation.
30   * 
31   * @author Rory Graves
32   */
33  public class DebugDatabase implements Database {
34      Logger logger = Logger.getLogger(DebugDatabase.class);
35      private final Database underlyingDatabase;
36      
37      public DebugDatabase(Database underlyingDatabase) {
38          this.underlyingDatabase = underlyingDatabase;
39      }
40      
41      @Override
42      public void acquireLock(ClientThreadId threadId, ID jemmId) {
43          logger.debug("aquireLock(" + threadId + "," + jemmId + ")");
44          underlyingDatabase.acquireLock(threadId, jemmId);
45      }
46  
47      @Override
48      public ClassInfo getClassInfo(ClientId clientId, ClassId classId) {
49          logger.debug("getClassInfo(" + clientId + "," + classId + ")");        
50          return underlyingDatabase.getClassInfo(clientId, classId);
51      }
52  
53      @Override
54      public DatabaseDebugIF getDebugInterface() {
55          logger.debug("getDebugInterface() - NOT SUPPORTED");        
56          return null;
57      }
58  
59      @Override
60      public EnumInfo getEnumInfo(ClientId clientId, EnumId enumId) {
61          logger.debug("getEnumInfo(" + clientId + "," + enumId + ")");        
62          return underlyingDatabase.getEnumInfo(clientId, enumId);
63      }
64  
65      @Override
66      public GetObjectResp getObject(ClientId clientId, ID jemmId) {
67          logger.debug("getObject(" + clientId + "," + jemmId + ")");        
68          return underlyingDatabase.getObject(clientId, jemmId);
69      }
70  
71      @Override
72      public ID getRoot(ClientId clientId, String rootName) {
73          logger.debug("getRoot(" + clientId + ",\"" + rootName + "\")");        
74          return underlyingDatabase.getRoot(clientId, rootName);
75      }
76  
77      @Override
78      public ID newObject(ClientId clientId, ClassId classId) {
79          logger.debug("newObject(" + clientId + "," + classId + ")");        
80          return underlyingDatabase.newObject(clientId, classId);
81      }
82  
83      @Override
84      public void referenceCleared(ClientId clientId, ID... ids) {
85          logger.debug("referenceCleared(" + clientId + "," + Arrays.toString(ids) + ")");
86          underlyingDatabase.referenceCleared(clientId, ids);
87      }
88  
89      @Override
90      public ClassId registerClass(ClientId clientId, 
91      		ClassInfo classInfo) throws StructureModifiedException {
92      	logger.debug("registerClass(" + clientId + "," + classInfo + ")");        
93      	return underlyingDatabase.registerClass(clientId, classInfo);
94      }
95  
96      @Override
97      public EnumId registerEnum(ClientId clientId, 
98      		EnumInfo enumInfo) throws StructureModifiedException {
99          logger.debug("registerEnum(" + clientId + "," + enumInfo + ")");        
100         return underlyingDatabase.registerEnum(clientId, enumInfo);
101     }
102 
103     @Override
104     public void releaseLock(ClientThreadId threadId, ID jemmId) {
105         logger.debug("releaseLock(" + threadId + "," + jemmId + ")");        
106         underlyingDatabase.releaseLock(threadId,jemmId);
107     }
108 
109     @Override
110     public void removeLockAcquiredListener(ClientId clientId) {
111         logger.debug("removeLockAcquiredListener(" + clientId + ")");
112         // this will remove the debug listener
113         underlyingDatabase.removeLockAcquiredListener(clientId);
114     }
115 
116     class DebugLockAcquiredListener implements LockAcquiredListener {
117 
118     	final ClientId clientId;
119     	final LockAcquiredListener clientListener;
120     	
121     	public DebugLockAcquiredListener(ClientId clientId,LockAcquiredListener clientListener) {
122     		this.clientId = clientId;
123     		this.clientListener = clientListener;
124 		} 
125 		@Override
126 		public void lockAcquired(ClientThreadId threadId, ID object) {
127 	        logger.debug("lock aquired notification(" + threadId + "," + object + ")");
128 	        clientListener.lockAcquired(threadId, object);
129 		}    	
130     }    
131     
132     @Override
133     public void setClientLockAcquiredListener(ClientId clientId, LockAcquiredListener listener) {
134         logger.debug("setClientLockAcquiredListener(" + clientId + "," + listener + ")");
135         underlyingDatabase.setClientLockAcquiredListener(clientId,
136         		new DebugLockAcquiredListener(clientId,listener));
137     }
138 
139     @Override
140     public void setRoot(ClientId clientId, String rootName, ID newValue) {
141         logger.debug("setRoot(" + clientId + ",\"" + rootName + "\"," + newValue + ")");        
142         underlyingDatabase.setRoot(clientId,rootName,newValue);
143     }
144 
145     @Override
146     public ID setRootIfNull(ClientId clientId, String rootName, ID newValue) {
147     	logger.debug("setRootIfNull(" + clientId + ",\"" + rootName + "\"," + newValue + ")");        
148         return underlyingDatabase.setRootIfNull(clientId,rootName,newValue);
149     }
150 
151     @Override
152     public ObjectSyncResp synchroniseObject(ClientId clientId, ID jemmId, 
153     		ObjectSyncData syncData) {
154         logger.debug("synchroniseObject(" + clientId + "," + jemmId + "," + syncData + ")");
155         return underlyingDatabase.synchroniseObject(clientId, jemmId, syncData);
156     }
157 
158 	@Override
159 	public void clientDisconnect(ClientId clientId) {
160 		logger.debug("clientDisconnect(" + clientId + ")");
161 		underlyingDatabase.clientDisconnect(clientId);
162 	}
163 
164 	@Override
165 	public TypeResponse<?> processTypeRequest(ClientId clientId,
166 			ClassId classId, ID objId, TypeRequest<?> request) {
167 		
168 		logger.debug("processTypeRequest(" + clientId + "," + classId + "," + objId + "," 
169 				+ request + ")");
170         return underlyingDatabase.processTypeRequest(clientId, classId, objId, request);
171 	}
172 }