1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.model.profile.activation;
20  
21  import javax.inject.Named;
22  import javax.inject.Singleton;
23  
24  import java.util.Locale;
25  
26  import org.apache.maven.model.Activation;
27  import org.apache.maven.model.ActivationOS;
28  import org.apache.maven.model.Profile;
29  import org.apache.maven.model.building.ModelProblemCollector;
30  import org.apache.maven.model.profile.ProfileActivationContext;
31  import org.apache.maven.utils.Os;
32  
33  
34  
35  
36  
37  
38  @Named("os")
39  @Singleton
40  public class OperatingSystemProfileActivator implements ProfileActivator {
41  
42      private static final String REGEX_PREFIX = "regex:";
43  
44      @Override
45      public boolean isActive(Profile profile, ProfileActivationContext context, ModelProblemCollector problems) {
46          Activation activation = profile.getActivation();
47  
48          if (activation == null) {
49              return false;
50          }
51  
52          ActivationOS os = activation.getOs();
53  
54          if (os == null) {
55              return false;
56          }
57  
58          boolean active = ensureAtLeastOneNonNull(os);
59  
60          String actualOsName = context.getSystemProperties().get("os.name").toLowerCase(Locale.ENGLISH);
61          String actualOsArch = context.getSystemProperties().get("os.arch").toLowerCase(Locale.ENGLISH);
62          String actualOsVersion = context.getSystemProperties().get("os.version").toLowerCase(Locale.ENGLISH);
63  
64          if (active && os.getFamily() != null) {
65              active = determineFamilyMatch(os.getFamily(), actualOsName);
66          }
67          if (active && os.getName() != null) {
68              active = determineNameMatch(os.getName(), actualOsName);
69          }
70          if (active && os.getArch() != null) {
71              active = determineArchMatch(os.getArch(), actualOsArch);
72          }
73          if (active && os.getVersion() != null) {
74              active = determineVersionMatch(os.getVersion(), actualOsVersion);
75          }
76  
77          return active;
78      }
79  
80      @Override
81      public boolean presentInConfig(Profile profile, ProfileActivationContext context, ModelProblemCollector problems) {
82          Activation activation = profile.getActivation();
83  
84          if (activation == null) {
85              return false;
86          }
87  
88          ActivationOS os = activation.getOs();
89  
90          return os != null;
91      }
92  
93      private boolean ensureAtLeastOneNonNull(ActivationOS os) {
94          return os.getArch() != null || os.getFamily() != null || os.getName() != null || os.getVersion() != null;
95      }
96  
97      private boolean determineVersionMatch(String expectedVersion, String actualVersion) {
98          String test = expectedVersion;
99          boolean reverse = false;
100         final boolean result;
101         if (test.startsWith(REGEX_PREFIX)) {
102             result = actualVersion.matches(test.substring(REGEX_PREFIX.length()));
103         } else {
104             if (test.startsWith("!")) {
105                 reverse = true;
106                 test = test.substring(1);
107             }
108             result = actualVersion.equals(test);
109         }
110 
111         return reverse != result;
112     }
113 
114     private boolean determineArchMatch(String expectedArch, String actualArch) {
115         String test = expectedArch;
116         boolean reverse = false;
117 
118         if (test.startsWith("!")) {
119             reverse = true;
120             test = test.substring(1);
121         }
122 
123         boolean result = actualArch.equals(test);
124 
125         return reverse != result;
126     }
127 
128     private boolean determineNameMatch(String expectedName, String actualName) {
129         String test = expectedName;
130         boolean reverse = false;
131 
132         if (test.startsWith("!")) {
133             reverse = true;
134             test = test.substring(1);
135         }
136 
137         boolean result = actualName.equals(test);
138 
139         return reverse != result;
140     }
141 
142     private boolean determineFamilyMatch(String family, String actualName) {
143         String test = family;
144         boolean reverse = false;
145 
146         if (test.startsWith("!")) {
147             reverse = true;
148             test = test.substring(1);
149         }
150 
151         boolean result = Os.isFamily(test, actualName);
152 
153         return reverse != result;
154     }
155 }