/*------------------------------------------------------------------------------
  -
  - Copyright (c) 2015-2016 University of Padova, ITALY -  Intecs SpA 
  - All rights reserved. This program and the accompanying materials
  - are made available under the terms of the Eclipse Public License v2.0
  - which accompanies this distribution, and is available at
  - http://www.eclipse.org/legal/epl-v20.html
  -
  - Contributors:
  -
  - Alessandro Zovi azovi@math.unipd.it
  - Stefano Puri stefano.puri@intecs.it
  - Laura Baracchi laura.baracchi@intecs.it
  - Nicholas Pacini nicholas.pacini@intecs.it  
  -
  - Initial API and implementation and/or initial documentation
  ------------------------------------------------------------------------------*/package org.polarsys.chess.multicore.model;

import java.util.Arrays;

import org.eclipse.uml2.uml.InstanceSpecification;
import org.polarsys.chess.chessmlprofile.Predictability.DeploymentConfiguration.HardwareBaseline.CH_HwProcessor;


/**
 * The Class CHCore.
 *
 * @author Alessandro Zovi
 * 
 * CHCore represents the tuple <processor, core>.
 */
public final class CHCore {

	/** The processor. */
	private CH_HwProcessor processor;
	
	/** The name. */
	private String name;

	/**
	 * Instantiates a new CH core.
	 *
	 * @param processor the processor
	 * @param coreName the core name
	 */
	public CHCore(CH_HwProcessor processor, String coreName) {
		
		if (processor.getBase_InstanceSpecification() == null)
			throw new RuntimeException("Core can be instanced only by an InstanceSpecification!");
		
		this.processor = processor;
		this.name = coreName;
	}

	
	/**
	 * Gets the processor.
	 *
	 * @return the processor
	 */
	public CH_HwProcessor getProcessor() {
		return processor;
	}
	
	/**
	 * Gets the name.
	 *
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	
	/**
	 * Gets the qualified name.
	 *
	 * @return the qualified name
	 */
	public String getQualifiedName() {
		
		StringBuilder sb = new StringBuilder();
		return sb.append(processor.getBase_InstanceSpecification().getName()).append('_').append(name).toString();
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof CHCore)) return false;
		if(obj == this) return true;
		
		CHCore that = (CHCore) obj;
		return processor.getBase_InstanceSpecification().getName().equals(that.processor.getBase_InstanceSpecification().getName()) && name.equals(that.name);
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return getQualifiedName();
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		 return Arrays.hashCode(new Object[] {
				 processor.getBase_InstanceSpecification().getName().hashCode(),
		         name.hashCode(),
		    });
	}


	/**
	 * Gets the processor instance.
	 *
	 * @return the processor instance
	 */
	public InstanceSpecification getProcessorInstance() {
		return processor.getBase_InstanceSpecification();
	}
}
