/** @file
  Java class FpdModuleIdentification is used to present a module identification
  from BaseName, GUID, Version, PackageName, and ARCH. 
 
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
package org.tianocore.build.id;


/**
  This class is used to identify a module with Module Guid, Module Version, 
  Package Guid, Package Version and Arch. 
  
  @since GenBuild 1.0
**/
public class FpdModuleIdentification {
    
    private String arch;
    
    private String fvBinding = "NULL"; // Optional
    
    private ModuleIdentification module;
    
    /**
      Constructor Method. 
      
      @param arch Build Arch
      @param fvBinding Belong to what FVs
      @param module ModuleIdentification
    **/
    public FpdModuleIdentification(String arch, String fvBinding, ModuleIdentification module){
        this.arch = arch;
        this.fvBinding = fvBinding;
        this.module = module;
    }
    
    /**
      Constructor Method. 
    
      @param arch Build Arch
      @param module ModuleIdentification
    **/
    public FpdModuleIdentification(ModuleIdentification module, String arch){
        this.arch = arch;
        this.module = module;
    }
    /**
      Override java.lang.Object#equals. 
      
      <p>Currently, use BaseName and ARCH to identify a module. It will enhance
      in the next version. </p>
      
      @see java.lang.Object#equals(java.lang.Object)
    **/
    public boolean equals(Object obj) {
        if (obj instanceof FpdModuleIdentification) {
            FpdModuleIdentification moduleIdObj = (FpdModuleIdentification)obj;
            if ( module.equals(moduleIdObj.module) && arch.equalsIgnoreCase(moduleIdObj.arch)) {
                return true;
            }
            return false;
        }
        else {
            return false;
        }
    }

    /**
      @param fvBinding
    **/
    public void setFvBinding(String fvBinding) {
        this.fvBinding = fvBinding;
    }

    /* (non-Javadoc)
      @see java.lang.Object#toString()
    **/
    public String toString(){
        return arch + ":" + module;
    }

    /**
      @return String fvBinding
    **/
    public String getFvBinding() {
        return fvBinding;
    }

    /**
      @return ModuleIdentification module ID
    **/
    public ModuleIdentification getModule() {
        return module;
    }

    /**
      @param module Module Identification
    **/
    public void setModule(ModuleIdentification module) {
        this.module = module;
    }

    /**
      @return String arch
    **/
    public String getArch() {
        return arch;
    }

    /**
      @param arch build ARCH
    **/
    public void setArch(String arch) {
        this.arch = arch;
    }
    
    /* (non-Javadoc)
      @see java.lang.Object#hashCode()
    **/
    public int hashCode(){
        return module.hashCode();
    }
}
