Author: chathura
Date: Tue Feb 26 00:54:39 2008
New Revision: 14207
Log:
Implementing dependency management.
Added support for dependent browsing and analysing chained dependencies.
Modified:
trunk/registry/modules/core/src/main/java/org/wso2/registry/Resource.java
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/VersionedResourceDAO.java
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/hsql/DBUtils.java
trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/DependencyTest.java
Modified:
trunk/registry/modules/core/src/main/java/org/wso2/registry/Resource.java
==============================================================================
--- trunk/registry/modules/core/src/main/java/org/wso2/registry/Resource.java
(original)
+++ trunk/registry/modules/core/src/main/java/org/wso2/registry/Resource.java
Tue Feb 26 00:54:39 2008
@@ -275,6 +275,14 @@
return dependents.toArray(new String[dependents.size()]);
}
+ public void setDependents(String[] dependents) {
+ this.dependents = new ArrayList();
+
+ for (String dependent : dependents) {
+ this.dependents.add(dependent);
+ }
+ }
+
public void addDependent(String dependentPath) {
dependents.add(dependentPath);
}
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
Tue Feb 26 00:54:39 2008
@@ -551,6 +551,11 @@
conn = getConnection();
long dependentID =
resourceDAO.getResourceID(versionedPath.getPath(), conn);
+ if (versionedPath.getVersion() == -1) {
+ versionedPath.setVersion(
+
resourceDAO.getCurrentVersionNumber(versionedPath.getPath(), conn));
+ }
+
resourceDAO.addDependencies(
dependentID, versionedPath.getVersion(), dependencyPaths,
conn);
Modified:
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/VersionedResourceDAO.java
==============================================================================
---
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/VersionedResourceDAO.java
(original)
+++
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/dao/VersionedResourceDAO.java
Tue Feb 26 00:54:39 2008
@@ -99,12 +99,12 @@
// get resource children
if (resource.isDirectory()) {
-
String[] children = getChildPaths(resource.getId(), versionNumber,
conn);
resource.setContent(children);
}
resource.setDependencies(getDependencies(resource.getId(),
versionNumber, conn));
+ resource.setDependents(getDependents(resource.getId(), versionNumber,
conn));
// get resource properties
return getResourceWithProperties(conn, resource);
@@ -171,8 +171,8 @@
}
// get resource properties
- resource.setDependencies(
- getDependencies(resource.getId(),
latestVerions?-1:versionNumber, conn));
+ resource.setDependencies(getDependencies(resource.getId(),
versionNumber, conn));
+ resource.setDependents(getDependents(resource.getId(), versionNumber,
conn));
return getResourceWithProperties(conn, resource);
}
@@ -197,8 +197,8 @@
private String[] getDependencies(long resourceID, long version, Connection
conn)
throws SQLException {
- String depSQL = "SELECT A.PATH, D.DAID, D.DVN FROM ARTIFACTS A,
DEPENDENCY D WHERE " +
- "D.AID=? AND D.VN=? AND D.DTYPE=? AND A.AID=D.DAID";
+ String depSQL = "SELECT A.PATH, D.DAID, D.DVN FROM ARTIFACTS A,
DEPENDENCY_MANAGEMENT D " +
+ "WHERE D.AID=? AND D.VN=? AND D.DTYPE=? AND A.AID=D.DAID";
PreparedStatement depSt = conn.prepareStatement(depSQL);
depSt.setLong(1, resourceID);
@@ -220,11 +220,37 @@
return depList.toArray(new String[depList.size()]);
}
+ private String[] getDependents(long resourceID, long version, Connection
conn)
+ throws SQLException {
+
+ String depSQL = "SELECT A.PATH, D.AID, D.VN FROM ARTIFACTS A,
DEPENDENCY_MANAGEMENT D " +
+ "WHERE D.DAID=? AND D.DVN=? AND D.DTYPE=? AND A.AID=D.AID";
+
+ PreparedStatement depSt = conn.prepareStatement(depSQL);
+ depSt.setLong(1, resourceID);
+ depSt.setLong(2, version);
+ depSt.setString(3, RegistryConstants.DEFAULT_DEPENDENCY);
+
+ List<String> depList = new ArrayList();
+ ResultSet depResults = depSt.executeQuery();
+ while (depResults.next()) {
+ String dependentPath =
depResults.getString(DatabaseConstants.PATH_FIELD);
+ long dependentVersion = depResults.getLong("VN");
+ String fullDependentPath = dependentPath + "?v=" +
dependentVersion;
+
+ depList.add(fullDependentPath);
+ }
+
+ depResults.close();
+
+ return depList.toArray(new String[depList.size()]);
+ }
+
private Dependency[] getOneLevelDependencies(long resourceID, long
version, Connection conn)
throws SQLException {
- String depSQL = "SELECT A.PATH, D.DAID, D.DVN FROM ARTIFACTS A,
DEPENDENCY D WHERE " +
- "D.AID=? AND D.VN=? AND D.DTYPE=? AND A.AID=D.DAID";
+ String depSQL = "SELECT A.PATH, D.DAID, D.DVN FROM ARTIFACTS A,
DEPENDENCY_MANAGEMENT D " +
+ "WHERE D.AID=? AND D.VN=? AND D.DTYPE=? AND A.AID=D.DAID";
PreparedStatement depSt = conn.prepareStatement(depSQL);
depSt.setLong(1, resourceID);
@@ -248,9 +274,14 @@
return depList.toArray(new Dependency[depList.size()]);
}
- public Dependency[] getDependencies(String resourcePath, Connection conn)
throws SQLException {
+ public Dependency[] getDependencies(String resourcePath, Connection conn)
+ throws SQLException, RegistryException {
VersionedPath versionedPath =
RegistryUtils.getVersionedPath(resourcePath);
+
+ if (versionedPath.getVersion() == -1) {
+
versionedPath.setVersion(getCurrentVersionNumber(versionedPath.getPath(),
conn));
+ }
long resourceID = getResourceID(versionedPath.getPath(), conn);
Dependency[] dependencies =
@@ -338,6 +369,7 @@
}
resource.setDependencies(getDependencies(resource.getId(),
latestVersionNumber, conn));
+ resource.setDependents(getDependents(resource.getId(),
latestVersionNumber, conn));
// get resource properties
return getResourceWithProperties(conn, resource);
@@ -663,11 +695,11 @@
long resourceID, long version, String[] dependencyPaths,
Connection conn)
throws SQLException, RegistryException {
- String depAddSQL = "INSERT INTO DEPENDENCY (AID, VN, DAID, DVN, DTYPE)
" +
+ String depAddSQL = "INSERT INTO DEPENDENCY_MANAGEMENT (AID, VN, DAID,
DVN, DTYPE) " +
"VALUES (?,?,?,?,?)";
PreparedStatement addSt = conn.prepareStatement(depAddSQL);
- String checkSQL = "SELECT AID FROM DEPENDENCY " +
+ String checkSQL = "SELECT AID FROM DEPENDENCY_MANAGEMENT " +
"WHERE AID=? AND VN=? AND DAID=? AND DVN=? AND DTYPE=?";
PreparedStatement checkSt = conn.prepareStatement(checkSQL);
@@ -710,10 +742,10 @@
public void addDependencies(long resourceID, long version, Dependency[]
dependencies, Connection conn)
throws SQLException, RegistryException {
- String depAddSQL = "INSERT INTO DEPENDENCY (AID, VN, DAID, DVN, DTYPE)
VALUES (?,?,?,?,?)";
+ String depAddSQL = "INSERT INTO DEPENDENCY_MANAGEMENT (AID, VN, DAID,
DVN, DTYPE) VALUES (?,?,?,?,?)";
PreparedStatement addSt = conn.prepareStatement(depAddSQL);
- String checkSQL = "SELECT AID FROM DEPENDENCY WHERE AID=? AND VN=? AND
DAID=? AND DVN=? AND DTYPE=?";
+ String checkSQL = "SELECT AID FROM DEPENDENCY_MANAGEMENT WHERE AID=?
AND VN=? AND DAID=? AND DVN=? AND DTYPE=?";
PreparedStatement checkSt = conn.prepareStatement(checkSQL);
for (Dependency dependency : dependencies) {
Modified:
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/hsql/DBUtils.java
==============================================================================
---
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/hsql/DBUtils.java
(original)
+++
trunk/registry/modules/core/src/main/java/org/wso2/registry/jdbc/hsql/DBUtils.java
Tue Feb 26 00:54:39 2008
@@ -109,6 +109,16 @@
"FOREIGN KEY (DAID)
REFERENCES ARTIFACTS (AID)," +
"FOREIGN KEY (AID)
REFERENCES ARTIFACTS (AID));";
+ private static final String dependencyManagementTable = "CREATE TABLE
DEPENDENCY_MANAGEMENT (" +
+ "AID INTEGER NOT NULL," +
+ "VN INTEGER NOT NULL," +
+ "DAID INTEGER NOT NULL," +
+ "DVN INTEGER NOT NULL," +
+ "DTYPE VARCHAR (20)," +
+ "UNIQUE (AID,VN,DAID,DVN)," +
+ "FOREIGN KEY (DAID)
REFERENCES ARTIFACTS (AID)," +
+ "FOREIGN KEY (AID)
REFERENCES ARTIFACTS (AID));";
+
public void initializeDatabase(Connection conn) throws SQLException {
DatabaseMetaData metaData = conn.getMetaData();
@@ -134,5 +144,6 @@
// creating version related tables
s.executeUpdate(versionTable);
s.executeUpdate(dependencyTable);
+ s.executeUpdate(dependencyManagementTable);
}
}
Modified:
trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/DependencyTest.java
==============================================================================
---
trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/DependencyTest.java
(original)
+++
trunk/registry/modules/core/src/test/java/org/wso2/registry/jdbc/DependencyTest.java
Tue Feb 26 00:54:39 2008
@@ -20,6 +20,7 @@
import org.wso2.registry.Registry;
import org.wso2.registry.RegistryException;
import org.wso2.registry.Resource;
+import org.wso2.registry.Dependency;
import org.wso2.registry.jdbc.realm.RegistryRealm;
import org.wso2.registry.jdbc.realm.InMemoryRegistryRealm;
@@ -50,11 +51,79 @@
r2.addDependency("/depTest/test1/r1");
registry.put("/depTest/test1/r2", r2);
+ Resource r21 = registry.get("/depTest/test1/r1");
Resource r22 = registry.get("/depTest/test1/r2");
+ assertTrue(containsString(r21.getDependents(), "/depTest/test1/r2"));
assertTrue(containsString(r22.getDependencies(), "/depTest/test1/r1"));
}
+ public void testSettingDependenciesFromAPI() throws RegistryException {
+
+ Resource r1 = new Resource();
+ r1.setContent("some content for second r1".getBytes());
+ registry.put("/depTest/test2/r1", r1);
+
+ Resource r2 = new Resource();
+ r2.setContent("this is dependent on r2".getBytes());
+ registry.put("/depTest/test2/r2", r2);
+
+ registry.addDependencies("/depTest/test2/r2", new String[]
{"/depTest/test2/r1"});
+
+ Resource r21 = registry.get("/depTest/test2/r1");
+ Resource r22 = registry.get("/depTest/test2/r2");
+
+ assertTrue(containsString(r21.getDependents(), "/depTest/test2/r2"));
+ assertTrue(containsString(r22.getDependencies(), "/depTest/test2/r1"));
+ }
+
+ public void testDependencyChainAnalysis() throws RegistryException {
+
+ Resource r1 = new Resource();
+ r1.setContent("some content for second r1".getBytes());
+ registry.put("/depTest/test3/r1", r1);
+
+ Resource r2 = new Resource();
+ r2.setContent("this is dependent on r2".getBytes());
+ registry.put("/depTest/test3/r2", r2);
+
+ Resource r3 = new Resource();
+ r3.setContent("some content for second r3".getBytes());
+ registry.put("/depTest/test3/r3", r3);
+
+ Resource r4 = new Resource();
+ r4.setContent("this is dependent on r4".getBytes());
+ registry.put("/depTest/test3/r4", r4);
+
+ registry.addDependencies("/depTest/test3/r1", new String[]
{"/depTest/test3/r2"});
+ registry.addDependencies("/depTest/test3/r2", new String[]
{"/depTest/test3/r3"});
+ registry.addDependencies("/depTest/test3/r3", new String[]
{"/depTest/test3/r4"});
+
+ Dependency[] dependencies1 =
registry.getAllDependencies("/depTest/test3/r1");
+
+ assertEquals("There should be one dependency for the resource:
/depTest/test3/r1",
+ 1, dependencies1.length);
+
+ assertTrue("/depTest/test3/r2 should be a dependency of
/depTest/test3/r1",
+
dependencies1[0].getDependencyPath().startsWith("/depTest/test3/r2"));
+
+ Dependency[] dependencies2 = dependencies1[0].getDependencies();
+
+ assertEquals("There should be one dependency for the resource:
/depTest/test3/r2",
+ 1, dependencies2.length);
+
+ assertTrue("/depTest/test3/r3 should be a dependency of
/depTest/test3/r2",
+
dependencies2[0].getDependencyPath().startsWith("/depTest/test3/r3"));
+
+ Dependency[] dependencies3 = dependencies2[0].getDependencies();
+
+ assertEquals("There should be one dependency for the resource:
/depTest/test3/r3",
+ 1, dependencies3.length);
+
+ assertTrue("/depTest/test3/r4 should be a dependency of
/depTest/test3/r3",
+
dependencies3[0].getDependencyPath().startsWith("/depTest/test3/r4"));
+ }
+
private boolean containsString(String[] array, String value) {
boolean found = false;
_______________________________________________
Registry-dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/registry-dev