MemoryMapDataProvider providerTaskData = new MemoryMapDataProvider();taskDataProvider.setValue("scale", 2.5);taskDataProvider.setValue("transform", AffineTransform.createTranslate(12.0, 13.0));ClientDataProvider providerTaskZ = new ClientDataProvider();taskDataProvider.setValue("z-provider", providerTaskZ); // send client data provider to nodeproviderTaskZ.setValueSource(new ClientValueSource() { // taskDataProvider isn't necessary as method parameter // scale can be obtained from another source (eg in constructor of ClientValueSource, or from 'key' object) public Object getClientValueForKey(final DataProvider taskDataProvider, final Object key) throws Exception { double scale = ((Number)taskDataProvider.getValue("scale")).doubleValue(); if(key instanceof double[][]) { double[][] coordsXY = (double[][])key; double[] result = new double[coordsXY.length]; for(int index = 0; index < coordsXY.length; index++) { double x = coordsXY[index][0]; double y = coordsXY[index][1]; result[index] = (x + 100.0 * y) * scale; // some computation of result depending on key (X, Y) and 'scale' from task } return result; } else throw new IllegalArgumentException("Expected coordinate array"); }}JPPFTask task = new JPPFTask(..) { ... public void run() { DataProvider dataProvider = getDataProvider(); // get task arguments double scale = (Double)dataProvider.getValue("scale"); AffineTransform transform = (AffineTransform)dataProvider.getValue("transform"); ClientDataProvider zProvider = (ClientDataProvider)dataProvider.getValue("z-provider"); // lets do something double[][] coords = new double[10][2]; coords = [i]function_foo[/i](transform, scale); double[] z; Object value = zProvider.getValue(coords); // can return 'value' or Exception for 'key' when ocured on "client" if(value instanceof double[]) double[] z = (double[])value; else if(value instanceof Exception) { setException((Exception)value)); // handle exception "(Exception)value" return; // finish task } else { setException(new IllegalArgumentException("Wrong data value '" + value + "' from client data provider '" + zProvider + '\'')); return; // finish task } result = [i]function_bar[/i](transform, scale, coords, z); setResult(result); }}
public <T> T getValue(final Class<T> valueClass, final Object key) throws Exception { Object value = getValue(); if(value == null) return null; else if(valueClass.isAssignableFrom(value.getClass())) return valueClass.cast(value); else if(value instanceof Exception) throw (Exception)value; else throw new IllegalArgumentException("Wrong data value '" + value + "' expected type '" + valueClass.getName + '\'');}