/** * Copyright 2007-2008 University Of Southern California * * 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 edu.isi.pegasus.planner.classes; import edu.isi.pegasus.common.logging.LogManagerFactory; import edu.isi.pegasus.common.logging.LogManager; import edu.isi.pegasus.planner.catalog.transformation.TransformationCatalogEntry; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * This is a data class to store the TCMAP for a particular dag. * This data class is populated and maintained in the TCMapper and is queried * from the Interpool Engine and site selectors. * * The TCMAP is a hashmap which maps an lfn to a Map which contains keys as * siteids and values as List of TransformationCatalogEntry objects * * TCMAP= lfn1 ---> MAP1 * lfn2 ---> MAP2 * * * MAP1 = site1 ---> List1 * site2 ---> List2 * * List1 = TCE1 * TCE2 * TCEn * * * @author Gaurang Mehta * @version $Revision$ */ public class TCMap { /** * The TCMap for a dag is stored in this HashMap. */ private Map mTCMap; private LogManager mLogger; /** * Default constructor. Initializes the tcmap to 10 lfns. */ public TCMap() { mLogger = LogManagerFactory.loadSingletonInstance(); mTCMap = new HashMap( 10 ); } /** * Returns a HashMap of sites as keys and a List of TransformationCatalogEntry object as values. * @param fqlfn String The fully qualified logical transformation name for which you want the map. * @return Map Returns <B>NULL</B> if the transformation does not exist in the map. * @see org.griphyn.common.catalog.TransformationCatalogEntry */ public Map getSiteMap( String fqlfn ) { return mTCMap.containsKey( fqlfn ) ? ( Map ) mTCMap.get( fqlfn ) : null; } /** * This method allows to associate a site map with a particular logical transformation * @param fqlfn String The transformation for which the sitemap is to be stored * @param sitemap Map The sitemap that is to be stored. It is a hashmap with key * as the siteid and value as a list of TranformationCatalogEntry objects * @return boolean * @see org.griphyn.common.catalog.TransformationCatalogEntry */ public boolean setSiteMap( String fqlfn, Map sitemap ) { mTCMap.put( fqlfn, sitemap ); return true; } /** * Returns a List of siteid's that are valid for a particular lfn. * @param fqlfn String * @return List */ public List getSiteList( String fqlfn ) { List results = null; if ( mTCMap.containsKey( fqlfn ) ) { return new ArrayList( ( ( Map ) mTCMap.get( fqlfn ) ).keySet() ); } return results; } /** * Returns a list of siteid's that are valid for a particular lfn and * among a list of input sites * @param fqlfn The logical name of the transformation * @param sites The list of siteids * @return the list of siteids which are valid. */ public List getSiteList( String fqlfn, List sites ) { List results = new ArrayList() ; if ( mTCMap.containsKey( fqlfn ) ) { for ( Iterator i = (( Map ) mTCMap.get( fqlfn )).keySet().iterator(); i.hasNext(); ) { String site = ( String ) i.next(); if ( sites.contains( site ) ) { results.add( site ); } } } return results.isEmpty() ? null : results; } /** * This method returns a list of TransformationCatalogEntry objects * for a given transformation and siteid * @param fqlfn String The fully qualified logical name of the transformation * @param siteid String The siteid for which the Entries are required * @return List returns NULL if no entries exist. */ public List getSiteTCEntries( String fqlfn, String siteid ) { Map sitemap = null; List tcentries = null; if ( mTCMap.containsKey( fqlfn ) ) { sitemap = ( Map ) mTCMap.get( fqlfn ); if ( sitemap.containsKey( siteid ) ) { tcentries = ( List ) sitemap.get( siteid ); } else { mLogger.log( "The TCMap does not contain the site \"" + siteid + "\" for the transformation \"" + fqlfn + "\"", LogManager.DEBUG_MESSAGE_LEVEL ); } } else { mLogger.log( "The TCMap does not contain the transformation \"" + fqlfn + "\"", LogManager.DEBUG_MESSAGE_LEVEL ); } return tcentries; } /** * Retrieves all the entries matching a particular lfn for the sites * passed. * * @param fqlfn the fully qualified logical name * @param sites the list of siteID's for which the entries are required. * * @return a map indexed by site names. Each value is a collection of * <code>TransformationCatalogEntry</code> objects. Returns null in case * of no entry being found. */ public Map getSitesTCEntries( String fqlfn, List sites ) { Map m = this.getSiteMap( fqlfn ); Set siteIDS = new HashSet( sites ); String site = null; if ( m == null ) { return null; } Map result = new HashMap( siteIDS.size() ); for ( Iterator it = m.keySet().iterator(); it.hasNext(); ) { site = ( String ) it.next(); if ( siteIDS.contains( site ) ) { result.put( site, m.get( site ) ); } } //returning NULL only to maintain semantics //for rest of mapper operations. Gaurang //should change to return empty map return result.isEmpty() ? null : result; } /** * This method allows to add a TransformationCatalogEntry object in the map * to a particular transformation for a particular site * @param fqlfn String The fully qualified logical transformation * @param siteid String The site for which the TransformationCatalogEntry is valid * @param entry TransformationCatalogEntry The Transformation CatalogEntry object to be added. * @return boolean */ public boolean setSiteTCEntries( String fqlfn, String siteid, TransformationCatalogEntry entry ) { Map sitemap = null; List tcentries = null; if ( mTCMap.containsKey( fqlfn ) ) { sitemap = ( Map ) mTCMap.get( fqlfn ); } else { sitemap = new HashMap( 10 ); setSiteMap( fqlfn, sitemap ); } if ( sitemap.containsKey( siteid ) ) { tcentries = ( List ) sitemap.get( siteid ); } else { tcentries = new ArrayList( 10 ); sitemap.put( siteid, tcentries ); } tcentries.add( entry ); return true; } /** * Returns the textual description of the contents of the object * @return String */ public String toString() { StringBuffer sb = new StringBuffer(); for ( Iterator i = mTCMap.keySet().iterator(); i.hasNext(); ) { sb.append( toString( ( String ) i.next() ) ); } return sb.toString(); } /** * Returns a textual description of the object. * @param lfn String * @return the textual description. */ public String toString( String lfn ) { StringBuffer sb = new StringBuffer(); sb.append( "LFN = " + lfn + "\n" ); sb.append( "\tSite map\n" ); Map sitemap = ( Map ) mTCMap.get( lfn ); for ( Iterator j = sitemap.keySet().iterator(); j.hasNext(); ) { String site = ( String ) j.next(); sb.append( "\t\tSite=" + site + "\n" ); List tc = ( List ) sitemap.get( site ); for ( Iterator k = tc.iterator(); k.hasNext(); ) { TransformationCatalogEntry tcentry = ( TransformationCatalogEntry ) k.next(); sb.append( "\t\t\tPfn=" + tcentry.getPhysicalTransformation() + "\n" ); sb.append( "\t\t\tPfn site=" + tcentry.getResourceId() + "\n" ); } } return sb.toString(); } }