28.07.2012
Eine DataSource verwenden in Eclipse Scout
Was jetzt noch fehlt, ist eine Klasse, die die Items speichert. Deshalb wird mit ⌘+N eine neue Java-Klasse angelegt. Nach dem Selektieren von Class geht es mit Next weiter.
In dem nächsten Dialog wird als Source folder der Pfad org.hameister.scout.itemmanager.server/src ausgewählt. Die Daten sollen auf dem Server und nicht auf dem Client gespeichert werden. Als Package wird der Wert org.hameister.scout.itemmanager.server gewählt und als Klassenname der Name ItemDataSource. Danach wird der Dialog mit Finish geschlossen.
In der generierten Klasse wird folgender Quellcode ergänzt:
package org.hameister.scout.itemmanager.server; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.hameister.scout.itemmanager.shared.services.process.ItemFormData; public class ItemDataSource { private static ItemDataSource instance; private Map<String, ItemFormData> items; private ItemDataSource() { if (new File("items.ser").exists()) { try { InputStream file = new FileInputStream("./items.ser"); InputStream buffer = new BufferedInputStream(file); ObjectInput input = new ObjectInputStream(buffer); try { items = (HashMap<String, ItemFormData>) input.readObject(); for (String itemId : items.keySet()) { System.out.println(itemId + " " + items.get(itemId).getName()); } } finally { input.close(); } } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } else { items = new HashMap<String, ItemFormData>(); } } public static final ItemDataSource getInstance() { if (instance == null) { instance = new ItemDataSource(); } return instance; } public Object[][] getData() { List<Object[]> objectLines = new ArrayList<Object[]>(); for (String itemId : items.keySet()) { ItemFormData item = items.get(itemId); Object[] line = new Object[]{item.getItemId(), item.getName().getValue(), item.getKaufdatum().getValue(), item.getItemPrice().getValue()}; objectLines.add(line); } return objectLines.toArray(new Object[objectLines.size()][]); } public ItemFormData store(ItemFormData data, boolean addItem) { if (addItem) { data.setItemId("id_" + System.currentTimeMillis()); } items.put(data.getItemId(), data); try { OutputStream file = new FileOutputStream("./items.ser"); OutputStream buffer = new BufferedOutputStream(file); ObjectOutput output = new ObjectOutputStream(buffer); try { output.writeObject(items); } finally { output.close(); } } catch (IOException ex) { ex.printStackTrace(); } return data; } public ItemFormData getItem(String itemId) { return items.get(itemId); } }
Nun muss die neue Klasse noch vom Process Service verwendet werden. Um dies zu erreichen, wird im Server unter Process Services der Item ProcessService ausgewählt und mit einem Doppelklick die zugehörige Java-Klasse geöffnet.
In der Datei ItemProcessServer werden die Methoden so angepasst, dass sie die Klasse ItemDataSource
verwenden.
package org.hameister.scout.itemmanager.server.services.process; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.commons.exception.VetoException; import org.eclipse.scout.rt.shared.TEXTS; import org.eclipse.scout.rt.shared.services.common.security.ACCESS; import org.eclipse.scout.service.AbstractService; import org.hameister.scout.itemmanager.server.ItemDataSource; import org.hameister.scout.itemmanager.shared.security.CreateItemPermission; import org.hameister.scout.itemmanager.shared.security.ReadItemPermission; import org.hameister.scout.itemmanager.shared.security.UpdateItemPermission; import org.hameister.scout.itemmanager.shared.services.process.IItemProcessService; import org.hameister.scout.itemmanager.shared.services.process.ItemFormData; public class ItemProcessService extends AbstractService implements IItemProcessService { @Override public ItemFormData prepareCreate(ItemFormData formData) throws ProcessingException { if (!ACCESS.check(new CreateItemPermission())) { throw new VetoException(TEXTS.get("AuthorizationFailed")); } //TODO [Hameister] business logic here return formData; } @Override public ItemFormData create(ItemFormData formData) throws ProcessingException { if (!ACCESS.check(new CreateItemPermission())) { throw new VetoException(TEXTS.get("AuthorizationFailed")); } return ItemDataSource.getInstance().store(formData, true); } @Override public ItemFormData load(ItemFormData formData) throws ProcessingException { if (!ACCESS.check(new ReadItemPermission())) { throw new VetoException(TEXTS.get("AuthorizationFailed")); } return ItemDataSource.getInstance().getItem(formData.getItemId()); } @Override public ItemFormData store(ItemFormData formData) throws ProcessingException { if (!ACCESS.check(new UpdateItemPermission())) { throw new VetoException(TEXTS.get("AuthorizationFailed")); } return ItemDataSource.getInstance().store(formData, false); } }
Außerdem muss noch in der Klasse StandardOutlineService
die Methode getItemTableData()
so angepasst werden, dass sie die Daten bei der ItemDataSource
abfragt.
package org.hameister.scout.itemmanager.server.services.outline; import org.eclipse.scout.commons.exception.ProcessingException; import org.eclipse.scout.service.AbstractService; import org.hameister.scout.itemmanager.server.ItemDataSource; import org.hameister.scout.itemmanager.shared.services.outline.IStandardOutlineService; public class StandardOutlineService extends AbstractService implements IStandardOutlineService { @Override public Object[][] getItemTableData() throws ProcessingException { return ItemDataSource.getInstance().getData(); } }