From 41fb430152362d4d11dda2a4c9dbd06c62e810f4 Mon Sep 17 00:00:00 2001 From: Brett Leslie Porter Date: Thu, 3 Nov 2005 04:59:08 +0000 Subject: [PATCH] moved sandbox git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@330451 13f79535-47bb-0310-9956-ffa450edef68 --- sandbox/acm/config.txt | 13 - sandbox/acm/config.xml | 20 - sandbox/acm/config/dev.properties | 82 -- sandbox/acm/config/prod.properties | 84 -- sandbox/acm/config/qa.properties | 83 -- sandbox/acm/config/test.properties | 81 -- sandbox/acm/foo.txt | 13 - sandbox/acm/maven-acm.iml | 28 - sandbox/acm/maven-acm.ipr | 216 ----- sandbox/acm/maven-acm.iws | 628 -------------- sandbox/acm/pom.xml | 13 - .../apache/maven/acm/AbstractProvider.java | 10 - .../main/java/org/apache/maven/acm/Acm.java | 56 -- .../main/java/org/apache/maven/acm/Main.java | 46 - .../apache/maven/acm/ParameterProvider.java | 11 - .../maven/acm/PropertiesComparator.java | 47 - .../apache/maven/acm/PropertiesProvider.java | 46 - .../apache/maven/acm/StringInputStream.java | 90 -- .../acm/SystemProviderSourceException.java | 27 - .../apache/maven/acm/convert/FileScanner.java | 42 - .../acm/convert/PropertiesConverter.java | 94 -- .../acm/convert/PropertiesGenerator.java | 50 -- .../maven/acm/convert/PropertiesMunger.java | 197 ----- .../apache/maven/acm/model/Environment.java | 59 -- .../org/apache/maven/acm/model/Model.java | 50 -- .../acm/text/AcmTextDescriptorReader.java | 115 --- .../acm/text/AcmTextDescriptorWriter.java | 94 -- .../acm/util/InterpolationFilterWriter.java | 135 --- .../maven/acm/util/InterpolationHandler.java | 17 - .../acm/util/MapInterpolationHandler.java | 35 - .../java/org/apache/maven/acm/AcmTest.java | 26 - .../acm/AcmTextDescriptorReaderTest.java | 95 -- .../maven/acm/PropertiesComparatorTest.java | 36 - .../maven/acm/PropertiesMungerTest.java | 35 - sandbox/acm/src/test/resources/config.txt | 13 - sandbox/acm/src/test/resources/dev.properties | 1 - .../src/test/resources/production.properties | 1 - sandbox/acm/src/test/resources/qa.properties | 1 - .../acm/src/test/resources/test.properties | 1 - sandbox/acm/t3/app/brioreport.properties | 14 - sandbox/acm/t3/app/config.properties | 36 - sandbox/acm/t3/app/portal.properties | 80 -- sandbox/acm/t3/env/dev.properties | 82 -- sandbox/acm/t3/env/prod.properties | 84 -- sandbox/acm/t3/env/qa.properties | 83 -- sandbox/acm/t3/env/test.properties | 81 -- sandbox/acm/t3/make-config.sh | 30 - sandbox/acm/toyota.config | 477 ---------- sandbox/csharp/maven-csharp-plugin/pom.xml | 52 -- .../csharp/compiler/CSharpCompiler.java | 157 ---- .../csharp/compiler/CSharpCompilerMojo.java | 365 -------- .../csharp/helpers/AntBuildListener.java | 92 -- .../resources/META-INF/plexus/components.xml | 34 - sandbox/csharp/maven-csharp-test/pom.xml | 36 - .../maven-csharp-test/src/main/csharp/Test.cs | 17 - sandbox/marmalade/it0015/cli-options.txt | 1 - sandbox/marmalade/it0015/expected-results.txt | 1 - sandbox/marmalade/it0015/goals.txt | 2 - sandbox/marmalade/it0015/pom.xml | 39 - sandbox/marmalade/it0015/prebuild-hook.txt | 2 - .../maven/it0015/tags/IT0015TagLibrary.java | 17 - .../maven/it0015/tags/WriteFileTag.java | 66 -- .../resources/META-INF/marmalade/it0015.def | 1 - .../org/apache/maven/it0015/it0015.mmld | 17 - sandbox/marmalade/it0015/system.properties | 2 - .../maven-archetype-marmalade-mojo/pom.xml | 10 - .../src/main/resources/META-INF/archetype.xml | 11 - .../resources/archetype-resources/pom.xml | 40 - .../src/main/java/CopyFileTag.java | 36 - .../src/main/java/MyMojoTagLibrary.java | 33 - .../resources/META-INF/marmalade/myMojo.def | 1 - .../src/main/resources/myMojo.mmld | 19 - sandbox/marmalade/maven-hello-plugin/pom.xml | 24 - .../src/main/scripts/hello.mmld | 20 - .../maven-plugin-tools-marmalade/pom.xml | 39 - .../MarmaladeMojoDescriptorExtractor.java | 142 --- .../resources/META-INF/plexus/components.xml | 17 - .../MarmaladeMojoDescriptorExtractorTest.java | 132 --- .../src/test/resources/testMojo.mmld | 20 - .../marmalade/maven-script-marmalade/pom.xml | 28 - .../maven/script/marmalade/MarmaladeMojo.java | 114 --- .../MarmaladeMojoExecutionDirectives.java | 38 - .../tags/AbstractBooleanValuedBodyTag.java | 50 -- .../tags/AbstractStringValuedBodyTag.java | 44 - .../script/marmalade/tags/AggregatorTag.java | 34 - .../marmalade/tags/DescriptionParent.java | 27 - .../script/marmalade/tags/DescriptionTag.java | 34 - .../script/marmalade/tags/ExecuteGoalTag.java | 35 - .../marmalade/tags/ExecuteLifecycleTag.java | 34 - .../marmalade/tags/ExecutePhaseTag.java | 34 - .../script/marmalade/tags/ExecuteTag.java | 43 - .../marmalade/tags/ExecutionStrategyTag.java | 34 - .../maven/script/marmalade/tags/GoalTag.java | 34 - .../marmalade/tags/InheritByDefaultTag.java | 34 - .../tags/InstantiationStrategyTag.java | 34 - .../marmalade/tags/LifecyclePhaseTag.java | 34 - .../script/marmalade/tags/MetadataTag.java | 251 ------ .../tags/MojoDefinitionTagLibrary.java | 56 -- .../maven/script/marmalade/tags/MojoTag.java | 78 -- .../marmalade/tags/ParamDefaultTag.java | 34 - .../marmalade/tags/ParamExpressionTag.java | 34 - .../script/marmalade/tags/ParamNameTag.java | 34 - .../marmalade/tags/ParamRequiredTag.java | 34 - .../script/marmalade/tags/ParamTypeTag.java | 34 - .../script/marmalade/tags/ParameterTag.java | 120 --- .../script/marmalade/tags/ParametersTag.java | 56 -- .../tags/RequirementRoleHintTag.java | 36 - .../marmalade/tags/RequirementRoleTag.java | 36 - .../script/marmalade/tags/RequirementTag.java | 55 -- .../tags/RequiresDependencyResolutionTag.java | 35 - .../marmalade/tags/RequiresOnlineTag.java | 34 - .../marmalade/tags/RequiresProjectTag.java | 34 - .../resources/META-INF/marmalade/mojo.def | 1 - .../script/marmalade/MarmaladeMojoTest.java | 61 -- sandbox/maven-1.x-integration/README.txt | 14 - sandbox/maven-1.x-integration/pom.xml | 29 - .../legacy/DefaultMaven1xIntegration.java | 164 ---- .../maven/legacy/Maven1xIntegration.java | 48 -- .../legacy/Maven1xIntegrationException.java | 37 - .../resources/META-INF/plexus/components.xml | 16 - sandbox/maven-ejb3-plugin/pom.xml | 23 - .../apache/maven/plugin/ejb3/Ejb3Mojo.java | 149 ---- .../maven-it-plugin-test/pom.xml | 52 -- sandbox/maven-it-plugin/pom.xml | 48 -- .../org/apache/maven/plugin/it/ForkMojo.java | 240 ------ sandbox/maven-one-plugin/pom.xml | 68 -- .../plugins/mavenone/MavenOnePluginMojo.java | 162 ---- .../MavenOneRepositoryDeployMojo.java | 133 --- .../MavenOneRepositoryInstallMojo.java | 155 ---- .../resources/META-INF/plexus/components.xml | 43 - .../src/site/apt/introduction.apt | 97 --- sandbox/maven-one-plugin/src/site/site.xml | 22 - sandbox/maven-par-plugin/pom.xml | 23 - .../org/apache/maven/plugin/par/ParMojo.java | 164 ---- sandbox/maven-repository-checker/pom.xml | 34 - .../src/assemble/bin.xml | 29 - .../src/bin/checkrepo.sh | 22 - .../maven/repository/checker/CheckRepo.java | 76 -- sandbox/maven-repository-plugin/pom.xml | 27 - .../repository/ChecksumValidateMojo.java | 128 --- sandbox/pom-pre-alpha-converter/pom.xml | 34 - sandbox/pom-pre-alpha-converter/run.sh | 2 - .../apache/maven/tools/converter/Main.java | 585 ------------- sandbox/repoclean/pom.xml | 81 -- sandbox/repoclean/src/assembly/bin.xml | 34 - sandbox/repoclean/src/main/bash/repoclean.sh | 34 - .../apache/maven/tools/repoclean/Main.java | 193 ----- .../tools/repoclean/RepositoryCleaner.java | 272 ------ .../RepositoryCleanerConfiguration.java | 226 ----- .../repoclean/digest/DigestException.java | 34 - .../repoclean/digest/DigestVerifier.java | 126 --- .../tools/repoclean/digest/Digestor.java | 190 ---- .../discover/AbstractArtifactDiscoverer.java | 70 -- .../discover/ArtifactDiscoverer.java | 41 - .../discover/DefaultArtifactDiscoverer.java | 124 --- .../discover/LegacyArtifactDiscoverer.java | 319 ------- .../repoclean/index/ArtifactIndexer.java | 66 -- .../tools/repoclean/phase/DiscoveryPhase.java | 113 --- .../tools/repoclean/phase/RewritePhase.java | 578 ------------- .../repoclean/report/AbstractReporter.java | 125 --- .../tools/repoclean/report/FileReporter.java | 94 -- .../tools/repoclean/report/PathLister.java | 89 -- .../report/ReportWriteException.java | 36 - .../tools/repoclean/report/Reporter.java | 35 - .../rewrite/ArtifactPomRewriter.java | 40 - .../repoclean/rewrite/V3PomRewriter.java | 100 --- .../repoclean/rewrite/V4PomRewriter.java | 103 --- .../transaction/RewriteTransaction.java | 57 -- .../transaction/RollbackException.java | 31 - .../translate/PomTranslationException.java | 47 - .../translate/PomV3ToV4Translator.java | 816 ------------------ .../resources/META-INF/plexus/components.xml | 310 ------- .../apt/repository-conversion-process.apt | 146 ---- .../apt/transition-to-repo-management.apt | 61 -- .../maven/tools/repoclean/TestSupport.java | 83 -- .../digest/ArtifactDigestVerifierTest.java | 65 -- .../digest/ArtifactDigestorTest.java | 81 -- .../tools/repoclean/report/DummyReporter.java | 63 -- .../translate/PomV3ToV4TranslatorTest.java | 106 --- .../digestFormatVerifyArtifact.jar | Bin 169763 -> 0 bytes 180 files changed, 14424 deletions(-) delete mode 100644 sandbox/acm/config.txt delete mode 100644 sandbox/acm/config.xml delete mode 100644 sandbox/acm/config/dev.properties delete mode 100644 sandbox/acm/config/prod.properties delete mode 100644 sandbox/acm/config/qa.properties delete mode 100644 sandbox/acm/config/test.properties delete mode 100644 sandbox/acm/foo.txt delete mode 100644 sandbox/acm/maven-acm.iml delete mode 100644 sandbox/acm/maven-acm.ipr delete mode 100644 sandbox/acm/maven-acm.iws delete mode 100644 sandbox/acm/pom.xml delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/AbstractProvider.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/Acm.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/Main.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/ParameterProvider.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesComparator.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesProvider.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/StringInputStream.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/SystemProviderSourceException.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/convert/FileScanner.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesConverter.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesGenerator.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesMunger.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/model/Environment.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/model/Model.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorReader.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorWriter.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationFilterWriter.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationHandler.java delete mode 100644 sandbox/acm/src/main/java/org/apache/maven/acm/util/MapInterpolationHandler.java delete mode 100644 sandbox/acm/src/test/java/org/apache/maven/acm/AcmTest.java delete mode 100644 sandbox/acm/src/test/java/org/apache/maven/acm/AcmTextDescriptorReaderTest.java delete mode 100644 sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesComparatorTest.java delete mode 100644 sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesMungerTest.java delete mode 100644 sandbox/acm/src/test/resources/config.txt delete mode 100644 sandbox/acm/src/test/resources/dev.properties delete mode 100644 sandbox/acm/src/test/resources/production.properties delete mode 100644 sandbox/acm/src/test/resources/qa.properties delete mode 100644 sandbox/acm/src/test/resources/test.properties delete mode 100644 sandbox/acm/t3/app/brioreport.properties delete mode 100644 sandbox/acm/t3/app/config.properties delete mode 100644 sandbox/acm/t3/app/portal.properties delete mode 100644 sandbox/acm/t3/env/dev.properties delete mode 100644 sandbox/acm/t3/env/prod.properties delete mode 100644 sandbox/acm/t3/env/qa.properties delete mode 100644 sandbox/acm/t3/env/test.properties delete mode 100755 sandbox/acm/t3/make-config.sh delete mode 100644 sandbox/acm/toyota.config delete mode 100644 sandbox/csharp/maven-csharp-plugin/pom.xml delete mode 100644 sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompiler.java delete mode 100644 sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompilerMojo.java delete mode 100644 sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/helpers/AntBuildListener.java delete mode 100644 sandbox/csharp/maven-csharp-plugin/src/main/resources/META-INF/plexus/components.xml delete mode 100644 sandbox/csharp/maven-csharp-test/pom.xml delete mode 100644 sandbox/csharp/maven-csharp-test/src/main/csharp/Test.cs delete mode 100644 sandbox/marmalade/it0015/cli-options.txt delete mode 100644 sandbox/marmalade/it0015/expected-results.txt delete mode 100644 sandbox/marmalade/it0015/goals.txt delete mode 100644 sandbox/marmalade/it0015/pom.xml delete mode 100644 sandbox/marmalade/it0015/prebuild-hook.txt delete mode 100644 sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/IT0015TagLibrary.java delete mode 100644 sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/WriteFileTag.java delete mode 100644 sandbox/marmalade/it0015/src/main/resources/META-INF/marmalade/it0015.def delete mode 100644 sandbox/marmalade/it0015/src/main/scripts/org/apache/maven/it0015/it0015.mmld delete mode 100644 sandbox/marmalade/it0015/system.properties delete mode 100644 sandbox/marmalade/maven-archetype-marmalade-mojo/pom.xml delete mode 100644 sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/META-INF/archetype.xml delete mode 100644 sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/pom.xml delete mode 100644 sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/CopyFileTag.java delete mode 100644 sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/MyMojoTagLibrary.java delete mode 100644 sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/META-INF/marmalade/myMojo.def delete mode 100644 sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/myMojo.mmld delete mode 100644 sandbox/marmalade/maven-hello-plugin/pom.xml delete mode 100644 sandbox/marmalade/maven-hello-plugin/src/main/scripts/hello.mmld delete mode 100644 sandbox/marmalade/maven-plugin-tools-marmalade/pom.xml delete mode 100644 sandbox/marmalade/maven-plugin-tools-marmalade/src/main/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractor.java delete mode 100644 sandbox/marmalade/maven-plugin-tools-marmalade/src/main/resources/META-INF/plexus/components.xml delete mode 100644 sandbox/marmalade/maven-plugin-tools-marmalade/src/test/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractorTest.java delete mode 100644 sandbox/marmalade/maven-plugin-tools-marmalade/src/test/resources/testMojo.mmld delete mode 100644 sandbox/marmalade/maven-script-marmalade/pom.xml delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojo.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojoExecutionDirectives.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractBooleanValuedBodyTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractStringValuedBodyTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AggregatorTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionParent.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteGoalTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteLifecycleTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutePhaseTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutionStrategyTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/GoalTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InheritByDefaultTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InstantiationStrategyTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/LifecyclePhaseTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MetadataTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoDefinitionTagLibrary.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamDefaultTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamExpressionTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamNameTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamRequiredTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamTypeTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParameterTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParametersTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleHintTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresDependencyResolutionTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresOnlineTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresProjectTag.java delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/main/resources/META-INF/marmalade/mojo.def delete mode 100644 sandbox/marmalade/maven-script-marmalade/src/test/java/org/apache/maven/script/marmalade/MarmaladeMojoTest.java delete mode 100644 sandbox/maven-1.x-integration/README.txt delete mode 100644 sandbox/maven-1.x-integration/pom.xml delete mode 100644 sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/DefaultMaven1xIntegration.java delete mode 100644 sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegration.java delete mode 100644 sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegrationException.java delete mode 100644 sandbox/maven-1.x-integration/src/main/resources/META-INF/plexus/components.xml delete mode 100644 sandbox/maven-ejb3-plugin/pom.xml delete mode 100644 sandbox/maven-ejb3-plugin/src/main/java/org/apache/maven/plugin/ejb3/Ejb3Mojo.java delete mode 100644 sandbox/maven-it-plugin/maven-it-plugin-test/pom.xml delete mode 100644 sandbox/maven-it-plugin/pom.xml delete mode 100644 sandbox/maven-it-plugin/src/main/java/org/apache/maven/plugin/it/ForkMojo.java delete mode 100644 sandbox/maven-one-plugin/pom.xml delete mode 100644 sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOnePluginMojo.java delete mode 100644 sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryDeployMojo.java delete mode 100644 sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryInstallMojo.java delete mode 100644 sandbox/maven-one-plugin/src/main/resources/META-INF/plexus/components.xml delete mode 100644 sandbox/maven-one-plugin/src/site/apt/introduction.apt delete mode 100644 sandbox/maven-one-plugin/src/site/site.xml delete mode 100644 sandbox/maven-par-plugin/pom.xml delete mode 100644 sandbox/maven-par-plugin/src/main/java/org/apache/maven/plugin/par/ParMojo.java delete mode 100644 sandbox/maven-repository-checker/pom.xml delete mode 100644 sandbox/maven-repository-checker/src/assemble/bin.xml delete mode 100644 sandbox/maven-repository-checker/src/bin/checkrepo.sh delete mode 100644 sandbox/maven-repository-checker/src/main/java/org/apache/maven/repository/checker/CheckRepo.java delete mode 100644 sandbox/maven-repository-plugin/pom.xml delete mode 100644 sandbox/maven-repository-plugin/src/main/java/org/apache/maven/plugin/repository/ChecksumValidateMojo.java delete mode 100644 sandbox/pom-pre-alpha-converter/pom.xml delete mode 100644 sandbox/pom-pre-alpha-converter/run.sh delete mode 100755 sandbox/pom-pre-alpha-converter/src/main/java/org/apache/maven/tools/converter/Main.java delete mode 100644 sandbox/repoclean/pom.xml delete mode 100644 sandbox/repoclean/src/assembly/bin.xml delete mode 100644 sandbox/repoclean/src/main/bash/repoclean.sh delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/Main.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleaner.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleanerConfiguration.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestException.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestVerifier.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/Digestor.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/AbstractArtifactDiscoverer.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/ArtifactDiscoverer.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/DefaultArtifactDiscoverer.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/LegacyArtifactDiscoverer.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/index/ArtifactIndexer.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/DiscoveryPhase.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/RewritePhase.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/AbstractReporter.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/FileReporter.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/PathLister.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/ReportWriteException.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/Reporter.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/ArtifactPomRewriter.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V3PomRewriter.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V4PomRewriter.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RewriteTransaction.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RollbackException.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomTranslationException.java delete mode 100644 sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4Translator.java delete mode 100644 sandbox/repoclean/src/main/resources/META-INF/plexus/components.xml delete mode 100644 sandbox/repoclean/src/site/apt/repository-conversion-process.apt delete mode 100644 sandbox/repoclean/src/site/apt/transition-to-repo-management.apt delete mode 100644 sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/TestSupport.java delete mode 100644 sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestVerifierTest.java delete mode 100644 sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestorTest.java delete mode 100644 sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/report/DummyReporter.java delete mode 100644 sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4TranslatorTest.java delete mode 100644 sandbox/repoclean/src/test/resources/digest/ArtifactDigestorTest/digestFormatVerifyArtifact.jar diff --git a/sandbox/acm/config.txt b/sandbox/acm/config.txt deleted file mode 100644 index 4400a15042..0000000000 --- a/sandbox/acm/config.txt +++ /dev/null @@ -1,13 +0,0 @@ -+dev = Dev environment -+qa = QA environment -+test = Test environment -+prod = Production Environment - -*tas.editor.stamp -{ - dev = devValue - qa = qaValue - test = testValue - prod = prodValue -} - diff --git a/sandbox/acm/config.xml b/sandbox/acm/config.xml deleted file mode 100644 index bf9fb072b1..0000000000 --- a/sandbox/acm/config.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - dev - Development Environment - - - - - - editor - - - dev - devValue - - - - - diff --git a/sandbox/acm/config/dev.properties b/sandbox/acm/config/dev.properties deleted file mode 100644 index 24b59ed6ba..0000000000 --- a/sandbox/acm/config/dev.properties +++ /dev/null @@ -1,82 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlpdev1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpint -weblogic.database.server=hppqsd01 -weblogic.database.port=1521 -weblogic.database.SID=T3DD - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3datglobl -refinery.database.server=hppqsd01 -refinery.database.port=1521 -refinery.database.SID=T3DD - -refineryext.database.user=t3datglobl -refineryext.database.password=t3datglobl -refineryext.database.server=hppqsd01 -refineryext.database.port=1521 -refineryext.database.SID=T3DD - -weblogic.admin.host=smpqsd01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=smtbgd01 -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intportalbrokert3 -weblogic.IAExtension.SiteMinderAdmin=siteminder -weblogic.IAExtension.SiteMinderAdminPassword={3DES}3x8+x75ipmk= -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=15 - -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=true -weblogicxml.jsp.pageCheckSeconds=1 -weblogicxml.jsp.precompile=false -weblogicxml.jsp.precompileContinue=false - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlpdev1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlpdev1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqsd01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3privdev.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqsd01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqsd01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3privdev.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlpdev1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrit03.tms.toyota.com -report.key.reportPort=1810 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100f6bb076d-0000-eafc-0a311104&DocVersion=1&JScript=enable \ No newline at end of file diff --git a/sandbox/acm/config/prod.properties b/sandbox/acm/config/prod.properties deleted file mode 100644 index 4b148dab66..0000000000 --- a/sandbox/acm/config/prod.properties +++ /dev/null @@ -1,84 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlppp1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpintprod -weblogic.database.server=hppqsp11 -weblogic.database.port=1521 -weblogic.database.SID=T3IP - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3dgprod -refinery.database.server=hppqsp11 -refinery.database.port=1521 -refinery.database.SID=T3IP - -refineryext.database.user=t3datglobl -refineryext.database.password=t3dgprod -refineryext.database.server=hppqsp11 -refineryext.database.port=1521 -refineryext.database.SID=T3IP - -weblogic.admin.host=smpqsp01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=smtbgp05.tms.toyota.com -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intPortalBrokert3 -weblogic.IAExtension.SiteMinderAdmin=t3admin -weblogic.IAExtension.SiteMinderAdminPassword={3DES}FZxvhDswJrc= -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=100 - -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=false -weblogicxml.jsp.pageCheckSeconds=-1 -weblogicxml.jsp.precompile=true -weblogicxml.jsp.precompileContinue=true - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlppp1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlppp1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqsp01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqsp01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqsp01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlppp1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrip10.tms.toyota.com -report.key.reportPort=1800 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100966a65c0-0000-81b5-0a3f070a&DOC_VERSION=1&JScript=enable - - diff --git a/sandbox/acm/config/qa.properties b/sandbox/acm/config/qa.properties deleted file mode 100644 index 313ddec012..0000000000 --- a/sandbox/acm/config/qa.properties +++ /dev/null @@ -1,83 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlpqa1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpint -weblogic.database.server=hppqsq11 -weblogic.database.port=1521 -weblogic.database.SID=T3IA - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3datglobl -refinery.database.server=hppqsq11 -refinery.database.port=1521 -refinery.database.SID=T3IA - -refineryext.database.user=t3datglobl -refineryext.database.password=t3datglobl -refineryext.database.server=hppqsq11 -refineryext.database.port=1521 -refineryext.database.SID=T3IA - -weblogic.admin.host=smpqsq01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=smtbgq15.tms.toyota.com -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intPortalBrokert3 -weblogic.IAExtension.SiteMinderAdmin=t3admin -weblogic.IAExtension.SiteMinderAdminPassword=42T3amm -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=100 - -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=false -weblogicxml.jsp.pageCheckSeconds=-1 -weblogicxml.jsp.precompile=true -weblogicxml.jsp.precompileContinue=true - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlpqa1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlpqa1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqsq01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3qa.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqsq01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqsq01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3qa.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlpqa1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrip11.tms.toyota.com -report.key.reportPort=1820 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=000001005330d663-0000-ea23-0a3f070b&DOC_VERSION=1&JScript=enable - diff --git a/sandbox/acm/config/test.properties b/sandbox/acm/config/test.properties deleted file mode 100644 index 24cca998fc..0000000000 --- a/sandbox/acm/config/test.properties +++ /dev/null @@ -1,81 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlptest1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpint -weblogic.database.server=hppqsd01 -weblogic.database.port=1521 -weblogic.database.SID=T3DT - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3datglobl -refinery.database.server=hppqsd01 -refinery.database.port=1521 -refinery.database.SID=T3DT - -refineryext.database.user=t3datglobl -refineryext.database.password=t3datglobl -refineryext.database.server=hppqsd01 -refineryext.database.port=1521 -refineryext.database.SID=T3DT - -weblogic.admin.host=smpqst01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=tau.tms.toyota.com -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intPortalBrokert3 -weblogic.IAExtension.SiteMinderAdmin=siteminder -weblogic.IAExtension.SiteMinderAdminPassword={3DES}PeLrMhffwaQ= -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=15 -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=true -weblogicxml.jsp.pageCheckSeconds=1 -weblogicxml.jsp.precompile=false -weblogicxml.jsp.precompileContinue=false - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlptest1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlptest1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqst01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3test.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqst01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqst01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3test.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlptest1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrit03.tms.toyota.com -report.key.reportPort=1810 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100f6bb076d-0000-eafc-0a311104&DocVersion=1&JScript=enable \ No newline at end of file diff --git a/sandbox/acm/foo.txt b/sandbox/acm/foo.txt deleted file mode 100644 index c9b8bf36b0..0000000000 --- a/sandbox/acm/foo.txt +++ /dev/null @@ -1,13 +0,0 @@ -+qa = QA environment -+prod = Production Environment -+dev = Dev environment -+test = Test environment - -*tas.editor.stamp -{ - qa = qaValue - prod = prodValue - dev = devValue - test = testValue -} - diff --git a/sandbox/acm/maven-acm.iml b/sandbox/acm/maven-acm.iml deleted file mode 100644 index 1ad70151d4..0000000000 --- a/sandbox/acm/maven-acm.iml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sandbox/acm/maven-acm.ipr b/sandbox/acm/maven-acm.ipr deleted file mode 100644 index 9199c6a06d..0000000000 --- a/sandbox/acm/maven-acm.ipr +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sandbox/acm/maven-acm.iws b/sandbox/acm/maven-acm.iws deleted file mode 100644 index 5969be4c8c..0000000000 --- a/sandbox/acm/maven-acm.iws +++ /dev/null @@ -1,628 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sandbox/acm/pom.xml b/sandbox/acm/pom.xml deleted file mode 100644 index 950fbef09c..0000000000 --- a/sandbox/acm/pom.xml +++ /dev/null @@ -1,13 +0,0 @@ - - 4.0.0 - org.apache.maven.acm - maven-acm - 1.0 - - - junit - junit - 3.8.1 - - - diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/AbstractProvider.java b/sandbox/acm/src/main/java/org/apache/maven/acm/AbstractProvider.java deleted file mode 100644 index 39e469cd08..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/AbstractProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.apache.maven.acm; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public abstract class AbstractProvider - implements ParameterProvider -{ -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/Acm.java b/sandbox/acm/src/main/java/org/apache/maven/acm/Acm.java deleted file mode 100644 index da657b2fc2..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/Acm.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.apache.maven.acm; - -// Have a single parameter for a system -// -// system = {dev|test|qa|production} -// -// Need to be able to change these values at runtime and persist the changes -// so that they are preserved for future builds I need to keep this information -// outside of the build environment - -// For toyota where can I store the values ... - -public class Acm - implements ParameterProvider -{ - public static final String ACM_SYSTEM_ID = "acm.system.id"; - - private String systemId; - - private ParameterProvider provider; - - public Acm( ParameterProvider parameterProvider ) - { - this( System.getProperty( ACM_SYSTEM_ID ), parameterProvider ); - } - - public Acm( String systemId, ParameterProvider parameterProvider ) - { - this.systemId = systemId; - - this.provider = parameterProvider; - } - - public String getParameter( String key ) - throws SystemProviderSourceException - { - return getParameter( getSystemId(), key ); - } - - public String getParameter( String system, String key ) - throws SystemProviderSourceException - { - if ( system == null ) - { - return null; - } - - return provider.getParameter( system, key ); - } - - public String getSystemId() - { - return systemId; - } - -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/Main.java b/sandbox/acm/src/main/java/org/apache/maven/acm/Main.java deleted file mode 100644 index 285381f55c..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/Main.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm; - -import org.apache.maven.acm.convert.PropertiesConverter; -import org.apache.maven.acm.model.Model; -import org.apache.maven.acm.text.AcmTextDescriptorWriter; - -import java.io.File; -import java.io.FileWriter; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; - -/** - * Unit test for simple App. - * - * @author Jason van Zyl - */ -public class Main -{ - static protected void writeModel( Model model, String file ) - throws Exception - { - PrintWriter writer = new PrintWriter( new FileWriter( file ) ); - - AcmTextDescriptorWriter w = new AcmTextDescriptorWriter(); - - w.write( writer, model ); - } - - static public void main( String[] args ) - throws Exception - { - String sourceDirectory = args[0]; - - String modelFile = args[1]; - - PropertiesConverter converter = new PropertiesConverter(); - - Model model = converter.convert( sourceDirectory ); - - writeModel( model, modelFile ); - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/ParameterProvider.java b/sandbox/acm/src/main/java/org/apache/maven/acm/ParameterProvider.java deleted file mode 100644 index 6346a3d940..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/ParameterProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.apache.maven.acm; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public interface ParameterProvider -{ - String getParameter( String system, String key ) - throws SystemProviderSourceException; -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesComparator.java b/sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesComparator.java deleted file mode 100644 index cafee85a25..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesComparator.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.apache.maven.acm; - -import java.util.List; -import java.util.Properties; -import java.util.Iterator; -import java.util.ArrayList; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class PropertiesComparator -{ - public List compare( Properties source, Properties target ) - { - List propertiesMissingFromTarget = new ArrayList(); - - for ( Iterator i = source.keySet().iterator(); i.hasNext(); ) - { - String key = (String) i.next(); - - if ( target.get( key ) == null ) - { - propertiesMissingFromTarget.add( key ); - } - } - - return propertiesMissingFromTarget; - } - - public void compareReport( File sourceFile, File targetFile ) - throws Exception - { - Properties source = new Properties(); - - source.load( new FileInputStream( sourceFile ) ); - - Properties target = new Properties(); - - target.load( new FileInputStream( targetFile ) ); - - List diff = compare( source, target ); - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesProvider.java b/sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesProvider.java deleted file mode 100644 index 8b09ec80cc..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/PropertiesProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.apache.maven.acm; - -import java.io.InputStream; -import java.io.IOException; -import java.util.Properties; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class PropertiesProvider - extends AbstractProvider -{ - private ClassLoader classLoader; - - private static final String EXTENSION = ".properties"; - - public PropertiesProvider() - { - this( Thread.currentThread().getContextClassLoader() ); - } - - public PropertiesProvider( ClassLoader classLoader ) - { - this.classLoader = classLoader; - } - - public String getParameter( String systemId, String key ) - throws SystemProviderSourceException - { - InputStream is = classLoader.getResourceAsStream( systemId + EXTENSION ); - - Properties p = new Properties(); - - try - { - p.load( is ); - } - catch ( IOException e ) - { - throw new SystemProviderSourceException( "Cannot find the source for parameters: ", e ); - } - - return p.getProperty( key ); - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/StringInputStream.java b/sandbox/acm/src/main/java/org/apache/maven/acm/StringInputStream.java deleted file mode 100644 index 7ab7fb86bc..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/StringInputStream.java +++ /dev/null @@ -1,90 +0,0 @@ -package org.apache.maven.acm; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; - -/** - * Wraps a String as an InputStream. Note that data will be lost for - * characters not in ISO Latin 1, as a simple char->byte mapping is assumed. - * - * @author Magesh Umasankar - */ -public class StringInputStream - extends InputStream -{ - /** Source string, stored as a StringReader */ - private StringReader in; - - /** - * Composes a stream from a String - * - * @param source The string to read from. Must not be null. - */ - public StringInputStream( String source ) - { - in = new StringReader( source ); - } - - /** - * Reads from the Stringreader, returning the same value. Note that - * data will be lost for characters not in ISO Latin 1. Clients - * assuming a return value in the range -1 to 255 may even fail on - * such input. - * - * @return the value of the next character in the StringReader - * - * @exception IOException if the original StringReader fails to be read - */ - public int read() throws IOException - { - return in.read(); - } - - /** - * Closes the Stringreader. - * - * @exception IOException if the original StringReader fails to be closed - */ - public void close() throws IOException - { - in.close(); - } - - /** - * Marks the read limit of the StringReader. - * - * @param limit the maximum limit of bytes that can be read before the - * mark position becomes invalid - */ - public synchronized void mark( final int limit ) - { - try - { - in.mark( limit ); - } - catch ( IOException ioe ) - { - throw new RuntimeException( ioe.getMessage() ); - } - } - - /** - * Resets the StringReader. - * - * @exception IOException if the StringReader fails to be reset - */ - public synchronized void reset() throws IOException - { - in.reset(); - } - - /** - * @see InputStream#markSupported - */ - public boolean markSupported() - { - return in.markSupported(); - } -} - diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/SystemProviderSourceException.java b/sandbox/acm/src/main/java/org/apache/maven/acm/SystemProviderSourceException.java deleted file mode 100644 index 33f1823d5f..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/SystemProviderSourceException.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class SystemProviderSourceException - extends Exception -{ - public SystemProviderSourceException( String message ) - { - super( message ); - } - - public SystemProviderSourceException( Throwable cause ) - { - super( cause ); - } - - public SystemProviderSourceException( String message, Throwable cause ) - { - super( message, cause ); - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/FileScanner.java b/sandbox/acm/src/main/java/org/apache/maven/acm/convert/FileScanner.java deleted file mode 100644 index 49fab3e859..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/FileScanner.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm.convert; - -import java.io.File; -import java.io.FilenameFilter; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class FileScanner -{ - public File[] scan( File directory, String extension ) - { - File[] files = directory.listFiles( new ExtensionFilter( extension ) ); - - return files; - } - - class ExtensionFilter - implements FilenameFilter - { - String extension; - - public ExtensionFilter( String ext ) - { - this.extension = ext; - } - - public boolean accept( File directory, String filename ) - { - if ( filename.endsWith( extension ) ) - { - return true; - } - - return false; - } - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesConverter.java b/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesConverter.java deleted file mode 100644 index 0c68685240..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesConverter.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.apache.maven.acm.convert; - -import org.apache.maven.acm.model.Model; -import org.apache.maven.acm.model.Environment; - -import java.io.FileInputStream; -import java.io.File; -import java.io.FilenameFilter; -import java.util.Properties; -import java.util.Iterator; - -/** - * We want to take a set of properties files, where one properties file represents - * the configuration for a particular environment, and combine them into a - * single application configuration management model. - * - * @author Jason van Zyl - * @version $Id:$ - */ -public class PropertiesConverter -{ - public Model convert( String directory ) - throws Exception - { - Model m = new Model(); - - File f = new File( directory ); - - File[] files = f.listFiles( new PropertiesFilter() ); - - for ( int i = 0; i < files.length; i++ ) - { - File p = files[i]; - - String env = p.getName(); - - env = env.substring( 0, env.indexOf( "." ) ); - - processProperties( env, p.getPath(), m ); - } - - return m; - } - - class PropertiesFilter - implements FilenameFilter - { - public boolean accept( File directory, String filename ) - { - if ( filename.endsWith( ".properties" ) ) - { - return true; - } - - return false; - } - } - - protected void processProperties( String env, String properties, Model model ) - throws Exception - { - System.out.println( "Processing " + env ); - - Environment e = new Environment(); - - e.setId( env ); - - e.setDescription( "Environment for " + env ); - - FileInputStream is = new FileInputStream( properties ); - - Properties p = new Properties(); - - p.load( is ); - - for ( Iterator i = p.keySet().iterator(); i.hasNext(); ) - { - String propertyKey = (String) i.next(); - - model.addPropertyKey( propertyKey ); - - String value = p.getProperty( propertyKey ); - - if ( value == null ) - { - value = "NOT_SET for " + env; - } - - e.addProperty( propertyKey, value ); - } - - model.addEnvironment( e ); - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesGenerator.java b/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesGenerator.java deleted file mode 100644 index 56c98f7ff4..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesGenerator.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm.convert; - -import org.apache.maven.acm.model.Model; -import org.apache.maven.acm.model.Environment; - -import java.util.Iterator; -import java.util.Properties; -import java.io.FileOutputStream; -import java.io.File; - -/** - * Take an application configuration management model and general - * properties files, one for each environment. - * - * @author Jason van Zyl - * @version $Id:$ - */ -public class PropertiesGenerator -{ - public void generate( Model model, String outputDirectory, String prefix ) - throws Exception - { - for ( Iterator i = model.getEnvironments().values().iterator(); i.hasNext(); ) - { - Environment e = (Environment) i.next(); - - Properties p = e.getProperties(); - - String filename; - - if ( prefix != null ) - { - filename = prefix + e.getId() + ".properties"; - } - else - { - filename = e.getId() + ".properties"; - } - - File outputFile = new File( outputDirectory, filename ); - - FileOutputStream os = new FileOutputStream( outputFile ); - - p.store( os, "Properties for the " + e.getId() + " environment." ); - } - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesMunger.java b/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesMunger.java deleted file mode 100644 index 9562bd771c..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/convert/PropertiesMunger.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm.convert; - -import org.apache.maven.acm.util.InterpolationFilterWriter; -import org.apache.maven.acm.util.MapInterpolationHandler; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Reader; -import java.io.Writer; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Iterator; - -/** - * This tool works in the case where you have a set of properties files that - * control your application configuration and a set of environmental properties files - * that are merged against your properties files used for your application - * configuration. - *

- * So you might have: - *

- * brioreport.properties - * config.properties - * portal.properties - *

- * These control your properties files for your application configurations. - * Then you might have the following: - *

- * dev.properties - * test.properties - * qa.properties - * prod.properties - *

- * These are properties for the environment the application is - * running in. - *

- * Our goal here is to unify these into a coherent ACM so that - * we can manage these. - *

- * In this particular case the environmental properties are used for - * swizzling the application properties above in addition to being - * used to swizzle other resources like weblogic config.xml files. - *

- * So first we will take all the application configuration properties - * and concatenate them together - * - * @author Jason van Zyl - * @version $Id:$ - */ -public class PropertiesMunger -{ - private static String APP = "application.props"; - - public void munge( File applicationSourceDirectory, - File environmentSourceDirectory, - File outputDirectory ) - throws Exception - { - if ( !outputDirectory.exists() ) - { - outputDirectory.mkdirs(); - } - - FileScanner scanner = new FileScanner(); - - File[] appProperties = scanner.scan( applicationSourceDirectory, "properties" ); - - File[] envProperties = scanner.scan( environmentSourceDirectory, "properties" ); - - // ---------------------------------------------------------------------- - // Combine all the application properties into a single file - // ---------------------------------------------------------------------- - - Properties app = new Properties(); - - Map m = new HashMap(); - - for ( int i = 0; i < appProperties.length; i++ ) - { - Properties p = new Properties(); - - p.load( new FileInputStream( appProperties[i] ) ); - - app.putAll( p ); - } - - - File aggregate = new File( outputDirectory, APP ); - - FileOutputStream os = new FileOutputStream( aggregate ); - - app.store( os, APP ); - - os.close(); - - // ---------------------------------------------------------------------- - // Now write out the template for the application configurations - // ---------------------------------------------------------------------- - - for ( int i = 0; i < envProperties.length; i++ ) - { - String envName = envProperties[i].getName(); - - envName = envName.substring( 0, envName.indexOf( "." ) ); - - Properties p = new Properties(); - - p.load( new FileInputStream( envProperties[i] ) ); - - // ------------------------------------------------------------------------ - // Now use these properties and merge them with the application.properties - // to produce a properties file targeted at a particular environment. - // ------------------------------------------------------------------------ - - Reader reader = new FileReader( aggregate ); - - File output = new File( outputDirectory, envName + ".properties" ); - - MapInterpolationHandler handler = new MapInterpolationHandler( p ); - - InterpolationFilterWriter writer = new InterpolationFilterWriter( new FileWriter( output ), handler ); - - copy( reader, writer ); - - reader.close(); - - writer.close(); - - // ------------------------------------------------------------------------ - // Now look at the difference in keys between the application configuration - // and the environment configuration and push the difference into - // application configuration so we have a self contained set of - // properties for an environment. We are basically making one - // configuration for an environment. - // ------------------------------------------------------------------------ - - Properties appProps = new Properties(); - - FileInputStream is = new FileInputStream( output ); - - appProps.load( is ); - - is.close(); - - for ( Iterator j = p.keySet().iterator(); j.hasNext(); ) - { - String key = (String) j.next(); - - if ( ! appProps.containsKey( key ) ) - { - appProps.setProperty( key, p.getProperty( key ) ); - } - } - - os = new FileOutputStream( output ); - - appProps.store( os, "props for " + envName ); - - os.close(); - } - } - - public static void copy( Reader input, Writer output ) - throws IOException - { - char[] buffer = new char[1024 * 4]; - - int n = 0; - - while ( -1 != ( n = input.read( buffer ) ) ) - { - output.write( buffer, 0, n ); - } - } - - public static void main( String[] args ) - throws Exception - { - File appSource = new File( args[0] ); - - File envSource = new File( args[1] ); - - File output = new File( args[2] ); - - PropertiesMunger munger = new PropertiesMunger(); - - munger.munge( appSource, envSource, output ); - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/model/Environment.java b/sandbox/acm/src/main/java/org/apache/maven/acm/model/Environment.java deleted file mode 100644 index 9afede0c94..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/model/Environment.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm.model; - -import java.util.Properties; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class Environment -{ - private String id; - - private String description; - - private Properties properties = new Properties(); - - public String getId() - { - return id; - } - - public void setId( String id ) - { - this.id = id; - } - - public String getDescription() - { - return description; - } - - public void setDescription( String description ) - { - this.description = description; - } - - public void addProperty( String key, String value ) - { - properties.setProperty( key, value ); - } - - public String getProperty( String key ) - { - return properties.getProperty( key ); - } - - public Properties getProperties() - { - return properties; - } - - public void setProperties( Properties properties ) - { - this.properties = properties; - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/model/Model.java b/sandbox/acm/src/main/java/org/apache/maven/acm/model/Model.java deleted file mode 100644 index 63929ab500..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/model/Model.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm.model; - -import java.util.Map; -import java.util.HashMap; -import java.util.Set; -import java.util.HashSet; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class Model -{ - private Map environments = new HashMap(); - - private Set propertyKeySet = new HashSet(); - - public void addEnvironment( Environment environment ) - { - environments.put( environment.getId(), environment ); - } - - public Map getEnvironments() - { - return environments; - } - - public Environment getEnvironment( String id ) - { - return (Environment) environments.get( id ); - } - - public void addPropertyKey( String propertyKey ) - { - propertyKeySet.add( propertyKey ); - } - - public Set getPropertyKeySet() - { - return propertyKeySet; - } - - // ---------------------------------------------------------------------- - // for each proprety key I want to know what the values are in each - // of the environments are. - // ---------------------------------------------------------------------- -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorReader.java b/sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorReader.java deleted file mode 100644 index cd40c4c668..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorReader.java +++ /dev/null @@ -1,115 +0,0 @@ -package org.apache.maven.acm.text; - -import org.apache.maven.acm.model.Environment; -import org.apache.maven.acm.model.Model; -import org.apache.maven.acm.StringInputStream; - -import java.io.BufferedReader; -import java.io.Reader; -import java.util.Iterator; -import java.util.Properties; - -/** - * @author Jason van Zyl - * @version $Id: SinkDescriptorReader.java,v 1.1 2004/09/22 00:01:42 jvanzyl Exp $ - */ -public class AcmTextDescriptorReader -{ - public Model read( Reader reader ) - throws Exception - { - Model model = new Model(); - - BufferedReader br = new BufferedReader( reader ); - - String line; - - String propertyKey = null; - - StringBuffer propertiesText = new StringBuffer(); - - while ( ( line = br.readLine() ) != null ) - { - if ( line.startsWith( "//" ) || line.startsWith( "{" ) || line.trim().length() == 0 ) - { - continue; - } - else if ( line.startsWith( "+" ) ) - { - // Process an environment definition - - Environment e = new Environment(); - - String environment = line.substring( 1 ).trim(); - - int i = environment.indexOf( "=" ); - - String id = environment.substring( 0, i - 1 ).trim(); - - String description = environment.substring( i + 1 ).trim(); - - e.setId( id ); - - e.setDescription( description ); - - model.addEnvironment( e ); - } - else if ( line.startsWith( "*" ) ) - { - propertyKey = line.substring( 1 ).trim(); - - model.addPropertyKey( propertyKey ); - - if ( propertyKey.endsWith( "{" ) ) - { - propertyKey = propertyKey.substring( 0, propertyKey.length() - 1 ).trim(); - } - } - else if ( line.endsWith( "}" ) ) - { - // This is what we're parsing: - // - // dev = devValue - // test = testValue - // qa = qaValue - // - - Properties p = new Properties(); - - p.load( new StringInputStream( propertiesText.toString() ) ); - - processProperties( model, propertyKey, p ); - - propertiesText = new StringBuffer(); - } - else - { - propertiesText.append( line ).append( "\n" ); - } - } - - return model; - } - - private void processProperties( Model model, String propertyKey, Properties properties ) - { - // Iterate though the properties and assign the value for the property key - // for each environment specified. - // - // dev = devValue - // test = testValue - // qa = qaValue - // - // So for a given propertyKey we need to assign values for the dev, test, and qa - // environments. - - for ( Iterator i = properties.keySet().iterator(); i.hasNext(); ) - { - String environmentKey = (String) i.next(); - - Environment environment = model.getEnvironment( environmentKey ); - - environment.addProperty( propertyKey, properties.getProperty( environmentKey ) ); - } - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorWriter.java b/sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorWriter.java deleted file mode 100644 index c8f54746b0..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/text/AcmTextDescriptorWriter.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.apache.maven.acm.text; - -import org.apache.maven.acm.model.Environment; -import org.apache.maven.acm.model.Model; - -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -/** - * Write out an application configuration management model in the - * simple text format. - * - * @author Jason van Zyl - * @version $Id:$ - * @todo groups of properties - * @todo sorting - * @todo order of environments inside a propertyKey setting - */ -public class AcmTextDescriptorWriter -{ - public void write( PrintWriter writer, Model model) - throws Exception - { - writeEnvironments( writer, model ); - - writeProperties( writer, model ); - - writer.flush(); - - writer.close(); - } - - protected void writeEnvironments( PrintWriter writer, Model model ) - throws Exception - { - for ( Iterator i = model.getEnvironments().values().iterator(); i.hasNext(); ) - { - Environment e = (Environment) i.next(); - - writer.print( "+" ); - - writer.print( e.getId() ); - - writer.print( " = " ); - - writer.println( e.getDescription() ); - } - - writer.println(); - } - - protected void writeProperties( PrintWriter writer, Model model ) - throws Exception - { - List sortedPropertyKeys = new ArrayList( model.getPropertyKeySet() ); - - Collections.sort( sortedPropertyKeys ); - - for ( Iterator i = sortedPropertyKeys.iterator(); i.hasNext(); ) - { - String propertyKey = (String) i.next(); - - writer.print( "*" ); - - writer.println( propertyKey ); - - writer.println( "{" ); - - // ---------------------------------------------------------------------- - // For each environment state the value for this property key - // ---------------------------------------------------------------------- - - for ( Iterator j = model.getEnvironments().values().iterator(); j.hasNext(); ) - { - Environment e = (Environment) j.next(); - - writer.print( " " ); - - writer.print( e.getId() ); - - writer.print( " = " ); - - writer.println( e.getProperty( propertyKey ) ); - } - - writer.println( "}" ); - - writer.println(); - } - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationFilterWriter.java b/sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationFilterWriter.java deleted file mode 100644 index 601e7fb798..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationFilterWriter.java +++ /dev/null @@ -1,135 +0,0 @@ -package org.apache.maven.acm.util; - -import java.io.FilterWriter; -import java.io.IOException; -import java.io.Writer; - -public class InterpolationFilterWriter - extends FilterWriter -{ - private int index = 0; - - private String beginToken; - - private int beginTokenLength; - - private StringBuffer queuedData = new StringBuffer(); - - private int beginTokenIndex; - - private int endTokenIndex; - - private String endToken; - - private int endTokenLength; - - private static String DEFAULT_BEGIN_TOKEN = "@"; - - private static String DEFAULT_END_TOKEN = "@"; - - private InterpolationHandler interpolationHandler; - - public InterpolationFilterWriter( Writer out, InterpolationHandler interpolationHandler ) - { - this( out, interpolationHandler, DEFAULT_BEGIN_TOKEN, DEFAULT_END_TOKEN ); - } - - public InterpolationFilterWriter( Writer out, InterpolationHandler interpolationHandler, String beginToken, String endToken ) - { - super( out ); - - this.interpolationHandler = interpolationHandler; - - this.beginToken = beginToken; - - beginTokenLength = beginToken.length(); - - this.endToken = endToken; - - endTokenLength = endToken.length(); - } - - - public void write( String s ) - throws IOException - { - int length = s.length(); - - for ( int i = 0; i < length; i++ ) - { - write( s.charAt( i ) ); - } - } - - public void write( char[] buf, int offset, int len ) - throws IOException - { - for ( int i = offset; i < len; i++ ) - { - write( (char) buf[i] ); - } - } - - public void write( int c ) - throws IOException - { - if ( index == 0 && c == beginToken.toCharArray()[beginTokenIndex] ) - { - if ( beginTokenIndex == ( beginTokenLength - 1 ) ) - { - beginTokenIndex = 0; - } - else - { - beginTokenIndex++; - } - - queuedData.append( (char) c ); - - index++; - } - else if ( index > 0 && c == endToken.toCharArray()[endTokenIndex] ) - { - if ( endTokenIndex == ( endTokenLength - 1 ) ) - { - queuedData.append( (char) c ); - - beginTokenIndex = 0; - - endTokenIndex = 0; - - index = 0; - - interpolate( queuedData.toString() ); - - queuedData = new StringBuffer(); - } - else - { - queuedData.append( (char) c ); - - endTokenIndex++; - - index++; - } - } - else if ( index > 0 ) - { - queuedData.append( (char) c ); - - index++; - } - else - { - out.write( c ); - } - } - - private void interpolate( String s ) - throws IOException - { - String key = s.substring( beginTokenLength, s.length() - endTokenLength ); - - interpolationHandler.interpolate( key, out ); - } -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationHandler.java b/sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationHandler.java deleted file mode 100644 index 53bd7e4ec3..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/util/InterpolationHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm.util; - -import java.io.Writer; -import java.io.IOException; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public interface InterpolationHandler -{ - public void interpolate( String key, Writer writer ) - throws IOException; -} diff --git a/sandbox/acm/src/main/java/org/apache/maven/acm/util/MapInterpolationHandler.java b/sandbox/acm/src/main/java/org/apache/maven/acm/util/MapInterpolationHandler.java deleted file mode 100644 index 9926d2da4e..0000000000 --- a/sandbox/acm/src/main/java/org/apache/maven/acm/util/MapInterpolationHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.apache.maven.acm.util; - -import java.util.Map; -import java.io.IOException; -import java.io.Writer; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class MapInterpolationHandler - implements InterpolationHandler -{ - private Map map; - - public MapInterpolationHandler( Map map ) - { - this.map = map; - } - - public void interpolate( String key, Writer out ) - throws IOException - { - Object o = map.get( key ); - - if ( o == null ) - { - out.write( key ); - } - else - { - out.write( o.toString() ); - } - } -} diff --git a/sandbox/acm/src/test/java/org/apache/maven/acm/AcmTest.java b/sandbox/acm/src/test/java/org/apache/maven/acm/AcmTest.java deleted file mode 100644 index edcf9b3a6b..0000000000 --- a/sandbox/acm/src/test/java/org/apache/maven/acm/AcmTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.apache.maven.acm; - -import junit.framework.TestCase; - -/** - * Unit test for simple App. - * - * @author Jason van Zyl - */ -public class AcmTest - extends TestCase -{ - public void testAcmSettingTheDefaultSystemId() - throws Exception - { - Acm acm = new Acm( "dev", new PropertiesProvider() ); - - assertEquals( "dev", acm.getParameter( "system" ) ); - - assertEquals( "test", acm.getParameter( "test", "system" ) ); - - assertEquals( "qa", acm.getParameter( "qa", "system" ) ); - - assertEquals( "production", acm.getParameter( "production", "system" ) ); - } -} diff --git a/sandbox/acm/src/test/java/org/apache/maven/acm/AcmTextDescriptorReaderTest.java b/sandbox/acm/src/test/java/org/apache/maven/acm/AcmTextDescriptorReaderTest.java deleted file mode 100644 index 436b9d51af..0000000000 --- a/sandbox/acm/src/test/java/org/apache/maven/acm/AcmTextDescriptorReaderTest.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm; - -import junit.framework.TestCase; - -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.FileWriter; -import java.io.Writer; -import java.io.PrintWriter; -import java.io.File; - -import org.apache.maven.acm.model.Model; -import org.apache.maven.acm.model.Environment; -import org.apache.maven.acm.text.AcmTextDescriptorReader; -import org.apache.maven.acm.text.AcmTextDescriptorWriter; -import org.apache.maven.acm.convert.PropertiesConverter; -import org.apache.maven.acm.convert.PropertiesGenerator; - -/** - * Unit test for simple App. - * - * @author Jason van Zyl - */ -public class AcmTextDescriptorReaderTest - extends TestCase -{ - private String basedir; - - protected void setUp() - throws Exception - { - basedir = System.getProperty( "basedir" ); - } - - public void testTextDescriptorReaderTest() - throws Exception - { - Model model = getModel(); - - testModel( model ); - - writeModel( model, "foo.txt" ); - } - - protected void writeModel( Model model, String file ) - throws Exception - { - PrintWriter writer = new PrintWriter( new FileWriter( file ) ); - - AcmTextDescriptorWriter w = new AcmTextDescriptorWriter(); - - w.write( writer, model ); - } - - protected void testModel( Model model ) - throws Exception - { - assertEquals( 4, model.getEnvironments().size() ); - - Environment dev = model.getEnvironment( "dev" ); - - assertNotNull( dev ); - - assertEquals( "devValue", dev.getProperty( "tas.editor.stamp" ) ); - } - - protected Model getModel() - throws Exception - { - AcmTextDescriptorReader reader = new AcmTextDescriptorReader(); - - InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( "config.txt" ); - - Model model = reader.read( new InputStreamReader( is ) ); - - return model; - } - - public void testPropertiesConverter() - throws Exception - { - PropertiesConverter converter = new PropertiesConverter(); - - Model model = converter.convert( new File( basedir, "config").getPath() ); - - writeModel( model, "toyota.config" ); - - PropertiesGenerator pg = new PropertiesGenerator(); - - pg.generate( model, new File( basedir, "target" ).getPath(), "t3_" ); - } -} diff --git a/sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesComparatorTest.java b/sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesComparatorTest.java deleted file mode 100644 index 34ed74960e..0000000000 --- a/sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesComparatorTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.apache.maven.acm; - -import junit.framework.TestCase; - -import java.util.Properties; -import java.util.List; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class PropertiesComparatorTest - extends TestCase -{ - public void testPropertiesComparator() - throws Exception - { - Properties source = new Properties(); - - Properties target = new Properties(); - - source.setProperty( "property0", "value0" ); - - source.setProperty( "property1", "value1" ); - - target.setProperty( "property3", "value3" ); - - PropertiesComparator pc = new PropertiesComparator(); - - List diff = pc.compare( source, target ); - - assertTrue( diff.contains( "property0" ) ); - - assertTrue( diff.contains( "property1" ) ); - } -} diff --git a/sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesMungerTest.java b/sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesMungerTest.java deleted file mode 100644 index f743301e01..0000000000 --- a/sandbox/acm/src/test/java/org/apache/maven/acm/PropertiesMungerTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2005 Your Corporation. All Rights Reserved. - */ -package org.apache.maven.acm; - -import junit.framework.TestCase; -import org.apache.maven.acm.convert.PropertiesMunger; - -import java.io.File; - -/** - * @author Jason van Zyl - * @version $Id:$ - */ -public class PropertiesMungerTest - extends TestCase -{ - - - public void testPropertiesMunger() - throws Exception - { - String basedir = System.getProperty( "basedir" ); - - PropertiesMunger munger = new PropertiesMunger(); - - File appSource = new File( basedir, "t3/app" ); - - File envSource = new File( basedir, "t3/env" ); - - File output = new File( basedir, "target/config" ); - - munger.munge( appSource, envSource, output ); - } -} diff --git a/sandbox/acm/src/test/resources/config.txt b/sandbox/acm/src/test/resources/config.txt deleted file mode 100644 index 4400a15042..0000000000 --- a/sandbox/acm/src/test/resources/config.txt +++ /dev/null @@ -1,13 +0,0 @@ -+dev = Dev environment -+qa = QA environment -+test = Test environment -+prod = Production Environment - -*tas.editor.stamp -{ - dev = devValue - qa = qaValue - test = testValue - prod = prodValue -} - diff --git a/sandbox/acm/src/test/resources/dev.properties b/sandbox/acm/src/test/resources/dev.properties deleted file mode 100644 index 2372d16601..0000000000 --- a/sandbox/acm/src/test/resources/dev.properties +++ /dev/null @@ -1 +0,0 @@ -system=dev \ No newline at end of file diff --git a/sandbox/acm/src/test/resources/production.properties b/sandbox/acm/src/test/resources/production.properties deleted file mode 100644 index c149fa4267..0000000000 --- a/sandbox/acm/src/test/resources/production.properties +++ /dev/null @@ -1 +0,0 @@ -system=production diff --git a/sandbox/acm/src/test/resources/qa.properties b/sandbox/acm/src/test/resources/qa.properties deleted file mode 100644 index ed44342e33..0000000000 --- a/sandbox/acm/src/test/resources/qa.properties +++ /dev/null @@ -1 +0,0 @@ -system=qa \ No newline at end of file diff --git a/sandbox/acm/src/test/resources/test.properties b/sandbox/acm/src/test/resources/test.properties deleted file mode 100644 index 4426c0c2cf..0000000000 --- a/sandbox/acm/src/test/resources/test.properties +++ /dev/null @@ -1 +0,0 @@ -system=test \ No newline at end of file diff --git a/sandbox/acm/t3/app/brioreport.properties b/sandbox/acm/t3/app/brioreport.properties deleted file mode 100644 index 888166c7c5..0000000000 --- a/sandbox/acm/t3/app/brioreport.properties +++ /dev/null @@ -1,14 +0,0 @@ -report.key.reportHost=smbrip11 -report.key.reportPort=1820 -report.mutex.time=10 -report.key.reportBase=/t3reporting -# local dev -#report.key.proxy=http://smbrit02 -# deployment -report.key.proxy= -report.key.reportURI=/T3/ -report.tas.report.url=/t3reporting/browse/get/T3/BQYs/Search%20TAS%20Cases - - -# test configuration -app.junit.test=TRUE \ No newline at end of file diff --git a/sandbox/acm/t3/app/config.properties b/sandbox/acm/t3/app/config.properties deleted file mode 100644 index c24331e87b..0000000000 --- a/sandbox/acm/t3/app/config.properties +++ /dev/null @@ -1,36 +0,0 @@ -# This can be configured to WEBSERVICE or CONTROL -env.portal.control.config=CONTROL - -# ldap environment -- use ldaps instead of ldap for SSL protocol -env.portal.ldap.protocol=ldap -env.portal.ldap.host=tau.tms.toyota.com -env.portal.ldap.port=389 -env.portal.ldap.initial_context_factory=com.sun.jndi.ldap.LdapCtxFactory -env.portal.ldap.security_authentication=simple -env.portal.ldap.security_principal.prefix=cn= -env.portal.ldap.security_principal.suffix=,ou=people,ou=tms,ou=intranet,o=teds - -# database environment -env.portal.datasource.name=jdbc/globalDataSource - -# environment web service http -env.portal.webservice.host=smpqsd01 -env.portal.webservice.port=7041 - -# environment web service http for timers -env.portal.id.webservice.host=localhost -env.portal.id.webservice.port=7021 - -# enviroment web service timer url -env.timer.webservice.host=localhost -env.timer.webservice.port=7021 - -# search properties -env.search.beginUri=http://t3privdev.tms.toyota.com/t3Portal/internal -env.search.queryTables=APPL_SERV_CAT_PREPRESS_VW SCA, APPL_VEH_PREPRESS_VW VA - -# application url -env.application.url=http://t3privdev.tms.toyota.com - -# test configuration -app.junit.test=TRUE diff --git a/sandbox/acm/t3/app/portal.properties b/sandbox/acm/t3/app/portal.properties deleted file mode 100644 index bf1250fe23..0000000000 --- a/sandbox/acm/t3/app/portal.properties +++ /dev/null @@ -1,80 +0,0 @@ -tas.editor.stamp=\n--------------- {0} at {1} ---------------\n\n - -# Days before a document is expired only used when it is in the initiated state -tas.editor.expire.initiated=14 - -# Years before any other document is expired -tas.editor.expire.non-initiated=5 - -# Portal Properties for Reassignment Failure -tas.editor.reassigment=TA Case has been reassigned to {0} [{1}]. -tas.editor.escalated=TA Case has been escalated to {0} [{1}]. - -### REMOVE the lines below after the 7th Iteration -tas.editor.temp.firstname=Mike -tas.editor.temp.lastname=Robinson -tas.editor.temp.commonname=robinsm1234@toyota.com -tas.editor.temp.principal=robinsm1234@toyota.com - -# Tas Dealer/Technician -tas.dealer.technicianname=Unlisted Techninican -tas.dealer.technicianid=unlisted_id - -# TA Email Properties -tas.email.from.name=T3_TAS_NOTIFIER -tas.email.from.email=Russell_Suzuki@toyota.com -tas.email.cc.email=I_DO_NOT_EXIST_TEST_EMAIL@toyota.com -tas.email.smtp=tiemann.tms.toyota.com -tas.email.escalate.subject=TAS Case {0} -tas.email.escalate.body=TAS Case {0} is being forwarded to you for further assistance. Please login into the T3 system ({1}) to resolve the case. -tas.email.reassign.subject=TAS Case {0} -tas.email.reassign.body=TAS Case {0} is being forwarded to you for further assistance. Please login into the T3 system ({1}) to resolve the case. -tas.email.url=http://t3privdev.tms.toyota.com/t3Portal -tas.email.ready=true - -# TA CC Composer Properties -tas.message.composer.subject=TAS Notification: TA Case {0} -tas.message.composer.body=TAS Case {0} has been forwarded to you for information and reference purposes. For further details please log into the T3 system.\n\n - - -# TA Viewer Configurations -tas.viewer.ta.select=select tas.T3_ID as "tasID", tas.STATUS_CODE as "statusCode", tas.CREATION_TIMESTAMP as "creationTime", tas.LAST_MODIFIED_TIMESTAMP as "lastModTime", tas.CREATOR_USERID as "creatorUserId", tas.CREATOR_NAME as "creatorName", tas.OWNER_USERID as "ownerUserId", tas.OWNER_NAME as "ownerName", tas.DEALER_TECH_USERID as "dealerTechUserId", tas.DEALER_TECH_NAME as "dealerTechName", tas.DEALER_TECH_INITIATED as "dealerTechInitiated", tas.DEALER_CODE as "dealerCode", tas.DEALER_NAME as "dealerName", tas.DEALER_REGION_CODE as "dealerRegionCode", tas.QA_DEPARTMENT_NAME as "qaDepartmentName", tas.SERVICE_CATEGORY_CODE as "serviceCategoryCode", tas.SERVICE_CATEGORY_DESC as "serviceCategoryDescription", tas.SECTION_CODE as "sectionCode", tas.SECTION_DESC as "sectionDescription", tas.SUB_COMPONENT_CODE as "subcomponentCode", tas.SUB_COMPONENT_DESC as "subcomponentDescription", tas.CONDITION_CODE as "conditionCode", tas.CONDITION_DESC as "conditionDescription", tas.CAUSE_COMPONENT_CODE as "causeComponentCode", tas.CAUSE_COMPONENT_DESC as "causeComponentDescription", tas.CAUSE_SUB_COMP_CODE as "causeSubcomponentCode", tas.CAUSE_SUB_COMP_DESC as "causeSubcomponentDescription", tas.CAUSE_CONDITION_CODE as "causeConditionCode", tas.CAUSE_CONDITION_DESC as "causeConditionDescription" from dctm_tas_general_info tas, dctm_tas_dtc_codes dtc -tas.viewer.ta.order=order by STATUS_CODE, T3_ID -tas.viewer.ta.window.title=TA+Viewer:: - -# TC Viewer SQL Strings -tas.viewer.tc.select=select distinct T3_ID as "T3_ID", obj.i_chronicle_id as "I_CHRONICLE_ID", obj.object_type as "OBJECT_TYPE", obj.publication_number as "PUBLICATION_NUMBER", obj.object_title as "OBJECT_TITLE", sc.service_category_code as "serviceCategory", sc.section_code as "section", sc.sub_component_code as "subComponent", veh.division_code as "division", veh.model_name as "model", veh.model_year as "year", veh.vds as "vds" from applicability_object obj, applicability_veh veh, applicability_serv_cat sc where {0} veh.i_chronicle_id = sc.i_chronicle_id and veh.i_chronicle_id=obj.i_chronicle_id -tas.viewer.tc.where.all=0 -tas.viewer.tc.object.state=internal -tas.viewer.tc.items.per.page=15 -tas.viewer.tc.access.TCTMS=ProductEngineer,TASSupervisor,TASEditor,TASReviewer,TASAdmin,SystemAdmin -tas.viewer.tc.access.TCRegion=FieldEngineer -tas.viewer.tc.access.TCAll=Observer - -# TA Helper Configuration -tas.editor.helper.element.service.category=TMSMeta-service_category -tas.editor.helper.element.section=TMSMeta-section -tas.editor.helper.element.subcomponent=TMSMeta-subcomponent -tas.editor.helper.element.condition=TMSMeta-symptom -tas.editor.helper.element.cause.comp=TQNET-cause_comp_area -tas.editor.helper.element.cause.subcomp=TQNET-cause_sub_comp -tas.editor.helper.element.cause.condition=TQNET-cause_condition -tas.editor.helper.namespace=http://common.t3.tms.com/xmlbeans/ta -tas.editor.helper.attribute.code=code - -# TAS Data Query Time in Seconds -tas.reference.default.querytime=10 - -# UUP completion -app.uup.completed=TRUE - -# TAS Attachment -tas.editor.attachment.path=C:/dev/attachment/ -tas.editor.attachment.activate=true -tas.editor.attachment.maxattachmentinsertion=128 - -# test configuration -app.junit.test=TRUE - -# home page forward -t3.forward.uri=/appmanager/t3/int \ No newline at end of file diff --git a/sandbox/acm/t3/env/dev.properties b/sandbox/acm/t3/env/dev.properties deleted file mode 100644 index 24b59ed6ba..0000000000 --- a/sandbox/acm/t3/env/dev.properties +++ /dev/null @@ -1,82 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlpdev1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpint -weblogic.database.server=hppqsd01 -weblogic.database.port=1521 -weblogic.database.SID=T3DD - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3datglobl -refinery.database.server=hppqsd01 -refinery.database.port=1521 -refinery.database.SID=T3DD - -refineryext.database.user=t3datglobl -refineryext.database.password=t3datglobl -refineryext.database.server=hppqsd01 -refineryext.database.port=1521 -refineryext.database.SID=T3DD - -weblogic.admin.host=smpqsd01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=smtbgd01 -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intportalbrokert3 -weblogic.IAExtension.SiteMinderAdmin=siteminder -weblogic.IAExtension.SiteMinderAdminPassword={3DES}3x8+x75ipmk= -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=15 - -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=true -weblogicxml.jsp.pageCheckSeconds=1 -weblogicxml.jsp.precompile=false -weblogicxml.jsp.precompileContinue=false - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlpdev1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlpdev1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqsd01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3privdev.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqsd01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqsd01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3privdev.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlpdev1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrit03.tms.toyota.com -report.key.reportPort=1810 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100f6bb076d-0000-eafc-0a311104&DocVersion=1&JScript=enable \ No newline at end of file diff --git a/sandbox/acm/t3/env/prod.properties b/sandbox/acm/t3/env/prod.properties deleted file mode 100644 index 4b148dab66..0000000000 --- a/sandbox/acm/t3/env/prod.properties +++ /dev/null @@ -1,84 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlppp1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpintprod -weblogic.database.server=hppqsp11 -weblogic.database.port=1521 -weblogic.database.SID=T3IP - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3dgprod -refinery.database.server=hppqsp11 -refinery.database.port=1521 -refinery.database.SID=T3IP - -refineryext.database.user=t3datglobl -refineryext.database.password=t3dgprod -refineryext.database.server=hppqsp11 -refineryext.database.port=1521 -refineryext.database.SID=T3IP - -weblogic.admin.host=smpqsp01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=smtbgp05.tms.toyota.com -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intPortalBrokert3 -weblogic.IAExtension.SiteMinderAdmin=t3admin -weblogic.IAExtension.SiteMinderAdminPassword={3DES}FZxvhDswJrc= -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=100 - -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=false -weblogicxml.jsp.pageCheckSeconds=-1 -weblogicxml.jsp.precompile=true -weblogicxml.jsp.precompileContinue=true - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlppp1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlppp1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqsp01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqsp01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqsp01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlppp1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrip10.tms.toyota.com -report.key.reportPort=1800 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100966a65c0-0000-81b5-0a3f070a&DOC_VERSION=1&JScript=enable - - diff --git a/sandbox/acm/t3/env/qa.properties b/sandbox/acm/t3/env/qa.properties deleted file mode 100644 index 313ddec012..0000000000 --- a/sandbox/acm/t3/env/qa.properties +++ /dev/null @@ -1,83 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlpqa1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpint -weblogic.database.server=hppqsq11 -weblogic.database.port=1521 -weblogic.database.SID=T3IA - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3datglobl -refinery.database.server=hppqsq11 -refinery.database.port=1521 -refinery.database.SID=T3IA - -refineryext.database.user=t3datglobl -refineryext.database.password=t3datglobl -refineryext.database.server=hppqsq11 -refineryext.database.port=1521 -refineryext.database.SID=T3IA - -weblogic.admin.host=smpqsq01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=smtbgq15.tms.toyota.com -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intPortalBrokert3 -weblogic.IAExtension.SiteMinderAdmin=t3admin -weblogic.IAExtension.SiteMinderAdminPassword=42T3amm -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=100 - -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=false -weblogicxml.jsp.pageCheckSeconds=-1 -weblogicxml.jsp.precompile=true -weblogicxml.jsp.precompileContinue=true - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlpqa1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlpqa1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqsq01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3qa.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqsq01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqsq01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3qa.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlpqa1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrip11.tms.toyota.com -report.key.reportPort=1820 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=000001005330d663-0000-ea23-0a3f070b&DOC_VERSION=1&JScript=enable - diff --git a/sandbox/acm/t3/env/test.properties b/sandbox/acm/t3/env/test.properties deleted file mode 100644 index 24cca998fc..0000000000 --- a/sandbox/acm/t3/env/test.properties +++ /dev/null @@ -1,81 +0,0 @@ -unix.bea.dir=/t3/apps/wl/8.1.3 -win.bea.dir=/bea -jdk.ver=jdk142_04 -weblogic.ver=weblogic81 - -unix.cvsroot.dir=/t3/build/cruisecontrol/checkout -win.cvsroot.dir=/dev - -win.deploy.dir=/dev/t3/library/deploy -unix.deploy.dir=/t3/envs/wlptest1 - -weblogic.domain.name=iPortal - -weblogic.database.user=t3wlpint -weblogic.database.password=t3wlpint -weblogic.database.server=hppqsd01 -weblogic.database.port=1521 -weblogic.database.SID=T3DT - -# Used by i/ePortal -refinery.database.user=t3datglobl -refinery.database.password=t3datglobl -refinery.database.server=hppqsd01 -refinery.database.port=1521 -refinery.database.SID=T3DT - -refineryext.database.user=t3datglobl -refineryext.database.password=t3datglobl -refineryext.database.server=hppqsd01 -refineryext.database.port=1521 -refineryext.database.SID=T3DT - -weblogic.admin.host=smpqst01 -weblogic.admin.port=7021 -weblogic.admin.sslport=7022 -weblogic.debug.port=8023 - -weblogic.system.user=system -weblogic.system.password=password -weblogic.NovellAuthenticator.host=tau.tms.toyota.com -weblogic.NovellAuthenticator.principal=cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -weblogic.NovellAuthenticator.password=intPortalBrokert3 -weblogic.IAExtension.SiteMinderAdmin=siteminder -weblogic.IAExtension.SiteMinderAdminPassword={3DES}PeLrMhffwaQ= -weblogic.additional.security=Security:Name=myrealmIAExtension -weblogic.ExecuteQueue=15 -# web.xml configuration -webxml.auth-method=CLIENT-CERT - -# weblogic.xml configuration -weblogicxml.publisher.local-path=/t3/data/pub -weblogicxml.staticcontent.local-path=/t3/data -weblogicxml.jsp.debug=true -weblogicxml.jsp.pageCheckSeconds=1 -weblogicxml.jsp.precompile=false -weblogicxml.jsp.precompileContinue=false - -# log4j.properties configuration -log4j.configuration.file=file:/t3/envs/wlptest1/iPortal/log4j.properties -log4j.log.dir=/t3/envs/wlptest1/iPortal/logs - -# application.properties configuration -app.portal.enviroment=internal - -# config.properties configuration -env.portal.webservice.host=smpqst01 -env.portal.webservice.port=7041 -env.search.beginUri=http://t3test.tms.toyota.com/t3Portal/internal -env.timer.webservice.host=smpqst01 -env.timer.webservice.port=7021 -env.portal.id.webservice.host=smpqst01 -env.portal.id.webservice.port=7021 - -# portal.properties configuration -tas.email.url=http://t3test.tms.toyota.com/t3Portal -tas.editor.attachment.path=/t3/envs/wlptest1/iPortal/attachment/ - -# brioreport.properties configuration -report.key.reportHost=smbrit03.tms.toyota.com -report.key.reportPort=1810 -report.tas.report.url=/t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100f6bb076d-0000-eafc-0a311104&DocVersion=1&JScript=enable \ No newline at end of file diff --git a/sandbox/acm/t3/make-config.sh b/sandbox/acm/t3/make-config.sh deleted file mode 100755 index 34b16ff91e..0000000000 --- a/sandbox/acm/t3/make-config.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -# ------------------------------------------------------------- -# This process creates the application configuration properties -# ------------------------------------------------------------ - -envProperties=/t3/build/cruisecontrol/checkout/t3/library/config -templateProperties=/t3/build/cruisecontrol/checkout/t3/library/src/application/t3PortalApp/portal_properties/internal - -envs="wlpdev1 wlptest1 wlpqa1 wlppp1" - -for i in $envs -do - cp $envProperties/env.properties.iportal.${i} ${i}.properties -done - -mv wlpdev1.properties dev.properties -mv wlptest1.properties test.properties -mv wlpqa1.properties qa.properties -mv wlppp1.properties prod.properties - -mkdir env - -mv *.properties env - -mkdir app - -cp $templateProperties/portal.properties app -cp $templateProperties/config.properties app -cp $templateProperties/brioreport.properties app diff --git a/sandbox/acm/toyota.config b/sandbox/acm/toyota.config deleted file mode 100644 index f8ef75ed27..0000000000 --- a/sandbox/acm/toyota.config +++ /dev/null @@ -1,477 +0,0 @@ -+qa = Environment for qa -+prod = Environment for prod -+dev = Environment for dev -+test = Environment for test - -*app.portal.enviroment -{ - qa = internal - prod = internal - dev = internal - test = internal -} - -*env.portal.id.webservice.host -{ - qa = smpqsq01 - prod = smpqsp01 - dev = smpqsd01 - test = smpqst01 -} - -*env.portal.id.webservice.port -{ - qa = 7021 - prod = 7021 - dev = 7021 - test = 7021 -} - -*env.portal.webservice.host -{ - qa = smpqsq01 - prod = smpqsp01 - dev = smpqsd01 - test = smpqst01 -} - -*env.portal.webservice.port -{ - qa = 7041 - prod = 7041 - dev = 7041 - test = 7041 -} - -*env.search.beginUri -{ - qa = http://t3qa.tms.toyota.com/t3Portal/internal - prod = http://t3.tms.toyota.com/t3Portal/internal - dev = http://t3privdev.tms.toyota.com/t3Portal/internal - test = http://t3test.tms.toyota.com/t3Portal/internal -} - -*env.timer.webservice.host -{ - qa = smpqsq01 - prod = smpqsp01 - dev = smpqsd01 - test = smpqst01 -} - -*env.timer.webservice.port -{ - qa = 7021 - prod = 7021 - dev = 7021 - test = 7021 -} - -*jdk.ver -{ - qa = jdk142_04 - prod = jdk142_04 - dev = jdk142_04 - test = jdk142_04 -} - -*log4j.configuration.file -{ - qa = file:/t3/envs/wlpqa1/iPortal/log4j.properties - prod = file:/t3/envs/wlppp1/iPortal/log4j.properties - dev = file:/t3/envs/wlpdev1/iPortal/log4j.properties - test = file:/t3/envs/wlptest1/iPortal/log4j.properties -} - -*log4j.log.dir -{ - qa = /t3/envs/wlpqa1/iPortal/logs - prod = /t3/envs/wlppp1/iPortal/logs - dev = /t3/envs/wlpdev1/iPortal/logs - test = /t3/envs/wlptest1/iPortal/logs -} - -*refinery.database.SID -{ - qa = T3IA - prod = T3IP - dev = T3DD - test = T3DT -} - -*refinery.database.password -{ - qa = t3datglobl - prod = t3dgprod - dev = t3datglobl - test = t3datglobl -} - -*refinery.database.port -{ - qa = 1521 - prod = 1521 - dev = 1521 - test = 1521 -} - -*refinery.database.server -{ - qa = hppqsq11 - prod = hppqsp11 - dev = hppqsd01 - test = hppqsd01 -} - -*refinery.database.user -{ - qa = t3datglobl - prod = t3datglobl - dev = t3datglobl - test = t3datglobl -} - -*refineryext.database.SID -{ - qa = T3IA - prod = T3IP - dev = T3DD - test = T3DT -} - -*refineryext.database.password -{ - qa = t3datglobl - prod = t3dgprod - dev = t3datglobl - test = t3datglobl -} - -*refineryext.database.port -{ - qa = 1521 - prod = 1521 - dev = 1521 - test = 1521 -} - -*refineryext.database.server -{ - qa = hppqsq11 - prod = hppqsp11 - dev = hppqsd01 - test = hppqsd01 -} - -*refineryext.database.user -{ - qa = t3datglobl - prod = t3datglobl - dev = t3datglobl - test = t3datglobl -} - -*report.key.reportHost -{ - qa = smbrip11.tms.toyota.com - prod = smbrip10.tms.toyota.com - dev = smbrit03.tms.toyota.com - test = smbrit03.tms.toyota.com -} - -*report.key.reportPort -{ - qa = 1820 - prod = 1800 - dev = 1810 - test = 1810 -} - -*report.tas.report.url -{ - qa = /t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=000001005330d663-0000-ea23-0a3f070b&DOC_VERSION=1&JScript=enable - prod = /t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100966a65c0-0000-81b5-0a3f070a&DOC_VERSION=1&JScript=enable - dev = /t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100f6bb076d-0000-eafc-0a311104&DocVersion=1&JScript=enable - test = /t3reporting/dataaccess/Browse?REQUEST_TYPE=GET_DOCUMENT&DOC_UUID=00000100f6bb076d-0000-eafc-0a311104&DocVersion=1&JScript=enable -} - -*tas.editor.attachment.path -{ - qa = /t3/envs/wlpqa1/iPortal/attachment/ - prod = /t3/envs/wlppp1/iPortal/attachment/ - dev = /t3/envs/wlpdev1/iPortal/attachment/ - test = /t3/envs/wlptest1/iPortal/attachment/ -} - -*tas.email.url -{ - qa = http://t3qa.tms.toyota.com/t3Portal - prod = http://t3.tms.toyota.com/t3Portal - dev = http://t3privdev.tms.toyota.com/t3Portal - test = http://t3test.tms.toyota.com/t3Portal -} - -*unix.bea.dir -{ - qa = /t3/apps/wl/8.1.3 - prod = /t3/apps/wl/8.1.3 - dev = /t3/apps/wl/8.1.3 - test = /t3/apps/wl/8.1.3 -} - -*unix.cvsroot.dir -{ - qa = /t3/build/cruisecontrol/checkout - prod = /t3/build/cruisecontrol/checkout - dev = /t3/build/cruisecontrol/checkout - test = /t3/build/cruisecontrol/checkout -} - -*unix.deploy.dir -{ - qa = /t3/envs/wlpqa1 - prod = /t3/envs/wlppp1 - dev = /t3/envs/wlpdev1 - test = /t3/envs/wlptest1 -} - -*weblogic.ExecuteQueue -{ - qa = 100 - prod = 100 - dev = 15 - test = 15 -} - -*weblogic.IAExtension.SiteMinderAdmin -{ - qa = t3admin - prod = t3admin - dev = siteminder - test = siteminder -} - -*weblogic.IAExtension.SiteMinderAdminPassword -{ - qa = 42T3amm - prod = {3DES}FZxvhDswJrc= - dev = {3DES}3x8+x75ipmk= - test = {3DES}PeLrMhffwaQ= -} - -*weblogic.NovellAuthenticator.host -{ - qa = smtbgq15.tms.toyota.com - prod = smtbgp05.tms.toyota.com - dev = smtbgd01 - test = tau.tms.toyota.com -} - -*weblogic.NovellAuthenticator.password -{ - qa = intPortalBrokert3 - prod = intPortalBrokert3 - dev = intportalbrokert3 - test = intPortalBrokert3 -} - -*weblogic.NovellAuthenticator.principal -{ - qa = cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds - prod = cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds - dev = cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds - test = cn=T3intPortalBroker,ou=svcaccounts,ou=spec,o=teds -} - -*weblogic.additional.security -{ - qa = Security:Name=myrealmIAExtension - prod = Security:Name=myrealmIAExtension - dev = Security:Name=myrealmIAExtension - test = Security:Name=myrealmIAExtension -} - -*weblogic.admin.host -{ - qa = smpqsq01 - prod = smpqsp01 - dev = smpqsd01 - test = smpqst01 -} - -*weblogic.admin.port -{ - qa = 7021 - prod = 7021 - dev = 7021 - test = 7021 -} - -*weblogic.admin.sslport -{ - qa = 7022 - prod = 7022 - dev = 7022 - test = 7022 -} - -*weblogic.database.SID -{ - qa = T3IA - prod = T3IP - dev = T3DD - test = T3DT -} - -*weblogic.database.password -{ - qa = t3wlpint - prod = t3wlpintprod - dev = t3wlpint - test = t3wlpint -} - -*weblogic.database.port -{ - qa = 1521 - prod = 1521 - dev = 1521 - test = 1521 -} - -*weblogic.database.server -{ - qa = hppqsq11 - prod = hppqsp11 - dev = hppqsd01 - test = hppqsd01 -} - -*weblogic.database.user -{ - qa = t3wlpint - prod = t3wlpint - dev = t3wlpint - test = t3wlpint -} - -*weblogic.debug.port -{ - qa = 8023 - prod = 8023 - dev = 8023 - test = 8023 -} - -*weblogic.domain.name -{ - qa = iPortal - prod = iPortal - dev = iPortal - test = iPortal -} - -*weblogic.system.password -{ - qa = password - prod = password - dev = password - test = password -} - -*weblogic.system.user -{ - qa = system - prod = system - dev = system - test = system -} - -*weblogic.ver -{ - qa = weblogic81 - prod = weblogic81 - dev = weblogic81 - test = weblogic81 -} - -*weblogicxml.jsp.debug -{ - qa = false - prod = false - dev = true - test = true -} - -*weblogicxml.jsp.pageCheckSeconds -{ - qa = -1 - prod = -1 - dev = 1 - test = 1 -} - -*weblogicxml.jsp.precompile -{ - qa = true - prod = true - dev = false - test = false -} - -*weblogicxml.jsp.precompileContinue -{ - qa = true - prod = true - dev = false - test = false -} - -*weblogicxml.publisher.local-path -{ - qa = /t3/data/pub - prod = /t3/data/pub - dev = /t3/data/pub - test = /t3/data/pub -} - -*weblogicxml.staticcontent.local-path -{ - qa = /t3/data - prod = /t3/data - dev = /t3/data - test = /t3/data -} - -*webxml.auth-method -{ - qa = CLIENT-CERT - prod = CLIENT-CERT - dev = CLIENT-CERT - test = CLIENT-CERT -} - -*win.bea.dir -{ - qa = /bea - prod = /bea - dev = /bea - test = /bea -} - -*win.cvsroot.dir -{ - qa = /dev - prod = /dev - dev = /dev - test = /dev -} - -*win.deploy.dir -{ - qa = /dev/t3/library/deploy - prod = /dev/t3/library/deploy - dev = /dev/t3/library/deploy - test = /dev/t3/library/deploy -} - diff --git a/sandbox/csharp/maven-csharp-plugin/pom.xml b/sandbox/csharp/maven-csharp-plugin/pom.xml deleted file mode 100644 index 8baa9c8fb8..0000000000 --- a/sandbox/csharp/maven-csharp-plugin/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - org.apache.maven.plugins - maven-plugin-parent - 2.0-beta-1-SNAPSHOT - - maven-csharp-plugin - maven-plugin - csharp-plugin - 1.0-SNAPSHOT - 2005 - M2 csharp plugin - - - - Gilles Dodinet - gdodinet@karmicsoft.com - Karmic Software Research - - - - - - org.apache.maven - maven-artifact - 2.0-beta-1-SNAPSHOT - - - org.apache.maven - maven-project - 2.0-beta-1-SNAPSHOT - - - plexus - plexus-compiler-api - 1.2 - - - ant - ant - 1.6.5 - - - ant - ant-nodeps - 1.6.5 - - - - diff --git a/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompiler.java b/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompiler.java deleted file mode 100644 index 9d2be58e91..0000000000 --- a/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompiler.java +++ /dev/null @@ -1,157 +0,0 @@ -package org.apache.plugins.csharp.compiler; - -/* - * Copyright 2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.plugins.csharp.helpers.AntBuildListener; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.taskdefs.optional.dotnet.CSharp; -import org.codehaus.plexus.compiler.AbstractCompiler; -import org.codehaus.plexus.compiler.CompilerConfiguration; - -import java.io.File; -import java.util.List; -import java.util.Map; - -/** - * @author Gilles Dodinet - * @version $Id$ - */ -public class CSharpCompiler - extends AbstractCompiler -{ - private File basedir; - - private AntBuildListener antBuildListener; - - private String references; - - public List compile( CompilerConfiguration config ) - throws Exception - { - - CSharp csc = createCompiler( config ); - - csc.execute(); - - return null; - } - - private CSharp createCompiler( CompilerConfiguration config ) - throws Exception - { - Map compilerOptions = config.getCompilerOptions(); - - CSharp csc = new CSharp(); - - Project antProject = new Project(); - antProject.setBaseDir( basedir ); - - if ( antBuildListener == null ) - { - antBuildListener = new AntBuildListener(); - } - - antProject.addBuildListener( antBuildListener ); - - csc.setProject( antProject ); - - csc.setOptimize( getBooleanOption( compilerOptions, "optimize", true ) ); - csc.setUnsafe( getBooleanOption( compilerOptions, "unsafe", false ) ); - csc.setIncremental( getBooleanOption( compilerOptions, "incremental", false ) ); - csc.setFullPaths( getBooleanOption( compilerOptions, "fullpaths", true ) ); - csc.setWarnLevel( getIntOption( compilerOptions, "warnLevel", 4 ) ); - csc.setDebug( getBooleanOption( compilerOptions, "debug", true ) ); - - csc.setMainClass( (String) compilerOptions.get( "mainClass" ) ); - - String type = (String) compilerOptions.get( "type" ); - - csc.setTargetType( type ); - csc.setReferences( references ); - - File destDir = new File( config.getOutputLocation() ); - if ( !destDir.exists() ) - { - destDir.mkdirs(); - } - csc.setDestDir( destDir ); - - String destFileName = (String) compilerOptions.get( "destFile" ); - if ( destFileName == null ) - { - destFileName = (String) compilerOptions.get( "mainClass" ); - } - csc.setDestFile( new File( destDir, destFileName + "." + getTypeExtension( type ) ) ); - - return csc; - } - - /** - * @param type - * @return - * @throws Exception - */ - private String getTypeExtension( String type ) - throws Exception - { - if ( "exe".equals( type ) || "winexe".equals( type ) ) - { - return "exe"; - } - if ( "library".equals( type ) || "module".equals( type ) ) - { - return "dll"; - } - throw new Exception( "Unrecognized type" ); - } - - private boolean getBooleanOption( Map options, String optionName, boolean defaultValue ) - { - Boolean optionValue = (Boolean) options.get( optionName ); - return optionValue != null ? optionValue.booleanValue() : defaultValue; - } - - private int getIntOption( Map options, String optionName, int defaultValue ) - { - Integer optionValue = (Integer) options.get( optionName ); - return optionValue != null ? optionValue.intValue() : defaultValue; - } - - /** - * @param basedir - */ - public void setBasedir( File basedir ) - { - this.basedir = basedir; - } - - /** - * @param antBuildListener The antBuildListener to set. - */ - public void setAntBuildListener( AntBuildListener antBuildListener ) - { - this.antBuildListener = antBuildListener; - } - - /** - * @param additionalModules The additionalModules to set. - */ - public void setReferences( String additionalModules ) - { - this.references = additionalModules; - } -} diff --git a/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompilerMojo.java b/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompilerMojo.java deleted file mode 100644 index e3b0119d2e..0000000000 --- a/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/compiler/CSharpCompilerMojo.java +++ /dev/null @@ -1,365 +0,0 @@ -package org.apache.plugins.csharp.compiler; - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.project.MavenProject; -import org.apache.plugins.csharp.helpers.AntBuildListener; -import org.codehaus.plexus.compiler.CompilerConfiguration; - -import java.io.File; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/* - * Copyright 2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/** - * @author Gilles Dodinet - * @version $Id$ - * @description Compiles c# sources - * @goal compile - * @phase compile - * @requiresDependencyResolution compile - */ -public class CSharpCompilerMojo - extends AbstractMojo -{ - - /** - * @parameter - */ - private String debug = Boolean.TRUE.toString(); - - /** - * @parameter - */ - private String optimize = Boolean.TRUE.toString(); - - /** - * @parameter - */ - private String unsafe = Boolean.FALSE.toString(); - - /** - * @parameter - */ - private String incremental = Boolean.FALSE.toString(); - - /** - * @parameter - */ - private String fullPaths = Boolean.TRUE.toString(); - - /** - * @parameter - */ - private String warnLevel = "4"; - - /** - * @parameter - */ - private String mainClass; - - /** - * @parameter expression="${project}" - * @required - * @readonly - */ - private MavenProject project; - - /** - * @parameter expression="${project.build.outputDirectory}" - * @required - * @readonly - */ - private String outputDirectory; - - /** - * @parameter - */ - private String destFile; - - /** - * @parameter - * @required - */ - private String type = "library"; - - /** - * @parameter expression="${project.compileSourceRoots}" - * @required - * @readonly - */ - private List compileSourceRoots; - - public void execute() - throws MojoExecutionException - { - CompilerConfiguration config = new CompilerConfiguration(); - - Map compilerOptions = new HashMap(); - - config.setOutputLocation( outputDirectory ); - - config.setSourceLocations( compileSourceRoots ); - - compilerOptions.put( "optimize", Boolean.valueOf( optimize ) ); - compilerOptions.put( "unsafe", Boolean.valueOf( unsafe ) ); - compilerOptions.put( "incremental", Boolean.valueOf( incremental ) ); - compilerOptions.put( "fullPaths", Boolean.valueOf( fullPaths ) ); - compilerOptions.put( "warnLevel", Integer.valueOf( warnLevel ) ); - compilerOptions.put( "mainClass", mainClass ); - compilerOptions.put( "destFile", destFile ); - - //until handlers ready - compilerOptions.put( "type", type ); - //compilerOptions.put("type", project.getPackaging()); - - config.setCompilerOptions( compilerOptions ); - CSharpCompiler compiler = new CSharpCompiler(); - compiler.setBasedir( project.getBasedir() ); - compiler.setAntBuildListener( new AntBuildListener( this.getLog() ) ); - - String artifactList = ""; - Set artifacts = project.getArtifacts(); - int u = 0; - for ( Iterator i = artifacts.iterator(); i.hasNext(); ) - { - Artifact artifact = (Artifact) i.next(); - if ( "dll".equals( artifact.getType() ) ) - { - - File file = artifact.getFile(); - - artifactList += file.getAbsolutePath(); - if ( u < artifacts.size() - 1 ) - { - artifactList += ":"; - } - - } - u++; - } - compiler.setReferences( artifactList ); - - try - { - compiler.compile( config ); - } - catch ( Exception e ) - { - throw new MojoExecutionException( "Error compiling C# sources", e ); - } - - } - - /** - * @return Returns the debug. - */ - public String getDebug() - { - return debug; - } - - /** - * @param debug The debug to set. - */ - public void setDebug( String debug ) - { - this.debug = debug; - } - - /** - * @return Returns the fullPaths. - */ - public String getFullPaths() - { - return fullPaths; - } - - /** - * @param fullPaths The fullPaths to set. - */ - public void setFullPaths( String fullPaths ) - { - this.fullPaths = fullPaths; - } - - /** - * @return Returns the incremental. - */ - public String getIncremental() - { - return incremental; - } - - /** - * @param incremental The incremental to set. - */ - public void setIncremental( String incremental ) - { - this.incremental = incremental; - } - - /** - * @return Returns the mainClass. - */ - public String getMainClass() - { - return mainClass; - } - - /** - * @param mainClass The mainClass to set. - */ - public void setMainClass( String mainClass ) - { - this.mainClass = mainClass; - } - - /** - * @return Returns the optimize. - */ - public String getOptimize() - { - return optimize; - } - - /** - * @param optimize The optimize to set. - */ - public void setOptimize( String optimize ) - { - this.optimize = optimize; - } - - /** - * @return Returns the outputDirectory. - */ - public String getOutputDirectory() - { - return outputDirectory; - } - - /** - * @param outputDirectory The outputDirectory to set. - */ - public void setOutputDirectory( String outputDirectory ) - { - this.outputDirectory = outputDirectory; - } - - /** - * @return Returns the compileSourceRoots. - */ - public List getCompileSourceRoots() - { - return compileSourceRoots; - } - - /** - * @param compileSourceRoots The compileSourceRoots to set. - */ - public void setCompileSourceRoots( List compileSourceRoots ) - { - this.compileSourceRoots = compileSourceRoots; - } - - /** - * @return Returns the project. - */ - public MavenProject getProject() - { - return project; - } - - /** - * @param project The project to set. - */ - public void setProject( MavenProject project ) - { - this.project = project; - } - - /** - * @return Returns the unsafe. - */ - public String getUnsafe() - { - return unsafe; - } - - /** - * @param unsafe The unsafe to set. - */ - public void setUnsafe( String unsafe ) - { - this.unsafe = unsafe; - } - - /** - * @return Returns the warnLevel. - */ - public String getWarnLevel() - { - return warnLevel; - } - - /** - * @param warnLevel The warnLevel to set. - */ - public void setWarnLevel( String warnLevel ) - { - this.warnLevel = warnLevel; - } - - /** - * @return Returns the destFile. - */ - public String getDestFile() - { - return destFile; - } - - /** - * @param destFile The destFile to set. - */ - public void setDestFile( String destFile ) - { - this.destFile = destFile; - } - - /** - * @return Returns the type. - */ - public String getType() - { - return type; - } - - /** - * @param type The type to set. - */ - public void setType( String type ) - { - this.type = type; - } -} diff --git a/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/helpers/AntBuildListener.java b/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/helpers/AntBuildListener.java deleted file mode 100644 index 546294b4dd..0000000000 --- a/sandbox/csharp/maven-csharp-plugin/src/main/java/org/apache/plugins/csharp/helpers/AntBuildListener.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.apache.plugins.csharp.helpers; - -/* - * Copyright 2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.plugin.logging.Log; -import org.apache.tools.ant.BuildEvent; -import org.apache.tools.ant.BuildListener; -import org.apache.tools.ant.Project; - - -/** - * @author Gilles Dodinet - * @version $Id$ - */ -public final class AntBuildListener - implements BuildListener -{ - private Log log; - - public AntBuildListener() - { - } - - public AntBuildListener( Log log ) - { - this.log = log; - } - - public void buildFinished( BuildEvent arg0 ) - { - } - - public void buildStarted( BuildEvent arg0 ) - { - } - - public void targetStarted( BuildEvent arg0 ) - { - } - - public void targetFinished( BuildEvent arg0 ) - { - } - - public void taskStarted( BuildEvent arg0 ) - { - } - - public void taskFinished( BuildEvent arg0 ) - { - } - - public void messageLogged( BuildEvent e ) - { - if ( log == null ) - { - System.out.println( e.getMessage() ); - return; - } - switch ( e.getPriority() ) - { - case Project.MSG_DEBUG: - log.debug( e.getMessage() ); - break; - case Project.MSG_INFO : - log.info( e.getMessage() ); - break; - case Project.MSG_WARN : - log.warn( e.getMessage() ); - break; - case Project.MSG_ERR : - log.error( e.getMessage() ); - break; - default : - break; - } - } -} diff --git a/sandbox/csharp/maven-csharp-plugin/src/main/resources/META-INF/plexus/components.xml b/sandbox/csharp/maven-csharp-plugin/src/main/resources/META-INF/plexus/components.xml deleted file mode 100644 index 6a55f4a830..0000000000 --- a/sandbox/csharp/maven-csharp-plugin/src/main/resources/META-INF/plexus/components.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - org.apache.maven.artifact.handler.ArtifactHandler - dll - org.apache.maven.artifact.handler.DefaultArtifactHandler - - dll - dll - - - - org.apache.maven.artifact.handler.ArtifactHandler - exe - org.apache.maven.artifact.handler.DefaultArtifactHandler - - exe - exe - - - - org.apache.maven.lifecycle.mapping.LifecycleMapping - dotnetexe - org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping - - - csharp:compile - install:install - deploy:deploy - - - - - diff --git a/sandbox/csharp/maven-csharp-test/pom.xml b/sandbox/csharp/maven-csharp-test/pom.xml deleted file mode 100644 index 57e63b34b9..0000000000 --- a/sandbox/csharp/maven-csharp-test/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - 4.0.0 - org.apache.maven - maven-csharp-plugin-test - dotnetexe - csharp-plugin-test - 1.0-SNAPSHOT - 2005 - M2 csharp plugin Test - - - - Gilles Dodinet - gdodinet@karmicsoft.com - Karmic Software Research - - - - - src/main/csharp - - -true - maven-csharp-plugin - 1.0-SNAPSHOT - - Com.Test.Test2 - Test2 - exe - - - - - - diff --git a/sandbox/csharp/maven-csharp-test/src/main/csharp/Test.cs b/sandbox/csharp/maven-csharp-test/src/main/csharp/Test.cs deleted file mode 100644 index 7375895cfe..0000000000 --- a/sandbox/csharp/maven-csharp-test/src/main/csharp/Test.cs +++ /dev/null @@ -1,17 +0,0 @@ - - -using System; -using System.Text; - -namespace Com.Test { - public class Test2 { - public int MyProp { - get { return 1; } - } - - [STAThread] - public static void Main(string[] args) { - System.Console.WriteLine("HELLO WORLD"); - } - } -} diff --git a/sandbox/marmalade/it0015/cli-options.txt b/sandbox/marmalade/it0015/cli-options.txt deleted file mode 100644 index c70ad73fb2..0000000000 --- a/sandbox/marmalade/it0015/cli-options.txt +++ /dev/null @@ -1 +0,0 @@ ---no-plugin-registry --check-plugin-latest diff --git a/sandbox/marmalade/it0015/expected-results.txt b/sandbox/marmalade/it0015/expected-results.txt deleted file mode 100644 index 2064724c96..0000000000 --- a/sandbox/marmalade/it0015/expected-results.txt +++ /dev/null @@ -1 +0,0 @@ -target/out.txt diff --git a/sandbox/marmalade/it0015/goals.txt b/sandbox/marmalade/it0015/goals.txt deleted file mode 100644 index df3bb4e9e8..0000000000 --- a/sandbox/marmalade/it0015/goals.txt +++ /dev/null @@ -1,2 +0,0 @@ -install -it0015:it0015 diff --git a/sandbox/marmalade/it0015/pom.xml b/sandbox/marmalade/it0015/pom.xml deleted file mode 100644 index 72a0d8bd50..0000000000 --- a/sandbox/marmalade/it0015/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - 4.0.0 - org.apache.maven.plugins - maven-it0015-plugin - maven-plugin - 1.0-SNAPSHOT - - - org.apache.maven - maven-plugin-api - 2.0-beta-1 - - - org.apache.maven - maven-script-marmalade - 2.0-beta-1 - - - marmalade - marmalade-core - 1.0-alpha-4 - - - - src/main/scripts - - - src/main/resources - - - - - - central - Test Repository - file:/tmp/testRepo - - - diff --git a/sandbox/marmalade/it0015/prebuild-hook.txt b/sandbox/marmalade/it0015/prebuild-hook.txt deleted file mode 100644 index b4ca1cf076..0000000000 --- a/sandbox/marmalade/it0015/prebuild-hook.txt +++ /dev/null @@ -1,2 +0,0 @@ -rm ${artifact:org.apache.maven.plugins:maven-it0015-plugin:1.0-SNAPSHOT:maven-plugin} -rm target/out.txt diff --git a/sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/IT0015TagLibrary.java b/sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/IT0015TagLibrary.java deleted file mode 100644 index abb777ade5..0000000000 --- a/sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/IT0015TagLibrary.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.apache.maven.it0015.tags; - -import org.codehaus.marmalade.metamodel.AbstractMarmaladeTagLibrary; - -/** - * @author jdcasey - */ -public class IT0015TagLibrary - extends AbstractMarmaladeTagLibrary -{ - - public IT0015TagLibrary() - { - registerTag("writeFile", WriteFileTag.class); - } - -} diff --git a/sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/WriteFileTag.java b/sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/WriteFileTag.java deleted file mode 100644 index 0e0fc18944..0000000000 --- a/sandbox/marmalade/it0015/src/main/java/org/apache/maven/it0015/tags/WriteFileTag.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.apache.maven.it0015.tags; - -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; -import org.codehaus.marmalade.runtime.TagExecutionException; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - -/** - * @author jdcasey - */ -public class WriteFileTag - extends AbstractMarmaladeTag -{ - - public static final String FILE_ATTR = "path"; - - protected boolean alwaysProcessChildren() - { - return false; - } - - protected void doExecute( MarmaladeExecutionContext context ) throws MarmaladeExecutionException - { - String content = (String) getBody(context, String.class); - String filename = (String) requireTagAttribute(FILE_ATTR, String.class, context); - - System.out.println("Attempting to write to file: \'" + filename + "\' contents:"); - System.out.println(content); - - File file = new File(filename); - File dir = file.getParentFile(); - if(dir != null && !dir.exists()) - { - dir.mkdirs(); - } - - FileOutputStream fOut = null; - try - { - fOut = new FileOutputStream(file); - fOut.write(content.getBytes()); - } - catch ( IOException e ) - { - throw new TagExecutionException(getTagInfo(), "Cannot write content to file: " + file, e); - } - finally - { - if(fOut != null) - { - try - { - fOut.flush(); - fOut.close(); - } - catch(Exception e) - { - } - } - } - } -} diff --git a/sandbox/marmalade/it0015/src/main/resources/META-INF/marmalade/it0015.def b/sandbox/marmalade/it0015/src/main/resources/META-INF/marmalade/it0015.def deleted file mode 100644 index b4920b2cfc..0000000000 --- a/sandbox/marmalade/it0015/src/main/resources/META-INF/marmalade/it0015.def +++ /dev/null @@ -1 +0,0 @@ -org.apache.maven.it0015.tags.IT0015TagLibrary \ No newline at end of file diff --git a/sandbox/marmalade/it0015/src/main/scripts/org/apache/maven/it0015/it0015.mmld b/sandbox/marmalade/it0015/src/main/scripts/org/apache/maven/it0015/it0015.mmld deleted file mode 100644 index d4a6b9bde8..0000000000 --- a/sandbox/marmalade/it0015/src/main/scripts/org/apache/maven/it0015/it0015.mmld +++ /dev/null @@ -1,17 +0,0 @@ - - - it0015 - Output a file with specified contents to [outDir] - - - outDir - java.lang.String - ${project.build.directory} - Output directory for files. - - - - - This is a test. - - diff --git a/sandbox/marmalade/it0015/system.properties b/sandbox/marmalade/it0015/system.properties deleted file mode 100644 index 9ea8d913e5..0000000000 --- a/sandbox/marmalade/it0015/system.properties +++ /dev/null @@ -1,2 +0,0 @@ -updateReleaseInfo=true - diff --git a/sandbox/marmalade/maven-archetype-marmalade-mojo/pom.xml b/sandbox/marmalade/maven-archetype-marmalade-mojo/pom.xml deleted file mode 100644 index 278dd94f3e..0000000000 --- a/sandbox/marmalade/maven-archetype-marmalade-mojo/pom.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - maven-archetypes - org.apache.maven.archetypes - 1.0-alpha-4-SNAPSHOT - - 4.0.0 - maven-archetype-marmalade-mojo - 1.0-alpha-4-SNAPSHOT - \ No newline at end of file diff --git a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/META-INF/archetype.xml b/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/META-INF/archetype.xml deleted file mode 100644 index 3c971a42c2..0000000000 --- a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/META-INF/archetype.xml +++ /dev/null @@ -1,11 +0,0 @@ - - mmld-plugin - - src/main/java/CopyFileTag.java - src/main/java/MyMojoTagLibrary.java - - - src/main/resources/META-INF/marmalade/myMojo.def - src/main/resources/myMojo.mmld - - diff --git a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/pom.xml b/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/pom.xml deleted file mode 100644 index d499a29415..0000000000 --- a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - 4.0.0 - ${groupId} - ${artifactId} - maven-plugin - ${version} - Maven Marmalade Mojo Archetype - http://maven.apache.org - - - org.apache.maven - maven-plugin-api - 2.0-beta-2 - - - marmalade - marmalade-core - 1.0-alpha-4 - - - marmalade - marmalade-el-commons - 1.0-alpha-3 - - - marmalade - marmalade-tags-io - 1.0-alpha-3 - - - org.apache.maven - maven-script-marmalade - 2.0-beta-2 - - - - src/main/resources - - diff --git a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/CopyFileTag.java b/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/CopyFileTag.java deleted file mode 100644 index 977f452812..0000000000 --- a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/CopyFileTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package $package; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey - */ -public class CopyFileTag - extends AbstractMarmaladeTag -{ - - protected void doExecute(MarmaladeExecutionContext context) - throws MarmaladeExecutionException - { - - } - -} diff --git a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/MyMojoTagLibrary.java b/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/MyMojoTagLibrary.java deleted file mode 100644 index bfaa71f951..0000000000 --- a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/java/MyMojoTagLibrary.java +++ /dev/null @@ -1,33 +0,0 @@ -package $package; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.metamodel.AbstractMarmaladeTagLibrary; - -/** - * @author jdcasey - */ -public class MyMojoTagLibrary - extends AbstractMarmaladeTagLibrary -{ - - public MyMojoTagLibrary() - { - registerTag( "copyFile", CopyFileTag.class ); - } - -} diff --git a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/META-INF/marmalade/myMojo.def b/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/META-INF/marmalade/myMojo.def deleted file mode 100644 index 6bc8a34b6e..0000000000 --- a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/META-INF/marmalade/myMojo.def +++ /dev/null @@ -1 +0,0 @@ -${package}.MyMojoTagLibrary \ No newline at end of file diff --git a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/myMojo.mmld b/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/myMojo.mmld deleted file mode 100644 index 4dbe57c695..0000000000 --- a/sandbox/marmalade/maven-archetype-marmalade-mojo/src/main/resources/archetype-resources/src/main/resources/myMojo.mmld +++ /dev/null @@ -1,19 +0,0 @@ - - - - - myMojo - Output a file with specified contents to [outputDirectory]/touch.txt - - - outputDirectory - ${project.build.directory} - Output directory for files. - - - - - touch.txt - - - \ No newline at end of file diff --git a/sandbox/marmalade/maven-hello-plugin/pom.xml b/sandbox/marmalade/maven-hello-plugin/pom.xml deleted file mode 100644 index c388a906ed..0000000000 --- a/sandbox/marmalade/maven-hello-plugin/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - maven-plugin-parent - org.apache.maven.plugins - 2.0-alpha-3 - - 4.0.0 - maven-hello-plugin - maven-plugin - Maven Hello World Plugin - 1.0-SNAPSHOT - - src/main/scripts - - - src/main/scripts - - **/*.mmld - - - - - diff --git a/sandbox/marmalade/maven-hello-plugin/src/main/scripts/hello.mmld b/sandbox/marmalade/maven-hello-plugin/src/main/scripts/hello.mmld deleted file mode 100644 index 9d79cf828c..0000000000 --- a/sandbox/marmalade/maven-hello-plugin/src/main/scripts/hello.mmld +++ /dev/null @@ -1,20 +0,0 @@ - - - hello - Say hello to the world. - - - salutation - ${salutation} - Hello - The salutation to use when saying hello. - - - - - - -${salutation}, World. - - - diff --git a/sandbox/marmalade/maven-plugin-tools-marmalade/pom.xml b/sandbox/marmalade/maven-plugin-tools-marmalade/pom.xml deleted file mode 100644 index d664668691..0000000000 --- a/sandbox/marmalade/maven-plugin-tools-marmalade/pom.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - maven-plugin-tools - org.apache.maven - 2.0-beta-3-SNAPSHOT - - 4.0.0 - maven-plugin-tools-marmalade - Maven Plugin Tools for Marmalade - 2.0-beta-3-SNAPSHOT - - - org.apache.maven - maven-script-marmalade - 2.0-beta-3-SNAPSHOT - - - org.apache.maven - maven-plugin-tools-api - 2.0-beta-3-SNAPSHOT - - - marmalade - marmalade-core - 1.0-alpha-4 - - - plexus-utils - plexus - - - - - org.apache.maven - maven-plugin-descriptor - 2.0-beta-3-SNAPSHOT - - - \ No newline at end of file diff --git a/sandbox/marmalade/maven-plugin-tools-marmalade/src/main/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractor.java b/sandbox/marmalade/maven-plugin-tools-marmalade/src/main/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractor.java deleted file mode 100644 index 3282588f8a..0000000000 --- a/sandbox/marmalade/maven-plugin-tools-marmalade/src/main/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractor.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.apache.maven.tools.plugin.extractor.marmalade; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException; -import org.apache.maven.plugin.descriptor.MojoDescriptor; -import org.apache.maven.plugin.descriptor.PluginDescriptor; -import org.apache.maven.script.marmalade.MarmaladeMojoExecutionDirectives; -import org.apache.maven.script.marmalade.tags.MojoTag; -import org.apache.maven.tools.plugin.extractor.AbstractScriptedMojoDescriptorExtractor; -import org.apache.maven.tools.plugin.extractor.ExtractionException; -import org.codehaus.marmalade.launch.MarmaladeLaunchException; -import org.codehaus.marmalade.launch.MarmaladeLauncher; -import org.codehaus.marmalade.model.MarmaladeScript; -import org.codehaus.marmalade.model.MarmaladeTag; -import org.codehaus.plexus.component.factory.marmalade.PlexusIntegratedLog; -import org.codehaus.plexus.logging.Logger; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * @author jdcasey - */ -public class MarmaladeMojoDescriptorExtractor - extends AbstractScriptedMojoDescriptorExtractor -{ - - protected String getScriptFileExtension() - { - return ".mmld"; - } - - protected List extractMojoDescriptors( Map sourceFilesKeyedByBasedir, PluginDescriptor pluginDescriptor ) - throws ExtractionException, InvalidPluginDescriptorException - { - ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); - try - { - Thread.currentThread().setContextClassLoader( MarmaladeMojoDescriptorExtractor.class.getClassLoader() ); - - List descriptors = new ArrayList(); - - for ( Iterator mapIterator = sourceFilesKeyedByBasedir.entrySet().iterator(); mapIterator.hasNext(); ) - { - Map.Entry entry = (Map.Entry) mapIterator.next(); - - String basedir = (String) entry.getKey(); - Set scriptFiles = (Set) entry.getValue(); - - for ( Iterator it = scriptFiles.iterator(); it.hasNext(); ) - { - File scriptFile = (File) it.next(); - - try - { - MarmaladeLauncher launcher = new MarmaladeLauncher().withInputFile( scriptFile ); - - Logger logger = getLogger(); - - if ( logger != null ) - { - PlexusIntegratedLog log = new PlexusIntegratedLog(); - - log.enableLogging( logger ); - - launcher = launcher.withLog( log ); - } - - MarmaladeScript script = launcher.getMarmaladeScript(); - - MarmaladeTag rootTag = script.getRoot(); - if ( rootTag instanceof MojoTag ) - { - launcher.withVariable( MarmaladeMojoExecutionDirectives.SCRIPT_BASEPATH_INVAR, basedir ); - launcher - .withVariable( MarmaladeMojoExecutionDirectives.PLUGIN_DESCRIPTOR, pluginDescriptor ); - - Map contextMap = launcher.run(); - - MojoDescriptor descriptor = (MojoDescriptor) contextMap - .get( MarmaladeMojoExecutionDirectives.METADATA_OUTVAR ); - - descriptors.add( descriptor ); - } - else - { - getLogger().debug( - "Found non-mojo marmalade script at: " + scriptFile - + ".\nIts root tag is {element: " - + rootTag.getTagInfo().getElement() + ", class: " - + rootTag.getClass().getName() + "}" ); - } - } - catch ( IOException e ) - { - throw new ExtractionException( "Error extracting mojo descriptor from Marmalade script: " + scriptFile, e ); - } - catch ( MarmaladeLaunchException e ) - { - Throwable cause = e.getCause(); - - if ( cause instanceof InvalidPluginDescriptorException ) - { - throw (InvalidPluginDescriptorException) cause; - } - else - { - throw new ExtractionException( "Error extracting mojo descriptor from Marmalade script: " + scriptFile, e ); - } - } - } - } - - return descriptors; - } - finally - { - Thread.currentThread().setContextClassLoader( oldCl ); - } - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-plugin-tools-marmalade/src/main/resources/META-INF/plexus/components.xml b/sandbox/marmalade/maven-plugin-tools-marmalade/src/main/resources/META-INF/plexus/components.xml deleted file mode 100644 index 8c1a79ff81..0000000000 --- a/sandbox/marmalade/maven-plugin-tools-marmalade/src/main/resources/META-INF/plexus/components.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - org.apache.maven.tools.plugin.extractor.MojoDescriptorExtractor - marmalade - org.apache.maven.tools.plugin.extractor.marmalade.MarmaladeMojoDescriptorExtractor - - - - \ No newline at end of file diff --git a/sandbox/marmalade/maven-plugin-tools-marmalade/src/test/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractorTest.java b/sandbox/marmalade/maven-plugin-tools-marmalade/src/test/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractorTest.java deleted file mode 100644 index 46ac8eb06a..0000000000 --- a/sandbox/marmalade/maven-plugin-tools-marmalade/src/test/java/org/apache/maven/tools/plugin/extractor/marmalade/MarmaladeMojoDescriptorExtractorTest.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.apache.maven.tools.plugin.extractor.marmalade; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.model.Build; -import org.apache.maven.model.Model; -import org.apache.maven.plugin.descriptor.MojoDescriptor; -import org.apache.maven.plugin.descriptor.PluginDescriptor; -import org.apache.maven.project.MavenProject; -import org.apache.maven.tools.plugin.extractor.MojoDescriptorExtractor; -import org.codehaus.plexus.PlexusTestCase; - -import java.io.File; -import java.net.URL; -import java.util.List; - -/** - * @author jdcasey - */ -public class MarmaladeMojoDescriptorExtractorTest - extends PlexusTestCase -{ - - private String findThisBasedir() - { - String myClassFile = getClass().getName().replace('.', '/') + ".class"; - - ClassLoader cloader = getClass().getClassLoader(); - - URL myClassResource = cloader.getResource( myClassFile ); - - String fullPath = myClassResource.getPath(); - - return fullPath.substring( 0, fullPath.length() - myClassFile.length() ); - } - - public void testShouldFindOneMojo() - throws Exception - { - File basedir = dirname( "testMojo.mmld" ); - - Model model = new Model(); - model.setArtifactId( "testArtifactId" ); - - MavenProject project = new MavenProject( model ); - - project.setFile( new File( basedir, "pom.xml" ) ); - - System.out.println( "Basedir: " + basedir ); - project.addScriptSourceRoot( basedir.getPath() ); - - Build build = new Build(); - - build.setOutputDirectory( findThisBasedir() ); - - project.setBuild( build ); - - MarmaladeMojoDescriptorExtractor extractor = (MarmaladeMojoDescriptorExtractor) lookup( - MojoDescriptorExtractor.ROLE, "marmalade" ); - - PluginDescriptor pluginDescriptor = new PluginDescriptor(); - pluginDescriptor.setGoalPrefix( "test" ); - List descriptors = extractor.execute( project, pluginDescriptor ); - - assertEquals( 1, descriptors.size() ); - - MojoDescriptor descriptor = (MojoDescriptor) descriptors.iterator().next(); - assertEquals( pluginDescriptor, descriptor.getPluginDescriptor() ); - assertEquals( "marmalade", descriptor.getLanguage() ); - assertEquals( "testGoal", descriptor.getGoal() ); - assertEquals( 1, descriptor.getParameters().size() ); - } - - // public void testShouldFindMojoDescriptorViaContainerDrivenExtractor() - // throws Exception - // { - // Embedder embedder = new Embedder(); - // embedder.start(new ClassWorld("test", - // Thread.currentThread().getContextClassLoader())); - // - // MojoScanner scanner = (MojoScanner) embedder.lookup(MojoScanner.ROLE); - // - // Build build = new Build(); - // build.setSourceDirectory("."); - // - // Model model = new Model(); - // model.setBuild(build); - // - // MavenProject project = new MavenProject(model); - // project.setFile(new File(dirname("testMojo.mmld"), "pom.xml")); - // - // Set descriptors = scanner.execute(project); - // assertEquals(1, descriptors.size()); - // - // MavenMojoDescriptor mmDesc = - // (MavenMojoDescriptor)descriptors.iterator().next(); - // assertEquals("marmalade", mmDesc.getComponentFactory()); - // assertEquals("testId", mmDesc.getMojoDescriptor().getId()); - // assertEquals("testGoal", mmDesc.getMojoDescriptor().getGoal()); - // assertEquals(1, mmDesc.getMojoDescriptor().getParameters().size()); - // } - // - private File dirname( String resourceName ) - { - ClassLoader cloader = Thread.currentThread().getContextClassLoader(); - URL resource = cloader.getResource( resourceName ); - - File dir = null; - if ( resource != null ) - { - File file = new File( resource.getPath() ); - dir = file.getParentFile(); - } - - return dir; - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-plugin-tools-marmalade/src/test/resources/testMojo.mmld b/sandbox/marmalade/maven-plugin-tools-marmalade/src/test/resources/testMojo.mmld deleted file mode 100644 index 97dd43ffa3..0000000000 --- a/sandbox/marmalade/maven-plugin-tools-marmalade/src/test/resources/testMojo.mmld +++ /dev/null @@ -1,20 +0,0 @@ - - - - - testGoal - This is a test mojo - - - testParam - TestValue - ${pom.file} - true - This is a test parameter - - - - - testVal - - diff --git a/sandbox/marmalade/maven-script-marmalade/pom.xml b/sandbox/marmalade/maven-script-marmalade/pom.xml deleted file mode 100644 index 2a58f3b077..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - maven-script - org.apache.maven - 2.0-beta-3-SNAPSHOT - - 4.0.0 - maven-script-marmalade - Maven Marmalade Mojo Support - 2.0-beta-3-SNAPSHOT - - - marmalade - marmalade-core - 1.0-alpha-4 - - - org.apache.maven - maven-plugin-descriptor - 2.0-beta-3-SNAPSHOT - - - plexus - plexus-marmalade-factory - 1.0-alpha-5 - - - \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojo.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojo.java deleted file mode 100644 index e3fd069fa2..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojo.java +++ /dev/null @@ -1,114 +0,0 @@ -package org.apache.maven.script.marmalade; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.codehaus.marmalade.model.MarmaladeScript; -import org.codehaus.marmalade.runtime.DefaultContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; -import org.codehaus.plexus.component.MapOrientedComponent; -import org.codehaus.plexus.component.repository.ComponentRequirement; -import org.codehaus.plexus.util.StringUtils; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Map; -import java.util.TreeMap; - -/** - * @author jdcasey - */ -public class MarmaladeMojo - extends AbstractMojo - implements MapOrientedComponent -{ - - private MarmaladeScript script; - - private Map contextMap = new TreeMap(); - - public MarmaladeMojo( MarmaladeScript script ) - { - this.script = script; - } - - public void execute() - throws MojoExecutionException - { - MarmaladeExecutionContext context = new DefaultContext( contextMap ); - - StringWriter sOutWriter = new StringWriter(); - PrintWriter outWriter = new PrintWriter( sOutWriter ); - - context.setOutWriter( outWriter ); - - StringWriter sErrWriter = new StringWriter(); - PrintWriter errWriter = new PrintWriter( sErrWriter ); - - context.setErrWriter( errWriter ); - - try - { - script.execute( context ); - } - catch ( MarmaladeExecutionException e ) - { - throw new MojoExecutionException( "[ERROR] While executing mojo script.\n Error: " + e.getLocalizedMessage(), e ); - } - - StringBuffer output = sOutWriter.getBuffer(); - if ( output.length() > 0 ) - { - getLog().info( output ); - } - - StringBuffer error = sErrWriter.getBuffer(); - if ( error.length() > 0 ) - { - getLog().error( error ); - } - - // TODO: need to be able to pass back results - // Map externalizedVars = context.getExternalizedVariables(); - // for ( Iterator it = externalizedVars.entrySet().iterator(); it.hasNext(); ) - // { - // Map.Entry entry = (Map.Entry) it.next(); - // - // request.addContextValue( entry.getKey(), entry.getValue() ); - // } - } - - public void addComponentRequirement( ComponentRequirement requirementDescriptor, Object requirementValue ) - { - String key = requirementDescriptor.getFieldName(); - - if ( StringUtils.isEmpty( key ) ) - { - key = requirementDescriptor.getRole(); - } - - contextMap.put( key, requirementValue ); - } - - public void setComponentConfiguration( Map componentConfiguration ) - { - contextMap.putAll( componentConfiguration ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojoExecutionDirectives.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojoExecutionDirectives.java deleted file mode 100644 index 50470f57c2..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/MarmaladeMojoExecutionDirectives.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.apache.maven.script.marmalade; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public final class MarmaladeMojoExecutionDirectives -{ - - public static final String METADATA_OUTVAR = "metadata"; - - public static final String SCRIPT_BASEPATH_INVAR = "basePath"; - - public static final String REQUEST_INVAR = "request"; - - public static final String RESPONSE_INVAR = "response"; - - public static final String PLUGIN_DESCRIPTOR = "pluginDescriptor"; - - private MarmaladeMojoExecutionDirectives() - { - } -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractBooleanValuedBodyTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractBooleanValuedBodyTag.java deleted file mode 100644 index 17003d493f..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractBooleanValuedBodyTag.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; -import org.codehaus.marmalade.runtime.TagExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public abstract class AbstractBooleanValuedBodyTag - extends AbstractMarmaladeTag -{ - - protected boolean alwaysProcessChildren() - { - return false; - } - - protected void doExecute( MarmaladeExecutionContext context ) throws MarmaladeExecutionException - { - Boolean bodyValue = (Boolean) getBody( context, Boolean.class ); - - if ( bodyValue == null ) - { - throw new TagExecutionException( getTagInfo(), "Tag body must specify a valid boolean value." ); - } - - setValue( bodyValue ); - } - - protected abstract void setValue( Boolean value ) throws MarmaladeExecutionException; - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractStringValuedBodyTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractStringValuedBodyTag.java deleted file mode 100644 index d203f412da..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AbstractStringValuedBodyTag.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public abstract class AbstractStringValuedBodyTag - extends AbstractMarmaladeTag -{ - - protected boolean alwaysProcessChildren() - { - return false; - } - - protected void doExecute( MarmaladeExecutionContext context ) throws MarmaladeExecutionException - { - String bodyValue = getRawBody( context ); - - setValue( bodyValue ); - } - - protected abstract void setValue( String value ) throws MarmaladeExecutionException; - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AggregatorTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AggregatorTag.java deleted file mode 100644 index 9382e7c25e..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/AggregatorTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class AggregatorTag - extends AbstractBooleanValuedBodyTag -{ - - protected void setValue( Boolean value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setAggregator( value.booleanValue() ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionParent.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionParent.java deleted file mode 100644 index 503edd3ac0..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionParent.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author jdcasey - */ -public interface DescriptionParent -{ - - void setDescription( String description ); - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionTag.java deleted file mode 100644 index 53c5ea67e8..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/DescriptionTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class DescriptionTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - DescriptionParent parent = (DescriptionParent) requireParent( DescriptionParent.class ); - parent.setDescription( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteGoalTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteGoalTag.java deleted file mode 100644 index 4a23bb3153..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteGoalTag.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class ExecuteGoalTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) - throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setExecuteGoal( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteLifecycleTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteLifecycleTag.java deleted file mode 100644 index f447587c6e..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteLifecycleTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class ExecuteLifecycleTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setExecuteLifecycle( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutePhaseTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutePhaseTag.java deleted file mode 100644 index 2ff309ec39..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutePhaseTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class ExecutePhaseTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setExecutePhase( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteTag.java deleted file mode 100644 index 46170e77d5..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecuteTag.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -import java.util.Iterator; - -/** - * Aggregator tag for the actual meat of the mojo. Simply a pass-through - * surrogate root tag for the eventual component-script (@see MojoTag). - * - * @author jdcasey Created on Feb 8, 2005 - */ -public class ExecuteTag - extends AbstractMarmaladeTag -{ - - protected void doExecute( MarmaladeExecutionContext context ) throws MarmaladeExecutionException - { - for ( Iterator it = children().iterator(); it.hasNext(); ) - { - it.next(); - } - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutionStrategyTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutionStrategyTag.java deleted file mode 100644 index b694c9eae3..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ExecutionStrategyTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class ExecutionStrategyTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setExecutionStrategy( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/GoalTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/GoalTag.java deleted file mode 100644 index d9da2f449f..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/GoalTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class GoalTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setGoal( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InheritByDefaultTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InheritByDefaultTag.java deleted file mode 100644 index ba4c8b727c..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InheritByDefaultTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class InheritByDefaultTag - extends AbstractBooleanValuedBodyTag -{ - - protected void setValue( Boolean value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setInheritByDefault( value.booleanValue() ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InstantiationStrategyTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InstantiationStrategyTag.java deleted file mode 100644 index dce817f3a7..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/InstantiationStrategyTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class InstantiationStrategyTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setInstantiationStrategy( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/LifecyclePhaseTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/LifecyclePhaseTag.java deleted file mode 100644 index d64a5675d2..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/LifecyclePhaseTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class LifecyclePhaseTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setLifecyclePhase( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MetadataTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MetadataTag.java deleted file mode 100644 index df45f9234c..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MetadataTag.java +++ /dev/null @@ -1,251 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.plugin.descriptor.DuplicateParameterException; -import org.apache.maven.plugin.descriptor.MojoDescriptor; -import org.apache.maven.plugin.descriptor.PluginDescriptor; -import org.apache.maven.script.marmalade.MarmaladeMojoExecutionDirectives; -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; -import org.codehaus.marmalade.runtime.TagExecutionException; - -import java.util.ArrayList; -import java.util.List; - -/** - * Aggregator tag for the actual meat of the mojo. - * - * @author jdcasey Created on Feb 8, 2005 - */ -public class MetadataTag - extends AbstractMarmaladeTag - implements DescriptionParent -{ - private String goal; - - private String requiresDependencyResolution = null; - - private boolean requiresProject = true; - - private String instantiationStrategy; - - private String executionStrategy; - - private List parameters = new ArrayList(); - - private String description; - - private boolean aggregator = false; - - private boolean inheritByDefault = true; - - private boolean requiresOnline; - - private String executePhase; - - private String executeGoal; - - private String executeLifecycle; - - private String lifecyclePhase; - - private boolean requiresReports; - - protected boolean alwaysProcessChildren() - { - return false; - } - - protected void doExecute( MarmaladeExecutionContext context ) - throws MarmaladeExecutionException - { - processChildren( context ); - - MojoDescriptor descriptor = buildDescriptor( context ); - context.setVariable( MarmaladeMojoExecutionDirectives.METADATA_OUTVAR, descriptor, true ); - } - - private MojoDescriptor buildDescriptor( MarmaladeExecutionContext context ) - throws MarmaladeExecutionException - { - MojoDescriptor descriptor = new MojoDescriptor(); - - descriptor.setLanguage( "marmalade" ); - descriptor.setComponentComposer( "map-oriented" ); - descriptor.setComponentConfigurator( "map-oriented" ); - - descriptor.setPluginDescriptor( - (PluginDescriptor) context.getVariable( MarmaladeMojoExecutionDirectives.PLUGIN_DESCRIPTOR, null ) ); - - if ( notEmpty( goal ) ) - { - descriptor.setGoal( goal ); - } - - if ( notEmpty( description ) ) - { - descriptor.setDescription( description ); - } - - if ( notEmpty( executionStrategy ) ) - { - descriptor.setExecutionStrategy( executionStrategy ); - } - - if ( notEmpty( instantiationStrategy ) ) - { - descriptor.setInstantiationStrategy( instantiationStrategy ); - } - - if ( notEmpty( executeLifecycle ) ) - { - descriptor.setExecuteLifecycle( executeLifecycle ); - } - - if ( notEmpty( executePhase ) ) - { - descriptor.setExecutePhase( executePhase ); - } - - if ( notEmpty( executeGoal ) ) - { - descriptor.setExecutePhase( executeGoal ); - } - - if ( notEmpty( lifecyclePhase ) ) - { - descriptor.setPhase( lifecyclePhase ); - } - - try - { - descriptor.setParameters( parameters ); - } - catch ( DuplicateParameterException e ) - { - throw new TagExecutionException( getTagInfo(), "One or more mojo parameters is invalid.", e ); - } - - descriptor.setRequiresReports( requiresReports ); - descriptor.setDependencyResolutionRequired( requiresDependencyResolution ); - descriptor.setProjectRequired( requiresProject ); - descriptor.setAggregator( aggregator ); - descriptor.setInheritedByDefault( inheritByDefault ); - descriptor.setOnlineRequired( requiresOnline ); - - String basePath = (String) context.getVariable( MarmaladeMojoExecutionDirectives.SCRIPT_BASEPATH_INVAR, - getExpressionEvaluator() ); - - if ( basePath != null ) - { - if ( basePath.endsWith( "/" ) ) - { - basePath = basePath.substring( 0, basePath.length() - 2 ); - } - - String implementationPath = getTagInfo().getSourceFile().substring( basePath.length() ); - - implementationPath = implementationPath.replace( '\\', '/' ); - - descriptor.setImplementation( implementationPath ); - } - - return descriptor; - } - - private boolean notEmpty( String test ) - { - return test != null && test.trim().length() > 0; - } - - public void setGoal( String goal ) - { - this.goal = goal; - } - - public void setDescription( String description ) - { - this.description = description; - } - - public void setRequiresDependencyResolution( String requiresDependencyResolution ) - { - this.requiresDependencyResolution = requiresDependencyResolution; - } - - public void setRequiresProject( boolean requiresProject ) - { - this.requiresProject = requiresProject; - } - - public void setInstantiationStrategy( String instantiationStrategy ) - { - this.instantiationStrategy = instantiationStrategy; - } - - public void setExecutionStrategy( String executionStrategy ) - { - this.executionStrategy = executionStrategy; - } - - public void setParameters( List parameters ) - { - this.parameters = parameters; - } - - public void setAggregator( boolean aggregator ) - { - this.aggregator = aggregator; - } - - public void setInheritByDefault( boolean inheritByDefault ) - { - this.inheritByDefault = inheritByDefault; - } - - public void setRequiresOnline( boolean requiresOnline ) - { - this.requiresOnline = requiresOnline; - } - - public void setExecutePhase( String executePhase ) - { - this.executePhase = executePhase; - } - - public void setExecuteLifecycle( String executeLifecycle ) - { - this.executeLifecycle = executeLifecycle; - } - - public void setLifecyclePhase( String lifecyclePhase ) - { - this.lifecyclePhase = lifecyclePhase; - } - - public void setRequiresReports( boolean requiresReports ) - { - this.requiresReports = requiresReports; - } - - public void setExecuteGoal( String executeGoal ) - { - this.executeGoal = executeGoal; - } -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoDefinitionTagLibrary.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoDefinitionTagLibrary.java deleted file mode 100644 index d24ae145d5..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoDefinitionTagLibrary.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.metamodel.AbstractMarmaladeTagLibrary; - -/** - * @author jdcasey - */ -public class MojoDefinitionTagLibrary - extends AbstractMarmaladeTagLibrary -{ - - public MojoDefinitionTagLibrary() - { - registerTag( "aggregator", AggregatorTag.class ); - registerTag( "default", ParamDefaultTag.class ); - registerTag( "description", DescriptionTag.class ); - registerTag( "execute", ExecuteTag.class ); - registerTag( "executionStrategy", ExecutionStrategyTag.class ); - registerTag( "expression", ParamExpressionTag.class ); - registerTag( "goal", GoalTag.class ); - registerTag( "inheritByDefault", InheritByDefaultTag.class ); - registerTag( "instantiationStrategy", InstantiationStrategyTag.class ); - registerTag( "lifecyclePhase", LifecyclePhaseTag.class ); - registerTag( "metadata", MetadataTag.class ); - registerTag( "mojo", MojoTag.class ); - registerTag( "name", ParamNameTag.class ); - registerTag( "parameters", ParametersTag.class ); - registerTag( "parameter", ParameterTag.class ); - registerTag( "phase", LifecyclePhaseTag.class ); - registerTag( "required", ParamRequiredTag.class ); - registerTag( "requiresDependencyResolution", RequiresDependencyResolutionTag.class ); - registerTag( "requiresProject", RequiresProjectTag.class ); - registerTag( "requiresOnline", RequiresOnlineTag.class ); - registerTag( "requirement", RequirementTag.class ); - registerTag( "role", RequirementRoleTag.class ); - registerTag( "roleHint", RequirementRoleHintTag.class ); - registerTag( "type", ParamTypeTag.class ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoTag.java deleted file mode 100644 index ccfb09dd92..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/MojoTag.java +++ /dev/null @@ -1,78 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.script.marmalade.MarmaladeMojo; -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.model.MarmaladeScript; -import org.codehaus.marmalade.model.MarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; -import org.codehaus.plexus.component.factory.marmalade.PlexusComponentTag; - -import java.util.Iterator; - -/** - * Root tag for marmalade-based mojos - * - * @author jdcasey Created on Feb 8, 2005 - */ -public class MojoTag - extends AbstractMarmaladeTag - implements PlexusComponentTag -{ - - protected boolean alwaysProcessChildren() - { - return false; - } - - protected void doExecute( MarmaladeExecutionContext context ) throws MarmaladeExecutionException - { - for ( Iterator it = children().iterator(); it.hasNext(); ) - { - MarmaladeTag child = (MarmaladeTag) it.next(); - if ( !(child instanceof ExecuteTag) ) - { - child.execute( context ); - } - } - } - - public Object getComponent() - { - MarmaladeTag realRoot = null; - for ( Iterator it = children().iterator(); it.hasNext(); ) - { - MarmaladeTag child = (MarmaladeTag) it.next(); - if ( child instanceof ExecuteTag ) - { - realRoot = child; - break; - } - } - - if ( realRoot == null ) - { - throw new IllegalStateException( "Mojo scripts MUST have a tag." ); - } - - MarmaladeScript script = new MarmaladeScript( getTagInfo().getSourceFile(), realRoot ); - return new MarmaladeMojo( script ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamDefaultTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamDefaultTag.java deleted file mode 100644 index fb8800c098..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamDefaultTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey - */ -public class ParamDefaultTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - ParameterTag parent = (ParameterTag) requireParent( ParameterTag.class ); - parent.setDefault( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamExpressionTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamExpressionTag.java deleted file mode 100644 index 31e586f427..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamExpressionTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey - */ -public class ParamExpressionTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - ParameterTag parent = (ParameterTag) requireParent( ParameterTag.class ); - parent.setExpression( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamNameTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamNameTag.java deleted file mode 100644 index 300dd7aa23..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamNameTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey - */ -public class ParamNameTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - ParameterTag parent = (ParameterTag) requireParent( ParameterTag.class ); - parent.setName( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamRequiredTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamRequiredTag.java deleted file mode 100644 index 50d696ac83..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamRequiredTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey - */ -public class ParamRequiredTag - extends AbstractBooleanValuedBodyTag -{ - - protected void setValue( Boolean value ) throws MarmaladeExecutionException - { - ParameterTag parent = (ParameterTag) requireParent( ParameterTag.class ); - parent.setRequired( Boolean.TRUE == value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamTypeTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamTypeTag.java deleted file mode 100644 index bb7563eaf3..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParamTypeTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey - */ -public class ParamTypeTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) throws MarmaladeExecutionException - { - ParameterTag parent = (ParameterTag) requireParent( ParameterTag.class ); - parent.setType( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParameterTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParameterTag.java deleted file mode 100644 index 62aae77314..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParameterTag.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.plugin.descriptor.Parameter; -import org.apache.maven.plugin.descriptor.Requirement; -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class ParameterTag - extends AbstractMarmaladeTag - implements DescriptionParent -{ - - private String name; - - private String type; - - private String description; - - private String expression; - - private String deprecated; - - private boolean required = true; - - private String defaultVal; - - private Requirement requirement = null; - - protected void doExecute( MarmaladeExecutionContext context ) - throws MarmaladeExecutionException - { - processChildren( context ); - - Parameter parameter = buildParameter(); - - ParametersTag paramsTag = (ParametersTag) requireParent( ParametersTag.class ); - paramsTag.addParameter( parameter ); - } - - private Parameter buildParameter() - { - Parameter param = new Parameter(); - - param.setName( name ); - param.setDescription( description ); - param.setExpression( expression ); - param.setRequired( required ); - param.setType( type ); - param.setDeprecated( deprecated ); - param.setDefaultValue( defaultVal ); - param.setRequirement( requirement ); - - return param; - } - - public void setName( String name ) - { - this.name = name; - } - - public void setType( String type ) - { - this.type = type; - } - - public void setDescription( String description ) - { - this.description = description; - } - - public void setExpression( String expression ) - { - this.expression = expression; - } - - public void setDefault( String defaultVal ) - { - this.defaultVal = defaultVal; - } - - public void setRequired( boolean required ) - { - this.required = required; - } - - public String getDeprecated() - { - return deprecated; - } - - public void setDeprecated( String deprecated ) - { - this.deprecated = deprecated; - } - - public void setRequirement( Requirement requirement ) - { - this.requirement = requirement; - } -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParametersTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParametersTag.java deleted file mode 100644 index 6cda05bdb8..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/ParametersTag.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.plugin.descriptor.Parameter; -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class ParametersTag - extends AbstractMarmaladeTag -{ - private boolean requiresReports = false; - - private List parameters = new ArrayList(); - - protected void doExecute( MarmaladeExecutionContext context ) - throws MarmaladeExecutionException - { - processChildren( context ); - - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setParameters( parameters ); - metadataTag.setRequiresReports( requiresReports ); - } - - public void addParameter( Parameter parameter ) - { - if ( "${reports}".equals( parameter.getExpression() ) ) - { - requiresReports = true; - } - this.parameters.add( parameter ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleHintTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleHintTag.java deleted file mode 100644 index c7dd8d3a64..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleHintTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author Brett Porter - * @version $Id$ - */ -public class RequirementRoleHintTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) - throws MarmaladeExecutionException - { - RequirementTag parent = (RequirementTag) requireParent( RequirementTag.class ); - parent.setRoleHint( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleTag.java deleted file mode 100644 index 6698237646..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementRoleTag.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author Brett Porter - * @version $Id$ - */ -public class RequirementRoleTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) - throws MarmaladeExecutionException - { - RequirementTag parent = (RequirementTag) requireParent( RequirementTag.class ); - parent.setRole( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementTag.java deleted file mode 100644 index 5145ecedb2..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequirementTag.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.plugin.descriptor.Requirement; -import org.codehaus.marmalade.model.AbstractMarmaladeTag; -import org.codehaus.marmalade.runtime.MarmaladeExecutionContext; -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author Brett Porter - * @version $Id$ - */ -public class RequirementTag - extends AbstractMarmaladeTag -{ - private String role; - - private String roleHint; - - protected void doExecute( MarmaladeExecutionContext context ) - throws MarmaladeExecutionException - { - processChildren( context ); - - Requirement requirement = new Requirement( role, roleHint ); - - ParameterTag paramTag = (ParameterTag) requireParent( ParameterTag.class ); - paramTag.setRequirement( requirement ); - } - - public void setRoleHint( String roleHint ) - { - this.roleHint = roleHint; - } - - public void setRole( String role ) - { - this.role = role; - } -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresDependencyResolutionTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresDependencyResolutionTag.java deleted file mode 100644 index 0c16af83af..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresDependencyResolutionTag.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class RequiresDependencyResolutionTag - extends AbstractStringValuedBodyTag -{ - - protected void setValue( String value ) - throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setRequiresDependencyResolution( value ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresOnlineTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresOnlineTag.java deleted file mode 100644 index 31b6d1ed8b..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresOnlineTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class RequiresOnlineTag - extends AbstractBooleanValuedBodyTag -{ - - protected void setValue( Boolean value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setRequiresOnline( value.booleanValue() ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresProjectTag.java b/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresProjectTag.java deleted file mode 100644 index 9a4f676948..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/java/org/apache/maven/script/marmalade/tags/RequiresProjectTag.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.script.marmalade.tags; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.marmalade.runtime.MarmaladeExecutionException; - -/** - * @author jdcasey Created on Feb 8, 2005 - */ -public class RequiresProjectTag - extends AbstractBooleanValuedBodyTag -{ - - protected void setValue( Boolean value ) throws MarmaladeExecutionException - { - MetadataTag metadataTag = (MetadataTag) requireParent( MetadataTag.class ); - metadataTag.setRequiresProject( value.booleanValue() ); - } - -} \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/main/resources/META-INF/marmalade/mojo.def b/sandbox/marmalade/maven-script-marmalade/src/main/resources/META-INF/marmalade/mojo.def deleted file mode 100644 index 9bbc8308cf..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/main/resources/META-INF/marmalade/mojo.def +++ /dev/null @@ -1 +0,0 @@ -org.apache.maven.script.marmalade.tags.MojoDefinitionTagLibrary \ No newline at end of file diff --git a/sandbox/marmalade/maven-script-marmalade/src/test/java/org/apache/maven/script/marmalade/MarmaladeMojoTest.java b/sandbox/marmalade/maven-script-marmalade/src/test/java/org/apache/maven/script/marmalade/MarmaladeMojoTest.java deleted file mode 100644 index be429bdd3c..0000000000 --- a/sandbox/marmalade/maven-script-marmalade/src/test/java/org/apache/maven/script/marmalade/MarmaladeMojoTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.apache.maven.script.marmalade; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import junit.framework.TestCase; -import org.codehaus.marmalade.metamodel.ScriptBuilder; -import org.codehaus.marmalade.model.MarmaladeScript; -import org.codehaus.marmalade.parsing.DefaultParsingContext; -import org.codehaus.marmalade.parsing.MarmaladeParsingContext; -import org.codehaus.marmalade.parsing.ScriptParser; - -import java.io.StringReader; -import java.util.Collections; - -/** - * @author jdcasey - */ -public class MarmaladeMojoTest - extends TestCase -{ - - private static final String TEST_SCRIPT = ""; - - public void testShouldProduceOutputWithRequest_Dot_ToStringInline() - throws Exception - { - MarmaladeParsingContext parseContext = new DefaultParsingContext(); - parseContext.setInput( new StringReader( TEST_SCRIPT ) ); - parseContext.setInputLocation( "" ); - - ScriptBuilder builder = new ScriptParser().parse( parseContext ); - - MarmaladeScript script = builder.build(); - - MarmaladeMojo mojo = new MarmaladeMojo( script ); - - mojo.setComponentConfiguration( Collections.singletonMap( "param", "paramValue" ) ); - - mojo.execute(); - - // TODO: need to be able to pass back results -// Object result = request.getContextValue( "testvar" ); -// -// assertEquals( "paramValue/testval", result ); - } - -} \ No newline at end of file diff --git a/sandbox/maven-1.x-integration/README.txt b/sandbox/maven-1.x-integration/README.txt deleted file mode 100644 index 395314a542..0000000000 --- a/sandbox/maven-1.x-integration/README.txt +++ /dev/null @@ -1,14 +0,0 @@ -Maven 1.x Integration - -This component will internally spawn a complete Maven 1.x instance -that will run a project from within m2, using a specified version of -Maven 1.x. - -This will allow a mix of m2 and m1 projects in a single organization -with only one installation, aiding the transition. - -Work in progress, Brett Porter, 18/8/04 - - -Currently it does require an m1 installation to obtain the plugins installed. It could potentially use -the plugin descriptor file for this. diff --git a/sandbox/maven-1.x-integration/pom.xml b/sandbox/maven-1.x-integration/pom.xml deleted file mode 100644 index b4d00dbd5a..0000000000 --- a/sandbox/maven-1.x-integration/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - maven - org.apache.maven - 2.0-beta-1-SNAPSHOT - - 4.0.0 - maven-1.x-integration - Maven 1.x Compatibility - 2004 - - - org.codehaus.plexus - plexus-utils - - - org.codehaus.plexus - plexus-container-default - - - - diff --git a/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/DefaultMaven1xIntegration.java b/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/DefaultMaven1xIntegration.java deleted file mode 100644 index 0d2225b289..0000000000 --- a/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/DefaultMaven1xIntegration.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.apache.maven.legacy; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.util.cli.CommandLineException; -import org.codehaus.plexus.util.cli.CommandLineUtils; -import org.codehaus.plexus.util.cli.Commandline; -import org.codehaus.plexus.util.cli.DefaultConsumer; -import org.codehaus.plexus.util.cli.StreamConsumer; - -import java.io.File; -import java.util.Iterator; -import java.util.List; - -/** - * @author Brett Porter - * @version $Id$ - */ -public class DefaultMaven1xIntegration - extends AbstractLogEnabled - implements Maven1xIntegration -{ - private String mavenHome; - - private String mavenHomeLocal; - - // ---------------------------------------------------------------------- - // Execution - // ---------------------------------------------------------------------- - - // TODO: may want an executionresponse returned? If so, that may need to be part of another component - public void execute( File project, List goals ) - throws Maven1xIntegrationException - { - Commandline cl = new Commandline(); - - String exec = "maven"; - if ( mavenHome != null ) - { - exec = mavenHome + "/bin/" + exec; - cl.createArgument().setValue( "-Dmaven.home=" + mavenHome ); - } - if ( mavenHomeLocal != null ) - { - cl.createArgument().setValue( "-Dmaven.home.local=" + mavenHomeLocal ); - } - - cl.setExecutable( exec ); - - cl.setWorkingDirectory( project.getParentFile().getAbsolutePath() ); - - for ( Iterator i = goals.iterator(); i.hasNext(); ) - { - cl.createArgument().setValue( (String) i.next() ); - } - - StreamConsumer consumer = new DefaultConsumer(); - - try - { - int exitCode = CommandLineUtils.executeCommandLine( cl, consumer, consumer ); - if ( exitCode != 0 ) - { - throw new Maven1xIntegrationException( "Received exit code " + exitCode + " from Maven" ); - } - } - catch ( CommandLineException e ) - { - throw new Maven1xIntegrationException( "Can't run goals " + goals, e ); - } - - // TODO: need better integration, requires changes in Maven 1.1 - also want to avoid a dep on forehead in m2/lib - try - { -/* - File foreheadConf = new File( mavenHome, "bin/forehead.conf" ); - System.setProperty( "tools.jar", "file:" + System.getProperty( "java.home" ) + "/lib/tools.jar" ); - System.setProperty( "maven.home", mavenHome ); - System.setProperty( "maven.home.local", mavenHome ); - - Forehead.getInstance().config( new FileReader( foreheadConf ) ); - // TODO: this currently System.exit()s - Forehead.getInstance().run( (String[]) goals.toArray( EMPTY_STRING_ARRAY ) ); -*/ - -/* - URL foreheadUrl = new File( mavenHome, "lib/forehead-1.0-beta-5.jar" ).toURL(); - ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); - ClassLoader cl = URLClassLoader.newInstance( new URL[] { foreheadUrl } ); - Class c = Class.forName( "com.werken.forehead.Forehead", true, cl ); - Method m = c.getMethod( "getInstance", new Class[] {} ); - Object forehead = m.invoke( null, new Object[] {} ); - m = c.getMethod( "config", new Class[] { java.io.InputStream.class } ); - m.invoke( forehead, new Object[] { new FileInputStream( foreheadConf ) } ); - System.setProperty( "user.dir", project.getParentFile().getAbsolutePath() ); -*/ - -/* - m = c.getMethod( "getClassLoader", new Class[]{String.class} ); - cl = (ClassLoader) m.invoke( forehead, new Object[]{"root.maven"} ); - Thread.currentThread().setContextClassLoader( cl ); - c = Class.forName( "org.apache.maven.cli.App", true, cl ); - Object app = c.newInstance(); - m = c.getMethod( "initialize", new Class[]{String[].class} ); - m.invoke( app, new Object[]{(String[]) goals.toArray( new String[0] )} ); - Object session = c.getDeclaredField( "mavenSession" ).get( app ); - m = session.getClass().getMethod( "initialize", new Class[0] ); - m.invoke( session, new Object[0] ); - m = session.getClass().getMethod( "getRootProject", new Class[0] ); - Object p = m.invoke( session, new Object[0] ); - m = session.getClass().getMethod( "attainGoals", new Class[]{p.getClass(), List.class} ); - m.invoke( session, new Object[]{p, goals} ); -*/ - -/* - // TODO: this currently system.exit's - m = c.getMethod( "run", new Class[]{String[].class} ); - m.invoke( forehead, new Object[]{(String[]) goals.toArray( new String[0] )} ); - Thread.currentThread().setContextClassLoader( oldClassLoader ); -*/ - } - catch ( Exception e ) - { - throw new Maven1xIntegrationException( "Error executing Maven 1.x", e ); - } - } - - public void setMavenHome( String mavenHome ) - { - this.mavenHome = mavenHome; - } - - public String getMavenHome() - { - return mavenHome; - } - - public void setMavenHomeLocal( String mavenHomeLocal ) - { - this.mavenHomeLocal = mavenHomeLocal; - } - - public String getMavenHomeLocal() - { - return mavenHomeLocal; - } - -} - diff --git a/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegration.java b/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegration.java deleted file mode 100644 index 8ce8f41416..0000000000 --- a/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegration.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.apache.maven.legacy; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.util.List; - -/** - * @author Brett Porter - * @version $Id$ - */ -public interface Maven1xIntegration -{ - static String ROLE = Maven1xIntegration.class.getName(); - - // ---------------------------------------------------------------------- - // Execution - // ---------------------------------------------------------------------- - - void execute( File project, List goals ) - throws Maven1xIntegrationException; - - // ---------------------------------------------------------------------- - // Maven home - // ---------------------------------------------------------------------- - void setMavenHome( String mavenHome ); - - String getMavenHome(); - - void setMavenHomeLocal( String mavenHomeLocal ); - - String getMavenHomeLocal(); -} - diff --git a/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegrationException.java b/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegrationException.java deleted file mode 100644 index b3e603b2eb..0000000000 --- a/sandbox/maven-1.x-integration/src/main/java/org/apache/maven/legacy/Maven1xIntegrationException.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.apache.maven.legacy; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Exception in the Maven 1.x integration. - * - * @author Brett Porter - * @version $Id$ - */ -public class Maven1xIntegrationException - extends Exception -{ - public Maven1xIntegrationException( String message ) - { - super( message ); - } - - public Maven1xIntegrationException( String msg, Exception e ) - { - super( msg, e ); - } -} diff --git a/sandbox/maven-1.x-integration/src/main/resources/META-INF/plexus/components.xml b/sandbox/maven-1.x-integration/src/main/resources/META-INF/plexus/components.xml deleted file mode 100644 index 2c0087705a..0000000000 --- a/sandbox/maven-1.x-integration/src/main/resources/META-INF/plexus/components.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - org.apache.maven.legacy.Maven1xIntegration - org.apache.maven.legacy.DefaultMaven1xIntegration - - - - - diff --git a/sandbox/maven-ejb3-plugin/pom.xml b/sandbox/maven-ejb3-plugin/pom.xml deleted file mode 100644 index c9a691f453..0000000000 --- a/sandbox/maven-ejb3-plugin/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - maven-plugin-parent - org.apache.maven.plugins - 2.0 - - 4.0.0 - maven-ejb3-plugin - maven-plugin - Maven EJB3 plugin - 2.1-SNAPSHOT - - - org.apache.maven - maven-project - - - org.apache.maven - maven-archiver - 2.0 - - - diff --git a/sandbox/maven-ejb3-plugin/src/main/java/org/apache/maven/plugin/ejb3/Ejb3Mojo.java b/sandbox/maven-ejb3-plugin/src/main/java/org/apache/maven/plugin/ejb3/Ejb3Mojo.java deleted file mode 100644 index d6b675e0b0..0000000000 --- a/sandbox/maven-ejb3-plugin/src/main/java/org/apache/maven/plugin/ejb3/Ejb3Mojo.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.apache.maven.plugin.ejb3; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.archiver.MavenArchiveConfiguration; -import org.apache.maven.archiver.MavenArchiver; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.util.FileUtils; - -import java.io.File; -import java.io.IOException; - -/** - * Builds J2EE EJB3 archive. - * - * @author Piotr Bzdyl - * @version $Id$ - * @goal ejb3 - * @phase package - * @description build an ejb3 - * - * @todo Add deployment descriptor file handling - */ -public class Ejb3Mojo - extends AbstractMojo -{ - - private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"}; - - private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"}; - - - /** - * Directory containing the generated EJB3. - * - * @parameter expression="${project.build.directory}" - * @required - * @readonly - */ - private File basedir; - - /** - * Name of the generated EJB3. - * - * @parameter alias="parName" expression="${project.build.finalName}" - * @required - */ - private String finalName; - - /** - * Directory containing the classes. - * - * @parameter expression="${project.build.outputDirectory}" - * @required - * @readonly - */ - private File outputDirectory; - - /** - * Single directory for extra files to include in the ejb3. - * - * @parameter expression="${basedir}/src/main/ejb3" - * @required - */ - private File ejb3SourceDirectory; - - /** - * The maven project. - * - * @parameter expression="${project}" - * @required - * @readonly - */ - private MavenProject project; - - /** - * The maven archiver to use. - * - * @parameter - */ - private MavenArchiveConfiguration archive = new MavenArchiveConfiguration(); - - /** - * Generates the EJB3. - * - * @todo Add license files in META-INF directory. - */ - public void execute() - throws MojoExecutionException - { - // Copy source files - try - { - if ( ejb3SourceDirectory != null - && ejb3SourceDirectory.exists() ) - { - getLog().info( "Copy ejb3 resources to " + outputDirectory.getAbsolutePath() ); - FileUtils.copyDirectoryStructure( ejb3SourceDirectory, outputDirectory ); - } - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Error copying EJB3 resources", e ); - } - - File ejb3File = new File( basedir, finalName + ".ejb3" ); - - MavenArchiver archiver = new MavenArchiver(); - - archiver.setOutputFile( ejb3File ); - - try - { - if ( outputDirectory == null || !outputDirectory.exists() ) - { - getLog().warn( "EJB3 will be empty - no content was marked for inclusion!" ); - } - else - { - archiver.getArchiver().addDirectory( outputDirectory, DEFAULT_INCLUDES, DEFAULT_EXCLUDES ); - } - - archiver.createArchive( project, archive ); - - project.getArtifact().setFile( ejb3File ); - } - catch ( Exception e ) - { - // TODO: improve error handling - throw new MojoExecutionException( "Error assembling EJB3", e ); - } - } -} diff --git a/sandbox/maven-it-plugin/maven-it-plugin-test/pom.xml b/sandbox/maven-it-plugin/maven-it-plugin-test/pom.xml deleted file mode 100644 index 79741a64ed..0000000000 --- a/sandbox/maven-it-plugin/maven-it-plugin-test/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - 4.0.0 - org.apache.maven - maven-it-plugin-test - 1.0-alpha-1-SNAPSHOT - - - - - maven-it-plugin - - ${basedir}/../../../maven-core-it - - it0*/pom.xml - - - it007*/pom.xml - it008*/pom.xml - - - - - integration-test - - fork - - - - - - maven-antrun-plugin - - - package - - - Packaging maven-it-plugin-test - - - - run - - - - - - - diff --git a/sandbox/maven-it-plugin/pom.xml b/sandbox/maven-it-plugin/pom.xml deleted file mode 100644 index 32da3ec5a7..0000000000 --- a/sandbox/maven-it-plugin/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - 4.0.0 - - maven-plugin-parent - org.apache.maven.plugins - 2.0-beta-3-SNAPSHOT - - maven-it-plugin - maven-plugin - Maven Integration Test Plugin - - - org.apache.maven - maven-core - 2.0-beta-3-SNAPSHOT - - - - org.apache.maven - maven-project - 2.0-beta-3-SNAPSHOT - - - org.apache.maven - maven-artifact - 2.0-beta-3-SNAPSHOT - - - org.apache.maven - maven-artifact-manager - 2.0-beta-3-SNAPSHOT - - - org.apache.maven - maven-settings - 2.0-beta-3-SNAPSHOT - - - org.apache.maven - maven-archiver - 2.0-beta-3-SNAPSHOT - - - diff --git a/sandbox/maven-it-plugin/src/main/java/org/apache/maven/plugin/it/ForkMojo.java b/sandbox/maven-it-plugin/src/main/java/org/apache/maven/plugin/it/ForkMojo.java deleted file mode 100644 index 1430f7f8c2..0000000000 --- a/sandbox/maven-it-plugin/src/main/java/org/apache/maven/plugin/it/ForkMojo.java +++ /dev/null @@ -1,240 +0,0 @@ -package org.apache.maven.plugin.it; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -import org.apache.maven.execution.MavenExecutionResponse; -import org.apache.maven.execution.MavenSession; -import org.apache.maven.execution.ReactorManager; -import org.apache.maven.lifecycle.LifecycleExecutionException; -import org.apache.maven.lifecycle.LifecycleExecutor; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.profiles.DefaultProfileManager; -import org.apache.maven.project.MavenProject; -import org.apache.maven.project.MavenProjectBuilder; -import org.apache.maven.project.ProjectBuildingException; -import org.apache.maven.settings.Settings; -import org.apache.maven.embedder.MavenEmbedder; -import org.codehaus.plexus.component.repository.exception.ComponentLookupException; -import org.codehaus.plexus.util.DirectoryScanner; -import org.codehaus.plexus.util.dag.CycleDetectedException; - -/** - * @goal fork - * - * @author Kenney Westerhof - */ -public class ForkMojo - extends AbstractMojo -{ - /** - * @parameter expression="${component.org.apache.maven.lifecycle.LifecycleExecutor}" - */ - private LifecycleExecutor lifecycleExecutor; - - /** - * @parameter expression="${session}" - */ - private MavenSession session; - - /** - * @parameter expression="${settings}" - */ - private Settings settings; - - /** - * @parameter expression="${project}" - */ - private MavenProject project; - - /** - * @parameter expression="${project.basedir}/src/it/" - */ - private File integrationTestsDirectory; - - /** - * @parameter - */ - private String [] includes = new String[] { "*/pom.xml" }; - - /** - * @parameter - */ - private String [] excludes = new String[0]; - - public void execute() - throws MojoExecutionException - { - // ---------------------------------------------------------------------- - // Here we will try to use the embedder - // ---------------------------------------------------------------------- - // - // ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - // - // MavenEmbedder maven = new MavenEmbedder(); - // - // maven.setClassLoader( classLoader ); - // - // maven.start(); - // - // List projects = maven.collectProjects( integrationTestsDirectory, includes, excludes ); - // - // maven.execute( projects, Collections.singletonList( "package" ), eventDispatcher, integrationTestsDirectory ); - // - - - try - { - buildProjects(); - } - catch ( CycleDetectedException e ) - { - throw new MojoExecutionException( "Error building projects", e ); - } - catch ( LifecycleExecutionException e ) - { - throw new MojoExecutionException( "Error building projects", e ); - } - } - - private void buildProjects() - throws CycleDetectedException, LifecycleExecutionException, MojoExecutionException - { - List projects = collectProjects(); - - projects.add( project ); - - ReactorManager rm = new ReactorManager( projects ); - - rm.setFailureBehavior( ReactorManager.FAIL_AT_END ); - - rm.blackList( project ); - - List goals = Collections.singletonList( "package" ); - - MavenSession forkedSession = new MavenSession( - session.getContainer(), session.getSettings(), - session.getLocalRepository(), - session.getEventDispatcher(), - rm, goals, integrationTestsDirectory.toString() - ); - - forkedSession.setUsingPOMsFromFilesystem( true ); - - MavenExecutionResponse response = lifecycleExecutor.execute( forkedSession, - rm, forkedSession.getEventDispatcher() - ); - - if ( response.isExecutionFailure() ) - { - getLog().error( "Integration test failed", response.getException() ); - throw new MojoExecutionException( "Integration test failed" ); - } - } - - private List collectProjects() - throws MojoExecutionException - { - List projects = new ArrayList(); - - MavenProjectBuilder projectBuilder; - - try - { - projectBuilder = (MavenProjectBuilder) - session.getContainer().lookup( MavenProjectBuilder.ROLE ); - } - catch ( ComponentLookupException e ) - { - throw new MojoExecutionException( "Cannot get a MavenProjectBuilder", e ); - } - - List poms = listITPoms(); - - for ( Iterator i = poms.iterator(); i.hasNext(); ) - { - File pom = (File) i.next(); - - try - { - MavenProject p = projectBuilder.build( - pom, session.getLocalRepository(), - new DefaultProfileManager( session.getContainer() ) ); - - getLog().debug( "Adding project " + p.getId() ); - - projects.add( p ); - - } - catch (ProjectBuildingException e) - { - throw new MojoExecutionException( "Error loading " + pom, e ); - } - } - - return projects; - } - - private List listITPoms() - { - DirectoryScanner scanner = new DirectoryScanner(); - - scanner.setBasedir( integrationTestsDirectory ); - - scanner.setIncludes( includes ); - - scanner.setExcludes( excludes ); - - scanner.scan(); - - List poms = new ArrayList(); - - for ( int i = 0; i < scanner.getIncludedFiles().length; i++ ) - { - poms.add( new File( integrationTestsDirectory, scanner.getIncludedFiles()[i] ) ); - } - - return poms; - - /* - List poms = new ArrayList(); - - File [] children = integrationTestsDirectory.listFiles(); - - for ( int i = 0; i < children.length; i++ ) - { - if ( children[i].isDirectory() ) - { - File pomFile = new File( children[i], "pom.xml" ); - - if ( pomFile.exists() && pomFile.isFile() ) - { - poms.add( pomFile ); - } - } - } - - return poms; - */ - } -} diff --git a/sandbox/maven-one-plugin/pom.xml b/sandbox/maven-one-plugin/pom.xml deleted file mode 100644 index 80635533c8..0000000000 --- a/sandbox/maven-one-plugin/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - 4.0.0 - org.apache.maven.plugins - maven-one-plugin - maven-plugin - 1.0-SNAPSHOT - Maven 1.x Plugin - - - org.apache.maven - maven-plugin-api - 2.0 - - - junit - junit - 3.8.1 - test - - - org.apache.maven - maven-archiver - 2.0 - - - org.apache.maven - maven-project - 2.0 - - - org.codehaus.plexus - plexus-archiver - 1.0-alpha-3 - - - org.codehaus.plexus - plexus-utils - 1.0.4 - - - - - - maven-plugin-plugin - - maven-one-plugin - - - - - - - repo1 - Maven Central Repository - scp://repo1.maven.org/home/projects/maven/repository-staging/to-ibiblio/maven2 - - - snapshots - Maven Central Development Repository - scp://repo1.maven.org/home/projects/maven/repository-staging/snapshots/maven2 - - - website - scp://minotaur.apache.org/www/maven.apache.org/sandbox/ - - - diff --git a/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOnePluginMojo.java b/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOnePluginMojo.java deleted file mode 100644 index d0531e3260..0000000000 --- a/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOnePluginMojo.java +++ /dev/null @@ -1,162 +0,0 @@ -package org.apache.maven.plugins.mavenone; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.archiver.MavenArchiveConfiguration; -import org.apache.maven.archiver.MavenArchiver; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.project.MavenProject; -import org.apache.maven.project.MavenProjectHelper; -import org.codehaus.plexus.archiver.ArchiverException; -import org.codehaus.plexus.archiver.jar.JarArchiver; -import org.codehaus.plexus.util.FileUtils; - -import java.io.File; - -/** - * Create a Maven 1.x plugin. - * - * @goal maven-one-plugin - * @phase package - */ -public class MavenOnePluginMojo - extends AbstractMojo -{ - - private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"}; - - private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"}; - - /** - * Directory containing the generated JAR. - * - * @parameter expression="${project.build.directory}" - * @required - * @readonly - */ - private File basedir; - - /** - * Name of the generated JAR. - * - * @parameter expression="${project.build.finalName}" - * @required - */ - private String finalName; - - /** - * The Jar archiver. - * - * @parameter expression="${component.org.codehaus.plexus.archiver.Archiver#jar}" - * @required - */ - private JarArchiver jarArchiver; - - /** - * The maven project. - * - * @parameter expression="${project}" - * @required - * @readonly - */ - private MavenProject project; - - /** - * @component - */ - private MavenProjectHelper projectHelper; - - /** - * @parameter expression="${project.build.outputDirectory}" - * @required - */ - private File contentDirectory; - - /** - * Generates the JAR. - * - * @todo Add license files in META-INF directory. - */ - public File createArchive() - throws MojoExecutionException - { - File jarFile = new File( basedir, finalName + ".jar" ); - - MavenArchiver archiver = new MavenArchiver(); - - archiver.setArchiver( jarArchiver ); - - archiver.setOutputFile( jarFile ); - - try - { - if ( contentDirectory.exists() ) - { - archiver.getArchiver().addDirectory( contentDirectory, DEFAULT_INCLUDES, DEFAULT_EXCLUDES ); - } - - addFile( archiver, new File( "plugin.jelly" ) ); - addFile( archiver, new File( "plugin.properties" ) ); - addFile( archiver, new File( "project.properties" ) ); - addFile( archiver, new File( "build.properties" ) ); - addFile( archiver, new File( "project.xml" ) ); - addDirectory( archiver, new File( "src/plugin-resources" ) ); - - archiver.createArchive( project, new MavenArchiveConfiguration() ); - - return jarFile; - } - catch ( Exception e ) - { - // TODO: improve error handling - throw new MojoExecutionException( "Error assembling JAR", e ); - } - } - - private static void addDirectory( MavenArchiver archiver, File file ) - throws ArchiverException - { - if ( file.exists() ) - { - archiver.getArchiver().addDirectory( file, file.getName() + "/", DEFAULT_INCLUDES, - FileUtils.getDefaultExcludes() ); - } - } - - private static void addFile( MavenArchiver archiver, File file ) - throws ArchiverException - { - if ( file.exists() ) - { - archiver.getArchiver().addFile( file, file.getName() ); - } - } - - /** - * Generates the JAR. - * - * @todo Add license files in META-INF directory. - */ - public void execute() - throws MojoExecutionException - { - File jarFile = createArchive(); - - project.getArtifact().setFile( jarFile ); - } -} diff --git a/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryDeployMojo.java b/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryDeployMojo.java deleted file mode 100644 index 1423e49ca3..0000000000 --- a/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryDeployMojo.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.apache.maven.plugins.mavenone; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.deployer.ArtifactDeployer; -import org.apache.maven.artifact.deployer.ArtifactDeploymentException; -import org.apache.maven.artifact.installer.ArtifactInstallationException; -import org.apache.maven.artifact.installer.ArtifactInstaller; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.codehaus.plexus.util.IOUtil; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Properties; - -/** - * Install the artifact in a maven one local repository - * - * @goal deploy-maven-one-repository - * @phase deploy - */ -public class MavenOneRepositoryDeployMojo - extends AbstractMojo -{ - /** - * @parameter expression="${project.packaging}" - * @required - * @readonly - */ - protected String packaging; - - /** - * @parameter expression="${project.file}" - * @required - * @readonly - */ - private File pomFile; - - /** - * @parameter expression="${project.artifact}" - * @required - * @readonly - */ - private Artifact artifact; - - /** - * @component - */ - protected ArtifactDeployer deployer; - - /** - * @component - */ - protected ArtifactRepositoryFactory factory; - - /** - * @parameter expression="${remoteRepositoryId}" default-value="mavenOneRemoteRepository" - * @required - */ - protected String remoteRepositoryId; - - /** - * @parameter expression="${remoteRepositoryUrl}" - * @required - */ - protected String remoteRepositoryUrl; - - /** - * @component roleHint="legacy" - */ - private ArtifactRepositoryLayout legacyLayout; - - /** - * @parameter expression="${localRepository}" - * @required - * @readonly - */ - private ArtifactRepository localRepository; - - public void execute() - throws MojoExecutionException - { - try - { - ArtifactRepository deploymentRepository = factory.createDeploymentArtifactRepository( remoteRepositoryId, - remoteRepositoryUrl, - legacyLayout, false ); - - boolean isPomArtifact = "pom".equals( packaging ); - - if ( isPomArtifact ) - { - deployer.deploy( pomFile, artifact, deploymentRepository, localRepository ); - } - else - { - File file = artifact.getFile(); - if ( file == null ) - { - throw new MojoExecutionException( - "The packaging for this project did not assign a file to the build artifact" ); - } - deployer.deploy( file, artifact, deploymentRepository, localRepository ); - } - - } - catch ( ArtifactDeploymentException e ) - { - throw new MojoExecutionException( e.getMessage(), e ); - } - } -} diff --git a/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryInstallMojo.java b/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryInstallMojo.java deleted file mode 100644 index 248c11c96b..0000000000 --- a/sandbox/maven-one-plugin/src/main/java/org/apache/maven/plugins/mavenone/MavenOneRepositoryInstallMojo.java +++ /dev/null @@ -1,155 +0,0 @@ -package org.apache.maven.plugins.mavenone; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.installer.ArtifactInstallationException; -import org.apache.maven.artifact.installer.ArtifactInstaller; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.codehaus.plexus.util.IOUtil; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Properties; - -/** - * Install the artifact in a maven one local repository - * - * @goal install-maven-one-repository - * @phase install - */ -public class MavenOneRepositoryInstallMojo - extends AbstractMojo -{ - /** - * @parameter expression="${project.packaging}" - * @required - * @readonly - */ - protected String packaging; - - /** - * @parameter expression="${project.file}" - * @required - * @readonly - */ - private File pomFile; - - /** - * @parameter expression="${project.artifact}" - * @required - * @readonly - */ - private Artifact artifact; - - /** - * @component - */ - protected ArtifactInstaller installer; - - /** - * @component - */ - protected ArtifactRepositoryFactory factory; - - /** - * @parameter expression="${mavenOneRepository}" - */ - protected String mavenOneRepository; - - /** - * @component roleHint="legacy" - */ - private ArtifactRepositoryLayout legacyLayout; - - public void execute() - throws MojoExecutionException - { - try - { - if ( mavenOneRepository == null ) - { - File f = new File( System.getProperty( "user.home" ), "build.properties" ); - if ( f.exists() ) - { - Properties p = new Properties(); - FileInputStream inStream = new FileInputStream( f ); - try - { - p.load( inStream ); - } - finally - { - IOUtil.close( inStream ); - } - mavenOneRepository = p.getProperty( "maven.repo.local" ); - } - - if ( mavenOneRepository == null ) - { - mavenOneRepository = System.getProperty( "user.home" ) + "/.maven/repository"; - } - } - - File f = new File( mavenOneRepository ); - if ( !f.exists() ) - { - f.mkdirs(); - } - - ArtifactRepository localRepository = factory.createDeploymentArtifactRepository( "mavenOneRepository", - f.toURL().toString(), - legacyLayout, false ); - - boolean isPomArtifact = "pom".equals( packaging ); - - if ( isPomArtifact ) - { - installer.install( pomFile, artifact, localRepository ); - } - else - { - File file = artifact.getFile(); - if ( file == null ) - { - throw new MojoExecutionException( - "The packaging for this project did not assign a file to the build artifact" ); - } - installer.install( file, artifact, localRepository ); - } - - } - catch ( ArtifactInstallationException e ) - { - throw new MojoExecutionException( e.getMessage(), e ); - } - catch ( FileNotFoundException e ) - { - throw new MojoExecutionException( e.getMessage(), e ); - } - catch ( IOException e ) - { - throw new MojoExecutionException( e.getMessage(), e ); - } - } -} diff --git a/sandbox/maven-one-plugin/src/main/resources/META-INF/plexus/components.xml b/sandbox/maven-one-plugin/src/main/resources/META-INF/plexus/components.xml deleted file mode 100644 index 4ada2c3b18..0000000000 --- a/sandbox/maven-one-plugin/src/main/resources/META-INF/plexus/components.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - org.apache.maven.lifecycle.mapping.LifecycleMapping - maven-one-plugin - org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping - - - - default - - org.apache.maven.plugins:maven-resources-plugin:resources - org.apache.maven.plugins:maven-compiler-plugin:compile - - org.apache.maven.plugins:maven-resources-plugin:testResources - org.apache.maven.plugins:maven-compiler-plugin:testCompile - org.apache.maven.plugins:maven-surefire-plugin:test - - org.apache.maven.plugins:maven-one-plugin:maven-one-plugin - - org.apache.maven.plugins:maven-install-plugin:install - org.apache.maven.plugins:maven-deploy-plugin:deploy - - - - - - - - org.apache.maven.artifact.handler.ArtifactHandler - maven-one-plugin - org.apache.maven.artifact.handler.DefaultArtifactHandler - - maven-one-plugin - plugins - jar - java - true - - - - - \ No newline at end of file diff --git a/sandbox/maven-one-plugin/src/site/apt/introduction.apt b/sandbox/maven-one-plugin/src/site/apt/introduction.apt deleted file mode 100644 index ff235cc8ea..0000000000 --- a/sandbox/maven-one-plugin/src/site/apt/introduction.apt +++ /dev/null @@ -1,97 +0,0 @@ - ---------- -Maven One Plugin - ---------- -Brett Porter - ---------- -1 November 2005 - ---------- - -Maven One Plugin - - The Maven One Plugin is a plugin for Maven 2.0 that performs some integration tasks with Maven 1.x: - - * Provides a packaging for Maven 1.x plugins, building using Maven 2.0 - - * Provides a hook for installation that will copy built artifacts into a local Maven 1.x repository, for - concurrent development with Maven 1.x projects - -* Maven 1.x Plugin Packaging - - To build a Maven 1.x plugin using Maven 2.x, you need to include this plugin in the build section, and use a - <<>> of <<>>. The following is an example of such a POM: - -------- - - 4.0.0 - maven - maven-site-plugin - maven-one-plugin - 1.6-SNAPSHOT - - - - maven-one-plugin - true - - - - -------- - -* Maven 1.x Local Repository Installation - - To have your artifact installed into a local Maven 1.x repository, add the following lifecycle binding to your POM: - -------- - - ... - - maven-one-plugin - - - - install-maven-one-repository - - - - - ... - -------- - - <> The plugin section can be shared with the one above in the case of building a Maven 1.x plugin. - - This will read the local repository location from <<<~/build.properties>>>, defaulting to <<<~/.maven/repository>>>. - -* Maven 1.x Remote Repository Deployment - - To have your artifact deployed into an additional remote Maven 1.x repository, add the following lifecycle binding to - your POM: - -------- - - ... - - maven-one-plugin - - - - scp://cvs.apache.org/repository - - - deploy-maven-one-repository - - - - - ... - -------- - - This will not read any settings from the Maven 1.x properties, so the URL is required. - - If configuring server settings in your local configuration, use the ID of <<>>. This can be - overridden using the <<>> configuration element. - - For more information, see the {{{index.html} Goal Reference}}. - diff --git a/sandbox/maven-one-plugin/src/site/site.xml b/sandbox/maven-one-plugin/src/site/site.xml deleted file mode 100644 index 7f98c6e45f..0000000000 --- a/sandbox/maven-one-plugin/src/site/site.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - Maven One plugin - http://maven.apache.org/images/apache-maven-project.png - http://maven.apache.org/ - - - http://maven.apache.org/images/maven-small.gif - - - - - - -

- - - - ${reports} - - - diff --git a/sandbox/maven-par-plugin/pom.xml b/sandbox/maven-par-plugin/pom.xml deleted file mode 100644 index 6b29829856..0000000000 --- a/sandbox/maven-par-plugin/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - maven-plugin-parent - org.apache.maven.plugins - 2.0 - - 4.0.0 - maven-par-plugin - maven-plugin - Maven Par plugin - 2.1-SNAPSHOT - - - org.apache.maven - maven-project - - - org.apache.maven - maven-archiver - 2.0 - - - diff --git a/sandbox/maven-par-plugin/src/main/java/org/apache/maven/plugin/par/ParMojo.java b/sandbox/maven-par-plugin/src/main/java/org/apache/maven/plugin/par/ParMojo.java deleted file mode 100644 index 37877fd056..0000000000 --- a/sandbox/maven-par-plugin/src/main/java/org/apache/maven/plugin/par/ParMojo.java +++ /dev/null @@ -1,164 +0,0 @@ -package org.apache.maven.plugin.par; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.archiver.MavenArchiveConfiguration; -import org.apache.maven.archiver.MavenArchiver; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.util.FileUtils; - -import java.io.File; -import java.io.IOException; - -/** - * Builds J2EE5 Persistence Archive (PAR) files. - * - * @author Piotr Bzdyl - * @version $Id$ - * @goal par - * @phase package - * @description build a par - */ -public class ParMojo - extends AbstractMojo -{ - - private static final String[] DEFAULT_EXCLUDES = new String[]{"**/package.html"}; - - private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"}; - - - /** - * Directory containing the generated PAR. - * - * @parameter expression="${project.build.directory}" - * @required - * @readonly - */ - private File basedir; - - /** - * Name of the generated PAR. - * - * @parameter alias="parName" expression="${project.build.finalName}" - * @required - */ - private String finalName; - - /** - * Directory containing the classes. - * - * @parameter expression="${project.build.outputDirectory}" - * @required - * @readonly - */ - private File outputDirectory; - - /** - * Single directory for extra files to include in the PAR. - * - * @parameter expression="${basedir}/src/main/par" - * @required - */ - private File parSourceDirectory; - - /** - * The location of the persistence.xml file to be used within the par file. - * - * @parameter expression="${basedir}/src/main/par/META-INF/persistence.xml" - */ - private File persistenceXmlLocation; - - /** - * The maven project. - * - * @parameter expression="${project}" - * @required - * @readonly - */ - private MavenProject project; - - /** - * The maven archiver to use. - * - * @parameter - */ - private MavenArchiveConfiguration archive = new MavenArchiveConfiguration(); - - /** - * Generates the PAR. - * - * @todo Add license files in META-INF directory. - */ - public void execute() - throws MojoExecutionException - { - // Copy source files - try - { - if ( parSourceDirectory != null - && parSourceDirectory.exists() ) - { - getLog().info( "Copy par resources to " + outputDirectory.getAbsolutePath() ); - FileUtils.copyDirectoryStructure( parSourceDirectory, outputDirectory ); - } - } - catch ( IOException e ) - { - throw new MojoExecutionException( "Error copying PAR resources", e ); - } - - // Check if persistence deployment descriptor is there - if ( persistenceXmlLocation == null - || !persistenceXmlLocation.exists() ) - { - getLog().warn( - "Persistence deployment descriptor: " + persistenceXmlLocation + " does not exist." ); - } - - - - File parFile = new File( basedir, finalName + ".par" ); - - MavenArchiver archiver = new MavenArchiver(); - - archiver.setOutputFile( parFile ); - - try - { - if ( outputDirectory == null || !outputDirectory.exists() ) - { - getLog().warn( "PAR will be empty - no content was marked for inclusion!" ); - } - else - { - archiver.getArchiver().addDirectory( outputDirectory, DEFAULT_INCLUDES, DEFAULT_EXCLUDES ); - } - - archiver.createArchive( project, archive ); - - project.getArtifact().setFile( parFile ); - } - catch ( Exception e ) - { - // TODO: improve error handling - throw new MojoExecutionException( "Error assembling PAR", e ); - } - } -} diff --git a/sandbox/maven-repository-checker/pom.xml b/sandbox/maven-repository-checker/pom.xml deleted file mode 100644 index b0a8bb5658..0000000000 --- a/sandbox/maven-repository-checker/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - 4.0.0 - - org.apache.maven - maven - 2.0-beta-1-SNAPSHOT - - maven-repository-checker - Maven Repository Checker - 1.0-SNAPSHOT - - - org.apache.maven - maven-model - 2.0-beta-1-SNAPSHOT - - - org.codehaus.plexus - plexus-utils - - - - - - maven-assembly-plugin - - src/assemble/bin.xml - - - - - diff --git a/sandbox/maven-repository-checker/src/assemble/bin.xml b/sandbox/maven-repository-checker/src/assemble/bin.xml deleted file mode 100644 index 2fbc143d65..0000000000 --- a/sandbox/maven-repository-checker/src/assemble/bin.xml +++ /dev/null @@ -1,29 +0,0 @@ - - bin - - tar.gz - tar.bz2 - zip - - - - src/bin - bin - - - target - lib - - maven-repository-checker-*.jar - - - maven-repository-checker-*-sources.jar - - - - - - lib - - - diff --git a/sandbox/maven-repository-checker/src/bin/checkrepo.sh b/sandbox/maven-repository-checker/src/bin/checkrepo.sh deleted file mode 100644 index a734e0547c..0000000000 --- a/sandbox/maven-repository-checker/src/bin/checkrepo.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# ---------------------------------------------------------------------------------- - -PID=$$ -RUNNING=`ps -ef | grep checkrepo.sh | grep -v 'sh -c' | grep -v grep | grep -v $PID` -if [ ! -z "$RUNNING" ]; then - echo "checkrepo.sh already running... exiting" - exit 1 -fi - -REPO=$HOME/repository-staging/to-ibiblio/maven2 - -PRG="$0" -PRGDIR=`dirname "$PRG"` - -( -cd $PRGDIR/.. -PRGDIR=`pwd` -CLASSPATH=$PRGDIR/lib/maven-repository-checker-1.0-SNAPSHOT.jar:$PRGDIR/lib/maven-model-2.0-beta-1-SNAPSHOT.jar:$PRGDIR/lib/plexus-utils-1.0.1.jar -$JAVA_HOME/bin/java -classpath $CLASSPATH org.apache.maven.repository.checker.CheckRepo $REPO -) diff --git a/sandbox/maven-repository-checker/src/main/java/org/apache/maven/repository/checker/CheckRepo.java b/sandbox/maven-repository-checker/src/main/java/org/apache/maven/repository/checker/CheckRepo.java deleted file mode 100644 index fffb6ac28f..0000000000 --- a/sandbox/maven-repository-checker/src/main/java/org/apache/maven/repository/checker/CheckRepo.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.apache.maven.repository.checker; - -/* - * Copyright 2004-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.model.io.xpp3.MavenXpp3Reader; - -import org.codehaus.plexus.util.FileUtils; - -import java.io.File; -import java.io.FileReader; - -public class CheckRepo -{ - public static void main( String[] args ) - { - if ( args.length != 1 ) - { - System.out.println( "Usage: " + CheckRepo.class.getName() + " " ); - System.exit( 1 ); - } - - File rootDir = new File( args[0] ); - if ( !rootDir.exists() ) - { - System.out.println( rootDir.getAbsolutePath() + " doesn't exist." ); - - System.exit( 1 ); - } - - String[] extensions = { "pom" }; - - String[] files = FileUtils.getFilesFromExtension( rootDir.getAbsolutePath(), extensions ); - - for ( int i = 0; i < files.length; i++ ) - { - //System.out.println( files[i] ); - parseFile( new File( files[i] ) ); - } - } - - private static void parseFile( File file ) - { - try - { - FileReader fileReader = new FileReader( file ); - - MavenXpp3Reader reader = new MavenXpp3Reader(); - - reader.read( fileReader ); - } - catch ( Exception e ) - { - System.out.println( "================================================" ); - - System.out.println( file.getAbsolutePath() ); - - e.printStackTrace(); - - System.out.println( "================================================" ); - } - } -} diff --git a/sandbox/maven-repository-plugin/pom.xml b/sandbox/maven-repository-plugin/pom.xml deleted file mode 100644 index b00e290b73..0000000000 --- a/sandbox/maven-repository-plugin/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - org.apache.maven.plugins - maven-plugin-parent - 2.0-SNAPSHOT - - maven-repository-plugin - plugin - Maven Repository Plugin - 1.0-SNAPSHOT - org.apache.maven.plugin.repository - - - org.apache.maven - maven-repository-tools - 1.0-SNAPSHOT - - - org.apache.maven.wagon - wagon-file - 1.0-alpha-2 - - - diff --git a/sandbox/maven-repository-plugin/src/main/java/org/apache/maven/plugin/repository/ChecksumValidateMojo.java b/sandbox/maven-repository-plugin/src/main/java/org/apache/maven/plugin/repository/ChecksumValidateMojo.java deleted file mode 100644 index 70f45cba8e..0000000000 --- a/sandbox/maven-repository-plugin/src/main/java/org/apache/maven/plugin/repository/ChecksumValidateMojo.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.apache.maven.plugin.repository; - -/* - * Copyright 2001-2004 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.manager.WagonManager; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.plugin.AbstractPlugin; -import org.apache.maven.plugin.PluginExecutionRequest; -import org.apache.maven.plugin.PluginExecutionResponse; -import org.apache.maven.repository.ChecksumValidator; -import org.apache.maven.repository.RepositoryTools; -import org.apache.maven.wagon.TransferFailedException; -import org.apache.maven.wagon.UnsupportedProtocolException; -import org.apache.maven.wagon.Wagon; -import org.apache.maven.wagon.observers.ChecksumObserver; - -/** - * @goal checksumvalidate - * - * @description validates checksums in local repository - * - * @parameter - * name="localRepository" - * type="org.apache.maven.artifact.repository.ArtifactRepository" - * required="true" - * validator="" - * expression="#localRepository" - * description="" - * - * @parameter - * name="wagonManager" - * type="org.apache.maven.artifact.manager.WagonManager" - * required="true" - * validator="" - * expression="#component.org.apache.maven.artifact.manager.WagonManager" - * description="" - */ -public class ChecksumValidateMojo - extends AbstractPlugin -{ - - public void execute( PluginExecutionRequest request, PluginExecutionResponse response ) throws Exception - { - ArtifactRepository localRepository = (ArtifactRepository) request.getParameter( "localRepository" ); - - WagonManager wagonManager = (WagonManager) request.getParameter( "wagonManager" ); - - //ChecksumValidator checksumValidator = new ChecksumValidator(); - - List artifacts = RepositoryTools.getAllArtifacts( localRepository ); - - Iterator it = artifacts.iterator(); - - while ( it.hasNext() ) - { - Artifact artifact = (Artifact) it.next(); - - System.out.println( artifact ); - boolean b = isValidChecksum( wagonManager, artifact, localRepository ); - - if (!b) System.out.println( "NOT VALID" ); - -// if ( !artifact.getChecksumFile().exists() ) -// { -// // System.out.println( artifact ); -// } -// else if ( !isValidChecksum( wagonManager, artifact, localRepository ) ) -// { -// System.out.println( artifact ); -// } - } - } - - public boolean isValidChecksum( WagonManager wagonManager, Artifact artifact, ArtifactRepository localRepository ) - throws TransferFailedException, UnsupportedProtocolException - { - ChecksumObserver checksumObserver = new ChecksumObserver(); - - ArtifactRepository tempRepository = new ArtifactRepository(); - - File f = new File( "target/test-classes/temp/" ); - - tempRepository.setUrl( "file://" + f.getPath() ); - - Set set = new HashSet(); - - set.add( localRepository ); - - Wagon wagon = wagonManager.getWagon( "file://" ); - - wagon.addTransferListener( checksumObserver ); - - wagonManager.get( artifact, set, tempRepository ); - - // File file = artifact.getFile(); - // - // TransferEvent transferEvent = new TransferEvent( wagon, new - // Resource(), TransferEvent.TRANSFER_COMPLETED, - // TransferEvent.REQUEST_GET ); - // - // checksumObserver.transferStarted( transferEvent ); - // checksumObserver.transferProgress(transferEvent, file); - - return true; - } - -} diff --git a/sandbox/pom-pre-alpha-converter/pom.xml b/sandbox/pom-pre-alpha-converter/pom.xml deleted file mode 100644 index a92cc3f146..0000000000 --- a/sandbox/pom-pre-alpha-converter/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - maven-component - org.apache.maven - 2.0-beta-4-SNAPSHOT - - 4.0.0 - pom-pre-alpha-converter - jar - 1.0 - - - org.apache.maven - maven-model - 2.0-SNAPSHOT - jar - compile - - - org.apache.maven - maven-model - 4.0.0-pre-alpha1 - jar - compile - - - org.codehaus.plexus - plexus-utils - jar - compile - - - diff --git a/sandbox/pom-pre-alpha-converter/run.sh b/sandbox/pom-pre-alpha-converter/run.sh deleted file mode 100644 index 4a258c778d..0000000000 --- a/sandbox/pom-pre-alpha-converter/run.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -java -cp `cygpath -pw $HOME/repository/maven/jars/pom-pre-alpha-converter-1.0.jar:/home/Brett/repository/plexus/jars/plexus-utils-1.0-alpha-1.jar:$HOME/repository/maven/jars/maven-model-4.0.0-pre-alpha1.jar:$HOME/repository/maven/jars/maven-model-2.0-SNAPSHOT.jar` org.apache.maven.tools.converter.Main "$@" diff --git a/sandbox/pom-pre-alpha-converter/src/main/java/org/apache/maven/tools/converter/Main.java b/sandbox/pom-pre-alpha-converter/src/main/java/org/apache/maven/tools/converter/Main.java deleted file mode 100755 index eed49ecdd6..0000000000 --- a/sandbox/pom-pre-alpha-converter/src/main/java/org/apache/maven/tools/converter/Main.java +++ /dev/null @@ -1,585 +0,0 @@ -package org.apache.maven.tools.converter; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.model.Goal; -import org.apache.maven.model.Notifier; -import org.apache.maven.model.Reports; -import org.apache.maven.model.io.xpp3.MavenXpp3Writer; -import org.apache.maven.model.v4_0_0.Build; -import org.apache.maven.model.v4_0_0.CiManagement; -import org.apache.maven.model.v4_0_0.Contributor; -import org.apache.maven.model.v4_0_0.Dependency; -import org.apache.maven.model.v4_0_0.DependencyManagement; -import org.apache.maven.model.v4_0_0.Developer; -import org.apache.maven.model.v4_0_0.DistributionManagement; -import org.apache.maven.model.v4_0_0.IssueManagement; -import org.apache.maven.model.v4_0_0.License; -import org.apache.maven.model.v4_0_0.MailingList; -import org.apache.maven.model.v4_0_0.Model; -import org.apache.maven.model.v4_0_0.Organization; -import org.apache.maven.model.v4_0_0.Parent; -import org.apache.maven.model.v4_0_0.Plugin; -import org.apache.maven.model.v4_0_0.PluginManagement; -import org.apache.maven.model.v4_0_0.Repository; -import org.apache.maven.model.v4_0_0.Resource; -import org.apache.maven.model.v4_0_0.Scm; -import org.apache.maven.model.v4_0_0.Site; -import org.apache.maven.model.v4_0_0.UnitTest; -import org.apache.maven.model.v4_0_0.io.xpp3.MavenXpp3Reader; -import org.codehaus.plexus.util.FileUtils; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * @author Brett Porter - * @version $Id$ - */ -public class Main -{ - public static void main( String[] args ) - throws Exception - { - boolean reverse = false; - if ( args.length > 0 && args[0].equals( "-reverse" ) ) - { - reverse = true; - } - - List files = FileUtils.getFiles( new File( System.getProperty( "user.dir" ) ), "**/pom.xml,**/poms/*.pom", "" ); - for ( Iterator i = files.iterator(); i.hasNext(); ) - { - File file = (File) i.next(); - System.out.println( "Processing file: " + file ); - - File backup = new File( file.getParent(), file.getName() + "~" ); - - if ( reverse ) - { - if ( !backup.exists() ) - { - System.err.println( "skipping... backup does not exist" ); - continue; - } - FileUtils.copyFile( backup, file ); - backup.delete(); - } - else - { - MavenXpp3Reader reader = new MavenXpp3Reader(); - MavenXpp3Writer writer = new MavenXpp3Writer(); - - try - { - if ( backup.exists() ) - { - System.err.println( "skipping... backup exists" ); - continue; - } - - FileReader fileReader = new FileReader( file ); - Model model = reader.read( fileReader ); - fileReader.close(); - - org.apache.maven.model.Model newModel = new org.apache.maven.model.Model(); - newModel.setArtifactId( model.getArtifactId() ); - newModel.setBuild( - convertBuild( model.getBuild(), convertPlugins( model.getPlugins() ), - convertPluginManagement( model.getPluginManagement() ) ) ); - newModel.setCiManagement( convertCiManagement( model.getCiManagement() ) ); - newModel.setContributors( convertContributors( model.getContributors() ) ); - newModel.setDependencies( convertDependencies( model.getDependencies() ) ); - newModel.setDependencyManagement( convertDependencyManagement( model.getDependencyManagement() ) ); - newModel.setDescription( model.getDescription() ); - newModel.setDevelopers( convertDevelopers( model.getDevelopers() ) ); - newModel.setDistributionManagement( - convertDistributionManagement( model.getDistributionManagement() ) ); - newModel.setExtend( model.getExtend() ); - newModel.setGroupId( model.getGroupId() ); - newModel.setInceptionYear( model.getInceptionYear() ); - newModel.setIssueManagement( convertIssueManagement( model.getIssueManagement() ) ); - newModel.setLicenses( convertLicenses( model.getLicenses() ) ); - newModel.setMailingLists( convertMailingLists( model.getMailingLists() ) ); - newModel.setModelVersion( model.getModelVersion() ); - newModel.setName( model.getName() ); - newModel.setOrganization( convertOrganization( model.getOrganization() ) ); - newModel.setPackaging( model.getType() ); - newModel.setParent( convertParent( model.getParent() ) ); - newModel.setPluginRepositories( convertRepositories( model.getPluginRepositories() ) ); - newModel.setReports( convertReports( model.getReports() ) ); - newModel.setRepositories( convertRepositories( model.getRepositories() ) ); - newModel.setScm( convertScm( model.getScm() ) ); - newModel.setUrl( model.getUrl() ); - newModel.setVersion( model.getVersion() ); - - FileUtils.copyFile( file, backup ); - - FileWriter fileWriter = new FileWriter( file ); - writer.write( fileWriter, newModel ); - fileWriter.close(); - } - catch ( Exception e ) - { - System.err.println( "Skipping " + file ); - if ( args.length > 0 && args[0].equals( "-X" ) ) - { - e.printStackTrace(); - } - } - } - } - } - - private static org.apache.maven.model.Scm convertScm( Scm scm ) - { - if ( scm == null ) - { - return null; - } - - org.apache.maven.model.Scm newScm = new org.apache.maven.model.Scm(); - - newScm.setConnection( scm.getConnection() ); - newScm.setDeveloperConnection( scm.getDeveloperConnection() ); - newScm.setUrl( scm.getUrl() ); - - return newScm; - } - - private static Reports convertReports( List reports ) - { - if ( reports.isEmpty() ) - { - return null; - } - - Reports newReports = new Reports(); - // newReports.setOutputDirectory( ); -- nothing needed - - for ( Iterator i = reports.iterator(); i.hasNext(); ) - { - String name = (String) i.next(); - - org.apache.maven.model.Plugin plugin = new org.apache.maven.model.Plugin(); - - plugin.setArtifactId( name ); - - newReports.addPlugin( plugin ); - } - - return newReports; - } - - private static List convertRepositories( List repositories ) - { - List newRepositorys = new ArrayList(); - - for ( Iterator i = repositories.iterator(); i.hasNext(); ) - { - newRepositorys.add( convertRepository( (Repository) i.next() ) ); - } - return newRepositorys; - } - - private static org.apache.maven.model.Repository convertRepository( Repository repository ) - { - if ( repository == null ) - { - return null; - } - - org.apache.maven.model.Repository newRepository = new org.apache.maven.model.Repository(); - newRepository.setName( repository.getName() ); - newRepository.setId( repository.getId() ); - newRepository.setUrl( repository.getUrl() ); - return newRepository; - } - - private static org.apache.maven.model.Parent convertParent( Parent parent ) - { - if ( parent == null ) - { - return null; - } - - org.apache.maven.model.Parent newParent = new org.apache.maven.model.Parent(); - newParent.setArtifactId( parent.getArtifactId() ); - newParent.setGroupId( parent.getGroupId() ); - newParent.setVersion( parent.getVersion() ); - return newParent; - } - - private static org.apache.maven.model.Organization convertOrganization( Organization organization ) - { - if ( organization == null ) - { - return null; - } - - org.apache.maven.model.Organization newOrganization = new org.apache.maven.model.Organization(); - - newOrganization.setName( organization.getName() ); - newOrganization.setUrl( organization.getUrl() ); - - return newOrganization; - } - - private static List convertMailingLists( List mailingLists ) - { - List newMailinglists = new ArrayList(); - - for ( Iterator i = mailingLists.iterator(); i.hasNext(); ) - { - MailingList mailinglist = (MailingList) i.next(); - - org.apache.maven.model.MailingList newMailinglist = new org.apache.maven.model.MailingList(); - newMailinglist.setName( mailinglist.getName() ); - newMailinglist.setArchive( mailinglist.getArchive() ); - newMailinglist.setOtherArchives( mailinglist.getOtherArchives() ); - newMailinglist.setPost( mailinglist.getPost() ); - newMailinglist.setSubscribe( mailinglist.getSubscribe() ); - newMailinglist.setUnsubscribe( mailinglist.getUnsubscribe() ); - - newMailinglists.add( newMailinglist ); - } - return newMailinglists; - } - - private static List convertLicenses( List licenses ) - { - List newLicenses = new ArrayList(); - - for ( Iterator i = licenses.iterator(); i.hasNext(); ) - { - License license = (License) i.next(); - - org.apache.maven.model.License newLicense = new org.apache.maven.model.License(); - newLicense.setComments( license.getComments() ); - newLicense.setName( license.getName() ); - newLicense.setUrl( license.getUrl() ); - - newLicenses.add( newLicense ); - } - return newLicenses; - } - - private static org.apache.maven.model.IssueManagement convertIssueManagement( IssueManagement issueManagement ) - { - if ( issueManagement == null ) - { - return null; - } - - org.apache.maven.model.IssueManagement mgmt = new org.apache.maven.model.IssueManagement(); - - mgmt.setSystem( issueManagement.getSystem() ); - mgmt.setUrl( issueManagement.getUrl() ); - - return mgmt; - } - - private static org.apache.maven.model.DistributionManagement convertDistributionManagement( - DistributionManagement distributionManagement ) - { - if ( distributionManagement == null ) - { - return null; - } - - org.apache.maven.model.DistributionManagement mgmt = new org.apache.maven.model.DistributionManagement(); - - mgmt.setRepository( convertRepository( distributionManagement.getRepository() ) ); - mgmt.setSite( convertSite( distributionManagement.getSite() ) ); - - return mgmt; - } - - private static org.apache.maven.model.Site convertSite( Site site ) - { - if ( site == null ) - { - return null; - } - - org.apache.maven.model.Site newSite = new org.apache.maven.model.Site(); - - newSite.setId( site.getId() ); - newSite.setName( site.getName() ); - newSite.setUrl( site.getUrl() ); - - return newSite; - } - - private static org.apache.maven.model.DependencyManagement convertDependencyManagement( - DependencyManagement dependencyManagement ) - { - if ( dependencyManagement == null ) - { - return null; - } - - org.apache.maven.model.DependencyManagement mgmt = new org.apache.maven.model.DependencyManagement(); - - mgmt.setDependencies( convertDependencies( dependencyManagement.getDependencies() ) ); - - return mgmt; - } - - private static org.apache.maven.model.PluginManagement convertPluginManagement( PluginManagement pluginManagement ) - { - if ( pluginManagement == null ) - { - return null; - } - - org.apache.maven.model.PluginManagement mgmt = new org.apache.maven.model.PluginManagement(); - - mgmt.setPlugins( new ArrayList( convertPlugins( pluginManagement.getPlugins() ).values() ) ); - - return mgmt; - } - - private static List convertDependencies( List dependencies ) - { - List newDependencys = new ArrayList(); - - for ( Iterator i = dependencies.iterator(); i.hasNext(); ) - { - Dependency dependency = (Dependency) i.next(); - - org.apache.maven.model.Dependency newDependency = new org.apache.maven.model.Dependency(); - newDependency.setArtifactId( dependency.getArtifactId() ); - newDependency.setGroupId( dependency.getGroupId() ); - newDependency.setScope( dependency.getScope() ); - newDependency.setType( dependency.getType() ); - newDependency.setVersion( dependency.getVersion() ); - - newDependencys.add( newDependency ); - } - return newDependencys; - } - - private static List convertContributors( List contributors ) - { - List newContributors = new ArrayList(); - - for ( Iterator i = contributors.iterator(); i.hasNext(); ) - { - Contributor contributor = (Contributor) i.next(); - - org.apache.maven.model.Contributor newContributor = new org.apache.maven.model.Contributor(); - newContributor.setEmail( contributor.getEmail() ); - newContributor.setName( contributor.getName() ); - newContributor.setOrganization( contributor.getOrganization() ); - newContributor.setTimezone( contributor.getTimezone() ); - newContributor.setRoles( contributor.getRoles() ); - newContributor.setUrl( contributor.getUrl() ); - - newContributors.add( newContributor ); - } - return newContributors; - } - - private static List convertDevelopers( List developers ) - { - List newDevelopers = new ArrayList(); - - for ( Iterator i = developers.iterator(); i.hasNext(); ) - { - Developer developer = (Developer) i.next(); - - org.apache.maven.model.Developer newDeveloper = new org.apache.maven.model.Developer(); - newDeveloper.setEmail( developer.getEmail() ); - newDeveloper.setName( developer.getName() ); - newDeveloper.setOrganization( developer.getOrganization() ); - newDeveloper.setTimezone( developer.getTimezone() ); - newDeveloper.setRoles( developer.getRoles() ); - newDeveloper.setUrl( developer.getUrl() ); - newDeveloper.setId( developer.getId() ); - - newDevelopers.add( newDeveloper ); - } - return newDevelopers; - } - - private static org.apache.maven.model.CiManagement convertCiManagement( CiManagement ciManagement ) - { - if ( ciManagement == null ) - { - return null; - } - - org.apache.maven.model.CiManagement newCiManagement = new org.apache.maven.model.CiManagement(); - - newCiManagement.setSystem( ciManagement.getSystem() ); - newCiManagement.setUrl( ciManagement.getUrl() ); - if ( ciManagement.getNagEmailAddress() != null ) - { - Notifier notifier = new Notifier(); - notifier.setAddress( ciManagement.getNagEmailAddress() ); - notifier.setType( "email" ); - newCiManagement.addNotifier( notifier ); - } - - return newCiManagement; - } - - private static Map convertPlugins( List plugins ) - { - Map newPlugins = new HashMap(); - - for ( Iterator i = plugins.iterator(); i.hasNext(); ) - { - Plugin plugin = (Plugin) i.next(); - - org.apache.maven.model.Plugin newPlugin = new org.apache.maven.model.Plugin(); - newPlugin.setArtifactId( "maven-" + plugin.getId() + "-plugin" ); - newPlugin.setConfiguration( plugin.getConfiguration() ); - newPlugin.setDisabled( plugin.isDisabled() ); - newPlugin.setGoals( plugin.getGoals() ); - // newPlugin.setGroupId( "maven" ); -- nothing needed - - newPlugins.put( newPlugin.getArtifactId(), newPlugin ); - } - return newPlugins; - } - - private static org.apache.maven.model.Build convertBuild( Build build, Map plugins, - org.apache.maven.model.PluginManagement pluginManagement ) - { - if ( build == null && plugins.isEmpty() ) - { - return null; - } - - org.apache.maven.model.Build newBuild = new org.apache.maven.model.Build(); - - if ( !plugins.isEmpty() ) - { - newBuild.setPlugins( new ArrayList( plugins.values() ) ); - } - - if ( build == null ) - { - return newBuild; - } - - newBuild.setDirectory( build.getDirectory() ); - newBuild.setFinalName( build.getFinalName() ); - newBuild.setOutputDirectory( build.getOutput() ); - newBuild.setSourceDirectory( build.getSourceDirectory() ); - newBuild.setTestOutputDirectory( build.getTestOutput() ); - newBuild.setTestSourceDirectory( build.getUnitTestSourceDirectory() ); - newBuild.setResources( convertResources( build.getResources() ) ); - newBuild.setPluginManagement( pluginManagement ); - - if ( build.getUnitTest() != null ) - { - UnitTest unitTest = build.getUnitTest(); - org.apache.maven.model.Plugin plugin = getPlugin( plugins, "maven-compiler-plugin" ); - Goal goal = getGoal( plugin, "testCompile" ); - - String value = convertPatternSet( unitTest.getIncludes() ); - if ( value != null ) - { - goal.getConfiguration().setProperty( "includes", value ); - } - value = convertPatternSet( unitTest.getExcludes() ); - if ( value != null ) - { - goal.getConfiguration().setProperty( "excludes", value ); - } - - newBuild.setTestResources( convertResources( unitTest.getResources() ) ); - } - - return newBuild; - } - - private static List convertResources( List resources ) - { - List newResources = new ArrayList(); - - for ( Iterator i = resources.iterator(); i.hasNext(); ) - { - Resource resource = (Resource) i.next(); - - org.apache.maven.model.Resource newResource = new org.apache.maven.model.Resource(); - newResource.setDirectory( resource.getDirectory() ); - newResource.setIncludes( convertPatternSet( resource.getIncludes() ) ); - newResource.setExcludes( convertPatternSet( resource.getExcludes() ) ); - - newResources.add( newResource ); - } - return newResources; - } - - private static String convertPatternSet( List list ) - { - StringBuffer b = new StringBuffer(); - for ( Iterator i = list.iterator(); i.hasNext(); ) - { - String pattern = (String) i.next(); - b.append( pattern ); - if ( i.hasNext() ) - { - b.append( "," ); - } - } - return b.length() > 0 ? b.toString() : null; - } - - private static org.apache.maven.model.Plugin getPlugin( Map plugins, String artifactId ) - { - org.apache.maven.model.Plugin plugin = (org.apache.maven.model.Plugin) plugins.get( artifactId ); - if ( plugin == null ) - { - plugin = new org.apache.maven.model.Plugin(); - plugin.setArtifactId( artifactId ); - plugins.put( plugin.getArtifactId(), plugin ); - } - return plugin; - } - - private static Goal getGoal( org.apache.maven.model.Plugin plugin, String name ) - { - Goal goal = null; - for ( Iterator i = plugin.getGoals().iterator(); i.hasNext() && goal == null; ) - { - Goal g = (Goal) i.next(); - if ( g.getId().equals( name ) ) - { - goal = g; - } - } - - if ( goal == null ) - { - goal = new Goal(); - goal.setId( name ); - plugin.addGoal( goal ); - } - return goal; - } -} diff --git a/sandbox/repoclean/pom.xml b/sandbox/repoclean/pom.xml deleted file mode 100644 index 6d2b10e5da..0000000000 --- a/sandbox/repoclean/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - 4.0.0 - org.apache.maven - repoclean - 1.0-SNAPSHOT - Maven v3-to-v4 Repository Cleaner - - - - org.codehaus.plexus - plexus-container-default - 1.0-alpha-8 - - - plexus - plexus-mail-sender-api - 1.0-alpha-1 - - - plexus - plexus-mail-sender-simple - 1.0-alpha-2 - - - org.apache.maven - maven-artifact - 2.0 - - - org.apache.maven - maven-project - 2.0 - - - org.apache.maven - maven-artifact-manager - 2.0 - - - org.apache.maven - maven-model - 2.0 - all - - - junit - junit - 3.8.1 - test - - - - - - maven-assembly-plugin - - src/assembly/bin.xml - - - - maven-surefire-plugin - - - **/TestSupport.java - - - - - - - - snapshots - Maven Central Development Repository - http://snapshots.maven.codehaus.org/maven2 - - false - - - - diff --git a/sandbox/repoclean/src/assembly/bin.xml b/sandbox/repoclean/src/assembly/bin.xml deleted file mode 100644 index 848399b682..0000000000 --- a/sandbox/repoclean/src/assembly/bin.xml +++ /dev/null @@ -1,34 +0,0 @@ - - bin - - tar.gz - - - - src/main/bash - / - unix - 0755 - - - - target - lib - - repoclean-*.jar - - - repoclean-*-sources.jar - - - - - - lib - - - junit:junit - - - - diff --git a/sandbox/repoclean/src/main/bash/repoclean.sh b/sandbox/repoclean/src/main/bash/repoclean.sh deleted file mode 100644 index def11454da..0000000000 --- a/sandbox/repoclean/src/main/bash/repoclean.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -mydir=`dirname $0` - -CP=`ls -1 $mydir/lib/*.jar | tr '\n' ':'` - -cygwin=false -case "`uname`" in - CYGWIN*) cygwin=true ;; -esac - -if [ $cygwin == true ]; then - CP=`cygpath -pw $CP` -fi - -JAVA_OPTS="" - -if [ "$1" == "profile" ]; then - JAVA_OPTS="-agentlib:yjpagent=onexit=memory" - # You need to customise this path for your environment - export PATH=$PATH:/usr/local/yourkit/bin/win32 - shift -fi - -if [ "$1" == "debug" ]; then - JAVA_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005" - shift -fi - -if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=/usr/local/java -fi - -nice -n 19 $JAVA_HOME/bin/java -Xmx128M -Xms64M -Xincgc $JAVA_OPTS -classpath ${CP} org.apache.maven.tools.repoclean.Main $* diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/Main.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/Main.java deleted file mode 100644 index cf61ead30a..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/Main.java +++ /dev/null @@ -1,193 +0,0 @@ -package org.apache.maven.tools.repoclean; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.classworlds.ClassWorld; -import org.codehaus.plexus.embed.Embedder; -import org.codehaus.plexus.util.IOUtil; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Date; -import java.util.Properties; - -/** - * @author jdcasey - */ -public class Main -{ - - public static final String FORCE_ARG = "--force"; - - public static void main( String[] args ) - { - boolean force = false; - String configFile = null; - - if ( args.length < 1 ) - { - printUsage(); - System.exit( 0 ); - } - else if ( "-h".equals( args[0].toLowerCase() ) ) - { - printHelp(); - System.exit( 0 ); - } - else if ( "-template".equals( args[0] ) ) - { - printTemplate(); - System.exit( 0 ); - } - // up the ante, and let's try to see if there's a --force option. - else if ( args.length == 2 ) - { - if ( FORCE_ARG.equals( args[0] ) ) - { - force = true; - configFile = args[1]; - } - else if ( FORCE_ARG.equals( args[1] ) ) - { - force = true; - configFile = args[0]; - } - else - { - System.out.println( "Invalid argument list: \'" + args[0] + " " + args[1] ); - printUsage(); - System.exit( 1 ); - } - } - else - { - configFile = args[0]; - } - - try - { - RepositoryCleanerConfiguration config = buildConfig( configFile ); - - config.setForce( force ); - - launch( config ); - - System.exit( 0 ); - } - catch ( Exception e ) - { - e.printStackTrace(); - - System.exit( 1 ); - } - } - - public static void launch( RepositoryCleanerConfiguration config ) - throws Exception - { - Embedder embedder = new Embedder(); - embedder.start( new ClassWorld() ); - - RepositoryCleaner cleaner = null; - try - { - cleaner = (RepositoryCleaner) embedder.lookup( RepositoryCleaner.ROLE ); - - cleaner.cleanRepository( config ); - } - finally - { - if ( cleaner != null ) - { - embedder.release( cleaner ); - } - } - } - - private static RepositoryCleanerConfiguration buildConfig( String configPath ) - throws IOException - { - Properties props = new Properties(); - FileInputStream input = null; - try - { - input = new FileInputStream( configPath ); - props.load( input ); - } - finally - { - IOUtil.close( input ); - } - - RepositoryCleanerConfiguration config = new RepositoryCleanerConfiguration(); - config.setSourceRepositoryPath( props.getProperty( "sourceRepositoryPath" ) ); - config.setSourceRepositoryLayout( props.getProperty( "sourceRepositoryLayout", "legacy" ) ); - config.setTargetRepositoryPath( props.getProperty( "targetRepositoryPath" ) ); - config.setTargetRepositoryLayout( props.getProperty( "targetRepositoryLayout", "default" ) ); - config.setReportsPath( props.getProperty( "reportsPath" ) ); - config.setBlacklistedPatterns( props.getProperty( "blacklistedPatterns" ) ); - config.setReportOnly( Boolean.valueOf( props.getProperty( "reportOnly" ) ).booleanValue() ); - config.setReportWarningEnabled( - Boolean.valueOf( props.getProperty( "reportWarnings", "false" ) ).booleanValue() ); - config.setConvertSnapshots( - Boolean.valueOf( props.getProperty( "convertSnapshots", "false" ) ).booleanValue() ); - - config.setMailErrorReport( Boolean.valueOf( props.getProperty( "errorReport.mailOnError", "false" ) ) - .booleanValue() ); - config.setErrorReportFromAddress( props.getProperty( "errorReport.fromAddress" ) ); - config.setErrorReportFromName( props.getProperty( "errorReport.fromName" ) ); - config.setErrorReportSubject( props.getProperty( "errorReport.subject" ) ); - config.setErrorReportToAddress( props.getProperty( "errorReport.toAddress" ) ); - config.setErrorReportToName( props.getProperty( "errorReport.toName" ) ); - config.setErrorReportLink( props.getProperty( "errorReport.link" ) ); - - return config; - } - - private static void printHelp() - { - System.out.println( "repoclean: Repository Cleaner/Converter.\n\n" + - "Usage: repoclean -h|-template|\n\n" + - "---------------------------------------------------------------------------\n" + - " Use the '-template' option to see sample configuration file options.\n" + "\n" ); - } - - private static void printTemplate() - { - System.out.println( "# ---------------------------------------------------------------------------\n" + - "# repoclean: Repository Cleaner/Converter.\n" + "# This configuration auto-generated on: " + new Date() + - "\n" + "# ---------------------------------------------------------------------------\n\n" + - "# [REQUIRED OPTIONS]\n" + "sourceRepositoryPath=/path/to/repository/root\n" + - "targetRepositoryPath=/path/to/repository/root\n" + "reportsPath=/path/to/reports/directory\n" + - "reportOnly=[true|false]\n" + "\n" + "errorReport.mailOnError=[true|false]\n" + - "errorReport.fromAddress=admin@somewhere.com\n" + "errorReport.fromName=Admin\n" + - "errorReport.subject=[REPOCLEAN] Error!\n" + "errorReport.toAddress=dev@somewhere.com\n" + - "errorReport.toName=Developers List\n" + "\n" + "# [DEFAULT VALUE: legacy]\n" + - "#sourceRepositoryLayout=[legacy|default]\n\n" + "# [DEFAULT VALUE: v3]\n" + - "# [DEFAULT VALUE: default]\n" + "#targetRepositoryLayout=[legacy|default]\n" + - "# [DEFAULT VALUE: localhost]\n" + "#errorReport.smtpHost=\n" + "# [DEFAULT VALUE: false]\n" + - "#reportWarnings=[true|false]\n" + "\n" ); - } - - private static void printUsage() - { - System.out.println( "Required input is missing.\n\n" + "Usage:\n" + - "--------------------------------------------------\n\n" + - "repoclean [--force] -h|-template|\n" ); - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleaner.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleaner.java deleted file mode 100644 index 5289fdd5ea..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleaner.java +++ /dev/null @@ -1,272 +0,0 @@ -package org.apache.maven.tools.repoclean; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.DefaultArtifactRepository; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; -import org.apache.maven.tools.repoclean.index.ArtifactIndexer; -import org.apache.maven.tools.repoclean.phase.DiscoveryPhase; -import org.apache.maven.tools.repoclean.phase.RewritePhase; -import org.apache.maven.tools.repoclean.report.FileReporter; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.codehaus.plexus.PlexusConstants; -import org.codehaus.plexus.PlexusContainer; -import org.codehaus.plexus.context.Context; -import org.codehaus.plexus.context.ContextException; -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.mailsender.MailMessage; -import org.codehaus.plexus.mailsender.MailSender; -import org.codehaus.plexus.mailsender.MailSenderException; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable; - -import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; - -/** - * @author jdcasey - */ -public class RepositoryCleaner - extends AbstractLogEnabled - implements Contextualizable -{ - - public static final String ROLE = RepositoryCleaner.class.getName(); - - private static final String REPORTS_DIR_DATE_FORMAT = "dd-MMM-yyyy_hh.mm.ss"; - - private MailSender mailSender; - - private ArtifactIndexer artifactIndexer; - - private DiscoveryPhase discoveryPhase; - - private RewritePhase rewritePhase; - - private PlexusContainer container; - - private String dateSubdir; - - public void cleanRepository( RepositoryCleanerConfiguration configuration ) - throws Exception - { - File reportsBase = formatReportsBase( configuration.getReportsPath() ); - - File sourceRepositoryBase = normalizeSourceRepositoryBase( configuration.getSourceRepositoryPath() ); - - File targetRepositoryBase = normalizeTargetRepositoryBase( configuration.getTargetRepositoryPath() ); - - // do not proceed if we cannot produce reports, or if the repository is invalid. - if ( reportsBase != null && sourceRepositoryBase != null && targetRepositoryBase != null ) - { - Logger logger = getLogger(); - - Reporter repoReporter = null; - try - { - repoReporter = new FileReporter( reportsBase, "repository.report.txt", - configuration.isReportWarningEnabled() ); - - List artifacts; - - artifacts = discoveryPhase.execute( reportsBase, sourceRepositoryBase, configuration, repoReporter ); - - if ( !artifacts.isEmpty() ) - { - ArtifactRepositoryLayout sourceLayout = null; - ArtifactRepositoryLayout targetLayout = null; - try - { - sourceLayout = (ArtifactRepositoryLayout) container.lookup( ArtifactRepositoryLayout.ROLE, - configuration.getSourceRepositoryLayout() ); - - ArtifactRepository sourceRepo = new DefaultArtifactRepository( "source", "file://" + - sourceRepositoryBase.getAbsolutePath(), sourceLayout ); - - targetLayout = (ArtifactRepositoryLayout) container.lookup( ArtifactRepositoryLayout.ROLE, - configuration.getTargetRepositoryLayout() ); - - ArtifactRepository targetRepo = new DefaultArtifactRepository( "target", "file://" + - targetRepositoryBase.getAbsolutePath(), targetLayout ); - - if ( logger.isDebugEnabled() ) - { - logger.debug( "Rewriting POMs and artifact files." ); - } - - List rewritten = rewritePhase.execute( artifacts, sourceRepo, targetRepo, configuration, - reportsBase, repoReporter ); - - artifactIndexer.writeAritfactIndex( rewritten, targetRepositoryBase ); - } - finally - { - if ( sourceLayout != null ) - { - container.release( sourceLayout ); - } - - if ( targetLayout != null ) - { - container.release( targetLayout ); - } - } - } - - if ( repoReporter.hasError() && logger.isErrorEnabled() ) - { - logger.error( "Error encountered while converting source repository to target repository." ); - } - - if ( repoReporter.hasWarning() && logger.isDebugEnabled() ) - { - logger - .warn( - "Warning encountered while rewriting one or more artifacts from source repository to target repository." ); - } - } - finally - { - if ( repoReporter != null ) - { - repoReporter.close(); - } - } - - // if we wrote a repository report with an error in it, and the configuration says to email the report, - // then do it. - if ( repoReporter.hasError() && configuration.mailErrorReport() ) - { - logger.debug( "Sending error report to " + configuration.getErrorReportToName() + " via email." ); - - MailMessage message = new MailMessage(); - - StringBuffer contentBuffer = new StringBuffer(); - - contentBuffer.append( "Errors occurred while performing maven-1 to maven-2 repository conversion.\n\n" + - "For more details, see:\n\n" ); - - contentBuffer.append( configuration.getErrorReportLink().replaceAll( "#date", dateSubdir ) ); - - message.setContent( contentBuffer.toString() ); - message.setSubject( configuration.getErrorReportSubject() ); - message.setFrom( configuration.getErrorReportFromAddress(), configuration.getErrorReportFromName() ); - message.setSendDate( new Date() ); - message.addTo( configuration.getErrorReportToAddress(), configuration.getErrorReportToName() ); - - try - { - mailSender.send( message ); - } - catch ( MailSenderException e ) - { - logger.error( "An error occurred while trying to email repoclean report.", e ); - - throw e; - } - } - } - - } - - private File normalizeTargetRepositoryBase( String targetRepositoryPath ) - { - Logger logger = getLogger(); - - File targetRepositoryBase = new File( targetRepositoryPath ); - - logger.debug( "Target repository is at: \'" + targetRepositoryBase + "\'" ); - - if ( !targetRepositoryBase.exists() ) - { - logger.debug( "Creating target repository at: \'" + targetRepositoryBase + "\'." ); - - targetRepositoryBase.mkdirs(); - } - else if ( !targetRepositoryBase.isDirectory() ) - { - logger.error( - "Cannot write to target repository \'" + targetRepositoryBase + "\' because it is not a directory." ); - - targetRepositoryBase = null; - } - - return targetRepositoryBase; - } - - private File normalizeSourceRepositoryBase( String sourceRepositoryPath ) - { - Logger logger = getLogger(); - - File sourceRepositoryBase = new File( sourceRepositoryPath ); - - logger.debug( "Source repository is at: \'" + sourceRepositoryBase + "\'" ); - - if ( !sourceRepositoryBase.exists() ) - { - logger.error( "Cannot convert repository \'" + sourceRepositoryBase + "\' because it does not exist." ); - - sourceRepositoryBase = null; - } - else if ( !sourceRepositoryBase.isDirectory() ) - { - logger.error( "Cannot convert repository \'" + sourceRepositoryBase + "\' because it is not a directory." ); - - sourceRepositoryBase = null; - } - - return sourceRepositoryBase; - } - - private File formatReportsBase( String reportsPath ) - { - Logger logger = getLogger(); - - SimpleDateFormat dateFormat = new SimpleDateFormat( REPORTS_DIR_DATE_FORMAT ); - - this.dateSubdir = dateFormat.format( new Date() ); - - File allReportsBase = new File( reportsPath ); - - File reportsBase = new File( allReportsBase, dateSubdir ); - - if ( reportsBase.exists() && !reportsBase.isDirectory() ) - { - logger.error( "Cannot write reports to \'" + reportsBase + "\' because it is not a directory." ); - - reportsBase = null; - } - else - { - logger.debug( "Creating reports directory: \'" + reportsBase + "\'" ); - - reportsBase.mkdirs(); - } - - return reportsBase; - } - - public void contextualize( Context context ) - throws ContextException - { - this.container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY ); - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleanerConfiguration.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleanerConfiguration.java deleted file mode 100644 index 52f110d05a..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/RepositoryCleanerConfiguration.java +++ /dev/null @@ -1,226 +0,0 @@ -package org.apache.maven.tools.repoclean;/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author jdcasey - */ -public class RepositoryCleanerConfiguration -{ - - private String sourceRepositoryPath; - - private String sourceRepositoryLayout; - - private String targetRepositoryPath; - - private String targetRepositoryLayout; - - private String reportsPath; - - private boolean reportOnly; - - private String errorReportSubject; - - private String errorReportFromName; - - private String errorReportFromAddress; - - private String errorReportToName; - - private String errorReportToAddress; - - private String errorReportLink; - - private boolean mailErrorReport; - - private boolean force; - - private String blacklistedPatterns; - - private boolean reportWarningEnabled; - - private boolean convertSnapshots; - - public void setSourceRepositoryPath( String sourceRepositoryPath ) - { - this.sourceRepositoryPath = sourceRepositoryPath; - } - - public String getSourceRepositoryPath() - { - return sourceRepositoryPath; - } - - public void setSourceRepositoryLayout( String sourceRepositoryLayout ) - { - this.sourceRepositoryLayout = sourceRepositoryLayout; - } - - public String getSourceRepositoryLayout() - { - return sourceRepositoryLayout; - } - - public void setTargetRepositoryPath( String targetRepositoryPath ) - { - this.targetRepositoryPath = targetRepositoryPath; - } - - public String getTargetRepositoryPath() - { - return targetRepositoryPath; - } - - public void setTargetRepositoryLayout( String targetRepositoryLayout ) - { - this.targetRepositoryLayout = targetRepositoryLayout; - } - - public String getTargetRepositoryLayout() - { - return targetRepositoryLayout; - } - - public void setReportsPath( String reportsPath ) - { - this.reportsPath = reportsPath; - } - - public String getReportsPath() - { - return reportsPath; - } - - public void setReportOnly( boolean reportOnly ) - { - this.reportOnly = reportOnly; - } - - public boolean reportOnly() - { - return reportOnly; - } - - public void setErrorReportSubject( String errorReportSubject ) - { - this.errorReportSubject = errorReportSubject; - } - - public String getErrorReportSubject() - { - return errorReportSubject; - } - - public String getErrorReportFromAddress() - { - return errorReportFromAddress; - } - - public void setErrorReportFromAddress( String errorReportFromAddress ) - { - this.errorReportFromAddress = errorReportFromAddress; - } - - public String getErrorReportFromName() - { - return errorReportFromName; - } - - public void setErrorReportFromName( String errorReportFromName ) - { - this.errorReportFromName = errorReportFromName; - } - - public String getErrorReportToAddress() - { - return errorReportToAddress; - } - - public void setErrorReportToAddress( String errorReportToAddress ) - { - this.errorReportToAddress = errorReportToAddress; - } - - public String getErrorReportToName() - { - return errorReportToName; - } - - public void setErrorReportToName( String errorReportToName ) - { - this.errorReportToName = errorReportToName; - } - - public void setMailErrorReport( boolean mailErrorReport ) - { - this.mailErrorReport = mailErrorReport; - } - - public boolean mailErrorReport() - { - return mailErrorReport; - } - - public boolean force() - { - return force; - } - - public void setForce( boolean force ) - { - this.force = force; - } - - public void setBlacklistedPatterns( String blacklistedPatterns ) - { - this.blacklistedPatterns = blacklistedPatterns; - } - - public String getBlacklistedPatterns() - { - return blacklistedPatterns; - } - - public String getErrorReportLink() - { - return errorReportLink; - } - - public void setErrorReportLink( String errorReportLink ) - { - this.errorReportLink = errorReportLink; - } - - public boolean isReportWarningEnabled() - { - return reportWarningEnabled; - } - - public void setReportWarningEnabled( boolean reportWarningEnabled ) - { - this.reportWarningEnabled = reportWarningEnabled; - } - - public boolean isConvertSnapshots() - { - return convertSnapshots; - } - - public void setConvertSnapshots( boolean convertSnapshots ) - { - this.convertSnapshots = convertSnapshots; - } -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestException.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestException.java deleted file mode 100644 index aa30ebcb4f..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestException.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.maven.tools.repoclean.digest;/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author jdcasey - */ -public class DigestException - extends Exception -{ - - public DigestException( String message ) - { - super( message ); - } - - public DigestException( String message, Throwable cause ) - { - super( message, cause ); - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestVerifier.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestVerifier.java deleted file mode 100644 index ac8df7329c..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/DigestVerifier.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.apache.maven.tools.repoclean.digest; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.apache.maven.tools.repoclean.transaction.RewriteTransaction; -import org.codehaus.plexus.util.FileUtils; - -import java.io.File; -import java.io.IOException; - -/** - * @author jdcasey - */ -public class DigestVerifier -{ - - public static final String ROLE = DigestVerifier.class.getName(); - - private Digestor artifactDigestor; - - public void setArtifactDigestor( Digestor artifactDigestor ) - { - this.artifactDigestor = artifactDigestor; - } - - public void verifyDigest( File source, File target, RewriteTransaction transaction, Reporter reporter, - boolean reportOnly ) - throws DigestException, ReportWriteException, IOException - { - verifyDigestFile( source, target, transaction, reporter, reportOnly, ".md5", Digestor.MD5 ); - - verifyDigestFile( source, target, transaction, reporter, reportOnly, ".sha1", Digestor.SHA ); - } - - private void verifyDigestFile( File artifactSource, File artifactTarget, RewriteTransaction transaction, - Reporter reporter, boolean reportOnly, String digestExt, String digestAlgorithm ) - throws DigestException, ReportWriteException, IOException - { - // create the digest source file from which to copy/verify. - File digestSourceFile = null; - - if ( artifactSource != null ) - { - digestSourceFile = new File( artifactSource + digestExt ); - } - - // create the digest target file from which to copy/create. - File digestTargetFile = null; - - if ( artifactTarget != null ) - { - digestTargetFile = new File( artifactTarget + digestExt ); - - transaction.addFile( digestTargetFile ); - } - - boolean verified = false; - - // if the digest source file exists, then verify it. - if ( digestSourceFile != null && digestSourceFile.exists() ) - { - verified = artifactDigestor.verifyArtifactDigest( artifactTarget, digestTargetFile, digestAlgorithm ); - - if ( verified ) - { - if ( !reportOnly ) - { - try - { - if ( digestTargetFile == null ) - { - reporter.error( "No target digest file for path [" + artifactSource + - "] from source to target for digest algorithm: \'" + digestAlgorithm + "\'." ); - } - else if ( !digestSourceFile.getCanonicalFile().equals( digestTargetFile.getCanonicalFile() ) ) - { - FileUtils.copyFile( digestSourceFile, digestTargetFile ); - } - } - catch ( IOException e ) - { - reporter.error( "Cannot copy digest file for path [" + artifactSource + - "] from source to target for digest algorithm: \'" + digestAlgorithm + "\'.", e ); - - throw e; - } - } - } - else - { - reporter.warn( digestExt + " for path [" + artifactSource + "] in target repository is wrong." ); - } - } - else - { - reporter.warn( digestExt + " for path [" + artifactSource + "] is missing in source repository." ); - } - - // if the .md5 was missing or did not verify correctly, create a new one - // in the target repo. - if ( !verified ) - { - if ( !reportOnly ) - { - artifactDigestor.createArtifactDigest( artifactTarget, digestTargetFile, digestAlgorithm ); - } - } - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/Digestor.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/Digestor.java deleted file mode 100644 index 855534b9a1..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/digest/Digestor.java +++ /dev/null @@ -1,190 +0,0 @@ -package org.apache.maven.tools.repoclean.digest; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.plexus.util.IOUtil; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.Writer; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -/** - * @author jdcasey - */ -public class Digestor -{ - public static final String ROLE = Digestor.class.getName(); - - public static final String MD5 = "MD5"; - - public static final String SHA = "SHA"; - - public void createArtifactDigest( File artifactFile, File digestFile, String algorithm ) - throws DigestException - { - if ( artifactFile == null || !artifactFile.exists() ) - { - throw new DigestException( "Cannot generate digest for missing file: " + artifactFile ); - } - - byte[] digestData = generateArtifactDigest( artifactFile, algorithm ); - - try - { - writeDigestFile( digestFile, digestData ); - } - catch ( IOException e ) - { - throw new DigestException( "Cannot write digest to file: \'" + digestFile + "\'", e ); - } - } - - public File getDigestFile( File artifactFile, String algorithm ) - throws NoSuchAlgorithmException - { - String extension; - if ( SHA.equals( algorithm ) ) - { - extension = "sha1"; - } - else if ( MD5.equals( algorithm ) ) - { - extension = "md5"; - } - else - { - throw new NoSuchAlgorithmException( "Unknown algorithm " + algorithm ); - } - return new File( artifactFile.getParentFile(), artifactFile.getName() + "." + extension ); - } - - public boolean verifyArtifactDigest( File artifactFile, File digestFile, String algorithm ) - throws DigestException - { - if ( digestFile == null || !digestFile.exists() || artifactFile == null || !artifactFile.exists() ) - { - return false; - } - - byte[] generatedDigest = generateArtifactDigest( artifactFile, algorithm ); - - InputStream in = null; - try - { - in = new FileInputStream( artifactFile ); - - int digestLen = generatedDigest.length; - int currentIdx = 0; - - boolean matched = true; - - int read = -1; - while ( ( read = in.read() ) > -1 ) - { - if ( currentIdx >= digestLen || read != generatedDigest[currentIdx] ) - { - return false; - } - } - } - catch ( IOException e ) - { - throw new DigestException( "Cannot verify digest for artifact file: \'" + artifactFile + - "\' against digest file: \'" + digestFile + "\' using algorithm: \'" + algorithm + "\'", e ); - } - finally - { - IOUtil.close( in ); - } - - return true; - } - - public byte[] generateArtifactDigest( File artifactFile, String algorithm ) - throws DigestException - { - if ( artifactFile == null || !artifactFile.exists() ) - { - throw new DigestException( "Cannot generate digest for missing file: " + artifactFile ); - } - - MessageDigest digest = null; - try - { - digest = MessageDigest.getInstance( algorithm ); - } - catch ( NoSuchAlgorithmException e ) - { - throw new DigestException( "Cannot load digest algoritm provider.", e ); - } - - InputStream in = null; - try - { - in = new BufferedInputStream( new FileInputStream( artifactFile ) ); - - byte[] buffer = new byte[16]; - int read = -1; - while ( ( read = in.read( buffer ) ) > -1 ) - { - digest.update( buffer, 0, read ); - } - } - catch ( IOException e ) - { - throw new DigestException( "Error reading artifact data from: \'" + artifactFile + "\'", e ); - } - finally - { - IOUtil.close( in ); - } - - return digest.digest(); - } - - private void writeDigestFile( File digestFile, byte[] digestData ) - throws IOException - { - Writer out = null; - try - { - out = new FileWriter( digestFile ); - for ( int i = 0; i < digestData.length; i++ ) - { - String t = Integer.toHexString( digestData[i] & 0xff ); - - if ( t.length() == 1 ) - { - t = "0" + t; - } - - out.write( t ); - } - } - finally - { - IOUtil.close( out ); - } - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/AbstractArtifactDiscoverer.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/AbstractArtifactDiscoverer.java deleted file mode 100644 index f105c01221..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/AbstractArtifactDiscoverer.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.apache.maven.tools.repoclean.discover; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.tools.repoclean.report.PathLister; -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.util.DirectoryScanner; - -import java.io.File; - -public abstract class AbstractArtifactDiscoverer - extends AbstractLogEnabled - implements ArtifactDiscoverer -{ - private static final String[] EMPTY_STRING_ARRAY = new String[0]; - - protected String[] scanForArtifactPaths( File repositoryBase, String blacklistedPatterns, - PathLister excludesLister ) - throws ReportWriteException - { - String[] blacklisted; - if ( blacklistedPatterns != null && blacklistedPatterns.length() > 0 ) - { - blacklisted = blacklistedPatterns.split( "," ); - } - else - { - blacklisted = EMPTY_STRING_ARRAY; - } - - String[] allExcludes = new String[STANDARD_DISCOVERY_EXCLUDES.length + blacklisted.length]; - - System.arraycopy( STANDARD_DISCOVERY_EXCLUDES, 0, allExcludes, 0, STANDARD_DISCOVERY_EXCLUDES.length ); - System.arraycopy( blacklisted, 0, allExcludes, STANDARD_DISCOVERY_EXCLUDES.length, blacklisted.length ); - - DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir( repositoryBase ); - scanner.setExcludes( allExcludes ); - - scanner.scan(); - - String[] artifactPaths = scanner.getIncludedFiles(); - - String[] excludedPaths = scanner.getExcludedFiles(); - - for ( int i = 0; i < excludedPaths.length; i++ ) - { - String excludedPath = excludedPaths[i]; - excludesLister.addPath( excludedPath ); - } - - return artifactPaths; - } - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/ArtifactDiscoverer.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/ArtifactDiscoverer.java deleted file mode 100644 index c3cc6ea2f0..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/ArtifactDiscoverer.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.apache.maven.tools.repoclean.discover; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.tools.repoclean.report.PathLister; -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.apache.maven.tools.repoclean.report.Reporter; - -import java.io.File; -import java.util.List; - -/** - * @author jdcasey - */ -public interface ArtifactDiscoverer -{ - String ROLE = ArtifactDiscoverer.class.getName(); - - String[] STANDARD_DISCOVERY_EXCLUDES = {"bin/**", "reports/**", ".maven/**", "**/poms/*.pom", "**/*.md5", - "**/*.MD5", "**/*.sha1", "**/*.SHA1", "**/*snapshot-version", "*/website/**", "*/licenses/**", "*/licences/**", - "**/.htaccess", "**/*.html", "**/*.asc", "**/*.txt", "**/*.xml", "**/README*", "**/CHANGELOG*", "**/KEYS*"}; - - List discoverArtifacts( File repositoryBase, Reporter reporter, String blacklistedPatterns, - PathLister excludeLister, PathLister kickoutLister, boolean includeSnapshots ) - throws ReportWriteException; - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/DefaultArtifactDiscoverer.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/DefaultArtifactDiscoverer.java deleted file mode 100644 index 122d97c0d6..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/DefaultArtifactDiscoverer.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.apache.maven.tools.repoclean.discover; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.tools.repoclean.report.PathLister; -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.apache.maven.tools.repoclean.report.Reporter; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; - -/** - * @author jdcasey - */ -public class DefaultArtifactDiscoverer - extends AbstractArtifactDiscoverer -{ - - private ArtifactFactory artifactFactory; - - public List discoverArtifacts( File repositoryBase, Reporter reporter, String blacklistedPatterns, - PathLister excludeLister, PathLister kickoutLister, boolean convertSnapshots ) - throws ReportWriteException - { - List artifacts = new ArrayList(); - - String[] artifactPaths = scanForArtifactPaths( repositoryBase, blacklistedPatterns, excludeLister ); - - for ( int i = 0; i < artifactPaths.length; i++ ) - { - String path = artifactPaths[i]; - - Artifact artifact = buildArtifact( path, reporter ); - - if ( artifact != null ) - { - if ( convertSnapshots || !artifact.isSnapshot() ) - { - artifacts.add( artifact ); - } - } - } - - return artifacts; - } - - private Artifact buildArtifact( String path, Reporter reporter ) - throws ReportWriteException - { - Artifact result; - - List pathParts = new ArrayList(); - StringTokenizer st = new StringTokenizer( path, "/\\" ); - while ( st.hasMoreTokens() ) - { - pathParts.add( st.nextToken() ); - } - - Collections.reverse( pathParts ); - - if ( pathParts.size() < 4 ) - { - reporter.error( "Not enough parts (" + pathParts.size() + "/4) in path " + path ); - return null; - } - - //discard the actual artifact filename. - pathParts.remove( 0 ); - - // the next one is the version. - String version = (String) pathParts.get( 0 ); - pathParts.remove( 0 ); - - // the next one is the artifactId. - String artifactId = (String) pathParts.get( 0 ); - pathParts.remove( 0 ); - - // the remaining are the groupId. - StringBuffer groupBuffer = new StringBuffer(); - - boolean firstPart = true; - for ( Iterator it = pathParts.iterator(); it.hasNext(); ) - { - String part = (String) it.next(); - - groupBuffer.append( part ); - - if ( firstPart ) - { - firstPart = false; - } - else if ( it.hasNext() ) - { - groupBuffer.append( "." ); - } - } - - result = artifactFactory.createArtifact( groupBuffer.toString(), artifactId, version, Artifact.SCOPE_RUNTIME, - "jar" ); - - return result; - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/LegacyArtifactDiscoverer.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/LegacyArtifactDiscoverer.java deleted file mode 100644 index b8100ac325..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/discover/LegacyArtifactDiscoverer.java +++ /dev/null @@ -1,319 +0,0 @@ -package org.apache.maven.tools.repoclean.discover; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.tools.repoclean.report.PathLister; -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.codehaus.plexus.util.StringUtils; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.StringTokenizer; - -/** - * @author jdcasey - */ -public class LegacyArtifactDiscoverer - extends AbstractArtifactDiscoverer -{ - - private ArtifactFactory artifactFactory; - - public List discoverArtifacts( File repositoryBase, Reporter reporter, String blacklistedPatterns, - PathLister excludeLister, PathLister kickoutLister, boolean includeSnapshots ) - throws ReportWriteException - { - List artifacts = new ArrayList(); - - String[] artifactPaths = scanForArtifactPaths( repositoryBase, blacklistedPatterns, excludeLister ); - - for ( int i = 0; i < artifactPaths.length; i++ ) - { - String path = artifactPaths[i]; - - Artifact artifact = buildArtifact( path, kickoutLister ); - if ( artifact != null ) - { - if ( includeSnapshots || !artifact.isSnapshot() ) - { - artifacts.add( artifact ); - } - } - } - - return artifacts; - } - - private Artifact buildArtifact( String path, PathLister kickoutLister ) - throws ReportWriteException - { - try - { - StringTokenizer tokens = new StringTokenizer( path, "/\\" ); - - int numberOfTokens = tokens.countTokens(); - - if ( numberOfTokens != 3 ) - { - kickoutLister.addPath( path ); - - return null; - } - - String groupId = tokens.nextToken(); - - String type = tokens.nextToken(); - - if ( type.endsWith( "s" ) ) - { - type = type.substring( 0, type.length() - 1 ); - } - - // contains artifactId, version, classifier, and extension. - String avceGlob = tokens.nextToken(); - - LinkedList avceTokenList = new LinkedList(); - - StringTokenizer avceTokenizer = new StringTokenizer( avceGlob, "-" ); - while ( avceTokenizer.hasMoreTokens() ) - { - avceTokenList.addLast( avceTokenizer.nextToken() ); - } - - String lastAvceToken = (String) avceTokenList.removeLast(); - - if ( lastAvceToken.endsWith( ".tar.gz" ) ) - { - type = "distribution-tgz"; - - lastAvceToken = lastAvceToken.substring( 0, lastAvceToken.length() - ".tar.gz".length() ); - - avceTokenList.addLast( lastAvceToken ); - } - else if ( lastAvceToken.endsWith( ".zip" ) ) - { - type = "distribution-zip"; - - lastAvceToken = lastAvceToken.substring( 0, lastAvceToken.length() - ".zip".length() ); - - avceTokenList.addLast( lastAvceToken ); - } - else - { - int extPos = lastAvceToken.lastIndexOf( '.' ); - - if ( extPos > 0 ) - { - String ext = lastAvceToken.substring( extPos + 1 ); - if ( type.equals( ext ) ) - { - lastAvceToken = lastAvceToken.substring( 0, extPos ); - - avceTokenList.addLast( lastAvceToken ); - } - else - { - kickoutLister.addPath( path ); - - return null; - } - } - } - - String validVersionParts = "([Dd][Ee][Vv][_.0-9]*)|" + "([Ss][Nn][Aa][Pp][Ss][Hh][Oo][Tt])|" + - "([0-9][_.0-9a-zA-Z]*)|" + "([Gg]?[_.0-9ab]*([Pp][Rr][Ee]|[Rr][Cc]|[Gg]|[Mm])[_.0-9]*)|" + - "([Aa][Ll][Pp][Hh][Aa][_.0-9]*)|" + "([Bb][Ee][Tt][Aa][_.0-9]*)|" + "([Rr][Cc][_.0-9]*)|" + - "([Tt][Ee][Ss][Tt][_.0-9]*)|" + "([Dd][Ee][Bb][Uu][Gg][_.0-9]*)|" + - "([Uu][Nn][Oo][Ff][Ff][Ii][Cc][Ii][Aa][Ll][_.0-9]*)|" + "([Cc][Uu][Rr][Rr][Ee][Nn][Tt])|" + - "([Ll][Aa][Tt][Ee][Ss][Tt])|" + "([Ff][Cc][Ss])|" + "([Rr][Ee][Ll][Ee][Aa][Ss][Ee][_.0-9]*)|" + - "([Nn][Ii][Gg][Hh][Tt][Ll][Yy])|" + "([AaBb][_.0-9]*)"; - - // let's discover the version, and whatever's leftover will be either - // a classifier, or part of the artifactId, depending on position. - // Since version is at the end, we have to move in from the back. - Collections.reverse( avceTokenList ); - - StringBuffer classifierBuffer = new StringBuffer(); - StringBuffer versionBuffer = new StringBuffer(); - - boolean firstVersionTokenEncountered = false; - boolean firstToken = true; - - int tokensIterated = 0; - for ( Iterator it = avceTokenList.iterator(); it.hasNext(); ) - { - String token = (String) it.next(); - - boolean tokenIsVersionPart = token.matches( validVersionParts ); - - StringBuffer bufferToUpdate; - - // NOTE: logic in code is reversed, since we're peeling off the back - // Any token after the last versionPart will be in the classifier. - // Any token UP TO first non-versionPart is part of the version. - if ( !tokenIsVersionPart ) - { - if ( firstVersionTokenEncountered ) - { - break; - } - else - { - bufferToUpdate = classifierBuffer; - } - } - else - { - firstVersionTokenEncountered = true; - - bufferToUpdate = versionBuffer; - } - - if ( firstToken ) - { - firstToken = false; - } - else - { - bufferToUpdate.insert( 0, '-' ); - } - - bufferToUpdate.insert( 0, token ); - - tokensIterated++; - } - - getLogger().debug( "After parsing loop, state of buffers:\no Version Buffer: \'" + versionBuffer + - "\'\no Classifier Buffer: \'" + classifierBuffer + "\'\no Number of Tokens Iterated: " + - tokensIterated ); - - // Now, restore the proper ordering so we can build the artifactId. - Collections.reverse( avceTokenList ); - - getLogger().debug( - "Before repairing bad version and/or cleaning up used tokens, avce token list is:\n" + avceTokenList ); - - // if we didn't find a version, then punt. Use the last token - // as the version, and set the classifier empty. - if ( versionBuffer.length() < 1 ) - { - if ( avceTokenList.size() > 1 ) - { - int lastIdx = avceTokenList.size() - 1; - - versionBuffer.append( avceTokenList.get( lastIdx ) ); - avceTokenList.remove( lastIdx ); - } - else - { - getLogger().debug( "Cannot parse version from artifact path: \'" + path + "\'." ); - getLogger().debug( - "artifact-version-classifier-extension remaining tokens is: \'" + avceTokenList + "\'" ); - } - - classifierBuffer.setLength( 0 ); - } - else - { - getLogger().debug( "Removing " + tokensIterated + " tokens from avce token list." ); - - // if everything is kosher, then pop off all the classifier and - // version tokens, leaving the naked artifact id in the list. - avceTokenList = new LinkedList( avceTokenList.subList( 0, avceTokenList.size() - tokensIterated ) ); - } - - getLogger().debug( "Now, remainder of avce token list is:\n" + avceTokenList ); - - StringBuffer artifactIdBuffer = new StringBuffer(); - - firstToken = true; - for ( Iterator it = avceTokenList.iterator(); it.hasNext(); ) - { - String token = (String) it.next(); - - if ( firstToken ) - { - firstToken = false; - } - else - { - artifactIdBuffer.append( '-' ); - } - - artifactIdBuffer.append( token ); - } - - String artifactId = artifactIdBuffer.toString(); - - int lastVersionCharIdx = versionBuffer.length() - 1; - if ( lastVersionCharIdx > -1 && versionBuffer.charAt( lastVersionCharIdx ) == '-' ) - { - versionBuffer.setLength( lastVersionCharIdx ); - } - - String version = versionBuffer.toString(); - - if ( version.length() < 1 ) - { - version = null; - } - - getLogger().debug( "Extracted artifact information from path:\n" + "groupId: \'" + groupId + "\'\n" + - "artifactId: \'" + artifactId + "\'\n" + "type: \'" + type + "\'\n" + "version: \'" + version + "\'\n" + - "classifier: \'" + classifierBuffer + "\'" ); - - Artifact result = null; - - if ( classifierBuffer.length() > 0 ) - { - getLogger().debug( "Creating artifact with classifier." ); - - result = artifactFactory.createArtifactWithClassifier( groupId, artifactId, version, type, - classifierBuffer.toString() ); - } - else - { - if ( StringUtils.isNotEmpty( groupId ) && StringUtils.isNotEmpty( artifactId ) && - StringUtils.isNotEmpty( version ) && StringUtils.isNotEmpty( type ) ) - { - result = artifactFactory.createArtifact( groupId, artifactId, version, Artifact.SCOPE_RUNTIME, - type ); - } - } - -// getLogger().debug( -// "Resulting artifact is: " + result + " and has classifier of: " -// + result.getClassifier() + "\n\n" ); - - return result; - } - catch ( RuntimeException e ) - { - getLogger().error( "While parsing artifact path: \'" + path + "\'...", e ); - - throw e; - } - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/index/ArtifactIndexer.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/index/ArtifactIndexer.java deleted file mode 100644 index 3022723d52..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/index/ArtifactIndexer.java +++ /dev/null @@ -1,66 +0,0 @@ -package org.apache.maven.tools.repoclean.index; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.util.IOUtil; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -/** - * @author jdcasey - */ -public class ArtifactIndexer - extends AbstractLogEnabled -{ - - public static final String ROLE = ArtifactIndexer.class.getName(); - - public void writeAritfactIndex( List artifacts, File targetRepositoryBase ) - { - List sortedArtifacts = new ArrayList( artifacts ); - Collections.sort( sortedArtifacts ); - - File indexFile = new File( targetRepositoryBase, ".index.txt" ); - FileWriter indexWriter = null; - try - { - indexWriter = new FileWriter( indexFile ); - - for ( Iterator it = sortedArtifacts.iterator(); it.hasNext(); ) - { - Artifact artifact = (Artifact) it.next(); - indexWriter.write( artifact.getId() + "\n" ); - } - } - catch ( IOException e ) - { - getLogger().error( "Error writing artifact index file.", e ); - } - finally - { - IOUtil.close( indexWriter ); - } - } -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/DiscoveryPhase.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/DiscoveryPhase.java deleted file mode 100644 index 2716bc29e9..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/DiscoveryPhase.java +++ /dev/null @@ -1,113 +0,0 @@ -package org.apache.maven.tools.repoclean.phase; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.tools.repoclean.RepositoryCleanerConfiguration; -import org.apache.maven.tools.repoclean.discover.ArtifactDiscoverer; -import org.apache.maven.tools.repoclean.report.PathLister; -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.codehaus.plexus.PlexusConstants; -import org.codehaus.plexus.PlexusContainer; -import org.codehaus.plexus.context.Context; -import org.codehaus.plexus.context.ContextException; -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -public class DiscoveryPhase - extends AbstractLogEnabled - implements Contextualizable -{ - - private PlexusContainer container; - - public List execute( File reportsBase, File sourceRepositoryBase, RepositoryCleanerConfiguration configuration, - Reporter repoReporter ) - throws Exception - { - Logger logger = getLogger(); - - ArtifactDiscoverer artifactDiscoverer = null; - - PathLister kickoutLister = null; - PathLister excludeLister = null; - - List artifacts = new ArrayList(); - - try - { - artifactDiscoverer = (ArtifactDiscoverer) container.lookup( ArtifactDiscoverer.ROLE, - configuration.getSourceRepositoryLayout() ); - - if ( logger.isDebugEnabled() ) - { - logger.debug( "Discovering artifacts." ); - } - - try - { - File kickoutsList = new File( reportsBase, "kickouts.txt" ); - File excludesList = new File( reportsBase, "excludes.txt" ); - - kickoutLister = new PathLister( kickoutsList ); - excludeLister = new PathLister( excludesList ); - - artifacts = artifactDiscoverer.discoverArtifacts( sourceRepositoryBase, repoReporter, - configuration.getBlacklistedPatterns(), excludeLister, - kickoutLister, configuration.isConvertSnapshots() ); - } - catch ( ReportWriteException e ) - { - repoReporter.error( "Error discovering artifacts in source repository.", e ); - - throw e; - } - - } - finally - { - if ( artifactDiscoverer != null ) - { - container.release( artifactDiscoverer ); - } - - if ( excludeLister != null ) - { - excludeLister.close(); - } - - if ( kickoutLister != null ) - { - kickoutLister.close(); - } - } - - return artifacts; - } - - public void contextualize( Context context ) - throws ContextException - { - this.container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY ); - } - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/RewritePhase.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/RewritePhase.java deleted file mode 100644 index 6d7adece39..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/phase/RewritePhase.java +++ /dev/null @@ -1,578 +0,0 @@ -package org.apache.maven.tools.repoclean.phase; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.metadata.ArtifactMetadata; -import org.apache.maven.artifact.repository.ArtifactRepository; -import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; -import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata; -import org.apache.maven.artifact.repository.metadata.Metadata; -import org.apache.maven.artifact.repository.metadata.Snapshot; -import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata; -import org.apache.maven.artifact.repository.metadata.Versioning; -import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader; -import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer; -import org.apache.maven.project.artifact.ProjectArtifactMetadata; -import org.apache.maven.tools.repoclean.RepositoryCleanerConfiguration; -import org.apache.maven.tools.repoclean.digest.DigestException; -import org.apache.maven.tools.repoclean.digest.DigestVerifier; -import org.apache.maven.tools.repoclean.digest.Digestor; -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.apache.maven.tools.repoclean.rewrite.ArtifactPomRewriter; -import org.apache.maven.tools.repoclean.transaction.RewriteTransaction; -import org.apache.maven.tools.repoclean.transaction.RollbackException; -import org.codehaus.plexus.PlexusConstants; -import org.codehaus.plexus.PlexusContainer; -import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException; -import org.codehaus.plexus.context.Context; -import org.codehaus.plexus.context.ContextException; -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.logging.Logger; -import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable; -import org.codehaus.plexus.util.IOUtil; -import org.codehaus.plexus.util.xml.pull.XmlPullParserException; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.StringReader; -import java.io.Writer; -import java.net.MalformedURLException; -import java.net.URL; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class RewritePhase - extends AbstractLogEnabled - implements Contextualizable -{ - private DigestVerifier digestVerifier; - - private Digestor artifactDigestor; - - private ArtifactRepositoryLayout bridgingLayout; - - private PlexusContainer container; - - public List execute( List artifacts, ArtifactRepository sourceRepo, ArtifactRepository targetRepo, - RepositoryCleanerConfiguration configuration, File reportsBase, Reporter repoReporter ) - throws ReportWriteException - { - Logger logger = getLogger(); - - List rewritten = new ArrayList(); - - File sourceBase; - try - { - sourceBase = new File( new URL( sourceRepo.getUrl() ).getPath() ); - } - catch ( MalformedURLException e ) - { - repoReporter.error( "Cannot construct source repository base File for: " + sourceRepo, e ); - - return null; - } - - File targetBase; - try - { - targetBase = new File( new URL( targetRepo.getUrl() ).getPath() ); - } - catch ( MalformedURLException e ) - { - repoReporter.error( "Cannot construct target repository base File for: " + targetRepo, e ); - - return null; - } - - for ( Iterator it = artifacts.iterator(); it.hasNext(); ) - { - Artifact artifact = (Artifact) it.next(); - - RewriteTransaction transaction = new RewriteTransaction( artifact ); - - try - { - File artifactSource = new File( sourceRepo.getBasedir(), sourceRepo.pathOf( artifact ) ); - File artifactTarget = new File( targetRepo.getBasedir(), - targetRepo.pathOf( artifact ).replace( '+', '-' ) ); - - transaction.addFile( artifactTarget ); - - artifact.setFile( artifactSource ); - - boolean targetMissingOrOlder = !artifactTarget.exists() || - artifactTarget.lastModified() < artifactSource.lastModified(); - - if ( artifactSource.exists() && ( configuration.force() || targetMissingOrOlder ) ) - { - transaction.addFile( artifactTarget ); - - if ( !configuration.reportOnly() ) - { - if ( logger.isDebugEnabled() ) - { - logger.debug( "sourceRepo basedir is: \'" + sourceRepo.getBasedir() + "\'" ); - logger.debug( "targetRepo basedir is: \'" + targetRepo.getBasedir() + "\'" ); - } - - File targetParent = artifactTarget.getParentFile(); - if ( !targetParent.exists() ) - { - targetParent.mkdirs(); - } - - if ( logger.isDebugEnabled() ) - { - logger.debug( "Copying artifact[" + artifact.getId() + "] from \'" + artifactSource + - "\' to \'" + artifactTarget + "\'." ); - } - - copyArtifact( artifact, artifactTarget ); - } - - if ( logger.isDebugEnabled() ) - { - logger.debug( "working on digest for artifact[" + artifact.getId() + "] with groupId: \'" + - artifact.getGroupId() + "\'" ); - } - - digestVerifier.verifyDigest( artifactSource, artifactTarget, transaction, repoReporter, - configuration.reportOnly() ); - - rewriteMetadata( artifact, transaction, sourceBase, sourceRepo, targetBase, targetRepo, - repoReporter, configuration.reportOnly() ); - - rewritten.add( artifact ); - } - else if ( !targetMissingOrOlder ) - { - repoReporter.warn( "Target file for artifact is present and not stale. (Artifact: \'" + - artifact.getId() + "\' in path: \'" + artifactSource + "\' with target path: " + - artifactTarget + ")...SKIPPING" ); - } - else - { - repoReporter.warn( "Cannot find source file for artifact: \'" + artifact.getId() + - "\' under path: \'" + artifactSource + "\'...SKIPPING" ); - } - } - catch ( Exception e ) - { - if ( !configuration.force() ) - { - repoReporter.warn( "Rolling back conversion for: " + artifact ); - try - { - transaction.rollback(); - } - catch ( RollbackException re ) - { - repoReporter.error( - "Error rolling back conversion transaction (artifact: " + artifact.getId() + ").", re ); - } - } - else - { - repoReporter.warn( "NOT Rolling back conversion for: " + artifact + "; we are in --force mode." ); - } - - repoReporter.error( "Error while rewriting file or POM for artifact: \'" + artifact.getId() + "\'.", - e ); - } - } - - logger.info( "Actual number of artifacts rewritten: " + rewritten.size() + " (" + rewritten.size() * 2 + - " including POMs)." ); - - return rewritten; - } - - private void rewriteMetadata( Artifact artifact, RewriteTransaction transaction, File sourceBase, - ArtifactRepository sourceRepo, File targetBase, ArtifactRepository targetRepo, - Reporter artifactReporter, boolean reportOnly ) - throws Exception - { - ArtifactMetadata metadata = new ArtifactRepositoryMetadata( artifact ); - - File metadataSource = new File( sourceBase, sourceRepo.pathOfRemoteRepositoryMetadata( metadata ) ); - File metadataTarget = new File( targetBase, targetRepo.pathOfRemoteRepositoryMetadata( metadata ) ); - - Metadata sourceMetadata = readMetadata( metadataSource, artifact ); - if ( sourceMetadata.getVersioning() == null ) - { - sourceMetadata.setVersioning( new Versioning() ); - } - if ( !sourceMetadata.getVersioning().getVersions().contains( artifact.getBaseVersion() ) ) - { - sourceMetadata.getVersioning().addVersion( artifact.getBaseVersion() ); - } - mergeMetadata( sourceMetadata, metadataTarget, reportOnly ); - - metadata = new SnapshotArtifactRepositoryMetadata( artifact ); - - metadataSource = new File( sourceBase, sourceRepo.pathOfRemoteRepositoryMetadata( metadata ) ); - metadataTarget = new File( targetBase, targetRepo.pathOfRemoteRepositoryMetadata( metadata ) ); - - sourceMetadata = readMetadata( metadataSource, artifact ); - if ( artifact.isSnapshot() ) - { - if ( sourceMetadata.getVersioning() == null ) - { - sourceMetadata.setVersioning( new Versioning() ); - } - if ( sourceMetadata.getVersioning().getSnapshot() == null ) - { - sourceMetadata.getVersioning().setSnapshot( new Snapshot() ); - } - - int i = artifact.getVersion().indexOf( '-' ); - if ( i >= 0 ) - { - Snapshot snapshot = sourceMetadata.getVersioning().getSnapshot(); - snapshot.setTimestamp( artifact.getVersion().substring( 0, i ) ); - snapshot.setBuildNumber( Integer.valueOf( artifact.getVersion().substring( i + 1 ) ).intValue() ); - } - } - mergeMetadata( sourceMetadata, metadataTarget, reportOnly ); - - // The rest is for POM metadata - translation and bridging of locations in the target repo may be required. - ArtifactMetadata pom = new ProjectArtifactMetadata( artifact, null ); - - File sourcePom = new File( sourceBase, sourceRepo.pathOfRemoteRepositoryMetadata( pom ) ); - File targetPom = new File( targetBase, targetRepo.pathOfRemoteRepositoryMetadata( pom ).replace( '+', '-' ) ); - - String pomContents = null; - - boolean shouldRewritePom = true; - - if ( sourcePom.exists() ) - { - pomContents = readPomContents( sourcePom ); - - if ( pomContents.indexOf( "modelVersion" ) > -1 ) - { - shouldRewritePom = false; - - copyMetadata( sourcePom, targetPom, transaction, artifactReporter, reportOnly ); - } - } - else if ( targetPom.exists() ) - { - // we have a target pom for this artifact already, and we'll only be making up a new pom. - // let's leave the existing one alone. - shouldRewritePom = false; - } - - File bridgedTargetPom = null; - - boolean wroteBridge = false; - - if ( shouldRewritePom ) - { - ArtifactPomRewriter artifactPomRewriter = null; - - try - { - artifactPomRewriter = (ArtifactPomRewriter) container.lookup( ArtifactPomRewriter.ROLE, - ArtifactPomRewriter.V3_POM ); - - transaction.addFile( targetPom ); - - bridgedTargetPom = new File( targetBase, - bridgingLayout.pathOfRemoteRepositoryMetadata( pom ).replace( '+', '-' ) ); - - transaction.addFile( bridgedTargetPom ); - - File targetPomParent = targetPom.getParentFile(); - if ( !targetPomParent.exists() ) - { - targetPomParent.mkdirs(); - } - - FileWriter to = null; - try - { - StringReader from = null; - if ( pomContents != null ) - { - from = new StringReader( pomContents ); - } - - to = new FileWriter( targetPom ); - - artifactPomRewriter.rewrite( artifact, from, to, artifactReporter, reportOnly ); - } - finally - { - IOUtil.close( to ); - } - - wroteBridge = bridgePomLocations( targetPom, bridgedTargetPom, artifactReporter, transaction, - reportOnly ); - } - finally - { - if ( artifactPomRewriter != null ) - { - try - { - container.release( artifactPomRewriter ); - } - catch ( ComponentLifecycleException e ) - { - } - } - } - } - - digestVerifier.verifyDigest( sourcePom, targetPom, transaction, artifactReporter, reportOnly ); - - if ( wroteBridge ) - { - digestVerifier.verifyDigest( sourcePom, bridgedTargetPom, transaction, artifactReporter, reportOnly ); - } - } - - private void mergeMetadata( Metadata sourceMetadata, File target, boolean reportOnly ) - throws IOException, DigestException, XmlPullParserException, NoSuchAlgorithmException - { - boolean changed = false; - Metadata targetMetadata = null; - - if ( target.exists() ) - { - Reader reader = null; - - try - { - reader = new FileReader( target ); - - MetadataXpp3Reader mappingReader = new MetadataXpp3Reader(); - - targetMetadata = mappingReader.read( reader ); - } - finally - { - IOUtil.close( reader ); - } - - changed = targetMetadata.merge( sourceMetadata ); - } - else - { - changed = true; - targetMetadata = sourceMetadata; - } - if ( changed ) - { - Writer writer = null; - try - { - target.getParentFile().mkdirs(); - writer = new FileWriter( target ); - - MetadataXpp3Writer mappingWriter = new MetadataXpp3Writer(); - - mappingWriter.write( writer, targetMetadata ); - - if ( !reportOnly ) - { - File digestFile = artifactDigestor.getDigestFile( target, Digestor.MD5 ); - artifactDigestor.createArtifactDigest( target, digestFile, Digestor.MD5 ); - digestFile = artifactDigestor.getDigestFile( target, Digestor.SHA ); - artifactDigestor.createArtifactDigest( target, digestFile, Digestor.SHA ); - } - } - finally - { - IOUtil.close( writer ); - } - } - } - - private Metadata readMetadata( File source, Artifact artifact ) - throws IOException, XmlPullParserException - { - Metadata sourceMetadata = null; - - if ( source.exists() ) - { - Reader reader = null; - - try - { - reader = new FileReader( source ); - - MetadataXpp3Reader mappingReader = new MetadataXpp3Reader(); - - sourceMetadata = mappingReader.read( reader ); - } - finally - { - IOUtil.close( reader ); - } - } - - if ( sourceMetadata == null ) - { - sourceMetadata = new Metadata(); - - sourceMetadata.setGroupId( artifact.getGroupId() ); - sourceMetadata.setArtifactId( artifact.getArtifactId() ); - sourceMetadata.setVersion( artifact.getBaseVersion() ); - } - return sourceMetadata; - } - - private void copyMetadata( File source, File target, RewriteTransaction transaction, Reporter artifactReporter, - boolean reportOnly ) - throws IOException, DigestException, ReportWriteException - { - if ( source.exists() && !source.getCanonicalFile().equals( target.getCanonicalFile() ) ) - { - File targetParent = target.getParentFile(); - - if ( !targetParent.exists() ) - { - targetParent.mkdirs(); - } - - FileReader reader = null; - FileWriter writer = null; - - try - { - reader = new FileReader( source ); - writer = new FileWriter( target ); - - IOUtil.copy( reader, writer ); - } - finally - { - IOUtil.close( reader ); - IOUtil.close( writer ); - } - - digestVerifier.verifyDigest( source, target, transaction, artifactReporter, reportOnly ); - - } - } - - private String readPomContents( File sourcePom ) - throws IOException - { - FileReader reader = null; - try - { - StringBuffer buffer = new StringBuffer(); - - reader = new FileReader( sourcePom ); - - int read = -1; - char[] cbuf = new char[16]; - - while ( ( read = reader.read( cbuf ) ) > -1 ) - { - buffer.append( cbuf, 0, read ); - } - - return buffer.toString(); - } - finally - { - IOUtil.close( reader ); - } - } - - private void copyArtifact( Artifact artifact, File artifactTarget ) - throws IOException - { - File artifactSource = artifact.getFile(); - - if ( artifactSource.getCanonicalFile().equals( artifactTarget.getCanonicalFile() ) ) - { - return; - } - - InputStream inStream = null; - OutputStream outStream = null; - try - { - File targetParent = artifactTarget.getParentFile(); - if ( !targetParent.exists() ) - { - targetParent.mkdirs(); - } - - inStream = new BufferedInputStream( new FileInputStream( artifactSource ) ); - outStream = new BufferedOutputStream( new FileOutputStream( artifactTarget ) ); - - byte[] buffer = new byte[16]; - int read = -1; - - while ( ( read = inStream.read( buffer ) ) > -1 ) - { - outStream.write( buffer, 0, read ); - } - - outStream.flush(); - } - finally - { - IOUtil.close( inStream ); - IOUtil.close( outStream ); - } - } - - private boolean bridgePomLocations( File targetPom, File bridgedTargetPom, Reporter reporter, - RewriteTransaction transaction, boolean reportOnly ) - throws IOException, ReportWriteException, DigestException - { - if ( targetPom.equals( bridgedTargetPom ) ) - { - reporter.warn( "Cannot create legacy-compatible copy of POM at: " + targetPom + - "; legacy-compatible path is the same as the converted POM itself." ); - - return false; - } - - copyMetadata( targetPom, bridgedTargetPom, transaction, reporter, reportOnly ); - - return true; - } - - public void contextualize( Context context ) - throws ContextException - { - this.container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY ); - } - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/AbstractReporter.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/AbstractReporter.java deleted file mode 100644 index 353a34bb05..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/AbstractReporter.java +++ /dev/null @@ -1,125 +0,0 @@ -package org.apache.maven.tools.repoclean.report; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.PrintWriter; -import java.io.StringWriter; - -/** - * Base implementation of reporter. - * - * @author Brett Porter - * @version $Id$ - */ -public abstract class AbstractReporter - implements Reporter -{ - protected static final String WARN_LEVEL = "[WARNING]"; - - protected static final String ERROR_LEVEL = "[ERROR]"; - - protected boolean hasError; - - protected boolean hasWarning; - - protected final boolean warningsEnabled; - - protected AbstractReporter( boolean warningsEnabled ) - { - this.warningsEnabled = warningsEnabled; - } - - public boolean hasWarning() - { - return hasWarning; - } - - public boolean hasError() - { - return hasError; - } - - protected String getSourceLine() - { - NullPointerException npe = new NullPointerException(); - - StackTraceElement element = npe.getStackTrace()[2]; - - return "Reported from: (" + element.getClassName() + "." + element.getMethodName() + "(..):" + - element.getLineNumber() + ")\n"; - } - - protected String format( String level, String source, String message ) - { - return format( level, source, message, null ); - } - - protected String format( String level, String source, String message, Throwable error ) - { - StringBuffer buffer = new StringBuffer(); - buffer.append( level ); - buffer.append( " " ); - buffer.append( source ); - buffer.append( " " ); - buffer.append( message ); - if ( error != null ) - { - buffer.append( formatThrowable( error ) ); - } - return buffer.toString(); - } - - private String formatThrowable( Throwable throwable ) - { - StringWriter sWriter = new StringWriter(); - PrintWriter pWriter = new PrintWriter( sWriter ); - - throwable.printStackTrace( pWriter ); - - return sWriter.toString(); - } - - protected abstract void write( String message ) - throws ReportWriteException; - - public void warn( String message ) - throws ReportWriteException - { - if ( warningsEnabled ) - { - hasWarning = true; - String source = getSourceLine(); - write( format( WARN_LEVEL, source, message ) ); - } - } - - public void error( String message, Throwable error ) - throws ReportWriteException - { - hasError = true; - String source = getSourceLine(); - write( format( ERROR_LEVEL, source, message, error ) ); - } - - public void error( String message ) - throws ReportWriteException - { - hasError = true; - String source = getSourceLine(); - write( format( ERROR_LEVEL, source, message ) ); - } -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/FileReporter.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/FileReporter.java deleted file mode 100644 index f21903d9a0..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/FileReporter.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.apache.maven.tools.repoclean.report; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.plexus.util.IOUtil; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; - -/** - * @author jdcasey - */ -public class FileReporter - extends AbstractReporter -{ - private File reportsFile; - - private Writer writer; - - public FileReporter( File reportsBase, String reportPath, boolean warningsEnabled ) - { - super( warningsEnabled ); - - this.reportsFile = new File( reportsBase, reportPath ); - - File parentDir = reportsFile.getParentFile(); - if ( !parentDir.exists() ) - { - parentDir.mkdirs(); - } - - if ( !parentDir.isDirectory() ) - { - throw new IllegalArgumentException( "path: \'" + parentDir.getAbsolutePath() + - "\' refers to a file, not a directory.\n" + "Cannot write report file: \'" + - reportsFile.getAbsolutePath() + "\'." ); - } - } - - public File getReportFile() - { - return reportsFile; - } - - private void open() - throws IOException - { - this.writer = new FileWriter( reportsFile ); - } - - public void close() - { - IOUtil.close( writer ); - } - - protected void write( String message ) - throws ReportWriteException - { - try - { - if ( writer == null ) - { - open(); - } - - writer.write( message ); - - writer.write( '\n' ); - - writer.flush(); - } - catch ( IOException e ) - { - throw new ReportWriteException( "Cannot write message: " + message + " due to an I/O error.", e ); - } - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/PathLister.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/PathLister.java deleted file mode 100644 index f0497597fe..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/PathLister.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.apache.maven.tools.repoclean.report; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.codehaus.plexus.util.IOUtil; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Writer; - -public class PathLister -{ - - private final File listFile; - - private Writer writer; - - public PathLister( File listFile ) - { - this.listFile = listFile; - } - - private synchronized void checkOpen() - throws ReportWriteException - { - if ( writer == null ) - { - try - { - writer = new FileWriter( listFile ); - } - catch ( IOException e ) - { - throw new ReportWriteException( "Cannot open listFile for writing: " + listFile, e ); - } - } - } - - public void close() - { - IOUtil.close( writer ); - } - - public void addPath( String path ) - throws ReportWriteException - { - checkOpen(); - - try - { - writer.write( path + "\n" ); - } - catch ( IOException e ) - { - throw new ReportWriteException( "Cannot write path: " + path + " to listFile: " + listFile, e ); - } - } - - public void addPath( File path ) - throws ReportWriteException - { - checkOpen(); - - try - { - writer.write( path + "\n" ); - } - catch ( IOException e ) - { - throw new ReportWriteException( "Cannot write path: " + path + " to listFile: " + listFile, e ); - } - } - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/ReportWriteException.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/ReportWriteException.java deleted file mode 100644 index fd8bbbca90..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/ReportWriteException.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.apache.maven.tools.repoclean.report;/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -public class ReportWriteException - extends Exception -{ - - public ReportWriteException( String message, Throwable cause ) - { - super( message, cause ); - } - - public ReportWriteException( String message ) - { - super( message ); - } - - public ReportWriteException( Throwable cause ) - { - super( cause ); - } - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/Reporter.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/Reporter.java deleted file mode 100644 index 515a346829..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/report/Reporter.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.apache.maven.tools.repoclean.report;/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -public interface Reporter -{ - - public void close(); - - public boolean hasWarning(); - - public boolean hasError(); - - public void warn( String message ) - throws ReportWriteException; - - public void error( String message, Throwable error ) - throws ReportWriteException; - - public void error( String message ) - throws ReportWriteException; - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/ArtifactPomRewriter.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/ArtifactPomRewriter.java deleted file mode 100644 index 323cc06851..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/ArtifactPomRewriter.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.apache.maven.tools.repoclean.rewrite; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.tools.repoclean.report.Reporter; - -import java.io.Reader; -import java.io.Writer; - -/** - * @author jdcasey - */ -public interface ArtifactPomRewriter -{ - - public static final String ROLE = ArtifactPomRewriter.class.getName(); - - public static final String V3_POM = "v3"; - - public static final String V4_POM = "v4"; - - void rewrite( Artifact artifact, Reader from, Writer to, Reporter reporter, boolean reportOnly ) - throws Exception; - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V3PomRewriter.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V3PomRewriter.java deleted file mode 100644 index 318e2c9e40..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V3PomRewriter.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.apache.maven.tools.repoclean.rewrite; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.model.Model; -import org.apache.maven.model.io.xpp3.MavenXpp3Writer; -import org.apache.maven.model.v3_0_0.io.xpp3.MavenXpp3Reader; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.apache.maven.tools.repoclean.translate.PomV3ToV4Translator; -import org.codehaus.plexus.util.StringUtils; - -import java.io.Reader; -import java.io.Writer; - -/** - * @author jdcasey - */ -public class V3PomRewriter - implements ArtifactPomRewriter -{ - private PomV3ToV4Translator translator; - - public void rewrite( Artifact artifact, Reader from, Writer to, Reporter reporter, boolean reportOnly ) - throws Exception - { - Model v4Model; - - if ( from != null ) - { - MavenXpp3Reader v3Reader = new MavenXpp3Reader(); - - org.apache.maven.model.v3_0_0.Model v3Model = v3Reader.read( from ); - v4Model = translator.translate( v3Model, reporter ); - } - else - { - v4Model = new Model(); - } - - if ( v4Model != null ) - { - validateV4Basics( v4Model, artifact, reporter ); - - if ( !reportOnly ) - { - MavenXpp3Writer v4Writer = new MavenXpp3Writer(); - v4Writer.write( to, v4Model ); - } - } - } - - private void validateV4Basics( Model model, Artifact artifact, Reporter reporter ) - throws Exception - { - if ( StringUtils.isEmpty( model.getModelVersion() ) ) - { - model.setModelVersion( "4.0.0" ); - } - - if ( StringUtils.isEmpty( model.getGroupId() ) ) - { - reporter.warn( "Setting groupId on model using artifact information." ); - model.setGroupId( artifact.getGroupId() ); - } - - if ( StringUtils.isEmpty( model.getArtifactId() ) ) - { - reporter.warn( "Setting artifactId on model using artifact information." ); - model.setArtifactId( artifact.getArtifactId() ); - } - - if ( StringUtils.isEmpty( model.getVersion() ) ) - { - reporter.warn( "Setting version on model using artifact information." ); - model.setVersion( artifact.getVersion() ); - } - - if ( StringUtils.isEmpty( model.getPackaging() ) ) - { - reporter.warn( "Setting packaging on model using artifact type information." ); - model.setPackaging( artifact.getType() ); - } - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V4PomRewriter.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V4PomRewriter.java deleted file mode 100644 index 78256b8eba..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/rewrite/V4PomRewriter.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.apache.maven.tools.repoclean.rewrite; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.model.Model; -import org.apache.maven.model.io.xpp3.MavenXpp3Reader; -import org.apache.maven.model.io.xpp3.MavenXpp3Writer; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.codehaus.plexus.util.StringUtils; - -import java.io.Reader; -import java.io.Writer; - -/** - * @author jdcasey - */ -public class V4PomRewriter - implements ArtifactPomRewriter -{ - public void rewrite( Artifact artifact, Reader from, Writer to, Reporter reporter, boolean reportOnly ) - throws Exception - { - Model model = null; - - if ( from != null ) - { - MavenXpp3Reader reader = new MavenXpp3Reader(); - - try - { - model = reader.read( from ); - } - catch ( Exception e ) - { - reporter.error( "Invalid v4 POM at \'" + from + "\'. Cannot read.", e ); - } - } - else - { - model = new Model(); - } - - if ( model != null ) - { - validateBasics( model, artifact, reporter ); - - if ( !reportOnly ) - { - MavenXpp3Writer writer = new MavenXpp3Writer(); - writer.write( to, model ); - } - } - } - - private void validateBasics( Model model, Artifact artifact, Reporter reporter ) - throws Exception - { - if ( StringUtils.isEmpty( model.getModelVersion() ) ) - { - model.setModelVersion( "4.0.0" ); - } - - if ( StringUtils.isEmpty( model.getGroupId() ) ) - { - reporter.warn( "Setting groupId on model using artifact information." ); - model.setGroupId( artifact.getGroupId() ); - } - - if ( StringUtils.isEmpty( model.getArtifactId() ) ) - { - reporter.warn( "Setting artifactId on model using artifact information." ); - model.setArtifactId( artifact.getArtifactId() ); - } - - if ( StringUtils.isEmpty( model.getVersion() ) ) - { - reporter.warn( "Setting version on model using artifact information." ); - model.setVersion( artifact.getVersion() ); - } - - if ( StringUtils.isEmpty( model.getPackaging() ) ) - { - reporter.warn( "Setting packaging on model using artifact type information." ); - model.setPackaging( artifact.getType() ); - } - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RewriteTransaction.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RewriteTransaction.java deleted file mode 100644 index 1d8709272c..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RewriteTransaction.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.apache.maven.tools.repoclean.transaction; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; - -import java.io.File; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class RewriteTransaction -{ - - private final Artifact artifact; - - private List files = new ArrayList(); - - public RewriteTransaction( Artifact artifact ) - { - this.artifact = artifact; - } - - public void addFile( File file ) - { - this.files.add( file ); - } - - public void rollback() - throws RollbackException - { - for ( Iterator it = files.iterator(); it.hasNext(); ) - { - File file = (File) it.next(); - if ( file.exists() && !file.delete() ) - { - throw new RollbackException( "[rollback] Cannot delete file: " + file + - "\nPart of transaction for artifact: {" + artifact.getId() + "}." ); - } - } - } - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RollbackException.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RollbackException.java deleted file mode 100644 index bb5e82960f..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/transaction/RollbackException.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.apache.maven.tools.repoclean.transaction;/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -public class RollbackException - extends Exception -{ - - public RollbackException( String message, Throwable cause ) - { - super( message, cause ); - } - - public RollbackException( String message ) - { - super( message ); - } - -} diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomTranslationException.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomTranslationException.java deleted file mode 100644 index e5750a628c..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomTranslationException.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.apache.maven.tools.repoclean.translate;/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author jdcasey - */ -public class PomTranslationException - extends Exception -{ - - private final String groupId; - - private final String artifactId; - - private final String version; - - public PomTranslationException( String groupId, String artifactId, String version, String message ) - { - this( groupId, artifactId, version, message, null ); - } - - public PomTranslationException( String groupId, String artifactId, String version, Throwable cause ) - { - this( groupId, artifactId, version, "[No message provided.]", cause ); - } - - public PomTranslationException( String groupId, String artifactId, String version, String message, Throwable cause ) - { - super( "In POM{" + groupId + ":" + artifactId + ":" + version + "}: " + message, cause ); - this.groupId = groupId; - this.artifactId = artifactId; - this.version = version; - } -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4Translator.java b/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4Translator.java deleted file mode 100644 index 6bf9c369c1..0000000000 --- a/sandbox/repoclean/src/main/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4Translator.java +++ /dev/null @@ -1,816 +0,0 @@ -package org.apache.maven.tools.repoclean.translate; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.model.Build; -import org.apache.maven.model.CiManagement; -import org.apache.maven.model.Contributor; -import org.apache.maven.model.Dependency; -import org.apache.maven.model.DeploymentRepository; -import org.apache.maven.model.Developer; -import org.apache.maven.model.DistributionManagement; -import org.apache.maven.model.IssueManagement; -import org.apache.maven.model.License; -import org.apache.maven.model.MailingList; -import org.apache.maven.model.Model; -import org.apache.maven.model.Notifier; -import org.apache.maven.model.Organization; -import org.apache.maven.model.Plugin; -import org.apache.maven.model.ReportPlugin; -import org.apache.maven.model.Reporting; -import org.apache.maven.model.Resource; -import org.apache.maven.model.Scm; -import org.apache.maven.model.Site; -import org.apache.maven.model.v3_0_0.UnitTest; -import org.apache.maven.tools.repoclean.report.ReportWriteException; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.codehaus.plexus.logging.AbstractLogEnabled; -import org.codehaus.plexus.util.StringUtils; -import org.codehaus.plexus.util.xml.Xpp3Dom; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author jdcasey - */ -public class PomV3ToV4Translator - extends AbstractLogEnabled -{ - - public static final String ROLE = PomV3ToV4Translator.class.getName(); - - private transient List discoveredPlugins = new ArrayList(); - - public Model translate( org.apache.maven.model.v3_0_0.Model v3Model, Reporter reporter ) - throws ReportWriteException - { - try - { - String groupId = format( v3Model.getGroupId() ); - String artifactId = format( v3Model.getArtifactId() ); - - String id = v3Model.getId(); - - if ( StringUtils.isNotEmpty( id ) ) - { - if ( StringUtils.isEmpty( groupId ) ) - { - int plusIdx = id.indexOf( "+" ); - if ( plusIdx > -1 ) - { - groupId = id.substring( 0, plusIdx ); - } - else - { - groupId = id; - } - } - - if ( StringUtils.isEmpty( artifactId ) ) - { - artifactId = format( id ); - } - } - - String version = format( v3Model.getCurrentVersion() ); - - if ( version == null ) - { - version = format( v3Model.getVersion() ); - } - - PomKey pomKey = new PomKey( groupId, artifactId, version ); - - warnOfUnsupportedMainModelElements( v3Model, reporter ); - - Model model = null; - try - { - model = new Model(); - model.setArtifactId( artifactId ); - - // moved this above the translation of the build, to allow - // additional plugins to be defined in v3 poms via - // plugin - model.setDependencies( translateDependencies( v3Model.getDependencies() ) ); - - model.setBuild( translateBuild( v3Model.getBuild(), reporter ) ); - model.setCiManagement( translateCiManagementInfo( v3Model.getBuild() ) ); - model.setContributors( translateContributors( v3Model.getContributors() ) ); - - model.setDescription( v3Model.getDescription() ); - model.setDevelopers( translateDevelopers( v3Model.getDevelopers() ) ); - - model.setDistributionManagement( translateDistributionManagement( pomKey, v3Model ) ); - - model.setGroupId( groupId ); - model.setInceptionYear( v3Model.getInceptionYear() ); - model.setIssueManagement( translateIssueManagement( v3Model ) ); - - model.setLicenses( translateLicenses( v3Model.getLicenses() ) ); - model.setMailingLists( translateMailingLists( v3Model.getMailingLists() ) ); - model.setModelVersion( "4.0.0" ); - model.setName( v3Model.getName() ); - model.setOrganization( translateOrganization( v3Model.getOrganization(), reporter ) ); - model.setPackaging( "jar" ); - // TODO: not very good conversion - just omit for now -// model.setReporting( translateReports( v3Model.getReports(), reporter ) ); - model.setScm( translateScm( v3Model ) ); - model.setUrl( v3Model.getUrl() ); - - model.setVersion( version ); - } - catch ( PomTranslationException e ) - { - reporter.error( "Invalid POM detected. Cannot translate.", e ); - } - - return model; - } - finally - { - this.discoveredPlugins.clear(); - } - } - - private String format( String source ) - { - return source == null ? null : source.replace( '+', '-' ); - } - - private CiManagement translateCiManagementInfo( org.apache.maven.model.v3_0_0.Build v3Build ) - { - CiManagement ciMgmt = null; - - if ( v3Build != null ) - { - String nagEmailAddress = v3Build.getNagEmailAddress(); - - if ( StringUtils.isNotEmpty( nagEmailAddress ) ) - { - Notifier notifier = new Notifier(); - - notifier.setType( "mail" ); - notifier.addConfiguration( "address", nagEmailAddress ); - - ciMgmt = new CiManagement(); - ciMgmt.addNotifier( notifier ); - } - } - - return ciMgmt; - } - - private void warnOfUnsupportedMainModelElements( org.apache.maven.model.v3_0_0.Model v3Model, Reporter reporter ) - throws ReportWriteException - { - if ( StringUtils.isNotEmpty( v3Model.getExtend() ) ) - { - reporter.warn( "Ignoring non-portable parent declaration: " + v3Model.getExtend() ); - } - - if ( StringUtils.isNotEmpty( v3Model.getGumpRepositoryId() ) ) - { - reporter.warn( "Ignoring gump repository id: \'" + v3Model.getGumpRepositoryId() + - "\'. This is not supported in v4 POMs." ); - } - - if ( notEmpty( v3Model.getVersions() ) ) - { - reporter.warn( "Ignoring section. This is not supported in v4 POMs." ); - } - - if ( notEmpty( v3Model.getBranches() ) ) - { - reporter.warn( "Ignoring section. This is not supported in v4 POMs." ); - } - - Properties v3ModelProperties = v3Model.getProperties(); - - if ( v3ModelProperties != null && !v3ModelProperties.isEmpty() ) - { - reporter.warn( "Ignoring section. It is not supported in v4 POMs." ); - } - - if ( StringUtils.isNotEmpty( v3Model.getPackage() ) ) - { - reporter.warn( "Ignoring . It is not supported in v4 POMs." ); - } - - if ( notEmpty( v3Model.getPackageGroups() ) ) - { - reporter.warn( "Ignoring section. It is not supported in v4 POMs." ); - } - - if ( StringUtils.isNotEmpty( v3Model.getLogo() ) ) - { - reporter.warn( "Ignoring for project. It is not supported in v4 POMs." ); - } - - if ( StringUtils.isNotEmpty( v3Model.getShortDescription() ) ) - { - reporter.warn( "Ignoring . It is not supported in v4 POMs." ); - } - } - - private Scm translateScm( org.apache.maven.model.v3_0_0.Model v3Model ) - { - Scm scm = null; - - org.apache.maven.model.v3_0_0.Repository repo = v3Model.getRepository(); - if ( repo != null ) - { - scm = new Scm(); - scm.setConnection( repo.getConnection() ); - scm.setDeveloperConnection( repo.getDeveloperConnection() ); - scm.setUrl( repo.getUrl() ); - } - - return scm; - } - - private Reporting translateReports( List v3Reports, Reporter reporter ) - throws ReportWriteException - { - Reporting reports = null; - if ( v3Reports != null && !v3Reports.isEmpty() ) - { - reports = new Reporting(); - for ( Iterator it = v3Reports.iterator(); it.hasNext(); ) - { - String reportName = (String) it.next(); - - Pattern pluginNamePattern = Pattern.compile( "maven-(.+)-plugin" ); - Matcher matcher = pluginNamePattern.matcher( reportName ); - - String reportPluginName; - if ( !matcher.matches() ) - { - reporter.warn( - "Non-standard report name: \'" + reportName + "\'. Using entire name for plugin artifactId." ); - - reportPluginName = reportName; - } - else - { - reportPluginName = matcher.group( 1 ); - } - - ReportPlugin reportPlugin = new ReportPlugin(); - - reportPlugin.setGroupId( "maven" ); - - reportPlugin.setArtifactId( reportPluginName ); - - StringBuffer info = new StringBuffer(); - - info.append( "Using some derived information for report: \'" ).append( reportName ).append( "\'.\n" ) - .append( "\to groupId: \'maven\'\n" ).append( "\to artifactId: \'" ).append( reportPluginName ) - .append( "\'\n" ).append( "\to goal: \'report\'\n" ) - .append( "\n" ) - .append( "These values were extracted using the v3 report naming convention, but may be wrong." ); - - reporter.warn( info.toString() ); - - reports.addPlugin( reportPlugin ); - } - } - - return reports; - } - - private Organization translateOrganization( org.apache.maven.model.v3_0_0.Organization v3Organization, - Reporter reporter ) - throws ReportWriteException - { - Organization organization = null; - - if ( v3Organization != null ) - { - organization = new Organization(); - - organization.setName( v3Organization.getName() ); - organization.setUrl( v3Organization.getUrl() ); - - if ( StringUtils.isNotEmpty( v3Organization.getLogo() ) ) - { - reporter.warn( "Ignoring . It is not supported in v4 POMs." ); - } - } - - return organization; - } - - private List translateMailingLists( List v3MailingLists ) - { - List mailingLists = new ArrayList(); - - if ( notEmpty( v3MailingLists ) ) - { - for ( Iterator it = v3MailingLists.iterator(); it.hasNext(); ) - { - org.apache.maven.model.v3_0_0.MailingList v3List = (org.apache.maven.model.v3_0_0.MailingList) it - .next(); - MailingList list = new MailingList(); - list.setArchive( v3List.getArchive() ); - list.setName( v3List.getName() ); - list.setSubscribe( v3List.getSubscribe() ); - list.setUnsubscribe( v3List.getUnsubscribe() ); - - mailingLists.add( list ); - } - } - - return mailingLists; - } - - private List translateLicenses( List v3Licenses ) - { - List licenses = new ArrayList(); - - if ( notEmpty( v3Licenses ) ) - { - for ( Iterator it = v3Licenses.iterator(); it.hasNext(); ) - { - org.apache.maven.model.v3_0_0.License v3License = (org.apache.maven.model.v3_0_0.License) it.next(); - License license = new License(); - license.setComments( v3License.getComments() ); - license.setName( v3License.getName() ); - license.setUrl( v3License.getUrl() ); - - licenses.add( license ); - } - } - - return licenses; - } - - private IssueManagement translateIssueManagement( org.apache.maven.model.v3_0_0.Model v3Model ) - { - IssueManagement issueMgmt = null; - - String issueTrackingUrl = v3Model.getIssueTrackingUrl(); - if ( StringUtils.isNotEmpty( issueTrackingUrl ) ) - { - issueMgmt = new IssueManagement(); - issueMgmt.setUrl( issueTrackingUrl ); - } - - return issueMgmt; - } - - private DistributionManagement translateDistributionManagement( PomKey pomKey, - org.apache.maven.model.v3_0_0.Model v3Model ) - throws PomTranslationException - { - DistributionManagement distributionManagement = new DistributionManagement(); - - Site site = null; - - String siteAddress = v3Model.getSiteAddress(); - - String siteDirectory = v3Model.getSiteDirectory(); - - if ( StringUtils.isEmpty( siteAddress ) ) - { - if ( !StringUtils.isEmpty( siteDirectory ) ) - { - site = new Site(); - - site.setId( "default" ); - - site.setName( "Default Site" ); - - site.setUrl( "file://" + siteDirectory ); - } - } - else - { - if ( StringUtils.isEmpty( siteDirectory ) ) - { - throw new PomTranslationException( pomKey.groupId(), pomKey.artifactId(), pomKey.version(), - "Missing 'siteDirectory': Both siteAddress and siteDirectory must be set at the same time." ); - } - - site = new Site(); - - site.setId( "default" ); - - site.setName( "Default Site" ); - - site.setUrl( "scp://" + siteAddress + "/" + siteDirectory ); - } - - distributionManagement.setSite( site ); - - String distributionSite = v3Model.getDistributionSite(); - - String distributionDirectory = v3Model.getDistributionDirectory(); - - DeploymentRepository repository = null; - - if ( StringUtils.isEmpty( distributionSite ) ) - { - if ( !StringUtils.isEmpty( distributionDirectory ) ) - { - repository = new DeploymentRepository(); - - repository.setId( "default" ); - - repository.setName( "Default Repository" ); - - repository.setUrl( "file://" + distributionDirectory ); - // throw new Exception( "Missing 'distributionSite': Both distributionSite and - // distributionDirectory must be set." ); - } - } - else - { - if ( StringUtils.isEmpty( distributionDirectory ) ) - { - throw new PomTranslationException( pomKey.groupId(), pomKey.artifactId(), pomKey.version(), - "Missing 'distributionDirectory': must be set is 'distributionSite' is set." ); - } - - repository = new DeploymentRepository(); - - repository.setId( "default" ); - - repository.setName( "Default Repository" ); - - repository.setUrl( distributionSite + "/" + distributionDirectory ); - } - - distributionManagement.setRepository( repository ); - - distributionManagement.setStatus("converted"); - - if ( site == null && repository == null ) - { - return null; - } - - return distributionManagement; - } - - private List translateDevelopers( List v3Developers ) - { - List developers = new ArrayList(); - - if ( notEmpty( v3Developers ) ) - { - for ( Iterator it = v3Developers.iterator(); it.hasNext(); ) - { - org.apache.maven.model.v3_0_0.Developer v3Developer = (org.apache.maven.model.v3_0_0.Developer) it - .next(); - - Developer developer = new Developer(); - - developer.setEmail( v3Developer.getEmail() ); - developer.setId( v3Developer.getId() ); - developer.setName( v3Developer.getName() ); - developer.setOrganization( v3Developer.getOrganization() ); - developer.setRoles( v3Developer.getRoles() ); - developer.setTimezone( v3Developer.getTimezone() ); - developer.setUrl( v3Developer.getUrl() ); - - developers.add( developer ); - } - } - - return developers; - } - - private List translateDependencies( List v3Deps ) - { - List deps = new ArrayList(); - - if ( notEmpty( v3Deps ) ) - { - for ( Iterator it = v3Deps.iterator(); it.hasNext(); ) - { - org.apache.maven.model.v3_0_0.Dependency v3Dep = (org.apache.maven.model.v3_0_0.Dependency) it.next(); - - String groupId = format( v3Dep.getGroupId() ); - String artifactId = format( v3Dep.getArtifactId() ); - - String id = v3Dep.getId(); - - if ( StringUtils.isNotEmpty( id ) ) - { - if ( StringUtils.isEmpty( groupId ) ) - { - int plusIdx = id.indexOf( "+" ); - - if ( plusIdx > -1 ) - { - groupId = id.substring( 0, plusIdx ); - } - else - { - groupId = id; - } - } - - if ( StringUtils.isEmpty( artifactId ) ) - { - artifactId = format( id ); - } - } - - String type = v3Dep.getType(); - if ( "plugin".equals( type ) ) - { - if ( "maven".equals( groupId ) ) - { - groupId = "org.apache.maven.plugins"; - } - - Plugin plugin = new Plugin(); - plugin.setGroupId( groupId ); - plugin.setArtifactId( artifactId ); - plugin.setVersion( format( v3Dep.getVersion() ) ); - - Xpp3Dom config = new Xpp3Dom( "configuration" ); - - Properties props = v3Dep.getProperties(); - - if ( !props.isEmpty() ) - { - for ( Iterator propertyIterator = props.keySet().iterator(); propertyIterator.hasNext(); ) - { - String key = (String) propertyIterator.next(); - String value = props.getProperty( key ); - - Xpp3Dom child = new Xpp3Dom( key ); - child.setValue( value ); - - config.addChild( child ); - } - } - - plugin.setConfiguration( config ); - - this.discoveredPlugins.add( plugin ); - } - else - { - Dependency dep = new Dependency(); - - dep.setGroupId( groupId ); - dep.setArtifactId( artifactId ); - dep.setVersion( v3Dep.getVersion() ); - dep.setType( v3Dep.getType() ); - - String scope = v3Dep.getProperty( "scope" ); - if ( StringUtils.isNotEmpty( scope ) ) - { - dep.setScope( scope ); - } - - deps.add( dep ); - } - } - } - - return deps; - } - - private List translateContributors( List v3Contributors ) - { - List contributors = new ArrayList(); - - if ( notEmpty( v3Contributors ) ) - { - for ( Iterator it = v3Contributors.iterator(); it.hasNext(); ) - { - org.apache.maven.model.v3_0_0.Contributor v3Contributor = (org.apache.maven.model.v3_0_0.Contributor) it - .next(); - - Contributor contributor = new Contributor(); - - contributor.setEmail( v3Contributor.getEmail() ); - contributor.setName( v3Contributor.getName() ); - contributor.setOrganization( v3Contributor.getOrganization() ); - contributor.setRoles( v3Contributor.getRoles() ); - contributor.setTimezone( v3Contributor.getTimezone() ); - contributor.setUrl( v3Contributor.getUrl() ); - - contributors.add( contributor ); - } - } - - return contributors; - } - - private Build translateBuild( org.apache.maven.model.v3_0_0.Build v3Build, Reporter reporter ) - throws ReportWriteException - { - Build build = null; - if ( v3Build != null ) - { - build = new Build(); - - warnOfUnsupportedBuildElements( v3Build, reporter ); - - build.setSourceDirectory( v3Build.getSourceDirectory() ); - build.setTestSourceDirectory( v3Build.getUnitTestSourceDirectory() ); - - build.setResources( translateResources( v3Build.getResources() ) ); - - UnitTest unitTest = v3Build.getUnitTest(); - if ( unitTest != null ) - { - build.setTestResources( translateResources( unitTest.getResources() ) ); - - List testIncludes = unitTest.getIncludes(); - - List testExcludes = new ArrayList( unitTest.getExcludes() ); - - if ( notEmpty( testIncludes ) || notEmpty( testExcludes ) ) - { - Plugin plugin = new Plugin(); - plugin.setGroupId( "org.apache.maven.plugins" ); - plugin.setArtifactId( "maven-surefire-plugin" ); - - Xpp3Dom config = new Xpp3Dom( "configuration" ); - - if ( notEmpty( testIncludes ) ) - { - Xpp3Dom includes = new Xpp3Dom( "includes" ); - for ( Iterator it = testIncludes.iterator(); it.hasNext(); ) - { - String includePattern = (String) it.next(); - Xpp3Dom include = new Xpp3Dom( "include" ); - include.setValue( includePattern ); - - includes.addChild( include ); - } - - config.addChild( includes ); - } - - if ( notEmpty( testExcludes ) ) - { - Xpp3Dom excludes = new Xpp3Dom( "excludes" ); - for ( Iterator it = testExcludes.iterator(); it.hasNext(); ) - { - String excludePattern = (String) it.next(); - Xpp3Dom exclude = new Xpp3Dom( "exclude" ); - exclude.setValue( excludePattern ); - - excludes.addChild( exclude ); - } - - config.addChild( excludes ); - } - - if ( config.getChildCount() > 0 ) - { - plugin.setConfiguration( config ); - } - - build.addPlugin( plugin ); - } - } - } - - if ( !this.discoveredPlugins.isEmpty() ) - { - if ( build == null ) - { - build = new Build(); - } - - for ( Iterator it = this.discoveredPlugins.iterator(); it.hasNext(); ) - { - Plugin plugin = (Plugin) it.next(); - - build.addPlugin( plugin ); - } - } - - return build; - } - - private void warnOfUnsupportedBuildElements( org.apache.maven.model.v3_0_0.Build v3Build, Reporter reporter ) - throws ReportWriteException - { - if ( notEmpty( v3Build.getSourceModifications() ) ) - { - reporter.warn( "Ignoring section. It is not supported in v4 POMs." ); - } - - if ( StringUtils.isNotEmpty( v3Build.getAspectSourceDirectory() ) ) - { - reporter.warn( "Ignoring . It is not supported in v4 POMs." ); - } - - if ( StringUtils.isNotEmpty( v3Build.getIntegrationUnitTestSourceDirectory() ) ) - { - reporter.warn( "Ignoring . It is not supported in v4 POMs." ); - } - } - - private List translateResources( List v3Resources ) - { - List resources = new ArrayList(); - - if ( notEmpty( v3Resources ) ) - { - for ( Iterator it = v3Resources.iterator(); it.hasNext(); ) - { - org.apache.maven.model.v3_0_0.Resource v3Resource = (org.apache.maven.model.v3_0_0.Resource) it.next(); - Resource resource = new Resource(); - - resource.setDirectory( v3Resource.getDirectory() ); - - List excludes = new ArrayList( v3Resource.getExcludes() ); - - resource.setExcludes( excludes ); - - resource.setIncludes( v3Resource.getIncludes() ); - resource.setTargetPath( v3Resource.getTargetPath() ); - - resources.add( resource ); - } - } - - return resources; - } - - // private String pathPatternsToString( List patterns ) - // { - // StringBuffer result = new StringBuffer(); - // - // if ( notEmpty( patterns ) ) - // { - // for ( Iterator it = patterns.iterator(); it.hasNext(); ) - // { - // String pattern = (String) it.next(); - // - // result.append( "," ).append( pattern ); - // } - // - // result.setLength( result.length() - 1 ); - // } - // - // return result.toString(); - // } - - private boolean notEmpty( List test ) - { - return test != null && !test.isEmpty(); - } - - private static class PomKey - { - private final String groupId; - - private final String artifactId; - - private final String version; - - PomKey( String groupId, String artifactId, String version ) - { - this.groupId = groupId; - this.artifactId = artifactId; - this.version = version; - } - - public String groupId() - { - return groupId; - } - - public String artifactId() - { - return artifactId; - } - - public String version() - { - return version; - } - } - -} \ No newline at end of file diff --git a/sandbox/repoclean/src/main/resources/META-INF/plexus/components.xml b/sandbox/repoclean/src/main/resources/META-INF/plexus/components.xml deleted file mode 100644 index 7965b60f85..0000000000 --- a/sandbox/repoclean/src/main/resources/META-INF/plexus/components.xml +++ /dev/null @@ -1,310 +0,0 @@ - - - - org.apache.maven.tools.repoclean.RepositoryCleaner - org.apache.maven.tools.repoclean.RepositoryCleaner - - - org.apache.maven.tools.repoclean.index.ArtifactIndexer - - - org.codehaus.plexus.mailsender.MailSender - - - org.apache.maven.tools.repoclean.phase.DiscoveryPhase - - - org.apache.maven.tools.repoclean.phase.RewritePhase - - - - - - org.apache.maven.tools.repoclean.phase.DiscoveryPhase - org.apache.maven.tools.repoclean.phase.DiscoveryPhase - - - - org.apache.maven.tools.repoclean.phase.RewritePhase - org.apache.maven.tools.repoclean.phase.RewritePhase - - - org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout - alpha-bridging - bridgingLayout - - - org.apache.maven.tools.repoclean.digest.DigestVerifier - - - org.apache.maven.tools.repoclean.digest.Digestor - - - - - - org.codehaus.plexus.mailsender.MailSender - org.codehaus.plexus.mailsender.simple.SimpleMailSender - - localhost - 25 - - - - - org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout - alpha-bridging - org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout - - - - org.apache.maven.artifact.handler.ArtifactHandler - plugin - org.apache.maven.artifact.handler.DefaultArtifactHandler - - plugin - jar - - - - - org.apache.maven.artifact.handler.ArtifactHandler - distribution - org.apache.maven.artifact.handler.DefaultArtifactHandler - - distribution - jar - - - - - org.apache.maven.artifact.handler.ArtifactHandler - distribution-tgz - org.apache.maven.artifact.handler.DefaultArtifactHandler - - distribution-tgz - distributions - tar.gz - - - - - org.apache.maven.artifact.handler.ArtifactHandler - distribution-zip - org.apache.maven.artifact.handler.DefaultArtifactHandler - - distribution-zip - distributions - zip - - - - - org.apache.maven.artifact.handler.ArtifactHandler - tld - org.apache.maven.artifact.handler.DefaultArtifactHandler - - tld - - - - - org.apache.maven.artifact.handler.ArtifactHandler - dtd - org.apache.maven.artifact.handler.DefaultArtifactHandler - - dtd - - - - - org.apache.maven.artifact.handler.ArtifactHandler - ear - org.apache.maven.artifact.handler.DefaultArtifactHandler - - ear - - - - - org.apache.maven.artifact.handler.ArtifactHandler - rar - org.apache.maven.artifact.handler.DefaultArtifactHandler - - rar - - - - - org.apache.maven.artifact.handler.ArtifactHandler - sar - org.apache.maven.artifact.handler.DefaultArtifactHandler - - sar - - - - - org.apache.maven.tools.repoclean.index.ArtifactIndexer - org.apache.maven.tools.repoclean.index.ArtifactIndexer - - - - org.apache.maven.tools.repoclean.discover.ArtifactDiscoverer - legacy - org.apache.maven.tools.repoclean.discover.LegacyArtifactDiscoverer - - - org.apache.maven.artifact.factory.ArtifactFactory - - - - - - org.apache.maven.tools.repoclean.discover.ArtifactDiscoverer - default - org.apache.maven.tools.repoclean.discover.DefaultArtifactDiscoverer - - - org.apache.maven.artifact.factory.ArtifactFactory - - - - - - org.apache.maven.tools.repoclean.discover.ArtifactDiscoverer - alpha-bridging - org.apache.maven.tools.repoclean.discover.DefaultArtifactDiscoverer - - - org.apache.maven.artifact.factory.ArtifactFactory - - - - - - org.apache.maven.tools.repoclean.digest.DigestVerifier - org.apache.maven.tools.repoclean.digest.DigestVerifier - - - org.apache.maven.tools.repoclean.digest.Digestor - - - - - - org.apache.maven.tools.repoclean.digest.Digestor - org.apache.maven.tools.repoclean.digest.Digestor - - - - org.apache.maven.tools.repoclean.rewrite.ArtifactPomRewriter - v3 - org.apache.maven.tools.repoclean.rewrite.V3PomRewriter - - - org.apache.maven.tools.repoclean.translate.PomV3ToV4Translator - - - - - - org.apache.maven.tools.repoclean.rewrite.ArtifactPomRewriter - v4 - org.apache.maven.tools.repoclean.rewrite.V4PomRewriter - - - - org.apache.maven.tools.repoclean.translate.PomV3ToV4Translator - org.apache.maven.tools.repoclean.translate.PomV3ToV4Translator - - - diff --git a/sandbox/repoclean/src/site/apt/repository-conversion-process.apt b/sandbox/repoclean/src/site/apt/repository-conversion-process.apt deleted file mode 100644 index dd047f4150..0000000000 --- a/sandbox/repoclean/src/site/apt/repository-conversion-process.apt +++ /dev/null @@ -1,146 +0,0 @@ - --- - Repository Conversion Tool - Process - --- - John Casey - --- - 17-Mar-2005 - --- - -*Introduction - - This is currently just a copy of an email I sent out to dev@ summarizing the - process and architecture created to clean up the repository and convert v3 - POMs to v4 syntax. I was hoping to use this as a basis to start design - discussions for a better repository conversion tool. I realize that this tool - will have to be merged with the repository-tool, and the best of both somehow - integrated with one another. - -*Email: 17-Mar-2005 - - M2 Devs, - - Sorry for the long email, but please hear me out. I feel like I finally - have enough of an understanding on this problem that I can talk - intelligently with others. So, here is a summary of my first pass at - solving the problem of repository conversion... - - I know that we already have two repository-massaging tools in - maven-components already. I looked at both when trying to address - MNG-197. In the case of the pre-alpha-to-v4 converter, it didn't seem - expandable into the world of v3 poms without a major overhaul. Which - leaves the repository-tool subproject. There are two reasons why I - didn't just enhance repository-tool: - - 1. I didn't feel like I had enough time before this weekend's - mini-deadline to understand and complete the repository-tool. This would - have involved quite a lot of code-reading, and double-checking against - v3 documentation to ensure that all bases are covered. - - 2. It looks like this would be better suited as a plexus application. - Refactoring to a plexus-based app will allow us to introduce new - validators and/or patching components to improve the conversion process. - - I don't know if these were reason enough to justify a whole new - application, and I'd be happy to merge the repoclean tool with - repository-tool in the future when time permits. - - Carlos, especially for your sake, I'd like to outline the features and - approach of repoclean. Once you have an idea of what I've done, perhaps - you can suggest some things I missed, and we can start bringing these - tools toward a merger. - - Essentially, I was trying to follow the contents of MNG-197 as closely - as possible with this tool. The resulting architecture is an - acknowledgement of the fact that we're really doing whole-repository - maintenance here, not merely translating individual poms. Here is a - brief rundown of the design: - - 1. Main class which processes command-line arguments, starts an Embedder - instance, looks up an instance of the RepositoryCleaner component, and - fires the cleanRepository() method. - - 2. RepositoryCleaner is the controller class for the application. Using - plexus' dependency injection, I have access to the components that - execute the various operations on the repository. Some of these operate - on the whole repository at a go, and others operate on a per-POM basis. - - A. Verify the validity of both the repository basedir and the reports - basedir. If either is invalid, error out. - - B. Scan the repository to create a list of pom files in the - repository. We'll use this list multiple times later, so this is an - optimization step. - - C. Scan the repository to create a list of artifact (non-pom, non-md5) - files in the repository. We'll use this list multiple times later, so - this is an optimization step. - - D. Setup the reporter for the repo-level operations. - - E. Call the ArtifactPomCorrelator which matches POMs to artifacts, and - spits out error messages to the reporter for any orphaned artifacts. - This is a repository-level operation. - - F. Call the ArtifactMd5Correlator which matches artifacts to MD5 - digest files, and spits out error messages to the reporter for any - artifacts that are not accompanied by MD5 digests. - - If we're not executing in report-only mode, this component will - also create any missing md5 files. - - This is also a repository-level operation. - - G. Now, we move into the per-POM operations. For each POM, we first - setup a Reporter to record errors/warnings/etc. pertaining only to that POM. - - H. Read the v3 POM from file. - - I. Translate the v3 POM to a v4 POM using the PomV3ToV4Translator. - This will spit out warnings to the reporter for any elements that don't - translate (like aspectSourceDirectory), and errors where only partial - information is provided (as in distributionSite/distributionDirectory). - This is the only validation provided by the translator. - - J. Call the V4ModelIndependenceValidator to verify the ability of that - model to provide the minimum required information set to distinguish one - project from another, independent of any information in a parent model - (via the element, which is ignored). On this pass, only report - failures as warnings to the reporter. - - K. If (J.) above fails, call the V4ModelPatcher to parse the path of - the POM in the repository in an effort to glean any information that may - be missing from the model. If the path is valid, fill in any missing - information in the model. - - L. If (J.) above fails, re-call the V4ModelIndependenceValidator, this - time in error-reporting mode. If the model is still missing required - information, this time the validator will report errors instead of warnings. - - M. If we're not executing in report-only mode, write the v4 POM to the - repository in place of the old v3 POM file. - - N. Flush all reporters. - - As you can see, this tool does not account for backup/restore operations - on the repository. It is assumed that measures will be taken outside the - scope of the tool to make a backup copy of the repository before execution. - - If I'm missing anything in this, please let me know. I've included a - bash script to install the tool at a location of your choice using: - - 'sh ./install.sh /path/to/target/install/dir /path/to/local/repo' - - and another bash script to execute the tool using: - - './repoclean.sh /path/to/repository /path/to/reports/directory' - - I think repoclean is a reasonable first stab at this problem, but I know - it needs to be much better than that. Please don't hesitate to shoot - holes in this thing! :) - - Also: I will be duplicating this doco in an APT file somewhere in - maven-components, so that we can start recording the design discussion. - - Thanks, - - john diff --git a/sandbox/repoclean/src/site/apt/transition-to-repo-management.apt b/sandbox/repoclean/src/site/apt/transition-to-repo-management.apt deleted file mode 100644 index 2e97c5cf44..0000000000 --- a/sandbox/repoclean/src/site/apt/transition-to-repo-management.apt +++ /dev/null @@ -1,61 +0,0 @@ - --- - Transitioning from Repository Conversion to Repository Management - --- - John Casey - --- - 19-Apr-2005 - --- - -Notes on Transitioning Repoclean from a Conversion Tool to a Management Tool - -* Abstract - - Repoclean was born a conversion tool, with the primary purpose of performing - the initial conversion between maven1 and maven2 repository formats. As such, - it has facilities for translating POMs, restructuring artifact directories, - repairing checksums, and more. - - However, it has become exceedingly clear with the first alpha release of - maven2 that we need a tool to perform smart mirroring of artifacts and - metadata between m1 and m2 repositories. To that end, we must redesign and - refactor repoclean (the closest thing to a solution we currently have), and - transform it from a one-off project to an active part of the maven toolset. - -* Execution Modes - - While these execution modes are in various states of development, we need to - formalize these options in the configuration and repair any gaps in the - implementation. - -** Support for m1-to-m1 synchronization - - We need to support blacklisting and other features relevant to m1 repositories - in this feature. In the feature list below, I'll note which ones are - applicable to m1. - -** Support for m2-to-m2 synchronization - - We'll need to support normalization and blacklisting for synchronization of - a feeder m2 repository to our canonical m2 repository. - -** Support for m2-to-m1 synchronization - - We have to be able to do bidirectional synchronization, for the case where one - or more of our feeder repositories transitions to maven2 while we're still - supporting maven1 users. This really should only involve any normalization - that we'd normally do in a m2-to-m2 sync process, plus forced usage of the - legacy repository layout and translation of POMs. - -** Support for m1-to-m2 synchronization - - This one should be mostly complete, with only new features still needing - implementation. - -* Features - -* Required Modifications - -** Add CLI for parsing command-line modifications to config files, and for - "--force". - -** Add SHA-1 checksum file support. \ No newline at end of file diff --git a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/TestSupport.java b/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/TestSupport.java deleted file mode 100644 index 50a1b60b4f..0000000000 --- a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/TestSupport.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.apache.maven.tools.repoclean; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.File; -import java.net.URL; - -public final class TestSupport -{ - - private static final String REPO_SUBDIR = "repo/"; - - private static final String REPO_MARKER = "repo-marker.txt"; - - private static final int PACKAGE_TRIM = TestSupport.class.getPackage().getName().length() + 1; - - private TestSupport() - { - } - - public static String getMyRepositoryPath( Object testInstance ) - { - Class testClass = testInstance.getClass(); - - String myRepo = testClass.getName().substring( PACKAGE_TRIM ); - - return getRepositoryPath( myRepo ); - } - - public static File getMyResource( Object testInstance, String relativePath ) - { - Class testClass = testInstance.getClass(); - - String myPath = testClass.getName().substring( PACKAGE_TRIM ); - - String resource = myPath.replace( '.', '/' ); - - if ( !relativePath.startsWith( "/" ) ) - { - resource += "/"; - } - - resource += relativePath; - - return getResource( resource ); - } - - public static String getRepositoryPath( String relativePath ) - { - String base = relativePath.replace( '.', '/' ); - - if ( !base.endsWith( "/" ) ) - { - base += "/"; - } - - return getResource( base + REPO_SUBDIR + REPO_MARKER ).getParentFile().getAbsolutePath(); - } - - public static File getResource( String relativePath ) - { - ClassLoader cloader = TestSupport.class.getClassLoader(); - - URL resource = cloader.getResource( relativePath ); - - return new File( resource.getPath() ).getAbsoluteFile(); - } - -} diff --git a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestVerifierTest.java b/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestVerifierTest.java deleted file mode 100644 index 1e934d4d1a..0000000000 --- a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestVerifierTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.apache.maven.tools.repoclean.digest; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.artifact.Artifact; -import org.apache.maven.artifact.factory.ArtifactFactory; -import org.apache.maven.tools.repoclean.TestSupport; -import org.apache.maven.tools.repoclean.report.DummyReporter; -import org.apache.maven.tools.repoclean.transaction.RewriteTransaction; -import org.codehaus.plexus.PlexusTestCase; - -import java.io.File; - -public class ArtifactDigestVerifierTest - extends PlexusTestCase -{ - private ArtifactFactory artifactFactory; - - protected void setUp() - throws Exception - { - super.setUp(); - - artifactFactory = (ArtifactFactory) lookup( ArtifactFactory.ROLE ); - } - - public void testShouldWriteBothMD5AndSHA1DigestFiles() - throws Exception - { - DigestVerifier verifier = (DigestVerifier) lookup( DigestVerifier.ROLE ); - - Artifact artifact = artifactFactory.createBuildArtifact( "testGroup", "testArtifact", "1.0", "jar" ); - - File artifactFile = TestSupport.getResource( "digest/ArtifactDigestorTest/digestFormatVerifyArtifact.jar" ); - - artifact.setFile( artifactFile ); - - File tempFile = File.createTempFile( "artifactDigestFileVerifyBase", "jar" ); - - File md5 = new File( tempFile + ".md5" ); - File sha1 = new File( tempFile + ".sha1" ); - - System.out.println( "[INFO] We expect warnings for missing source digest files here:" ); - verifier.verifyDigest( artifactFile, tempFile, new RewriteTransaction( artifact ), new DummyReporter(), false ); - System.out.println( "[INFO] Target digest files should have been created." ); - - assertTrue( md5.exists() ); - assertTrue( sha1.exists() ); - } - -} diff --git a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestorTest.java b/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestorTest.java deleted file mode 100644 index b4cec650e8..0000000000 --- a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/digest/ArtifactDigestorTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package org.apache.maven.tools.repoclean.digest; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import junit.framework.TestCase; -import org.apache.maven.tools.repoclean.TestSupport; - -import java.io.File; -import java.io.FileReader; -import java.util.Arrays; - -public class ArtifactDigestorTest - extends TestCase -{ - - private static final String DIGEST_FORMAT_VERIFY_ARTIFACT = "digestFormatVerifyArtifact.jar"; - - public void testShouldWriteDigestFileInHexNotBinary() - throws Exception - { - Digestor digestor = new Digestor(); - - File artifact = TestSupport.getMyResource( this, DIGEST_FORMAT_VERIFY_ARTIFACT ); - - byte[] rawDigest = digestor.generateArtifactDigest( artifact, Digestor.MD5 ); - - StringBuffer rawConverted = new StringBuffer( rawDigest.length * 2 ); - for ( int i = 0; i < rawDigest.length; i++ ) - { - String encoded = Integer.toHexString( rawDigest[i] & 0xff ); - if ( encoded.length() < 2 ) - { - encoded = "0" + encoded; - } - - rawConverted.append( encoded ); - } - - File digestFile = File.createTempFile( "repoclean-artifactDigest-formatTest", ".md5" ); - - digestor.createArtifactDigest( artifact, digestFile, Digestor.MD5 ); - - FileReader reader = new FileReader( digestFile ); - StringBuffer written = new StringBuffer( rawDigest.length * 2 ); - - char[] cbuf = new char[rawDigest.length * 2]; - int read = -1; - - while ( ( read = reader.read( cbuf ) ) > -1 ) - { - written.append( cbuf, 0, read ); - } - - reader.close(); - - assertEquals( rawConverted.length(), written.length() ); - - cbuf = new char[written.length()]; - char[] cbuf2 = new char[cbuf.length]; - - written.getChars( 0, cbuf.length, cbuf, 0 ); - rawConverted.getChars( 0, cbuf2.length, cbuf2, 0 ); - - assertTrue( Arrays.equals( cbuf, cbuf2 ) ); - } - -} diff --git a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/report/DummyReporter.java b/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/report/DummyReporter.java deleted file mode 100644 index 985d189e54..0000000000 --- a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/report/DummyReporter.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.apache.maven.tools.repoclean.report;/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -public class DummyReporter - implements Reporter -{ - - public void close() - { - } - - public boolean hasWarning() - { - return false; - } - - public boolean hasError() - { - return false; - } - - public void warn( String message ) - throws ReportWriteException - { - log( "[WARNING]", message, null ); - } - - public void error( String message, Throwable error ) - throws ReportWriteException - { - log( "[ERROR]", message, error ); - } - - public void error( String message ) - throws ReportWriteException - { - log( "[ERROR]", message, null ); - } - - private void log( String classifier, String message, Throwable error ) - { - System.out.println( classifier + " " + message ); - - if ( error != null ) - { - error.printStackTrace(); - } - } - -} diff --git a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4TranslatorTest.java b/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4TranslatorTest.java deleted file mode 100644 index acdb3b0417..0000000000 --- a/sandbox/repoclean/src/test/java/org/apache/maven/tools/repoclean/translate/PomV3ToV4TranslatorTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.apache.maven.tools.repoclean.translate; - -/* - * Copyright 2001-2005 The Apache Software Foundation. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.apache.maven.model.Build; -import org.apache.maven.model.Dependency; -import org.apache.maven.model.Model; -import org.apache.maven.model.Plugin; -import org.apache.maven.tools.repoclean.report.DummyReporter; -import org.apache.maven.tools.repoclean.report.Reporter; -import org.codehaus.plexus.PlexusTestCase; - -public class PomV3ToV4TranslatorTest - extends PlexusTestCase -{ - - public void testShouldConvertScopePropertyToDependencyScope() - throws Exception - { - PomV3ToV4Translator translator = (PomV3ToV4Translator) lookup( PomV3ToV4Translator.ROLE ); - - Reporter reporter = new DummyReporter(); - - org.apache.maven.model.v3_0_0.Dependency v3Dep = new org.apache.maven.model.v3_0_0.Dependency(); - v3Dep.setGroupId( "testGroup" ); - v3Dep.setArtifactId( "testArtifact" ); - v3Dep.setVersion( "1.0" ); - v3Dep.addProperty( "scope", "test" ); - - org.apache.maven.model.v3_0_0.Model v3Model = new org.apache.maven.model.v3_0_0.Model(); - v3Model.addDependency( v3Dep ); - - Model result = translator.translate( v3Model, reporter ); - assertEquals( "test", ( (Dependency) result.getDependencies().get( 0 ) ).getScope() ); - - } - - public void testShouldConvertDependencyWithTypePluginToBuildPluginEntry() - throws Exception - { - PomV3ToV4Translator translator = (PomV3ToV4Translator) lookup( PomV3ToV4Translator.ROLE ); - - Reporter reporter = new DummyReporter(); - - org.apache.maven.model.v3_0_0.Dependency v3Dep = new org.apache.maven.model.v3_0_0.Dependency(); - v3Dep.setGroupId( "testGroup" ); - v3Dep.setArtifactId( "testArtifact" ); - v3Dep.setVersion( "1.0" ); - v3Dep.setType( "plugin" ); - - org.apache.maven.model.v3_0_0.Model v3Model = new org.apache.maven.model.v3_0_0.Model(); - v3Model.addDependency( v3Dep ); - - Model result = translator.translate( v3Model, reporter ); - - Build build = result.getBuild(); - - Plugin plugin = (Plugin) build.getPlugins().get( 0 ); - - assertEquals( "testGroup", plugin.getGroupId() ); - assertEquals( "testArtifact", plugin.getArtifactId() ); - assertEquals( "1.0", plugin.getVersion() ); - } - - public void testShouldConvertDependencyWithTypePluginAndGroupMavenToBuildPluginEntryWithOAMPluginsGroup() - throws Exception - { - PomV3ToV4Translator translator = (PomV3ToV4Translator) lookup( PomV3ToV4Translator.ROLE ); - - Reporter reporter = new DummyReporter(); - - org.apache.maven.model.v3_0_0.Dependency v3Dep = new org.apache.maven.model.v3_0_0.Dependency(); - v3Dep.setGroupId( "maven" ); - v3Dep.setArtifactId( "testArtifact" ); - v3Dep.setVersion( "1.0" ); - v3Dep.setType( "plugin" ); - - org.apache.maven.model.v3_0_0.Model v3Model = new org.apache.maven.model.v3_0_0.Model(); - v3Model.addDependency( v3Dep ); - - Model result = translator.translate( v3Model, reporter ); - - Build build = result.getBuild(); - - Plugin plugin = (Plugin) build.getPlugins().get( 0 ); - - assertEquals( "org.apache.maven.plugins", plugin.getGroupId() ); - assertEquals( "testArtifact", plugin.getArtifactId() ); - assertEquals( "1.0", plugin.getVersion() ); - } - -} diff --git a/sandbox/repoclean/src/test/resources/digest/ArtifactDigestorTest/digestFormatVerifyArtifact.jar b/sandbox/repoclean/src/test/resources/digest/ArtifactDigestorTest/digestFormatVerifyArtifact.jar deleted file mode 100644 index c8a287011b1db626031fc04d55a180e729842eb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169763 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≺2xV^e%Ru}4b~N(Mb=Bsnr1^BS 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

    ?^ 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