cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

We are happy to announce the new Windchill Customization board! Learn more.

Finding values of global enumerations with Java

dsodling
5-Regular Member

Finding values of global enumerations with Java

All,

 

is there anyone who has managed to find out how to go from a TypeIdentifier to an attribute that uses a Global Enumeration and also retrieve the values for that enumeration? 

 

The closest I've gotten to a suggested solution is what is shown in this support case (CS133237) but it assumes that I have an object from which I can get the values. I would like to be able to start with only the TypeIdentifier or even better just the type id (for instance wt.part.WTPart). 

 

Any ideas?

 

Regards

Daniel Södling

1 ACCEPTED SOLUTION

Accepted Solutions
dsodling
5-Regular Member
(To:Florent)

Thank you for the suggestion. I couldn't get that exact method to work but it did put me on the right path and I ended up with the following. Note that this collects both global enumerations and legal value lists.

 

 

 public RequestResponse handleRequest() {
        logger.trace("handleRequest()");

        HashMap<String, List<LocalizedValue>> result = new HashMap<>();

        try {

            Locale loc = SessionHelper.getLocale();
            String type = request.getParameter("type");
            WCTypeIdentifier wti = new WCTypeIdentifier(type);
            AttributeTypeIdentifier[] attrs = TypeInstanceHelper.getSoftAttributeTypeIdentifiers(wti);
            Map<AttributeTypeIdentifier, AttributeTypeSummary> summaries = AttributeTypeSummaryHelper.SERVICE.getATS(Arrays.asList(attrs), loc);

            for (AttributeTypeIdentifier ati : attrs) {
                logger.debug("attr: {}", ati.getAttributeName());

                AttributeDefinitionReadView attrDef = TypeDefinitionServiceHelper.service.getAttributeDefView(ati);
                ConstraintDefinitionReadView globalEnumConstraint = EnumerationConstraintHelper.getGlobalEnumeratedValueListConstraint(attrDef);
                EnumerationDefinitionReadView enumDef = globalEnumConstraint != null ? globalEnumConstraint.getEnumDef() : null;
                Map<String, EnumerationEntryReadView> entries = enumDef != null ? enumDef.getAllEnumerationEntries() : null;
                DataSet ds = (DataSet) summaries.get(ati).getLegalValueSet();
                ArrayList<LocalizedValue> values = new ArrayList<>();

                // Collect gloal enumeration entties
                if (entries != null) {
                    for (Map.Entry<String, EnumerationEntryReadView> entry : entries.entrySet()) {
                        EnumerationEntryReadView value = entry.getValue();
                        PropertyValueReadView display = value.getPropertyValueByName("displayName");
                        String localizedDisplay = display.getValueAsString(loc, true);
                        values.add(new LocalizedValue(entry.getKey(), localizedDisplay)); 
                    }
                }

                // Collect legal value list entties
                if (ds != null && ds instanceof DiscreteSet) {
                    DiscreteSet set = (DiscreteSet) ds;
                    for (Object el : set.getElements()) {
                        String strValue = el.toString();
                        values.add(new LocalizedValue(strValue, strValue));
                    }
                }

                if (values.size() > 0) {
                    result.put(ati.getAttributeName(), values);
                }
            }
        } catch (WTException ex) {
            throw new RuntimeException(ex);
        }

        return success(result);
    }

 

 

Thanks again! 

View solution in original post

2 REPLIES 2
Florent
14-Alexandrite
(To:dsodling)

Hi Daniel,

 

Take a look on this helper: com.ptc.core.lwc.client.util.EnumerationConstraintHelper.

There is at least the method getEnumInternalAndDisplayValuesFromConstraints() that might help you.

Florent ROUSSEL
www.4cad.ca
dsodling
5-Regular Member
(To:Florent)

Thank you for the suggestion. I couldn't get that exact method to work but it did put me on the right path and I ended up with the following. Note that this collects both global enumerations and legal value lists.

 

 

 public RequestResponse handleRequest() {
        logger.trace("handleRequest()");

        HashMap<String, List<LocalizedValue>> result = new HashMap<>();

        try {

            Locale loc = SessionHelper.getLocale();
            String type = request.getParameter("type");
            WCTypeIdentifier wti = new WCTypeIdentifier(type);
            AttributeTypeIdentifier[] attrs = TypeInstanceHelper.getSoftAttributeTypeIdentifiers(wti);
            Map<AttributeTypeIdentifier, AttributeTypeSummary> summaries = AttributeTypeSummaryHelper.SERVICE.getATS(Arrays.asList(attrs), loc);

            for (AttributeTypeIdentifier ati : attrs) {
                logger.debug("attr: {}", ati.getAttributeName());

                AttributeDefinitionReadView attrDef = TypeDefinitionServiceHelper.service.getAttributeDefView(ati);
                ConstraintDefinitionReadView globalEnumConstraint = EnumerationConstraintHelper.getGlobalEnumeratedValueListConstraint(attrDef);
                EnumerationDefinitionReadView enumDef = globalEnumConstraint != null ? globalEnumConstraint.getEnumDef() : null;
                Map<String, EnumerationEntryReadView> entries = enumDef != null ? enumDef.getAllEnumerationEntries() : null;
                DataSet ds = (DataSet) summaries.get(ati).getLegalValueSet();
                ArrayList<LocalizedValue> values = new ArrayList<>();

                // Collect gloal enumeration entties
                if (entries != null) {
                    for (Map.Entry<String, EnumerationEntryReadView> entry : entries.entrySet()) {
                        EnumerationEntryReadView value = entry.getValue();
                        PropertyValueReadView display = value.getPropertyValueByName("displayName");
                        String localizedDisplay = display.getValueAsString(loc, true);
                        values.add(new LocalizedValue(entry.getKey(), localizedDisplay)); 
                    }
                }

                // Collect legal value list entties
                if (ds != null && ds instanceof DiscreteSet) {
                    DiscreteSet set = (DiscreteSet) ds;
                    for (Object el : set.getElements()) {
                        String strValue = el.toString();
                        values.add(new LocalizedValue(strValue, strValue));
                    }
                }

                if (values.size() > 0) {
                    result.put(ati.getAttributeName(), values);
                }
            }
        } catch (WTException ex) {
            throw new RuntimeException(ex);
        }

        return success(result);
    }

 

 

Thanks again! 

Top Tags