⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webresultsmergerimpl.java

📁 esri的ArcGIS Server超级学习模板程序(for java)
💻 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 + -