Java tutorial
/** * Copyright (C) 2013 Infinite Automation Software. All rights reserved. * @author Terry Packer */ package com.serotonin.m2m2.web.dwr; import java.util.ArrayList; import java.util.List; import javax.measure.unit.Unit; import org.apache.commons.logging.LogFactory; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DuplicateKeyException; import com.serotonin.m2m2.Common; import com.serotonin.m2m2.db.dao.DataPointDao; import com.serotonin.m2m2.i18n.ProcessResult; import com.serotonin.m2m2.i18n.TranslatableMessage; import com.serotonin.m2m2.module.license.DataSourceTypePointsLimit; import com.serotonin.m2m2.rt.dataImage.DataPointRT; import com.serotonin.m2m2.rt.dataImage.PointValueFacade; import com.serotonin.m2m2.rt.dataImage.PointValueTime; import com.serotonin.m2m2.util.UnitUtil; import com.serotonin.m2m2.view.ImplDefinition; import com.serotonin.m2m2.view.chart.BaseChartRenderer; import com.serotonin.m2m2.view.text.BaseTextRenderer; import com.serotonin.m2m2.vo.DataPointNameComparator; import com.serotonin.m2m2.vo.DataPointVO; import com.serotonin.m2m2.vo.User; import com.serotonin.m2m2.vo.dataSource.DataSourceVO; import com.serotonin.m2m2.vo.event.PointEventDetectorVO; import com.serotonin.m2m2.vo.permission.Permissions; import com.serotonin.m2m2.web.dwr.beans.DataPointDefaulter; import com.serotonin.m2m2.web.dwr.beans.RenderedPointValueTime; import com.serotonin.m2m2.web.dwr.util.DwrPermission; import com.serotonin.m2m2.web.taglib.Functions; /** * @author Terry Packer * */ public class DataPointDwr extends AbstractDwr<DataPointVO, DataPointDao> { /** * Default Constructor */ public DataPointDwr() { super(DataPointDao.instance, "dataPoints"); LOG = LogFactory.getLog(DataPointDwr.class); } @DwrPermission(user = true) public ProcessResult getPoints() { ProcessResult result = new ProcessResult(); User user = Common.getUser(); if (user == null) { result.addData("list", new ArrayList<DataPointVO>()); return result; } DataSourceVO<?> ds = user.getEditDataSource(); if (ds.getId() == Common.NEW_ID) { result.addData("list", new ArrayList<DataPointVO>()); return result; } List<DataPointVO> points = new DataPointDao().getDataPoints(ds.getId(), DataPointNameComparator.instance, false); result.addData("list", points); return result; } @DwrPermission(user = true) public ProcessResult toggle(int dataPointId) { DataPointVO dataPoint = DataPointDao.instance.getFull(dataPointId); Permissions.ensureDataSourcePermission(Common.getUser(), dataPoint.getDataSourceId()); dataPoint.setEnabled(!dataPoint.isEnabled()); Common.runtimeManager.saveDataPoint(dataPoint); ProcessResult response = new ProcessResult(); response.addData("id", dataPointId); response.addData("enabled", dataPoint.isEnabled()); return response; } /* (non-Javadoc) * @see com.deltamation.mango.downtime.web.AbstractBasicDwr#getFull(int) */ @DwrPermission(user = true) @Override public ProcessResult get(int id) { return this.getFull(id); } /* (non-Javadoc) * @see com.deltamation.mango.downtime.web.AbstractBasicDwr#getFull(int) */ @DwrPermission(user = true) @Override public ProcessResult getFull(int id) { DataPointVO vo; User user = Common.getUser(); if (id == Common.NEW_ID) { vo = dao.getNewVo(); //TODO Need to sort this out another way, this will wreck // when users have mulitple tabs open in a browser DataSourceVO<?> ds = user.getEditDataSource(); vo.setXid(dao.generateUniqueXid()); vo.setPointLocator(ds.createPointLocator()); vo.setDataSourceId(ds.getId()); vo.setDataSourceName(ds.getName()); vo.setDataSourceTypeName(ds.getTypeKey()); vo.setDataSourceXid(ds.getXid()); vo.setDeviceName(ds.getName()); vo.setEventDetectors(new ArrayList<PointEventDetectorVO>(0)); vo.defaultTextRenderer(); } else { vo = dao.getFull(id); } //Should check permissions? //Permissions.ensureDataSourcePermission(user, vo.getDataSourceId()); user.setEditPoint(vo); //TODO NEed to deal with point value defaulter ProcessResult response = new ProcessResult(); response.addData("vo", vo); return response; } /** * Delete a VO * @param id * @return */ @DwrPermission(user = true) public ProcessResult remove(int id) { ProcessResult response = new ProcessResult(); try { DataPointVO dp = dao.get(id); if (dp != null) Common.runtimeManager.deleteDataPoint(dp); } catch (Exception e) { // Handle the exceptions. LOG.error(e); DataPointVO vo = dao.get(id); if (e instanceof DataIntegrityViolationException) response.addContextualMessage(vo.getName(), "table.edit.unableToDeleteDueToConstraints"); else response.addContextualMessage(vo.getName(), "table.edit.unableToDelete", e.getMessage()); } response.addData("id", id); return response; } /** * Save the VO AND FDAO Data * * Conversion for the VO must be added by extending DwrConversionDefinition * * @return */ @DwrPermission(user = true) public ProcessResult saveFull(DataPointVO vo) { // TODO combine with save() ProcessResult response = new ProcessResult(); if (vo.getXid() == null) { vo.setXid(dao.generateUniqueXid()); } vo.validate(response); // Limit enforcement. DataSourceTypePointsLimit.checkLimit(vo.getDataSourceTypeName(), response); if (!response.getHasMessages()) { //When potential for the defaulter is available one must use the DataSourceEditDwr.validate method and store/pull // the data point vo into/outof the session (Common.User.data) DataPointDefaulter defaulter = null; try { Common.runtimeManager.saveDataPoint(vo); if (defaulter != null) defaulter.postSave(vo); } catch (Exception e) { // Handle the exceptions. LOG.error(e); String context = vo.getName(); if (context == null) { context = vo.getXid(); } if (context == null) { context = vo.getXid(); } if (context == null) { context = Integer.toString(vo.getId()); } if (e instanceof DuplicateKeyException) response.addContextualMessage(context, "downtime.edit.alreadyExists"); else response.addContextualMessage(context, "downtime.edit.unableToSave", e.getMessage()); } } response.addData("vo", vo); response.addData("id", vo.getId()); //Add in case it fails return response; } /** * Override the copy method as to manage the User.editingPoint so it is avaiable on copy */ @Override @DwrPermission(user = true) public ProcessResult getCopy(int id) { ProcessResult result = super.getCopy(id); //Store the edit point DataPointVO editPoint = (DataPointVO) result.getData().get("vo"); Common.getUser().setEditPoint(editPoint); return result; } /** * Get a list of available Chart Renderers for this point * @param vo * @return */ @DwrPermission(user = true) public ProcessResult getChartRendererOptions(int dataTypeId) { ProcessResult response = new ProcessResult(); List<ImplDefinition> list = BaseChartRenderer.getImplementations(dataTypeId); response.addData("options", list); return response; } /** * Get a list of available Chart Renderers for this point * @param vo * @return */ @DwrPermission(user = true) public ProcessResult getTextRendererOptions(int dataTypeId) { ProcessResult response = new ProcessResult(); List<ImplDefinition> list = BaseTextRenderer.getImplementation(dataTypeId); response.addData("options", list); return response; } /** * Get a list of available Point Event Detectors for this point * @param vo * @return */ @DwrPermission(user = true) public ProcessResult getEventDetectorOptions(int dataTypeId) { ProcessResult response = new ProcessResult(); List<ImplDefinition> list = PointEventDetectorVO.getImplementations(dataTypeId); response.addData("options", list); return response; } /** * Store the logging properties into the * current user's edit point. * * This is still being used on the page, but could be brought forward by putting the logging properties * into the DWR system * * @param type * @param period * @param periodType * @param intervalType * @param tolerance * @param discardExtremeValues * @param discardHighLimit * @param discardLowLimit * @param purgeOverride * @param purgeType * @param purgePeriod * @param defaultCacheSize */ @Deprecated //I Think this isn't being used anymore @DwrPermission(user = true) public void storeEditLoggingProperties(int type, int period, int periodType, int intervalType, double tolerance, boolean discardExtremeValues, double discardHighLimit, double discardLowLimit, boolean purgeOverride, int purgeType, int purgePeriod, int defaultCacheSize) { DataPointVO dp = Common.getUser().getEditPoint(); if (dp != null) { dp.setLoggingType(type); dp.setIntervalLoggingPeriod(period); dp.setIntervalLoggingPeriodType(periodType); dp.setIntervalLoggingType(intervalType); dp.setTolerance(tolerance); dp.setDiscardExtremeValues(discardExtremeValues); dp.setDiscardHighLimit(discardHighLimit); dp.setDiscardLowLimit(discardLowLimit); dp.setPurgeOverride(purgeOverride); dp.setPurgeType(purgeType); dp.setPurgePeriod(purgePeriod); dp.setDefaultCacheSize(defaultCacheSize); } } /** * This method is used to pre-stage the vo for saving by the custom modules. * * All of the general properties are saved into the "Session" here for use in the modules. * * @param newDp */ @DwrPermission(user = true) public void storeEditProperties(DataPointVO newDp) { DataPointVO dp = Common.getUser().getEditPoint(); if (dp != null) { //Do we want the details set here? (The ID Name,XID and Locator are stored via the modules) dp.setId(newDp.getId()); dp.setXid(newDp.getXid()); //dp.setPointLocator(newDp.getPointLocator()); dp.setDeviceName(newDp.getDeviceName()); dp.setEnabled(newDp.isEnabled()); //General Properties dp.setEngineeringUnits(newDp.getEngineeringUnits()); dp.setUseIntegralUnit(newDp.isUseIntegralUnit()); dp.setUseRenderedUnit(newDp.isUseRenderedUnit()); dp.setUnit(UnitUtil.parseLocal(newDp.getUnitString())); //These won't come back from the UI as they aren't converted dp.setUnitString(newDp.getUnitString()); dp.setRenderedUnit(UnitUtil.parseLocal(newDp.getRenderedUnitString())); dp.setRenderedUnitString(newDp.getRenderedUnitString()); dp.setIntegralUnit(UnitUtil.parseLocal(newDp.getIntegralUnitString())); dp.setIntegralUnitString(newDp.getIntegralUnitString()); dp.setChartColour(newDp.getChartColour()); dp.setPlotType(newDp.getPlotType()); //Logging Properties dp.setLoggingType(newDp.getLoggingType()); dp.setIntervalLoggingPeriod(newDp.getIntervalLoggingPeriod()); dp.setIntervalLoggingPeriodType(newDp.getIntervalLoggingPeriodType()); dp.setIntervalLoggingType(newDp.getIntervalLoggingType()); dp.setTolerance(newDp.getTolerance()); dp.setDiscardExtremeValues(newDp.isDiscardExtremeValues()); dp.setDiscardHighLimit(newDp.getDiscardHighLimit()); dp.setDiscardLowLimit(newDp.getDiscardLowLimit()); dp.setPurgeOverride(newDp.isPurgeOverride()); dp.setPurgeType(newDp.getPurgeType()); dp.setPurgePeriod(newDp.getPurgePeriod()); dp.setDefaultCacheSize(dp.getDefaultCacheSize()); //Chart Renderer dp.setChartRenderer(newDp.getChartRenderer()); //Text Renderer dp.setTextRenderer(newDp.getTextRenderer()); } } @DwrPermission(user = true) public ProcessResult validateUnit(String unit) { ProcessResult result = new ProcessResult(); try { UnitUtil.parseUcum(unit); result.addData("validUnit", true); result.addData("message", new TranslatableMessage("validate.unitValid").translate(getTranslations())); } catch (Exception e) { result.addData("validUnit", false); if (e instanceof IllegalArgumentException) { result.addData("message", ((IllegalArgumentException) e).getCause().getMessage()); } else { result.addData("message", e.getMessage()); } } return result; } /** * Helper to get the most recent value for a point * @param id * @return */ @DwrPermission(user = true) public ProcessResult getMostRecentValue(int id) { ProcessResult result = new ProcessResult(); if (Common.runtimeManager.isDataPointRunning(id)) { DataPointRT rt = Common.runtimeManager.getDataPoint(id); //Check to see if the data source is running if (Common.runtimeManager.isDataSourceRunning(rt.getDataSourceId())) { PointValueFacade facade = new PointValueFacade(rt.getVO().getId()); PointValueTime value = facade.getPointValue(); if (value != null) { RenderedPointValueTime rpvt = new RenderedPointValueTime(); rpvt.setValue(Functions.getHtmlText(rt.getVO(), value)); rpvt.setTime(Functions.getTime(value)); result.getData().put("pointValue", rpvt.getValue()); //Could return time and value? } else result.getData().put("pointValue", translate("event.setPoint.activePointValue")); } else { result.getData().put("pointValue", translate("common.pointWarning")); } } else { result.getData().put("pointValue", translate("common.pointWarning")); } return result; } }