All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.ontopia.topicmaps.db2tm.Entity Maven / Gradle / Ivy

The newest version!
/*
 * #!
 * Ontopia DB2TM
 * #-
 * Copyright (C) 2001 - 2013 The Ontopia Project
 * #-
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * !#
 */

package net.ontopia.topicmaps.db2tm;

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

/**
 * INTERNAL: Relation mapping concept that represents topic or
 * association definitions. This class refer directly to the 
 * and  elements in the XML schema. This class is used
 * only internally and is not intended to be used by end-users.
 */
public class Entity {

  // entity type enumeration
  public static final int TYPE_TOPIC = 1;
  public static final int TYPE_ASSOCIATION = 2;

  // entity type
  protected int etype;
  protected final Relation relation;
  protected Boolean primary;
  
  protected String id;
  protected ValueIF condition;
  protected String atype; // association type
  protected String[] types;  // topic types
  protected String[] scope;

  protected List ifields = new ArrayList();
  protected List cfields = new ArrayList();
  protected List rfields = new ArrayList();
  protected boolean requiresTopic;

  protected List extents = new ArrayList();
  
  Entity(int etype, Relation relation) {
    this.etype = etype;
    this.relation = relation;
  }

  public void compile() {
    for (Field field : ifields) {
      field.compile();
    }
    for (Field field : cfields) {
      field.compile();
    }
    for (Field field : rfields) {
      field.compile();
    }

    if (etype == TYPE_TOPIC) {
      this.requiresTopic = true;
    } else {
      // association entity require topic if there are subject
      // locator, subject identity or characteristics fields
      if (!cfields.isEmpty()) {
        this.requiresTopic = true;
      } else {
        for (int i=0; i < ifields.size(); i++) {
          int ftype = ifields.get(i).getFieldType();
          if (ftype == Field.TYPE_SUBJECT_LOCATOR ||
              ftype == Field.TYPE_SUBJECT_IDENTIFIER) {
            this.requiresTopic = true;
            break;
          }
        }
      }
    }
    // default to primary=true if both identity and characteristics/role fields
    if (primary == null) {
      if (!ifields.isEmpty() && (!cfields.isEmpty() || !rfields.isEmpty())) {
        primary = Boolean.TRUE;
      } else {
        primary = Boolean.FALSE;
      }      
    } else {
      // complain if  with characteristics and synctype is changelog
      if (etype == TYPE_TOPIC && primary == Boolean.FALSE && !ifields.isEmpty() && (!cfields.isEmpty() || !rfields.isEmpty())) {
        int synctype = relation.getSynchronizationType();
        if (synctype == Relation.SYNCHRONIZATION_UNKNOWN) {
          if (!relation.getSyncs().isEmpty()) {
            synctype = Relation.SYNCHRONIZATION_CHANGELOG;
          } else {
            synctype = Relation.SYNCHRONIZATION_RESCAN;
          }
        }
      }
    }
  }

  public Relation getRelation() {
    return relation;
  }
  
  public int getEntityType() {
    return etype;
  }

  public void setEntityType(int etype) {
    this.etype = etype;
  }

  public boolean isPrimary() {
    return primary.booleanValue();
  }

  public void setPrimary(Boolean primary) {
    this.primary = primary;
  }

  public String getId() {
    return id;
  }

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

  public ValueIF getConditionValue() {
    return condition;
  }
  
  public void setConditionValue(ValueIF condition) {
    this.condition = condition;
  }

  public String getAssociationType() {
    return atype;
  }

  public void setAssociationType(String atype) {
    this.atype = atype;
  }

  public String[] getTypes() {
    return types;
  }

  public void setTypes(String[] types) {
    this.types = types;
  }

  public String[] getScope() {
    return scope;
  }

  public void setScope(String[] scope) {
    this.scope = scope;
  }

  public List getCharacteristicFields() {
    return cfields;
  }

  public List getIdentityFields() {
    return ifields;
  }

  public List getRoleFields() {
    return rfields;
  }

  public void addField(Field field) {
    switch (field.getFieldType()) {
    case Field.TYPE_SUBJECT_LOCATOR:
    case Field.TYPE_SUBJECT_IDENTIFIER:
    case Field.TYPE_ITEM_IDENTIFIER:
      this.ifields.add(field);
      break;
    case Field.TYPE_ASSOCIATION_ROLE:
      this.rfields.add(field);
      break;
    default:
      this.cfields.add(field);
    }
  }

  // true if the relation maps to a topic (ie: it's a topic relation,
  // or some other relation that requires reification)
  public boolean requiresTopic() {
    return requiresTopic;
  }

  // -----------------------------------------------------------------------------
  // Extents
  // -----------------------------------------------------------------------------

  public List getExtentQueries() {
    return extents;
  }

  public void addExtentQuery(String extentQuery) {
    if (extentQuery == null) {
      throw new DB2TMConfigException("Extent query cannot be null (entity " + this + ").");
    }
    extents.add(extentQuery);
  }

  public void removeExtentQuery(String extentQuery) {
    extents.remove(extentQuery);
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy