Skip to content

Commit

Permalink
RHBPMS-1289: Project with persistable data objects added to persisten…
Browse files Browse the repository at this point in the history
…ce descriptor cannot be deployed (kiegroup#370)

- Controll added in order to generate the missing identifier when required
  • Loading branch information
wmedvede authored and csadilek committed May 26, 2016
1 parent 47bb9d1 commit 35195f5
Show file tree
Hide file tree
Showing 9 changed files with 345 additions and 8 deletions.
Expand Up @@ -107,4 +107,14 @@ public static Annotation createAnnotation( String name,
valueHandler.setAllocationSize( allocationSize );
return valueHandler.getAnnotation();
}

public static Annotation createAnnotation( String name, String sequenceName,
Map<String, AnnotationDefinition> annotationDefinitions ) {

SequenceGeneratorValueHandler valueHandler = new SequenceGeneratorValueHandler(
new AnnotationImpl( annotationDefinitions.get( JPADomainAnnotations.JAVAX_PERSISTENCE_SEQUENCE_GENERATOR_ANNOTATION ) ) );
valueHandler.setName( name );
valueHandler.setSequenceName( sequenceName );
return valueHandler.getAnnotation();
}
}
Expand Up @@ -387,6 +387,18 @@ public interface Constants extends Messages {

String persistence_domain_objectEditor_table_field_help();

String persistence_domain_objectEditor_add_identifier_action();

String persistence_domain_objectEditor_dont_add_identifier_action();

String persistence_domain_objectEditor_on_make_persistable_message();

String persistence_domain_objectEditor_required_identifier_is_missing_message();

String persistence_domain_objectEditor_review_relationship_fields_message();

String persistence_domain_objectEditor_review_relationship_field_for_review_message( String fieldName );

String persistence_domain_fieldEditor_identifier_category();

String persistence_domain_fieldEditor_identifier_field_label();
Expand Down
Expand Up @@ -49,6 +49,7 @@
import org.kie.workbench.common.screens.datamodeller.events.DataModelerEvent;
import org.kie.workbench.common.screens.datamodeller.events.DataObjectChangeEvent;
import org.kie.workbench.common.screens.datamodeller.events.DataObjectFieldChangeEvent;
import org.kie.workbench.common.screens.datamodeller.events.DataObjectFieldCreatedEvent;
import org.kie.workbench.common.screens.datamodeller.events.DataObjectFieldDeletedEvent;
import org.kie.workbench.common.screens.datamodeller.events.DataObjectFieldSelectedEvent;
import org.kie.workbench.common.screens.datamodeller.events.DataObjectSelectedEvent;
Expand Down Expand Up @@ -517,6 +518,13 @@ private void onDataObjectPropertyChange( @Observes DataObjectFieldChangeEvent ev
}
}

private void onDataObjectFieldCreated( @Observes DataObjectFieldCreatedEvent event ) {
if ( event.isFromContext( context != null ? context.getContextId() : null ) &&
!DataModelerEvent.DATA_OBJECT_BROWSER.equals( event.getSource() ) ) {
setDataObject( dataObject );
}
}

private void notifyFieldDeleted( ObjectProperty deletedProperty ) {
dataModelerEvent.fire( new DataObjectFieldDeletedEvent( getContext().getContextId(), DataModelerEvent.DATA_OBJECT_BROWSER, getDataObject(), deletedProperty ) );
}
Expand Down
Expand Up @@ -26,9 +26,11 @@
import javax.inject.Inject;

