PackageComparator.java| Commit | Message |
|---|---|
9ebb88522 | 2016-07-18 Initial commit |
projectforge-webapp/src/main/java) to 7.x (multi-module: projectforge-business/, projectforge-wicket/, projectforge-rest/, plugins/*/). It verified that all classes were correctly moved to their new module homes. The hardcoded paths reference a developer's machine (/Users/blumenstein/), making it non-portable.private static String[] plugins = { "org.projectforge.plugins.skillmatrix",
"org.projectforge.plugins.banking", "org.projectforge.plugins.crm",
"org.projectforge.plugins.licensemanagement", "org.projectforge.plugins.liquidityplanning",
"org.projectforge.plugins.marketing", "org.projectforge.plugins.memo",
"org.projectforge.plugins.poll", "org.projectforge.plugins.todo" };The 9 plugins that were extracted from the monolith into independent Gradle submodules. This list may be outdated — plugins may have been added/removed since the refactoring.
write() (lines 98-112): Recursive file tree walker. Skips .DS_Store (macOS metadata), dives into directories, and for .java files extracts the class name (stripping .java extension) and package (converting filesystem path /org/projectforge/business/address/ → org.projectforge.business.address). Uses parent.list() without null check — NPE if directory doesn't exist.
writePropertiesFile() (lines 74-96): Misleading name — it prints to stdout, doesn't write a file. Output format is oldPackage=NewPackage (like .properties format), intended for automated refactoring scripts. Console messages are in German ("Klasse in new structure not found") — internal tool for German-speaking team.
.java files (line 13). Kotlin .kt files are ignored — a significant gap for the modern codebase.plugins/ directory.
The tool builds two
HashMap<String, String>maps (filename → package path) by recursively walking Java source trees:projectforge-webapp/src/main/java(the pre-migration monolith), extracts every.javafile, stores className → packagePathprojectforge-business/src/main/java,projectforge-wicket/src/main/java, and 9 plugin directories underplugins/<name>/src/main/java. All results go into a singlenewStructuremap.key=valueformat, (c) not found → reports as missing. Then checks new classes not in old → reports as additions.Critical limitation: Using filename (without package) as the map key means two same-named classes in different packages collide. The last one scanned wins. In practice, ProjectForge avoids duplicate class names across packages, but this is a design flaw.