blob: 67a281d8fa48a5c170acb3b2d2c532276fee4921 [file] [log] [blame]
/*
* Copyright (c) 2010-2013, 2015, 2016 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.db;
import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM;
import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ITypeMapper;
import org.eclipse.emf.cdo.server.internal.objectivity.mapper.ObjyMapper;
import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyBase;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import com.objy.as.app.Proposed_Class;
import com.objy.as.app.d_Access_Kind;
import com.objy.as.app.d_Attribute;
import com.objy.as.app.d_Class;
import com.objy.as.app.d_Inheritance;
import com.objy.as.app.d_Module;
import java.util.ArrayList;
import java.util.Iterator;
public class ObjyClassProposed
{
private static final ContextTracer TRACER_DEBUG = new ContextTracer(OM.DEBUG, ObjyClassProposed.class);
private EClass eClass;
private d_Module module;
private boolean onlyStructure = false; // TODO - I'm not sure why we need this TBV.
public ObjyClassProposed(d_Module module, EClass eClass, boolean onlyStructure)
{
this.eClass = eClass;
this.module = module;
this.onlyStructure = onlyStructure;
}
public void propose()
{
String className = ObjySchema.formObjectivityClassName(eClass, onlyStructure);
Proposed_Class proposedooClass = null;
{
proposedooClass = ObjySchema.getTopModule().propose_new_class(className);
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("ECLASS " + eClass.getName() + " -> " + className + " = ADD - START");
}
int countIndex = 0;
for (EClass eSuperObject : eClass.getESuperTypes())
{
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("ECLASS " + className + " ADDING SUPER CLASS " + eSuperObject.getName());
}
// This is used to only allow one base class with persistence inheritance.
boolean itrOnlyStructure = countIndex == 0 ? false || onlyStructure : true;
ObjySchema.createObjyClassSchema(eSuperObject, itrOnlyStructure);
String superClassName = ObjySchema.formObjectivityClassName(eSuperObject, itrOnlyStructure);
proposedooClass.add_base_class(com.objy.as.app.d_Module.LAST, // Position
d_Access_Kind.d_PUBLIC, // Access kind
superClassName); // Base class name*/
countIndex++;
}
if (eClass.getESuperTypes().size() == 0 && !onlyStructure)
{
// this is done in ObjySchema.buildSchema()...
// ooBaseClass.buildSchema();
proposedooClass.add_base_class(com.objy.as.app.d_Module.LAST, // Position
d_Access_Kind.d_PUBLIC, // Access kind
ObjyBase.CLASS_NAME); // Base class name
}
}
EList<EStructuralFeature> listFeatures = eClass.getEStructuralFeatures();
ArrayList<EClass> toBeProcessed = new ArrayList<EClass>();
for (EStructuralFeature feature : listFeatures)
{
if (!(feature instanceof EAttribute || feature instanceof EReference) || !ObjyObject.isPersistent(feature))
{
continue;
}
EClassifier destination = feature.getEType();
ITypeMapper bridge = ObjyMapper.INSTANCE.getTypeMapper(feature);
if (bridge == null)
{
continue;
}
// new field
bridge.createSchema(proposedooClass, feature);
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("New Attribut for " + eClass.getName() + " name : " + feature.getName());
}
if (feature instanceof EReference)
{
// ObjySchema.createObjyClassSchema((EClass)destination, false);
toBeProcessed.add((EClass)destination);
}
}
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("ECLASS " + eClass.getName() + " -> " + className + " -- DONE");
}
for (EClass classifier : toBeProcessed)
{
// ObjySchema.getOrCreate(classifier);
ObjySchema.createObjyClassSchema(classifier, false);
}
}
public void evolve(d_Class dClass)
{
String className = ObjySchema.formObjectivityClassName(eClass, onlyStructure);
Proposed_Class proposedooClass = null;
// boolean evolution = false;
{
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("ECLASS " + eClass.getName() + " -> " + className + " EVOLVE - START");
}
Iterator<?> subClasses = dClass.sub_class_list();
while (subClasses.hasNext())
{
d_Inheritance subClass = (d_Inheritance)subClasses.next();
module.propose_evolved_class(subClass.inherits_to().name());
}
proposedooClass = module.propose_evolved_class(className);
}
EList<EStructuralFeature> listFeatures = eClass.getEStructuralFeatures();
ArrayList<EClass> toBeEvolve = new ArrayList<EClass>();
for (EStructuralFeature feature : listFeatures)
{
if (!(feature instanceof EAttribute || feature instanceof EReference) || !ObjyObject.isPersistent(feature))
{
continue;
}
EClassifier destination = feature.getEType();
ITypeMapper bridge = ObjyMapper.INSTANCE.getTypeMapper(feature);
if (bridge == null)
{
continue;
}
d_Attribute attr = null;
attr = dClass.resolve_attribute(feature.getName());
if (attr == null)
{
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("New Attribut for " + eClass.getName() + " name : " + feature.getName());
}
// new field
bridge.createSchema(proposedooClass, feature);
}
// TODO - enable the rest of attribute type evolution...
// else if (bridge.validate(attr, feature))
// {
// continue;
// }
else
{
if (TRACER_DEBUG.isEnabled())
{
TRACER_DEBUG.trace("Attribut Changed for " + eClass.getName() + " name : " + feature.getName());
TRACER_DEBUG.trace("... attribute change is not supported in this release... for " + eClass.getName() + " name : " + feature.getName());
}
// TODO - enable the rest of attribute type evolution...
// bridge.modifySchema(proposedooClass, feature);
}
if (feature instanceof EReference)
{
// String destinationClassName = getObjectivityClass(destination);
// d_Class dClass = module.resolve_class(destinationClassName);
toBeEvolve.add((EClass)destination);
}
}
TRACER_DEBUG.trace("evolve ECLASS " + eClass.getName() + " -> " + className + " -- DONE");
for (EClass classifier : toBeEvolve)
{
String localName = ObjySchema.formObjectivityClassName(classifier, false);
d_Class localDClass = ObjySchema.getTopModule().resolve_class(localName);
if (localDClass == null)
{
ObjySchema.createObjyClassSchema(classifier, false);
}
else
{
ObjySchema.evolveObjyClassSchema(classifier, false);
}
}
}
}