1
15 package com.amazonaws.monitoring;
16
17 import static com.amazonaws.SDKGlobalConfiguration.DEFAULT_AWS_CSM_CLIENT_ID;
18 import static com.amazonaws.SDKGlobalConfiguration.DEFAULT_AWS_CSM_PORT;
19 import static com.amazonaws.SDKGlobalConfiguration.DEFAULT_AWS_CSM_HOST;
20
21 import com.amazonaws.SdkClientException;
22 import com.amazonaws.annotation.ThreadSafe;
23 import com.amazonaws.auth.profile.ProfilesConfigFile;
24 import com.amazonaws.auth.profile.internal.AwsProfileNameLoader;
25 import com.amazonaws.auth.profile.internal.BasicProfile;
26 import com.amazonaws.profile.path.AwsProfileFileLocationProvider;
27
28
35 @ThreadSafe
36 public final class ProfileCsmConfigurationProvider implements CsmConfigurationProvider {
37 public static final String CSM_ENABLED_PROPERTY = "csm_enabled";
38 public static final String CSM_HOST_PROPERTY = "csm_host";
39 public static final String CSM_PORT_PROPERTY = "csm_port";
40 public static final String CSM_CLIENT_ID_PROPERTY = "csm_client_id";
41
42 private final AwsProfileFileLocationProvider configFileLocationProvider;
43
44 private volatile String profileName;
45
46 private volatile ProfilesConfigFile configFile;
47
48
55 public ProfileCsmConfigurationProvider() {
56 this(null, AwsProfileFileLocationProvider.DEFAULT_CONFIG_LOCATION_PROVIDER);
57 }
58
59
68 public ProfileCsmConfigurationProvider(String profileName) {
69 this(profileName, AwsProfileFileLocationProvider.DEFAULT_CONFIG_LOCATION_PROVIDER);
70 }
71
72
80 public ProfileCsmConfigurationProvider(String profileName,
81 AwsProfileFileLocationProvider configFileLocationProvider) {
82 this.profileName = profileName;
83 this.configFileLocationProvider = configFileLocationProvider;
84 }
85
86 @Override
87 public CsmConfiguration getConfiguration() {
88 String profileName = getProfileName();
89
90 BasicProfile profile = getProfile(profileName);
91 if (profile == null) {
92 throw new SdkClientException(String.format("Could not find the '%s' profile!",
93 profileName));
94 }
95
96 String enabled = profile.getPropertyValue(CSM_ENABLED_PROPERTY);
97
98 if (enabled == null) {
99 throw new SdkClientException(String.format("The '%s' profile does not define all the"
100 + " required properties!", profileName));
101 }
102
103 String host = profile.getPropertyValue(CSM_HOST_PROPERTY);
104 host = host == null ? DEFAULT_AWS_CSM_HOST : host;
105 String port = profile.getPropertyValue(CSM_PORT_PROPERTY);
106 String clientId = profile.getPropertyValue(CSM_CLIENT_ID_PROPERTY);
107 clientId = clientId == null ? DEFAULT_AWS_CSM_CLIENT_ID : clientId;
108
109 try {
110 int portNumber = port == null ? DEFAULT_AWS_CSM_PORT : Integer.parseInt(port);
111
112 return CsmConfiguration.builder()
113 .withEnabled(Boolean.parseBoolean(enabled))
114 .withHost(host)
115 .withPort(portNumber)
116 .withClientId(clientId)
117 .build();
118 } catch (Exception e) {
119 throw new SdkClientException(String.format("Unable to load configuration from the '%s'"
120 + " profile!", profileName), e);
121 }
122 }
123
124 private String getProfileName() {
125 if (profileName == null) {
126 synchronized (this) {
127 if (profileName == null) {
128 profileName = AwsProfileNameLoader.INSTANCE.loadProfileName();
129 }
130 }
131 }
132 return profileName;
133 }
134
135 private synchronized BasicProfile getProfile(String profileName) {
136 return getProfilesConfigFile().getAllBasicProfiles().get(profileName);
137 }
138
139
140 private ProfilesConfigFile getProfilesConfigFile() {
141 if (configFile == null) {
142 synchronized (this) {
143 if (configFile == null) {
144 try {
145 configFile = new ProfilesConfigFile(configFileLocationProvider.getLocation());
146 } catch (Exception e) {
147 throw new SdkClientException("Unable to load config file", e);
148 }
149 }
150 }
151 }
152 return configFile;
153 }
154 }
155