private IQueryResult queryFetch(ICompiledQuery code, UserInformation user) {

    // TODO check rights for channel

    String id = code.getString(1);

    try {
      Properties current = new Properties();
      Reader reader = driver.getFileStore().get(IType.TYPE_OBJECT)[0].getReader(id);
      current.load(reader);
      reader.close();

      String typeName = current.getProperty(IAttribute.M_TYPE);
      if (typeName == null) throw new MorseException(MorseException.OBJECT_NOT_FOUND, id);

      IType type = typeProvider.get(typeName);
      if (type == null) throw new MorseException(MorseException.TYPE_NOT_FOUND, typeName);

      ObjectFileStore[] store = fileStore.get(typeName);
      if (store == null) throw new MorseException(MorseException.TYPE_NOT_FOUND, typeName);

      if (!aclManager.hasRead(user, type.getAccessAcl()))
        throw new MorseException(
            MorseException.ACCESS_DENIED_READ,
            new String[] {"type", typeName, type.getAccessAcl()});

      LinkedList<Attr> attr = new LinkedList<Attr>();
      for (Iterator<IAttribute> i = type.getAttributes(); i.hasNext(); ) {
        Attr a = new Attr();
        a.attr = i.next();
        a.attrName = a.attrAlias = a.attr.getName();
        if (aclManager.hasRead(user, a.attr.getAccessAcl())) attr.add(a);
      }

      return new FileAbstractSelectResult(
          driver,
          type,
          store[0],
          IAttribute.M_ID,
          id,
          (Attr[]) attr.toArray(new Attr[attr.size()]));

    } catch (Exception e) {
      log.error(e);
      return new ErrorResult(1, 1, e.toString());
    }
  }
  public void unlock(String id, boolean force, UserInformation user) throws MorseException {

    if (log.t4()) log.info("UNLOCK: " + id + ' ' + user);

    ObjectUtil.assetId(id);
    if (!force && user == null) throw new MorseException(MorseException.UNKNOWN_USER);

    // create lock file
    ObjectFileStore ofs = driver.getFileStore().get(IType.TYPE_OBJECT)[0];

    try {
      if (log.t4()) log.debug("xLOCK: " + id + ' ' + user);
      if (!ofs.lock(id)) throw new MorseException(MorseException.ERROR);
    } catch (IOException e) {
      throw new MorseException(MorseException.ERROR, e);
    }

    try {

      IQueryResult res = fetch(id, user, false);
      if (!res.next()) {
        res.close();
        throw new MorseException(MorseException.ACCESS_DENIED, id);
      }
      String lock = res.getString(IAttribute.M_LOCK);
      res.close();

      if (!force && ObjectUtil.validateId(lock) && !lock.equals(user.getUserId())) {
        throw new MorseException(MorseException.NOT_OWNER, id);
      }

      Properties p = new Properties();
      Reader reader = ofs.getReader(id);
      p.load(reader);
      reader.close();
      p.setProperty(IAttribute.M_LOCK, "");
      Writer writer = ofs.getWriter(id);
      p.store(writer);
      writer.close();

    } catch (Exception e) {
      log.error(e);
    } finally {
      if (log.t4()) log.debug("xUNLOCK: " + id + ' ' + user);
      ofs.unlock(id);
    }
  }
  private IQueryResult queryLoad(ICompiledQuery code, UserInformation user) {

    String id = code.getString(1);
    boolean shared = code.size() > 2 && code.getInteger(2) == CMql.SHARED;

    try {
      Properties current = new Properties();
      Reader reader = driver.getFileStore().get(IType.TYPE_OBJECT)[0].getReader(id);
      current.load(reader);
      reader.close();

      String typeName = current.getProperty(IAttribute.M_TYPE);
      if (typeName == null) throw new MorseException(MorseException.OBJECT_NOT_FOUND, id);

      IType type = typeProvider.get(typeName);
      if (type == null) throw new MorseException(MorseException.TYPE_NOT_FOUND, typeName);

      ObjectFileStore[] store = fileStore.get(typeName);
      if (store == null) throw new MorseException(MorseException.TYPE_NOT_FOUND, typeName);

      if (!aclManager.hasRead(user, type.getAccessAcl()))
        throw new MorseException(
            MorseException.ACCESS_DENIED_READ,
            new String[] {"type", typeName, type.getAccessAcl()});

      if (!shared) return new FileAbstractLoadResultStream(this, id, store[1]);
      else {
        return new SingleRowResult(
            new IAttribute[] {IAttributeDefault.ATTR_OBJ_STRING, IAttributeDefault.ATTR_OBJ_STRING},
            new String[] {"channel", "path"},
            new String[] {getName(), store[1].getRelativePath(id)});
      }

    } catch (Exception e) {
      log.error(e);
      return new ErrorResult(1, 1, e.toString());
    }
  }
 public IQueryResult fetch(String id, UserInformation user, boolean stamp) throws MorseException {
   ObjectFileStore[] store = driver.getFileStore().get(IType.TYPE_OBJECT);
   if (store == null) throw new MorseException(MorseException.TYPE_NOT_FOUND, IType.TYPE_OBJECT);
   Reader reader = null;
   Properties prop = new Properties();
   try {
     reader = store[0].getReader(id);
     prop.load(reader);
     reader.close();
   } catch (IOException e) {
     // throw new MorseException( MorseException.ERROR, e );
     if (log.t3()) log.error(e);
     throw new MorseException(MorseException.OBJECT_NOT_FOUND, id);
   }
   if (stamp)
     return new SingleRowResult(
         new IAttribute[] {IAttributeDefault.ATTR_OBJ_INT},
         new String[] {IAttribute.M_STAMP},
         new String[] {prop.getProperty(IAttribute.M_STAMP)});
   String typeName = prop.getProperty(IAttribute.M_TYPE);
   IType type = typeProvider.get(typeName);
   if (type == null) throw new MorseException(MorseException.TYPE_NOT_FOUND, typeName);
   LinkedList<Attr> attr = new LinkedList<Attr>();
   for (Iterator<IAttribute> i = type.getAttributes(); i.hasNext(); ) {
     Attr a = new Attr();
     a.attr = i.next();
     a.attrAlias = a.attrName = a.attr.getName();
     attr.add(a);
   }
   return new FileAbstractSelectResult(
       driver,
       type,
       driver.getFileStore().get(typeName)[0],
       IAttribute.M_ID,
       id,
       attr.toArray(new Attr[attr.size()]));
 }