/*

 * Delivered to the U.S. Government in Accordance with Contract FA8650-10-C-7080.

 *

 * EXPORT CONTROLLED

 * ECCN#   EAR99

 * Warning: This document contains technical data which is controlled under the

 * Bureau of Industry & Security's Export Administration Regulations and may not be

 * exported or re-exported without authorization by the Bureau of Industry & Security.

 * Diversion contrary to US law is prohibited.

 *

 * (c) 2011 United Technologies Corp.

 * Developed with the sponsorship of the Defense Advanced Research Projects Agency (DARPA).

 *

 * Permission is hereby granted, free of charge, to any person obtaining a copy of this data,

 * including any software or models in source or binary form, as well as any drawings, 

 * specifications, and documentation (collectively "the Data"), to deal in the Data without 

 * restriction, including without limitation the rights to use, copy, modify, merge, publish,

 * distribute, sublicense, and/or sell copies of the Data, and to permit persons to whom the Data

 * is furnished to do so, subject to the following conditions:

 * 

 * The above copyright notice and this permission notice shall be included in all copies or

 * substantial portions of the Data.

 *

 * THE DATA IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING

 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND

 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS, SPONSORS, DEVELOPERS, CONTRIBUTORS, OR

 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION

 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE DATA OR THE

 * USE OR OTHER DEALINGS IN THE DATA.

*/



package aee.engine.rule;



import java.util.List;



import org.jdom.Attribute;

import org.jdom.Element;



import aee.exception.AeeException;



/**

 * A term for an opcode

 */

public class OpTerm extends Term {

	private String opcode;

	

	/**

	 * Constructor

	 * @param operator  The operator element. Can be null to indicate no operator is present

	 * @param term      The term element

	 * @throws AeeException if any unexpected XML errors detected

	 */

	@SuppressWarnings("unchecked")

	public OpTerm(Element operator, Element term) throws AeeException {

		super(term);

		opcode = null;

		

		if (operator != null) {

			String expectedName = "operator";

			String eleName      = operator.getName();

			if (! eleName.equals(expectedName))

				throw new AeeException("Error: expecting a %s element, but received a %s element",

					                     expectedName, eleName);

		

			// type attribute is required

			List<Attribute> attributes = operator.getAttributes();

			for (Attribute attribute : attributes) {

				String attName = attribute.getName();

				String val     = attribute.getValue().trim();

			

				if (attName.equalsIgnoreCase("type")) {

					if (! "".equals(val))

						opcode = val;	

				

				} else {

					throw new AeeException("Unrecognized %s attribute in %s element",

						                     attName, expectedName);

				}

			}

		

			if (opcode == null)

				throw new AeeException("Missing value for %s element", expectedName);

		}

	}

	

	/**

	 * Report the opcode

	 * @return The opcode. If null, then there is NO opcode

	 */

	public String getOpcode() {

		return opcode;

	}



	/* (non-Javadoc)

	 * @see com.csc.aee.file.rule.Term#toExternalString()

	 */

	@Override

	public String[] toExternalString() {

		String[] ext = super.toExternalString();

		if (opcode != null) {

			String[] opext = new String[ext.length + 1];

			opext[0]       = opcode;

			System.arraycopy(ext, 0, opext, 1, ext.length);

			ext = opext;

		}

		return ext;

	}

	

}

