/* See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Esri Inc. 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 com.esri.gpt.control.livedata;
import com.esri.gpt.control.livedata.selector.RendererSelector;
import com.esri.gpt.framework.collection.StringAttributeMap;
import com.esri.gpt.framework.context.ApplicationConfiguration;
import com.esri.gpt.framework.context.ApplicationContext;
import com.esri.gpt.framework.http.CredentialProvider;
import com.esri.gpt.framework.util.LogUtil;
import com.esri.gpt.framework.util.Val;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Collection of renderer factories.
*/
public class RendererFactories extends ArrayList<IRendererFactory> {
/** add to map pattern */
private static Pattern addToMapPattern = Pattern.compile("^resources=map:\\p{Alnum}+@");
/** base map only renderer */
private IRenderer basemapOnlyRenderer;
/**
* Creates instance of the collection.
* @param contextPath web application context path
* @param proxyUrl general use proxy used to carry AJAX calls
* @param kmzBridge KMZ bridge
*/
public RendererFactories(String contextPath, String proxyUrl, String kmzBridge) {
final LiveDataController controller = LiveDataController.getCurrentInstance();
basemapOnlyRenderer = new BasemapOnlyRenderer() {
@Override
protected int getMapHeightAdjustment() {
return controller.getMapHeightAdjustment();
}
};
LiveDataRendererFactoryBuilder builder = LiveDataRendererFactoryBuilder.newBuilder();
this.addAll(builder.buildFactories(contextPath, proxyUrl, kmzBridge));
}
/**
* Selects renderer based on live data service URL.
* @param url live data service URL
* @return renderer matching live data service URL or <code>null</code> if no renderer found
*/
public IRenderer select(String url) {
return select(url, null);
}
/**
* Selects renderer based on live data service URL.
* @param url live data service URL
* @param cp credential provider
* @return renderer matching live data service URL or <code>null</code> if no renderer found
*/
public IRenderer select(String url, final CredentialProvider cp) {
IRenderer renderer = null;
// assert url
url = url != null && !url.equals("null") ? url.trim() : "";
// accept 'Add to map' style of the URL
Matcher addToMapMatcher = addToMapPattern.matcher(url);
final String serviceUrl = addToMapMatcher.find() ? url.substring(addToMapMatcher.end()) : url;
Date start = new Date();
if (serviceUrl.length() == 0) {
// provide base map only renderer
renderer = basemapOnlyRenderer;
} else {
ApplicationConfiguration appConfig = ApplicationContext.getInstance().getConfiguration();
StringAttributeMap parameters = appConfig.getCatalogConfiguration().getParameters();
boolean advPreviewEnabled = Val.chkBool(parameters.getValue("preview.advanced.enabled"), true);
if (advPreviewEnabled) {
RendererSelector selector = new RendererSelector(this);
renderer = selector.select(url, cp);
}
}
Date now = new Date();
LogUtil.getLogger().log(Level.INFO, "{0} selected after {1} milliseconds for live data preview.", new Object[]{renderer != null ? renderer.toString() : "No any renderer (" + url + ")", now.getTime() - start.getTime()});
return renderer;
}
}