1 /*
2 * #%L
3 * Mojo's Maven plugin for Cobertura
4 * %%
5 * Copyright (C) 2005 - 2013 Codehaus
6 * %%
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * 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, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * #L%
19 */
20 package org.codehaus.mojo.cobertura.configuration;
21
22
23 import java.util.Map;
24
25 /**
26 * Class for checking and retrieving the maven environment variable for the
27 * maximum heap size setting.
28 *
29 * @author Trampas Kirk
30 * @since 2.3
31 */
32 public class MaxHeapSizeUtil
33 {
34
35 /**
36 * The maven options environment variable. Case sensitive.
37 */
38 public static final String MAVEN_OPTIONS = "MAVEN_OPTS";
39
40 /**
41 * The max heap size JVM parameter. Case sensitive.
42 */
43 public static final String MAX_MEMORY_FLAG = "-Xmx";
44
45 /**
46 * The number of characters from the flag char start to the actual setting.
47 */
48 private static final int NUMBER_OF_FLAG_CHARS = MAX_MEMORY_FLAG.length();
49
50 /**
51 * The instance of the <code>MemSettingUtil</code> singleton.
52 */
53 private static MaxHeapSizeUtil maxHeapSizeUtil;
54
55 /**
56 * Singleton getter.
57 *
58 * @return the <code>MemSettingUtil</code> instance.
59 */
60 public static MaxHeapSizeUtil getInstance()
61 {
62 if ( maxHeapSizeUtil == null )
63 {
64 maxHeapSizeUtil = new MaxHeapSizeUtil();
65 }
66 return maxHeapSizeUtil;
67 }
68
69 /**
70 * Private constructor for singleton purposes.
71 */
72 private MaxHeapSizeUtil()
73 {
74 // do nothing
75 }
76
77 /**
78 * The environment settings.
79 */
80 private Map<String, String> envSettings;
81
82 /**
83 * Gets envSettings map, typically a reference to the <code>System.getEnv()</code> settings.
84 * A lazy loaded property is used to make unit tests easy.
85 *
86 * @return the <code>System.getEnv()</code> settings.
87 */
88 private Map<String, String> getEnvSettings()
89 {
90 if ( envSettings == null )
91 {
92 envSettings = System.getenv();
93 }
94 return envSettings;
95 }
96
97 /**
98 * Sets the <code>System.getEnv()</code> settings.
99 *
100 * @param envSettings the settings map to use
101 */
102 public void setEnvSettings( Map<String, String> envSettings )
103 {
104 this.envSettings = envSettings;
105 }
106
107 /**
108 * Gets the maximum heap size JVM argument from the maven options environment variable.
109 * Returns only the numeric and unit portion. For example, given a maven options setting
110 * of "-Xmx64m" this method will return "64m". Returns <code>null</code> if the maven
111 * environment variable isn't set, the JVM heap size argument is not present, or the JVM
112 * heap size argument is somehow invalid.
113 *
114 * @return the maximum heap size JVM argument from the maven options environment variable
115 * @see #envHasMavenMaxMemSetting()
116 */
117 public String getMavenMaxMemSetting()
118 {
119 boolean hasMavenOptions = getEnvSettings().containsKey( MAVEN_OPTIONS );
120 if ( !hasMavenOptions )
121 {
122 return null;
123 }
124
125 String mavenOpts = (String) getEnvSettings().get( MAVEN_OPTIONS );
126 boolean hasMaxMemSetting = mavenOpts.contains( MAX_MEMORY_FLAG );
127
128 if ( !hasMaxMemSetting )
129 {
130 return null;
131 }
132
133 String mavenOptionsEnvironmentSetting = (String) getEnvSettings().get( MAVEN_OPTIONS );
134 int startIndex = mavenOptionsEnvironmentSetting.indexOf( MAX_MEMORY_FLAG ) + NUMBER_OF_FLAG_CHARS;
135 int endIndex = mavenOptionsEnvironmentSetting.indexOf( ' ', startIndex );
136
137 if ( endIndex == -1 )
138 {
139 endIndex = mavenOptionsEnvironmentSetting.length();
140 }
141
142 String maxMemSetting = mavenOptionsEnvironmentSetting.substring( startIndex, endIndex ).trim();
143
144 if ( !maxMemSetting.matches( "\\d+[mgMG]" ) )
145 {
146 return null;
147 }
148 return maxMemSetting;
149 }
150
151 /**
152 * Returns <code>true</code> if the current environment has the max heap size set in the maven
153 * options, otherwise <code>false</code>.
154 *
155 * @return <code>true</code> if the current environment has the max heap size set in the maven
156 * options, otherwise <code>false</code>.
157 * @see #getMavenMaxMemSetting()
158 */
159 public boolean envHasMavenMaxMemSetting()
160 {
161 if ( getMavenMaxMemSetting() != null )
162 {
163 return true;
164 }
165 return false;
166 }
167 }