SCOUT-95
Add an AOP-based test for the AuthToken cache, fix up the DELETE_ASSOCIATION
case.    Bring in aspectj into the build so that we can build the AOP test.
The new AOP-based tests can be enabled by : 
mvn -Dtestcache=true clean install


git-svn-id: https://svn.apache.org/repos/asf/webservices/scout/trunk@954977 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index d4791b9..b5282de 100644
--- a/pom.xml
+++ b/pom.xml
@@ -269,10 +269,35 @@
             <version>1.2.13</version>
             <scope>test</scope>
         </dependency>
+
+	<dependency>
+		<groupId>org.aspectj</groupId>
+		<artifactId>aspectjrt</artifactId>
+		<version>1.6.1</version>
+		<scope>test</scope>
+	</dependency>
+	<dependency>
+		<groupId>aspectj</groupId>
+		<artifactId>aspectjweaver</artifactId>
+		<version>1.5.2</version>
+		<scope>test</scope>
+	</dependency>
     </dependencies>
     <build>
         <pluginManagement>
-            <plugins>
+             <plugins>
+		<plugin>
+			<groupId>org.codehaus.mojo</groupId>
+			<artifactId>aspectj-maven-plugin</artifactId>
+			<version>1.3</version>
+			<executions>
+				<execution>
+					<goals>
+						<goal>test-compile</goal> <!-- use this goal to weave all your test classes -->
+					</goals>
+				</execution>
+			</executions>
+		</plugin>
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-release-plugin</artifactId>
@@ -378,11 +403,31 @@
                             </dependency>
                         </dependencies>
                     </plugin>
-
                 </plugins>
             </build>
         </profile>
-
+        <profile>
+		<id>testcache</id>
+		<activation>
+			<activeByDefault>false</activeByDefault>
+			<property>
+				<name>testcache</name>
+				<value>true</value>
+			</property>
+		</activation>
+		<build>
+		<plugins>		
+               	<plugin>
+                       	<groupId>org.apache.maven.plugins</groupId>
+                       	<artifactId>maven-surefire-plugin</artifactId>
+                       	<configuration>
+                       		<forkMode>pertest</forkMode>
+                               	<argLine>-javaagent:${settings.localRepository}/aspectj/aspectjweaver/1.5.2/aspectjweaver-1.5.2.jar</argLine>
+                       	</configuration>
+               	</plugin>
+		</plugins>
+		</build>
+	</profile>
     </profiles>
 
     <reporting>
diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
index 6e55f25..1fb4987 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerImpl.java
@@ -643,7 +643,7 @@
         		token = getAuthToken(connection, ireg);
                 clearPublisherAssertions(token.getAuthInfo(), ireg);
         		regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
-        	}
+        	} 
         }
         else if (op.equalsIgnoreCase("DELETE_SERVICE")) {
         	try {
@@ -654,7 +654,7 @@
         			AuthTokenSingleton.deleteAuthToken(username);
 	    		}
 	    		token = getAuthToken(connection, ireg);
-	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            //clearPublisherAssertions(token.getAuthInfo(), ireg);
         		regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
 	    	}
         }
@@ -667,7 +667,7 @@
         			AuthTokenSingleton.deleteAuthToken(username);
 	    		}
 	    		token = getAuthToken(connection, ireg);
-	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            //clearPublisherAssertions(token.getAuthInfo(), ireg);
         		regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
 	    	}
         }
@@ -685,7 +685,7 @@
 	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_ASSOCIATION")) {
-           int len = ((String[]) dataarray).length;
+        	int len = ((String[]) dataarray).length;
             PublisherAssertion[] paarr = new PublisherAssertion[len];
             for(int i=0;i<len;i++)
             {
@@ -705,7 +705,17 @@
 	    	}
         }
         else if (op.equalsIgnoreCase("DELETE_CLASSIFICATIONSCHEME")) {
-            regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+            try {
+                regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	} catch (RegistryException rve) {
+	    		String username = getUsernameFromCredentials(connection.getCredentials());
+        		if (AuthTokenSingleton.getToken(username) != null) {
+        			AuthTokenSingleton.deleteAuthToken(username);
+	    		}
+	    		token = getAuthToken(connection, ireg);
+	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
+	    	}
         }
         else {
             throw new JAXRException("Unsupported operation:" + op);
@@ -749,7 +759,17 @@
        }
        catch (RegistryException e)
        {
-          throw new RuntimeException(e);
+           ConnectionImpl connection = registry.getConnection();
+    	   String username = getUsernameFromCredentials(connection.getCredentials());
+    	   if (AuthTokenSingleton.getToken(username) != null) {
+    		   AuthTokenSingleton.deleteAuthToken(username);
+    	   }
+    	   AuthToken token = null;
+    	   try {
+    		   token = getAuthToken(connection, ireg);
+    	   } catch (JAXRException je) {
+    	   }
+   		   clearPublisherAssertions( token.getAuthInfo(), ireg);
        }
     }
 
diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
index 49d4145..84ed199 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessLifeCycleManagerV3Impl.java
@@ -639,7 +639,7 @@
         			AuthTokenV3Singleton.deleteAuthToken(username);
         		}
         		token = getAuthToken(connection, ireg);
-                clearPublisherAssertions(token.getAuthInfo(), ireg);
+                //clearPublisherAssertions(token.getAuthInfo(), ireg);
         		regobj = ireg.deleteBusiness(token.getAuthInfo(), (String[]) dataarray);
         	}
         }
@@ -652,7 +652,7 @@
         			AuthTokenV3Singleton.deleteAuthToken(username);
 	    		}
 	    		token = getAuthToken(connection, ireg);
-	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            //clearPublisherAssertions(token.getAuthInfo(), ireg);
         		regobj = ireg.deleteService(token.getAuthInfo(), (String[]) dataarray);
 	    	}
         }
@@ -665,7 +665,7 @@
         			AuthTokenV3Singleton.deleteAuthToken(username);
 	    		}
 	    		token = getAuthToken(connection, ireg);
-	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            //clearPublisherAssertions(token.getAuthInfo(), ireg);
         		regobj = ireg.deleteBinding(token.getAuthInfo(), (String[]) dataarray);
 	    	}
         }
@@ -678,7 +678,7 @@
         			AuthTokenV3Singleton.deleteAuthToken(username);
 	    		}
 	    		token = getAuthToken(connection, ireg);
-	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            //clearPublisherAssertions(token.getAuthInfo(), ireg);
             	regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
 	    	}
         }
@@ -698,7 +698,7 @@
         			AuthTokenV3Singleton.deleteAuthToken(username);
 	    		}
 	    		token = getAuthToken(connection, ireg);
-	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            //clearPublisherAssertions(token.getAuthInfo(), ireg);
             	regobj = ireg.deletePublisherAssertions(token.getAuthInfo(), paarr);
 	    	}
         }
@@ -711,7 +711,7 @@
         			AuthTokenV3Singleton.deleteAuthToken(username);
 	    		}
 	    		token = getAuthToken(connection, ireg);
-	            clearPublisherAssertions(token.getAuthInfo(), ireg);
+	            //clearPublisherAssertions(token.getAuthInfo(), ireg);
         		regobj = ireg.deleteTModel(token.getAuthInfo(), (String[]) dataarray);
 	    	}	        		
         }