import com.google.gwt.user.client.ui.Widget;
import org.gwtbootstrap3.client.ui.constants.ButtonType;
import org.kie.workbench.common.screens.datamodeller.client.command.DataModelCommand;
import org.kie.workbench.common.screens.datamodeller.client.command.DataModelCommandBuilder;
import org.kie.workbench.common.screens.datamodeller.client.handlers.DomainHandlerRegistry;
import org.kie.workbench.common.screens.datamodeller.client.handlers.jpadomain.util.SequenceGeneratorValueHandler;
import org.kie.workbench.common.screens.datamodeller.client.model.DataModelerPropertyEditorFieldInfo;
import org.kie.workbench.common.screens.datamodeller.client.resources.i18n.Constants;
import org.kie.workbench.common.screens.datamodeller.client.util.AnnotationValueHandler;
Expand All @@ -38,9 +40,13 @@
import org.kie.workbench.common.screens.datamodeller.model.jpadomain.JPADomainAnnotations;
import org.kie.workbench.common.services.datamodeller.core.Annotation;
import org.kie.workbench.common.services.datamodeller.core.DataObject;
import org.kie.workbench.common.services.datamodeller.core.ObjectProperty;
import org.kie.workbench.common.services.datamodeller.core.impl.AnnotationImpl;
import org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants;
import org.uberfire.ext.properties.editor.client.fields.BooleanField;
import org.uberfire.ext.properties.editor.client.fields.TextField;
import org.uberfire.ext.properties.editor.model.PropertyEditorCategory;
import org.uberfire.mvp.Command;

@Dependent
public class JPADataObjectEditor
Expand All @@ -51,6 +57,12 @@ public class JPADataObjectEditor

private JPADataObjectEditorView view;

private static final String EOL = "</BR>";

private static final String BLANK = "&nbsp;";

private static final String TWO_BLANKS = BLANK + BLANK;

