Author: lgiessmann Date: Tue Nov 22 13:11:07 2011 New Revision: 1035
Log: gdl-frontend: Widgets: refactoring of GdlVisibleObject => implemented the class GdlVisbleObjectTmService for processing all GDL and TMCL constraints
Added: trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObjectTmService.java Modified: trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObject.java trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java
Modified: trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObject.java ============================================================================== --- trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObject.java Tue Nov 22 06:56:14 2011 (r1034) +++ trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObject.java Tue Nov 22 13:11:07 2011 (r1035) @@ -10,7 +10,6 @@ import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Reifiable; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.ReifiableStub; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Role; -import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.ScopedStub; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMapsTypes; @@ -76,11 +75,12 @@
public abstract class GdlVisibleObject extends Composite implements GdlDescriptor, HasClickHandlers, HasMouseOutHandlers, HasMouseOverHandlers, HasFocusHandlers, HasMouseDownHandlers, HasMouseUpHandlers, HasBlurHandlers{ private GdlVisibleObject gdlParent = null; + private GdlVisibleObjectCssService cssService = null; + private GdlVisibleObjectTmService tmService = null; protected AbsolutePanel mainPanel = new AbsolutePanel(); protected Panel containerPanel = null; protected Topic tmRepresentative = null; protected TopicMap tm = null; - protected GdlVisibleObjectCssService cssService = null; protected ArrayList<Pair<String, String>> activeCssNamesAndStyles = new ArrayList<Pair<String,String>>(); protected ArrayList<Pair<String, String>> focusCssNamesAndStyles = new ArrayList<Pair<String,String>>(); protected ArrayList<Pair<String, String>> hoverCssNamesAndStyles = new ArrayList<Pair<String,String>>(); @@ -89,32 +89,6 @@ protected ArrayList<Pair<Topic, Integer>> actionButtonsAndPositions = null; protected ArrayList<GdlInfo> infoElements = new ArrayList<GdlInfo>(); protected Construct receivedData = null; - protected Topic valueGroupTopic = null; - protected boolean valueGroupTopicSet = false; - protected Topic constraintTopic = null; - protected boolean constraintTopicSet = false; - protected Topic rootConstraintTopic = null; - protected boolean rootConstraintTopicSet = false; - protected Topic defaultTmValueTopic = null; - protected boolean defaultTmValueTopicSet = false; - protected Topic defaultLiteralValueTopic = null; - protected boolean defaultLiteralValueTopicSet = false; - protected ArrayList<Topic> tmValueTopics = new ArrayList<Topic>(); - protected boolean tmValueTopicsSet = false; - protected ArrayList<Topic> literalValueTopics = new ArrayList<Topic>(); - protected boolean literalValueTopicsSet = false; - protected ArrayList<Topic> preferredScopes = new ArrayList<Topic>(); - protected boolean prefferedScopesSet = false; - protected Topic displayByConstraint = null; - protected boolean displayByConstraintSet = false; - protected ArrayList<String> literals = new ArrayList<String>(); - protected boolean literalsSet = false; - protected int cardMin = 0; - protected boolean cardMinSet = false; - protected int cardMax = 0; - protected boolean cardMaxSet = false; - protected ArrayList<Topic> rawTmValues = new ArrayList<Topic>(); - protected boolean rawTmValuesSet = false;
// some constructors @@ -133,6 +107,7 @@ if(!(receivedData instanceof Topic) && !(receivedData instanceof Association) && !(receivedData instanceof Name) && !(receivedData instanceof Variant) && !(receivedData instanceof Occurrence) && !(receivedData instanceof Role) && receivedData != null) throw new ExecutionException("receivedData must be either a Topic, Association, Topic-Name, Name-Variant, Topic-Occurrence or Association-Role, but is: " + receivedData.getClass()); this.receivedData = receivedData;
+ this.tmService = new GdlVisibleObjectTmService(this); this.cssService = new GdlVisibleObjectCssService(this); this.setId(this.getId()); @@ -1610,118 +1585,61 @@
public int getCardMin() throws InvalidGdlSchemaException { - if(this.cardMinSet){ - return this.cardMin; - } else { - this.cardMaxSet = true; - return TmHelper.getCardMin(this.getRootConstraint()); - } + return this.tmService.getCardMin(); }
public int getCardMax() throws InvalidGdlSchemaException { - if(this.cardMaxSet){ - return this.cardMax; - } else { - this.cardMaxSet = true; - return TmHelper.getCardMax(this.getRootConstraint()); - } + return this.tmService.getCardMax(); }
// returns the topic instance of gdlt:Value-Group that is bound to this // visible element, or null if it is unbound public Topic getValueGroup() throws InvalidGdlSchemaException { - if(this.valueGroupTopicSet){ - return this.valueGroupTopic; - } else { - this.valueGroupTopic = TmHelper.getValueGroupOf(this.tmRepresentative); - this.valueGroupTopicSet = true; - return this.valueGroupTopic; - } + return this.tmService.getValueGroup(); }
// returns the direct (first) constraint that is bound to the value-group // of this element - or null if it is unbound public Topic getConstraint() throws InvalidGdlSchemaException { - if(this.constraintTopicSet){ - return this.constraintTopic; - } else { - this.constraintTopic = TmHelper.getConstraintOfValueGroup(this.getValueGroup()); - this.constraintTopicSet = true; - return this.constraintTopic; - } + return this.tmService.getConstraint(); }
// returns the root (last) constraint that is bound to the value-group // of this element - or null if it is unbound public Topic getRootConstraint() throws InvalidGdlSchemaException { - if(this.rootConstraintTopicSet){ - return this.rootConstraintTopic; - } else { - this.rootConstraintTopic = TmHelper.getRootConstraintOfValueGroup(this.getValueGroup(), this.getConstraint()); - this.rootConstraintTopicSet = true; - return this.rootConstraintTopic; - } + return this.tmService.getRootConstraint(); }
// returns the topic that represents the default topic maps value of // the value-group that is bound to this element - null if it is unbound public Topic getDefaultTmValue() throws InvalidGdlSchemaException { - if(this.defaultTmValueTopicSet){ - return this.defaultTmValueTopic; - } else { - this.defaultTmValueTopic = TmHelper.getDefaultTmValue(this.getValueGroup()); - this.defaultTmValueTopicSet = true; - return this.defaultTmValueTopic; - } + return this.tmService.getDefaultTmValue(); }
// returns the topic that represents the default literal value of the // value-group that is bound to this element - or null if it is unbound public Topic getDefaultLiteralValue() throws InvalidGdlSchemaException { - if(this.defaultLiteralValueTopicSet){ - return this.defaultLiteralValueTopic; - } else { - this.defaultLiteralValueTopic = TmHelper.getDefaultLiteralValue(this.getValueGroup()); - this.defaultLiteralValueTopicSet = true; - return this.defaultLiteralValueTopic; - } + return this.tmService.getDefaultLiteralValue(); }
// returns the topic that represents the default value of // the value-group that is bound to this element - null if it is unbound public Topic getDefaultValue() throws InvalidGdlSchemaException { - if(this.getDefaultLiteralValue() != null && this.getDefaultTmValue() != null) throw new InvalidGdlSchemaException("the topic " + TmHelper.getAnyIdOfTopic(this.getValueGroup()) + " must be bound to maximal one " + PSIs.GDL.TopicType.gdlDefaultValue + ", but is: 2"); - else if(this.getDefaultLiteralValue() != null) return this.getDefaultLiteralValue(); - else return this.getDefaultTmValue(); + return this.tmService.getDefaultValue(); }
// returns true if the default value is fixed // otherwise the return value is false public boolean fixedDefaultValue() throws InvalidGdlSchemaException{ - Topic defVal = this.getDefaultValue(); - - if(defVal == null) return false; - - TopicMap tm = defVal.getTopicMap(); - Occurrence fixedOcc = TmHelper.getSingleOccurrence(defVal, TmHelper.getTopicByPsi(PSIs.GDL.OccurrenceType.gdlFixed, tm)); - - if(fixedOcc != null){ - try{ - return Boolean.valueOf(fixedOcc.getValue().toLowerCase()); - }catch(Exception e){ - throw new InvalidGdlSchemaException("the occurrence of type " + PSIs.GDL.OccurrenceType.gdlFixed + " bound to the topic " + TmHelper.getAnyIdOfTopic(defVal) + " must be set to either true or false, but is: " + fixedOcc.getValue()); - } - } else { - return false; - } + return this.tmService.fixedDefaultValue(); }
@@ -1729,65 +1647,41 @@ // that are valid and declared for the value-group of this element - or // an empty ArrayList public ArrayList<Topic> getTmValues() throws InvalidGdlSchemaException { - if(this.tmValueTopicsSet){ - return this.tmValueTopics; - } else { - this.tmValueTopics = TmHelper.getTmValues(this.getValueGroup()); - this.tmValueTopicsSet = true; - return this.tmValueTopics; - } + return this.tmService.getTmValues(); }
// returns all topics that represents literal values for this value-group - or // an empty ArrayList public ArrayList<Topic> getLiteralValues() throws InvalidGdlSchemaException { - if(this.literalValueTopicsSet){ - return this.literalValueTopics; - } else { - this.literalValueTopics = TmHelper.getLiteralValues(this.getValueGroup()); - this.literalValueTopicsSet = true; - return this.literalValueTopics; - } + return this.tmService.getLiteralValues(); }
// returns an ArrayList of strings that are set to a value group as literal values public ArrayList<String> getLiterals() throws InvalidGdlSchemaException { - if(this.literalsSet){ - return this.literals; - } else { - this.literalsSet = true; - this.literals = TmHelper.getLiterals(this.getValueGroup()); - return this.literals; - } + return this.tmService.getLiterals(); }
// returns the valid topic maps value for the constraint bound // to the value-group that is bound to this element - or an empty ArrayList public ArrayList<Topic> getTmValuesForConstraint() throws InvalidGdlSchemaException, ExecutionException { - return TmHelper.getTmValuesForConstraint(this.getConstraint(), this.getValueGroup()); + return this.tmService.getTmValuesForConstraint(); }
// returns the regular expression that is set for the constraint bound to the // value-group of this element public String getLiteralValueForConstraint() throws InvalidGdlSchemaException { - return TmHelper.getLiteralValueForConstraint(this.getConstraint()); + return this.tmService.getLiteralValueForConstraint(); }
// returns the display-by schema that is defined for the value-group that // is bound to this element public Topic getDisplayByOfValueGroup() throws InvalidGdlSchemaException { - if(this.displayByConstraintSet){ - return this.displayByConstraint; - } else { - this.displayByConstraintSet = true; - this.displayByConstraint = TmHelper.getDisplayByTopicOf(this.getValueGroup()); - return this.displayByConstraint; - } + return this.tmService.getDisplayByOfValueGroup(); }
@@ -1801,13 +1695,7 @@ // returns the preferred scope that is bound to the value-group of // this element - or an empty ArrayList public ArrayList<Topic> getPreferredScopeOfValueGroup() throws InvalidGdlSchemaException { - if(this.prefferedScopesSet){ - return this.preferredScopes; - } else { - this.prefferedScopesSet = true; - this.preferredScopes = TmHelper.getPrefferedScopesForTopicOf(this.getValueGroup()); - return this.preferredScopes; - } + return this.tmService.getPreferredScopeOfValueGroup(); }
@@ -1828,448 +1716,22 @@ // returns the strings of the control that are entered/selected // returns the strings of the control that are entered/selected public abstract ArrayList<String> getSelectedValues(); - - - // validates names, occurrences and identifiers for the passed value - private void validateLiteralValue(String selectedValue) throws InvalidContentException, InvalidGdlSchemaException{ - if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclSubjectIdentifierConstraint) || TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclSubjectLocatorConstraint) || TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclItemIdentifierConstraint)){ - Pattern pattern = new Pattern(TmHelper.getRegExp(this.getConstraint())); - if(!pattern.matches(selectedValue)) throw new InvalidContentException("The value "" + selectedValue + "" does not satisfy the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " with the regular expression: " + TmHelper.getRegExp(this.getConstraint())); - } else { - ArrayList<Pattern> validLiteralValues = new ArrayList<Pattern>(); - for (String literal : this.getLiterals()) validLiteralValues.add(new Pattern(literal)); - if(validLiteralValues.size() == 0) validLiteralValues.add(new Pattern(this.getLiteralValueForConstraint())); - int i = 0; - for( ; i != validLiteralValues.size(); ++i) if(validLiteralValues.get(i).matches(selectedValue)) break; - - if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclTopicNameConstraint)){ - if(i == validLiteralValues.size()) throw new InvalidContentException("the user data " + selectedValue + " for the topic-name " + TmHelper.getAnyIdOfTopic(TmHelper.getConstrainedStatement(this.getConstraint())) + " does not satisfy any of the constraints: " + Utils.arrayToString(validLiteralValues)); - } else if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclTopicOccurrenceConstraint)){ - if(i == validLiteralValues.size()) throw new InvalidContentException("the user data " + selectedValue + " for the topic-occurrence " + TmHelper.getAnyIdOfTopic(TmHelper.getConstrainedStatement(this.getConstraint())) + " does not satisfy any of the constraints: " + Utils.arrayToString(validLiteralValues)); - } - } - } - - - // validates the the tm values of a constraint - private void validateTmValue(Topic selectedPlayer) throws InvalidContentException, InvalidGdlSchemaException, ExecutionException { - if(this.getRawTmValues().size() != 0 && !this.getRawTmValues().contains(selectedPlayer)){ - throw new InvalidContentException("the topic " + TmHelper.getAnyIdOfTopic(selectedPlayer) + " does not satisfy the contraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " and the topic values: " + Utils.topicArrayToString(this.getRawTmValues())); - } else { - if(!this.getTmValuesForConstraint().contains(selectedPlayer)){ - throw new InvalidContentException("the topic " + TmHelper.getAnyIdOfTopic(selectedPlayer) + " does not satisfy the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " and topic values: " + Utils.topicArrayToString(this.getTmValuesForConstraint())); - } - } - } - - - // returns the actual topics that are set as possible tm-values - private ArrayList<Topic> getRawTmValues() throws InvalidGdlSchemaException{ - if(this.rawTmValuesSet){ - return this.rawTmValues; - } else { - this.rawTmValuesSet = true; - ArrayList<Topic> tmValues = this.getTmValues(); - for (Topic tmValue : tmValues) this.rawTmValues = Utils.union(this.rawTmValues, TmHelper.getValuesForTmValue(tmValue)); - return this.rawTmValues; - } - } - - - // returns all locators contained in the passed locators array, which match the - // passed regular expression value - private ArrayList<Locator> filterLocators(String pattern, JsArray<Locator> locators){ - ArrayList<Locator> result = new ArrayList<Locator>(); - if(locators == null || locators.length() == 0) return result; - Pattern patternObject = new Pattern(pattern == null ? ".*" : pattern); - - for(int i = 0; i != locators.length(); ++i){ - if(patternObject.matches(locators.get(i).getReference())) result.add(locators.get(i)); - } - - return result; - } - - - // handles the getContent call for subject identifiers and subject locators - private void getTopicIdentifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); - JsArray<Locator> identifiers = null; - - ArrayList<Locator> filteredIdentifiers = null; - boolean isPsiConstraint = false; - if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclSubjectIdentifierConstraint)){ - isPsiConstraint = true; - identifiers = carrier.getSubjectIdentifiers(); - filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); - } else if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclSubjectLocatorConstraint)){ - identifiers = carrier.getSubjectLocators(); - filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); - } else { - throw new ExecutionException("Only the constraints " + PSIs.TMCL.tmclSubjectIdentifierConstraint + " and " + PSIs.TMCL.tmclSubjectLocatorConstraint + " are supported by the function getTopicIdentifierContent"); - } - - Locator changedIdentifier = null; - if(validate) this.validateLiteralValue(this.getSelectedValues().get(selectedValueIndex)); - - if(filteredIdentifiers.size() > selectedValueIndex){ - changedIdentifier = filteredIdentifiers.get(selectedValueIndex); - if(isPsiConstraint) carrier.removeSubjectIdentifier(changedIdentifier); - else carrier.removeSubjectLocator(changedIdentifier); - } - - changedIdentifier = carrier.getTopicMap().createLocator(this.getSelectedValues().get(selectedValueIndex)); - if(isPsiConstraint) carrier.addSubjectIdentifier(changedIdentifier); - else carrier.addSubjectLocator(changedIdentifier); - contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); - } - - - // handles the getContent call for item identifiers - private void getItemIdentifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(this.receivedData instanceof Reifiable) || !(this.receivedData instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Reifiable, but is: " + receivedData.getClass()); - - // get type - Topic constrainedTopicType = TmHelper.getConstrainedTopicType(this.getConstraint()); - - int typeIdx = -1; - JsArray<Topic> types = null; - if((carrier instanceof Topic)){ - types = ((Topic)carrier).getTypes(); - if(types.length() != 0){ - for(typeIdx = 0; typeIdx != types.length(); ++typeIdx) if(types.get(typeIdx).equals(constrainedTopicType)) break; - } - } - - JsArray<Locator> identifiers = null; - ArrayList<Locator> filteredIdentifiers = null; - if((carrier instanceof Topic) && types != null && typeIdx != types.length()){ - identifiers = ((Topic)carrier).getItemIdentifiers(); - filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); - - Locator changedIdentifier = null; - if(validate) this.validateLiteralValue(this.getSelectedValues().get(selectedValueIndex)); - - if(filteredIdentifiers.size() > selectedValueIndex){ - changedIdentifier = filteredIdentifiers.get(selectedValueIndex); - ((Topic)carrier).removeItemIdentifier(changedIdentifier); - } - - changedIdentifier = ((Topic)carrier).getTopicMap().createLocator(this.getSelectedValues().get(selectedValueIndex)); - ((Topic)carrier).addItemIdentifier(changedIdentifier); - contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); - } else { - // search for the topic type - Reifiable ref = null; - - // search for the characteristics type - if(carrier instanceof Topic){ - JsArray<Name> names = ((Topic)carrier).getNames(constrainedTopicType); - if(names.length() != 0){ - ref = names.get(0); - } else { - JsArray<Occurrence> occs = ((Topic)carrier).getOccurrences(constrainedTopicType); - if(occs.length() != 0) ref = occs.get(0); - } - } else if(carrier instanceof Association){ - JsArray<Role> roles = ((Association)carrier).getRoles(constrainedTopicType); - if(roles.length() != 0) ref = roles.get(0); - } - if(ref == null) return; - - // search for item-identifiers of the found topic type or characteristics - identifiers = ((ReifiableStub)ref).getItemIdentifiers(); - filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); - - Locator changedIdentifier = null; - if(validate) this.validateLiteralValue(this.getSelectedValues().get(selectedValueIndex)); - - if(filteredIdentifiers.size() > selectedValueIndex){ - changedIdentifier = filteredIdentifiers.get(selectedValueIndex); - ((ReifiableStub)carrier).removeItemIdentifier(changedIdentifier); - } - - changedIdentifier = ((ReifiableStub)carrier).getTopicMap().createLocator(this.getSelectedValues().get(selectedValueIndex)); - ((ReifiableStub)carrier).addItemIdentifier(changedIdentifier); - contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); - } - } - - - // handles the getContent call for item identifiers of variant-names - private void getVariantIdentifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); - ArrayList<Variant> possibleVariants = TmHelper.getVariantsForConstraint(carrier, this.getRootConstraint()); - if(possibleVariants.size() != 0){ - Variant variant = possibleVariants.get(0); - JsArray<Locator> identifiers = null; - - ArrayList<Locator> filteredIdentifiers = null; - - identifiers = variant.getItemIdentifiers(); - filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); - - Locator changedIdentifier = null; - if(validate) this.validateLiteralValue(this.getSelectedValues().get(selectedValueIndex)); - - if(filteredIdentifiers.size() > selectedValueIndex){ - changedIdentifier = filteredIdentifiers.get(selectedValueIndex); - variant.removeItemIdentifier(changedIdentifier); - } - - changedIdentifier = variant.getTopicMap().createLocator(this.getSelectedValues().get(selectedValueIndex)); - variant.addItemIdentifier(changedIdentifier); - contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); - } - } - // handles the getContent call for item identifiers of variant-names - private void getVariantReifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); - ArrayList<Variant> possibleVariants = TmHelper.getVariantsForConstraint(carrier, this.getRootConstraint()); - if(possibleVariants.size() != 0){ - Variant variant = possibleVariants.get(0); - Topic reifier = TmHelper.getTopicFromStringRepresentation(this.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); - - if(reifier != null && !variant.getReifier().equals(reifier)) variant.setReifier(reifier); - contents.add(new Pair<Object, TopicMapsTypes>(variant, TopicMapsTypes.Variant)); - } - } - - - // handles the getContent call for occurrence and name values - private void getTopicCharacteristicContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); - Topic characteristicType = TmHelper.getConstrainedStatement(this.getConstraint()); - - boolean isOccConstraint = true; - if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclTopicOccurrenceConstraint)){ - isOccConstraint = true; - } else if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclTopicNameConstraint)){ - isOccConstraint = false; - } else { - throw new ExecutionException("the function getTopicCharacteristicContent can operate only on constraints of the type " + PSIs.TMCL.tmclTopicOccurrenceConstraint + " or " + PSIs.TMCL.tmclTopicNameConstraint + ", but is called with " + TmHelper.getAnyIdOfTopic(this.getConstraint())); - } - - JsArray<Name> names = null; - JsArray<Occurrence> occurrences = null; - if(isOccConstraint) occurrences = carrier.getOccurrences(characteristicType); - else names = carrier.getNames(characteristicType); - - - Construct changedConstruct = null; - if(validate) this.validateLiteralValue(this.getSelectedValues().get(selectedValueIndex)); + // handles the getContent call for a Datatye value + private void getDatatypeContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + receivedData.getClass());
- if(isOccConstraint){ - if(occurrences.length() > selectedValueIndex){ - changedConstruct = occurrences.get(selectedValueIndex); - ((Occurrence)changedConstruct).setValue(this.getSelectedValues().get(selectedValueIndex)); - }else { - changedConstruct = carrier.createOccurrence(characteristicType, this.getSelectedValues().get(selectedValueIndex), null); - } - } else { - if(names.length() > selectedValueIndex){ - changedConstruct = names.get(selectedValueIndex); - ((Name)changedConstruct).setValue(this.getSelectedValues().get(selectedValueIndex)); - }else { - changedConstruct = carrier.createName(this.getSelectedValues().get(selectedValueIndex), characteristicType, null); - } - } - contents.add(new Pair<Object, TopicMapsTypes>(changedConstruct, isOccConstraint ? TopicMapsTypes.Occurrence : TopicMapsTypes.Name)); + ArrayList<Variant> variants = TmHelper.getVariantsForConstraint((Topic)this.receivedData, this.getRootConstraint()); + Topic occType = TmHelper.getConstrainedStatement(this.getRootConstraint()); + ArrayList<Occurrence> occs = Utils.jsArrayToArrayList(((Topic)this.receivedData).getOccurrences(occType)); + this.tmService.getDatatypeContent(contents, validate, carrier, selectedValueIndex, variants, occs); } - // handles the getContent call for subject identifiers and subject locators private void getVariantNameContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(this.receivedData instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + receivedData.getClass()); - ArrayList<Variant> variants = TmHelper.getVariantsForConstraint((Topic)this.receivedData, this.getConstraint()); - - Variant changedVariant = null; - if(validate) this.validateLiteralValue(this.getSelectedValues().get(selectedValueIndex)); - - if(variants.size() > selectedValueIndex){ - changedVariant = variants.get(selectedValueIndex); - changedVariant.setValue(this.getSelectedValues().get(selectedValueIndex)); - }else { - Topic nameType = TmHelper.getConstrainedStatement(this.getConstraint()); - JsArray<Name> names = carrier.getNames(nameType); - Name owner = names.get(0); - Topic scope = TmHelper.getConstrainedScopeTopic(this.getConstraint()); - @SuppressWarnings("unchecked") - JsArray<Topic> scopes = (JsArray<Topic>) JsArray.createArray(); - scopes.push(scope); - changedVariant = owner.createVariant(this.getSelectedValues().get(selectedValueIndex), scopes); - } - contents.add(new Pair<Object, TopicMapsTypes>(changedVariant, TopicMapsTypes.Variant)); - } - - - // handles the getContent call for role players - private void getRolePlayerContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Association carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(carrier instanceof Association)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to an Association, but is: " + carrier.getClass()); - - if(!TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclTopicRoleConstraint))throw new InvalidGdlSchemaException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a root constraint of the type " + PSIs.TMCL.tmclTopicRoleConstraint + ", but is: " + TmHelper.getAnyIdOfTopic(this.getRootConstraint())); - Pair<Topic, Topic> roleAndPlayerType = TmHelper.getConstrainedRoleAndPlayerTypeOfConstraint(this.getRootConstraint()); - Topic roleType = roleAndPlayerType.getFirst(); - Topic playerType = roleAndPlayerType.getSecond(); - - JsArray<Role> typedRoles = carrier.getRoles(roleType); - ArrayList<Role> roles = new ArrayList<Role>(); - for(int i = 0; i != typedRoles.length(); ++i) - if(TmHelper.isInstanceOf(typedRoles.get(i).getPlayer(), playerType)) roles.add(typedRoles.get(i)); - - Role changedRole = null; - - Topic player = TmHelper.getTopicFromStringRepresentation(this.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); - if(validate) this.validateTmValue(player); - if(roles.size() > selectedValueIndex){ - changedRole = roles.get(selectedValueIndex); - changedRole.setPlayer(player); - } else { - changedRole = carrier.createRole(roleType, player); - } - contents.add(new Pair<Object, TopicMapsTypes>(changedRole, TopicMapsTypes.Role)); - } - - - // handles the getContent call for scope topics of variant-names - private void getVariantNameScopeContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); - ArrayList<Variant> possibleVariants = TmHelper.getVariantsForConstraint(carrier, this.getRootConstraint()); - if(possibleVariants.size() != 0){ - Variant variant = possibleVariants.get(0); - JsArray<Topic> scopes = variant.getScope(); - - if(validate) this.validateLiteralValue(this.getSelectedValues().get(selectedValueIndex)); - - if(scopes.length() > selectedValueIndex){ - Topic oldScope = scopes.get(selectedValueIndex); - Topic newScope = TmHelper.getTopicFromStringRepresentation(this.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); - - if(!oldScope.equals(newScope)){ - variant.removeTheme(oldScope); - variant.addTheme(newScope); - } - } - contents.add(new Pair<Object, TopicMapsTypes>(variant, TopicMapsTypes.Variant)); - } - } - - - // handles the getContent call for scope topics - private void getScopeContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - Topic type = TmHelper.getConstrainedStatement(this.getConstraint()); - - JsArray<Topic> scopes = null; - Construct owner = null; - TopicMapsTypes ownerType = null; - if(carrier instanceof Topic){ - JsArray<Name> names = ((Topic)carrier).getNames(type); - if(names.length() != 0){ - scopes = names.get(0).getScope(); - owner = names.get(0); - ownerType = TopicMapsTypes.Name; - } - if(scopes == null){ - JsArray<Occurrence> occs = ((Topic)carrier).getOccurrences(type); - if(occs.length() != 0){ - scopes = occs.get(0).getScope(); - owner = occs.get(0); - ownerType = TopicMapsTypes.Occurrence; - } - } - } else if(carrier instanceof Association){ - if(((Association)carrier).getType().equals(type)){ - scopes = ((Association)carrier).getScope(); - owner = carrier; - ownerType = TopicMapsTypes.Association; - } - } else { - throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a topic or association, but is: " + carrier.getClass()); - } - - Topic newScope = TmHelper.getTopicFromStringRepresentation(this.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); - Topic oldScope = null; - if(scopes.length() > selectedValueIndex){ - oldScope = scopes.get(selectedValueIndex); - if(!newScope.equals(oldScope)){ - ((ScopedStub)owner).removeTheme(oldScope); - ((ScopedStub)owner).addTheme(newScope); - } - } else { - ((ScopedStub)owner).addTheme(newScope); - } - contents.add(new Pair<Object, TopicMapsTypes>(owner, ownerType)); - } - - - // handles the getContent call for a reifier topic - private void getReifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - Topic type = TmHelper.getConstrainedStatement(this.getConstraint()); - - Construct owner = null; - TopicMapsTypes ownerType = null; - if(carrier instanceof Topic){ - JsArray<Name> names = ((Topic)carrier).getNames(type); - if(names.length() != 0){ - owner = names.get(0); - ownerType = TopicMapsTypes.Name; - } else { - JsArray<Occurrence> occs = ((Topic)carrier).getOccurrences(type); - if(occs.length() != 0){ - owner = occs.get(0); - ownerType = TopicMapsTypes.Occurrence; - } - } - } else if(carrier instanceof Association){ - if(((Association)carrier).getType().equals(type)){ - owner = carrier; - ownerType = TopicMapsTypes.Association; - } else { - JsArray<Role> roles = ((Association)carrier).getRoles(type); - if(roles.length() != 0){ - owner = roles.get(0); - ownerType = TopicMapsTypes.Role; - } - } - } else { - throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a topic or association, but is: " + carrier.getClass()); - } - - Topic newReifier = TmHelper.getTopicFromStringRepresentation(this.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); - if(!newReifier.equals(((ReifiableStub)owner).getReifier())) ((ReifiableStub)owner).setReifier(newReifier); - contents.add(new Pair<Object, TopicMapsTypes>(owner, ownerType)); - } - - - // handles the getContent call for a Datatye value - // handles the getContent call for scope topics - private void getDatatypeContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ - if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + receivedData.getClass()); - - Construct owner = null; - TopicMapsTypes ownerType = null; - if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclVariantNameConstraint)){ - ArrayList<Variant> variants = TmHelper.getVariantsForConstraint((Topic)this.receivedData, this.getRootConstraint()); - if(variants.size() != 0){ - owner = variants.get(0); - variants.get(0).setValue(variants.get(0).getValue(), variants.get(0).getTopicMap().createLocator(this.getSelectedValues().get(selectedValueIndex))); - ownerType = TopicMapsTypes.Variant; - } - } else if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclOccurrenceConstraint)){ - Topic occType = TmHelper.getConstrainedStatement(this.getRootConstraint()); - JsArray<Occurrence> occs = ((Topic)this.receivedData).getOccurrences(occType); - if(occs.length() != 0){ - owner = occs.get(0); - occs.get(0).setValue(occs.get(0).getValue(), occs.get(0).getTopicMap().createLocator(this.getSelectedValues().get(selectedValueIndex))); - ownerType = TopicMapsTypes.Occurrence; - } - } else { - throw new InvalidGdlSchemaException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a constraint of the type " + PSIs.TMCL.tmclVariantNameConstraint + " or " + PSIs.TMCL.tmclOccurrenceConstraint + ", but is bound to: " + TmHelper.getAnyIdOfTopic(this.getRootConstraint())); - } - contents.add(new Pair<Object, TopicMapsTypes>(owner, ownerType)); + this.tmService.getVariantNameContent(contents, validate, carrier, selectedValueIndex, variants); } @@ -2325,33 +1787,33 @@
for (int idx = 0; idx != this.getSelectedValues().size(); ++idx){ if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclItemIdentifierConstraint)){ - this.getItemIdentifierContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getItemIdentifierContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclSubjectIdentifierConstraint)){ - this.getTopicIdentifierContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getTopicIdentifierContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclSubjectLocatorConstraint)){ - this.getTopicIdentifierContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getTopicIdentifierContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclTopicNameConstraint)){ - this.getTopicCharacteristicContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getTopicCharacteristicContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclVariantNameConstraint)){ this.getVariantNameContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclScopeConstraint)){ - this.getScopeContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getScopeContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclReifierConstraint)){ - this.getReifierContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getReifierContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.GDL.TopicType.gdlDatatype)){ this.getDatatypeContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.GDL.TopicType.gdlType)){ this.getTypeContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.GDL.TopicType.gdlVariantNameScope)){ - this.getVariantNameScopeContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getVariantNameScopeContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.GDL.TopicType.gdlVariantNameReifier)){ - this.getVariantReifierContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getVariantReifierContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.GDL.TopicType.gdlVariantNameIdentifiers)){ - this.getVariantIdentifierContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getVariantIdentifierContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclTopicOccurrenceConstraint)){ - this.getTopicCharacteristicContent(result, validate, (Topic)localCarrier, idx); + this.tmService.getTopicCharacteristicContent(result, validate, (Topic)localCarrier, idx); } else if (TmHelper.isInstanceOf(this.getConstraint(), PSIs.GDL.TopicType.gdlRolePlayer)){ - this.getRolePlayerContent(result, validate, (Association)localCarrier, idx); + this.tmService.getRolePlayerContent(result, validate, (Association)localCarrier, idx); } else { throw new InvalidGdlSchemaException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " is not supported"); }
Added: trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObjectTmService.java ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/GdlVisibleObjectTmService.java Tue Nov 22 13:11:07 2011 (r1035) @@ -0,0 +1,693 @@ +package us.isidor.gdl.anaToMia.Widgets.base; + +import java.util.ArrayList; +import com.google.gwt.core.client.JsArray; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Construct; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Locator; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Name; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Occurrence; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Reifiable; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.ReifiableStub; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Role; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.ScopedStub; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMapsTypes; +import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Variant; +import us.isidor.gdl.anaToMia.Widgets.environment.ExecutionException; +import us.isidor.gdl.anaToMia.Widgets.environment.InvalidContentException; +import us.isidor.gdl.anaToMia.Widgets.environment.InvalidGdlSchemaException; +import us.isidor.gdl.anaToMia.Widgets.environment.Pair; +import us.isidor.gdl.anaToMia.Widgets.environment.Pattern; + + +public class GdlVisibleObjectTmService { + private GdlVisibleObject owner = null; + private Topic valueGroupTopic = null; + private boolean valueGroupTopicSet = false; + private Topic tmRepresentative = null; + private Topic constraintTopic = null; + private boolean constraintTopicSet = false; + private Topic rootConstraintTopic = null; + private boolean rootConstraintTopicSet = false; + private Topic defaultTmValueTopic = null; + private boolean defaultTmValueTopicSet = false; + private Topic defaultLiteralValueTopic = null; + private boolean defaultLiteralValueTopicSet = false; + private ArrayList<Topic> tmValueTopics = new ArrayList<Topic>(); + private boolean tmValueTopicsSet = false; + private ArrayList<Topic> literalValueTopics = new ArrayList<Topic>(); + private boolean literalValueTopicsSet = false; + private ArrayList<String> literals = new ArrayList<String>(); + private boolean literalsSet = false; + private int cardMin = 0; + private boolean cardMinSet = false; + private int cardMax = 0; + private boolean cardMaxSet = false; + private Topic displayByConstraint = null; + private boolean displayByConstraintSet = false; + private ArrayList<Topic> preferredScopes = new ArrayList<Topic>(); + private boolean prefferedScopesSet = false; + private ArrayList<Topic> rawTmValues = new ArrayList<Topic>(); + private boolean rawTmValuesSet = false; + + + @SuppressWarnings("unused") + private GdlVisibleObjectTmService() {} + + + public GdlVisibleObjectTmService(GdlVisibleObject owner) throws ExecutionException { + if(owner == null) throw new ExecutionException("owner must not be null"); + this.owner = owner; + this.tmRepresentative = this.owner.getTmRepresentative(); + } + + + // returns the topic instance of gdlt:Value-Group that is bound to this + // visible element, or null if it is unbound + public Topic getValueGroup() throws InvalidGdlSchemaException { + if(this.valueGroupTopicSet){ + return this.valueGroupTopic; + } else { + this.valueGroupTopic = TmHelper.getValueGroupOf(this.tmRepresentative); + this.valueGroupTopicSet = true; + return this.valueGroupTopic; + } + } + + + // returns the direct (first) constraint that is bound to the value-group + // of this element - or null if it is unbound + public Topic getConstraint() throws InvalidGdlSchemaException { + if(this.constraintTopicSet){ + return this.constraintTopic; + } else { + this.constraintTopic = TmHelper.getConstraintOfValueGroup(this.getValueGroup()); + this.constraintTopicSet = true; + return this.constraintTopic; + } + } + + + // returns the root (last) constraint that is bound to the value-group + // of this element - or null if it is unbound + public Topic getRootConstraint() throws InvalidGdlSchemaException { + if(this.rootConstraintTopicSet){ + return this.rootConstraintTopic; + } else { + this.rootConstraintTopic = TmHelper.getRootConstraintOfValueGroup(this.getValueGroup(), this.getConstraint()); + this.rootConstraintTopicSet = true; + return this.rootConstraintTopic; + } + } + + + // returns the topic that represents the default topic maps value of + // the value-group that is bound to this element - null if it is unbound + public Topic getDefaultTmValue() throws InvalidGdlSchemaException { + if(this.defaultTmValueTopicSet){ + return this.defaultTmValueTopic; + } else { + this.defaultTmValueTopic = TmHelper.getDefaultTmValue(this.getValueGroup()); + this.defaultTmValueTopicSet = true; + return this.defaultTmValueTopic; + } + } + + + // returns the topic that represents the default literal value of the + // value-group that is bound to this element - or null if it is unbound + public Topic getDefaultLiteralValue() throws InvalidGdlSchemaException { + if(this.defaultLiteralValueTopicSet){ + return this.defaultLiteralValueTopic; + } else { + this.defaultLiteralValueTopic = TmHelper.getDefaultLiteralValue(this.getValueGroup()); + this.defaultLiteralValueTopicSet = true; + return this.defaultLiteralValueTopic; + } + } + + + // returns the topic that represents the default value of + // the value-group that is bound to this element - null if it is unbound + public Topic getDefaultValue() throws InvalidGdlSchemaException { + if(this.getDefaultLiteralValue() != null && this.getDefaultTmValue() != null) throw new InvalidGdlSchemaException("the topic " + TmHelper.getAnyIdOfTopic(this.getValueGroup()) + " must be bound to maximal one " + PSIs.GDL.TopicType.gdlDefaultValue + ", but is: 2"); + else if(this.getDefaultLiteralValue() != null) return this.getDefaultLiteralValue(); + else return this.getDefaultTmValue(); + } + + + // returns true if the default value is fixed + // otherwise the return value is false + public boolean fixedDefaultValue() throws InvalidGdlSchemaException{ + Topic defVal = this.getDefaultValue(); + + if(defVal == null) return false; + + TopicMap tm = defVal.getTopicMap(); + Occurrence fixedOcc = TmHelper.getSingleOccurrence(defVal, TmHelper.getTopicByPsi(PSIs.GDL.OccurrenceType.gdlFixed, tm)); + + if(fixedOcc != null){ + try{ + return Boolean.valueOf(fixedOcc.getValue().toLowerCase()); + }catch(Exception e){ + throw new InvalidGdlSchemaException("the occurrence of type " + PSIs.GDL.OccurrenceType.gdlFixed + " bound to the topic " + TmHelper.getAnyIdOfTopic(defVal) + " must be set to either true or false, but is: " + fixedOcc.getValue()); + } + } else { + return false; + } + } + + + // returns all topic maps values represented by topics of the type gdlt:Tm-Value + // that are valid and declared for the value-group of this element - or + // an empty ArrayList + public ArrayList<Topic> getTmValues() throws InvalidGdlSchemaException { + if(this.tmValueTopicsSet){ + return this.tmValueTopics; + } else { + this.tmValueTopics = TmHelper.getTmValues(this.getValueGroup()); + this.tmValueTopicsSet = true; + return this.tmValueTopics; + } + } + + + // returns all topics that represents literal values for this value-group - or + // an empty ArrayList + public ArrayList<Topic> getLiteralValues() throws InvalidGdlSchemaException { + if(this.literalValueTopicsSet){ + return this.literalValueTopics; + } else { + this.literalValueTopics = TmHelper.getLiteralValues(this.getValueGroup()); + this.literalValueTopicsSet = true; + return this.literalValueTopics; + } + } + + + // returns an ArrayList of strings that are set to a value group as literal values + public ArrayList<String> getLiterals() throws InvalidGdlSchemaException { + if(this.literalsSet){ + return this.literals; + } else { + this.literalsSet = true; + this.literals = TmHelper.getLiterals(this.getValueGroup()); + return this.literals; + } + } + + + public int getCardMin() throws InvalidGdlSchemaException { + if(this.cardMinSet){ + return this.cardMin; + } else { + this.cardMaxSet = true; + return TmHelper.getCardMin(this.getRootConstraint()); + } + } + + + public int getCardMax() throws InvalidGdlSchemaException { + if(this.cardMaxSet){ + return this.cardMax; + } else { + this.cardMaxSet = true; + return TmHelper.getCardMax(this.getRootConstraint()); + } + } + + + // returns the valid topic maps value for the constraint bound + // to the value-group that is bound to this element - or an empty ArrayList + public ArrayList<Topic> getTmValuesForConstraint() throws InvalidGdlSchemaException, ExecutionException { + return TmHelper.getTmValuesForConstraint(this.getConstraint(), this.getValueGroup()); + } + + + // returns the regular expression that is set for the constraint bound to the + // value-group of this element + public String getLiteralValueForConstraint() throws InvalidGdlSchemaException { + return TmHelper.getLiteralValueForConstraint(this.getConstraint()); + } + + + // returns the display-by schema that is defined for the value-group that + // is bound to this element + public Topic getDisplayByOfValueGroup() throws InvalidGdlSchemaException { + if(this.displayByConstraintSet){ + return this.displayByConstraint; + } else { + this.displayByConstraintSet = true; + this.displayByConstraint = TmHelper.getDisplayByTopicOf(this.getValueGroup()); + return this.displayByConstraint; + } + } + + + // returns all locators contained in the passed locators array, which match the + // passed regular expression value + public ArrayList<Locator> filterLocators(String pattern, JsArray<Locator> locators){ + ArrayList<Locator> result = new ArrayList<Locator>(); + if(locators == null || locators.length() == 0) return result; + Pattern patternObject = new Pattern(pattern == null ? ".*" : pattern); + + for(int i = 0; i != locators.length(); ++i){ + if(patternObject.matches(locators.get(i).getReference())) result.add(locators.get(i)); + } + + return result; + } + + + // returns the preferred scope that is bound to the value-group of + // this element - or an empty ArrayList + public ArrayList<Topic> getPreferredScopeOfValueGroup() throws InvalidGdlSchemaException { + if(this.prefferedScopesSet){ + return this.preferredScopes; + } else { + this.prefferedScopesSet = true; + this.preferredScopes = TmHelper.getPrefferedScopesForTopicOf(this.getValueGroup()); + return this.preferredScopes; + } + } + + + // validates names, occurrences and identifiers for the passed value + public void validateLiteralValue(String selectedValue) throws InvalidContentException, InvalidGdlSchemaException{ + if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclSubjectIdentifierConstraint) || TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclSubjectLocatorConstraint) || TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclItemIdentifierConstraint)){ + Pattern pattern = new Pattern(TmHelper.getRegExp(this.getConstraint())); + if(!pattern.matches(selectedValue)) throw new InvalidContentException("The value "" + selectedValue + "" does not satisfy the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " with the regular expression: " + TmHelper.getRegExp(this.getConstraint())); + } else { + ArrayList<Pattern> validLiteralValues = new ArrayList<Pattern>(); + for (String literal : this.getLiterals()) validLiteralValues.add(new Pattern(literal)); + if(validLiteralValues.size() == 0) validLiteralValues.add(new Pattern(this.getLiteralValueForConstraint())); + int i = 0; + for( ; i != validLiteralValues.size(); ++i) if(validLiteralValues.get(i).matches(selectedValue)) break; + + if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclTopicNameConstraint)){ + if(i == validLiteralValues.size()) throw new InvalidContentException("the user data " + selectedValue + " for the topic-name " + TmHelper.getAnyIdOfTopic(TmHelper.getConstrainedStatement(this.getConstraint())) + " does not satisfy any of the constraints: " + Utils.arrayToString(validLiteralValues)); + } else if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclTopicOccurrenceConstraint)){ + if(i == validLiteralValues.size()) throw new InvalidContentException("the user data " + selectedValue + " for the topic-occurrence " + TmHelper.getAnyIdOfTopic(TmHelper.getConstrainedStatement(this.getConstraint())) + " does not satisfy any of the constraints: " + Utils.arrayToString(validLiteralValues)); + } + } + } + + + // validates the the tm values of a constraint + public void validateTmValue(Topic selectedTopic) throws InvalidContentException, InvalidGdlSchemaException, ExecutionException { + if(this.getRawTmValues().size() != 0 && !this.getRawTmValues().contains(selectedTopic)){ + throw new InvalidContentException("the topic " + TmHelper.getAnyIdOfTopic(selectedTopic) + " does not satisfy the contraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " and the topic values: " + Utils.topicArrayToString(this.getRawTmValues())); + } else { + if(!this.getTmValuesForConstraint().contains(selectedTopic)){ + throw new InvalidContentException("the topic " + TmHelper.getAnyIdOfTopic(selectedTopic) + " does not satisfy the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " and topic values: " + Utils.topicArrayToString(this.getTmValuesForConstraint())); + } + } + } + + + // returns the actual topics that are set as possible tm-values + public ArrayList<Topic> getRawTmValues() throws InvalidGdlSchemaException{ + if(this.rawTmValuesSet){ + return this.rawTmValues; + } else { + this.rawTmValuesSet = true; + ArrayList<Topic> tmValues = this.getTmValues(); + for (Topic tmValue : tmValues) this.rawTmValues = Utils.union(this.rawTmValues, TmHelper.getValuesForTmValue(tmValue)); + return this.rawTmValues; + } + } + + + // handles the getContent call for subject identifiers and subject locators + public void getTopicIdentifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); + JsArray<Locator> identifiers = null; + + ArrayList<Locator> filteredIdentifiers = null; + boolean isPsiConstraint = false; + if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclSubjectIdentifierConstraint)){ + isPsiConstraint = true; + identifiers = carrier.getSubjectIdentifiers(); + filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); + } else if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclSubjectLocatorConstraint)){ + identifiers = carrier.getSubjectLocators(); + filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); + } else { + throw new ExecutionException("Only the constraints " + PSIs.TMCL.tmclSubjectIdentifierConstraint + " and " + PSIs.TMCL.tmclSubjectLocatorConstraint + " are supported by the function getTopicIdentifierContent"); + } + + Locator changedIdentifier = null; + if(validate) this.validateLiteralValue(this.owner.getSelectedValues().get(selectedValueIndex)); + + if(filteredIdentifiers.size() > selectedValueIndex){ + changedIdentifier = filteredIdentifiers.get(selectedValueIndex); + if(isPsiConstraint) carrier.removeSubjectIdentifier(changedIdentifier); + else carrier.removeSubjectLocator(changedIdentifier); + } + + changedIdentifier = carrier.getTopicMap().createLocator(this.owner.getSelectedValues().get(selectedValueIndex)); + if(isPsiConstraint) carrier.addSubjectIdentifier(changedIdentifier); + else carrier.addSubjectLocator(changedIdentifier); + contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); + } + + + // handles the getContent call for item identifiers + public void getItemIdentifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + // get type + Topic constrainedTopicType = TmHelper.getConstrainedTopicType(this.getConstraint()); + + int typeIdx = -1; + JsArray<Topic> types = null; + if((carrier instanceof Topic)){ + types = ((Topic)carrier).getTypes(); + if(types.length() != 0){ + for(typeIdx = 0; typeIdx != types.length(); ++typeIdx) if(types.get(typeIdx).equals(constrainedTopicType)) break; + } + } + + JsArray<Locator> identifiers = null; + ArrayList<Locator> filteredIdentifiers = null; + if((carrier instanceof Topic) && types != null && typeIdx != types.length()){ + identifiers = ((Topic)carrier).getItemIdentifiers(); + filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); + + Locator changedIdentifier = null; + if(validate) this.validateLiteralValue(this.owner.getSelectedValues().get(selectedValueIndex)); + + if(filteredIdentifiers.size() > selectedValueIndex){ + changedIdentifier = filteredIdentifiers.get(selectedValueIndex); + ((Topic)carrier).removeItemIdentifier(changedIdentifier); + } + + changedIdentifier = ((Topic)carrier).getTopicMap().createLocator(this.owner.getSelectedValues().get(selectedValueIndex)); + ((Topic)carrier).addItemIdentifier(changedIdentifier); + contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); + } else { + // search for the topic type + Reifiable ref = null; + + // search for the characteristics type + if(carrier instanceof Topic){ + JsArray<Name> names = ((Topic)carrier).getNames(constrainedTopicType); + if(names.length() != 0){ + ref = names.get(0); + } else { + JsArray<Occurrence> occs = ((Topic)carrier).getOccurrences(constrainedTopicType); + if(occs.length() != 0) ref = occs.get(0); + } + } else if(carrier instanceof Association){ + JsArray<Role> roles = ((Association)carrier).getRoles(constrainedTopicType); + if(roles.length() != 0) ref = roles.get(0); + } + if(ref == null) return; + + // search for item-identifiers of the found topic type or characteristics + identifiers = ((ReifiableStub)ref).getItemIdentifiers(); + filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); + + Locator changedIdentifier = null; + if(validate) this.validateLiteralValue(this.owner.getSelectedValues().get(selectedValueIndex)); + + if(filteredIdentifiers.size() > selectedValueIndex){ + changedIdentifier = filteredIdentifiers.get(selectedValueIndex); + ((ReifiableStub)carrier).removeItemIdentifier(changedIdentifier); + } + + changedIdentifier = ((ReifiableStub)carrier).getTopicMap().createLocator(this.owner.getSelectedValues().get(selectedValueIndex)); + ((ReifiableStub)carrier).addItemIdentifier(changedIdentifier); + contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); + } + } + + + // handles the getContent call for item identifiers of variant-names + public void getVariantIdentifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); + ArrayList<Variant> possibleVariants = TmHelper.getVariantsForConstraint(carrier, this.getRootConstraint()); + if(possibleVariants.size() != 0){ + Variant variant = possibleVariants.get(0); + JsArray<Locator> identifiers = null; + + ArrayList<Locator> filteredIdentifiers = null; + + identifiers = variant.getItemIdentifiers(); + filteredIdentifiers = this.filterLocators(TmHelper.getRegExp(this.getConstraint()), identifiers); + + Locator changedIdentifier = null; + if(validate) this.validateLiteralValue(this.owner.getSelectedValues().get(selectedValueIndex)); + + if(filteredIdentifiers.size() > selectedValueIndex){ + changedIdentifier = filteredIdentifiers.get(selectedValueIndex); + variant.removeItemIdentifier(changedIdentifier); + } + + changedIdentifier = variant.getTopicMap().createLocator(this.owner.getSelectedValues().get(selectedValueIndex)); + variant.addItemIdentifier(changedIdentifier); + contents.add(new Pair<Object, TopicMapsTypes>(changedIdentifier, TopicMapsTypes.Locator)); + } + } + + + // handles the getContent call for item identifiers of variant-names + public void getVariantReifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); + ArrayList<Variant> possibleVariants = TmHelper.getVariantsForConstraint(carrier, this.getRootConstraint()); + if(possibleVariants.size() != 0){ + Variant variant = possibleVariants.get(0); + Topic reifier = TmHelper.getTopicFromStringRepresentation(this.owner.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); + + if(reifier != null && !variant.getReifier().equals(reifier)) variant.setReifier(reifier); + contents.add(new Pair<Object, TopicMapsTypes>(variant, TopicMapsTypes.Variant)); + } + } + + + // handles the getContent call for occurrence and name values + public void getTopicCharacteristicContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); + Topic characteristicType = TmHelper.getConstrainedStatement(this.getConstraint()); + + boolean isOccConstraint = true; + if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclTopicOccurrenceConstraint)){ + isOccConstraint = true; + } else if(TmHelper.isInstanceOf(this.getConstraint(), PSIs.TMCL.tmclTopicNameConstraint)){ + isOccConstraint = false; + } else { + throw new ExecutionException("the function getTopicCharacteristicContent can operate only on constraints of the type " + PSIs.TMCL.tmclTopicOccurrenceConstraint + " or " + PSIs.TMCL.tmclTopicNameConstraint + ", but is called with " + TmHelper.getAnyIdOfTopic(this.getConstraint())); + } + + JsArray<Name> names = null; + JsArray<Occurrence> occurrences = null; + if(isOccConstraint) occurrences = carrier.getOccurrences(characteristicType); + else names = carrier.getNames(characteristicType); + + + Construct changedConstruct = null; + if(validate) this.validateLiteralValue(this.owner.getSelectedValues().get(selectedValueIndex)); + + if(isOccConstraint){ + if(occurrences.length() > selectedValueIndex){ + changedConstruct = occurrences.get(selectedValueIndex); + ((Occurrence)changedConstruct).setValue(this.owner.getSelectedValues().get(selectedValueIndex)); + }else { + changedConstruct = carrier.createOccurrence(characteristicType, this.owner.getSelectedValues().get(selectedValueIndex), null); + } + } else { + if(names.length() > selectedValueIndex){ + changedConstruct = names.get(selectedValueIndex); + ((Name)changedConstruct).setValue(this.owner.getSelectedValues().get(selectedValueIndex)); + }else { + changedConstruct = carrier.createName(this.owner.getSelectedValues().get(selectedValueIndex), characteristicType, null); + } + } + contents.add(new Pair<Object, TopicMapsTypes>(changedConstruct, isOccConstraint ? TopicMapsTypes.Occurrence : TopicMapsTypes.Name)); + } + + + // handles the getContent call for subject identifiers and subject locators + public void getVariantNameContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex, ArrayList<Variant> variants) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(variants == null) return; + + Variant changedVariant = null; + if(validate) this.validateLiteralValue(this.owner.getSelectedValues().get(selectedValueIndex)); + + if(variants.size() > selectedValueIndex){ + changedVariant = variants.get(selectedValueIndex); + changedVariant.setValue(this.owner.getSelectedValues().get(selectedValueIndex)); + }else { + Topic nameType = TmHelper.getConstrainedStatement(this.getConstraint()); + JsArray<Name> names = carrier.getNames(nameType); + Name owner = names.get(0); + Topic scope = TmHelper.getConstrainedScopeTopic(this.getConstraint()); + @SuppressWarnings("unchecked") + JsArray<Topic> scopes = (JsArray<Topic>) JsArray.createArray(); + scopes.push(scope); + changedVariant = owner.createVariant(this.owner.getSelectedValues().get(selectedValueIndex), scopes); + } + contents.add(new Pair<Object, TopicMapsTypes>(changedVariant, TopicMapsTypes.Variant)); + } + + + // handles the getContent call for role players + public void getRolePlayerContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Association carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(!(carrier instanceof Association)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to an Association, but is: " + carrier.getClass()); + + if(!TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclTopicRoleConstraint))throw new InvalidGdlSchemaException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a root constraint of the type " + PSIs.TMCL.tmclTopicRoleConstraint + ", but is: " + TmHelper.getAnyIdOfTopic(this.getRootConstraint())); + Pair<Topic, Topic> roleAndPlayerType = TmHelper.getConstrainedRoleAndPlayerTypeOfConstraint(this.getRootConstraint()); + Topic roleType = roleAndPlayerType.getFirst(); + Topic playerType = roleAndPlayerType.getSecond(); + + JsArray<Role> typedRoles = carrier.getRoles(roleType); + ArrayList<Role> roles = new ArrayList<Role>(); + for(int i = 0; i != typedRoles.length(); ++i) + if(TmHelper.isInstanceOf(typedRoles.get(i).getPlayer(), playerType)) roles.add(typedRoles.get(i)); + + Role changedRole = null; + + Topic player = TmHelper.getTopicFromStringRepresentation(this.owner.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); + if(validate) this.validateTmValue(player); + if(roles.size() > selectedValueIndex){ + changedRole = roles.get(selectedValueIndex); + changedRole.setPlayer(player); + } else { + changedRole = carrier.createRole(roleType, player); + } + contents.add(new Pair<Object, TopicMapsTypes>(changedRole, TopicMapsTypes.Role)); + } + + + // handles the getContent call for scope topics of variant-names + public void getVariantNameScopeContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Topic carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + if(!(carrier instanceof Topic)) throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a Topic, but is: " + carrier.getClass()); + ArrayList<Variant> possibleVariants = TmHelper.getVariantsForConstraint(carrier, this.getRootConstraint()); + if(possibleVariants.size() != 0){ + Variant variant = possibleVariants.get(0); + JsArray<Topic> scopes = variant.getScope(); + + if(validate) this.validateLiteralValue(this.owner.getSelectedValues().get(selectedValueIndex)); + + if(scopes.length() > selectedValueIndex){ + Topic oldScope = scopes.get(selectedValueIndex); + Topic newScope = TmHelper.getTopicFromStringRepresentation(this.owner.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); + + if(!oldScope.equals(newScope)){ + variant.removeTheme(oldScope); + variant.addTheme(newScope); + } + } + contents.add(new Pair<Object, TopicMapsTypes>(variant, TopicMapsTypes.Variant)); + } + } + + + // handles the getContent call for scope topics + public void getScopeContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + Topic type = TmHelper.getConstrainedStatement(this.getConstraint()); + + JsArray<Topic> scopes = null; + Construct owner = null; + TopicMapsTypes ownerType = null; + if(carrier instanceof Topic){ + JsArray<Name> names = ((Topic)carrier).getNames(type); + if(names.length() != 0){ + scopes = names.get(0).getScope(); + owner = names.get(0); + ownerType = TopicMapsTypes.Name; + } + if(scopes == null){ + JsArray<Occurrence> occs = ((Topic)carrier).getOccurrences(type); + if(occs.length() != 0){ + scopes = occs.get(0).getScope(); + owner = occs.get(0); + ownerType = TopicMapsTypes.Occurrence; + } + } + } else if(carrier instanceof Association){ + if(((Association)carrier).getType().equals(type)){ + scopes = ((Association)carrier).getScope(); + owner = carrier; + ownerType = TopicMapsTypes.Association; + } + } else { + throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a topic or association, but is: " + carrier.getClass()); + } + + Topic newScope = TmHelper.getTopicFromStringRepresentation(this.owner.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); + Topic oldScope = null; + if(scopes.length() > selectedValueIndex){ + oldScope = scopes.get(selectedValueIndex); + if(!newScope.equals(oldScope)){ + ((ScopedStub)owner).removeTheme(oldScope); + ((ScopedStub)owner).addTheme(newScope); + } + } else { + ((ScopedStub)owner).addTheme(newScope); + } + contents.add(new Pair<Object, TopicMapsTypes>(owner, ownerType)); + } + + + // handles the getContent call for a reifier topic + public void getReifierContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + Topic type = TmHelper.getConstrainedStatement(this.getConstraint()); + + Construct owner = null; + TopicMapsTypes ownerType = null; + if(carrier instanceof Topic){ + JsArray<Name> names = ((Topic)carrier).getNames(type); + if(names.length() != 0){ + owner = names.get(0); + ownerType = TopicMapsTypes.Name; + } else { + JsArray<Occurrence> occs = ((Topic)carrier).getOccurrences(type); + if(occs.length() != 0){ + owner = occs.get(0); + ownerType = TopicMapsTypes.Occurrence; + } + } + } else if(carrier instanceof Association){ + if(((Association)carrier).getType().equals(type)){ + owner = carrier; + ownerType = TopicMapsTypes.Association; + } else { + JsArray<Role> roles = ((Association)carrier).getRoles(type); + if(roles.length() != 0){ + owner = roles.get(0); + ownerType = TopicMapsTypes.Role; + } + } + } else { + throw new ExecutionException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a topic or association, but is: " + carrier.getClass()); + } + + Topic newReifier = TmHelper.getTopicFromStringRepresentation(this.owner.getSelectedValues().get(selectedValueIndex), this.getValueGroup()); + if(!newReifier.equals(((ReifiableStub)owner).getReifier())) ((ReifiableStub)owner).setReifier(newReifier); + contents.add(new Pair<Object, TopicMapsTypes>(owner, ownerType)); + } + + + // handles the getContent call for a Datatye value + public void getDatatypeContent(ArrayList<Pair<Object, TopicMapsTypes>> contents, boolean validate, Construct carrier, int selectedValueIndex, ArrayList<Variant> variants, ArrayList<Occurrence> occurrences) throws InvalidGdlSchemaException, InvalidContentException, ExecutionException{ + Construct owner = null; + TopicMapsTypes ownerType = null; + if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclVariantNameConstraint)){ + if(variants.size() != 0){ + owner = variants.get(0); + variants.get(0).setValue(variants.get(0).getValue(), variants.get(0).getTopicMap().createLocator(this.owner.getSelectedValues().get(selectedValueIndex))); + ownerType = TopicMapsTypes.Variant; + } + } else if(TmHelper.isInstanceOf(this.getRootConstraint(), PSIs.TMCL.tmclOccurrenceConstraint)){ + if(occurrences.size() != 0){ + owner = occurrences.get(0); + occurrences.get(0).setValue(occurrences.get(0).getValue(), occurrences.get(0).getTopicMap().createLocator(this.owner.getSelectedValues().get(selectedValueIndex))); + ownerType = TopicMapsTypes.Occurrence; + } + } else { + throw new InvalidGdlSchemaException("the constraint " + TmHelper.getAnyIdOfTopic(this.getConstraint()) + " must be bound to a constraint of the type " + PSIs.TMCL.tmclVariantNameConstraint + " or " + PSIs.TMCL.tmclOccurrenceConstraint + ", but is bound to: " + TmHelper.getAnyIdOfTopic(this.getRootConstraint())); + } + contents.add(new Pair<Object, TopicMapsTypes>(owner, ownerType)); + } +}
Modified: trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java ============================================================================== --- trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java Tue Nov 22 06:56:14 2011 (r1034) +++ trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/base/Utils.java Tue Nov 22 13:11:07 2011 (r1035) @@ -124,6 +124,15 @@ } + public static <T extends JavaScriptObject> ArrayList<T> jsArrayToArrayList(JsArray<T> input){ + ArrayList<T> result = new ArrayList<T>(); + + if(input != null) for(int i = 0; i != input.length(); ++i) result.add(input.get(i)); + + return result; + } + + // returns a list that contains a union of both lists public static <T> ArrayList<T> intersection(ArrayList<T> fst, ArrayList<T> snd){ ArrayList<T> result = new ArrayList<T>();
Modified: trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java ============================================================================== --- trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Tue Nov 22 06:56:14 2011 (r1034) +++ trunk/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/view/GdlAssociationView.java Tue Nov 22 13:11:07 2011 (r1035) @@ -7,10 +7,8 @@ import com.google.gwt.user.client.ui.Widget; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Association; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Construct; -import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Occurrence; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Role; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.Topic; -import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMap; import us.isidor.gdl.anaToMia.TopicMaps.TopicMapsModel.TopicMapsTypes; import us.isidor.gdl.anaToMia.Widgets.base.ButtonableObject; import us.isidor.gdl.anaToMia.Widgets.base.GdlHiddenValue;