/** * Copyright (c) 2011-2014, OpenIoT * * This file is part of OpenIoT. * * OpenIoT is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * OpenIoT 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 OpenIoT. If not, see <http://www.gnu.org/licenses/>. * * Contact: OpenIoT mailto: info@openiot.eu * @author Timotee Maret * @author Ali Salehi */ package org.openiot.gsn.acquisition2.wrappers; import org.openiot.gsn.acquisition2.messages.DataMsg; import org.openiot.gsn.beans.DataField; import java.io.Serializable; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import org.apache.log4j.Logger; public class MigMessageWrapperProcessor extends SafeStorageAbstractWrapper { private MigMessageParameters parameters = null; private Class<?> classTemplate = null; private Constructor<?> messageConstructor = null; private final transient Logger logger = Logger.getLogger( MigMessageWrapperProcessor.class ); public boolean initialize() { logger.warn("tinyos processor wrapper initialize started..."); if (! super.initialize()) return false; try { parameters = new MigMessageParameters () ; parameters.initParameters(getActiveAddressBean()); // classTemplate = Class.forName(parameters.getTinyosMessageName()); parameters.buildOutputStructure(classTemplate, new ArrayList<DataField>(), new ArrayList<Method>()); // messageConstructor = classTemplate.getConstructor(byte[].class) ; } catch (RuntimeException e) { logger.error(e.getMessage()); return false; } catch (ClassNotFoundException e) { logger.error("Unable to find the >" + parameters.getTinyosMessageName() + "< class."); return false; } catch (NoSuchMethodException e) { logger.error("Unable to find the >" + parameters.getTinyosMessageName() + "(byte[]) constructor.<"); return false; } logger.warn("tinyos processor wrapper initialize completed..."); return true; } public boolean messageToBeProcessed(DataMsg dataMessage) { Method getter = null; Object res = null; Serializable resarray = null; byte[] rawmsg = (byte[]) dataMessage.getData()[0]; try { if (logger.isDebugEnabled()) { StringBuilder rawmsgoutput = new StringBuilder (); for (int i = 0 ; i < rawmsg.length ; i++) { rawmsgoutput.append(rawmsg[i]); rawmsgoutput.append(" "); } logger.debug("new message to be processed: " + rawmsgoutput.toString()); } Object msg = (Object) messageConstructor.newInstance(rawmsg); ArrayList<Serializable> output = new ArrayList<Serializable> () ; Iterator<Method> iter = parameters.getGetters().iterator(); while (iter.hasNext()) { getter = (Method) iter.next(); getter.setAccessible(true); res = getter.invoke(msg); if (getter.getReturnType().isArray()) { for(int i = 0 ; i < Array.getLength(res) ; i++) { resarray = (Serializable) Array.get(res, i); output.add(resarray); logger.debug("> " + getter.getName() + ": " + resarray); } } else { output.add((Serializable)res); logger.debug("> " + getter.getName() + ": " + res); } } // Update TIMED field if (parameters.getTimedFieldGetter() != null) { logger.debug("Update TIMED field"); parameters.getTimedFieldGetter().setAccessible(true); Long ts = (Long) parameters.getTimedFieldGetter().invoke(msg); postStreamElement(ts.longValue(), output.toArray(new Serializable[] {})); } else { postStreamElement(output.toArray(new Serializable[] {})); } } catch (InstantiationException e) { logger.error("Unable to instanciate the message"); } catch (IllegalAccessException e) { logger.error("Illegal Access to >" + getter + "<"); } catch (IllegalArgumentException e) { logger.error("Illegal argument to >" + getter + "<"); } catch (InvocationTargetException e) { logger.error("Invocation Target Exception " + e.getMessage()); } catch (SecurityException e) { logger.error("Security Exception " + e.getMessage()); } return true; } public DataField[] getOutputFormat() { return parameters.getOutputStructure() ; } public boolean isTimeStampUnique() { return false; } }