/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.salesforce;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.apache.camel.util.ObjectHelper;
import org.apache.camel.util.jsse.KeyStoreParameters;
import static org.apache.camel.util.ObjectHelper.isNotEmpty;
public final class LoginConfigHelper {
private static final LoginConfigHelper INSTANCE = new LoginConfigHelper();
private final Map<String, String> configuration;
private LoginConfigHelper() {
configuration = new HashMap<>();
try {
final ResourceBundle properties = ResourceBundle.getBundle("test-salesforce-login");
properties.keySet().forEach(k -> configuration.put(k, properties.getString(k)));
} catch (final MissingResourceException ignored) {
// ignoring if missing
}
System.getenv().keySet().stream()//
.filter(k -> k.startsWith("SALESFORCE_") && isNotEmpty(System.getenv(k)))
.forEach(k -> configuration.put(fromEnvName(k), System.getenv(k)));
System.getProperties().keySet().stream().map(String.class::cast)
.filter(k -> k.startsWith("salesforce.") && isNotEmpty(System.getProperty(k)))
.forEach(k -> configuration.put(k, System.getProperty(k)));
}
private String fromEnvName(final String envVariable) {
return envVariable.replaceAll("_", ".").toLowerCase();
}
SalesforceLoginConfig createLoginConfig() {
final SalesforceLoginConfig loginConfig = new SalesforceLoginConfig();
final String explicitType = configuration.get("salesforce.auth.type");
if (ObjectHelper.isNotEmpty(explicitType)) {
loginConfig.setType(AuthenticationType.valueOf(explicitType));
}
loginConfig.setClientId(configuration.get("salesforce.client.id"));
loginConfig.setClientSecret(configuration.get("salesforce.client.secret"));
loginConfig.setUserName(configuration.get("salesforce.username"));
loginConfig.setPassword(configuration.get("salesforce.password"));
final KeyStoreParameters keystore = new KeyStoreParameters();
keystore.setResource(configuration.get("salesforce.keystore.resource"));
keystore.setPassword(configuration.get("salesforce.keystore.password"));
keystore.setType(configuration.get("salesforce.keystore.type"));
keystore.setProvider(configuration.get("salesforce.keystore.provider"));
loginConfig.setKeystore(keystore);
validate(loginConfig);
return loginConfig;
}
void validate(final SalesforceLoginConfig loginConfig) {
try {
loginConfig.validate();
} catch (final IllegalArgumentException e) {
System.out.println("To run integration tests Salesforce Authentication information is");
System.out.println("needed.");
System.out.println("You need to specify the configuration for running tests by either");
System.out.println("specifying environment variables, Maven properties or create a Java");
System.out.println("properties file at:");
System.out.println();
System.out.println("camel/components/camel-salesforce/test-salesforce-login.properties");
System.out.println();
System.out.println("With authentication information to access a Salesforce instance.");
System.out.println("You can use:");
System.out.println();
System.out.println("camel/components/camel-salesforce/test-salesforce-login.properties.sample");
System.out.println();
System.out.println("as reference. A free Salesforce developer account can be obtained at:");
System.out.println();
System.out.println("https://developer.salesforce.com");
System.out.println();
System.out.println("Properties that you need to set:");
System.out.println();
System.out.println("| Maven or properties file | Environment variable | Use |");
System.out.println("|------------------------------+------------------------------+--------|");
System.out.println("| salesforce.client.id | SALESFORCE_CLIENT_ID | ALL |");
System.out.println("| salesforce.client.secret | SALESFORCE_CLIENT_SECRET | UP, RT |");
System.out.println("| salesforce.username | SALESFORCE_USERNAME | UP, JWT|");
System.out.println("| salesforce.password | SALESFORCE_PASSWORD | UP |");
System.out.println("| salesforce.refreshToken | SALESFORCE_REFRESH_TOKEN | RT |");
System.out.println("| salesforce.keystore.path | SALESFORCE_KEYSTORE_PATH | JWT |");
System.out.println("| salesforce.keystore.type | SALESFORCE_KEYSTORE_TYPE | JWT |");
System.out.println("| salesforce.keystore.password | SALESFORCE_KEYSTORE_PASSWORD | JWT |");
System.out.println("| salesforce.login.url | SALESFORCE_LOGIN_URL | ALL |");
System.out.println();
System.out.println("* ALL - required allways");
System.out.println("* UP - when using username and password authentication");
System.out.println("* RT - when using refresh token flow");
System.out.println("* JWT - when using JWT flow");
System.out.println();
System.out.println("You can force authentication type to be one of USERNAME_PASSWORD,");
System.out.println("REFRESH_TOKEN or JWT by setting `salesforce.auth.type` (or ");
System.out.println("`SALESFORCE_AUTH_TYPE` for environment variables).");
System.out.println();
System.out.println("Examples:");
System.out.println();
System.out.println("Using environment:");
System.out.println();
System.out.println("$ export SALESFORCE_CLIENT_ID=...");
System.out.println("$ export SALESFORCE_CLIENT_SECRET=...");
System.out.println("$ export ...others...");
System.out.println();
System.out.println("or using Maven properties:");
System.out.println();
System.out.println("$ mvn -Pintegration -Dsalesforce.client.id=... \\");
System.out.println(" -Dsalesforce.client.secret=... ...");
System.out.println();
}
}
public static SalesforceLoginConfig getLoginConfig() {
return INSTANCE.createLoginConfig();
}
}