├── .gitignore
├── LICENSE
├── README.md
├── aether-grape
├── assembly.xml
├── pom.xml
└── src
│ └── main
│ └── java
│ ├── com
│ └── github
│ │ └── igorsuhorukov
│ │ ├── AetherEngine.java
│ │ └── DefaultAetherGrapeEngine.java
│ └── org
│ └── springframework
│ ├── boot
│ └── cli
│ │ └── compiler
│ │ └── maven
│ │ └── MavenSettingsReader.java
│ └── util
│ ├── Assert.java
│ ├── ObjectUtils.java
│ └── StringUtils.java
├── dropship
├── pom.xml
└── src
│ └── main
│ └── java
│ └── com
│ └── github
│ └── smreed
│ └── dropship
│ ├── ClassLoaderBuilder.java
│ ├── Dropship.java
│ ├── FilterOptionalRuntimeProvided.java
│ ├── LoggingRepositoryListener.java
│ ├── MavenClassLoader.java
│ ├── MavenDependency.java
│ ├── NotLogger.java
│ ├── RepositoryUtils.java
│ └── Settings.java
├── mvn-classloader-settings
└── pom.xml
├── mvn-classloader
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── com
│ │ └── github
│ │ └── igorsuhorukov
│ │ ├── maven
│ │ ├── DependenciesResolver.java
│ │ └── MavenDependenciesResolver.java
│ │ ├── service
│ │ └── MavenServiceLoader.java
│ │ └── url
│ │ ├── UrlBootstrapLoader.java
│ │ └── handler
│ │ ├── ChainURLStreamHandlerFactory.java
│ │ ├── UniversalURLStreamHandlerFactory.java
│ │ ├── loadable
│ │ ├── LoadableHandlerProvider.java
│ │ └── LoadableURLStreamHandlerFactory.java
│ │ └── mvn
│ │ ├── Handler.java
│ │ ├── MavenHandlerProvider.java
│ │ └── MavenURLStreamHandlerFactory.java
│ └── resources
│ └── META-INF
│ └── services
│ ├── com.github.igorsuhorukov.springframework.boot.cli.compiler.grape.RepositorySystemSessionAutoConfiguration
│ ├── groovy.grape.GrapeEngine
│ ├── java.net.URLStreamHandlerFactory
│ └── java.net.spi.URLStreamHandlerProvider
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | .m2
2 | target
3 | *.iml
4 | .idea
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
203 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # mvn-classloader
2 | Groovy Grape Aether provider, Dropship classloader, UniversalURLStreamHandlerFactory to extend java.net.URL protocols, misc. classloader tools
3 |
4 | Thanks [Steve Reed][1] for maven classloader (dropship project).
5 | [1]: https://github.com/smreed "Steve Reed"
6 |
--------------------------------------------------------------------------------
/aether-grape/assembly.xml:
--------------------------------------------------------------------------------
1 |
4 | bundled
5 |
6 | jar
7 |
8 | false
9 |
10 |
11 | ${project.build.directory}/assembly
12 | /
13 |
14 |
15 |
--------------------------------------------------------------------------------
/aether-grape/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | com.github.igor-suhorukov
4 | mvn-classloader-settings
5 | 1.11-SNAPSHOT
6 | ../mvn-classloader-settings
7 |
8 | 4.0.0
9 | aether-grape
10 | jar
11 | 1.11-SNAPSHOT
12 |
13 |
14 |
15 | com.github.wvengen
16 | proguard-maven-plugin
17 |
18 |
19 | package
20 | proguard
21 |
22 |
23 |
24 | false
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | org.springframework.boot
50 | spring-boot-cli
51 | !org/springframework/boot/cli/compiler/maven/MavenSettingsReader*
52 |
53 |
54 | org.springframework.boot
55 | spring-boot-loader-tools
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | org.apache.maven.plugins
64 | maven-dependency-plugin
65 |
66 |
67 | unpack
68 | package
69 |
70 | unpack
71 |
72 |
73 |
74 |
75 | ${project.groupId}
76 | ${project.artifactId}
77 | ${project.version}
78 | jar
79 | ${project.build.directory}/assembly
80 | META-INF/services/*
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | maven-assembly-plugin
89 | 2.5.5
90 |
91 |
92 | assembly.xml
93 |
94 |
95 |
96 |
97 | package
98 |
99 | single
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 | org.springframework.boot
109 | spring-boot-cli
110 | ${spring.boot.version}
111 |
112 |
113 |
--------------------------------------------------------------------------------
/aether-grape/src/main/java/com/github/igorsuhorukov/AetherEngine.java:
--------------------------------------------------------------------------------
1 | package com.github.igorsuhorukov;
2 |
3 | import groovy.lang.GroovyClassLoader;
4 | import org.springframework.boot.cli.compiler.grape.*;
5 |
6 | import java.net.URI;
7 | import java.util.Collections;
8 | import java.util.List;
9 |
10 | /**
11 | */
12 | public class AetherEngine {
13 |
14 | public static void install(GroovyClassLoader classLoader) {
15 | install(classLoader, new DependencyResolutionContext(), Collections.singletonList(
16 | new RepositoryConfiguration("central",
17 | URI.create("https://repo.maven.apache.org/maven2/"), false)));
18 | }
19 |
20 | public static void install(GroovyClassLoader classLoader, DependencyResolutionContext resolutionContext,
21 | List repositoryConfiguration) {
22 |
23 | AetherGrapeEngine grapeEngine = AetherGrapeEngineFactory.create(classLoader,
24 | repositoryConfiguration, resolutionContext);
25 | GrapeEngineInstaller.install(grapeEngine);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/aether-grape/src/main/java/com/github/igorsuhorukov/DefaultAetherGrapeEngine.java:
--------------------------------------------------------------------------------
1 | package com.github.igorsuhorukov;
2 |
3 | import groovy.grape.GrapeEngine;
4 | import groovy.lang.GroovyClassLoader;
5 | import org.springframework.boot.cli.compiler.RepositoryConfigurationFactory;
6 | import org.springframework.boot.cli.compiler.grape.AetherGrapeEngine;
7 | import org.springframework.boot.cli.compiler.grape.AetherGrapeEngineFactory;
8 | import org.springframework.boot.cli.compiler.grape.DependencyResolutionContext;
9 |
10 | import java.net.URI;
11 | import java.util.List;
12 | import java.util.Map;
13 |
14 | public class DefaultAetherGrapeEngine implements GrapeEngine {
15 |
16 | private final AetherGrapeEngine grapeEngine;
17 | private final GroovyClassLoader groovyClassLoader;
18 |
19 | public DefaultAetherGrapeEngine() {
20 | groovyClassLoader = getGroovyClassLoader();
21 | grapeEngine = AetherGrapeEngineFactory.create(groovyClassLoader,
22 | RepositoryConfigurationFactory.createDefaultRepositoryConfiguration(),
23 | new DependencyResolutionContext());
24 | }
25 |
26 | @Override
27 | public Object grab(String endorsedModule) {
28 | return grapeEngine.grab(endorsedModule);
29 | }
30 |
31 | @Override
32 | public Object grab(Map args) {
33 | return grapeEngine.grab(args);
34 | }
35 |
36 | @Override
37 | public Object grab(Map args, Map... dependencies) {
38 | return grapeEngine.grab(args, dependencies);
39 | }
40 |
41 | @Override
42 | public Map>> enumerateGrapes() {
43 | return grapeEngine.enumerateGrapes();
44 | }
45 |
46 | @Override
47 | public URI[] resolve(Map args, Map... dependencies) {
48 | return grapeEngine.resolve(args, dependencies);
49 | }
50 |
51 | @Override
52 | public URI[] resolve(Map args, List depsInfo, Map... dependencies) {
53 | return grapeEngine.resolve(args, depsInfo, dependencies);
54 | }
55 |
56 | @Override
57 | public Map[] listDependencies(ClassLoader classLoader) {
58 | return grapeEngine.listDependencies(classLoader);
59 | }
60 |
61 | @Override
62 | public void addResolver(Map args) {
63 | grapeEngine.addResolver(args);
64 | }
65 |
66 | private static GroovyClassLoader getGroovyClassLoader() {
67 | ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
68 | GroovyClassLoader classLoader;
69 | if (contextClassLoader != null && contextClassLoader instanceof GroovyClassLoader) {
70 | classLoader = (GroovyClassLoader) contextClassLoader;
71 | } else{
72 | classLoader = new GroovyClassLoader();
73 | }
74 | return classLoader;
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/aether-grape/src/main/java/org/springframework/boot/cli/compiler/maven/MavenSettingsReader.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2012-2015 the original author or authors.
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package org.springframework.boot.cli.compiler.maven;
18 |
19 | import java.io.File;
20 | import java.lang.reflect.Field;
21 |
22 | import org.apache.maven.settings.Settings;
23 | import org.apache.maven.settings.building.DefaultSettingsBuilderFactory;
24 | import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
25 | import org.apache.maven.settings.building.SettingsBuildingException;
26 | import org.apache.maven.settings.building.SettingsBuildingRequest;
27 | import org.apache.maven.settings.crypto.DefaultSettingsDecrypter;
28 | import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
29 | import org.apache.maven.settings.crypto.SettingsDecrypter;
30 | import org.apache.maven.settings.crypto.SettingsDecryptionResult;
31 | import org.sonatype.plexus.components.cipher.DefaultPlexusCipher;
32 | import org.sonatype.plexus.components.cipher.PlexusCipherException;
33 | import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher;
34 |
35 | import org.springframework.boot.cli.util.Log;
36 |
37 | /**
38 | * {@code MavenSettingsReader} reads settings from a user's Maven settings.xml file,
39 | * decrypting them if necessary using settings-security.xml.
40 | *
41 | * @author Andy Wilkinson
42 | * @since 1.3.0
43 | */
44 | public class MavenSettingsReader {
45 |
46 | private final String homeDir;
47 |
48 | public MavenSettingsReader() {
49 | this(System.getProperty("user.home"));
50 | }
51 |
52 | public MavenSettingsReader(String homeDir) {
53 | this.homeDir = homeDir;
54 | }
55 |
56 | public MavenSettings readSettings() {
57 | Settings settings = loadSettings();
58 | SettingsDecryptionResult decrypted = decryptSettings(settings);
59 | if (!decrypted.getProblems().isEmpty()) {
60 | Log.error(
61 | "Maven settings decryption failed. Some Maven repositories may be inaccessible");
62 | // Continue - the encrypted credentials may not be used
63 | }
64 | if(Boolean.getBoolean("mavenSettings.offline")) {
65 | settings.setOffline(true);
66 | }
67 | return new MavenSettings(settings, decrypted);
68 | }
69 |
70 | private Settings loadSettings() {
71 | File settingsFile = getSettingsFile();
72 | SettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
73 | request.setUserSettingsFile(settingsFile);
74 | request.setSystemProperties(System.getProperties());
75 | try {
76 | return new DefaultSettingsBuilderFactory().newInstance().build(request)
77 | .getEffectiveSettings();
78 | }
79 | catch (SettingsBuildingException ex) {
80 | throw new IllegalStateException(
81 | "Failed to build settings from " + settingsFile, ex);
82 | }
83 | }
84 |
85 | private SettingsDecryptionResult decryptSettings(Settings settings) {
86 | DefaultSettingsDecryptionRequest request = new DefaultSettingsDecryptionRequest(
87 | settings);
88 |
89 | return createSettingsDecrypter().decrypt(request);
90 | }
91 |
92 | private SettingsDecrypter createSettingsDecrypter() {
93 | SettingsDecrypter settingsDecrypter = new DefaultSettingsDecrypter();
94 | setField(DefaultSettingsDecrypter.class, "securityDispatcher", settingsDecrypter,
95 | new SpringBootSecDispatcher());
96 | return settingsDecrypter;
97 | }
98 |
99 | private void setField(Class> sourceClass, String fieldName, Object target,
100 | Object value) {
101 | try {
102 | Field field = sourceClass.getDeclaredField(fieldName);
103 | field.setAccessible(true);
104 | field.set(target, value);
105 | }
106 | catch (Exception ex) {
107 | throw new IllegalStateException(
108 | "Failed to set field '" + fieldName + "' on '" + target + "'", ex);
109 | }
110 | }
111 |
112 | private File getSettingsFile() {
113 | String settingsFile = System.getProperty("mavenSettings");
114 | return settingsFile != null && !settingsFile.isEmpty() ?
115 | new File(settingsFile) : new File(this.homeDir, ".m2/settings.xml");
116 | }
117 |
118 | private File getSettingsSecurityFile() {
119 | String settingsSecurityFile = System.getProperty("mavenSettingsSecurity");
120 | final String SECURITY_XML = ".m2/settings-security.xml";
121 | return settingsSecurityFile != null && !settingsSecurityFile.isEmpty() ?
122 | new File(settingsSecurityFile) :
123 | new File(homeDir, SECURITY_XML);
124 | }
125 |
126 | private class SpringBootSecDispatcher extends DefaultSecDispatcher {
127 |
128 | SpringBootSecDispatcher() {
129 | File file = getSettingsSecurityFile();
130 | this._configurationFile = file.getAbsolutePath();
131 | try {
132 | this._cipher = new DefaultPlexusCipher();
133 | }
134 | catch (PlexusCipherException e) {
135 | throw new IllegalStateException(e);
136 | }
137 | }
138 | }
139 |
140 | }
141 |
--------------------------------------------------------------------------------
/aether-grape/src/main/java/org/springframework/util/Assert.java:
--------------------------------------------------------------------------------
1 | package org.springframework.util;
2 |
3 | /**
4 | */
5 | public class Assert {
6 | public static void notNull(Object object, String message) {
7 | if(object == null) {
8 | throw new IllegalArgumentException(message);
9 | }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/aether-grape/src/main/java/org/springframework/util/ObjectUtils.java:
--------------------------------------------------------------------------------
1 | package org.springframework.util;
2 |
3 | import java.util.Arrays;
4 |
5 | /**
6 | * Miscellaneous object utility methods.
7 | * Mainly for internal use within the framework.
8 | *
9 | *
Thanks to Alex Ruiz for contributing several enhancements to this class!
10 | *
11 | * @author Juergen Hoeller
12 | * @author Keith Donald
13 | * @author Rod Johnson
14 | * @author Rob Harrop
15 | * @author Chris Beams
16 | * @since 19.03.2004
17 | */
18 | public class ObjectUtils {
19 | //---------------------------------------------------------------------
20 | // Convenience methods for content-based equality/hash-code handling
21 | //---------------------------------------------------------------------
22 |
23 | /**
24 | * Determine if the given objects are equal, returning {@code true}
25 | * if both are {@code null} or {@code false} if only one is
26 | * {@code null}.
27 | *
Mainly for internal use within the framework; consider
7 | * Apache's Commons Lang
8 | * for a more comprehensive suite of String utilities.
9 | *
10 | *
This class delivers some simple functionality that should really
11 | * be provided by the core Java {@code String} and {@link StringBuilder}
12 | * classes, such as the ability to {#replace} all occurrences of a given
13 | * substring in a target string. It also provides easy-to-use methods to convert
14 | * between delimited strings, such as CSV strings, and collections and arrays.
15 | *
16 | * @author Rod Johnson
17 | * @author Juergen Hoeller
18 | * @author Keith Donald
19 | * @author Rob Harrop
20 | * @author Rick Evans
21 | * @author Arjen Poutsma
22 | * @since 16 April 2001
23 | */
24 | public class StringUtils {
25 | /**
26 | * Check that the given {@code CharSequence} is neither {@code null} nor
27 | * of length 0.
28 | *
Note: this method returns {@code true} for a {@code CharSequence}
29 | * that purely consists of whitespace.
30 | *
36 | * @param str the {@code CharSequence} to check (may be {@code null})
37 | * @return {@code true} if the {@code CharSequence} is not {@code null} and has length
38 | * @see #hasText(String)
39 | */
40 | public static boolean hasLength(CharSequence str) {
41 | return (str != null && str.length() > 0);
42 | }
43 |
44 | /**
45 | * Check that the given {@code String} is neither {@code null} nor of length 0.
46 | *
Note: this method returns {@code true} for a {@code String} that
47 | * purely consists of whitespace.
48 | * @param str the {@code String} to check (may be {@code null})
49 | * @return {@code true} if the {@code String} is not {@code null} and has length
50 | * @see #hasLength(CharSequence)
51 | * @see #hasText(String)
52 | */
53 | public static boolean hasLength(String str) {
54 | return hasLength((CharSequence) str);
55 | }
56 |
57 | /**
58 | * Check whether the given {@code CharSequence} contains actual text.
59 | *
More specifically, this method returns {@code true} if the
60 | * {@code CharSequence} is not {@code null}, its length is greater than
61 | * 0, and it contains at least one non-whitespace character.
62 | *