Skip to content

Commit

Permalink
BZ-1058315 - When abstract class (or interface) is set as superclass …
Browse files Browse the repository at this point in the history
…and data modeler is saved, type from Data modeler disappears
  • Loading branch information
wmedvede committed Feb 5, 2014
1 parent 1c06439 commit 5b06bf3
Show file tree
Hide file tree
Showing 15 changed files with 188 additions and 43 deletions.
Expand Up @@ -33,7 +33,7 @@ public class DataModelTO {
/**
* List of class names imported by this module.
*/
private List<String> externalClasses = new ArrayList<String>();
private List<DataObjectTO> externalClasses = new ArrayList<DataObjectTO>();

/**
* A list to remember data objects that was deleted in memory and has to be removed fisically when the model
Expand Down Expand Up @@ -111,16 +111,20 @@ public void updateFingerPrints(Map<String, String> fingerPrints) {
}
}

public List<String> getExternalClasses() {
public List<DataObjectTO> getExternalClasses() {
return externalClasses;
}

public void setExternalClasses(List<String> externalClasses) {
public void setExternalClasses(List<DataObjectTO> externalClasses) {
this.externalClasses = externalClasses;
}

public boolean isExternal(String className) {
return externalClasses != null && externalClasses.contains(className);
if (externalClasses == null || className == null || "".equals(className)) return false;
for (DataObjectTO externalDataObject : externalClasses) {
if (className.equals(externalDataObject.getClassName())) return true;
}
return false;
}

public int getId() {
Expand Down
Expand Up @@ -61,13 +61,26 @@ public class DataObjectTO {

private String fingerPrint;

private boolean abstractModifier = false;

private boolean interfaceModifier = false;

private boolean finalModifier = false;

public DataObjectTO() {
}

public DataObjectTO(String name, String packageName, String superClassName) {
this(name, packageName, superClassName, false, false, false);
}

public DataObjectTO(String name, String packageName, String superClassName, boolean abstractModifier, boolean interfaceModifier, boolean finalModifier) {
this.name = name;
this.packageName = packageName;
this.superClassName = superClassName;
this.abstractModifier = abstractModifier;
this.interfaceModifier = interfaceModifier;
this.finalModifier = finalModifier;
}

public String getName() {
Expand Down Expand Up @@ -231,4 +244,17 @@ public String getStringId() {
}
return strId.toString();
}

public boolean isAbstract() {
return abstractModifier;
}

public boolean isFinal() {
return finalModifier;
}

public boolean isInterface() {
return interfaceModifier;
}

}
Expand Up @@ -53,7 +53,7 @@ public DataModelTO domain2To(DataModel dataModel, Integer initialStatus, boolean
DataModelTO dataModelTO = new DataModelTO();
List<DataObject> dataObjects = new ArrayList<DataObject>();
List<DataObject> externalDataObjects = new ArrayList<DataObject>();
List<String> externalClasses = new ArrayList<String>();
Map<String, String> externalClasses = new HashMap<String, String>();

dataObjects.addAll(dataModel.getDataObjects());
externalDataObjects.addAll(dataModel.getDataObjects(ObjectSource.DEPENDENCY));
Expand All @@ -62,7 +62,7 @@ public DataModelTO domain2To(DataModel dataModel, Integer initialStatus, boolean

if (dataObjects != null) {
for (DataObject dataObject : dataObjects) {
dataObjectTO = new DataObjectTO(dataObject.getName(), dataObject.getPackageName(), dataObject.getSuperClassName());
dataObjectTO = new DataObjectTO(dataObject.getName(), dataObject.getPackageName(), dataObject.getSuperClassName(), dataObject.isAbstract(), dataObject.isInterface(), dataObject.isFinal());
if (initialStatus != null) {
dataObjectTO.setStatus(initialStatus);
}
Expand All @@ -74,12 +74,18 @@ public DataModelTO domain2To(DataModel dataModel, Integer initialStatus, boolean
}
}


for (DataObject externalDataObject : externalDataObjects) {
if (!externalClasses.contains(externalDataObject.getClassName())) {
externalClasses.add(externalDataObject.getClassName());
dataObjectTO = new DataObjectTO(externalDataObject.getName(), externalDataObject.getPackageName(), externalDataObject.getSuperClassName(), externalDataObject.isAbstract(), externalDataObject.isInterface(), externalDataObject.isFinal());
if (!externalClasses.containsKey(dataObjectTO.getClassName())) {
//TODO if needed add the external clases properties.
//version 6.0.1 will not do anything with external classes properties, so we can
//skip properties loading.
dataModelTO.getExternalClasses().add(dataObjectTO);
externalClasses.put(dataObjectTO.getClassName(), dataObjectTO.getClassName());
}

}
dataModelTO.setExternalClasses(externalClasses);

return dataModelTO;
}
Expand Down
Expand Up @@ -28,12 +28,16 @@
import javax.inject.Named;

import org.drools.workbench.models.datamodel.oracle.ProjectDataModelOracle;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.model.Package;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.common.services.project.service.POMService;
import org.guvnor.common.services.project.service.ProjectService;
import org.guvnor.common.services.shared.metadata.MetadataService;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.jboss.errai.bus.server.annotations.Service;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.workbench.common.screens.datamodeller.model.AnnotationDefinitionTO;
import org.kie.workbench.common.screens.datamodeller.model.DataModelTO;
import org.kie.workbench.common.screens.datamodeller.model.DataObjectTO;
Expand Down Expand Up @@ -98,6 +102,9 @@ public class DataModelerServiceImpl implements DataModelerService {
@Inject
private ProjectService projectService;

@Inject
private POMService pomService;

@Inject
private MetadataService metadataService;

Expand Down Expand Up @@ -139,7 +146,7 @@ public DataModelTO loadModel( Project project ) {
ProjectDataModelOracle projectDataModelOracle = dataModelService.getProjectDataModel( projectPath );

DataModelOracleDriver driver = DataModelOracleDriver.getInstance();
dataModel = driver.loadModel( projectDataModelOracle );
dataModel = driver.loadModel( projectDataModelOracle, getProjectClassLoader(project) );

//Objects read from persistent .java format are tagged as PERSISTENT objects
DataModelTO dataModelTO = DataModelerServiceHelper.getInstance().domain2To( dataModel, DataObjectTO.PERSISTENT, true );
Expand All @@ -158,6 +165,21 @@ public DataModelTO loadModel( Project project ) {
}
}

private ClassLoader getProjectClassLoader(Project project) {
if (project == null || project.getPomXMLPath() == null) {
logger.warn("project: " + project + " or pomXMLPath: " + project.getPomXMLPath() + " is null." );return null;
}
POM pom = pomService.load(project.getPomXMLPath());
if (pom == null) {
logger.warn("Pom couldn't be read for project: " + project + " pomXmlPath: " + project.getPomXMLPath());
return null;
}

KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.newKieContainer(kieServices.newReleaseId(pom.getGav().getGroupId(), pom.getGav().getArtifactId(), pom.getGav().getVersion()));
return kieContainer.getClassLoader();
}

@Override
public GenerationResult saveModel( DataModelTO dataModel,
final Project project ) {
Expand Down
Expand Up @@ -202,9 +202,9 @@ private void reset() {
labelledClassNames.clear();
siblingsMap.clear();
if (dataModel != null) {
for (String extClassName : dataModel.getExternalClasses()) {
classNames.put(extClassName, null);
labelledClassNames.put(extClassName, extClassName);
for (DataObjectTO extClassName : dataModel.getExternalClasses()) {
classNames.put(extClassName.getClassName(), null);
labelledClassNames.put(extClassName.getClassName(), extClassName.getClassName());
}
for (DataObjectTO object : dataModel.getDataObjects()) {
String className = object.getClassName();
Expand Down
Expand Up @@ -426,7 +426,8 @@ private void initTypeList() {

// Then add all external types, ordered
typeNames.clear();
for (String extClass : getDataModel().getExternalClasses()) {
for (DataObjectTO externalDataObject : getDataModel().getExternalClasses()) {
String extClass = externalDataObject.getClassName();
String extClass_m = extClass + DataModelerUtils.MULTIPLE;
typeNames.put(DataModelerUtils.EXTERNAL_PREFIX + extClass, extClass);
typeNames.put(DataModelerUtils.EXTERNAL_PREFIX + extClass_m, extClass_m);
Expand Down
Expand Up @@ -240,6 +240,7 @@ private void onDataObjectDeleted( @Observes DataObjectDeletedEvent event ) {
setDataObject( null );
setReadonly( true );
}
superclassSelector.initList();
}
}

Expand Down
Expand Up @@ -464,7 +464,8 @@ private void initTypeList() {

// Then add all external types, ordered
typeNames.clear();
for (String extClass : getDataModel().getExternalClasses()) {
for (DataObjectTO externalDataObject : getDataModel().getExternalClasses()) {
String extClass = externalDataObject.getClassName();
String extClass_m = extClass + DataModelerUtils.MULTIPLE;
typeNames.put(DataModelerUtils.EXTERNAL_PREFIX + extClass, extClass);
typeNames.put(DataModelerUtils.EXTERNAL_PREFIX + extClass_m, extClass_m);
Expand Down
Expand Up @@ -23,13 +23,11 @@
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import org.kie.workbench.common.screens.datamodeller.client.DataModelerContext;
import org.kie.workbench.common.screens.datamodeller.client.util.DataModelerUtils;
import org.kie.workbench.common.screens.datamodeller.model.DataModelTO;
import org.kie.workbench.common.screens.datamodeller.model.DataObjectTO;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;


public class SuperclassSelector extends Composite {
Expand Down Expand Up @@ -71,11 +69,6 @@ public void setContext(DataModelerContext context) {
public void setDataObject(DataObjectTO dataObject) {
this.dataObject = dataObject;
initList();
if (dataObject != null && dataObject.getSuperClassName() != null) {
superclassList.setSelectedValue(dataObject.getSuperClassName());
} else {
superclassList.setSelectedValue(NOT_SELECTED);
}
}

public void setEnabled(boolean enabled) {
Expand All @@ -86,16 +79,50 @@ private DataModelTO getDataModel() {
return getContext() != null ? getContext().getDataModel() : null;
}

private void initList() {
public void initList() {
superclassList.clear();

superclassList.addItem("", NOT_SELECTED);

if (getDataModel() != null) {
for (Map.Entry<String, String> mapEntry : getContext().getHelper().getLabelledClassMap().entrySet()) {
if (dataObject != null && mapEntry.getValue().equalsIgnoreCase(dataObject.getClassName())) continue;
superclassList.addItem(mapEntry.getKey(), mapEntry.getValue());
SortedMap<String, String> sortedClassNames = new TreeMap<String, String>();
boolean isExtensible = false;
String className;
String classLabel;

// first, all data object form this model in order
for (DataObjectTO internalDataObject : getDataModel().getDataObjects()) {
className = internalDataObject.getClassName();
classLabel = DataModelerUtils.getDataObjectFullLabel(internalDataObject);
isExtensible = !internalDataObject.isAbstract() && !internalDataObject.isFinal() && !internalDataObject.isInterface();
if (isExtensible) {
if (dataObject != null && className.toLowerCase().equals(dataObject.getClassName().toLowerCase())) continue;
sortedClassNames.put(classLabel, className);
}
}
for (Map.Entry<String, String> classNameEntry : sortedClassNames.entrySet()) {
superclassList.addItem(classNameEntry.getKey(), classNameEntry.getValue());
}

// Then add all external types, ordered
sortedClassNames.clear();
for (DataObjectTO externalDataObject : getDataModel().getExternalClasses()) {
className = externalDataObject.getClassName();
classLabel = DataModelerUtils.EXTERNAL_PREFIX + className;
isExtensible = !externalDataObject.isAbstract() && !externalDataObject.isFinal() && !externalDataObject.isInterface();
if (isExtensible) {
if (dataObject != null && className.toLowerCase().equals(dataObject.getClassName().toLowerCase())) continue;
sortedClassNames.put(classLabel, className);
}
}
for (Map.Entry<String, String> classNameEntry : sortedClassNames.entrySet()) {
superclassList.addItem(classNameEntry.getKey(), classNameEntry.getValue());
}

if (dataObject != null && dataObject.getSuperClassName() != null) {
superclassList.setSelectedValue(dataObject.getSuperClassName());
} else {
superclassList.setSelectedValue(NOT_SELECTED);
}
}
}

}
Expand Up @@ -43,8 +43,12 @@ public interface DataModel {

DataObject addDataObject(String packageName, String name, ObjectSource source);

DataObject addDataObject(String packageName, String name, ObjectSource source, int modifiers);

DataObject addDataObject(String className, ObjectSource source);

DataObject addDataObject(String className, ObjectSource source, int modifiers);

DataObject getDataObject(String className, ObjectSource source);

DataObject removeDataObject(String className, ObjectSource source);
Expand Down
Expand Up @@ -39,4 +39,10 @@ public interface DataObject extends HasName, HasPackageName, HasClassName, HasAn

ObjectProperty removeProperty(String name);

boolean isInterface();

boolean isAbstract();

boolean isFinal();

}
Expand Up @@ -21,6 +21,7 @@
import org.kie.workbench.common.services.datamodeller.core.DataModel;
import org.kie.workbench.common.services.datamodeller.core.DataObject;

import java.lang.reflect.Modifier;
import java.util.*;

public class DataModelImpl implements DataModel {
Expand Down Expand Up @@ -87,25 +88,35 @@ public DataObject addDataObject(String packageName, String name) {

@Override
public DataObject addDataObject(String packageName, String name, ObjectSource source) {
return addDataObject(packageName, name, source, Modifier.PUBLIC);
}

@Override
public DataObject addDataObject(String packageName, String name, ObjectSource source, int modifiers) {
switch (source) {
case INTERNAL:
return addDataObject(packageName, name, dataObjects);
return addDataObject(packageName, name, dataObjects, modifiers);
case DEPENDENCY:
return addDataObject(packageName, name, dependencyDataObjects);
return addDataObject(packageName, name, dependencyDataObjects, modifiers);
}
return null;
}

@Override
public DataObject addDataObject(String className, ObjectSource source, int modifiers) {
String name = NamingUtils.getInstance().extractClassName(className);
String packageName = NamingUtils.getInstance().extractPackageName(className);
return addDataObject(packageName, name, source, modifiers);
}

@Override
public DataObject addDataObject(String className) {
return addDataObject(className, ObjectSource.INTERNAL);
}

@Override
public DataObject addDataObject(String className, ObjectSource source) {
String name = NamingUtils.getInstance().extractClassName(className);
String packageName = NamingUtils.getInstance().extractPackageName(className);
return addDataObject(packageName, name, source);
return addDataObject(className, source, Modifier.PUBLIC);
}

private Set<DataObject> getDataObjects(Map<String, DataObject> objectsMap) {
Expand All @@ -114,8 +125,8 @@ private Set<DataObject> getDataObjects(Map<String, DataObject> objectsMap) {
return set;
}

private DataObject addDataObject(String packageName, String name, Map<String, DataObject> objectsMap) {
DataObject dataObject = new DataObjectImpl(packageName, name);
private DataObject addDataObject(String packageName, String name, Map<String, DataObject> objectsMap, int modifiers) {
DataObject dataObject = new DataObjectImpl(packageName, name, modifiers);
objectsMap.put(dataObject.getClassName(), dataObject);
return dataObject;
}
Expand Down

0 comments on commit 5b06bf3

Please sign in to comment.