/* * Copyright (C) 2007 ETH Zurich * * This file is part of Fosstrak (www.fosstrak.org). * * Fosstrak is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * Fosstrak is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Fosstrak; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA */ package org.fosstrak.ale.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.ValidationEventHandler; import javax.xml.bind.helpers.DefaultValidationEventHandler; import org.apache.log4j.Logger; import org.fosstrak.ale.wsdl.alelr.epcglobal.AddReaders; import org.fosstrak.ale.wsdl.alelr.epcglobal.RemoveReaders; import org.fosstrak.ale.wsdl.alelr.epcglobal.SetProperties; import org.fosstrak.ale.wsdl.alelr.epcglobal.SetReaders; import org.fosstrak.ale.xsd.ale.epcglobal.CCReports; import org.fosstrak.ale.xsd.ale.epcglobal.CCSpec; import org.fosstrak.ale.xsd.ale.epcglobal.ECReports; import org.fosstrak.ale.xsd.ale.epcglobal.ECSpec; import org.fosstrak.ale.xsd.ale.epcglobal.LRProperty; import org.fosstrak.ale.xsd.ale.epcglobal.LRSpec; import org.fosstrak.ale.xsd.ale.epcglobal.TMFixedFieldListSpec; import org.fosstrak.ale.xsd.ale.epcglobal.TMSpec; import org.fosstrak.ale.xsd.ale.epcglobal.TMVariableFieldListSpec; import org.jdom.Document; import org.jdom.input.SAXBuilder; import org.llrp.ltk.generated.LLRPMessageFactory; import org.llrp.ltk.generated.messages.ADD_ACCESSSPEC; import org.llrp.ltk.generated.messages.ADD_ROSPEC; import org.llrp.ltk.types.LLRPMessage; /** * This class provides some methods to deserialize ec specifications and reports. * * @author swieland * @author regli * @author julian roche * @author wafa.soubra@orange.com */ public class DeserializerUtil { // hash-map for JAXB context. private static final Map<String, JAXBContext> s_context = new ConcurrentHashMap<String, JAXBContext> (); /** logger. */ private static final Logger LOG = Logger.getLogger(DeserializerUtil.class); /** * This method deserializes an ec specification from an input stream. * * @param inputStream to deserialize * @throws Exception upon error. * @return ec specification */ public static ECSpec deserializeECSpec(InputStream inputStream) throws Exception { return (ECSpec) unmarshall("org.fosstrak.ale.xsd.ale.epcglobal", inputStream, null, ECSpec.class); } /** * This method deserializes an ec specification from a file. * * @param pathName of the file containing the ec specification * @return ec specification * @throws Exception upon error. */ public static ECSpec deserializeECSpec(String pathName) throws Exception { return deserializeECSpec(new FileInputStream(new File(pathName))); } /** * This method deserializes an cc specification from an input stream. * * @param inputStream to deserialize * @throws Exception upon error. * @return cc specification */ public static CCSpec deserializeCCSpec(InputStream inputStream) throws Exception { return (CCSpec) unmarshall("org.fosstrak.ale.xsd.ale.epcglobal", inputStream, null, CCSpec.class); } /** * This method deserializes an cc specification from a file. * * @param pathName of the file containing the cc specification * @return ec specification * @throws Exception upon error. */ public static TMSpec deserializeTMSpec(String pathName) throws Exception { return deserializeTMSpec(new FileInputStream(new File(pathName))); } /** * This method deserializes an cc specification from an input stream. * * @param inputStream to deserialize * @throws Exception upon error. * @return cc specification */ public static TMSpec deserializeTMSpec(InputStream inputStream) throws Exception { return (TMSpec) unmarshall("org.fosstrak.ale.xsd.ale.epcglobal", inputStream, null, TMSpec.class); } /** * This method deserializes an cc specification from a file. * * @param pathName of the file containing the cc specification * @return ec specification * @throws Exception upon error. */ public static CCSpec deserializeCCSpec(String pathName) throws Exception { return deserializeCCSpec(new FileInputStream(new File(pathName))); } /** * This method deserializes a LRSpec from an input stream. * @param inputStream to deserialize * @throws Exception upon error. * @return LRSpec */ public static LRSpec deserializeLRSpec(InputStream inputStream) throws Exception { return (LRSpec) unmarshall("org.fosstrak.ale.wsdl.alelr.epcglobal", inputStream, null, LRSpec.class); } /** * This method deserializes a LRSpec from an file path. * @param pathName to deserialize * @return LRSpec * @throws Exception upon error. */ public static LRSpec deserializeLRSpec(String pathName) throws Exception { return deserializeLRSpec(new FileInputStream(new File(pathName))); } /** * * This method deserializes a LRProperty from an input stream. * @param inputStream to deserialize * @throws Exception upon error. * @return LRProperty */ public static LRProperty deserializeLRProperty(InputStream inputStream) throws Exception { return (LRProperty) unmarshall("org.fosstrak.ale.wsdl.alelr.epcglobal", inputStream, null, LRProperty.class); } /** * This method deserializes a SetProperties from a file. * @param pathName the path to the file to be deserialized. * @return SetProperties. * @throws Exception upon error. */ public static SetProperties deserializeSetProperties(String pathName) throws Exception { return (SetProperties) unmarshall("org.fosstrak.ale.wsdl.alelr.epcglobal", pathName, null, SetProperties.class); } /** * This method deserializes a RemoveReaders from a file. * @param pathName the path to the file to be deserialized. * @return RemoveReaders. * @throws Exception upon error. */ public static RemoveReaders deserializeRemoveReaders(String pathName) throws Exception { return (RemoveReaders) unmarshall("org.fosstrak.ale.wsdl.alelr.epcglobal", pathName, null, RemoveReaders.class); } /** * This method deserializes a SetReaders from a file. * @param pathName the path to the file to be deserialized. * @return SetReaders. * @throws Exception upon error. */ public static SetReaders deserializeSetReaders(String pathName) throws Exception { return (SetReaders) unmarshall("org.fosstrak.ale.wsdl.alelr.epcglobal", pathName, null, SetReaders.class); } /** * This method deserializes a AddReaders from a file. * @param pathName the path to the file to be deserialized. * @return AddReaders. * @throws Exception upon error. */ public static AddReaders deserializeAddReaders(String pathName) throws Exception { return (AddReaders) unmarshall("org.fosstrak.ale.wsdl.alelr.epcglobal", pathName, null, AddReaders.class); } /** * This method deserializes ECReports from a file. * @param pathName the path to the file to be deserialized. * @return ECReports. * @throws Exception upon error. */ public static ECReports deserializeECReports(InputStream in) throws Exception { return (ECReports) unmarshall("org.fosstrak.ale.xsd.ale.epcglobal", in, null, ECReports.class); } /** * This method deserializes CCReports from a file. * @param pathName the path to the file to be deserialized. * @return CCReports. * @throws Exception upon error. */ public static CCReports deserializeCCReports(InputStream in) throws Exception { return (CCReports) unmarshall("org.fosstrak.ale.xsd.ale.epcglobal", in, null, CCReports.class); } /** * This method deserializes tm ec specification from an input stream. * * @author limg00n * @param inputStream to deserialize * @return tm specification * @throws Exception if deserialization fails */ public static TMFixedFieldListSpec deserializeTMFixedFieldListSpec(InputStream inputStream) throws Exception { TMFixedFieldListSpec spec = null; try { String JAXB_CONTEXT = "org.fosstrak.ale.xsd.ale.epcglobal"; // initialize jaxb context and unmarshaller JAXBContext context = JAXBContext.newInstance(JAXB_CONTEXT); Unmarshaller unmarshaller = context.createUnmarshaller(); unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); spec = ((JAXBElement<TMFixedFieldListSpec>) unmarshaller.unmarshal(inputStream)).getValue(); } catch (JAXBException e) { e.printStackTrace(); } return spec; } /** * This method deserializes tm ec specification from an input stream. * * @author limg00n * @param inputStream to deserialize * @return tm specification * @throws Exception if deserialization fails */ public static TMVariableFieldListSpec deserializeTMVariableFieldListSpec(InputStream inputStream) throws Exception { TMVariableFieldListSpec spec = null; try { String JAXB_CONTEXT = "org.fosstrak.ale.xsd.ale.epcglobal"; // initialize jaxb context and unmarshaller JAXBContext context = JAXBContext.newInstance(JAXB_CONTEXT); Unmarshaller unmarshaller = context.createUnmarshaller(); unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); spec = ((JAXBElement<TMVariableFieldListSpec>) unmarshaller.unmarshal(inputStream)).getValue(); } catch (JAXBException e) { e.printStackTrace(); } return spec; } /** * unmarshalles the object from the stream. if errors occur, they are written to the log. * @param unmarshaller the unmarshaller. * @param validationEventHandler validation event handler. if null, the default validation handler is added. * @param of the output stream. * @return the unmarshalled object. * @throws Exception upon error. * @throws Exception upon error. */ private static Object unmarshall(String jaxbContext, Object istr, ValidationEventHandler validationEventHandler, Class<?> object) throws Exception { try { ValidationEventHandler handler = validationEventHandler; if (null == handler) handler = new DefaultValidationEventHandler(); Unmarshaller unmarshaller = getUnmarshaller(jaxbContext, handler); InputStream fif = null; if (istr instanceof String) { fif = new FileInputStream((String) istr); } else if (istr instanceof InputStream) { fif = (InputStream) istr; } else { throw new Exception("Wrong writer provided."); } return ((JAXBElement<?>) unmarshaller.unmarshal(fif)).getValue(); } catch (Exception e) { LOG.error(String.format("Caught exception during unmarshalling:\n%s", e.getMessage())); throw e; } } /** * creates a unmarshaller on pooled JAXBContext instances. * @param jaxbContext the context on which to create a unmarshaller. * @param validationEventHandler validation event handler. * @return the unmarshaller. * @throws JAXBException when unable to create the unmarshaller. */ private static Unmarshaller getUnmarshaller(String jaxbContext, ValidationEventHandler validationEventHandler) throws JAXBException { JAXBContext context = null; synchronized (s_context) { context = s_context.get(jaxbContext); if (null == context) { context = JAXBContext.newInstance(jaxbContext); s_context.put(jaxbContext, context); } } Unmarshaller unmarshaller = null; synchronized (context) { unmarshaller = context.createUnmarshaller(); } unmarshaller.setEventHandler(validationEventHandler); return unmarshaller; } /** * ORANGE: This method deserializes an ADD_ROSPEC from an input stream. * @param inputStream to deserialize * @return ADD_ROSPEC * @throws Exception if deserialization fails */ public static ADD_ROSPEC deserializeAddROSpec(InputStream inputStream) throws Exception { LOG.debug("Start deserializeAddROSpec .... "); Document document = new SAXBuilder().build(inputStream); LOG.debug("Get jdom Document with SAXBuilder"); LLRPMessage message = LLRPMessageFactory.createLLRPMessage(document); if (message != null ) { LOG.debug("LLRP Message created"); } else { LOG.debug("LLRP Message is null !!!!!"); } ADD_ROSPEC addRoSpec = (ADD_ROSPEC)message; LOG.debug("End of deserializeAddROSpec"); return addRoSpec; } /** * ORANGE: This method deserializes an ADD_ROSPEC from an file path. * @param pathName to deserialize * @return ADD_ROSPEC * @throws Exception if deserialization fails */ public static ADD_ROSPEC deserializeAddROSpec(String pathName) throws FileNotFoundException, Exception { return deserializeAddROSpec(new FileInputStream(new File(pathName))); } /** * ORANGE:This method deserializes an ADD_ACCESSSPEC from an input stream. * @param inputStream to deserialize * @return ADD_ACCESSSPEC * @throws Exception if deserialization fails */ public static ADD_ACCESSSPEC deserializeAddAccessSpec(InputStream inputStream) throws Exception { LOG.debug("Start deserializeAddAccessSpec .... "); Document document = new SAXBuilder().build(inputStream); LOG.debug("Get jdom Document with SAXBuilder"); LLRPMessage message = LLRPMessageFactory.createLLRPMessage(document); if (message != null ) { LOG.debug("LLRP Message created"); } else { LOG.debug("LLRP Message is null !!!!!"); } ADD_ACCESSSPEC addAccesSpec = (ADD_ACCESSSPEC)message; LOG.debug("End of deserializeAddAccessSpec"); return addAccesSpec; } /** * ORANGE: This method deserializes an ADD_ACCESSSPEC from an file path. * @param pathName to deserialize * @return ADD_ACCESSSPEC * @throws Exception if deserialization fails */ public static ADD_ACCESSSPEC deserializeAddAccessSpec(String pathName) throws FileNotFoundException, Exception { return deserializeAddAccessSpec(new FileInputStream(new File(pathName))); } }