From 806f6c047841bf326f07ef8846575e39ea4ae4e1 Mon Sep 17 00:00:00 2001 From: swsalvi Date: Wed, 10 Sep 2025 14:14:42 -0400 Subject: [PATCH 1/8] Fix for bug IIA-2836 Definition under concept title is incorrect and updates based on wrong preference --- .../observable/ObservableConcept.java | 20 ++- .../observable/ObservableConceptVersion.java | 9 ++ .../observable/ObservableEntity.java | 9 +- .../observable/ObservablePattern.java | 12 +- .../observable/ObservablePatternVersion.java | 8 + .../observable/ObservableSemanticVersion.java | 8 + .../observable/ObservableVersion.java | 4 + .../mvvm/viewmodel/StampAddFormViewModel.java | 140 ++++++++++-------- 8 files changed, 144 insertions(+), 66 deletions(-) diff --git a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConcept.java b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConcept.java index da87adda8..4bcb965be 100644 --- a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConcept.java +++ b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConcept.java @@ -17,7 +17,13 @@ import dev.ikm.tinkar.coordinate.stamp.calculator.StampCalculator; import dev.ikm.tinkar.coordinate.view.calculator.ViewCalculator; -import dev.ikm.tinkar.entity.*; +import dev.ikm.tinkar.entity.ConceptEntity; +import dev.ikm.tinkar.entity.ConceptRecord; +import dev.ikm.tinkar.entity.ConceptVersionRecord; +import dev.ikm.tinkar.entity.Entity; +import dev.ikm.tinkar.entity.EntityVersion; +import dev.ikm.tinkar.entity.FieldDefinitionRecord; +import dev.ikm.tinkar.entity.FieldRecord; import dev.ikm.tinkar.terms.TinkarTerm; import org.eclipse.collections.api.factory.Maps; import org.eclipse.collections.api.map.ImmutableMap; @@ -32,7 +38,17 @@ public final class ObservableConcept @Override protected ObservableConceptVersion wrap(ConceptVersionRecord version) { - return new ObservableConceptVersion(version); + ObservableConceptVersion observableConceptVersion = new ObservableConceptVersion(version); + observableConceptVersion.versionProperty.addListener((observable, oldValue, newValue) -> { + updateEntity(newValue, oldValue); + }); + return observableConceptVersion; + } + + private void updateEntity(ConceptVersionRecord newConceptVersionRecord, ConceptVersionRecord oldConceptVersionRecord) { + ConceptRecord semantic = Entity.getFast(newConceptVersionRecord.nid()); + ConceptRecord analogue = semantic.with(newConceptVersionRecord).build(); + saveToDB(analogue, newConceptVersionRecord, oldConceptVersionRecord); } @Override diff --git a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConceptVersion.java b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConceptVersion.java index 405821967..45ed6d969 100644 --- a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConceptVersion.java +++ b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableConceptVersion.java @@ -153,4 +153,13 @@ public ImmutableMap getObservableFields() { return fieldMap.toImmutable(); } + @Override + public ConceptVersionRecord updateStampNid(int stampNid) { + ConceptVersionRecord newConceptVersionRecord = null; + ConceptVersionRecord conceptVersionRecord = version(); + newConceptVersionRecord = conceptVersionRecord.with().stampNid(stampNid).build(); + + return newConceptVersionRecord; + } + } diff --git a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableEntity.java b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableEntity.java index 655ac8c00..d7002412c 100644 --- a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableEntity.java +++ b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableEntity.java @@ -17,8 +17,6 @@ import static dev.ikm.tinkar.events.EntityVersionChangeEvent.VERSION_UPDATED; import static dev.ikm.tinkar.events.FrameworkTopics.VERSION_CHANGED_TOPIC; -import dev.ikm.tinkar.events.EntityVersionChangeEvent; -import dev.ikm.tinkar.events.EvtBusFactory; import dev.ikm.tinkar.collection.ConcurrentReferenceHashMap; import dev.ikm.tinkar.common.util.broadcast.Subscriber; import dev.ikm.tinkar.component.FieldDataType; @@ -33,6 +31,8 @@ import dev.ikm.tinkar.entity.SemanticRecord; import dev.ikm.tinkar.entity.StampEntity; import dev.ikm.tinkar.entity.StampRecord; +import dev.ikm.tinkar.events.EntityVersionChangeEvent; +import dev.ikm.tinkar.events.EvtBusFactory; import javafx.application.Platform; import org.eclipse.collections.api.factory.Lists; import org.eclipse.collections.api.list.ImmutableList; @@ -76,8 +76,11 @@ public abstract sealed class ObservableEntity, V * @param newVersionRecord entity version record */ public void saveToDB(Entity analogue, EntityVersion newVersionRecord , EntityVersion oldVersionRecord) { - Entity.provider().putEntity(analogue); versionPropertyMap.put(newVersionRecord.stamp().nid(), wrap((V)newVersionRecord)); + if(oldVersionRecord.uncommitted()){ + versionPropertyMap.remove(oldVersionRecord.stamp().nid()); + } + Entity.provider().putEntity(analogue); EvtBusFactory.getDefaultEvtBus() .publish(VERSION_CHANGED_TOPIC, new EntityVersionChangeEvent(this, VERSION_UPDATED, newVersionRecord)); } diff --git a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePattern.java b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePattern.java index 73471866f..925444272 100644 --- a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePattern.java +++ b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePattern.java @@ -32,7 +32,17 @@ public final class ObservablePattern @Override protected ObservablePatternVersion wrap(PatternVersionRecord version) { - return new ObservablePatternVersion(version); + ObservablePatternVersion observablePatternVersion = new ObservablePatternVersion(version); + observablePatternVersion.versionProperty.addListener((observable, oldValue, newValue) -> { + updateEntity(newValue, oldValue); + }); + return observablePatternVersion; + } + + private void updateEntity(PatternVersionRecord newPatternVersionRecord, PatternVersionRecord oldPatternVersionRecord) { + PatternRecord semantic = Entity.getFast(newPatternVersionRecord.nid()); + PatternRecord analogue = semantic.with(newPatternVersionRecord).build(); + saveToDB(analogue, newPatternVersionRecord, oldPatternVersionRecord); } @Override diff --git a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePatternVersion.java b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePatternVersion.java index 794812d9c..b31e8bae6 100644 --- a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePatternVersion.java +++ b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservablePatternVersion.java @@ -265,4 +265,12 @@ public ImmutableMap getObservableFields() { return fieldMap.toImmutable(); } + @Override + public PatternVersionRecord updateStampNid(int stampNid) { + PatternVersionRecord currentPatternVersionRecord = version(); + PatternVersionRecord newPatternVersionRecord = currentPatternVersionRecord.with().stampNid(stampNid).build(); + + return newPatternVersionRecord; + } + } diff --git a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableSemanticVersion.java b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableSemanticVersion.java index 6b64d281d..7c456729c 100644 --- a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableSemanticVersion.java +++ b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableSemanticVersion.java @@ -287,4 +287,12 @@ public ImmutableMap getObservableFields() { return fieldMap.toImmutable(); } + @Override + public SemanticVersionRecord updateStampNid(int stampNid) { + SemanticVersionRecord currentSemanticVersionRecord = version(); + SemanticVersionRecord newSemanticVersionRecord = currentSemanticVersionRecord.with().stampNid(stampNid).build(); + + return newSemanticVersionRecord; + } + } diff --git a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableVersion.java b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableVersion.java index 9094cbbbc..d51534a65 100644 --- a/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableVersion.java +++ b/framework/src/main/java/dev/ikm/komet/framework/observable/ObservableVersion.java @@ -135,6 +135,10 @@ public EntityVersion getEntityVersion(){ protected abstract V withStampNid(int stampNid); + public V updateStampNid(int stampNid) { + return withStampNid(stampNid); + } + public ObjectProperty versionProperty() { return versionProperty; } diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java index 49dfb52b2..c8a207bc4 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java @@ -1,21 +1,33 @@ package dev.ikm.komet.kview.mvvm.viewmodel; +import static dev.ikm.komet.kview.mvvm.model.DataModelHelper.fetchDescendentsOfConcept; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.AUTHOR; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.CLEAR_RESET_BUTTON_TEXT; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.CURRENT_STAMP; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.FORM_TIME_TEXT; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.FORM_TITLE; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.IS_CONFIRMED_OR_SUBMITTED; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.IS_STAMP_VALUES_THE_SAME_OR_EMPTY; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.MODULE; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.MODULES; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.PATH; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.PATHS; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.STATUS; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.STATUSES; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.SUBMIT_BUTTON_TEXT; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.TIME; import dev.ikm.komet.framework.controls.TimeUtils; +import dev.ikm.komet.framework.observable.ObservableEntity; +import dev.ikm.komet.framework.observable.ObservableEntitySnapshot; +import dev.ikm.komet.framework.observable.ObservableVersion; import dev.ikm.komet.framework.view.ViewProperties; import dev.ikm.komet.kview.events.ClosePropertiesPanelEvent; import dev.ikm.komet.kview.mvvm.view.genediting.ConfirmationDialogController; import dev.ikm.tinkar.component.Stamp; -import dev.ikm.tinkar.composer.Composer; -import dev.ikm.tinkar.composer.Session; -import dev.ikm.tinkar.composer.assembler.ConceptAssembler; -import dev.ikm.tinkar.composer.assembler.PatternAssemblerConsumer; -import dev.ikm.tinkar.composer.assembler.SemanticAssemblerConsumer; -import dev.ikm.tinkar.coordinate.stamp.calculator.Latest; import dev.ikm.tinkar.entity.ConceptEntity; import dev.ikm.tinkar.entity.EntityVersion; -import dev.ikm.tinkar.entity.PatternVersionRecord; -import dev.ikm.tinkar.entity.SemanticVersionRecord; import dev.ikm.tinkar.entity.StampEntity; +import dev.ikm.tinkar.entity.transaction.Transaction; import dev.ikm.tinkar.events.EvtBusFactory; import dev.ikm.tinkar.events.Subscriber; import dev.ikm.tinkar.terms.ConceptFacade; @@ -26,13 +38,9 @@ import javafx.scene.Node; import java.util.List; +import java.util.Set; import java.util.UUID; -import java.util.*; - -import static dev.ikm.komet.kview.mvvm.model.DataModelHelper.fetchDescendentsOfConcept; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.*; - public class StampAddFormViewModel extends StampFormViewModelBase { /** * Provide the standard Confirm Clear dialog title for use in other classes @@ -169,58 +177,70 @@ public StampAddFormViewModel save() { // ----------- Get values from the UI form ------------ State status = getValue(STATUS); + EntityFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); EntityFacade module = getValue(MODULE); EntityFacade path = getValue(PATH); - EntityFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); // ----------- Save stamp on the Database -------------- - Composer composer = new Composer("Save new STAMP in Component"); - - Session session = composer.open(status, author.toProxy(), module.toProxy(), path.toProxy()); - - switch (stampType) { - case CONCEPT -> { - session.compose((ConceptAssembler conceptAssembler) -> { - conceptAssembler.concept(entityFacade.toProxy()); - }); - } - // TODO: implement better handing of empty latestEntityVersion - case PATTERN -> { - Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); - EntityVersion entityVersion = latestEntityVersion.get(); - PatternVersionRecord patternVersionRecord = (PatternVersionRecord) entityVersion; - - session.compose((PatternAssemblerConsumer) patternAssembler -> { patternAssembler - .pattern(entityFacade.toProxy()) - .meaning(patternVersionRecord.semanticMeaning().toProxy()) - .purpose(patternVersionRecord.semanticPurpose().toProxy()); - - // Add the field definitions - ((PatternVersionRecord) entityVersion).fieldDefinitions().forEach(fieldDefinitionRecord -> { - ConceptEntity fieldMeaning = fieldDefinitionRecord.meaning(); - ConceptEntity fieldPurpose = fieldDefinitionRecord.purpose(); - ConceptEntity fieldDataType = fieldDefinitionRecord.dataType(); - patternAssembler.fieldDefinition(fieldMeaning.toProxy(), fieldPurpose.toProxy(), fieldDataType.toProxy()); - }); - }); - } - case SEMANTIC -> { - Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); - EntityVersion entityVersion = latestEntityVersion.get(); - SemanticVersionRecord semanticVersionRecord = (SemanticVersionRecord) entityVersion; - - session.compose((SemanticAssemblerConsumer) semanticAssembler -> semanticAssembler - .semantic(entityFacade.toProxy()) - .pattern(semanticVersionRecord.pattern().toProxy()) - .reference(semanticVersionRecord.referencedComponent().toProxy()) - .fieldValues(vals -> vals.withAll(semanticVersionRecord.fieldValues())) - ); +// Composer composer = new Composer("Save new STAMP in Component"); +// +// Session session = composer.open(status, author.toProxy(), module.toProxy(), path.toProxy()); +// +// switch (stampType) { +// case CONCEPT -> { +// session.compose((ConceptAssembler conceptAssembler) -> { +// conceptAssembler.concept(entityFacade.toProxy()); +// }); +// } +// // TODO: implement better handing of empty latestEntityVersion +// case PATTERN -> { +// Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); +// EntityVersion entityVersion = latestEntityVersion.get(); +// PatternVersionRecord patternVersionRecord = (PatternVersionRecord) entityVersion; +// +// session.compose((PatternAssemblerConsumer) patternAssembler -> { patternAssembler +// .pattern(entityFacade.toProxy()) +// .meaning(patternVersionRecord.semanticMeaning().toProxy()) +// .purpose(patternVersionRecord.semanticPurpose().toProxy()); +// +// // Add the field definitions +// ((PatternVersionRecord) entityVersion).fieldDefinitions().forEach(fieldDefinitionRecord -> { +// ConceptEntity fieldMeaning = fieldDefinitionRecord.meaning(); +// ConceptEntity fieldPurpose = fieldDefinitionRecord.purpose(); +// ConceptEntity fieldDataType = fieldDefinitionRecord.dataType(); +// patternAssembler.fieldDefinition(fieldMeaning.toProxy(), fieldPurpose.toProxy(), fieldDataType.toProxy()); +// }); +// }); +// } +// case SEMANTIC -> { +// Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); +// EntityVersion entityVersion = latestEntityVersion.get(); +// SemanticVersionRecord semanticVersionRecord = (SemanticVersionRecord) entityVersion; +// +// session.compose((SemanticAssemblerConsumer) semanticAssembler -> semanticAssembler +// .semantic(entityFacade.toProxy()) +// .pattern(semanticVersionRecord.pattern().toProxy()) +// .reference(semanticVersionRecord.referencedComponent().toProxy()) +// .fieldValues(vals -> vals.withAll(semanticVersionRecord.fieldValues())) +// ); +// } +// default -> throw new RuntimeException("Stamp Type " + stampType + " not supported"); +// } +// +// composer.commitSession(session); + + + Transaction transaction = Transaction.make(); + StampEntity stampEntity = transaction.getStampForEntities(status, author.nid(), module.nid(), path.nid(), entityFacade); + + ObservableEntity observableEntity = ObservableEntity.get(entityFacade.nid()); + ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); + observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { + if (latestVersion instanceof ObservableVersion observableVersion) { + observableVersion.versionProperty().set(observableVersion.updateStampNid(stampEntity.nid())); } - default -> throw new RuntimeException("Stamp Type " + stampType + " not supported"); - } - - composer.commitSession(session); - + }); + transaction.commit(); // Load the new STAMP and store the new initial values loadStamp(); From 1096fe305e8ab262af68166835745e29dc1d067a Mon Sep 17 00:00:00 2001 From: swsalvi Date: Wed, 10 Sep 2025 16:22:30 -0400 Subject: [PATCH 2/8] Used common code for reterive committed version --- .../komet/kview/klfields/KlFieldHelper.java | 64 ++++++++++--- .../kview/mvvm/view/concept/ConceptNode.java | 4 +- .../GenEditingDetailsController.java | 92 +++++++++---------- .../genediting/SemanticFieldsController.java | 62 ++++++++----- 4 files changed, 138 insertions(+), 84 deletions(-) diff --git a/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java b/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java index efe3348f1..7f34b8a2c 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java +++ b/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java @@ -25,11 +25,11 @@ import static dev.ikm.tinkar.terms.TinkarTerm.UUID_FIELD; import static dev.ikm.tinkar.terms.TinkarTerm.VERTEX_FIELD; import dev.ikm.komet.framework.observable.ObservableEntity; +import dev.ikm.komet.framework.observable.ObservableEntitySnapshot; import dev.ikm.komet.framework.observable.ObservableField; import dev.ikm.komet.framework.observable.ObservablePatternSnapshot; import dev.ikm.komet.framework.observable.ObservablePatternVersion; -import dev.ikm.komet.framework.observable.ObservableSemanticSnapshot; -import dev.ikm.komet.framework.observable.ObservableSemanticVersion; +import dev.ikm.komet.framework.observable.ObservableVersion; import dev.ikm.komet.framework.view.ViewProperties; import dev.ikm.komet.kview.controls.KLReadOnlyBaseControl; import dev.ikm.komet.kview.controls.KLReadOnlyComponentControl; @@ -48,11 +48,16 @@ import dev.ikm.komet.kview.klfields.stringfield.KlStringFieldFactory; import dev.ikm.tinkar.common.id.IntIds; import dev.ikm.tinkar.coordinate.stamp.calculator.Latest; -import dev.ikm.tinkar.entity.*; -import dev.ikm.tinkar.terms.*; +import dev.ikm.tinkar.entity.Entity; +import dev.ikm.tinkar.entity.EntityVersion; +import dev.ikm.tinkar.entity.FieldRecord; +import dev.ikm.tinkar.entity.PatternEntityVersion; +import dev.ikm.tinkar.entity.PatternVersionRecord; +import dev.ikm.tinkar.terms.EntityFacade; +import dev.ikm.tinkar.terms.PatternFacade; import javafx.embed.swing.SwingFXUtils; import javafx.scene.Node; -import javafx.scene.control.*; +import javafx.scene.control.Tooltip; import javafx.scene.image.Image; import org.eclipse.collections.api.factory.Lists; import org.eclipse.collections.api.list.ImmutableList; @@ -63,7 +68,11 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.UUID; import java.util.concurrent.atomic.AtomicReference; public class KlFieldHelper { @@ -280,20 +289,45 @@ public static ImmutableList createDefaultFieldValues(EntityFacade patter * * @return entityVersionLatest * */ - public static Latest retrieveCommittedLatestVersion(ObservableSemanticSnapshot observableSemanticSnapshot) { - if(observableSemanticSnapshot == null){ +// public static Latest retrieveCommittedLatestVersion(ObservableSemanticSnapshot observableSemanticSnapshot) { +// if(observableSemanticSnapshot == null){ +// return new Latest<>(); +// } +// AtomicReference> entityVersionLatest = new AtomicReference<>(); +// SemanticEntityVersion semanticEntityVersion = (SemanticEntityVersion) observableSemanticSnapshot.getLatestVersion().get().getEntityVersion(); +// if(semanticEntityVersion.committed()){ +// return new Latest<>(semanticEntityVersion); +// } +// //Get list of previously committed data sorted in latest at the top. +// ImmutableList observableSemanticVersionImmutableList = observableSemanticSnapshot.getHistoricVersions(); +// // Filter out Uncommitted data. Data whose time stamp parameter is Long.MAX_VALUE. and get the 1st available. +// Optional observableSemanticVersionOptional = observableSemanticVersionImmutableList.stream().filter(p -> p.stamp().time() != Long.MAX_VALUE).findFirst(); +// observableSemanticVersionOptional.ifPresentOrElse((p) -> { +// entityVersionLatest.set(new Latest<>(p)); +// }, () -> {entityVersionLatest.set(new Latest<>());}); +// return entityVersionLatest.get(); +// } + + /** + * This method will return the latest commited version. + * + * @return entityVersionLatest + * */ + public static Latest retrieveCommittedLatestVersion(ObservableEntitySnapshot observableEntitySnapshot) { + if(observableEntitySnapshot == null){ return new Latest<>(); } - AtomicReference> entityVersionLatest = new AtomicReference<>(); - SemanticEntityVersion semanticEntityVersion = (SemanticEntityVersion) observableSemanticSnapshot.getLatestVersion().get().getEntityVersion(); - if(semanticEntityVersion.committed()){ - return new Latest<>(semanticEntityVersion); + AtomicReference> entityVersionLatest = new AtomicReference<>(); + ObservableVersion observableVersion = (ObservableVersion) observableEntitySnapshot.getLatestVersion().get(); + EntityVersion entityVersion = observableVersion.getEntityVersion(); + if(entityVersion.committed()){ + return new Latest<>(entityVersion); } //Get list of previously committed data sorted in latest at the top. - ImmutableList observableSemanticVersionImmutableList = observableSemanticSnapshot.getHistoricVersions(); + ImmutableList historicVersions = observableEntitySnapshot.getHistoricVersions(); // Filter out Uncommitted data. Data whose time stamp parameter is Long.MAX_VALUE. and get the 1st available. - Optional observableSemanticVersionOptional = observableSemanticVersionImmutableList.stream().filter(p -> p.stamp().time() != Long.MAX_VALUE).findFirst(); - observableSemanticVersionOptional.ifPresentOrElse((p) -> { + Optional optionalObservableVersion = historicVersions.stream().filter(p -> p.stamp().time() != Long.MAX_VALUE).findFirst(); + optionalObservableVersion.ifPresentOrElse((p) -> { entityVersionLatest.set(new Latest<>(p)); }, () -> {entityVersionLatest.set(new Latest<>());}); return entityVersionLatest.get(); diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/concept/ConceptNode.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/concept/ConceptNode.java index 01d8a59f9..1a76a3fce 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/concept/ConceptNode.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/concept/ConceptNode.java @@ -181,8 +181,8 @@ private void registerListeners(ViewProperties viewProperties) { toolTipTextProperty.set(viewProperties.calculator().getFullyQualifiedDescriptionTextWithFallbackOrNid(newEntityFacade)); // Also publish(dispatch) to any subscribers of this view. - if (PUBLISH.keyForOption().equals(super.optionForActivityStreamKeyProperty.get()) || - SYNCHRONIZE.keyForOption().equals(super.optionForActivityStreamKeyProperty.get())) { + if (getActivityStream() !=null && (PUBLISH.keyForOption().equals(super.optionForActivityStreamKeyProperty.get()) || + SYNCHRONIZE.keyForOption().equals(super.optionForActivityStreamKeyProperty.get()))) { getActivityStream().dispatch(newEntityFacade); } diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/GenEditingDetailsController.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/GenEditingDetailsController.java index 83fc021f8..0c7412ae5 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/GenEditingDetailsController.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/GenEditingDetailsController.java @@ -15,16 +15,41 @@ */ package dev.ikm.komet.kview.mvvm.view.genediting; +import static dev.ikm.komet.kview.events.ClosePropertiesPanelEvent.CLOSE_PROPERTIES; +import static dev.ikm.komet.kview.events.genediting.GenEditingEvent.PUBLISH; +import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.CLOSE_PANEL; +import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.NO_SELECTION_MADE_PANEL; +import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.OPEN_PANEL; +import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.SHOW_ADD_REFERENCE_SEMANTIC_FIELD; +import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.SHOW_EDIT_SEMANTIC_FIELDS; +import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.SHOW_EDIT_SINGLE_SEMANTIC_FIELD; +import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.isClosed; +import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.isOpen; +import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.slideIn; +import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.slideOut; +import static dev.ikm.komet.kview.fxutils.ViewportHelper.clipChildren; +import static dev.ikm.komet.kview.fxutils.window.DraggableSupport.addDraggableNodes; +import static dev.ikm.komet.kview.fxutils.window.DraggableSupport.removeDraggableNodes; +import static dev.ikm.komet.kview.klfields.KlFieldHelper.retrieveCommittedLatestVersion; +import static dev.ikm.komet.kview.mvvm.view.journal.JournalController.toast; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.CREATE; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.CURRENT_JOURNAL_WINDOW_TOPIC; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.EDIT; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.MODE; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.VIEW_PROPERTIES; +import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.PATTERN; +import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.REF_COMPONENT; +import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.SEMANTIC; +import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.STAMP_VIEW_MODEL; +import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.WINDOW_TOPIC; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.AUTHOR; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.IS_CONFIRMED_OR_SUBMITTED; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.MODULE; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.PATH; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.STATUS; +import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.TIME; import dev.ikm.komet.framework.Identicon; import dev.ikm.komet.framework.controls.TimeUtils; -import dev.ikm.komet.kview.common.ViewCalculatorUtils; -import dev.ikm.komet.kview.controls.StampViewControl; -import dev.ikm.komet.kview.events.ClosePropertiesPanelEvent; -import dev.ikm.komet.kview.events.StampEvent; -import dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase; -import dev.ikm.tinkar.events.EvtBusFactory; -import dev.ikm.tinkar.events.EvtType; -import dev.ikm.tinkar.events.Subscriber; import dev.ikm.komet.framework.observable.ObservableEntity; import dev.ikm.komet.framework.observable.ObservableField; import dev.ikm.komet.framework.observable.ObservablePattern; @@ -35,11 +60,15 @@ import dev.ikm.komet.framework.observable.ObservableSemanticVersion; import dev.ikm.komet.framework.view.ViewMenuModel; import dev.ikm.komet.framework.view.ViewProperties; +import dev.ikm.komet.kview.common.ViewCalculatorUtils; import dev.ikm.komet.kview.controls.ComponentItem; import dev.ikm.komet.kview.controls.KLReadOnlyBaseControl; import dev.ikm.komet.kview.controls.KLReadOnlyComponentControl; -import dev.ikm.komet.kview.controls.Toast; import dev.ikm.komet.kview.controls.PublicIDControl; +import dev.ikm.komet.kview.controls.StampViewControl; +import dev.ikm.komet.kview.controls.Toast; +import dev.ikm.komet.kview.events.ClosePropertiesPanelEvent; +import dev.ikm.komet.kview.events.StampEvent; import dev.ikm.komet.kview.events.genediting.GenEditingEvent; import dev.ikm.komet.kview.events.genediting.PropertyPanelEvent; import dev.ikm.komet.kview.fxutils.SlideOutTrayHelper; @@ -47,6 +76,7 @@ import dev.ikm.komet.kview.mvvm.model.DataModelHelper; import dev.ikm.komet.kview.mvvm.view.stamp.StampEditController; import dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel; +import dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase; import dev.ikm.tinkar.coordinate.language.calculator.LanguageCalculator; import dev.ikm.tinkar.coordinate.stamp.calculator.Latest; import dev.ikm.tinkar.coordinate.view.calculator.ViewCalculator; @@ -60,7 +90,12 @@ import dev.ikm.tinkar.entity.SemanticEntity; import dev.ikm.tinkar.entity.SemanticEntityVersion; import dev.ikm.tinkar.entity.transaction.Transaction; -import dev.ikm.tinkar.terms.*; +import dev.ikm.tinkar.events.EvtBusFactory; +import dev.ikm.tinkar.events.EvtType; +import dev.ikm.tinkar.events.Subscriber; +import dev.ikm.tinkar.terms.EntityFacade; +import dev.ikm.tinkar.terms.PatternFacade; +import dev.ikm.tinkar.terms.State; import javafx.application.Platform; import javafx.beans.property.ObjectProperty; import javafx.event.ActionEvent; @@ -80,7 +115,6 @@ import javafx.scene.layout.Pane; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; -import javafx.scene.text.Text; import org.carlfx.cognitive.loader.Config; import org.carlfx.cognitive.loader.FXMLMvvmLoader; import org.carlfx.cognitive.loader.InjectViewModel; @@ -100,40 +134,6 @@ import java.util.function.Consumer; import java.util.stream.Collectors; -import static dev.ikm.komet.kview.events.ClosePropertiesPanelEvent.CLOSE_PROPERTIES; -import static dev.ikm.komet.kview.events.genediting.GenEditingEvent.PUBLISH; -import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.CLOSE_PANEL; -import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.NO_SELECTION_MADE_PANEL; -import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.OPEN_PANEL; -import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.SHOW_ADD_REFERENCE_SEMANTIC_FIELD; -import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.SHOW_EDIT_SEMANTIC_FIELDS; -import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.SHOW_EDIT_SINGLE_SEMANTIC_FIELD; -import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.isClosed; -import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.isOpen; -import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.slideIn; -import static dev.ikm.komet.kview.fxutils.SlideOutTrayHelper.slideOut; -import static dev.ikm.komet.kview.fxutils.ViewportHelper.clipChildren; -import static dev.ikm.komet.kview.fxutils.window.DraggableSupport.addDraggableNodes; -import static dev.ikm.komet.kview.fxutils.window.DraggableSupport.removeDraggableNodes; -import static dev.ikm.komet.kview.klfields.KlFieldHelper.retrieveCommittedLatestVersion; -import static dev.ikm.komet.kview.mvvm.view.journal.JournalController.toast; -import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.CREATE; -import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.CURRENT_JOURNAL_WINDOW_TOPIC; -import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.EDIT; -import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.MODE; -import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.VIEW_PROPERTIES; -import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.PATTERN; -import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.REF_COMPONENT; -import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.SEMANTIC; -import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.STAMP_VIEW_MODEL; -import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.WINDOW_TOPIC; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.AUTHOR; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.IS_CONFIRMED_OR_SUBMITTED; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.MODULE; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.PATH; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.STATUS; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.TIME; - public class GenEditingDetailsController { private static final Logger LOG = LoggerFactory.getLogger(GenEditingDetailsController.class); @@ -232,7 +232,7 @@ public class GenEditingDetailsController { private List subscriberList = new ArrayList<>(); - private Latest semanticEntityVersionLatest; + private Latest semanticEntityVersionLatest; private ObservableSemantic observableSemantic; diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java index d87801567..177083075 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java @@ -16,10 +16,31 @@ package dev.ikm.komet.kview.mvvm.view.genediting; -import dev.ikm.tinkar.events.EntityVersionChangeEvent; -import dev.ikm.tinkar.events.EvtBusFactory; -import dev.ikm.tinkar.events.Subscriber; -import dev.ikm.komet.framework.observable.*; +import static dev.ikm.komet.kview.events.EventTopics.SAVE_PATTERN_TOPIC; +import static dev.ikm.komet.kview.events.genediting.GenEditingEvent.PUBLISH; +import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.CLOSE_PANEL; +import static dev.ikm.komet.kview.klfields.KlFieldHelper.calculateHashValue; +import static dev.ikm.komet.kview.klfields.KlFieldHelper.createDefaultFieldValues; +import static dev.ikm.komet.kview.klfields.KlFieldHelper.generateNode; +import static dev.ikm.komet.kview.klfields.KlFieldHelper.retrieveCommittedLatestVersion; +import static dev.ikm.komet.kview.mvvm.view.journal.JournalController.toast; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.CREATE; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.CURRENT_JOURNAL_WINDOW_TOPIC; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.EDIT; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.MODE; +import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.VIEW_PROPERTIES; +import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.SEMANTIC; +import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.WINDOW_TOPIC; +import static dev.ikm.komet.terms.KometTerm.BLANK_CONCEPT; +import static dev.ikm.tinkar.events.FrameworkTopics.VERSION_CHANGED_TOPIC; +import static dev.ikm.tinkar.provider.search.Indexer.FIELD_INDEX; +import static dev.ikm.tinkar.terms.TinkarTerm.COMPONENT_FIELD; +import static dev.ikm.tinkar.terms.TinkarTerm.IMAGE_FIELD; +import dev.ikm.komet.framework.observable.ObservableEntity; +import dev.ikm.komet.framework.observable.ObservableField; +import dev.ikm.komet.framework.observable.ObservableSemantic; +import dev.ikm.komet.framework.observable.ObservableSemanticSnapshot; +import dev.ikm.komet.framework.observable.ObservableSemanticVersion; import dev.ikm.komet.framework.view.ViewProperties; import dev.ikm.komet.kview.controls.Toast; import dev.ikm.komet.kview.events.genediting.GenEditingEvent; @@ -28,9 +49,19 @@ import dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel; import dev.ikm.tinkar.common.service.TinkExecutor; import dev.ikm.tinkar.coordinate.stamp.calculator.Latest; -import dev.ikm.tinkar.entity.*; +import dev.ikm.tinkar.entity.Entity; +import dev.ikm.tinkar.entity.EntityVersion; +import dev.ikm.tinkar.entity.FieldRecord; +import dev.ikm.tinkar.entity.PatternEntityVersion; +import dev.ikm.tinkar.entity.SemanticEntityVersion; +import dev.ikm.tinkar.entity.SemanticVersionRecord; +import dev.ikm.tinkar.entity.StampRecord; +import dev.ikm.tinkar.entity.VersionData; import dev.ikm.tinkar.entity.transaction.CommitTransactionTask; import dev.ikm.tinkar.entity.transaction.Transaction; +import dev.ikm.tinkar.events.EntityVersionChangeEvent; +import dev.ikm.tinkar.events.EvtBusFactory; +import dev.ikm.tinkar.events.Subscriber; import dev.ikm.tinkar.terms.EntityFacade; import dev.ikm.tinkar.terms.EntityProxy; import javafx.application.Platform; @@ -38,7 +69,10 @@ import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Node; -import javafx.scene.control.*; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.control.Separator; import javafx.scene.layout.VBox; import org.carlfx.cognitive.loader.InjectViewModel; import org.eclipse.collections.api.list.ImmutableList; @@ -53,20 +87,6 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -import static dev.ikm.tinkar.events.FrameworkTopics.VERSION_CHANGED_TOPIC; -import static dev.ikm.komet.kview.events.EventTopics.SAVE_PATTERN_TOPIC; -import static dev.ikm.komet.kview.events.genediting.GenEditingEvent.PUBLISH; -import static dev.ikm.komet.kview.events.genediting.PropertyPanelEvent.CLOSE_PANEL; -import static dev.ikm.komet.kview.klfields.KlFieldHelper.*; -import static dev.ikm.komet.kview.mvvm.view.journal.JournalController.toast; -import static dev.ikm.komet.kview.mvvm.viewmodel.FormViewModel.*; -import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.SEMANTIC; -import static dev.ikm.komet.kview.mvvm.viewmodel.GenEditingViewModel.WINDOW_TOPIC; -import static dev.ikm.komet.terms.KometTerm.BLANK_CONCEPT; -import static dev.ikm.tinkar.provider.search.Indexer.FIELD_INDEX; -import static dev.ikm.tinkar.terms.TinkarTerm.COMPONENT_FIELD; -import static dev.ikm.tinkar.terms.TinkarTerm.IMAGE_FIELD; - public class SemanticFieldsController { private static final Logger LOG = LoggerFactory.getLogger(SemanticFieldsController.class); @@ -317,7 +337,7 @@ private void clearOrResetForm(ActionEvent actionEvent) { } private void doTheClearOrResetForm() { - Latest latestCommitted = retrieveCommittedLatestVersion(observableSemanticSnapshot); + Latest latestCommitted = retrieveCommittedLatestVersion(observableSemanticSnapshot); latestCommitted.ifPresentOrElse(this::resetFieldValues, this::clearField); clearOrResetFormButton.setDisable(true); } From 7e96e0e9c6430876ae09869cc0455fede926fc71 Mon Sep 17 00:00:00 2001 From: swsalvi Date: Thu, 11 Sep 2025 15:44:11 -0400 Subject: [PATCH 3/8] Removed unnecessary logic --- .../mvvm/viewmodel/StampAddFormViewModel.java | 50 ------------------- 1 file changed, 50 deletions(-) diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java index 33b87e09f..1ed014e6d 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java @@ -38,8 +38,6 @@ import dev.ikm.tinkar.terms.TinkarTerm; import javafx.event.ActionEvent; import javafx.scene.Node; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.List; import java.util.Set; @@ -208,54 +206,6 @@ public StampAddFormViewModel save() { EntityFacade path = getValue(PATH); // ----------- Save stamp on the Database -------------- -// Composer composer = new Composer("Save new STAMP in Component"); -// -// Session session = composer.open(status, author.toProxy(), module.toProxy(), path.toProxy()); -// -// switch (stampType) { -// case CONCEPT -> { -// session.compose((ConceptAssembler conceptAssembler) -> { -// conceptAssembler.concept(entityFacade.toProxy()); -// }); -// } -// // TODO: implement better handing of empty latestEntityVersion -// case PATTERN -> { -// Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); -// EntityVersion entityVersion = latestEntityVersion.get(); -// PatternVersionRecord patternVersionRecord = (PatternVersionRecord) entityVersion; -// -// session.compose((PatternAssemblerConsumer) patternAssembler -> { patternAssembler -// .pattern(entityFacade.toProxy()) -// .meaning(patternVersionRecord.semanticMeaning().toProxy()) -// .purpose(patternVersionRecord.semanticPurpose().toProxy()); -// -// // Add the field definitions -// ((PatternVersionRecord) entityVersion).fieldDefinitions().forEach(fieldDefinitionRecord -> { -// ConceptEntity fieldMeaning = fieldDefinitionRecord.meaning(); -// ConceptEntity fieldPurpose = fieldDefinitionRecord.purpose(); -// ConceptEntity fieldDataType = fieldDefinitionRecord.dataType(); -// patternAssembler.fieldDefinition(fieldMeaning.toProxy(), fieldPurpose.toProxy(), fieldDataType.toProxy()); -// }); -// }); -// } -// case SEMANTIC -> { -// Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); -// EntityVersion entityVersion = latestEntityVersion.get(); -// SemanticVersionRecord semanticVersionRecord = (SemanticVersionRecord) entityVersion; -// -// session.compose((SemanticAssemblerConsumer) semanticAssembler -> semanticAssembler -// .semantic(entityFacade.toProxy()) -// .pattern(semanticVersionRecord.pattern().toProxy()) -// .reference(semanticVersionRecord.referencedComponent().toProxy()) -// .fieldValues(vals -> vals.withAll(semanticVersionRecord.fieldValues())) -// ); -// } -// default -> throw new RuntimeException("Stamp Type " + stampType + " not supported"); -// } -// -// composer.commitSession(session); - - Transaction transaction = Transaction.make(); StampEntity stampEntity = transaction.getStampForEntities(status, author.nid(), module.nid(), path.nid(), entityFacade); From 5c33a550fc245b14d2bfe65f7a9f59ee4a6b297d Mon Sep 17 00:00:00 2001 From: swsalvi Date: Thu, 11 Sep 2025 16:36:48 -0400 Subject: [PATCH 4/8] Removed commented code. --- .../komet/kview/klfields/KlFieldHelper.java | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java b/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java index 7f34b8a2c..7f0166979 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java +++ b/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java @@ -282,32 +282,6 @@ public static ImmutableList createDefaultFieldValues(EntityFacade patter return fieldsValues.toImmutable(); } - /** - * This method will return the latest commited version. - * //TODO this method can be generalized to return latest As of now it is just returning SemanticEntityVersion. - * // TODO need to implement logic for create Semantic. - * - * @return entityVersionLatest - * */ -// public static Latest retrieveCommittedLatestVersion(ObservableSemanticSnapshot observableSemanticSnapshot) { -// if(observableSemanticSnapshot == null){ -// return new Latest<>(); -// } -// AtomicReference> entityVersionLatest = new AtomicReference<>(); -// SemanticEntityVersion semanticEntityVersion = (SemanticEntityVersion) observableSemanticSnapshot.getLatestVersion().get().getEntityVersion(); -// if(semanticEntityVersion.committed()){ -// return new Latest<>(semanticEntityVersion); -// } -// //Get list of previously committed data sorted in latest at the top. -// ImmutableList observableSemanticVersionImmutableList = observableSemanticSnapshot.getHistoricVersions(); -// // Filter out Uncommitted data. Data whose time stamp parameter is Long.MAX_VALUE. and get the 1st available. -// Optional observableSemanticVersionOptional = observableSemanticVersionImmutableList.stream().filter(p -> p.stamp().time() != Long.MAX_VALUE).findFirst(); -// observableSemanticVersionOptional.ifPresentOrElse((p) -> { -// entityVersionLatest.set(new Latest<>(p)); -// }, () -> {entityVersionLatest.set(new Latest<>());}); -// return entityVersionLatest.get(); -// } - /** * This method will return the latest commited version. * From 1677ef6cf52d50ecc43c351db63f71461931ce94 Mon Sep 17 00:00:00 2001 From: swsalvi Date: Thu, 11 Sep 2025 17:45:45 -0400 Subject: [PATCH 5/8] Removed commented code. --- .../lidr/mvvm/model/DataModelHelper.java | 44 ++++++++++++++++++- .../mvvm/viewmodel/StampAddFormViewModel.java | 31 +++++++------ 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java index 74114cd71..886a1ea03 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java +++ b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java @@ -16,6 +16,9 @@ package dev.ikm.komet.kview.lidr.mvvm.model; import dev.ikm.komet.framework.builder.AxiomBuilderRecord; +import dev.ikm.komet.framework.observable.ObservableEntity; +import dev.ikm.komet.framework.observable.ObservableEntitySnapshot; +import dev.ikm.komet.framework.observable.ObservableVersion; import dev.ikm.komet.framework.panel.axiom.LogicalOperatorsForVertex; import dev.ikm.komet.framework.view.ObservableView; import dev.ikm.komet.framework.view.ViewProperties; @@ -38,11 +41,22 @@ import dev.ikm.tinkar.coordinate.navigation.calculator.NavigationCalculator; import dev.ikm.tinkar.coordinate.navigation.calculator.NavigationCalculatorWithCache; import dev.ikm.tinkar.coordinate.stamp.StampCoordinateRecord; +import dev.ikm.tinkar.coordinate.stamp.calculator.Latest; import dev.ikm.tinkar.coordinate.stamp.calculator.RelativePosition; import dev.ikm.tinkar.coordinate.stamp.calculator.StampCalculator; -import dev.ikm.tinkar.entity.*; +import dev.ikm.tinkar.entity.ConceptEntity; +import dev.ikm.tinkar.entity.ConceptRecord; +import dev.ikm.tinkar.entity.Entity; +import dev.ikm.tinkar.entity.EntityService; +import dev.ikm.tinkar.entity.EntityVersion; +import dev.ikm.tinkar.entity.SemanticEntity; +import dev.ikm.tinkar.entity.SemanticEntityVersion; +import dev.ikm.tinkar.entity.SemanticRecord; +import dev.ikm.tinkar.entity.StampEntity; +import dev.ikm.tinkar.entity.StampEntityVersion; import dev.ikm.tinkar.entity.graph.DiTreeEntity; import dev.ikm.tinkar.entity.graph.EntityVertex; +import dev.ikm.tinkar.entity.transaction.Transaction; import dev.ikm.tinkar.terms.ConceptFacade; import dev.ikm.tinkar.terms.EntityFacade; import dev.ikm.tinkar.terms.EntityProxy; @@ -517,4 +531,32 @@ public static void recursiveAddChildren(DiTreeEntity.Builder axiomTreeBuilder, E recursiveAddChildren(axiomTreeBuilder, childVertex, child); } } + + /*** + * This method will create stamp for any entity (Semantic, Concept, Pattern or Stamp) + * in uncommited state and return optional transaction object which can be committed. + * This will give developer the flexibility to not handle STAMPs for each entity separately. + * @param entityVersionLatest + * @param viewProperties + * @return + */ + public static Optional createTranscationForEntity(Latest entityVersionLatest, ViewProperties viewProperties){ + if(entityVersionLatest.isPresent()){ + EntityVersion entityVersion = entityVersionLatest.get(); + ConceptFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); + Entity entity = entityVersion.entity(); + StampEntity currentStamp = entityVersion.stamp(); + Transaction transaction = Transaction.make(); + StampEntity stampEntity = transaction.getStampForEntities(currentStamp.state(), author.nid(), currentStamp.moduleNid(), currentStamp.pathNid(), entity); + ObservableEntity observableEntity = ObservableEntity.get(entity.nid()); + ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); + observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { + if (latestVersion instanceof ObservableVersion observableVersion) { + observableVersion.versionProperty().set(observableVersion.updateStampNid(stampEntity.nid())); + } + }); + return Optional.of(transaction); + } + return Optional.empty(); + } } diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java index 1ed014e6d..6e0acf678 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java @@ -17,12 +17,10 @@ import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.SUBMIT_BUTTON_TEXT; import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.TIME; import dev.ikm.komet.framework.controls.TimeUtils; -import dev.ikm.komet.framework.observable.ObservableEntity; -import dev.ikm.komet.framework.observable.ObservableEntitySnapshot; -import dev.ikm.komet.framework.observable.ObservableVersion; import dev.ikm.komet.framework.view.ViewProperties; import dev.ikm.komet.kview.controls.Toast; import dev.ikm.komet.kview.events.ClosePropertiesPanelEvent; +import dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper; import dev.ikm.komet.kview.mvvm.view.genediting.ConfirmationDialogController; import dev.ikm.komet.kview.mvvm.view.journal.JournalController; import dev.ikm.tinkar.component.Stamp; @@ -40,6 +38,7 @@ import javafx.scene.Node; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -206,17 +205,21 @@ public StampAddFormViewModel save() { EntityFacade path = getValue(PATH); // ----------- Save stamp on the Database -------------- - Transaction transaction = Transaction.make(); - StampEntity stampEntity = transaction.getStampForEntities(status, author.nid(), module.nid(), path.nid(), entityFacade); - - ObservableEntity observableEntity = ObservableEntity.get(entityFacade.nid()); - ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); - observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { - if (latestVersion instanceof ObservableVersion observableVersion) { - observableVersion.versionProperty().set(observableVersion.updateStampNid(stampEntity.nid())); - } - }); - transaction.commit(); +// Transaction transaction = Transaction.make(); +// StampEntity stampEntity = transaction.getStampForEntities(status, author.nid(), module.nid(), path.nid(), entityFacade); +// +// ObservableEntity observableEntity = ObservableEntity.get(entityFacade.nid()); +// ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); +// observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { +// if (latestVersion instanceof ObservableVersion observableVersion) { +// observableVersion.versionProperty().set(observableVersion.updateStampNid(stampEntity.nid())); +// } +// }); +// transaction.commit(); + + //Alternate approach to save transaction. + Optional transactionOptional = DataModelHelper.createTranscationForEntity(viewProperties.calculator().latest(entityFacade.nid()), viewProperties); + transactionOptional.ifPresent(transaction -> transaction.commit()); // Load the new STAMP and store the new initial values loadStamp(); From 77fcb1c380cebdc02c5c40676bec7c4df921df2f Mon Sep 17 00:00:00 2001 From: swsalvi Date: Thu, 11 Sep 2025 18:45:29 -0400 Subject: [PATCH 6/8] Somechanges added. --- .../lidr/mvvm/model/DataModelHelper.java | 32 ++++++++++++++++--- .../mvvm/viewmodel/StampAddFormViewModel.java | 14 ++++++-- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java index 886a1ea03..b9a599e01 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java +++ b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java @@ -60,6 +60,7 @@ import dev.ikm.tinkar.terms.ConceptFacade; import dev.ikm.tinkar.terms.EntityFacade; import dev.ikm.tinkar.terms.EntityProxy; +import dev.ikm.tinkar.terms.State; import dev.ikm.tinkar.terms.TinkarTerm; import org.eclipse.collections.api.factory.Lists; import org.eclipse.collections.api.list.ImmutableList; @@ -540,13 +541,14 @@ public static void recursiveAddChildren(DiTreeEntity.Builder axiomTreeBuilder, E * @param viewProperties * @return */ - public static Optional createTranscationForEntity(Latest entityVersionLatest, ViewProperties viewProperties){ - if(entityVersionLatest.isPresent()){ + public static Optional createTranscationForEntity(StampEntity currentStamp, Latest entityVersionLatest, ViewProperties viewProperties){ + Transaction transaction = Transaction.make(); + ConceptFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); + if (entityVersionLatest.isPresent()) { EntityVersion entityVersion = entityVersionLatest.get(); - ConceptFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); + Entity entity = entityVersion.entity(); - StampEntity currentStamp = entityVersion.stamp(); - Transaction transaction = Transaction.make(); +// StampEntity currentStamp = entityVersion.stamp(); StampEntity stampEntity = transaction.getStampForEntities(currentStamp.state(), author.nid(), currentStamp.moduleNid(), currentStamp.pathNid(), entity); ObservableEntity observableEntity = ObservableEntity.get(entity.nid()); ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); @@ -559,4 +561,24 @@ public static Optional createTranscationForEntity(Latest createStampEntity(State state, ConceptFacade author, ConceptFacade module, ConceptFacade path){ + Transaction transaction = Transaction.make(); //create transaction + StampEntity stampEntity = transaction.getStamp(state, author, module, path); //Create Stamp using transaction. + return Optional.of(stampEntity); + } + + public static void commitTransaction(Transaction transaction, Latest entityVersionLatest, ViewProperties viewProperties, int stampNid){ + entityVersionLatest.ifPresent(entityVersion -> { + Entity entity = entityVersion.entity(); + transaction.addComponent(entity.nid()); + ObservableEntity observableEntity = ObservableEntity.get(entity.nid()); + ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); + observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { + if (latestVersion instanceof ObservableVersion observableVersion) { + observableVersion.versionProperty().set(observableVersion.updateStampNid(stampNid)); + } + }); + }); + } } diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java index 6e0acf678..d3d08f337 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java @@ -1,5 +1,7 @@ package dev.ikm.komet.kview.mvvm.viewmodel; +import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.commitTransaction; +import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.createStampEntity; import static dev.ikm.komet.kview.mvvm.model.DataModelHelper.fetchDescendentsOfConcept; import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.AUTHOR; import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.CLEAR_RESET_BUTTON_TEXT; @@ -20,7 +22,6 @@ import dev.ikm.komet.framework.view.ViewProperties; import dev.ikm.komet.kview.controls.Toast; import dev.ikm.komet.kview.events.ClosePropertiesPanelEvent; -import dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper; import dev.ikm.komet.kview.mvvm.view.genediting.ConfirmationDialogController; import dev.ikm.komet.kview.mvvm.view.journal.JournalController; import dev.ikm.tinkar.component.Stamp; @@ -218,8 +219,15 @@ public StampAddFormViewModel save() { // transaction.commit(); //Alternate approach to save transaction. - Optional transactionOptional = DataModelHelper.createTranscationForEntity(viewProperties.calculator().latest(entityFacade.nid()), viewProperties); - transactionOptional.ifPresent(transaction -> transaction.commit()); + Optional optionalStampEntity = createStampEntity(status, (ConceptFacade) author, (ConceptFacade) module, (ConceptFacade) path); + + optionalStampEntity.ifPresent(stampEntity -> { + Optional optionalTransaction = Transaction.forStamp(stampEntity.publicId()); + optionalTransaction.ifPresent(transaction -> commitTransaction(transaction, viewProperties.calculator().latest(entityFacade.nid()), viewProperties, stampEntity.nid())); + }); + +// Optional transactionOptional = DataModelHelper.createTranscationForEntity(viewProperties.calculator().latest(entityFacade.nid()), viewProperties); +// transactionOptional.ifPresent(transaction -> transaction.commit()); // Load the new STAMP and store the new initial values loadStamp(); From 242de9c7b07c000eba1a7b5e1ae5af64a8e6e52e Mon Sep 17 00:00:00 2001 From: swsalvi Date: Mon, 22 Sep 2025 13:44:55 -0400 Subject: [PATCH 7/8] Observable Edit working. --- .../komet/kview/klfields/KlFieldHelper.java | 2 + .../lidr/mvvm/model/DataModelHelper.java | 4 +- .../genediting/SemanticFieldsController.java | 1 + .../mvvm/viewmodel/StampAddFormViewModel.java | 244 ------------------ .../stamp/StampAddSubmitFormViewModel.java | 110 +++++--- 5 files changed, 73 insertions(+), 288 deletions(-) delete mode 100644 kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java diff --git a/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java b/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java index eaf4ece4f..4357a7796 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java +++ b/kview/src/main/java/dev/ikm/komet/kview/klfields/KlFieldHelper.java @@ -25,11 +25,13 @@ import static dev.ikm.tinkar.terms.TinkarTerm.UUID_FIELD; import static dev.ikm.tinkar.terms.TinkarTerm.VERTEX_FIELD; import dev.ikm.komet.framework.observable.ObservableEntity; +import dev.ikm.komet.framework.observable.ObservableEntitySnapshot; import dev.ikm.komet.framework.observable.ObservableField; import dev.ikm.komet.framework.observable.ObservablePatternSnapshot; import dev.ikm.komet.framework.observable.ObservablePatternVersion; import dev.ikm.komet.framework.observable.ObservableSemanticSnapshot; import dev.ikm.komet.framework.observable.ObservableSemanticVersion; +import dev.ikm.komet.framework.observable.ObservableVersion; import dev.ikm.komet.framework.view.ViewProperties; import dev.ikm.komet.kview.controls.KLReadOnlyBaseControl; import dev.ikm.komet.kview.controls.KLReadOnlyComponentControl; diff --git a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java index b9a599e01..f649627c3 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java +++ b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java @@ -541,14 +541,14 @@ public static void recursiveAddChildren(DiTreeEntity.Builder axiomTreeBuilder, E * @param viewProperties * @return */ - public static Optional createTranscationForEntity(StampEntity currentStamp, Latest entityVersionLatest, ViewProperties viewProperties){ + public static Optional createTranscationForEntity(Latest entityVersionLatest, ViewProperties viewProperties){ Transaction transaction = Transaction.make(); ConceptFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); if (entityVersionLatest.isPresent()) { EntityVersion entityVersion = entityVersionLatest.get(); Entity entity = entityVersion.entity(); -// StampEntity currentStamp = entityVersion.stamp(); + StampEntity currentStamp = entityVersion.stamp(); StampEntity stampEntity = transaction.getStampForEntities(currentStamp.state(), author.nid(), currentStamp.moduleNid(), currentStamp.pathNid(), entity); ObservableEntity observableEntity = ObservableEntity.get(entity.nid()); ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java index cb1e76b7d..55ad4e278 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/view/genediting/SemanticFieldsController.java @@ -31,6 +31,7 @@ import dev.ikm.tinkar.entity.*; import dev.ikm.tinkar.entity.transaction.CommitTransactionTask; import dev.ikm.tinkar.entity.transaction.Transaction; +import dev.ikm.tinkar.terms.ConceptFacade; import dev.ikm.tinkar.terms.EntityFacade; import dev.ikm.tinkar.terms.EntityProxy; import javafx.application.Platform; diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java deleted file mode 100644 index d3d08f337..000000000 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/StampAddFormViewModel.java +++ /dev/null @@ -1,244 +0,0 @@ -package dev.ikm.komet.kview.mvvm.viewmodel; - -import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.commitTransaction; -import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.createStampEntity; -import static dev.ikm.komet.kview.mvvm.model.DataModelHelper.fetchDescendentsOfConcept; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.AUTHOR; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.CLEAR_RESET_BUTTON_TEXT; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.CURRENT_STAMP; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.FORM_TIME_TEXT; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.FORM_TITLE; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.IS_CONFIRMED_OR_SUBMITTED; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.IS_STAMP_VALUES_THE_SAME_OR_EMPTY; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.MODULE; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.MODULES; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.PATH; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.PATHS; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.STATUS; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.STATUSES; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.SUBMIT_BUTTON_TEXT; -import static dev.ikm.komet.kview.mvvm.viewmodel.StampFormViewModelBase.StampProperties.TIME; -import dev.ikm.komet.framework.controls.TimeUtils; -import dev.ikm.komet.framework.view.ViewProperties; -import dev.ikm.komet.kview.controls.Toast; -import dev.ikm.komet.kview.events.ClosePropertiesPanelEvent; -import dev.ikm.komet.kview.mvvm.view.genediting.ConfirmationDialogController; -import dev.ikm.komet.kview.mvvm.view.journal.JournalController; -import dev.ikm.tinkar.component.Stamp; -import dev.ikm.tinkar.entity.ConceptEntity; -import dev.ikm.tinkar.entity.EntityVersion; -import dev.ikm.tinkar.entity.StampEntity; -import dev.ikm.tinkar.entity.transaction.Transaction; -import dev.ikm.tinkar.events.EvtBusFactory; -import dev.ikm.tinkar.events.Subscriber; -import dev.ikm.tinkar.terms.ConceptFacade; -import dev.ikm.tinkar.terms.EntityFacade; -import dev.ikm.tinkar.terms.State; -import dev.ikm.tinkar.terms.TinkarTerm; -import javafx.event.ActionEvent; -import javafx.scene.Node; - -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; - -public class StampAddFormViewModel extends StampFormViewModelBase { - /** - * Provide the standard Confirm Clear dialog title for use in other classes - */ - public static final String CONFIRM_RESET_TITLE = "Confirm Reset Form"; - /** - * Provide the standard Confirm Clear dialog message for use in other classes - */ - public static final String CONFIRM_RESET_MESSAGE = "Are you sure you want to reset the form? All entered data will be lost."; - - private Subscriber closePropertiesPanelEventSubscriber; - - public StampAddFormViewModel(StampType stampType) { - super(stampType); - - // Add Properties - addProperty(CURRENT_STAMP, (Stamp) null); - - addProperty(CLEAR_RESET_BUTTON_TEXT, "RESET"); - addProperty(SUBMIT_BUTTON_TEXT, "SUBMIT"); - } - - public void init(EntityFacade entity, UUID topic, ViewProperties viewProperties) { - // entityFocusProperty from DetailsNode often calls init with a null entity. - if (entity == null || entity == this.entityFacade) { - return; // null entity or the entity hasn't changed - } else { - this.entityFacade = entity; - } - - this.viewProperties = viewProperties; - this.topic = topic; - - // listen to events that the properties panel is going to be closed - closePropertiesPanelEventSubscriber = evt -> onPropertiesPanelClose(); - EvtBusFactory.getDefaultEvtBus().subscribe(topic, ClosePropertiesPanelEvent.class, closePropertiesPanelEventSubscriber); - - // initialize observable lists - Set modules = fetchDescendentsOfConcept(viewProperties, TinkarTerm.MODULE.publicId()); - Set paths = fetchDescendentsOfConcept(viewProperties, TinkarTerm.PATH.publicId()); - - if (getObservableList(MODULES).isEmpty()) { - setPropertyValues(MODULES, modules); - } - if (getObservableList(PATHS).isEmpty()) { - setPropertyValues(PATHS, paths); - } - if (getObservableList(STATUSES).isEmpty()) { - setPropertyValues(STATUSES, List.of(State.values())); - } - - loadStamp(); - loadStampValuesFromDB(); - - setPropertyValue(FORM_TIME_TEXT, TimeUtils.toDateString(getPropertyValue(TIME))); - - save(true); - } - - private void onPropertiesPanelClose() { - reset(); - } - - private void loadStamp() { - EntityVersion latestVersion = viewProperties.calculator().latest(entityFacade).get(); - StampEntity stampEntity = latestVersion.stamp(); - - setPropertyValue(CURRENT_STAMP, stampEntity); - } - - private void loadStampValuesFromDB() { - StampEntity stampEntity = getPropertyValue(StampProperties.CURRENT_STAMP); - - setPropertyValue(STATUS, stampEntity.state()); - setPropertyValue(TIME, stampEntity.time()); - setPropertyValue(AUTHOR, stampEntity.author()); - setPropertyValue(MODULE, stampEntity.module()); - setPropertyValue(PATH, stampEntity.path()); - } - - @Override - protected boolean updateIsStampValuesChanged() { - StampEntity stampEntity = getPropertyValue(CURRENT_STAMP); - - boolean same = stampEntity.state() == getPropertyValue(STATUS) - && stampEntity.path() == getPropertyValue(PATH) - && stampEntity.module() == getPropertyValue(MODULE); - - setPropertyValue(IS_STAMP_VALUES_THE_SAME_OR_EMPTY, same); - - if (same) { - setPropertyValue(FORM_TITLE, "Latest " + stampType.getTextDescription() + " Version"); - setPropertyValue(FORM_TIME_TEXT, TimeUtils.toDateString(getPropertyValue(TIME))); - setPropertyValue(AUTHOR, stampEntity.author()); - } else { - setPropertyValue(FORM_TITLE, "New " + stampType.getTextDescription() + " Version"); - setPropertyValue(FORM_TIME_TEXT, "Uncommitted"); - ConceptFacade authorConcept = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); - setPropertyValue(AUTHOR, authorConcept); - } - - return same; - } - - public void cancel() { - EvtBusFactory.getDefaultEvtBus().publish(topic, new ClosePropertiesPanelEvent("StampViewModel2 cancel()", - ClosePropertiesPanelEvent.CLOSE_PROPERTIES)); - reset(); - } - - public void resetOrClearForm(ActionEvent actionEvent) { - ConfirmationDialogController.showConfirmationDialog((Node) actionEvent.getSource(), CONFIRM_RESET_TITLE, CONFIRM_RESET_MESSAGE) - .thenAccept(confirmed -> { - if (confirmed) { - reset(); - } - }); - } - - @Override - public void submitOrConfirm() { - save(); - showSucessToast(); - setPropertyValue(IS_CONFIRMED_OR_SUBMITTED, true); - EvtBusFactory.getDefaultEvtBus().publish(topic, new ClosePropertiesPanelEvent("StampViewModel2 cancel()", - ClosePropertiesPanelEvent.CLOSE_PROPERTIES)); - } - - private void showSucessToast() { - State status = getValue(STATUS); - EntityFacade module = getValue(MODULE); - EntityFacade path = getValue(PATH); - - String statusString = getViewProperties().calculator().getDescriptionTextOrNid(status.nid()); - String moduleString = getViewProperties().calculator().getDescriptionTextOrNid(module.nid()); - String pathString = getViewProperties().calculator().getDescriptionTextOrNid(path.nid()); - - String submitMessage = "New " + stampType.getTextDescription() + " version created (" + statusString + - ", " + moduleString + ", " + pathString + ")"; - - JournalController.toast() - .show( - Toast.Status.SUCCESS, - submitMessage - ); - } - - @Override - public StampAddFormViewModel save() { - super.save(); - - if (invalidProperty().get()) { - // Validation error so returning and not going to run the code to save to DB - return this; - } - - // ----------- Get values from the UI form ------------ - State status = getValue(STATUS); - EntityFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); - EntityFacade module = getValue(MODULE); - EntityFacade path = getValue(PATH); - - // ----------- Save stamp on the Database -------------- -// Transaction transaction = Transaction.make(); -// StampEntity stampEntity = transaction.getStampForEntities(status, author.nid(), module.nid(), path.nid(), entityFacade); -// -// ObservableEntity observableEntity = ObservableEntity.get(entityFacade.nid()); -// ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); -// observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { -// if (latestVersion instanceof ObservableVersion observableVersion) { -// observableVersion.versionProperty().set(observableVersion.updateStampNid(stampEntity.nid())); -// } -// }); -// transaction.commit(); - - //Alternate approach to save transaction. - Optional optionalStampEntity = createStampEntity(status, (ConceptFacade) author, (ConceptFacade) module, (ConceptFacade) path); - - optionalStampEntity.ifPresent(stampEntity -> { - Optional optionalTransaction = Transaction.forStamp(stampEntity.publicId()); - optionalTransaction.ifPresent(transaction -> commitTransaction(transaction, viewProperties.calculator().latest(entityFacade.nid()), viewProperties, stampEntity.nid())); - }); - -// Optional transactionOptional = DataModelHelper.createTranscationForEntity(viewProperties.calculator().latest(entityFacade.nid()), viewProperties); -// transactionOptional.ifPresent(transaction -> transaction.commit()); - - // Load the new STAMP and store the new initial values - loadStamp(); - loadStampValuesFromDB(); - save(true); - updateIsStampValuesChanged(); - - return this; - } - - public ViewProperties getViewProperties() { - return viewProperties; - } -} diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java index 9d294f361..b4fcc206e 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java @@ -1,6 +1,10 @@ package dev.ikm.komet.kview.mvvm.viewmodel.stamp; +import dev.ikm.komet.framework.observable.ObservableEntity; +import dev.ikm.komet.framework.observable.ObservableEntitySnapshot; +import dev.ikm.komet.framework.observable.ObservableVersion; import dev.ikm.komet.kview.controls.Toast; +import dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper; import dev.ikm.komet.kview.mvvm.view.journal.JournalController; import dev.ikm.tinkar.composer.Composer; import dev.ikm.tinkar.composer.Session; @@ -12,11 +16,18 @@ import dev.ikm.tinkar.entity.EntityVersion; import dev.ikm.tinkar.entity.PatternVersionRecord; import dev.ikm.tinkar.entity.SemanticVersionRecord; +import dev.ikm.tinkar.entity.StampEntity; +import dev.ikm.tinkar.entity.transaction.Transaction; +import dev.ikm.tinkar.terms.ConceptFacade; import dev.ikm.tinkar.terms.EntityFacade; import dev.ikm.tinkar.terms.State; +import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.commitTransaction; +import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.createStampEntity; import static dev.ikm.komet.kview.mvvm.viewmodel.stamp.StampFormViewModelBase.Properties.*; +import java.util.Optional; + public class StampAddSubmitFormViewModel extends StampAddFormViewModelBase { public StampAddSubmitFormViewModel(Type type) { @@ -60,52 +71,67 @@ public StampAddSubmitFormViewModel save() { EntityFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); // ----------- Save stamp on the Database -------------- - Composer composer = new Composer("Save new STAMP in Component"); +// Composer composer = new Composer("Save new STAMP in Component"); +// +// Session session = composer.open(status, author.toProxy(), module.toProxy(), path.toProxy()); +// +// switch (type) { +// case CONCEPT -> { +// session.compose((ConceptAssembler conceptAssembler) -> { +// conceptAssembler.concept(entityFacade.toProxy()); +// }); +// } +// // TODO: implement better handing of empty latestEntityVersion +// case PATTERN -> { +// Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); +// EntityVersion entityVersion = latestEntityVersion.get(); +// PatternVersionRecord patternVersionRecord = (PatternVersionRecord) entityVersion; +// +// session.compose((PatternAssemblerConsumer) patternAssembler -> { patternAssembler +// .pattern(entityFacade.toProxy()) +// .meaning(patternVersionRecord.semanticMeaning().toProxy()) +// .purpose(patternVersionRecord.semanticPurpose().toProxy()); +// +// // Add the field definitions +// ((PatternVersionRecord) entityVersion).fieldDefinitions().forEach(fieldDefinitionRecord -> { +// ConceptEntity fieldMeaning = fieldDefinitionRecord.meaning(); +// ConceptEntity fieldPurpose = fieldDefinitionRecord.purpose(); +// ConceptEntity fieldDataType = fieldDefinitionRecord.dataType(); +// patternAssembler.fieldDefinition(fieldMeaning.toProxy(), fieldPurpose.toProxy(), fieldDataType.toProxy()); +// }); +// }); +// } +// case SEMANTIC -> { +// Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); +// EntityVersion entityVersion = latestEntityVersion.get(); +// SemanticVersionRecord semanticVersionRecord = (SemanticVersionRecord) entityVersion; +// +// session.compose((SemanticAssemblerConsumer) semanticAssembler -> semanticAssembler +// .semantic(entityFacade.toProxy()) +// .pattern(semanticVersionRecord.pattern().toProxy()) +// .reference(semanticVersionRecord.referencedComponent().toProxy()) +// .fieldValues(vals -> vals.withAll(semanticVersionRecord.fieldValues())) +// ); +// } +// default -> throw new RuntimeException("Stamp Type " + type + " not supported"); +// } +// +// composer.commitSession(session); - Session session = composer.open(status, author.toProxy(), module.toProxy(), path.toProxy()); - switch (type) { - case CONCEPT -> { - session.compose((ConceptAssembler conceptAssembler) -> { - conceptAssembler.concept(entityFacade.toProxy()); - }); - } - // TODO: implement better handing of empty latestEntityVersion - case PATTERN -> { - Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); - EntityVersion entityVersion = latestEntityVersion.get(); - PatternVersionRecord patternVersionRecord = (PatternVersionRecord) entityVersion; - - session.compose((PatternAssemblerConsumer) patternAssembler -> { patternAssembler - .pattern(entityFacade.toProxy()) - .meaning(patternVersionRecord.semanticMeaning().toProxy()) - .purpose(patternVersionRecord.semanticPurpose().toProxy()); - - // Add the field definitions - ((PatternVersionRecord) entityVersion).fieldDefinitions().forEach(fieldDefinitionRecord -> { - ConceptEntity fieldMeaning = fieldDefinitionRecord.meaning(); - ConceptEntity fieldPurpose = fieldDefinitionRecord.purpose(); - ConceptEntity fieldDataType = fieldDefinitionRecord.dataType(); - patternAssembler.fieldDefinition(fieldMeaning.toProxy(), fieldPurpose.toProxy(), fieldDataType.toProxy()); - }); - }); - } - case SEMANTIC -> { - Latest latestEntityVersion = viewProperties.calculator().latest(entityFacade); - EntityVersion entityVersion = latestEntityVersion.get(); - SemanticVersionRecord semanticVersionRecord = (SemanticVersionRecord) entityVersion; - - session.compose((SemanticAssemblerConsumer) semanticAssembler -> semanticAssembler - .semantic(entityFacade.toProxy()) - .pattern(semanticVersionRecord.pattern().toProxy()) - .reference(semanticVersionRecord.referencedComponent().toProxy()) - .fieldValues(vals -> vals.withAll(semanticVersionRecord.fieldValues())) - ); + // ----------- Save stamp on the Database -------------- + Transaction transaction = Transaction.make(); + StampEntity stampEntity = transaction.getStampForEntities(status, author.nid(), module.nid(), path.nid(), entityFacade); + + ObservableEntity observableEntity = ObservableEntity.get(entityFacade.nid()); + ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); + observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { + if (latestVersion instanceof ObservableVersion observableVersion) { + observableVersion.versionProperty().set(observableVersion.updateStampNid(stampEntity.nid())); } - default -> throw new RuntimeException("Stamp Type " + type + " not supported"); - } + }); + transaction.commit(); - composer.commitSession(session); // Load the new STAMP and store the new initial values From ca881c9ed9b54e54c0ca7ed2dd53dc44dcb3066e Mon Sep 17 00:00:00 2001 From: swsalvi Date: Mon, 22 Sep 2025 13:58:31 -0400 Subject: [PATCH 8/8] Observable Edit working. --- .../lidr/mvvm/model/DataModelHelper.java | 49 ------------------- .../stamp/StampAddSubmitFormViewModel.java | 16 +----- 2 files changed, 2 insertions(+), 63 deletions(-) diff --git a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java index f649627c3..130b96270 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java +++ b/kview/src/main/java/dev/ikm/komet/kview/lidr/mvvm/model/DataModelHelper.java @@ -532,53 +532,4 @@ public static void recursiveAddChildren(DiTreeEntity.Builder axiomTreeBuilder, E recursiveAddChildren(axiomTreeBuilder, childVertex, child); } } - - /*** - * This method will create stamp for any entity (Semantic, Concept, Pattern or Stamp) - * in uncommited state and return optional transaction object which can be committed. - * This will give developer the flexibility to not handle STAMPs for each entity separately. - * @param entityVersionLatest - * @param viewProperties - * @return - */ - public static Optional createTranscationForEntity(Latest entityVersionLatest, ViewProperties viewProperties){ - Transaction transaction = Transaction.make(); - ConceptFacade author = viewProperties.nodeView().editCoordinate().getAuthorForChanges(); - if (entityVersionLatest.isPresent()) { - EntityVersion entityVersion = entityVersionLatest.get(); - - Entity entity = entityVersion.entity(); - StampEntity currentStamp = entityVersion.stamp(); - StampEntity stampEntity = transaction.getStampForEntities(currentStamp.state(), author.nid(), currentStamp.moduleNid(), currentStamp.pathNid(), entity); - ObservableEntity observableEntity = ObservableEntity.get(entity.nid()); - ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); - observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { - if (latestVersion instanceof ObservableVersion observableVersion) { - observableVersion.versionProperty().set(observableVersion.updateStampNid(stampEntity.nid())); - } - }); - return Optional.of(transaction); - } - return Optional.empty(); - } - - public static Optional createStampEntity(State state, ConceptFacade author, ConceptFacade module, ConceptFacade path){ - Transaction transaction = Transaction.make(); //create transaction - StampEntity stampEntity = transaction.getStamp(state, author, module, path); //Create Stamp using transaction. - return Optional.of(stampEntity); - } - - public static void commitTransaction(Transaction transaction, Latest entityVersionLatest, ViewProperties viewProperties, int stampNid){ - entityVersionLatest.ifPresent(entityVersion -> { - Entity entity = entityVersion.entity(); - transaction.addComponent(entity.nid()); - ObservableEntity observableEntity = ObservableEntity.get(entity.nid()); - ObservableEntitySnapshot observableEntitySnapshot = observableEntity.getSnapshot(viewProperties.calculator()); - observableEntitySnapshot.getLatestVersion().ifPresent(latestVersion -> { - if (latestVersion instanceof ObservableVersion observableVersion) { - observableVersion.versionProperty().set(observableVersion.updateStampNid(stampNid)); - } - }); - }); - } } diff --git a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java index b4fcc206e..390d33c20 100644 --- a/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java +++ b/kview/src/main/java/dev/ikm/komet/kview/mvvm/viewmodel/stamp/StampAddSubmitFormViewModel.java @@ -4,26 +4,14 @@ import dev.ikm.komet.framework.observable.ObservableEntitySnapshot; import dev.ikm.komet.framework.observable.ObservableVersion; import dev.ikm.komet.kview.controls.Toast; -import dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper; import dev.ikm.komet.kview.mvvm.view.journal.JournalController; -import dev.ikm.tinkar.composer.Composer; -import dev.ikm.tinkar.composer.Session; -import dev.ikm.tinkar.composer.assembler.ConceptAssembler; -import dev.ikm.tinkar.composer.assembler.PatternAssemblerConsumer; -import dev.ikm.tinkar.composer.assembler.SemanticAssemblerConsumer; -import dev.ikm.tinkar.coordinate.stamp.calculator.Latest; -import dev.ikm.tinkar.entity.ConceptEntity; -import dev.ikm.tinkar.entity.EntityVersion; -import dev.ikm.tinkar.entity.PatternVersionRecord; -import dev.ikm.tinkar.entity.SemanticVersionRecord; + import dev.ikm.tinkar.entity.StampEntity; import dev.ikm.tinkar.entity.transaction.Transaction; -import dev.ikm.tinkar.terms.ConceptFacade; import dev.ikm.tinkar.terms.EntityFacade; import dev.ikm.tinkar.terms.State; -import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.commitTransaction; -import static dev.ikm.komet.kview.lidr.mvvm.model.DataModelHelper.createStampEntity; + import static dev.ikm.komet.kview.mvvm.viewmodel.stamp.StampFormViewModelBase.Properties.*; import java.util.Optional;