@Inject
public JPADataObjectEditor( JPADataObjectEditorView view,
DomainHandlerRegistry handlerRegistry,
Expand Down Expand Up @@ -100,10 +112,47 @@ protected void loadDataObject( DataObject dataObject ) {
public void onEntityFieldChange( String newValue ) {
if ( getDataObject() != null ) {

Boolean doAdd = Boolean.TRUE.toString().equals( newValue );
DataModelCommand command = commandBuilder.buildDataObjectAddOrRemoveAnnotationCommand( getContext(),
getName(), getDataObject(), JPADomainAnnotations.JAVAX_PERSISTENCE_ENTITY_ANNOTATION, doAdd );
command.execute();
final Boolean doAdd = Boolean.parseBoolean( newValue );

if ( doAdd ) {

if ( !hasIdField( getDataObject() ) ) {
List<ObjectProperty> configurableFields = persistenceConfigurableFields( getDataObject() );
String message = buildOnSetPersistableRefactoringMessage( false, configurableFields );

view.showYesNoCancelPopup( CommonConstants.INSTANCE.Warning(),
message,
new Command() {
@Override
public void execute() {
doEntityFieldChange( doAdd, true );
}
},
Constants.INSTANCE.persistence_domain_objectEditor_add_identifier_action(),
ButtonType.PRIMARY,
new Command() {
@Override
public void execute() {
doEntityFieldChange( doAdd, false );
}
},
Constants.INSTANCE.persistence_domain_objectEditor_dont_add_identifier_action(),
ButtonType.DANGER,
new Command() {
@Override
public void execute() {
updateEntityField( null );
loadPropertyEditor();
}
},
CommonConstants.INSTANCE.Cancel(),
ButtonType.DEFAULT );
} else {
doEntityFieldChange( doAdd, false );
}
} else {
doEntityFieldChange( doAdd, false );
}
}
}

Expand All @@ -118,6 +167,19 @@ public void onTableNameChange( String newValue ) {
}
}

//convenient method for facilitating testing
protected void doEntityFieldChange( boolean isPersistable, boolean generateIdenfitier ) {

final DataModelCommand command = commandBuilder.buildDataObjectAddOrRemoveAnnotationCommand( getContext(),
getName(), getDataObject(), JPADomainAnnotations.JAVAX_PERSISTENCE_ENTITY_ANNOTATION, isPersistable );

if ( generateIdenfitier ) {
addByDefaultId( dataObject );
}
command.execute();

}

private void updateEntityField( Annotation annotation ) {
clearEntityField();
if ( annotation != null ) {
Expand Down Expand Up @@ -208,4 +270,116 @@ private void updatePropertyEditorField( String fieldId, Annotation currentValue,
private String getEntityCategoryName() {
return Constants.INSTANCE.persistence_domain_objectEditor_entity_category();
}

private boolean hasIdField( DataObject dataObject ) {
for ( ObjectProperty objectProperty : dataObject.getProperties() ) {
if ( objectProperty.getAnnotation( JPADomainAnnotations.JAVAX_PERSISTENCE_ID_ANNOTATION ) != null ) {
return true;
}
}
return false;
}

private List<ObjectProperty> persistenceConfigurableFields( DataObject dataObject ) {
List<ObjectProperty> result = new ArrayList<ObjectProperty>( );
for ( ObjectProperty field : dataObject.getProperties() ) {
if ( DataModelerUtils.isManagedProperty( field ) && ( field.isMultiple() || !field.isBaseType() ) ) {
result.add( field );
}
}
return result;
}

private void addByDefaultId( DataObject dataObject ) {

//add the by default id field
String idFieldName = generateIdFieldName( dataObject );

commandBuilder.buildAddPropertyCommand(
getContext(),
getName(),
dataObject,
idFieldName,
null,
Long.class.getName(),
false ).execute();

ObjectProperty idField = dataObject.getProperty( idFieldName );

commandBuilder.buildFieldAnnotationAddCommand( getContext(),
getName(),
dataObject,
idField,
JPADomainAnnotations.JAVAX_PERSISTENCE_ID_ANNOTATION ).execute();

//set the by default generated value annotation.
String generatorName = dataObject.getName().toUpperCase() + "_ID_GENERATOR";
Annotation generatedValue = new AnnotationImpl( context.getAnnotationDefinition(
JPADomainAnnotations.JAVAX_PERSISTENCE_GENERATED_VALUE_ANNOTATION ) );
generatedValue.setValue( "generator", generatorName );
generatedValue.setValue( "strategy", "AUTO" );

commandBuilder.buildFieldAnnotationAddCommand( getContext(),
getName(),
dataObject,
idField,
generatedValue ).execute();

//set by default sequence generator
String sequenceName = dataObject.getName().toUpperCase() + "_ID_SEQ";
Annotation sequenceGenerator = SequenceGeneratorValueHandler.createAnnotation( generatorName, sequenceName,
context.getAnnotationDefinitions() );

commandBuilder.buildFieldAnnotationAddCommand( getContext(),
getName(),
dataObject,
idField,
sequenceGenerator ).execute();
}

private String generateIdFieldName( DataObject dataObject ) {
String id = "id";
int i = 1;
boolean generated = false;
while ( !generated ) {
if ( dataObject.getProperty( id ) == null ) {
generated = true;
} else {
id = "id"+i;
i++;
}
}
return id;
}

private String buildOnSetPersistableRefactoringMessage( boolean hasIdentifier,
List<ObjectProperty> configurableFields ) {

StringBuilder message = new StringBuilder();
message.append( Constants.INSTANCE.persistence_domain_objectEditor_on_make_persistable_message() );
message.append( EOL );

if ( !hasIdentifier ) {
message.append(
Constants.INSTANCE.persistence_domain_objectEditor_required_identifier_is_missing_message() );
}

if ( configurableFields.size() > 0 ) {
message.append( Constants.INSTANCE.persistence_domain_objectEditor_review_relationship_fields_message() );
message.append( TWO_BLANKS );

boolean isFirst = true;
for ( ObjectProperty field : configurableFields ) {
if ( !isFirst ) {
message.append( "," + TWO_BLANKS );
}
isFirst = false;
message.append(
Constants.INSTANCE.persistence_domain_objectEditor_review_relationship_field_for_review_message(
field.getName() ) );
}
}

return message.toString();
}
}
Expand Up @@ -18,8 +18,10 @@

import java.util.List;

import org.gwtbootstrap3.client.ui.constants.ButtonType;
import org.kie.workbench.common.screens.datamodeller.client.widgets.common.domain.BaseEditorView;
import org.uberfire.ext.properties.editor.model.PropertyEditorCategory;
import org.uberfire.mvp.Command;

public interface JPADataObjectEditorView
extends BaseEditorView<JPADataObjectEditorView.Presenter> {
Expand All @@ -39,4 +41,15 @@ interface Presenter {

void setLastOpenAccordionGroupTitle( String accordionGroupTitle );

void showYesNoCancelPopup( String title,
String message,
Command yesCommand,
String yesButtonText,
ButtonType yesButtonType,
Command noCommand,
String noButtonText,
ButtonType noButtonType,
Command cancelCommand,
String cancelButtonText,
ButtonType cancelButtonType );
}
Expand Up @@ -26,12 +26,15 @@
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import org.gwtbootstrap3.client.ui.constants.ButtonType;
import org.kie.workbench.common.screens.datamodeller.client.model.DataModelerPropertyEditorFieldInfo;
import org.uberfire.ext.properties.editor.client.PropertyEditorWidget;
import org.uberfire.ext.properties.editor.model.PropertyEditorCategory;
import org.uberfire.ext.properties.editor.model.PropertyEditorChangeEvent;
import org.uberfire.ext.properties.editor.model.PropertyEditorEvent;
import org.uberfire.ext.properties.editor.model.PropertyEditorFieldInfo;
import org.uberfire.ext.widgets.common.client.common.popups.YesNoCancelPopup;
import org.uberfire.mvp.Command;

@Dependent
public class JPADataObjectEditorViewImpl
Expand Down Expand Up @@ -98,4 +101,33 @@ private boolean isFromCurrentEditor( String propertyEditorEventId ) {
return getCurrentEditorEventId().equals( propertyEditorEventId );
}


@Override
public void showYesNoCancelPopup( String title,
String message,
Command yesCommand,
String yesButtonText,
ButtonType yesButtonType,
Command noCommand,
String noButtonText,
ButtonType noButtonType,
Command cancelCommand,
String cancelButtonText,
ButtonType cancelButtonType ) {

YesNoCancelPopup yesNoCancelPopup = YesNoCancelPopup.newYesNoCancelPopup( title,
message,
yesCommand,
yesButtonText,
yesButtonType,
noCommand,
noButtonText,
noButtonType,
cancelCommand,
cancelButtonText,
cancelButtonType );
yesNoCancelPopup.setClosable( false );
yesNoCancelPopup.show();
}

}
Expand Up @@ -269,6 +269,20 @@ persistence_domain_objectEditor_table_field_label=Table name
persistence_domain_objectEditor_table_field_help_heading=Table name
persistence_domain_objectEditor_table_field_help=Optional value that sets the database table name for the given Data Object.

persistence_domain_objectEditor_on_make_persistable_message=An already created Data Object is about to be made persistable.</BR>

persistence_domain_objectEditor_required_identifier_is_missing_message=The required <B><I>Identifier</I></B> field was not found \
in current Data Object. <B><I>Do you want to automatically generate it?</I></B></BR></BR>

persistence_domain_objectEditor_review_relationship_fields_message=The following relationship fields may have to be \
manually reviewed for adding any missing relationship configuration options:

persistence_domain_objectEditor_review_relationship_field_for_review_message=<B><I>{0}</I></B>

persistence_domain_objectEditor_add_identifier_action=Yes, generate

#single quote char is escaped with a single quote char
persistence_domain_objectEditor_dont_add_identifier_action=No, don''t generate

persistence_domain_fieldEditor_identifier_category=Identifier Properties

Expand Down
Expand Up @@ -37,6 +37,8 @@

public class DomainEditorBaseTest {

public enum PopupActions { YES, NO, CANCEL };

@Mock
protected DomainHandlerRegistry handlerRegistry;

Expand Down

0 comments on commit 35195f5

Please sign in to comment.