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.

Create New Project

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.

Create New Project

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.

Create New Project

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();
  }
}