/** * Copyright Red Hat, Inc, and individual contributors. * * Licensed 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 com.feedhenry.sdk; import com.feedhenry.sdk.utils.DataManager; import com.feedhenry.sdk.utils.FHLog; import com.feedhenry.sdk.utils.StringUtils; import java.util.regex.Pattern; import org.json.fh.JSONException; import org.json.fh.JSONObject; public class CloudProps { private static final Pattern INVALID_URI_SEGMENT = Pattern.compile("(_.*?)\\."); private JSONObject mCloudProps; private String mHostUrl; private String mEnv; private static String mInitValue; private static final String LOG_TAG = "com.feedhenry.sdk.CloudProps"; private static final String HOSTS_KEY = "hosts"; private static final String INIT_KEY = "init"; private static CloudProps mInstance; private CloudProps(JSONObject pCloudProps) { mCloudProps = pCloudProps; } /** * Construct a cloudProps instance for local development. The cloud url will be the value of * "host" specified in assets/fhconfig.local.properties file. */ private CloudProps() { mCloudProps = new JSONObject(); mCloudProps.put("url", AppProps.getInstance().getHost()); } /** * Return the cloud host of the app. * * @return the cloud host with no trailing "/" */ public String getCloudHost() { if (mHostUrl == null) { String hostUri = null; try { if (mCloudProps.has("url")) { hostUri = mCloudProps.getString("url"); } else if (mCloudProps.has("hosts")) { JSONObject hosts = mCloudProps.getJSONObject("hosts"); if (hosts.has("url")) { hostUri = hosts.getString("url"); } else { String appMode = AppProps.getInstance().getAppMode(); String key = "dev".equalsIgnoreCase(appMode) ? "debugCloudUrl" : "releaseCloudUrl"; hostUri = hosts.getString(key); } } if (hostUri == null) { throw new Exception("Could not get cloud host URL"); } hostUri = StringUtils.removeTrailingSlash(hostUri); /* Previously, the cloud host URI could look like this: testing-nge0bsskhnq2slb3b1luvbwr-dev_testing.df.dev.e111.feedhenry.net However, "_" is not a valid character in a Java URI. This will cause getHost() to return null. Since dynofarm now accepts URIs like this: testing-nge0bsskhnq2slb3b1luvbwr-dev.df.dev.e111.feedhenry.net We need to remove the "_" + environment part if it exists. */ hostUri = INVALID_URI_SEGMENT.matcher(hostUri).replaceFirst("."); mHostUrl = hostUri; FHLog.v(LOG_TAG, "host url = " + mHostUrl); } catch (Exception e) { FHLog.e(LOG_TAG, e.getMessage(), e); } } return mHostUrl; } /** * Gets the environment of the cloud app. * * @return The environment of the cloud app */ public String getEnv() { if (mEnv == null) { JSONObject hosts = mCloudProps.getJSONObject("hosts"); if (hosts.has("environment")) { mEnv = hosts.getString("environment"); } } return mEnv; } /** * Saves the details of the cloud app to the device. */ public void save() { if (mCloudProps != null) { DataManager.getInstance().save(HOSTS_KEY, mCloudProps.toString()); // Save init if (mCloudProps.has(INIT_KEY)) { try { mInitValue = mCloudProps.getString(INIT_KEY); DataManager.getInstance().save(INIT_KEY, mInitValue); } catch (JSONException e) { FHLog.w(LOG_TAG, e.getMessage()); } } } } /** * Gets the instance of CloudProps for local development. * * @return The instance of CloudProps for local development */ public static CloudProps initDev() { if (mInstance == null) { mInstance = new CloudProps(); } return mInstance; } /** * Gets the instance of CloudProps via a JSONObject. * * @param pCloudProps the JSONObjct contains the details of the cloud app * @return CloudProps */ public static CloudProps init(JSONObject pCloudProps) { if (mInstance == null) { mInstance = new CloudProps(pCloudProps); } return mInstance; } /** * Gets the instance of the CloudProps based on local cached data if exists. * * @return CloudProps */ public static CloudProps load() { if (mInstance == null) { String saved = DataManager.getInstance().read(HOSTS_KEY); if (saved != null) { try { JSONObject parsed = new JSONObject(saved); mInstance = new CloudProps(parsed); } catch (Exception e) { mInstance = null; FHLog.w(LOG_TAG, e.getMessage()); } } } return mInstance; } public static CloudProps getInstance() { return mInstance; } /** * Gets tracking data from init data. * * @return the tracking data */ public static String getInitValue() { if (mInitValue == null) { mInitValue = DataManager.getInstance().read(INIT_KEY); } return mInitValue; } }