Dropping jdvue from the main repo as it has been moved to its own.
Change-Id: I82bbbc213c875a9dba4e5b4c4edaafdd04cb77ea
Showing
21 changed files
with
10 additions
and
1856 deletions
| 1 | #!/bin/bash | 1 | #!/bin/bash |
| 2 | #------------------------------------------------------------------------------- | 2 | #------------------------------------------------------------------------------- |
| 3 | # Java Package Dependency viewer | 3 | # Java Package Dependency viewer |
| 4 | -# | ||
| 5 | -# written by Thomas Vachuska | ||
| 6 | -# -- Doobs -- | ||
| 7 | #------------------------------------------------------------------------------- | 4 | #------------------------------------------------------------------------------- |
| 8 | 5 | ||
| 9 | -JDVUE_ROOT=${JDVUE_ROOT:-$(dirname $0)/..} | 6 | +VER=${JDVUE_VERSION:-2.0} |
| 10 | -cd $JDVUE_ROOT | 7 | +JAR=~/.m2/repository/org/onosproject/jdvue/$VER/jdvue-$VER.jar |
| 11 | -VER=1.6.0-SNAPSHOT | ||
| 12 | -JAR=$PWD/target/jdvue-${VER}.jar # start with the dev jar first | ||
| 13 | -cd - >/dev/null | ||
| 14 | 8 | ||
| 15 | -# If the dev jar is not available, use one from .m2/repository | 9 | +# Download the jdvue binary if needed |
| 16 | -[ -f ${JAR} ] || JAR=~/.m2/repository/org/onlab/tools/jdvue/${VER}/jdvue-${VER}.jar | 10 | +if [ ! -f $JAR ]; then |
| 11 | + printf "Downloading jdvue binary..." | ||
| 12 | + aux=/tmp/stc-$$.log | ||
| 13 | + mvn dependency:get -Dartifact=org.onosproject:jdvue:$VER -Dtransitive=false -B >$aux || fgrep '[ERROR]' $aux | ||
| 14 | + rm -f $aux | ||
| 15 | + [ -f $JAR ] && printf "Done.\n" | ||
| 16 | +fi | ||
| 17 | 17 | ||
| 18 | # Assume default project to be the base-name of the argument or of current dir | 18 | # Assume default project to be the base-name of the argument or of current dir |
| 19 | name=$(basename ${1:-$PWD}) | 19 | name=$(basename ${1:-$PWD}) | ... | ... |
utils/jdvue/bin/jdvue-scan
deleted
100755 → 0
| 1 | -#!/bin/bash | ||
| 2 | -#------------------------------------------------------------------------------- | ||
| 3 | -# Java Package Dependency scanner | ||
| 4 | -# | ||
| 5 | -# written by Thomas Vachuska | ||
| 6 | -# -- Doobs -- | ||
| 7 | -#------------------------------------------------------------------------------- | ||
| 8 | - | ||
| 9 | -find "${@:-.}" -type f -name \*.java \ | ||
| 10 | - | grep -v -E '/lost+found/|/target/' \ | ||
| 11 | - | xargs grep -E "^[ \t]*import .*;.*|^[ \t]*package .*;.*" \ | ||
| 12 | - | tr -d '\r' > jpd.db |
utils/jdvue/pom.xml
deleted
100644 → 0
| 1 | -<?xml version="1.0"?> | ||
| 2 | -<!-- | ||
| 3 | - ~ Copyright 2015-present Open Networking Laboratory | ||
| 4 | - ~ | ||
| 5 | - ~ Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 6 | - ~ you may not use this file except in compliance with the License. | ||
| 7 | - ~ You may obtain a copy of the License at | ||
| 8 | - ~ | ||
| 9 | - ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
| 10 | - ~ | ||
| 11 | - ~ Unless required by applicable law or agreed to in writing, software | ||
| 12 | - ~ distributed under the License is distributed on an "AS IS" BASIS, | ||
| 13 | - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 14 | - ~ See the License for the specific language governing permissions and | ||
| 15 | - ~ limitations under the License. | ||
| 16 | - --> | ||
| 17 | -<project xmlns="http://maven.apache.org/POM/4.0.0" | ||
| 18 | - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
| 19 | - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
| 20 | - <modelVersion>4.0.0</modelVersion> | ||
| 21 | - <prerequisites> | ||
| 22 | - <maven>3.0.4</maven> | ||
| 23 | - </prerequisites> | ||
| 24 | - | ||
| 25 | - <parent> | ||
| 26 | - <groupId>org.onosproject</groupId> | ||
| 27 | - <artifactId>onlab-utils</artifactId> | ||
| 28 | - <version>1.6.0-SNAPSHOT</version> | ||
| 29 | - </parent> | ||
| 30 | - | ||
| 31 | - <artifactId>jdvue</artifactId> | ||
| 32 | - <packaging>jar</packaging> | ||
| 33 | - | ||
| 34 | - <description>Java Package Dependency & Analyzer</description> | ||
| 35 | - | ||
| 36 | - <properties> | ||
| 37 | - <!-- FIXME skipping checkstyle for now --> | ||
| 38 | - <checkstyle.skip>true</checkstyle.skip> | ||
| 39 | - </properties> | ||
| 40 | - | ||
| 41 | - <dependencies> | ||
| 42 | - <dependency> | ||
| 43 | - <groupId>com.google.guava</groupId> | ||
| 44 | - <artifactId>guava</artifactId> | ||
| 45 | - <version>19.0</version> | ||
| 46 | - </dependency> | ||
| 47 | - <dependency> | ||
| 48 | - <groupId>com.google.guava</groupId> | ||
| 49 | - <artifactId>guava-testlib</artifactId> | ||
| 50 | - <version>19.0</version> | ||
| 51 | - <scope>test</scope> | ||
| 52 | - </dependency> | ||
| 53 | - <dependency> | ||
| 54 | - <groupId>com.fasterxml.jackson.core</groupId> | ||
| 55 | - <artifactId>jackson-databind</artifactId> | ||
| 56 | - <version>2.7.3</version> | ||
| 57 | - <scope>compile</scope> | ||
| 58 | - </dependency> | ||
| 59 | - <dependency> | ||
| 60 | - <groupId>com.fasterxml.jackson.core</groupId> | ||
| 61 | - <artifactId>jackson-annotations</artifactId> | ||
| 62 | - <version>2.7.3</version> | ||
| 63 | - <scope>compile</scope> | ||
| 64 | - </dependency> | ||
| 65 | - <dependency> | ||
| 66 | - <groupId>org.onosproject</groupId> | ||
| 67 | - <artifactId>onlab-junit</artifactId> | ||
| 68 | - <scope>test</scope> | ||
| 69 | - </dependency> | ||
| 70 | - </dependencies> | ||
| 71 | - | ||
| 72 | - <build> | ||
| 73 | - <plugins> | ||
| 74 | - <plugin> | ||
| 75 | - <artifactId>maven-compiler-plugin</artifactId> | ||
| 76 | - <version>3.1</version> | ||
| 77 | - <configuration> | ||
| 78 | - <source>1.8</source> | ||
| 79 | - <target>1.8</target> | ||
| 80 | - </configuration> | ||
| 81 | - </plugin> | ||
| 82 | - <plugin> | ||
| 83 | - <groupId>org.apache.maven.plugins</groupId> | ||
| 84 | - <artifactId>maven-shade-plugin</artifactId> | ||
| 85 | - <version>2.4.2</version> | ||
| 86 | - <configuration> | ||
| 87 | - <transformers> | ||
| 88 | - <transformer | ||
| 89 | - implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> | ||
| 90 | - <mainClass>org.onlab.jdvue.DependencyViewer | ||
| 91 | - </mainClass> | ||
| 92 | - </transformer> | ||
| 93 | - </transformers> | ||
| 94 | - </configuration> | ||
| 95 | - <executions> | ||
| 96 | - <execution> | ||
| 97 | - <phase>package</phase> | ||
| 98 | - <goals> | ||
| 99 | - <goal>shade</goal> | ||
| 100 | - </goals> | ||
| 101 | - </execution> | ||
| 102 | - </executions> | ||
| 103 | - </plugin> | ||
| 104 | - </plugins> | ||
| 105 | - </build> | ||
| 106 | - | ||
| 107 | -</project> |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | - | ||
| 19 | -import java.io.BufferedReader; | ||
| 20 | -import java.io.FileInputStream; | ||
| 21 | -import java.io.IOException; | ||
| 22 | -import java.io.InputStream; | ||
| 23 | -import java.io.InputStreamReader; | ||
| 24 | -import java.util.ArrayList; | ||
| 25 | -import java.util.Collection; | ||
| 26 | -import java.util.Collections; | ||
| 27 | -import java.util.HashMap; | ||
| 28 | -import java.util.HashSet; | ||
| 29 | -import java.util.List; | ||
| 30 | -import java.util.Map; | ||
| 31 | -import java.util.Set; | ||
| 32 | - | ||
| 33 | -import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 34 | - | ||
| 35 | -/** | ||
| 36 | - * Produces a package & source catalogue. | ||
| 37 | - * | ||
| 38 | - * @author Thomas Vachuska | ||
| 39 | - */ | ||
| 40 | -public class Catalog { | ||
| 41 | - | ||
| 42 | - private static final String PACKAGE = "package"; | ||
| 43 | - private static final String IMPORT = "import"; | ||
| 44 | - private static final String STATIC = "static"; | ||
| 45 | - private static final String SRC_ROOT = "src/main/java/"; | ||
| 46 | - private static final String WILDCARD = "\\.*$"; | ||
| 47 | - | ||
| 48 | - private final Map<String, JavaSource> sources = new HashMap<>(); | ||
| 49 | - private final Map<String, JavaPackage> packages = new HashMap<>(); | ||
| 50 | - private final Set<DependencyCycle> cycles = new HashSet<>(); | ||
| 51 | - private final Set<Dependency> cycleSegments = new HashSet<>(); | ||
| 52 | - private final Map<JavaPackage, Set<DependencyCycle>> packageCycles = new HashMap<>(); | ||
| 53 | - private final Map<JavaPackage, Set<Dependency>> packageCycleSegments = new HashMap<>(); | ||
| 54 | - | ||
| 55 | - /** | ||
| 56 | - * Loads the catalog from the specified catalog file. | ||
| 57 | - * | ||
| 58 | - * @param catalogPath catalog file path | ||
| 59 | - * @throws IOException if unable to read the catalog file | ||
| 60 | - */ | ||
| 61 | - public void load(String catalogPath) throws IOException { | ||
| 62 | - InputStream is = new FileInputStream(catalogPath); | ||
| 63 | - BufferedReader br = new BufferedReader(new InputStreamReader(is)); | ||
| 64 | - | ||
| 65 | - String line; | ||
| 66 | - while ((line = br.readLine()) != null) { | ||
| 67 | - // Split the line into the two fields: path and pragmas | ||
| 68 | - String fields[] = line.trim().split(":"); | ||
| 69 | - if (fields.length <= 1) { | ||
| 70 | - continue; | ||
| 71 | - } | ||
| 72 | - String path = fields[0]; | ||
| 73 | - | ||
| 74 | - // Now split the pragmas on whitespace and trim punctuation | ||
| 75 | - String pragma[] = fields[1].trim().replaceAll("[;\n\r]", "").split("[\t ]"); | ||
| 76 | - | ||
| 77 | - // Locate (or create) Java source entity based on the path | ||
| 78 | - JavaSource source = getOrCreateSource(path); | ||
| 79 | - | ||
| 80 | - // Now process the package or import statements | ||
| 81 | - if (pragma[0].equals(PACKAGE)) { | ||
| 82 | - processPackageDeclaration(source, pragma[1]); | ||
| 83 | - | ||
| 84 | - } else if (pragma[0].equals(IMPORT)) { | ||
| 85 | - if (pragma[1].equals(STATIC)) { | ||
| 86 | - processImportStatement(source, pragma[2]); | ||
| 87 | - } else { | ||
| 88 | - processImportStatement(source, pragma[1]); | ||
| 89 | - } | ||
| 90 | - } | ||
| 91 | - } | ||
| 92 | - } | ||
| 93 | - | ||
| 94 | - /** | ||
| 95 | - * Analyzes the catalog by resolving imports and identifying circular | ||
| 96 | - * package dependencies. | ||
| 97 | - */ | ||
| 98 | - public void analyze() { | ||
| 99 | - resolveImports(); | ||
| 100 | - findCircularDependencies(); | ||
| 101 | - } | ||
| 102 | - | ||
| 103 | - /** | ||
| 104 | - * Identifies circular package dependencies through what amounts to be a | ||
| 105 | - * depth-first search rooted with each package. | ||
| 106 | - */ | ||
| 107 | - private void findCircularDependencies() { | ||
| 108 | - cycles.clear(); | ||
| 109 | - for (JavaPackage javaPackage : getPackages()) { | ||
| 110 | - findCircularDependencies(javaPackage); | ||
| 111 | - } | ||
| 112 | - | ||
| 113 | - cycleSegments.clear(); | ||
| 114 | - packageCycles.clear(); | ||
| 115 | - packageCycleSegments.clear(); | ||
| 116 | - | ||
| 117 | - for (DependencyCycle cycle : getCycles()) { | ||
| 118 | - recordCycleForPackages(cycle); | ||
| 119 | - cycleSegments.addAll(cycle.getCycleSegments()); | ||
| 120 | - } | ||
| 121 | - } | ||
| 122 | - | ||
| 123 | - /** | ||
| 124 | - * Records the specified cycle into a set for each involved package. | ||
| 125 | - * | ||
| 126 | - * @param cycle cycle to record for involved packages | ||
| 127 | - */ | ||
| 128 | - private void recordCycleForPackages(DependencyCycle cycle) { | ||
| 129 | - for (JavaPackage javaPackage : cycle.getCycle()) { | ||
| 130 | - Set<DependencyCycle> cset = packageCycles.get(javaPackage); | ||
| 131 | - if (cset == null) { | ||
| 132 | - cset = new HashSet<>(); | ||
| 133 | - packageCycles.put(javaPackage, cset); | ||
| 134 | - } | ||
| 135 | - cset.add(cycle); | ||
| 136 | - | ||
| 137 | - Set<Dependency> sset = packageCycleSegments.get(javaPackage); | ||
| 138 | - if (sset == null) { | ||
| 139 | - sset = new HashSet<>(); | ||
| 140 | - packageCycleSegments.put(javaPackage, sset); | ||
| 141 | - } | ||
| 142 | - sset.addAll(cycle.getCycleSegments()); | ||
| 143 | - } | ||
| 144 | - } | ||
| 145 | - | ||
| 146 | - /** | ||
| 147 | - * Identifies circular dependencies in which this package participates | ||
| 148 | - * using depth-first search. | ||
| 149 | - * | ||
| 150 | - * @param javaPackage Java package to inspect for dependency cycles | ||
| 151 | - */ | ||
| 152 | - private void findCircularDependencies(JavaPackage javaPackage) { | ||
| 153 | - // Setup a depth trace anchored at the given java package. | ||
| 154 | - List<JavaPackage> trace = newTrace(new ArrayList<JavaPackage>(), javaPackage); | ||
| 155 | - | ||
| 156 | - Set<JavaPackage> searched = new HashSet<>(); | ||
| 157 | - searchDependencies(javaPackage, trace, searched); | ||
| 158 | - } | ||
| 159 | - | ||
| 160 | - /** | ||
| 161 | - * Generates a new trace using the previous one and a new element | ||
| 162 | - * | ||
| 163 | - * @param trace old search trace | ||
| 164 | - * @param javaPackage package to add to the trace | ||
| 165 | - * @return new search trace | ||
| 166 | - */ | ||
| 167 | - private List<JavaPackage> newTrace(List<JavaPackage> trace, | ||
| 168 | - JavaPackage javaPackage) { | ||
| 169 | - List<JavaPackage> newTrace = new ArrayList<>(trace); | ||
| 170 | - newTrace.add(javaPackage); | ||
| 171 | - return newTrace; | ||
| 172 | - } | ||
| 173 | - | ||
| 174 | - | ||
| 175 | - /** | ||
| 176 | - * Recursive depth-first search through dependency tree | ||
| 177 | - * | ||
| 178 | - * @param javaPackage java package being searched currently | ||
| 179 | - * @param trace search trace | ||
| 180 | - * @param searched set of java packages already searched | ||
| 181 | - */ | ||
| 182 | - private void searchDependencies(JavaPackage javaPackage, | ||
| 183 | - List<JavaPackage> trace, | ||
| 184 | - Set<JavaPackage> searched) { | ||
| 185 | - if (!searched.contains(javaPackage)) { | ||
| 186 | - searched.add(javaPackage); | ||
| 187 | - for (JavaPackage dependency : javaPackage.getDependencies()) { | ||
| 188 | - if (trace.contains(dependency)) { | ||
| 189 | - cycles.add(new DependencyCycle(trace, dependency)); | ||
| 190 | - } else { | ||
| 191 | - searchDependencies(dependency, newTrace(trace, dependency), searched); | ||
| 192 | - } | ||
| 193 | - } | ||
| 194 | - } | ||
| 195 | - } | ||
| 196 | - | ||
| 197 | - /** | ||
| 198 | - * Resolves import names of Java sources into imports of entities known | ||
| 199 | - * to this catalog. All other import names will be ignored. | ||
| 200 | - */ | ||
| 201 | - private void resolveImports() { | ||
| 202 | - for (JavaPackage javaPackage : getPackages()) { | ||
| 203 | - Set<JavaPackage> dependencies = new HashSet<>(); | ||
| 204 | - for (JavaSource source : javaPackage.getSources()) { | ||
| 205 | - Set<JavaEntity> imports = resolveImports(source); | ||
| 206 | - source.setImports(imports); | ||
| 207 | - dependencies.addAll(importedPackages(imports)); | ||
| 208 | - } | ||
| 209 | - javaPackage.setDependencies(dependencies); | ||
| 210 | - } | ||
| 211 | - } | ||
| 212 | - | ||
| 213 | - /** | ||
| 214 | - * Produces a set of imported Java packages from the specified set of | ||
| 215 | - * Java source entities. | ||
| 216 | - * | ||
| 217 | - * @param imports list of imported Java source entities | ||
| 218 | - * @return list of imported Java packages | ||
| 219 | - */ | ||
| 220 | - private Set<JavaPackage> importedPackages(Set<JavaEntity> imports) { | ||
| 221 | - Set<JavaPackage> packages = new HashSet<>(); | ||
| 222 | - for (JavaEntity entity : imports) { | ||
| 223 | - packages.add(entity instanceof JavaPackage ? (JavaPackage) entity : | ||
| 224 | - ((JavaSource) entity).getPackage()); | ||
| 225 | - } | ||
| 226 | - return packages; | ||
| 227 | - } | ||
| 228 | - | ||
| 229 | - /** | ||
| 230 | - * Resolves import names of the specified Java source into imports of | ||
| 231 | - * entities known to this catalog. All other import names will be ignored. | ||
| 232 | - * | ||
| 233 | - * @param source Java source | ||
| 234 | - * @return list of resolved imports | ||
| 235 | - */ | ||
| 236 | - private Set<JavaEntity> resolveImports(JavaSource source) { | ||
| 237 | - Set<JavaEntity> imports = new HashSet<>(); | ||
| 238 | - for (String importName : source.getImportNames()) { | ||
| 239 | - JavaEntity entity = importName.matches(WILDCARD) ? | ||
| 240 | - getPackage(importName.replaceAll(WILDCARD, "")) : | ||
| 241 | - getSource(importName); | ||
| 242 | - if (entity != null) { | ||
| 243 | - imports.add(entity); | ||
| 244 | - } | ||
| 245 | - } | ||
| 246 | - return imports; | ||
| 247 | - } | ||
| 248 | - | ||
| 249 | - /** | ||
| 250 | - * Returns either an existing or a newly created Java package. | ||
| 251 | - * | ||
| 252 | - * @param packageName Java package name | ||
| 253 | - * @return Java package | ||
| 254 | - */ | ||
| 255 | - private JavaPackage getOrCreatePackage(String packageName) { | ||
| 256 | - JavaPackage javaPackage = packages.get(packageName); | ||
| 257 | - if (javaPackage == null) { | ||
| 258 | - javaPackage = new JavaPackage(packageName); | ||
| 259 | - packages.put(packageName, javaPackage); | ||
| 260 | - } | ||
| 261 | - return javaPackage; | ||
| 262 | - } | ||
| 263 | - | ||
| 264 | - /** | ||
| 265 | - * Returns either an existing or a newly created Java source. | ||
| 266 | - * | ||
| 267 | - * @param path Java source path | ||
| 268 | - * @return Java source | ||
| 269 | - */ | ||
| 270 | - private JavaSource getOrCreateSource(String path) { | ||
| 271 | - String name = nameFromPath(path); | ||
| 272 | - JavaSource source = sources.get(name); | ||
| 273 | - if (source == null) { | ||
| 274 | - source = new JavaSource(name, path); | ||
| 275 | - sources.put(name, source); | ||
| 276 | - } | ||
| 277 | - return source; | ||
| 278 | - } | ||
| 279 | - | ||
| 280 | - /** | ||
| 281 | - * Extracts a fully qualified source class name from the given path. | ||
| 282 | - * <p> | ||
| 283 | - * For now, this implementation assumes standard Maven source structure | ||
| 284 | - * and thus will look for start of package name under 'src/main/java/'. | ||
| 285 | - * If it will not find such a prefix, it will simply return the path as | ||
| 286 | - * the name. | ||
| 287 | - * | ||
| 288 | - * @param path source path | ||
| 289 | - * @return source name | ||
| 290 | - */ | ||
| 291 | - private String nameFromPath(String path) { | ||
| 292 | - int i = path.indexOf(SRC_ROOT); | ||
| 293 | - String name = i < 0 ? path : path.substring(i + SRC_ROOT.length()); | ||
| 294 | - return name.replaceAll("\\.java$", "").replace("/", "."); | ||
| 295 | - } | ||
| 296 | - | ||
| 297 | - /** | ||
| 298 | - * Processes the package declaration pragma for the given source. | ||
| 299 | - * | ||
| 300 | - * @param source Java source | ||
| 301 | - * @param packageName Java package name | ||
| 302 | - */ | ||
| 303 | - private void processPackageDeclaration(JavaSource source, String packageName) { | ||
| 304 | - JavaPackage javaPackage = getOrCreatePackage(packageName); | ||
| 305 | - source.setPackage(javaPackage); | ||
| 306 | - javaPackage.addSource(source); | ||
| 307 | - } | ||
| 308 | - | ||
| 309 | - /** | ||
| 310 | - * Processes the import pragma for the given source. | ||
| 311 | - * | ||
| 312 | - * @param source Java source | ||
| 313 | - * @param name name of the Java entity being imported (class or package) | ||
| 314 | - */ | ||
| 315 | - private void processImportStatement(JavaSource source, String name) { | ||
| 316 | - source.addImportName(name); | ||
| 317 | - } | ||
| 318 | - | ||
| 319 | - /** | ||
| 320 | - * Returns the collection of java sources. | ||
| 321 | - * | ||
| 322 | - * @return collection of java sources | ||
| 323 | - */ | ||
| 324 | - public Collection<JavaSource> getSources() { | ||
| 325 | - return Collections.unmodifiableCollection(sources.values()); | ||
| 326 | - } | ||
| 327 | - | ||
| 328 | - /** | ||
| 329 | - * Returns the Java source with the specified name. | ||
| 330 | - * | ||
| 331 | - * @param name Java source name | ||
| 332 | - * @return Java source | ||
| 333 | - */ | ||
| 334 | - public JavaSource getSource(String name) { | ||
| 335 | - return sources.get(name); | ||
| 336 | - } | ||
| 337 | - | ||
| 338 | - /** | ||
| 339 | - * Returns the collection of all Java packages. | ||
| 340 | - * | ||
| 341 | - * @return collection of java packages | ||
| 342 | - */ | ||
| 343 | - public Collection<JavaPackage> getPackages() { | ||
| 344 | - return Collections.unmodifiableCollection(packages.values()); | ||
| 345 | - } | ||
| 346 | - | ||
| 347 | - /** | ||
| 348 | - * Returns the set of all Java package dependency cycles. | ||
| 349 | - * | ||
| 350 | - * @return set of dependency cycles | ||
| 351 | - */ | ||
| 352 | - public Set<DependencyCycle> getCycles() { | ||
| 353 | - return Collections.unmodifiableSet(cycles); | ||
| 354 | - } | ||
| 355 | - | ||
| 356 | - /** | ||
| 357 | - * Returns the set of all Java package dependency cycle segments. | ||
| 358 | - * | ||
| 359 | - * @return set of dependency cycle segments | ||
| 360 | - */ | ||
| 361 | - public Set<Dependency> getCycleSegments() { | ||
| 362 | - return Collections.unmodifiableSet(cycleSegments); | ||
| 363 | - } | ||
| 364 | - | ||
| 365 | - /** | ||
| 366 | - * Returns the set of dependency cycles which involve the specified package. | ||
| 367 | - * | ||
| 368 | - * @param javaPackage java package | ||
| 369 | - * @return set of dependency cycles | ||
| 370 | - */ | ||
| 371 | - public Set<DependencyCycle> getPackageCycles(JavaPackage javaPackage) { | ||
| 372 | - Set<DependencyCycle> set = packageCycles.get(javaPackage); | ||
| 373 | - return Collections.unmodifiableSet(set == null ? new HashSet<DependencyCycle>() : set); | ||
| 374 | - } | ||
| 375 | - | ||
| 376 | - /** | ||
| 377 | - * Returns the set of dependency cycle segments which involve the specified package. | ||
| 378 | - * | ||
| 379 | - * @param javaPackage java package | ||
| 380 | - * @return set of dependency cycle segments | ||
| 381 | - */ | ||
| 382 | - public Set<Dependency> getPackageCycleSegments(JavaPackage javaPackage) { | ||
| 383 | - Set<Dependency> set = packageCycleSegments.get(javaPackage); | ||
| 384 | - return Collections.unmodifiableSet(set == null ? new HashSet<Dependency>() : set); | ||
| 385 | - } | ||
| 386 | - | ||
| 387 | - /** | ||
| 388 | - * Returns the Java package with the specified name. | ||
| 389 | - * | ||
| 390 | - * @param name Java package name | ||
| 391 | - * @return Java package | ||
| 392 | - */ | ||
| 393 | - public JavaPackage getPackage(String name) { | ||
| 394 | - return packages.get(name); | ||
| 395 | - } | ||
| 396 | - | ||
| 397 | - @Override | ||
| 398 | - public String toString() { | ||
| 399 | - return toStringHelper(this) | ||
| 400 | - .add("packages", packages.size()) | ||
| 401 | - .add("sources", sources.size()) | ||
| 402 | - .add("cycles", cycles.size()) | ||
| 403 | - .add("cycleSegments", cycleSegments.size()).toString(); | ||
| 404 | - } | ||
| 405 | - | ||
| 406 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import java.util.Objects; | ||
| 19 | - | ||
| 20 | -import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 21 | - | ||
| 22 | -/** | ||
| 23 | - * Abstraction of a dependency segment. | ||
| 24 | - * | ||
| 25 | - * @author Thomas Vachuska | ||
| 26 | - */ | ||
| 27 | -public class Dependency { | ||
| 28 | - | ||
| 29 | - private final JavaPackage source; | ||
| 30 | - private final JavaPackage target; | ||
| 31 | - | ||
| 32 | - /** | ||
| 33 | - * Creates a dependency from the specified source on the given target. | ||
| 34 | - * | ||
| 35 | - * @param source source of the dependency | ||
| 36 | - * @param target target of the dependency | ||
| 37 | - */ | ||
| 38 | - public Dependency(JavaPackage source, JavaPackage target) { | ||
| 39 | - this.source = source; | ||
| 40 | - this.target = target; | ||
| 41 | - } | ||
| 42 | - | ||
| 43 | - /** | ||
| 44 | - * Returns the dependency source. | ||
| 45 | - * | ||
| 46 | - * @return source Java package | ||
| 47 | - */ | ||
| 48 | - public JavaPackage getSource() { | ||
| 49 | - return source; | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - /** | ||
| 53 | - * Returns the dependency target. | ||
| 54 | - * | ||
| 55 | - * @return target Java package | ||
| 56 | - */ | ||
| 57 | - public JavaPackage getTarget() { | ||
| 58 | - return target; | ||
| 59 | - } | ||
| 60 | - | ||
| 61 | - @Override | ||
| 62 | - public boolean equals(Object obj) { | ||
| 63 | - if (obj instanceof Dependency) { | ||
| 64 | - Dependency that = (Dependency) obj; | ||
| 65 | - return Objects.equals(source, that.source) && | ||
| 66 | - Objects.equals(target, that.target); | ||
| 67 | - } | ||
| 68 | - return false; | ||
| 69 | - } | ||
| 70 | - | ||
| 71 | - @Override | ||
| 72 | - public int hashCode() { | ||
| 73 | - return Objects.hash(source, target); | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - @Override | ||
| 77 | - public String toString() { | ||
| 78 | - return toStringHelper(this) | ||
| 79 | - .add("source", source).add("target", target).toString(); | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import java.util.ArrayList; | ||
| 19 | -import java.util.Collections; | ||
| 20 | -import java.util.List; | ||
| 21 | -import java.util.Objects; | ||
| 22 | - | ||
| 23 | -import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 24 | - | ||
| 25 | -/** | ||
| 26 | - * Simple representation of a Java package dependency cycle. | ||
| 27 | - */ | ||
| 28 | -public class DependencyCycle { | ||
| 29 | - | ||
| 30 | - private final List<JavaPackage> cycle; | ||
| 31 | - | ||
| 32 | - /** | ||
| 33 | - * Creates a normalized dependency cycle represented by the specified list | ||
| 34 | - * of Java packages, which are expected to be given in order of dependency. | ||
| 35 | - * List is assumed to be non-empty. | ||
| 36 | - * | ||
| 37 | - * @param cycle list of Java packages in the dependency cycle | ||
| 38 | - * @param cause Java package that caused the cycle | ||
| 39 | - */ | ||
| 40 | - DependencyCycle(List<JavaPackage> cycle, JavaPackage cause) { | ||
| 41 | - this.cycle = normalize(cycle, cause); | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | - /** | ||
| 45 | - * Produces a normalized dependency cycle list. Normalization is performed | ||
| 46 | - * by rotating the list so that the package with the least lexicographic | ||
| 47 | - * name is at the start of the list. | ||
| 48 | - * | ||
| 49 | - * @param cycle list of Java packages in the dependency cycle | ||
| 50 | - * @param cause Java package that caused the cycle | ||
| 51 | - * @return normalized cycle | ||
| 52 | - */ | ||
| 53 | - private List<JavaPackage> normalize(List<JavaPackage> cycle, JavaPackage cause) { | ||
| 54 | - int start = cycle.indexOf(cause); | ||
| 55 | - List<JavaPackage> clone = new ArrayList<>(cycle.subList(start, cycle.size())); | ||
| 56 | - int leastIndex = findIndexOfLeastName(clone); | ||
| 57 | - Collections.rotate(clone, -leastIndex); | ||
| 58 | - return Collections.unmodifiableList(clone); | ||
| 59 | - } | ||
| 60 | - | ||
| 61 | - /** | ||
| 62 | - * Returns the index of the Java package with the least name. | ||
| 63 | - * | ||
| 64 | - * @param cycle list of Java packages in the dependency cycle | ||
| 65 | - * @return index of the least Java package name | ||
| 66 | - */ | ||
| 67 | - private int findIndexOfLeastName(List<JavaPackage> cycle) { | ||
| 68 | - int leastIndex = 0; | ||
| 69 | - String leastName = cycle.get(leastIndex).name(); | ||
| 70 | - for (int i = 1, n = cycle.size(); i < n; i++) { | ||
| 71 | - JavaPackage javaPackage = cycle.get(i); | ||
| 72 | - if (leastName.compareTo(javaPackage.name()) > 0) { | ||
| 73 | - leastIndex = i; | ||
| 74 | - leastName = javaPackage.name(); | ||
| 75 | - } | ||
| 76 | - } | ||
| 77 | - return leastIndex; | ||
| 78 | - } | ||
| 79 | - | ||
| 80 | - /** | ||
| 81 | - * Returns the normalized Java package dependency cycle | ||
| 82 | - * | ||
| 83 | - * @return list of packages in the dependency cycle | ||
| 84 | - */ | ||
| 85 | - public List<JavaPackage> getCycle() { | ||
| 86 | - return cycle; | ||
| 87 | - } | ||
| 88 | - | ||
| 89 | - /** | ||
| 90 | - * Returns the dependency cycle in form of individual dependencies. | ||
| 91 | - * | ||
| 92 | - * @return list of dependencies forming the cycle | ||
| 93 | - */ | ||
| 94 | - public List<Dependency> getCycleSegments() { | ||
| 95 | - List<Dependency> dependencies = new ArrayList<>(); | ||
| 96 | - for (int i = 0, n = cycle.size(); i < n; i++) { | ||
| 97 | - dependencies.add(new Dependency(cycle.get(i), cycle.get(i < n - 1 ? i + 1 : 0))); | ||
| 98 | - } | ||
| 99 | - return dependencies; | ||
| 100 | - } | ||
| 101 | - | ||
| 102 | - @Override | ||
| 103 | - public boolean equals(Object o) { | ||
| 104 | - if (o instanceof DependencyCycle) { | ||
| 105 | - DependencyCycle that = (DependencyCycle) o; | ||
| 106 | - return Objects.equals(cycle, that.cycle); | ||
| 107 | - } | ||
| 108 | - return false; | ||
| 109 | - } | ||
| 110 | - | ||
| 111 | - @Override | ||
| 112 | - public int hashCode() { | ||
| 113 | - return cycle.hashCode(); | ||
| 114 | - } | ||
| 115 | - | ||
| 116 | - @Override | ||
| 117 | - public String toString() { | ||
| 118 | - return toStringHelper(this).add("cycle", cycle).toString(); | ||
| 119 | - } | ||
| 120 | - | ||
| 121 | - public String toShortString() { | ||
| 122 | - StringBuilder sb = new StringBuilder("["); | ||
| 123 | - for (JavaPackage javaPackage : cycle) { | ||
| 124 | - sb.append(javaPackage.name()).append(", "); | ||
| 125 | - } | ||
| 126 | - if (sb.length() > 1) { | ||
| 127 | - sb.delete(sb.length() - 2, sb.length()); | ||
| 128 | - } | ||
| 129 | - sb.append("]"); | ||
| 130 | - return sb.toString(); | ||
| 131 | - } | ||
| 132 | - | ||
| 133 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import com.fasterxml.jackson.databind.JsonNode; | ||
| 19 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
| 20 | -import com.fasterxml.jackson.databind.ObjectWriter; | ||
| 21 | -import com.fasterxml.jackson.databind.node.ArrayNode; | ||
| 22 | -import com.fasterxml.jackson.databind.node.ObjectNode; | ||
| 23 | - | ||
| 24 | -import java.io.BufferedReader; | ||
| 25 | -import java.io.FileWriter; | ||
| 26 | -import java.io.IOException; | ||
| 27 | -import java.io.InputStream; | ||
| 28 | -import java.io.InputStreamReader; | ||
| 29 | -import java.util.Set; | ||
| 30 | - | ||
| 31 | -/** | ||
| 32 | - * Generator of a self-contained HTML file which serves as a GUI for | ||
| 33 | - * visualizing Java package dependencies carried in the supplied catalog. | ||
| 34 | - * | ||
| 35 | - * The HTML file is an adaptation of D3.js Hierarchical Edge Bundling as | ||
| 36 | - * shown at http://bl.ocks.org/mbostock/7607999. | ||
| 37 | - * | ||
| 38 | - * @author Thomas Vachuska | ||
| 39 | - */ | ||
| 40 | -public class DependencyViewer { | ||
| 41 | - | ||
| 42 | - private static final String JPD_EXT = ".db"; | ||
| 43 | - private static final String HTML_EXT = ".html"; | ||
| 44 | - | ||
| 45 | - private static final String INDEX = "index.html"; | ||
| 46 | - private static final String D3JS = "d3.v3.min.js"; | ||
| 47 | - | ||
| 48 | - private static final String TITLE_PLACEHOLDER = "TITLE_PLACEHOLDER"; | ||
| 49 | - private static final String D3JS_PLACEHOLDER = "D3JS_PLACEHOLDER"; | ||
| 50 | - private static final String DATA_PLACEHOLDER = "DATA_PLACEHOLDER"; | ||
| 51 | - | ||
| 52 | - private final Catalog catalog; | ||
| 53 | - | ||
| 54 | - /** | ||
| 55 | - * Creates a Java package dependency viewer. | ||
| 56 | - * | ||
| 57 | - * @param catalog dependency catalog | ||
| 58 | - */ | ||
| 59 | - public DependencyViewer(Catalog catalog) { | ||
| 60 | - this.catalog = catalog; | ||
| 61 | - } | ||
| 62 | - | ||
| 63 | - /** | ||
| 64 | - * Main program entry point. | ||
| 65 | - * | ||
| 66 | - * @param args command line arguments | ||
| 67 | - */ | ||
| 68 | - public static void main(String[] args) { | ||
| 69 | - Catalog cat = new Catalog(); | ||
| 70 | - DependencyViewer viewer = new DependencyViewer(cat); | ||
| 71 | - try { | ||
| 72 | - String path = args[0]; | ||
| 73 | - cat.load(path + JPD_EXT); | ||
| 74 | - cat.analyze(); | ||
| 75 | - | ||
| 76 | - System.err.println(cat); | ||
| 77 | - viewer.dumpLongestCycle(cat); | ||
| 78 | - viewer.writeHTMLFile(path); | ||
| 79 | - } catch (IOException e) { | ||
| 80 | - System.err.println("Unable to process catalog: " + e.getMessage()); | ||
| 81 | - } | ||
| 82 | - } | ||
| 83 | - | ||
| 84 | - /** | ||
| 85 | - * Prints out the longest cycle; just for kicks. | ||
| 86 | - * @param cat catalog | ||
| 87 | - */ | ||
| 88 | - private void dumpLongestCycle(Catalog cat) { | ||
| 89 | - DependencyCycle longest = null; | ||
| 90 | - for (DependencyCycle cycle : cat.getCycles()) { | ||
| 91 | - if (longest == null || longest.getCycleSegments().size() < cycle.getCycleSegments().size()) { | ||
| 92 | - longest = cycle; | ||
| 93 | - } | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - if (longest != null) { | ||
| 97 | - for (Dependency dependency : longest.getCycleSegments()) { | ||
| 98 | - System.out.println(dependency); | ||
| 99 | - } | ||
| 100 | - } | ||
| 101 | - } | ||
| 102 | - | ||
| 103 | - /** | ||
| 104 | - * Writes the HTML catalog file for the given viewer. | ||
| 105 | - * | ||
| 106 | - * @param path base file path | ||
| 107 | - * @throws IOException if issues encountered writing the HTML file | ||
| 108 | - */ | ||
| 109 | - public void writeHTMLFile(String path) throws IOException { | ||
| 110 | - String index = slurp(getClass().getResourceAsStream(INDEX)); | ||
| 111 | - String d3js = slurp(getClass().getResourceAsStream(D3JS)); | ||
| 112 | - | ||
| 113 | - FileWriter fw = new FileWriter(path + HTML_EXT); | ||
| 114 | - ObjectWriter writer = new ObjectMapper().writer(); // .writerWithDefaultPrettyPrinter(); | ||
| 115 | - fw.write(index.replace(TITLE_PLACEHOLDER, path) | ||
| 116 | - .replace(D3JS_PLACEHOLDER, d3js) | ||
| 117 | - .replace(DATA_PLACEHOLDER, writer.writeValueAsString(toJson()))); | ||
| 118 | - fw.close(); | ||
| 119 | - } | ||
| 120 | - | ||
| 121 | - /** | ||
| 122 | - * Slurps the specified input stream into a string. | ||
| 123 | - * | ||
| 124 | - * @param stream input stream to be read | ||
| 125 | - * @return string containing the contents of the input stream | ||
| 126 | - * @throws IOException if issues encountered reading from the stream | ||
| 127 | - */ | ||
| 128 | - static String slurp(InputStream stream) throws IOException { | ||
| 129 | - StringBuilder sb = new StringBuilder(); | ||
| 130 | - BufferedReader br = new BufferedReader(new InputStreamReader(stream)); | ||
| 131 | - String line; | ||
| 132 | - while ((line = br.readLine()) != null) { | ||
| 133 | - sb.append(line).append(System.lineSeparator()); | ||
| 134 | - } | ||
| 135 | - br.close(); | ||
| 136 | - return sb.toString(); | ||
| 137 | - } | ||
| 138 | - | ||
| 139 | - // Produces a JSON structure designed to drive the hierarchical visual | ||
| 140 | - // representation of Java package dependencies and any dependency cycles | ||
| 141 | - private JsonNode toJson() { | ||
| 142 | - ObjectMapper mapper = new ObjectMapper(); | ||
| 143 | - ObjectNode root = mapper.createObjectNode(); | ||
| 144 | - root.put("packages", jsonPackages(mapper)); | ||
| 145 | - root.put("cycleSegments", jsonCycleSegments(mapper, catalog.getCycleSegments())); | ||
| 146 | - root.put("summary", jsonSummary(mapper)); | ||
| 147 | - return root; | ||
| 148 | - } | ||
| 149 | - | ||
| 150 | - // Produces a JSON summary of dependencies | ||
| 151 | - private JsonNode jsonSummary(ObjectMapper mapper) { | ||
| 152 | - ObjectNode summary = mapper.createObjectNode(); | ||
| 153 | - summary.put("packages", catalog.getPackages().size()); | ||
| 154 | - summary.put("sources", catalog.getSources().size()); | ||
| 155 | - summary.put("cycles", catalog.getCycles().size()); | ||
| 156 | - summary.put("cycleSegments", catalog.getCycleSegments().size()); | ||
| 157 | - return summary; | ||
| 158 | - } | ||
| 159 | - | ||
| 160 | - // Produces a JSON structure with package dependency data | ||
| 161 | - private JsonNode jsonPackages(ObjectMapper mapper) { | ||
| 162 | - ArrayNode packages = mapper.createArrayNode(); | ||
| 163 | - for (JavaPackage javaPackage : catalog.getPackages()) { | ||
| 164 | - packages.add(json(mapper, javaPackage)); | ||
| 165 | - } | ||
| 166 | - return packages; | ||
| 167 | - } | ||
| 168 | - | ||
| 169 | - // Produces a JSON structure with all cyclic segments | ||
| 170 | - private JsonNode jsonCycleSegments(ObjectMapper mapper, | ||
| 171 | - Set<Dependency> segments) { | ||
| 172 | - ObjectNode cyclicSegments = mapper.createObjectNode(); | ||
| 173 | - for (Dependency dependency : segments) { | ||
| 174 | - String s = dependency.getSource().name(); | ||
| 175 | - String t = dependency.getTarget().name(); | ||
| 176 | - cyclicSegments.put(t + "-" + s, | ||
| 177 | - mapper.createObjectNode().put("s", s).put("t", t)); | ||
| 178 | - } | ||
| 179 | - return cyclicSegments; | ||
| 180 | - } | ||
| 181 | - | ||
| 182 | - // Produces a JSON object structure describing the specified Java package. | ||
| 183 | - private JsonNode json(ObjectMapper mapper, JavaPackage javaPackage) { | ||
| 184 | - ObjectNode node = mapper.createObjectNode(); | ||
| 185 | - | ||
| 186 | - ArrayNode imports = mapper.createArrayNode(); | ||
| 187 | - for (JavaPackage dependency : javaPackage.getDependencies()) { | ||
| 188 | - imports.add(dependency.name()); | ||
| 189 | - } | ||
| 190 | - | ||
| 191 | - Set<DependencyCycle> packageCycles = catalog.getPackageCycles(javaPackage); | ||
| 192 | - Set<Dependency> packageCycleSegments = catalog.getPackageCycleSegments(javaPackage); | ||
| 193 | - | ||
| 194 | - node.put("name", javaPackage.name()); | ||
| 195 | - node.put("size", javaPackage.getSources().size()); | ||
| 196 | - node.put("imports", imports); | ||
| 197 | - node.put("cycleSegments", jsonCycleSegments(mapper, packageCycleSegments)); | ||
| 198 | - node.put("cycleCount", packageCycles.size()); | ||
| 199 | - node.put("cycleSegmentCount", packageCycleSegments.size()); | ||
| 200 | - return node; | ||
| 201 | - } | ||
| 202 | - | ||
| 203 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import java.util.Objects; | ||
| 19 | - | ||
| 20 | -/** | ||
| 21 | - * Abstraction of a Java source entity. | ||
| 22 | - */ | ||
| 23 | -public abstract class JavaEntity { | ||
| 24 | - | ||
| 25 | - private final String name; | ||
| 26 | - | ||
| 27 | - /** | ||
| 28 | - * Creates a new Java source entity with the given name. | ||
| 29 | - * | ||
| 30 | - * @param name source entity name | ||
| 31 | - */ | ||
| 32 | - JavaEntity(String name) { | ||
| 33 | - this.name = name; | ||
| 34 | - } | ||
| 35 | - | ||
| 36 | - /** | ||
| 37 | - * Returns the Java source entity name. | ||
| 38 | - * | ||
| 39 | - * @return source entity name | ||
| 40 | - */ | ||
| 41 | - public String name() { | ||
| 42 | - return name; | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | - @Override | ||
| 46 | - public boolean equals(Object o) { | ||
| 47 | - if (o instanceof JavaEntity) { | ||
| 48 | - JavaEntity that = (JavaEntity) o; | ||
| 49 | - return getClass().equals(that.getClass()) && | ||
| 50 | - Objects.equals(name, that.name); | ||
| 51 | - } | ||
| 52 | - return false; | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | - @Override | ||
| 56 | - public int hashCode() { | ||
| 57 | - return Objects.hash(name); | ||
| 58 | - } | ||
| 59 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import java.util.Collections; | ||
| 19 | -import java.util.HashSet; | ||
| 20 | -import java.util.Set; | ||
| 21 | - | ||
| 22 | -import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 23 | - | ||
| 24 | -/** | ||
| 25 | - * Simple abstraction of a Java package for the purpose of tracking | ||
| 26 | - * dependencies and requirements. | ||
| 27 | - * | ||
| 28 | - * @author Thomas Vachuska | ||
| 29 | - */ | ||
| 30 | -public class JavaPackage extends JavaEntity { | ||
| 31 | - | ||
| 32 | - private final Set<JavaSource> sources = new HashSet<>(); | ||
| 33 | - private Set<JavaPackage> dependencies; | ||
| 34 | - | ||
| 35 | - /** | ||
| 36 | - * Creates a new Java package. | ||
| 37 | - * | ||
| 38 | - * @param name java package file name | ||
| 39 | - */ | ||
| 40 | - JavaPackage(String name) { | ||
| 41 | - super(name); | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | - /** | ||
| 45 | - * Returns the set of sources contained in this Java package. | ||
| 46 | - * | ||
| 47 | - * @return set of Java sources | ||
| 48 | - */ | ||
| 49 | - public Set<JavaSource> getSources() { | ||
| 50 | - return Collections.unmodifiableSet(sources); | ||
| 51 | - } | ||
| 52 | - | ||
| 53 | - /** | ||
| 54 | - * Adds the specified Java source to the package. Only possible if the | ||
| 55 | - * Java package of the source is the same as this Java package. | ||
| 56 | - * | ||
| 57 | - * @param source Java source to be added | ||
| 58 | - */ | ||
| 59 | - void addSource(JavaSource source) { | ||
| 60 | - if (source.getPackage().equals(this)) { | ||
| 61 | - sources.add(source); | ||
| 62 | - } | ||
| 63 | - } | ||
| 64 | - | ||
| 65 | - /** | ||
| 66 | - * Returns the set of packages directly required by this package. | ||
| 67 | - * | ||
| 68 | - * @return set of Java package dependencies | ||
| 69 | - */ | ||
| 70 | - Set<JavaPackage> getDependencies() { | ||
| 71 | - return dependencies; | ||
| 72 | - } | ||
| 73 | - | ||
| 74 | - /** | ||
| 75 | - * Sets the set of resolved Java packages on which this package dependens. | ||
| 76 | - * | ||
| 77 | - * @param dependencies set of resolved Java packages | ||
| 78 | - */ | ||
| 79 | - void setDependencies(Set<JavaPackage> dependencies) { | ||
| 80 | - if (this.dependencies == null) { | ||
| 81 | - this.dependencies = Collections.unmodifiableSet(new HashSet<>(dependencies)); | ||
| 82 | - } | ||
| 83 | - } | ||
| 84 | - | ||
| 85 | - @Override | ||
| 86 | - public String toString() { | ||
| 87 | - return toStringHelper(this) | ||
| 88 | - .add("name", name()) | ||
| 89 | - .add("sources", sources.size()) | ||
| 90 | - .add("dependencies", (dependencies != null ? dependencies.size() : 0)) | ||
| 91 | - .toString(); | ||
| 92 | - } | ||
| 93 | - | ||
| 94 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import java.util.*; | ||
| 19 | - | ||
| 20 | -import static com.google.common.base.MoreObjects.toStringHelper; | ||
| 21 | - | ||
| 22 | -/** | ||
| 23 | - * Simple abstraction of a Java source file for the purpose of tracking | ||
| 24 | - * dependencies and requirements. | ||
| 25 | - * | ||
| 26 | - * @author Thomas Vachuska | ||
| 27 | - */ | ||
| 28 | -public class JavaSource extends JavaEntity { | ||
| 29 | - | ||
| 30 | - private String path; | ||
| 31 | - private JavaPackage javaPackage; | ||
| 32 | - | ||
| 33 | - private final Set<String> importNames = new HashSet<>(); | ||
| 34 | - private Set<JavaEntity> imports; | ||
| 35 | - | ||
| 36 | - /** | ||
| 37 | - * Creates a new Java source entity. | ||
| 38 | - * | ||
| 39 | - * @param name java source file name | ||
| 40 | - * @param path source file path | ||
| 41 | - */ | ||
| 42 | - JavaSource(String name, String path) { | ||
| 43 | - super(name); | ||
| 44 | - this.path = path; | ||
| 45 | - } | ||
| 46 | - | ||
| 47 | - /** | ||
| 48 | - * Returns the Java package for this Java source. | ||
| 49 | - * | ||
| 50 | - * @return Java package | ||
| 51 | - */ | ||
| 52 | - public JavaPackage getPackage() { | ||
| 53 | - return javaPackage; | ||
| 54 | - } | ||
| 55 | - | ||
| 56 | - /** | ||
| 57 | - * Sets the Java package for this Java source. | ||
| 58 | - * | ||
| 59 | - * @param javaPackage Java package | ||
| 60 | - */ | ||
| 61 | - void setPackage(JavaPackage javaPackage) { | ||
| 62 | - if (this.javaPackage == null) { | ||
| 63 | - this.javaPackage = javaPackage; | ||
| 64 | - } | ||
| 65 | - } | ||
| 66 | - | ||
| 67 | - /** | ||
| 68 | - * Returns the set of resolved imports for this Java source | ||
| 69 | - * | ||
| 70 | - * @return set of imports | ||
| 71 | - */ | ||
| 72 | - public Set<JavaEntity> getImports() { | ||
| 73 | - return imports; | ||
| 74 | - } | ||
| 75 | - | ||
| 76 | - /** | ||
| 77 | - * Sets the set of resolved imported Java entities for this source. | ||
| 78 | - * | ||
| 79 | - * @param imports set of resolved Java entities imported by this source | ||
| 80 | - */ | ||
| 81 | - void setImports(Set<JavaEntity> imports) { | ||
| 82 | - if (this.imports == null) { | ||
| 83 | - this.imports = Collections.unmodifiableSet(new HashSet<>(imports)); | ||
| 84 | - } | ||
| 85 | - } | ||
| 86 | - | ||
| 87 | - /** | ||
| 88 | - * Adds a name of an imported, but unresolved, Java entity name. | ||
| 89 | - * | ||
| 90 | - * @param name name of an imported Java entity | ||
| 91 | - */ | ||
| 92 | - void addImportName(String name) { | ||
| 93 | - importNames.add(name); | ||
| 94 | - } | ||
| 95 | - | ||
| 96 | - /** | ||
| 97 | - * Returns the set of imported, but unresolved, Java entity names. | ||
| 98 | - * | ||
| 99 | - * @return set of imported Java entity names | ||
| 100 | - */ | ||
| 101 | - Set<String> getImportNames() { | ||
| 102 | - return importNames; | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - @Override | ||
| 106 | - public String toString() { | ||
| 107 | - return toStringHelper(this) | ||
| 108 | - .add("name", name()) | ||
| 109 | - .add("javaPackage", (javaPackage != null ? javaPackage.name() : "")) | ||
| 110 | - .add("importNames", importNames.size()) | ||
| 111 | - .add("imports", (imports != null ? imports.size() : 0)) | ||
| 112 | - .toString(); | ||
| 113 | - } | ||
| 114 | - | ||
| 115 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | - | ||
| 17 | -/** | ||
| 18 | - * Utility to analyze Java package dependencies. | ||
| 19 | - */ | ||
| 20 | -package org.onlab.jdvue; | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
This diff could not be displayed because it is too large.
| 1 | -<!DOCTYPE html> | ||
| 2 | -<html> | ||
| 3 | -<head> | ||
| 4 | - <meta charset="utf-8"> | ||
| 5 | - <title>TITLE_PLACEHOLDER</title> | ||
| 6 | - <style> | ||
| 7 | - | ||
| 8 | - .node { | ||
| 9 | - font: 300 13px "Helvetica Neue", Helvetica, Arial, sans-serif; | ||
| 10 | - fill: #bbb; | ||
| 11 | - } | ||
| 12 | - | ||
| 13 | - .link { | ||
| 14 | - stroke: steelblue; | ||
| 15 | - stroke-opacity: .4; | ||
| 16 | - fill: none; | ||
| 17 | - pointer-events: none; | ||
| 18 | - } | ||
| 19 | - | ||
| 20 | - .node--focus { | ||
| 21 | - font-weight: 700; | ||
| 22 | - fill: #000; | ||
| 23 | - } | ||
| 24 | - | ||
| 25 | - .node:hover { | ||
| 26 | - fill: steelblue; | ||
| 27 | - } | ||
| 28 | - | ||
| 29 | - .node:hover, | ||
| 30 | - .node--source, | ||
| 31 | - .node--target { | ||
| 32 | - font-weight: 700; | ||
| 33 | - } | ||
| 34 | - | ||
| 35 | - .node--source { | ||
| 36 | - fill: #2ca02c; | ||
| 37 | - } | ||
| 38 | - | ||
| 39 | - .node--target { | ||
| 40 | - fill: #d59800; | ||
| 41 | - } | ||
| 42 | - | ||
| 43 | - .link--source, | ||
| 44 | - .link--target { | ||
| 45 | - stroke-opacity: 1; | ||
| 46 | - stroke-width: 3px; | ||
| 47 | - } | ||
| 48 | - | ||
| 49 | - .link--source { | ||
| 50 | - stroke: #d59800; | ||
| 51 | - } | ||
| 52 | - | ||
| 53 | - .link--target { | ||
| 54 | - stroke: #2ca02c; | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - .link--cycle { | ||
| 58 | - stroke: #ff0000; | ||
| 59 | - } | ||
| 60 | - | ||
| 61 | - .summary { | ||
| 62 | - font: 300 13px "Helvetica Neue", Helvetica, Arial, sans-serif; | ||
| 63 | - position: fixed; | ||
| 64 | - top: 32px; | ||
| 65 | - right: 32px; | ||
| 66 | - width: 192px; | ||
| 67 | - background-color: #ffffff; | ||
| 68 | - box-shadow: 2px 2px 4px 2px #777777; | ||
| 69 | - padding: 5px; | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | - .details { | ||
| 73 | - display: none; | ||
| 74 | - font: 300 13px "Helvetica Neue", Helvetica, Arial, sans-serif; | ||
| 75 | - position: fixed; | ||
| 76 | - top: 220px; | ||
| 77 | - right: 32px; | ||
| 78 | - width: 192px; | ||
| 79 | - background-color: #ffffff; | ||
| 80 | - box-shadow: 2px 2px 4px 2px #777777; | ||
| 81 | - padding: 5px; | ||
| 82 | - } | ||
| 83 | - | ||
| 84 | - .shown { | ||
| 85 | - display:block; | ||
| 86 | - } | ||
| 87 | - | ||
| 88 | - .stat { | ||
| 89 | - text-align: right; | ||
| 90 | - width: 64px; | ||
| 91 | - } | ||
| 92 | - | ||
| 93 | - .title { | ||
| 94 | - font-size: 16px; | ||
| 95 | - font-weight: bold; | ||
| 96 | - } | ||
| 97 | - | ||
| 98 | - #package { | ||
| 99 | - font-size: 14px; | ||
| 100 | - font-weight: bold; | ||
| 101 | - } | ||
| 102 | - </style> | ||
| 103 | -</head> | ||
| 104 | -<body> | ||
| 105 | - <div class="summary"> | ||
| 106 | - <div class="title">Project TITLE_PLACEHOLDER</div> | ||
| 107 | - <table> | ||
| 108 | - <tr> | ||
| 109 | - <td>Sources:</td> | ||
| 110 | - <td id="sourceCount" class="stat"></td> | ||
| 111 | - </tr> | ||
| 112 | - <tr> | ||
| 113 | - <td>Packages:</td> | ||
| 114 | - <td id="packageCount" class="stat"></td> | ||
| 115 | - </tr> | ||
| 116 | - <tr> | ||
| 117 | - <td>Cyclic Segments:</td> | ||
| 118 | - <td id="segmentCount" class="stat"></td> | ||
| 119 | - </tr> | ||
| 120 | - <tr> | ||
| 121 | - <td>Cycles:</td> | ||
| 122 | - <td id="cycleCount" class="stat"></td> | ||
| 123 | - </tr> | ||
| 124 | - </table> | ||
| 125 | - <div><hr size="1"></div> | ||
| 126 | - <div><input type="checkbox"> Highlight cycles</input></div> | ||
| 127 | - <div><input style="width: 95%" type="range" min="0" max="100" value="75"></div> | ||
| 128 | - </div> | ||
| 129 | - <div class="details"> | ||
| 130 | - <div id="package">Package Details</div> | ||
| 131 | - <table> | ||
| 132 | - <tr> | ||
| 133 | - <td>Sources:</td> | ||
| 134 | - <td id="psourceCount" class="stat"></td> | ||
| 135 | - </tr> | ||
| 136 | - <tr> | ||
| 137 | - <td>Dependents:</td> | ||
| 138 | - <td id="pdependentCount" class="stat"></td> | ||
| 139 | - </tr> | ||
| 140 | - <tr> | ||
| 141 | - <td>Cyclic Segments:</td> | ||
| 142 | - <td id="psegmentCount" class="stat"></td> | ||
| 143 | - </tr> | ||
| 144 | - <tr> | ||
| 145 | - <td>Cycles:</td> | ||
| 146 | - <td id="pcycleCount" class="stat"></td> | ||
| 147 | - </tr> | ||
| 148 | - </table> | ||
| 149 | - </div> | ||
| 150 | -<script> | ||
| 151 | -D3JS_PLACEHOLDER | ||
| 152 | - | ||
| 153 | - var catalog = | ||
| 154 | -DATA_PLACEHOLDER | ||
| 155 | - ; | ||
| 156 | - | ||
| 157 | - var diameter = 1000, | ||
| 158 | - radius = diameter / 2, | ||
| 159 | - innerRadius = radius - 300; | ||
| 160 | - | ||
| 161 | - var cluster = d3.layout.cluster() | ||
| 162 | - .size([360, innerRadius]) | ||
| 163 | - .sort(null) | ||
| 164 | - .value(function(d) { return d.size; }); | ||
| 165 | - | ||
| 166 | - var bundle = d3.layout.bundle(); | ||
| 167 | - | ||
| 168 | - var line = d3.svg.line.radial() | ||
| 169 | - .interpolate("bundle") | ||
| 170 | - .tension(.75) | ||
| 171 | - .radius(function(d) { return d.y; }) | ||
| 172 | - .angle(function(d) { return d.x / 180 * Math.PI; }); | ||
| 173 | - | ||
| 174 | - var svg = d3.select("body").append("svg") | ||
| 175 | - .attr("width", diameter) | ||
| 176 | - .attr("height", diameter) | ||
| 177 | - .append("g") | ||
| 178 | - .attr("transform", "translate(" + radius + "," + radius + ")"); | ||
| 179 | - | ||
| 180 | - var link = svg.append("g").selectAll(".link"), | ||
| 181 | - node = svg.append("g").selectAll(".node"), | ||
| 182 | - cycles = {}, highlightCycles, selectedNode; | ||
| 183 | - | ||
| 184 | - function isCyclicLink(l) { | ||
| 185 | - return highlightCycles && | ||
| 186 | - (cycles[l.source.key + "-" + l.target.key] || cycles[l.target.key + "-" + l.source.key]); | ||
| 187 | - } | ||
| 188 | - | ||
| 189 | - function isCyclicPackageLink(l, p) { | ||
| 190 | - var key = l.source.key + "-" + l.target.key, | ||
| 191 | - rKey = l.target.key + "-" + l.source.key; | ||
| 192 | - return isCyclicLink(l) && (p.cycleSegments[key] || p.cycleSegments[rKey]); | ||
| 193 | - } | ||
| 194 | - | ||
| 195 | - function refreshPaths() { | ||
| 196 | - svg.selectAll("path.link").classed("link--cycle", isCyclicLink); | ||
| 197 | - } | ||
| 198 | - | ||
| 199 | - function processCatalog() { | ||
| 200 | - var nodes = cluster.nodes(packageHierarchy(catalog.packages)), | ||
| 201 | - links = packageImports(nodes), | ||
| 202 | - splines = bundle(links); | ||
| 203 | - cycles = catalog.cycleSegments; | ||
| 204 | - | ||
| 205 | - d3.select("input[type=checkbox]").on("change", function() { | ||
| 206 | - highlightCycles = this.checked; | ||
| 207 | - refreshPaths(); | ||
| 208 | - }); | ||
| 209 | - | ||
| 210 | - link = link | ||
| 211 | - .data(splines) | ||
| 212 | - .enter().append("path") | ||
| 213 | - .each(function(d) { d.source = d[0], d.target = d[d.length - 1]; }) | ||
| 214 | - .attr("class", "link") | ||
| 215 | - .classed("link--cycle", isCyclicLink) | ||
| 216 | - .attr("d", function(d, i) { return line(splines[i]); }); | ||
| 217 | - | ||
| 218 | - | ||
| 219 | - node = node | ||
| 220 | - .data(nodes.filter(function(n) { return !n.children; })) | ||
| 221 | - .enter().append("text") | ||
| 222 | - .attr("class", "node") | ||
| 223 | - .attr("dy", ".31em") | ||
| 224 | - .attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + (d.y + 8) + ",0)" + (d.x < 180 ? "" : "rotate(180)"); }) | ||
| 225 | - .style("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; }) | ||
| 226 | - .text(function(d) { return d.key; }) | ||
| 227 | - .on("focus", processSelect) | ||
| 228 | - .on("blur", processSelect); | ||
| 229 | - | ||
| 230 | - d3.select("input[type=range]").on("change", function() { | ||
| 231 | - line.tension(this.value / 100); | ||
| 232 | - svg.selectAll("path.link") | ||
| 233 | - .data(splines) | ||
| 234 | - .attr("d", function(d, i) { return line(splines[i]); }); | ||
| 235 | - }); | ||
| 236 | - | ||
| 237 | - d3.select("#packageCount").text(catalog.summary.packages); | ||
| 238 | - d3.select("#sourceCount").text(catalog.summary.sources); | ||
| 239 | - d3.select("#segmentCount").text(catalog.summary.cycleSegments); | ||
| 240 | - d3.select("#cycleCount").text(catalog.summary.cycles); | ||
| 241 | - } | ||
| 242 | - | ||
| 243 | - function processSelect(d) { | ||
| 244 | - if (selectedNode === d) { | ||
| 245 | - deselected(d); | ||
| 246 | - selectedNode = null; | ||
| 247 | - | ||
| 248 | - } else if (selectedNode) { | ||
| 249 | - deselected(selectedNode); | ||
| 250 | - selectedNode = null; | ||
| 251 | - selected(d); | ||
| 252 | - | ||
| 253 | - } else { | ||
| 254 | - selected(d); | ||
| 255 | - selectedNode = d; | ||
| 256 | - } | ||
| 257 | - } | ||
| 258 | - | ||
| 259 | - function selected(d) { | ||
| 260 | - node | ||
| 261 | - .each(function(n) { n.target = n.source = false; }) | ||
| 262 | - .classed("node--focus", function(n) { return n === d; }); | ||
| 263 | - | ||
| 264 | - link | ||
| 265 | - .classed("link--cycle", function(l) { return isCyclicPackageLink(l, d); }) | ||
| 266 | - .classed("link--target", function(l) { if (l.target === d) return l.source.source = true; }) | ||
| 267 | - .classed("link--source", function(l) { if (l.source === d) return l.target.target = true; }) | ||
| 268 | - .filter(function(l) { return l.target === d || l.source === d; }) | ||
| 269 | - .each(function() { this.parentNode.appendChild(this); }); | ||
| 270 | - | ||
| 271 | - node | ||
| 272 | - .classed("node--target", function(n) { return n.target; }) | ||
| 273 | - .classed("node--source", function(n) { return n.source; }); | ||
| 274 | - | ||
| 275 | - d3.select("#psourceCount").text(d.size); | ||
| 276 | - d3.select("#pdependentCount").text(d.imports.length); | ||
| 277 | - d3.select("#psegmentCount").text(d.cycleSegmentCount); | ||
| 278 | - d3.select("#pcycleCount").text(d.cycleCount); | ||
| 279 | - d3.select(".details").classed("shown", function() { return true; }); | ||
| 280 | - } | ||
| 281 | - | ||
| 282 | - function deselected(d) { | ||
| 283 | - link | ||
| 284 | - .classed("link--cycle", isCyclicLink) | ||
| 285 | - .classed("link--target", false) | ||
| 286 | - .classed("link--source", false); | ||
| 287 | - | ||
| 288 | - node | ||
| 289 | - .classed("node--target", false) | ||
| 290 | - .classed("node--source", false) | ||
| 291 | - .classed("node--focus", false); | ||
| 292 | - d3.select(".details").classed("shown", function() { return false; }); | ||
| 293 | - } | ||
| 294 | - | ||
| 295 | - d3.select(self.frameElement).style("height", diameter + "px"); | ||
| 296 | - | ||
| 297 | - // Lazily construct the package hierarchy. | ||
| 298 | - function packageHierarchy(packages) { | ||
| 299 | - var map = {}, cnt = 0; | ||
| 300 | - | ||
| 301 | - // Builds the structure top-down to the specified leaf or until | ||
| 302 | - // another leaf in which case hook this leaf to the same parent | ||
| 303 | - function buildHierarchy(leaf, i) { | ||
| 304 | - var leafName = leaf.name, | ||
| 305 | - node, name, parent = map[""], start = 0; | ||
| 306 | - while (start < leafName.length) { | ||
| 307 | - name = parentName(leafName, start); | ||
| 308 | - node = map[name]; | ||
| 309 | - if (!node) { | ||
| 310 | - node = map[name] = parentNode(name, parent); | ||
| 311 | - parent.children.push(node); | ||
| 312 | - | ||
| 313 | - } else if (node.imports) { | ||
| 314 | - leaf.parent = parent; | ||
| 315 | - parent.children.push(leaf); | ||
| 316 | - break; | ||
| 317 | - } | ||
| 318 | - parent = node; | ||
| 319 | - start = name.length + 1; | ||
| 320 | - } | ||
| 321 | - } | ||
| 322 | - | ||
| 323 | - function parentNode(name, parent) { | ||
| 324 | - return {name: name, parent: parent, key: name, children: []}; | ||
| 325 | - } | ||
| 326 | - | ||
| 327 | - function parentName(leafName, start) { | ||
| 328 | - var i = leafName.indexOf(".", start); | ||
| 329 | - return i > 0 ? leafName.substring(0, i) : leafName; | ||
| 330 | - } | ||
| 331 | - | ||
| 332 | - // First populate all packages as leafs | ||
| 333 | - packages.forEach(function(d) { | ||
| 334 | - map[d.name] = d; | ||
| 335 | - d.key = d.name; | ||
| 336 | - }); | ||
| 337 | - | ||
| 338 | - // Next synthesize the intermediate structure, by-passing any leafs | ||
| 339 | - map[""] = parentNode("", null); | ||
| 340 | - var i = 0; | ||
| 341 | - packages.forEach(function(d) { | ||
| 342 | - buildHierarchy(d, i++); | ||
| 343 | - }); | ||
| 344 | - | ||
| 345 | - return map[""]; | ||
| 346 | - } | ||
| 347 | - | ||
| 348 | - // Return a list of imports for the given array of nodes. | ||
| 349 | - function packageImports(nodes) { | ||
| 350 | - var map = {}, | ||
| 351 | - imports = []; | ||
| 352 | - | ||
| 353 | - // Compute a map from name to node. | ||
| 354 | - nodes.forEach(function(d) { | ||
| 355 | - map[d.name] = d; | ||
| 356 | - }); | ||
| 357 | - | ||
| 358 | - // For each import, construct a link from the source to target node. | ||
| 359 | - nodes.forEach(function(d) { | ||
| 360 | - if (d.imports) d.imports.forEach(function(i) { | ||
| 361 | - imports.push({source: map[d.name], target: map[i]}); | ||
| 362 | - }); | ||
| 363 | - }); | ||
| 364 | - | ||
| 365 | - return imports; | ||
| 366 | - } | ||
| 367 | - | ||
| 368 | - processCatalog(); | ||
| 369 | -</script> | ||
| 370 | -</body> | ||
| 371 | -</html> |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import org.junit.Test; | ||
| 19 | -import org.onlab.jdvue.Catalog; | ||
| 20 | -import org.onlab.jdvue.JavaPackage; | ||
| 21 | -import org.onlab.jdvue.JavaSource; | ||
| 22 | - | ||
| 23 | -import java.io.IOException; | ||
| 24 | - | ||
| 25 | -import static org.junit.Assert.assertEquals; | ||
| 26 | -import static org.junit.Assert.assertNotNull; | ||
| 27 | - | ||
| 28 | -/** | ||
| 29 | - * Unit test for the source catalog. | ||
| 30 | - * | ||
| 31 | - * @author Thomas Vachuska | ||
| 32 | - */ | ||
| 33 | -public class CatalogTest { | ||
| 34 | - | ||
| 35 | - @Test | ||
| 36 | - public void basics() throws IOException { | ||
| 37 | - Catalog cat = new Catalog(); | ||
| 38 | - cat.load("src/test/resources/catalog.db"); | ||
| 39 | - cat.analyze(); | ||
| 40 | - | ||
| 41 | - assertEquals("incorrect package count", 12, cat.getPackages().size()); | ||
| 42 | - assertEquals("incorrect source count", 14, cat.getSources().size()); | ||
| 43 | - | ||
| 44 | - JavaPackage pkg = cat.getPackage("k"); | ||
| 45 | - assertNotNull("package should be found", pkg); | ||
| 46 | - | ||
| 47 | - JavaSource src = cat.getSource("k.K"); | ||
| 48 | - assertNotNull("source should be found", src); | ||
| 49 | - | ||
| 50 | - assertEquals("incorrect package source count", 1, pkg.getSources().size()); | ||
| 51 | - assertEquals("incorrect package dependency count", 1, pkg.getDependencies().size()); | ||
| 52 | - assertEquals("incorrect package cycle count", 3, cat.getPackageCycles(pkg).size()); | ||
| 53 | - | ||
| 54 | - assertEquals("incorrect segment count", 11, cat.getCycleSegments().size()); | ||
| 55 | - assertEquals("incorrect cycle count", 5, cat.getCycles().size()); | ||
| 56 | - } | ||
| 57 | - | ||
| 58 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import org.junit.Test; | ||
| 19 | -import org.onlab.jdvue.DependencyCycle; | ||
| 20 | -import org.onlab.jdvue.JavaPackage; | ||
| 21 | - | ||
| 22 | -import java.util.Arrays; | ||
| 23 | - | ||
| 24 | -import static org.junit.Assert.*; | ||
| 25 | - | ||
| 26 | -/** | ||
| 27 | - * Unit test for the dependency cycle entity. | ||
| 28 | - * | ||
| 29 | - * @author Thomas Vachuska | ||
| 30 | - */ | ||
| 31 | -public class DependencyCycleTest { | ||
| 32 | - | ||
| 33 | - @Test | ||
| 34 | - public void normalize() { | ||
| 35 | - JavaPackage x = new JavaPackage("x"); | ||
| 36 | - JavaPackage y = new JavaPackage("y"); | ||
| 37 | - JavaPackage z = new JavaPackage("z"); | ||
| 38 | - | ||
| 39 | - DependencyCycle a = new DependencyCycle(Arrays.asList(new JavaPackage[] {x, y, z}), x); | ||
| 40 | - DependencyCycle b = new DependencyCycle(Arrays.asList(new JavaPackage[] {y, z, x}), y); | ||
| 41 | - DependencyCycle c = new DependencyCycle(Arrays.asList(new JavaPackage[] {z, x, y}), z); | ||
| 42 | - | ||
| 43 | - assertEquals("incorrect normalization", a, b); | ||
| 44 | - assertEquals("incorrect normalization", a, c); | ||
| 45 | - } | ||
| 46 | - | ||
| 47 | - @Test | ||
| 48 | - public void testToString() { | ||
| 49 | - JavaPackage x = new JavaPackage("x"); | ||
| 50 | - JavaPackage y = new JavaPackage("y"); | ||
| 51 | - JavaPackage z = new JavaPackage("z"); | ||
| 52 | - | ||
| 53 | - DependencyCycle a = new DependencyCycle(Arrays.asList(new JavaPackage[] {x, y, z}), x); | ||
| 54 | - assertEquals("incorrect toString", "[x, y, z]", a.toShortString()); | ||
| 55 | - assertEquals("incorrect toString", | ||
| 56 | - "DependencyCycle{cycle=[" + | ||
| 57 | - "JavaPackage{name=x, sources=0, dependencies=0}, " + | ||
| 58 | - "JavaPackage{name=y, sources=0, dependencies=0}, " + | ||
| 59 | - "JavaPackage{name=z, sources=0, dependencies=0}]}", | ||
| 60 | - a.toString()); | ||
| 61 | - } | ||
| 62 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import com.google.common.testing.EqualsTester; | ||
| 19 | -import org.junit.Test; | ||
| 20 | -import org.onlab.jdvue.Dependency; | ||
| 21 | -import org.onlab.jdvue.JavaPackage; | ||
| 22 | - | ||
| 23 | -import static org.junit.Assert.assertEquals; | ||
| 24 | -import static org.junit.Assert.assertNotEquals; | ||
| 25 | - | ||
| 26 | -/** | ||
| 27 | - * Unit test for the dependency entity. | ||
| 28 | - * | ||
| 29 | - * @author Thomas Vachuska | ||
| 30 | - */ | ||
| 31 | -public class DependencyTest { | ||
| 32 | - | ||
| 33 | - @Test | ||
| 34 | - public void basics() { | ||
| 35 | - JavaPackage x = new JavaPackage("x"); | ||
| 36 | - JavaPackage y = new JavaPackage("y"); | ||
| 37 | - | ||
| 38 | - new EqualsTester() | ||
| 39 | - .addEqualityGroup(new Dependency(x, y), new Dependency(x, y)) | ||
| 40 | - .addEqualityGroup(new Dependency(y, x), new Dependency(y, x)) | ||
| 41 | - .testEquals(); | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | -} |
| 1 | -/* | ||
| 2 | - * Copyright 2015-present Open Networking Laboratory | ||
| 3 | - * | ||
| 4 | - * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | - * you may not use this file except in compliance with the License. | ||
| 6 | - * You may obtain a copy of the License at | ||
| 7 | - * | ||
| 8 | - * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | - * | ||
| 10 | - * Unless required by applicable law or agreed to in writing, software | ||
| 11 | - * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | - * See the License for the specific language governing permissions and | ||
| 14 | - * limitations under the License. | ||
| 15 | - */ | ||
| 16 | -package org.onlab.jdvue; | ||
| 17 | - | ||
| 18 | -import org.junit.Test; | ||
| 19 | -import org.onlab.jdvue.DependencyViewer; | ||
| 20 | - | ||
| 21 | -import java.io.FileInputStream; | ||
| 22 | -import java.io.IOException; | ||
| 23 | - | ||
| 24 | -import static org.junit.Assert.assertEquals; | ||
| 25 | -import static org.junit.Assert.assertNotEquals; | ||
| 26 | -import static org.onlab.jdvue.DependencyViewer.slurp; | ||
| 27 | - | ||
| 28 | -/** | ||
| 29 | - * Unit test for the dependency viewer. | ||
| 30 | - * | ||
| 31 | - * @author Thomas Vachuska | ||
| 32 | - */ | ||
| 33 | -public class DependencyViewerTest { | ||
| 34 | - | ||
| 35 | - @Test | ||
| 36 | - public void basics() throws IOException { | ||
| 37 | - DependencyViewer.main(new String[]{"src/test/resources/catalog"}); | ||
| 38 | - | ||
| 39 | - String expected = slurp(new FileInputStream("src/test/resources/expected.html")); | ||
| 40 | - String actual = slurp(new FileInputStream("src/test/resources/catalog.html")); | ||
| 41 | - | ||
| 42 | - // FIXME: add more manageable assertions here | ||
| 43 | -// assertEquals("incorrect html", expected, actual); | ||
| 44 | - } | ||
| 45 | - | ||
| 46 | -} |
| 1 | -src/main/java/a/A.java:package a; | ||
| 2 | -src/main/java/a/A.java:import b.B; | ||
| 3 | -src/main/java/a/A2.java:package a; | ||
| 4 | -src/main/java/a/A2.java:import c.C; | ||
| 5 | -src/main/java/b/B.java:package b; | ||
| 6 | -src/main/java/b/B.java:import c.C; | ||
| 7 | -src/main/java/c/C.java:package c; | ||
| 8 | - | ||
| 9 | -src/main/java/x/X.java:package x; | ||
| 10 | -src/main/java/x/X.java:import y.Y; | ||
| 11 | -src/main/java/y/Y.java:package y; | ||
| 12 | -src/main/java/y/Y.java:import z.Z; | ||
| 13 | -src/main/java/z/Z.java:package z; | ||
| 14 | -src/main/java/z/Z.java:import x.X; | ||
| 15 | - | ||
| 16 | -src/main/java/u/U.java:package u; | ||
| 17 | -src/main/java/u/U.java:import v.V; | ||
| 18 | -src/main/java/u/U2.java:package u; | ||
| 19 | -src/main/java/u/U2.java:import v.V; | ||
| 20 | -src/main/java/v/V.java:package v; | ||
| 21 | -src/main/java/v/V.java:import u.U; | ||
| 22 | - | ||
| 23 | -src/main/java/k/K.java:package k; | ||
| 24 | -src/main/java/k/K.java:import l.L; | ||
| 25 | -src/main/java/l/L.java:package l; | ||
| 26 | -src/main/java/l/L.java:import k.K; | ||
| 27 | -src/main/java/l/L.java:import m.M; | ||
| 28 | -src/main/java/l/L.java:import n.N; | ||
| 29 | -src/main/java/m/M.java:package m; | ||
| 30 | -src/main/java/m/M.java:import n.N; | ||
| 31 | -src/main/java/n/N.java:package n; | ||
| 32 | -src/main/java/n/N.java:import k.K; | ||
| 33 | - |
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
| ... | @@ -36,7 +36,6 @@ | ... | @@ -36,7 +36,6 @@ |
| 36 | <module>yangutils</module> | 36 | <module>yangutils</module> |
| 37 | <module>osgi</module> | 37 | <module>osgi</module> |
| 38 | <module>rest</module> | 38 | <module>rest</module> |
| 39 | - <module>jdvue</module> | ||
| 40 | <module>osgiwrap</module> | 39 | <module>osgiwrap</module> |
| 41 | </modules> | 40 | </modules> |
| 42 | 41 | ... | ... |
-
Please register or login to post a comment