@Override
 public Boolean isLiteralType() {
   Boolean isLiteralValue = null;
   for (IfcValue value : values) {
     Boolean b = value.isLiteralType();
     if (b != isLiteralValue && b != null) {
       assert isLiteralValue == null
           : "Mixed literal and link type: "
               + StringUtils.collectionToString(values, null, null, null, ",");
       isLiteralValue = b;
     }
   }
   return isLiteralValue;
 }
  /**
   * Set entity attribute values
   *
   * @param entity
   * @param attributeInfos
   * @param attributeValues
   * @throws IfcParserException
   */
  private void setEntityAttributeValues(
      IfcEntity entity, List<IfcAttributeInfo> attributeInfos, List<IfcValue> attributeValues)
      throws IfcParserException {
    try {

      if (attributeValues.size() == attributeInfos.size()) {
        boolean isLiteralValueContainer = true;
        for (int attributeIndex = 0; attributeIndex < attributeValues.size(); ++attributeIndex) {

          IfcAttributeInfo attributeInfo = attributeInfos.get(attributeIndex);
          IfcValue attributeValue = attributeValues.get(attributeIndex);

          Boolean isLiteralValue = attributeValue.isLiteralType();

          if (isLiteralValue != null) {
            isLiteralValueContainer = isLiteralValueContainer && isLiteralValue == Boolean.TRUE;
            if (isLiteralValue) {

              if (attributeValue instanceof IfcTemporaryCollectionValueWrapper) {

                if (attributeInfo.isCollection()) {

                  IfcLiteralValueCollection values = new IfcLiteralValueCollection();
                  for (IfcValue value :
                      ((IfcTemporaryCollectionValueWrapper) attributeValue).getValues()) {
                    values.add((IfcLiteralValue) value);
                  }

                  entity.addLiteralAttribute(
                      new IfcLiteralAttribute(attributeInfo, attributeIndex, values));

                } else {

                  for (IfcValue value :
                      ((IfcTemporaryCollectionValueWrapper) attributeValue).getValues()) {
                    entity.addLiteralAttribute(
                        new IfcLiteralAttribute(attributeInfo, attributeIndex, value));
                  }
                }

              } else {

                assert (attributeValue instanceof IfcLiteralValue)
                    : String.format(
                        "Object is not a literal value, line number: %d, attributeInfo: %s, attribute value: %s, value type: %s",
                        entity.getLineNumber(),
                        attributeInfo.getName(),
                        attributeValue,
                        attributeInfo.getAttributeTypeInfo().getValueTypes());
                entity.addLiteralAttribute(
                    new IfcLiteralAttribute(attributeInfo, attributeIndex, attributeValue));
              }

            } else { // attributeInfo instanceof IfcLinkInfo

              if (attributeValue instanceof IfcTemporaryCollectionValueWrapper) {

                if (attributeInfo.isCollection()) {

                  IfcEntityCollection destinations = new IfcEntityCollection();
                  for (IfcValue destination :
                      ((IfcTemporaryCollectionValueWrapper) attributeValue).getValues()) {
                    destinations.add((IfcEntity) destination);
                  }

                  entity.addOutgoingLink(
                      new IfcLink(
                          (IfcLinkInfo) attributeInfo, attributeIndex, entity, destinations));

                } else {

                  for (IfcValue destination :
                      ((IfcTemporaryCollectionValueWrapper) attributeValue).getValues()) {
                    IfcLink link =
                        new IfcLink(
                            (IfcLinkInfo) attributeInfo,
                            attributeIndex,
                            entity,
                            (IfcEntityBase) destination);
                    entity.addOutgoingLink(link);
                  }
                }

              } else {

                assert (attributeValue instanceof IfcEntityBase)
                    : String.format(
                        "Object is not an entity, line number: %d, attributeInfo: %s, attribute value: %s, value type: %s",
                        entity.getLineNumber(),
                        attributeInfo.getName(),
                        attributeValue,
                        attributeInfo.getAttributeTypeInfo().getValueTypes());
                IfcLink link =
                    new IfcLink(
                        (IfcLinkInfo) attributeInfo,
                        attributeIndex,
                        entity,
                        (IfcEntityBase) attributeValue);
                entity.addOutgoingLink(link);
              }
            }
          }
        }
        entity.setLiteralValueContainer(isLiteralValueContainer);

      } else {
        throw new IfcParserException(
            String.format(
                "Type %s: Expected %d attributes, but %d were found: %s, %s",
                entity.getTypeInfo().getName(),
                attributeInfos.size(),
                attributeValues.size(),
                attributeInfos,
                attributeValues));
      }

    } catch (Exception e) {
      throw new IfcParserException(
          String.format(
              "Error parsing entity %s (line %d): %s",
              entity.toString(), entity.getLineNumber(), e.getMessage()),
          e);
    }
  }