001: /**
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */package org.apache.openejb;
017:
018: import static org.apache.openejb.util.URLs.toFile;
019: import junit.framework.AssertionFailedError;
020: import junit.framework.TestCase;
021: import junit.framework.TestResult;
022: import org.objectweb.asm.ClassReader;
023:
024: import java.io.File;
025: import java.io.FileInputStream;
026: import java.io.IOException;
027: import java.net.URL;
028: import java.util.ArrayList;
029: import java.util.Arrays;
030: import java.util.List;
031: import java.util.Map;
032:
033: public class DependenceValidationTest extends TestCase {
034:
035: private Map<String, Map<String, Integer>> depsOfPackages;
036:
037: private TestResult results;
038:
039: public void run(TestResult testResult) {
040: results = testResult;
041: super .run(testResult);
042: }
043:
044: public void testAssembler() throws Exception {
045: DependencyVisitor dependencyVisitor = new DependencyVisitor();
046:
047: URL resource = DependenceValidationTest.class
048: .getResource("/org/apache/openejb/OpenEJB.class");
049: File file = toFile(resource);
050: dir(file.getParentFile(), dependencyVisitor);
051:
052: depsOfPackages = dependencyVisitor.groups;
053:
054: // Nothing may depend on the Assembler except the config code
055: String dynamicAssembler = "org.apache.openejb.assembler.dynamic";
056: assertNotDependentOn("org.apache.openejb",
057: "org.apache.openejb.assembler.classic",
058: "org.apache.openejb.assembler",
059: "org.apache.openejb.config",
060: "org.apache.openejb.assembler.dynamic",
061: "org.apache.openejb.assembler.classic.cmd");
062:
063: // Nothing may depend on the Dynamic Assembler
064: assertNotDependentOn("org.apache.openejb", dynamicAssembler);
065:
066: // Nothing may depend on the JAXB Tree except the Config code
067: assertNotDependentOn("org.apache.openejb",
068: "org.apache.openejb.jee", "org.apache.openejb.config",
069: "org.apache.openejb.config.rules");
070:
071: // Nothing may depend on the Config code except it's subpackages
072: assertNotDependentOn("org.apache.openejb",
073: "org.apache.openejb.config",
074: "org.apache.openejb.config.rules",
075: "org.apache.openejb.config.sys",
076: "org.apache.openejb.assembler", dynamicAssembler);
077:
078: // The assembler may not be dependent on the config factory Implementation
079: assertNotDependentOn("org.apache.openejb.assembler.classic",
080: "org.apache.openejb.config");
081:
082: // Nothing should be dependent on any one particular container implementation (except the Dynamic Assembler)
083: // TODO: This needs fixing... containers are supposed to be pluggable
084: // assertNotDependentOn("org.apache.openejb", "org.apache.openejb.core.stateless", dynamicAssembler);
085: // assertNotDependentOn("org.apache.openejb", "org.apache.openejb.core.stateful", dynamicAssembler);
086: // assertNotDependentOn("org.apache.openejb", "org.apache.openejb.core.entity", dynamicAssembler);
087: }
088:
089: private void assertNotDependentOn(String referringPacakge,
090: String referredPackage, String... exemptionsArray) {
091: if (referringPacakge.equals(referredPackage))
092: return;
093: List<String> exemptions = new ArrayList<String>(Arrays
094: .asList(exemptionsArray));
095: exemptions.add(referredPackage);
096:
097: for (Map.Entry<String, Map<String, Integer>> entry : depsOfPackages
098: .entrySet()) {
099: String packageName = entry.getKey();
100: if (packageName.startsWith(referringPacakge)
101: && !exemptions.contains(packageName)) {
102: try {
103: Map<String, Integer> deps = entry.getValue();
104: if (deps.containsKey(referredPackage)) {
105: int references = deps.get(referredPackage);
106: assertEquals(packageName
107: + " should have no dependencies on "
108: + referredPackage, 0, references);
109: }
110: } catch (AssertionFailedError e) {
111: results.addFailure(this , e);
112: }
113: }
114: }
115: }
116:
117: private static void dir(File dir,
118: DependencyVisitor dependencyVisitor) {
119: for (File file : dir.listFiles()) {
120: if (file.isDirectory()) {
121: dir(file, dependencyVisitor);
122: } else if (file.getName().endsWith(".class")) {
123: file(file, dependencyVisitor);
124: }
125: }
126: }
127:
128: private static void file(File file,
129: DependencyVisitor dependencyVisitor) {
130: try {
131: FileInputStream in = new FileInputStream(file);
132: try {
133: ClassReader classReader = new ClassReader(in);
134: classReader.accept(dependencyVisitor, true);
135: } finally {
136: in.close();
137: }
138: } catch (IOException e) {
139: e.printStackTrace();
140: fail(e.getMessage());
141: }
142: }
143:
144: }
|