/*
*
* 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:48 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.parameters;
import org.apache.log4j.Logger;
import org.jdom.Content;
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.interfaces.AccessCommandOpSpec;
import kr.ac.kaist.resl.ltk.generated.parameters.C1G2LockPayload;
import org.llrp.ltk.types.LLRPBitList;
import org.llrp.ltk.types.LLRPMessage;
import org.llrp.ltk.types.SignedShort;
import org.llrp.ltk.types.TLVParameter;
import org.llrp.ltk.types.TVParameter;
import org.llrp.ltk.types.UnsignedInteger;
import org.llrp.ltk.types.UnsignedShort;
import java.util.LinkedList;
import java.util.List;
/**
* This parameter contains the definition of the access privilege updates (read/write/permalock) to be performed in various locations of the memory. The five data fields for which we can define access control using the lock command are: Kill Password, Access Password, EPC memory, TID memory and User memory. The access privilege updates are expressed as a list of C1G2LockPayload Parameters, one for each memory location.The Access Password provides the password to enter the secured state. A Reader can perform a lock operation on a tag only if the tag is in the secured state. The tag enters the secured state only using the Access Password (if a non-zero value).
See also {@link <a href="http://www.epcglobalinc.org/standards/llrp/llrp_1_0_1-standard-20070813.pdf#page=108&view=fit">LLRP Specification Section 15.2.1.3.2.4</a>}
and {@link <a href="http://www.epcglobalinc.org/standards/llrp/llrp_1_0_1-standard-20070813.pdf#page=157&view=fit">LLRP Specification Section 16.3.1.3.2.4</a>}
*/
/**
* This parameter contains the definition of the access privilege updates (read/write/permalock) to be performed in various locations of the memory. The five data fields for which we can define access control using the lock command are: Kill Password, Access Password, EPC memory, TID memory and User memory. The access privilege updates are expressed as a list of C1G2LockPayload Parameters, one for each memory location.The Access Password provides the password to enter the secured state. A Reader can perform a lock operation on a tag only if the tag is in the secured state. The tag enters the secured state only using the Access Password (if a non-zero value).
See also {@link <a href="http://www.epcglobalinc.org/standards/llrp/llrp_1_0_1-standard-20070813.pdf#page=108&view=fit">LLRP Specification Section 15.2.1.3.2.4</a>}
and {@link <a href="http://www.epcglobalinc.org/standards/llrp/llrp_1_0_1-standard-20070813.pdf#page=157&view=fit">LLRP Specification Section 16.3.1.3.2.4</a>}
.
*/
public class C1G2Lock extends TLVParameter implements AccessCommandOpSpec {
public static final SignedShort TYPENUM = new SignedShort(344);
private static final Logger LOGGER = Logger.getLogger(C1G2Lock.class);
protected UnsignedShort opSpecID;
protected UnsignedInteger accessPassword;
protected List<C1G2LockPayload> c1G2LockPayloadList = new LinkedList<C1G2LockPayload>();
/**
* empty constructor to create new parameter.
*/
public C1G2Lock() {
}
/**
* Constructor to create parameter from binary encoded parameter
* calls decodeBinary to decode parameter.
* @param list to be decoded
*/
public C1G2Lock(LLRPBitList list) {
decodeBinary(list);
}
/**
* Constructor to create parameter from xml encoded parameter
* calls decodeXML to decode parameter.
* @param element to be decoded
*/
public C1G2Lock(Element element) throws InvalidLLRPMessageException {
decodeXML(element);
}
/**
* {@inheritDoc}
*/
public LLRPBitList encodeBinarySpecific() {
LLRPBitList resultBits = new LLRPBitList();
if (opSpecID == null) {
LOGGER.warn(" opSpecID not set");
throw new MissingParameterException(
" opSpecID not set for Parameter of Type C1G2Lock");
}
resultBits.append(opSpecID.encodeBinary());
if (accessPassword == null) {
LOGGER.warn(" accessPassword not set");
throw new MissingParameterException(
" accessPassword not set for Parameter of Type C1G2Lock");
}
resultBits.append(accessPassword.encodeBinary());
if (c1G2LockPayloadList == null) {
LOGGER.warn(" c1G2LockPayloadList not set");
//parameter has to be set - throw exception
throw new MissingParameterException(" c1G2LockPayloadList not set");
} else {
for (C1G2LockPayload field : c1G2LockPayloadList) {
resultBits.append(field.encodeBinary());
}
}
return resultBits;
}
/**
* {@inheritDoc}
*/
public Content encodeXML(String name, Namespace ns) {
// element in namespace defined by parent element
Element element = new Element(name, ns);
// child element are always in default LLRP namespace
ns = Namespace.getNamespace("llrp", LLRPConstants.LLRPNAMESPACE);
if (opSpecID == null) {
LOGGER.warn(" opSpecID not set");
throw new MissingParameterException(" opSpecID not set");
} else {
element.addContent(opSpecID.encodeXML("OpSpecID", ns));
}
if (accessPassword == null) {
LOGGER.warn(" accessPassword not set");
throw new MissingParameterException(" accessPassword not set");
} else {
element.addContent(accessPassword.encodeXML("AccessPassword", ns));
}
//parameters
if (c1G2LockPayloadList == null) {
LOGGER.warn(" c1G2LockPayloadList not set");
throw new MissingParameterException(" c1G2LockPayloadList not set");
}
for (C1G2LockPayload field : c1G2LockPayloadList) {
element.addContent(field.encodeXML(field.getClass().getName()
.replaceAll(field.getClass()
.getPackage()
.getName() +
".", ""), ns));
}
return element;
}
/**
* {@inheritDoc}
*/
protected void decodeBinarySpecific(LLRPBitList binary) {
int position = 0;
int tempByteLength;
int tempLength = 0;
int count;
SignedShort type;
int fieldCount;
Custom custom;
opSpecID = new UnsignedShort(binary.subList(position,
UnsignedShort.length()));
position += UnsignedShort.length();
accessPassword = new UnsignedInteger(binary.subList(position,
UnsignedInteger.length()));
position += UnsignedInteger.length();
// list of parameters
c1G2LockPayloadList = new LinkedList<C1G2LockPayload>();
LOGGER.debug("decoding parameter c1G2LockPayloadList ");
while (position < binary.length()) {
// store if one parameter matched
boolean atLeastOnce = false;
// look ahead to see type
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(C1G2LockPayload.TYPENUM)) {
if (binary.get(position)) {
// length can statically be determined for TV Parameters
tempLength = C1G2LockPayload.length();
}
c1G2LockPayloadList.add(new C1G2LockPayload(binary.subList(
position, tempLength)));
LOGGER.debug("adding C1G2LockPayload to c1G2LockPayloadList ");
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 (c1G2LockPayloadList.isEmpty()) {
LOGGER.warn(
"encoded message does not contain parameter for non optional c1G2LockPayloadList");
throw new MissingParameterException(
"C1G2Lock misses non optional parameter of type C1G2LockPayload");
}
}
/**
* {@inheritDoc}
*/
public void decodeXML(Element element) throws InvalidLLRPMessageException {
List<Element> tempList = null;
boolean atLeastOnce = false;
Custom custom;
Element temp = null;
// child element are always in default LLRP namespace
Namespace ns = Namespace.getNamespace(LLRPConstants.LLRPNAMESPACE);
temp = element.getChild("OpSpecID", ns);
if (temp != null) {
opSpecID = new UnsignedShort(temp);
}
element.removeChild("OpSpecID", ns);
temp = element.getChild("AccessPassword", ns);
if (temp != null) {
accessPassword = new UnsignedInteger(temp);
}
element.removeChild("AccessPassword", ns);
//parameter - not choices - no special actions needed
//we expect a list of parameters
c1G2LockPayloadList = new LinkedList<C1G2LockPayload>();
tempList = element.getChildren("C1G2LockPayload", ns);
if ((tempList == null) || tempList.isEmpty()) {
LOGGER.warn(
"C1G2Lock misses non optional parameter of type c1G2LockPayloadList");
throw new MissingParameterException(
"C1G2Lock misses non optional parameter of type c1G2LockPayloadList");
} else {
for (Element e : tempList) {
c1G2LockPayloadList.add(new C1G2LockPayload(e));
LOGGER.debug("adding C1G2LockPayload to c1G2LockPayloadList ");
}
}
element.removeChildren("C1G2LockPayload", ns);
if (element.getChildren().size() > 0) {
String message = "C1G2Lock has unknown element " +
((Element) element.getChildren().get(0)).getName();
throw new InvalidLLRPMessageException(message);
}
}
//setters
/**
* set opSpecID of type UnsignedShort .
* @param opSpecID to be set
*/
public void setOpSpecID(final UnsignedShort opSpecID) {
this.opSpecID = opSpecID;
}
/**
* set accessPassword of type UnsignedInteger .
* @param accessPassword to be set
*/
public void setAccessPassword(final UnsignedInteger accessPassword) {
this.accessPassword = accessPassword;
}
/**
* set c1G2LockPayloadList of type List <C1G2LockPayload>.
* @param c1G2LockPayloadList to be set
*/
public void setC1G2LockPayloadList(
final List<C1G2LockPayload> c1G2LockPayloadList) {
this.c1G2LockPayloadList = c1G2LockPayloadList;
}
// end setter
//getters
/**
* get opSpecID of type UnsignedShort.
* @return type UnsignedShort to be set
*/
public UnsignedShort getOpSpecID() {
return this.opSpecID;
}
/**
* get accessPassword of type UnsignedInteger.
* @return type UnsignedInteger to be set
*/
public UnsignedInteger getAccessPassword() {
return this.accessPassword;
}
/**
* get c1G2LockPayloadList of type List <C1G2LockPayload> .
* @return List <C1G2LockPayload>
*/
public List<C1G2LockPayload> getC1G2LockPayloadList() {
return c1G2LockPayloadList;
}
// end getters
//add methods
/**
* add element c1G2LockPayload of type C1G2LockPayload .
* @param c1G2LockPayload of type C1G2LockPayload
*/
public void addToC1G2LockPayloadList(C1G2LockPayload c1G2LockPayload) {
if (this.c1G2LockPayloadList == null) {
this.c1G2LockPayloadList = new LinkedList<C1G2LockPayload>();
}
this.c1G2LockPayloadList.add(c1G2LockPayload);
}
// end add
/**
* For TLV Parameter length can not be determined at compile time. This method therefore always returns 0.
* @return Integer always zero
*/
public static Integer length() {
return 0;
}
/**
* {@inheritDoc}
*/
public SignedShort getTypeNum() {
return TYPENUM;
}
/**
* {@inheritDoc}
*/
public String getName() {
return "C1G2Lock";
}
/**
* return string representation. All field values but no parameters are included
* @return String
*/
public String toString() {
String result = "C1G2Lock: ";
result += ", opSpecID: ";
result += opSpecID;
result += ", accessPassword: ";
result += accessPassword;
result = result.replaceFirst(", ", "");
return result;
}
}