/* * Copyright 2010 kk-electronic a/s. * * This file is part of KKPortal. * * KKPortal 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, either version 3 of the License, or * (at your option) any later version. * * KKPortal 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 KKPortal. If not, see <http://www.gnu.org/licenses/>. * */ package com.kk_electronic.kkportal.scada; import java.util.List; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; import com.kk_electronic.kkportal.core.AbstractModule; import com.kk_electronic.kkportal.scada.IDataElementService.DataElementValue; import com.kk_electronic.kkportal.scada.dto.Result; /** * @author Jes Andersen * * This class is an example on how you can access a Scada service using * the new rpc system. The system consists of three parts. The * underlying framework, some interfaces and some dispatchers. * * Most Developers should only care about the interfaces. * * In this example {@link IDataElementService} is used to fetch the * current values and simply displayed as simple text. * * This example violates MVP isolation and calls the back-end directly, * but this is done to make the example smaller. If you need an example * for how this is done feel free to contact me. */ public class ScadaDataElementExample extends AbstractModule { /** * The {@link HTML} is where we place our load text, and put the answer when * we eventually get it. */ HTML label = new HTML("Fetching values"); @Inject public ScadaDataElementExample(IDataElementService scada) { /* * All rpc calls are asynchronous since we must not halt the ui while * fetching data. */ AsyncCallback<Result<List<DataElementValue>>> callback = new AsyncCallback<Result<List<DataElementValue>>>() { @Override public void onSuccess(Result<List<DataElementValue>> result) { /** * We create a SafeHtmlBuilder to create the new HTML of label * The result is similar to this: * * <pre> * Current W=48.8[A] * Frequence=49.928[Hz] * Gearoil temperature=46.5[C] * </pre> */ SafeHtmlBuilder sb = new SafeHtmlBuilder(); /** * This is an example of the json that gets transferred from * scada. While not nessesary to know it helps to understand the * structure * * <pre> * { * "Errors": null, * "TotalResults": 37, * "Result": [ * { * "StationGUID": "b64af73e-5f2c-464b-addf-7912542ccdf0", * "ElementName": null, * "RepresentationGUID": "cfd108bf-557f-4103-9176-1895bacda8b5", * "TimeStamp": "0001-01-01 00:00:00.0000000", * "Value": "N/M", * "MappingName": "DCLink voltage", * "ElementFullName": null, * "MappingGUID": "fd8e1338-e210-428d-9c54-1d3baca9426c", * "Units": null, * "ElementGUID": "00000000-0000-0000-0000-000000000000", * "EnumValueName": null * }, * ... * } * </pre> * * The {@link com.kk_electronic.kkportal.scada.dto.Result<T>} * object corresponds to the outermost element in the json, and * the Result element is a List<DataElementValue> */ // Iteration is done over the results for (DataElementValue i : result.Result) { //If we have both a name and a value we add it as name=value if (i.MappingName != null && i.Value != null) { sb.appendEscaped(i.MappingName); sb.append('='); sb.appendEscaped(i.Value); //We optionally appends the unit if defined as [unit] if (i.Units != null) { sb.append('[').appendEscaped(i.Units).append(']'); } sb.appendHtmlConstant("<br />"); } } //and finally we update the label to contain the result label.setHTML(sb.toSafeHtml()); } @Override public void onFailure(Throwable caught) { // If the call failed we simply notify the user label.setText("Call failed"); } }; /* * When calling the server, we add some parameters it expect, and use our previous callback. * as a special note here we have stripped UserKey from the interface. That responsibility is delegated to another class. * For more info read the documentation on the interface */ scada .GetDataElementValue( "b64af73e-5f2c-464b-addf-7912542ccdf0", "0", "EBABF07A-99A7-41ec-8E90-8C65D79CDB67,A250597F-5768-445f-A668-0D97C054A32A,4E50A845-A86F-486a-901A-E6FC2AF3C2B1,F9C1415D-BDDC-4343-B421-9F9BAE96A781,6E5FFB7E-31BB-4561-A57D-652E2805C50D,A3DED774-054D-40ef-BD5D-EBC668F5E3E4,1BBC05FD-EBD6-4738-995D-DC41947636D0,DC8BC9EF-91FA-4c39-9469-CA69FA7ACB3E,625F01B9-7302-4cc1-8010-A3446C343848,FD8E1338-E210-428d-9C54-1D3BACA9426C,EA65A1AB-2952-43d1-A5AD-F06B95E49EFC,1C855DE9-75D7-425c-A8EF-3974385A2358,65cbd39b-37d5-471e-8bb4-147bbe9ec332,E27B096C-CD76-44ad-9A4E-A190F998F0E2,03C237CF-C1C4-413f-B951-938A58AA78F8,9DFC4A73-29CB-47bb-8F9C-2DD625F390C6,6D51F747-365D-46b1-AD01-9CB9FE2670AF,6720db90-f5d6-4df6-9f85-de3420adeafc,A52D2DB1-8848-40ec-9C79-3880B0AF1171,2EF819D3-88E0-468d-97D4-21AACF2FC996,8DAA0769-7E3D-4d24-B724-C3BBD3BD3A5B,A7DFBF40-466A-4df9-ABE1-2C2C8BF0EFD0,FB086AFF-A4D5-4675-B97F-EF16BCC2B552,bb00d11f-1546-4324-995d-5cf4a19a1a06,7d217e48-2eb0-4ea8-bd08-9c4cd1e0deb3,4C6B8768-D939-4225-A427-5873C4F637F8,FC10A518-DD88-425c-88C0-5598E1EEAEE1,9a9258af-e920-4bf4-a97f-fee506aa86e7,474cf253-92c5-4692-8f01-008c642b15e8,9A1B8AF3-1812-4e78-A6E2-EA2E5ED6B89B,A1F846F2-F6C4-42a1-9B6E-88859F9EE3B9,00b34192-7885-4b9f-a50f-fa96a4a05f42,9A0FC960-8794-437f-9B7F-AFCDC5A402C3,4E5E3FA9-A341-440f-B9DF-6DAF85000CE3,b987d0d8-b0b8-4658-9a34-747c9a74fa99,c1c2bbc0-becf-4efc-b1c1-5003d5c92864,073f1e92-081b-41d7-b061-0b67b1763870", null, null, false, callback); } @Override public Widget asWidget() { return label; } }