/*
 * Copyright (c) 2010-2012, 2015 Eike Stepper (Loehne, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Simon McDuff - initial API and implementation
 *    Ibrahim Sallam - code refactoring for CDO 3.0
 */
package org.eclipse.emf.cdo.server.internal.objectivity.schema;

import com.objy.db.app.OneToMany;
import com.objy.db.app.Relationship;
import com.objy.db.app.ToManyRelationship;
import com.objy.db.app.ooObj;

import java.util.ArrayList;
import java.util.List;

public class ObjyPackageUnit extends ooObj
{

  protected String id;

  protected int ordinal;

  protected long timeStamp;

  protected byte[] packageAsBytes;

  private ToManyRelationship packageInfos;

  public ObjyPackageUnit(int bufferSize)
  {
    packageAsBytes = new byte[bufferSize];
  }

  public static OneToMany packageInfos_Relationship()
  {
    return new OneToMany("packageInfos", // field name
        "org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyPackageInfo", // name of related class
        "packageUnit", // inverse relationship field name
        Relationship.COPY_DELETE, Relationship.VERSION_DELETE, false, false, Relationship.INLINE_NONE); // none-inline
    // association
  }

  /**
   * get all related children
   *
   * @return list of ObjyPackageInfo objects.
   */
  public List<ObjyPackageInfo> getPackageInfos()
  {
    List<ObjyPackageInfo> list = new ArrayList<ObjyPackageInfo>();
    fetch();
    com.objy.db.app.Iterator itr;
    itr = packageInfos.scan();
    while (itr.hasNext())
    {
      list.add((ObjyPackageInfo)itr.next());
    }

    return list;
  }

  /**
   * add packageInfo
   */
  public void addPackageInfo(ObjyPackageInfo packageInfo)
  {
    markModified();
    packageInfos.add(packageInfo);
  }

  /**
   * clear all related packageInfo
   */
  public void clearChildren()
  {
    markModified();
    packageInfos.clear();
  }

  /**
   * removePackageInfo.
   */
  public void removePackageInfo(ObjyPackageInfo packageInfo)
  {
    markModified();
    packageInfos.remove(packageInfo);
  }

  public String getId()
  {
    fetch();
    return id;
  }

  public void setId(String id)
  {
    markModified();
    this.id = id;
  }

  public int getOrdinal()
  {
    fetch();
    return ordinal;
  }

  public void setOrdinal(int ordinal)
  {
    markModified();
    this.ordinal = ordinal;
  }

  public long getTimeStamp()
  {
    fetch();
    return timeStamp;
  }

  public void setTimeStamp(long timeStamp)
  {
    markModified();
    this.timeStamp = timeStamp;
  }

  public byte[] getPackageAsBytes()
  {
    fetch();
    return packageAsBytes;
  }

  public void setPackageAsBytes(byte[] packageAsBytes)
  {
    markModified();
    this.packageAsBytes = packageAsBytes;
  }

}
