/* * * This file was generated by LLRP Code Generator * see http://llrp-toolkit.cvs.sourceforge.net/llrp-toolkit * for more information * Generated on: Mon Mar 10 14:26:46 KST 2014; * */ /* * Copyright 2007 ETH Zurich * * 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 kr.ac.kaist.resl.ltk.generated.messages; import org.apache.log4j.Logger; import org.jdom.Document; import org.jdom.Element; import org.jdom.Namespace; import org.llrp.ltk.exceptions.InvalidLLRPMessageException; import org.llrp.ltk.exceptions.MissingParameterException; import kr.ac.kaist.resl.ltk.generated.LLRPConstants; import kr.ac.kaist.resl.ltk.generated.parameters.Custom; import kr.ac.kaist.resl.ltk.generated.parameters.LLRPStatus; import kr.ac.kaist.resl.ltk.generated.parameters.ROSpec; import org.llrp.ltk.types.BitList; import org.llrp.ltk.types.LLRPBitList; import org.llrp.ltk.types.LLRPMessage; import org.llrp.ltk.types.SignedShort; import org.llrp.ltk.types.UnsignedInteger; import org.llrp.ltk.types.UnsignedShort; import java.util.LinkedList; import java.util.List; /** * This is the response by the Reader to a GET_ROSPECS command. If there are no ROSpecs configured at the Reader, the response is just the LLRPStatus parameter with the success code. Else, a list of ROSpec parameter is returned by the Reader, along with the success code in the LLRPStatus parameter. See also {@link <a href="http://www.epcglobalinc.org/standards/llrp/llrp_1_0_1-standard-20070813.pdf#page=55&view=fit">LLRP Specification Section 10.1.14</a>} and {@link <a href="http://www.epcglobalinc.org/standards/llrp/llrp_1_0_1-standard-20070813.pdf#page=121&view=fit">LLRP Specification Section 16.1.16</a>} */ public class GET_ROSPECS_RESPONSE extends LLRPMessage { public static final SignedShort TYPENUM = new SignedShort(36); private static final Logger LOGGER = Logger.getLogger(GET_ROSPECS_RESPONSE.class); public static final String RESPONSETYPE = ""; protected LLRPStatus lLRPStatus; protected List<ROSpec> rOSpecList = new LinkedList<ROSpec>(); /** * empty constructor to create new message * with LLRP version set to 1.0 (0x1). */ public GET_ROSPECS_RESPONSE() { setVersion(new BitList(0, 0, 1)); } /** * Constructor to create message from binary encoded message * calls decodeBinary to decode message. * @param list to be decoded */ public GET_ROSPECS_RESPONSE(final LLRPBitList list) throws InvalidLLRPMessageException { decodeBinary(list.toByteArray()); } /** * Constructor to create message from binary encoded message * calls decodeBinary to decode message. * @param byteArray representing message */ public GET_ROSPECS_RESPONSE(final byte[] byteArray) throws InvalidLLRPMessageException { decodeBinary(byteArray); } /** * Constructor to create message from xml encoded message * calls decodeXML to decode message. * @param document to be decoded */ public GET_ROSPECS_RESPONSE(final Document document) throws InvalidLLRPMessageException { decodeXML(document); } /** * {@inheritDoc} */ protected LLRPBitList encodeBinarySpecific() throws InvalidLLRPMessageException { LLRPBitList resultBits = new LLRPBitList(); if (lLRPStatus == null) { // single parameter, may not be null LOGGER.warn(" lLRPStatus not set"); throw new InvalidLLRPMessageException(" lLRPStatus not set"); } else { resultBits.append(lLRPStatus.encodeBinary()); } if (rOSpecList == null) { //just warn - it is optional LOGGER.info(" rOSpecList not set"); } else { for (ROSpec field : rOSpecList) { resultBits.append(field.encodeBinary()); } } return resultBits; } /** * {@inheritDoc} */ public Document encodeXML() throws InvalidLLRPMessageException { try { Namespace ns = Namespace.getNamespace("llrp", LLRPConstants.LLRPNAMESPACE); Element root = new Element("GET_ROSPECS_RESPONSE", ns); // Element root = new Element("GET_ROSPECS_RESPONSE"); root.addNamespaceDeclaration(Namespace.getNamespace("llrp", LLRPConstants.LLRPNAMESPACE)); if (version == null) { throw new InvalidLLRPMessageException("Version not set"); } else { root.setAttribute("Version", version.toInteger().toString()); } if (messageID == null) { throw new InvalidLLRPMessageException("MessageID not set"); } else { root.setAttribute("MessageID", messageID.toString(10)); } //parameters if (lLRPStatus == null) { LOGGER.info("lLRPStatus not set"); throw new MissingParameterException("lLRPStatus not set"); } else { root.addContent(lLRPStatus.encodeXML(lLRPStatus.getClass() .getSimpleName(), ns)); } if (rOSpecList == null) { LOGGER.info("rOSpecList not set"); } else { for (ROSpec field : rOSpecList) { root.addContent(field.encodeXML(field.getClass().getName() .replaceAll(field.getClass() .getPackage() .getName() + ".", ""), ns)); } } Document doc = new Document(root); if (isValidXMLMessage(doc, LLRPConstants.LLRPMESSAGESCHEMAPATH)) { return doc; } else { return null; } } catch (IllegalArgumentException e) { throw new InvalidLLRPMessageException(e.getMessage()); } catch (MissingParameterException e) { throw new InvalidLLRPMessageException(e.getMessage()); } } /** * {@inheritDoc} */ protected void decodeBinarySpecific(LLRPBitList binary) throws InvalidLLRPMessageException { int position = 0; int tempByteLength; int tempLength = 0; int count; SignedShort type; int fieldCount; Custom custom; // look ahead to see type // may be optional or exactly once type = null; tempByteLength = 0; tempLength = 0; try { // if first bit is one it is a TV Parameter if (binary.get(position)) { // do not take the first bit as it is always 1 type = new SignedShort(binary.subList(position + 1, 7)); } else { type = new SignedShort(binary.subList(position + RESERVEDLENGTH, TYPENUMBERLENGTH)); tempByteLength = new UnsignedShort(binary.subList(position + RESERVEDLENGTH + TYPENUMBERLENGTH, UnsignedShort.length())).toShort(); tempLength = 8 * tempByteLength; } } catch (IllegalArgumentException le) { // if an IllegalArgumentException is thrown, list was not long enough so the parameter is missing LOGGER.warn( "GET_ROSPECS_RESPONSE misses non optional parameter of type LLRPStatus"); throw new InvalidLLRPMessageException( "GET_ROSPECS_RESPONSE misses non optional parameter of type LLRPStatus"); } if (binary.get(position)) { // length can statically be determined for TV Parameters tempLength = lLRPStatus.length(); } if ((type != null) && type.equals(LLRPStatus.TYPENUM)) { lLRPStatus = new LLRPStatus(binary.subList(position, tempLength)); position += tempLength; LOGGER.debug( " lLRPStatus is instantiated with LLRPStatus with length" + tempLength); } else { LOGGER.warn( "GET_ROSPECS_RESPONSE misses non optional parameter of type LLRPStatus"); throw new InvalidLLRPMessageException( "GET_ROSPECS_RESPONSE misses non optional parameter of type LLRPStatus"); } // list of parameters rOSpecList = new LinkedList<ROSpec>(); LOGGER.debug("decoding parameter rOSpecList "); while (position < binary.length()) { // store if one parameter matched boolean atLeastOnce = false; // look ahead to see type // if first bit is one it is a TV Parameter if (binary.get(position)) { // do not take the first bit as it is always 1 type = new SignedShort(binary.subList(position + 1, 7)); } else { type = new SignedShort(binary.subList(position + RESERVEDLENGTH, TYPENUMBERLENGTH)); tempByteLength = new UnsignedShort(binary.subList(position + RESERVEDLENGTH + TYPENUMBERLENGTH, UnsignedShort.length())).toShort(); tempLength = 8 * tempByteLength; } //add parameter to list if type number matches if ((type != null) && type.equals(ROSpec.TYPENUM)) { //if first bit is 1 it is a TV Parameter if (binary.get(position)) { // length can statically be determined for TV Parameters tempLength = ROSpec.length(); } rOSpecList.add(new ROSpec(binary.subList(position, tempLength))); LOGGER.debug("adding ROSpec to rOSpecList "); atLeastOnce = true; position += tempLength; } if (!atLeastOnce) { //no parameter matched therefore we jump out of the loop break; } } //if list is still empty no parameter matched if (rOSpecList.isEmpty()) { LOGGER.info( "encoded message does not contain parameter for optional rOSpecList"); } } /** * {@inheritDoc} */ public void decodeXML(final Document document) throws InvalidLLRPMessageException { Element temp = null; Custom custom; // child element are always in default LLRP namespace Namespace ns = Namespace.getNamespace(LLRPConstants.LLRPNAMESPACE); try { isValidXMLMessage(document, LLRPConstants.LLRPMESSAGESCHEMAPATH); Element root = (Element) document.getRootElement().clone(); List<Element> tempList = null; // the version field is always 3 bit long // if the version attribute is not set in the LTK-XML message, // it is set to version 001 String versionAttribute = root.getAttributeValue("Version"); if (versionAttribute != null) { version = new BitList(3); version.setValue(new Integer(versionAttribute)); } else { version = new BitList(0, 0, 1); } messageID = new UnsignedInteger(root.getAttributeValue("MessageID")); //parameter - not choices - no special actions needed temp = root.getChild("LLRPStatus", ns); if (temp != null) { lLRPStatus = new LLRPStatus(temp); LOGGER.info( "setting parameter lLRPStatus for parameter GET_ROSPECS_RESPONSE"); } else { LOGGER.warn( "GET_ROSPECS_RESPONSE misses non optional parameter of type lLRPStatus"); throw new MissingParameterException( "GET_ROSPECS_RESPONSE misses non optional parameter of type lLRPStatus"); } root.removeChild("LLRPStatus", ns); //parameter - not choices - no special actions needed //we expect a list of parameters rOSpecList = new LinkedList<ROSpec>(); tempList = root.getChildren("ROSpec", ns); if ((tempList == null) || tempList.isEmpty()) { LOGGER.info( "GET_ROSPECS_RESPONSE misses optional parameter of type rOSpecList"); } else { for (Element e : tempList) { rOSpecList.add(new ROSpec(e)); LOGGER.debug("adding ROSpec to rOSpecList "); } } root.removeChildren("ROSpec", ns); if (root.getChildren().size() > 0) { String message = "GET_ROSPECS_RESPONSE has unknown element " + ((Element) root.getChildren().get(0)).getName(); throw new InvalidLLRPMessageException(message); } } catch (IllegalArgumentException e) { throw new InvalidLLRPMessageException(e.getMessage()); } catch (MissingParameterException e) { throw new InvalidLLRPMessageException(e.getMessage()); } } //setters /** * set lLRPStatus of type LLRPStatus. * @param lLRPStatus to be set */ public void setLLRPStatus(final LLRPStatus lLRPStatus) { this.lLRPStatus = lLRPStatus; } /** * set rOSpecList of type List <ROSpec>. * @param rOSpecList to be set */ public void setROSpecList(final List<ROSpec> rOSpecList) { this.rOSpecList = rOSpecList; } // end setter //getters /** * get lLRPStatus of type LLRPStatus . * @return LLRPStatus */ public LLRPStatus getLLRPStatus() { return lLRPStatus; } /** * get rOSpecList of type List <ROSpec> . * @return List <ROSpec> */ public List<ROSpec> getROSpecList() { return rOSpecList; } // end getters //add methods /** * add element rOSpec of type ROSpec . * @param rOSpec of type ROSpec */ public void addToROSpecList(ROSpec rOSpec) { if (this.rOSpecList == null) { this.rOSpecList = new LinkedList<ROSpec>(); } this.rOSpecList.add(rOSpec); } // end add @Override public String getResponseType() { return RESPONSETYPE; } @Override public String getName() { return "GET_ROSPECS_RESPONSE"; } /** * return uniuque type number. * @return SignedShort holding unique type number */ public SignedShort getTypeNum() { return TYPENUM; } }