diff --git a/src/test/java/org/apache/ws/scout/registry/qa/BusinessLifeCycleManagerImplReplacement.java b/src/test/java/org/apache/ws/scout/registry/qa/BusinessLifeCycleManagerImplReplacement.java
new file mode 100644
index 0000000..3dd1f37
--- /dev/null
+++ b/src/test/java/org/apache/ws/scout/registry/qa/BusinessLifeCycleManagerImplReplacement.java
@@ -0,0 +1,111 @@
+package org.apache.ws.scout.registry.qa;
+
+import java.net.URL;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.Statement;
+import java.util.Properties;
+
+import org.apache.ws.scout.model.uddi.v2.BusinessDetail;
+import org.apache.ws.scout.model.uddi.v2.BusinessEntity;
+
+import org.apache.ws.scout.model.uddi.v2.PublisherAssertion;
+import org.apache.ws.scout.model.uddi.v2.PublisherAssertions;
+
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before; 
+
+@Aspect
+public class BusinessLifeCycleManagerImplReplacement {
+	private static final String JUDDI_PROPERTIES_FILE = "juddi.properties";
+	
+	private static final String JDBC_DRIVER = "juddi.jdbcDriver";
+	private static final String JDBC_URL = "juddi.jdbcUrl";
+	private static final String JDBC_USER = "juddi.jdbcUsername";
+	private static final String JDBC_PASSWORD = "juddi.jdbcPassword";	
+			
+	private Connection conn;
+
+//	@Before("   call(org.apache.ws.scout.model.uddi.v2.BusinessDetail saveBusiness(String,org.apache.ws.scout.model.uddi.v2.BusinessEntity[])) "
+//			+ "&& within(org.apache.ws.scout.registry.BusinessLifeCycleManagerImpl)")
+	@Before("   call(boolean equalsIgnoreCase(String)) "
+	+ "&& within(org.apache.ws.scout.registry.BusinessLifeCycleManagerImpl)")
+	public void beforeSaveOrgCall() throws Exception {
+		System.out.println("Clearing the AUTH_TOKEN table...");
+		dbinit();
+		clearAuthTokens();
+		dbclose();
+	}	
+	
+    public void dbinit () throws Exception {
+    	URL url = this.getClass().getClassLoader().getResource(JUDDI_PROPERTIES_FILE);
+    	Properties prop = new Properties();
+    	prop.load(url.openStream());
+    	
+    	String jdbcURL = System.getProperty(JDBC_URL, prop.getProperty(JDBC_URL));
+    	String jdbcDriver = System.getProperty(JDBC_DRIVER, prop.getProperty(JDBC_DRIVER)); 
+    	String jdbcUser = System.getProperty(JDBC_USER, prop.getProperty(JDBC_USER));
+    	String jdbcPass = System.getProperty(JDBC_PASSWORD, prop.getProperty(JDBC_PASSWORD));
+    
+    	Class.forName(jdbcDriver);
+    	conn = DriverManager.getConnection(jdbcURL, jdbcUser, jdbcPass);
+    }
+    
+    public void dbclose() throws Exception {
+    	if (conn != null) {
+    		conn.close();
+    		conn = null;
+    	}
+    }
+    
+    public void clearAuthTokens() throws Exception {
+    	String delQuery = "delete from AUTH_TOKEN";
+    	Statement st = conn.createStatement();
+    	st.executeUpdate(delQuery);
+    }
+	
+/*
+	@Before("   call(org.apache.ws.scout.model.uddi.v2.ServiceDetail saveService(String,org.apache.ws.scout.model.uddi.v2.BusinessService[]))"
+			+ "&& within(org.apache.ws.scout.registry.qa.JAXR065AuthTokenCacheTest)")
+    public void beforeServiceCall() {
+    	System.out.println("POINTCUT: deleteAuthTokens");
+    }
+
+	@Before("   call(org.apache.ws.scout.model.uddi.v2.BindingDetail saveBinding(String,org.apache.ws.scout.model.uddi.v2.BindingTemplate[]))"
+			+ "&& within(org.apache.ws.scout.registry.qa.JAXR065AuthTokenCacheTest)")
+    public void beforeSaveServiceBindingCall() {
+    	System.out.println("POINTCUT: deleteAuthTokens");
+    }
+	
+	@Before("   call(org.apache.ws.scout.model.uddi.v2.TModelDetail saveTModel(String,org.apache.ws.scout.model.uddi.v2.TModel[]))"
+			+ "&& within(org.apache.ws.scout.registry.qa.JAXR065AuthTokenCacheTest..*)")
+    public void beforeSaveTModelCall() {
+    	System.out.println("POINTCUT: deleteAuthTokens");
+    }
+	
+	@Before("   call(org.apache.ws.scout.model.uddi.v2.DispositionReport deleteBusiness(String,String[]))"
+			+ "&& within(org.apache.ws.scout.registry.qa.JAXR065AuthTokenCacheTest..*)")
+    public void beforeDeleteOrgCall() {
+    	System.out.println("POINTCUT: deleteAuthTokens");
+    }
+
+	@Before("   call(org.apache.ws.scout.model.uddi.v2.DispositionReport deleteService(String,String[]))"
+			+ "&& within(org.apache.ws.scout.registry.qa.JAXR065AuthTokenCacheTest..*)")
+    public void beforeDeleteServiceCall() {
+    	System.out.println("POINTCUT: deleteAuthTokens");
+    }
+	
+	@Before("   call(org.apache.ws.scout.model.uddi.v2.DispositionReport deleteTModel(String,String[]))"
+			+ "&& within(org.apache.ws.scout.registry.qa.JAXR065AuthTokenCacheTest..*)")
+	public void beforeDeleteTModelCall() {
+    	System.out.println("POINTCUT: deleteAuthTokens");
+    }
+
+	@Before("   call(org.apache.ws.scout.model.uddi.v2.DispositionReport deleteBinding(String,String[]))"
+			+ "&& within(org.apache.ws.scout.registry.qa.JAXR065AuthTokenCacheTest..*)")
+	public void beforeDeleteServiceBindingCall() {
+    	System.out.println("POINTCUT: deleteAuthTokens");
+    }
+    */
+}
\ No newline at end of file
diff --git a/src/test/resources/META-INF/aop.xml b/src/test/resources/META-INF/aop.xml
new file mode 100644
index 0000000..b789acd
--- /dev/null
+++ b/src/test/resources/META-INF/aop.xml
@@ -0,0 +1,5 @@
+<aspectj>
+    <aspects>
+            <aspect name="org.apache.ws.scout.registry.qa.BusinessLifeCycleManagerImplReplacement"/>
+     </aspects>
+</aspectj>