📄 webresultsmergerimpl.java
字号:
package com.esri.solutions.jitk.web.data.results;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import com.esri.adf.web.ags.data.AGSMapResource;
import com.esri.adf.web.aims.data.AIMSMapResource;
import com.esri.adf.web.data.GISResource;
import com.esri.adf.web.data.WebLayerInfo;
import com.esri.adf.web.data.query.QueryResult;
import com.esri.adf.web.data.results.ResultNode;
import com.esri.solutions.jitk.web.util.WebResultsUtil;
@SuppressWarnings("unchecked")
public class WebResultsMergerImpl implements WebResultsMerger {
private static final Logger _logger = Logger.getLogger(AppendableEnabledWebResults.class);
private Map<String,String> _rowIdMapByResource;
private String _rowIdColumn;
private boolean _isRowIdSet = false;;
public static final String RESOURCE_TYPE_AGS = "AGS";
public static final String RESOURCE_TYPE_AIMS = "AIMS";
public static final String RESOURCE_TYPE_DEFAULT = "DEFAULT";
public WebResultsMergerImpl() {
}
public boolean merge( ResultNode resultNode1, ResultNode resultNode2 ){
if( resultNode1 != null && resultNode2 != null ) {
// try to set the rowId Column dynamically
findRowIdColumnKey( resultNode1 );
// check if the rowid is set
if( ! _isRowIdSet ) {
_logger.debug( "RowId is not set for comparisons. Stopping merger operation." );
return false;
}
// remove any duplicates and return new list
List newResultNodes = removeDuplicates( resultNode1, resultNode2 );
// add the children
resultNode1.addChildren( newResultNodes );
return true;
}
return false;
}
public boolean remove( ResultNode resultNode1, ResultNode resultNode2 ){
if( resultNode1 != null && resultNode2 != null ) {
// try to set the rowId Column dynamically
findRowIdColumnKey( resultNode1 );
// check if the rowid is set
if( ! _isRowIdSet ) {
_logger.debug( "RowId is not set for comparisons. Stopping removal operation." );
return false;
}
// remove from resultset
return removeFromResultNode( resultNode1, resultNode2 );
}
return false;
}
private boolean removeFromResultNode( ResultNode resultNode1, ResultNode resultNode2 ) {
List queryRows1 = resultNode1.getChildren();
List queryRows2 = resultNode2.getChildren();
List removalList = getRemovalList( queryRows1, queryRows2 );
if( removalList != null && removalList.size() > 0 ) {
// remove all from list
queryRows1.removeAll( removalList );
_logger.debug( "Done removing #" + removalList.size() + ", from selection set." );
return true;
} else {
_logger.debug( "Could not remove from the result set - removal list was NULL or empty!" );
}
return false;
}
private List removeDuplicates( ResultNode resultNode1, ResultNode resultNode2 ) {
List queryRows1 = resultNode1.getChildren();
List queryRows2 = resultNode2.getChildren();
return removeDuplicates( queryRows1, queryRows2 );
}
private List removeDuplicates( List resultNodes1, List resultNodes2 ) {
_logger.debug( "Trying to remove duplicates..." );
List newQueryResults = new ArrayList();
// check the list and return is they are null
if( resultNodes1 == null || resultNodes2 == null ) {
_logger.warn("Result node list(s) are null!" );
return newQueryResults;
}
for( Object resultNodeObj2 : resultNodes2 ) {
if (resultNodeObj2 == null || !(resultNodeObj2 instanceof ResultNode)) {
_logger.warn("Found a null/invalid ResultNode["+resultNodeObj2+"] in Merger");
continue;
}
// cast the QueryResult
ResultNode resultNode2 = ( ResultNode ) resultNodeObj2;
Map details2 = resultNode2.getDetails();
String rowId2 = ( String ) details2.get( _rowIdColumn );
boolean addResult = true;
// brute force through the list and try to match up the rowid to each record
for( Object resultNodeObj1 : resultNodes1 ) {
if (resultNodeObj1 == null || !(resultNodeObj1 instanceof ResultNode)) {
_logger.warn("Found a null/invalid ResultNode["+resultNodeObj1+"] in Merger");
continue;
}
// cast the QueryResult
ResultNode resultNode1 = ( ResultNode ) resultNodeObj1;
Map details1 = resultNode1.getDetails();
String rowId1 = ( String ) details1.get( _rowIdColumn );
_logger.debug( "Comparing rowIds: " + rowId1 + " vs. "+ rowId2 + " - using column: " + _rowIdColumn );
// do the comparison
if( rowId1 != null && rowId1.equals( rowId2 ) ) {
// duplicate found do not add to the list
addResult = false;
break;
}
}
// add non-duplicates
if( addResult ) {
_logger.debug( "Adding ResulNode: " + resultNode2.getDisplayName()
+ "with rowId[" + rowId2 + "]" );
// add it
newQueryResults.add( resultNode2 );
} else {
_logger.debug( "Duplicate found:"+ resultNode2.getDisplayName()
+ "with rowId[" + rowId2 + "] not adding to list" );
}
}
return newQueryResults;
}
private List getRemovalList( List resultNodes1, List resultNodes2 ) {
_logger.debug( "Trying to get removal list..." );
List newQueryResults = new ArrayList();
// check the list and return is they are null
if( resultNodes1 == null || resultNodes2 == null ) {
_logger.warn("Result node list(s) are null!" );
return newQueryResults;
}
for( Object resultNodeObj2 : resultNodes2 ) {
if (resultNodeObj2 == null || !(resultNodeObj2 instanceof ResultNode )) {
_logger.warn("Found a null/invalid ResultNode["+resultNodeObj2+"] in removal list merger");
continue;
}
// cast the QueryResult
ResultNode resultNode2 = ( ResultNode ) resultNodeObj2;
Map details2 = resultNode2.getDetails();
String rowId2 = ( String ) details2.get( _rowIdColumn );
// brute force through the list and try to match up the rowid to each record
for( Object resultNodeObj1 : resultNodes1 ) {
if (resultNodeObj1 == null || !(resultNodeObj1 instanceof ResultNode)) {
_logger.warn("Found a null/invalid ResultNode["+resultNodeObj1+"] in removal list merger");
continue;
}
// cast the QueryResult
ResultNode resultNode1 = ( ResultNode ) resultNodeObj1;
Map details1 = resultNode1.getDetails();
String rowId1 = ( String ) details1.get( _rowIdColumn );
_logger.debug( "Comparing rowIds: " + rowId1 + " vs. "+ rowId2 + " - using column: " + _rowIdColumn );
// do the comparison
if( rowId1 != null && rowId1.equals( rowId2 ) ) {
// record found add to the list
newQueryResults.add( resultNode1 );
break;
}
}
}
return newQueryResults;
}
private void findRowIdColumnKey( ResultNode resultNode ) {
_logger.debug( "Attempting to set the rowid column..." );
// try to find the row id only if it hasn't been set already
if( ! _isRowIdSet ) {
QueryResult queryResult = WebResultsUtil.getFirstQueryResult( resultNode );
if( queryResult != null ) {
WebLayerInfo layer = queryResult.getLayer();
if( layer != null ) {
GISResource resource = layer.getResource();
// grab the rows
List queryRows = resultNode.getChildren();
if( queryRows != null && queryRows.size() > 0 ){
ResultNode sampleValue = (ResultNode) queryRows.get( 0 );
Map details = sampleValue.getDetails();
_logger.debug( "Attempting to figure out the Resource Type: " + resource.getClass() );
// get the resource type
String resourceType = "";
if( resource instanceof AGSMapResource ) {
resourceType = RESOURCE_TYPE_AGS;
_logger.debug( "Found ResourceType = " + RESOURCE_TYPE_AGS );
}
else if( resource instanceof AIMSMapResource ) {
resourceType = RESOURCE_TYPE_AIMS;
_logger.debug( "Found ResourceType = " + RESOURCE_TYPE_AIMS );
} else {
resourceType = RESOURCE_TYPE_DEFAULT;
_logger.debug( "Using the default ResourceType= " + RESOURCE_TYPE_DEFAULT );
}
// grab the rowids
String rowIdStr = _rowIdMapByResource.get( resourceType );
String[] rowIds = parseRowIds( rowIdStr );
// loop through the rowIds and see which one exist if any
for( String rowId : rowIds ) {
// check if that row id exist
//NOTE: When using 'details.containsKey( rowId )' the contains method was not
// case insensitive. We had to iterate through the keys manually to compare.
String layerRowId = getRowIdColumn( rowId, details );
if( layerRowId != null ) {
// if it does then set it and return
_rowIdColumn = layerRowId;
_isRowIdSet = true;
_logger.info( "RowId column found [" + layerRowId + "].");
break;
}
}
if( ! _isRowIdSet ) {
_logger.warn( "Could not set the rowid for comparison. Layer: "
+ layer.getName() +", Did not have a rowid from configured list: "
+ rowIdStr + ", from Resource Type: " + resourceType +". " );
_logger.warn( "Please make sure this layer its appropriate rowid configured in the "
+ "WebResultsMerger configuration in order for 'Appendable' selections "
+ "to work properly" );
}
}
}
}
}
}
private String getRowIdColumn( String rowId, Map details ) {
String rowIdKey = null;
Set<String> keys = details.keySet();
Iterator<String> keysItr = keys.iterator();
// iterate thorugh the keys and compare
while( keysItr.hasNext() ) {
String key = keysItr.next();
if( rowId.equalsIgnoreCase( key ) ) {
rowIdKey = key;
}
}
return rowIdKey;
}
private String[] parseRowIds( String rowIdStr ) {
String[] rowIds = null;
if( rowIdStr != null ) {
rowIds = rowIdStr.split( "," );
}
return rowIds;
}
public Map<String,String> getRowIdMapByResource() {
return _rowIdMapByResource;
}
public void setRowIdMapByResource(Map<String,String> rowIdMapByResource) {
_rowIdMapByResource = rowIdMapByResource;
}
public String getRowIdColumn() {
return _rowIdColumn;
}
public void setRowIdColumn(String rowIdColumn) {
_rowIdColumn = rowIdColumn;
_isRowIdSet = true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -