PageRenderTime 23ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/projects/maven-3.0.5/maven-settings-builder/src/main/java/org/apache/maven/settings/building/DefaultSettingsBuilder.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 272 lines | 202 code | 45 blank | 25 comment | 20 complexity | cea7b59a6142399d7f9b0ead9ce35400 MD5 | raw file
  1. package org.apache.maven.settings.building;
  2. /*
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing,
  14. * software distributed under the License is distributed on an
  15. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  16. * KIND, either express or implied. See the License for the
  17. * specific language governing permissions and limitations
  18. * under the License.
  19. */
  20. import java.io.File;
  21. import java.io.IOException;
  22. import java.io.StringReader;
  23. import java.io.StringWriter;
  24. import java.util.Collections;
  25. import java.util.List;
  26. import java.util.Map;
  27. import org.apache.maven.settings.Settings;
  28. import org.apache.maven.settings.TrackableBase;
  29. import org.apache.maven.settings.io.SettingsParseException;
  30. import org.apache.maven.settings.io.SettingsReader;
  31. import org.apache.maven.settings.io.SettingsWriter;
  32. import org.apache.maven.settings.merge.MavenSettingsMerger;
  33. import org.apache.maven.settings.validation.SettingsValidator;
  34. import org.codehaus.plexus.component.annotations.Component;
  35. import org.codehaus.plexus.component.annotations.Requirement;
  36. import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
  37. import org.codehaus.plexus.interpolation.InterpolationException;
  38. import org.codehaus.plexus.interpolation.InterpolationPostProcessor;
  39. import org.codehaus.plexus.interpolation.PropertiesBasedValueSource;
  40. import org.codehaus.plexus.interpolation.RegexBasedInterpolator;
  41. /**
  42. * Builds the effective settings from a user settings file and/or a global settings file.
  43. *
  44. * @author Benjamin Bentmann
  45. */
  46. @Component( role = SettingsBuilder.class )
  47. public class DefaultSettingsBuilder
  48. implements SettingsBuilder
  49. {
  50. @Requirement
  51. private SettingsReader settingsReader;
  52. @Requirement
  53. private SettingsWriter settingsWriter;
  54. @Requirement
  55. private SettingsValidator settingsValidator;
  56. private MavenSettingsMerger settingsMerger = new MavenSettingsMerger();
  57. public DefaultSettingsBuilder setSettingsReader( SettingsReader settingsReader )
  58. {
  59. this.settingsReader = settingsReader;
  60. return this;
  61. }
  62. public DefaultSettingsBuilder setSettingsWriter( SettingsWriter settingsWriter )
  63. {
  64. this.settingsWriter = settingsWriter;
  65. return this;
  66. }
  67. public DefaultSettingsBuilder setSettingsValidator( SettingsValidator settingsValidator )
  68. {
  69. this.settingsValidator = settingsValidator;
  70. return this;
  71. }
  72. public SettingsBuildingResult build( SettingsBuildingRequest request )
  73. throws SettingsBuildingException
  74. {
  75. DefaultSettingsProblemCollector problems = new DefaultSettingsProblemCollector( null );
  76. SettingsSource globalSettingsSource =
  77. getSettingsSource( request.getGlobalSettingsFile(), request.getGlobalSettingsSource() );
  78. Settings globalSettings = readSettings( globalSettingsSource, request, problems );
  79. SettingsSource userSettingsSource =
  80. getSettingsSource( request.getUserSettingsFile(), request.getUserSettingsSource() );
  81. Settings userSettings = readSettings( userSettingsSource, request, problems );
  82. settingsMerger.merge( userSettings, globalSettings, TrackableBase.GLOBAL_LEVEL );
  83. problems.setSource( "" );
  84. userSettings = interpolate( userSettings, request, problems );
  85. // for the special case of a drive-relative Windows path, make sure it's absolute to save plugins from trouble
  86. String localRepository = userSettings.getLocalRepository();
  87. if ( localRepository != null && localRepository.length() > 0 )
  88. {
  89. File file = new File( localRepository );
  90. if ( !file.isAbsolute() && file.getPath().startsWith( File.separator ) )
  91. {
  92. userSettings.setLocalRepository( file.getAbsolutePath() );
  93. }
  94. }
  95. if ( hasErrors( problems.getProblems() ) )
  96. {
  97. throw new SettingsBuildingException( problems.getProblems() );
  98. }
  99. return new DefaultSettingsBuildingResult( userSettings, problems.getProblems() );
  100. }
  101. private boolean hasErrors( List<SettingsProblem> problems )
  102. {
  103. if ( problems != null )
  104. {
  105. for ( SettingsProblem problem : problems )
  106. {
  107. if ( SettingsProblem.Severity.ERROR.compareTo( problem.getSeverity() ) >= 0 )
  108. {
  109. return true;
  110. }
  111. }
  112. }
  113. return false;
  114. }
  115. private SettingsSource getSettingsSource( File settingsFile, SettingsSource settingsSource )
  116. {
  117. if ( settingsSource != null )
  118. {
  119. return settingsSource;
  120. }
  121. else if ( settingsFile != null && settingsFile.exists() )
  122. {
  123. return new FileSettingsSource( settingsFile );
  124. }
  125. return null;
  126. }
  127. private Settings readSettings( SettingsSource settingsSource, SettingsBuildingRequest request,
  128. DefaultSettingsProblemCollector problems )
  129. {
  130. if ( settingsSource == null )
  131. {
  132. return new Settings();
  133. }
  134. problems.setSource( settingsSource.getLocation() );
  135. Settings settings;
  136. try
  137. {
  138. Map<String, ?> options = Collections.singletonMap( SettingsReader.IS_STRICT, Boolean.TRUE );
  139. try
  140. {
  141. settings = settingsReader.read( settingsSource.getInputStream(), options );
  142. }
  143. catch ( SettingsParseException e )
  144. {
  145. options = Collections.singletonMap( SettingsReader.IS_STRICT, Boolean.FALSE );
  146. settings = settingsReader.read( settingsSource.getInputStream(), options );
  147. problems.add( SettingsProblem.Severity.WARNING, e.getMessage(), e.getLineNumber(), e.getColumnNumber(),
  148. e );
  149. }
  150. }
  151. catch ( SettingsParseException e )
  152. {
  153. problems.add( SettingsProblem.Severity.FATAL, "Non-parseable settings " + settingsSource.getLocation() + ": "
  154. + e.getMessage(), e.getLineNumber(), e.getColumnNumber(), e );
  155. return new Settings();
  156. }
  157. catch ( IOException e )
  158. {
  159. problems.add( SettingsProblem.Severity.FATAL, "Non-readable settings " + settingsSource.getLocation() + ": "
  160. + e.getMessage(), -1, -1, e );
  161. return new Settings();
  162. }
  163. settingsValidator.validate( settings, problems );
  164. return settings;
  165. }
  166. private Settings interpolate( Settings settings, SettingsBuildingRequest request, SettingsProblemCollector problems )
  167. {
  168. StringWriter writer = new StringWriter( 1024 * 4 );
  169. try
  170. {
  171. settingsWriter.write( writer, null, settings );
  172. }
  173. catch ( IOException e )
  174. {
  175. throw new IllegalStateException( "Failed to serialize settings to memory", e );
  176. }
  177. String serializedSettings = writer.toString();
  178. RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
  179. interpolator.addValueSource( new PropertiesBasedValueSource( request.getUserProperties() ) );
  180. interpolator.addValueSource( new PropertiesBasedValueSource( request.getSystemProperties() ) );
  181. try
  182. {
  183. interpolator.addValueSource( new EnvarBasedValueSource() );
  184. }
  185. catch ( IOException e )
  186. {
  187. problems.add( SettingsProblem.Severity.WARNING, "Failed to use environment variables for interpolation: "
  188. + e.getMessage(), -1, -1, e );
  189. }
  190. interpolator.addPostProcessor( new InterpolationPostProcessor()
  191. {
  192. public Object execute( String expression, Object value )
  193. {
  194. if ( value != null )
  195. {
  196. // we're going to parse this back in as XML so we need to escape XML markup
  197. value = value.toString().replace( "&", "&amp;" ).replace( "<", "&lt;" ).replace( ">", "&gt;" );
  198. return value;
  199. }
  200. return null;
  201. }
  202. } );
  203. try
  204. {
  205. serializedSettings = interpolator.interpolate( serializedSettings, "settings" );
  206. }
  207. catch ( InterpolationException e )
  208. {
  209. problems.add( SettingsProblem.Severity.ERROR, "Failed to interpolate settings: " + e.getMessage(), -1, -1,
  210. e );
  211. return settings;
  212. }
  213. Settings result;
  214. try
  215. {
  216. Map<String, ?> options = Collections.singletonMap( SettingsReader.IS_STRICT, Boolean.FALSE );
  217. result = settingsReader.read( new StringReader( serializedSettings ), options );
  218. }
  219. catch ( IOException e )
  220. {
  221. problems.add( SettingsProblem.Severity.ERROR, "Failed to interpolate settings: " + e.getMessage(), -1, -1,
  222. e );
  223. return settings;
  224. }
  225. return result;
  226. }
  227. }