All Data Items to XML

    This script finds all the data items both current and historical on all the assets of a model and outputs them as XML.

    Parameters:

    1. model_name
    2. from_time
    3. to_time

     

    import com.axeda.drm.sdk.Context
    import com.axeda.drm.sdk.device.ModelFinder
    import com.axeda.drm.sdk.device.Model
    import com.axeda.drm.sdk.device.DeviceFinder
    import com.axeda.drm.sdk.data.CurrentDataFinder
    import com.axeda.drm.sdk.device.Device
    import com.axeda.drm.sdk.data.HistoricalDataFinder
    import groovy.xml.MarkupBuilder
    
    /*
    * AllDataItems2XML.groovy
    *
    * Find all the historical and current data items for all assets in a given model.
    *
    * @param model_name        -   (REQ):Str name of the model.
    * @param from_time         -   (REQ):Long millisecond timestamp to begin query from.
    * @param to_time           -   (REQ):Long millisecond timestamp to end query at.
    *
    * @note from_time and to_time should be provided because it limits the query size.
    *
    * @author Sara Streeter <sstreeter@axeda.com>
    */
    
    def response = [:]
    def writer = new StringWriter()
    def xml = new MarkupBuilder(writer)
    
    // measure the script run time
    def timeProfiles = [:]
    def scriptStartTime = new Date()
    
    try {
    
    // getUserContext is supported as of release 6.1.5 and higher
        final def CONTEXT = Context.getUserContext()
    
    // confirm that required parameters have been provided
        validateParameters(actual: parameters, expected: ["model_name", "from_time", "to_time"])
    
    // find the model
        def modelFinder = new ModelFinder(CONTEXT)
        modelFinder.setName(parameters.model_name)
        Model model = modelFinder.findOne()
    
    // throw exception if no model found
        if (!model) {
            throw new Exception("No model found for ${parameters.model_name}.")
        }
    
    // find all assets of that model
        def assetFinder = new DeviceFinder(CONTEXT)
    
        assetFinder.setModel(model)
        def assets = assetFinder.findAll()
    
    // find the current and historical data values for each asset
    //note: since device will be set on the datafinders going forward, a dummy device is set on instantiation which is not actually stored
        def currentDataFinder = new CurrentDataFinder(CONTEXT, new Device(CONTEXT, "placeholder", model))
    
        def historicalDataFinder = new HistoricalDataFinder(CONTEXT, new Device(CONTEXT, "placeholder", model))
    
        historicalDataFinder.startDate = new Date(parameters.from_time as Long)
        historicalDataFinder.endDate = new Date(parameters.to_time as Long)
    
    // assemble the response
        xml.Response(){
    
            assets.each { Device asset ->
                currentDataFinder.device = asset
                def currentValueList = currentDataFinder.find()
    
                historicalDataFinder.device = asset
                def valueList = historicalDataFinder.find()
    
                Asset(){
                        id(asset.id.value)
                        name( asset.name)
                        serial_number(asset.serialNumber)
                        model_id( asset.model.id.value)
                        model_name(asset.model.name)
                        current_data(){
                            currentValueList.each{ data ->
                            timestamp( data?.getTimestamp()?.format("yyyyMMdd HH:mm"))
                             name(data?.dataItem?.name)
                             value( data?.asString())
                        }}
                        historical_data(){
                            valueList.each { data ->
                            timestamp( data?.getTimestamp()?.format("yyyyMMdd HH:mm"))
                             name(data?.dataItem?.name)
                             value( data?.asString())
                        }}
    
                }
    
            }
    
        }
    
    } catch (def ex) {
          xml.Response() {
        Fault {
              Code('Groovy Exception')
              Message(ex.getMessage())
              StringWriter sw = new StringWriter();
              PrintWriter pw = new PrintWriter(sw);
              ex.printStackTrace(pw);
              Detail(sw.toString())
            }
          }
    }
    
    
    return ['Content-Type': 'text/xml', 'Content': writer.toString()]
    
    private Map createTimeProfile(String label, Date startTime, Date endTime) {
        [
                (label): [
                        startTime: [timestamp: startTime.time, readable: startTime.toString()],
                        endTime: [timestamp: endTime.time, readable: endTime.toString()],
                        profile: [
                                elapsed_millis: endTime.time - startTime.time,
                                elapsed_secs: (endTime.time - startTime.time) / 1000
                        ]
                ]
        ]
    }
    
    private validateParameters(Map args) {
        if (!args.containsKey("actual")) {
            throw new Exception("validateParameters(args) requires 'actual' key.")
        }
        if (!args.containsKey("expected")) {
            throw new Exception("validateParameters(args) requires 'expected' key.")
        }
    
        def config = [
                require_username: false
        ]
    
        Map actualParameters = args.actual.clone() as Map
        List expectedParameters = args.expected
    
        config.each { key, value ->
            if (args.options?.containsKey(key)) {
                config[key] = args.options[key]
            }
        }
    
        if (!config.require_username) { actualParameters.remove("username") }
    
        expectedParameters.each { paramName ->
            if (!actualParameters.containsKey(paramName) || !actualParameters[paramName]) {
                throw new IllegalArgumentException(
                        "Parameter '${paramName}' was not found in the query; '${paramName}' is a reqd. parameter.")
            }
        }
    }
    

     

    Sample Output:

     

    <Response>
      <Asset>
      <id>2864</id>
      <name>keg24</name>
      <serial_number>keg24</serial_number>
      <model_id>1081</model_id>
      <model_name>Kegerator</model_name>
      <current_data>
      <timestamp>20111103 14:44</timestamp>
      <name>currKegPercentage</name>
      <value>34.0</value>
      <timestamp>20111103 14:38</timestamp>
      <name>currTempF</name>
      <value>43.0</value>
      </current_data>
      <historical_data />
      </Asset>
      <Asset>
      <id>2861</id>
      <name>keg28</name>
      <serial_number>keg28</serial_number>
      <model_id>1081</model_id>
      <model_name>Kegerator</model_name>
      <current_data>
      <timestamp />
      <name>currKegPercentage</name>
      <value>?</value>
      <timestamp>20111103 14:21</timestamp>
      <name>currTempF</name>
      <value>43.0</value>
      </current_data>
      <historical_data />
      </Asset>
      <Asset>
      <id>2863</id>
      <name>keg21</name>
      <serial_number>keg21</serial_number>
      <model_id>1081</model_id>
      <model_name>Kegerator</model_name>
      <current_data>
      <timestamp />
      <name>currKegPercentage</name>
      <value>?</value>
      <timestamp>20111103 14:39</timestamp>
      <name>currTempF</name>
      <value>42.0</value>
      </current_data>
      <historical_data />
      </Asset>
      <Asset>
      <id>2862</id>
      <name>keg25</name>
      <serial_number>keg25</serial_number>
      <model_id>1081</model_id>
      <model_name>Kegerator</model_name>
      <current_data>
      <timestamp>20111103 14:36</timestamp>
      <name>currKegPercentage</name>
      <value>34.0</value>
      <timestamp />
      <name>currTempF</name>
      <value>?</value>
      </current_data>
      <historical_data />
      </Asset>
      <Asset>
      <id>2867</id>
      <name>keg29</name>
      <serial_number>keg29</serial_number>
      <model_id>1081</model_id>
      <model_name>Kegerator</model_name>
      <current_data>
      <timestamp>20111103 14:48</timestamp>
      <name>currKegPercentage</name>
      <value>35.0</value>
      <timestamp />
      <name>currTempF</name>
      <value>?</value>
      </current_data>
      <historical_data />
      </Asset>
      <Asset>
      <id>2865</id>
      <name>keg27</name>
      <serial_number>keg27</serial_number>
      <model_id>1081</model_id>
      <model_name>Kegerator</model_name>
      <current_data>
      <timestamp>20111103 14:39</timestamp>
      <name>currKegPercentage</name>
      <value>34.0</value>
      <timestamp>20111103 14:44</timestamp>
      <name>currTempF</name>
      <value>42.0</value>
      </current_data>
      <historical_data />
      </Asset>
      <Asset>
      <id>2866</id>
      <name>keg23</name>
      <serial_number>keg23</serial_number>
      <model_id>1081</model_id>
      <model_name>Kegerator</model_name>
      <current_data>
      <timestamp>20111103 14:46</timestamp>
      <name>currKegPercentage</name>
      <value>34.0</value>
      <timestamp />
      <name>currTempF</name>
      <value>?</value>
      </current_data>
      <historical_data />
      </Asset>
    </Response>