@Override
  public PartLink filterPartLink(List<PartLink> path) {

    // No ambiguities here, must return 1 value
    // Check if optional or substitute, nominal link else

    PartLink nominalLink = path.get(path.size() - 1);

    if (nominalLink.isOptional() && optionalUsageLinks.contains(Tools.getPathAsString(path))) {
      retainedOptionalUsageLinks.add(Tools.getPathAsString(path));
      return null;
    }

    for (PartSubstituteLink substituteLink : nominalLink.getSubstitutes()) {

      List<PartLink> substitutePath = new ArrayList<>(path);
      substitutePath.set(substitutePath.size() - 1, substituteLink);

      if (substituteLinks.contains(Tools.getPathAsString(substitutePath))) {
        retainedSubstituteLinks.add(Tools.getPathAsString(substitutePath));
        return substituteLink;
      }
    }

    return nominalLink;
  }
  private static void writeLeaf(
      List<PartLink> currentPath,
      List<Integer> copyInstanceIds,
      PartIteration partI,
      Matrix4d combinedMatrix,
      JsonGenerator jg) {
    String partIterationId = partI.toString();
    List<InstanceAttributeDTO> attributes = new ArrayList<>();
    for (InstanceAttribute attr : partI.getInstanceAttributes()) {
      attributes.add(mapper.map(attr, InstanceAttributeDTO.class));
    }

    jg.writeStartObject();
    jg.write("id", Tools.getPathInstanceAsString(currentPath, copyInstanceIds));
    jg.write("partIterationId", partIterationId);
    jg.write("path", Tools.getPathAsString(currentPath));

    writeMatrix(combinedMatrix, jg);
    writeGeometries(partI.getSortedGeometries(), jg);
    writeAttributes(attributes, jg);

    jg.writeEnd();
    jg.flush();
  }
Example #3
0
  private String[] createXLSRow(List<String> selects, QueryResultRow row, String baseURL) {
    List<String> data = new ArrayList<>();
    PartRevision part = row.getPartRevision();
    PartIteration lastCheckedInIteration = part.getLastCheckedInIteration();
    PartIteration lastIteration = part.getLastIteration();
    QueryContext context = row.getContext();

    for (String select : selects) {

      switch (select) {
        case QueryField.CTX_PRODUCT_ID:
          String productId = context != null ? context.getConfigurationItemId() : "";
          data.add(productId);
          break;
        case QueryField.CTX_SERIAL_NUMBER:
          String serialNumber = context != null ? context.getSerialNumber() : "";
          data.add(serialNumber != null ? serialNumber : "");
          break;
        case QueryField.PART_MASTER_NUMBER:
          data.add(part.getPartNumber());
          break;
        case QueryField.PART_MASTER_NAME:
          String sName = part.getPartName();
          data.add(sName != null ? sName : "");
          break;
        case QueryField.PART_MASTER_TYPE:
          String sType = part.getType();
          data.add(sType != null ? sType : "");
          break;
        case QueryField.PART_REVISION_MODIFICATION_DATE:
          data.add(
              (lastIteration != null && lastIteration.getModificationDate() != null)
                  ? simpleDateFormat.format(lastIteration.getModificationDate())
                  : "");
          break;
        case QueryField.PART_REVISION_CREATION_DATE:
          data.add(
              (part.getCreationDate() != null)
                  ? simpleDateFormat.format(part.getCreationDate())
                  : "");
          break;
        case QueryField.PART_REVISION_CHECKOUT_DATE:
          data.add(
              (part.getCheckOutDate() != null)
                  ? simpleDateFormat.format(part.getCheckOutDate())
                  : "");
          break;
        case QueryField.PART_REVISION_CHECKIN_DATE:
          data.add(
              (lastCheckedInIteration != null && lastCheckedInIteration.getCheckInDate() != null)
                  ? simpleDateFormat.format(lastCheckedInIteration.getCheckInDate())
                  : "");
          break;
        case QueryField.PART_REVISION_VERSION:
          data.add(part.getVersion() != null ? part.getVersion() : "");
          break;
        case QueryField.PART_REVISION_LIFECYCLE_STATE:
          data.add(part.getLifeCycleState() != null ? part.getLifeCycleState() : "");
          break;
        case QueryField.PART_REVISION_STATUS:
          data.add(part.getStatus().toString());
          break;
        case QueryField.AUTHOR_LOGIN:
          User user = part.getAuthor();
          data.add(user.getLogin());
          break;
        case QueryField.AUTHOR_NAME:
          User userAuthor = part.getAuthor();
          data.add(userAuthor.getName());
          break;
        case QueryField.CTX_DEPTH:
          data.add(row.getDepth() + "");
          break;
        case QueryField.CTX_AMOUNT:
          data.add(row.getAmount() + "");
          break;
        case QueryField.PART_ITERATION_LINKED_DOCUMENTS:
          StringBuilder sb = new StringBuilder();
          if (lastCheckedInIteration != null) {
            Set<DocumentLink> linkedDocuments = lastCheckedInIteration.getLinkedDocuments();
            for (DocumentLink documentLink : linkedDocuments) {
              DocumentRevision targetDocument = documentLink.getTargetDocument();
              sb.append(
                  baseURL
                      + "/documents/"
                      + targetDocument.getWorkspaceId()
                      + "/"
                      + targetDocument.getId()
                      + "/"
                      + targetDocument.getVersion()
                      + " ");
            }
          }
          data.add(sb.toString());
          break;

        case QueryField.CTX_P2P_SOURCE:
          Map<String, List<PartLinkList>> sources = row.getSources();
          String sourcePartLinksAsString = Tools.getPartLinksAsExcelString(sources);
          data.add(sourcePartLinksAsString);
          break;

        case QueryField.CTX_P2P_TARGET:
          Map<String, List<PartLinkList>> targets = row.getTargets();
          String targetPartLinksAsString = Tools.getPartLinksAsExcelString(targets);
          data.add(targetPartLinksAsString);
          break;

        default:
          if (select.startsWith(QueryField.PART_REVISION_ATTRIBUTES_PREFIX)) {
            String attributeSelectType =
                select
                    .substring(0, select.indexOf("."))
                    .substring(QueryField.PART_REVISION_ATTRIBUTES_PREFIX.length());
            String attributeSelectName = select.substring(select.indexOf(".") + 1);
            String attributeValue = "";
            StringBuilder sbattr = new StringBuilder();

            if (lastIteration != null) {
              List<InstanceAttribute> attributes = lastIteration.getInstanceAttributes();
              if (attributes != null) {
                for (InstanceAttribute attribute : attributes) {
                  InstanceAttributeDescriptor attributeDescriptor =
                      new InstanceAttributeDescriptor(attribute);
                  if (attributeDescriptor.getName().equals(attributeSelectName)
                      && attributeDescriptor.getStringType().equals(attributeSelectType)) {

                    attributeValue = attribute.getValue() + "";
                    if (attributeDescriptor.getType() == InstanceAttributeDescriptor.Type.DATE) {
                      attributeValue =
                          attribute.getValue() != null
                              ? attributeDateFormat.format(attribute.getValue())
                              : "";
                    } else if (attribute instanceof InstanceListOfValuesAttribute) {
                      attributeValue =
                          ((InstanceListOfValuesAttribute) attribute).getSelectedName();
                    }
                    sbattr.append(attributeValue + "|");
                  }
                }
              }
            }
            String content = sbattr.toString().trim();
            if (content.length() > 0) {
              content = content.substring(0, content.lastIndexOf("|"));
            }
            data.add(content);
          }
          if (select.startsWith(QueryField.PATH_DATA_ATTRIBUTES_PREFIX)) {
            String attributeSelectType =
                select
                    .substring(0, select.indexOf("."))
                    .substring(QueryField.PATH_DATA_ATTRIBUTES_PREFIX.length());
            String attributeSelectName = select.substring(select.indexOf(".") + 1);
            String attributeValue = "";
            PathDataIteration pdi = row.getPathDataIteration();
            StringBuilder sbpdattr = new StringBuilder();

            if (pdi != null) {
              List<InstanceAttribute> attributes = pdi.getInstanceAttributes();
              if (attributes != null) {
                for (InstanceAttribute attribute : attributes) {
                  InstanceAttributeDescriptor attributeDescriptor =
                      new InstanceAttributeDescriptor(attribute);
                  if (attributeDescriptor.getName().equals(attributeSelectName)
                      && attributeDescriptor.getStringType().equals(attributeSelectType)) {

                    attributeValue = attribute.getValue() + "";
                    if (attributeDescriptor.getType() == InstanceAttributeDescriptor.Type.DATE) {
                      attributeValue =
                          attribute.getValue() != null
                              ? attributeDateFormat.format(attribute.getValue())
                              : "";
                    } else if (attribute instanceof InstanceListOfValuesAttribute) {
                      attributeValue =
                          ((InstanceListOfValuesAttribute) attribute).getSelectedName();
                    }
                    sbpdattr.append(attributeValue + "|");
                  }
                }
              }
            }
            String content = sbpdattr.toString().trim();
            if (content.length() > 0) {
              content = content.substring(0, content.lastIndexOf("|"));
            }
            data.add(content);
          }
      }
    }

    String rowData = StringUtils.join(data, ";");
    return rowData.split(";");
  }
  private void generateJSONResponse(OutputStream outputStream, QueryResult queryResult)
      throws UnsupportedEncodingException, NamingException {

    String charSet = "UTF-8";
    JsonGenerator jg = Json.createGenerator(new OutputStreamWriter(outputStream, charSet));
    jg.writeStartArray();

    List<String> selects = queryResult.getQuery().getSelects();
    List<String> partIterationSelectedAttributes = getPartIterationSelectedAttributes(selects);
    List<String> pathDataSelectedAttributes = getPathDataSelectedAttributes(selects);

    context = new InitialContext();
    IProductInstanceManagerLocal productInstanceService =
        (IProductInstanceManagerLocal)
            context.lookup(
                "java:global/docdoku-server-ear/docdoku-server-ejb/ProductInstanceManagerBean");

    for (QueryResultRow row : queryResult.getRows()) {

      QueryContext queryContext = row.getContext();

      PartRevision part = row.getPartRevision();
      PartIteration lastCheckedInIteration = part.getLastCheckedInIteration();

      jg.writeStartObject();

      jg.write(QueryField.PART_REVISION_PART_KEY, part.getPartNumber() + '-' + part.getVersion());

      // PartMaster data

      if (selects.contains(QueryField.PART_MASTER_NUMBER)) {
        jg.write(QueryField.PART_MASTER_NUMBER, part.getPartNumber());
      }

      if (selects.contains(QueryField.PART_MASTER_NAME)) {
        String sName = part.getPartName();
        jg.write(QueryField.PART_MASTER_NAME, sName != null ? sName : "");
      }

      if (selects.contains(QueryField.PART_MASTER_TYPE)) {
        String sType = part.getType();
        jg.write(QueryField.PART_MASTER_TYPE, sType != null ? sType : "");
      }

      // PartRevision data

      if (selects.contains(QueryField.PART_REVISION_MODIFICATION_DATE)) {
        PartIteration pi = part.getLastIteration();
        if (pi != null) {
          writeDate(jg, QueryField.PART_REVISION_MODIFICATION_DATE, pi.getModificationDate());
        }
      }

      if (selects.contains(QueryField.PART_REVISION_CREATION_DATE)) {
        writeDate(jg, QueryField.PART_REVISION_CREATION_DATE, part.getCreationDate());
      }

      if (selects.contains(QueryField.PART_REVISION_CHECKOUT_DATE)) {
        writeDate(jg, QueryField.PART_REVISION_CHECKOUT_DATE, part.getCheckOutDate());
      }

      if (selects.contains(QueryField.PART_REVISION_CHECKIN_DATE)) {
        writeDate(
            jg,
            QueryField.PART_REVISION_CHECKIN_DATE,
            lastCheckedInIteration != null ? lastCheckedInIteration.getCheckInDate() : null);
      }

      if (selects.contains(QueryField.PART_REVISION_VERSION)) {
        String version = part.getVersion();
        jg.write(QueryField.PART_REVISION_VERSION, version);
      }

      if (selects.contains(QueryField.PART_REVISION_LIFECYCLE_STATE)) {
        String lifeCycleState = part.getLifeCycleState();
        jg.write(
            QueryField.PART_REVISION_LIFECYCLE_STATE, lifeCycleState != null ? lifeCycleState : "");
      }

      if (selects.contains(QueryField.PART_REVISION_STATUS)) {
        PartRevision.RevisionStatus status = part.getStatus();
        jg.write(QueryField.PART_REVISION_STATUS, status.toString());
      }

      if (selects.contains(QueryField.AUTHOR_LOGIN)) {
        User user = part.getAuthor();
        jg.write(QueryField.AUTHOR_LOGIN, user.getLogin());
      }

      if (selects.contains(QueryField.AUTHOR_NAME)) {
        User user = part.getAuthor();
        jg.write(QueryField.AUTHOR_NAME, user.getName());
      }

      if (selects.contains(QueryField.CTX_DEPTH)) {
        jg.write(QueryField.CTX_DEPTH, row.getDepth());
      }

      if (selects.contains(QueryField.PART_ITERATION_LINKED_DOCUMENTS)) {

        StringBuilder sb = new StringBuilder();

        if (null != queryContext && null != queryContext.getSerialNumber()) {
          try {

            ProductInstanceMaster productInstanceMaster =
                productInstanceService.getProductInstanceMaster(
                    new ProductInstanceMasterKey(
                        queryContext.getSerialNumber(),
                        queryContext.getWorkspaceId(),
                        queryContext.getConfigurationItemId()));
            ProductInstanceIteration lastIteration = productInstanceMaster.getLastIteration();
            ProductBaseline basedOn = lastIteration.getBasedOn();
            PartCollection partCollection = basedOn.getPartCollection();
            BaselinedPart baselinedPart =
                partCollection.getBaselinedPart(
                    new BaselinedPartKey(
                        partCollection.getId(),
                        queryContext.getWorkspaceId(),
                        part.getPartNumber()));
            PartIteration targetPart = baselinedPart.getTargetPart();
            Set<DocumentLink> linkedDocuments = targetPart.getLinkedDocuments();
            DocumentCollection documentCollection = basedOn.getDocumentCollection();

            for (DocumentLink documentLink : linkedDocuments) {
              DocumentRevision targetDocument = documentLink.getTargetDocument();
              BaselinedDocument baselinedDocument =
                  documentCollection.getBaselinedDocument(
                      new BaselinedDocumentKey(
                          documentCollection.getId(),
                          queryContext.getWorkspaceId(),
                          targetDocument.getDocumentMasterId(),
                          targetDocument.getVersion()));
              if (null != baselinedDocument) {
                DocumentIteration targetDocumentIteration = baselinedDocument.getTargetDocument();
                sb.append(targetDocumentIteration.toString() + ",");
              }
            }

          } catch (UserNotFoundException
              | UserNotActiveException
              | WorkspaceNotFoundException
              | ProductInstanceMasterNotFoundException e) {
            LOGGER.log(Level.FINEST, null, e);
          }
        } else {
          if (lastCheckedInIteration != null) {
            Set<DocumentLink> linkedDocuments = lastCheckedInIteration.getLinkedDocuments();

            for (DocumentLink documentLink : linkedDocuments) {
              DocumentRevision targetDocument = documentLink.getTargetDocument();
              DocumentIteration targetDocumentLastCheckedInIteration =
                  targetDocument.getLastCheckedInIteration();
              if (targetDocumentLastCheckedInIteration != null) {
                sb.append(targetDocumentLastCheckedInIteration.toString() + ",");
              }
            }
          }
        }

        jg.write(QueryField.PART_ITERATION_LINKED_DOCUMENTS, sb.toString());
      }

      for (String attributeSelect : partIterationSelectedAttributes) {

        String attributeSelectType =
            attributeSelect
                .substring(0, attributeSelect.indexOf("."))
                .substring(QueryField.PART_REVISION_ATTRIBUTES_PREFIX.length());

        String attributeSelectName = attributeSelect.substring(attributeSelect.indexOf(".") + 1);

        String attributeValue = "";

        PartIteration pi = part.getLastIteration();

        if (pi != null) {
          List<InstanceAttribute> attributes = pi.getInstanceAttributes();

          if (attributes != null) {
            jg.writeStartArray(attributeSelect);

            for (InstanceAttribute attribute : attributes) {
              InstanceAttributeDescriptor attributeDescriptor =
                  new InstanceAttributeDescriptor(attribute);

              if (attributeDescriptor.getName().equals(attributeSelectName)
                  && attributeDescriptor.getStringType().equals(attributeSelectType)) {

                attributeValue = attribute.getValue() + "";

                if (attribute instanceof InstanceDateAttribute) {
                  attributeValue =
                      getFormattedDate(((InstanceDateAttribute) attribute).getDateValue());
                } else if (attribute instanceof InstanceListOfValuesAttribute) {
                  attributeValue = ((InstanceListOfValuesAttribute) attribute).getSelectedName();
                }

                jg.write(attributeValue);
              }
            }

            jg.writeEnd();

          } else {
            jg.write(attributeSelect, attributeValue);
          }

        } else {
          // TODO: maybe this line is useless and should be removed
          jg.write(attributeSelect, attributeValue);
        }
      }

      for (String attributeSelect : pathDataSelectedAttributes) {

        String attributeSelectType =
            attributeSelect
                .substring(0, attributeSelect.indexOf("."))
                .substring(QueryField.PATH_DATA_ATTRIBUTES_PREFIX.length());

        String attributeSelectName = attributeSelect.substring(attributeSelect.indexOf(".") + 1);

        String attributeValue = "";

        PathDataIteration pdi = row.getPathDataIteration();

        if (pdi != null) {
          List<InstanceAttribute> attributes = pdi.getInstanceAttributes();

          if (attributes != null) {
            jg.writeStartArray(attributeSelect);

            for (InstanceAttribute attribute : attributes) {
              InstanceAttributeDescriptor attributeDescriptor =
                  new InstanceAttributeDescriptor(attribute);

              if (attributeDescriptor.getName().equals(attributeSelectName)
                  && attributeDescriptor.getStringType().equals(attributeSelectType)) {

                attributeValue = attribute.getValue() + "";

                if (attribute instanceof InstanceDateAttribute) {
                  attributeValue =
                      getFormattedDate(((InstanceDateAttribute) attribute).getDateValue());
                } else if (attribute instanceof InstanceListOfValuesAttribute) {
                  attributeValue = ((InstanceListOfValuesAttribute) attribute).getSelectedName();
                }

                jg.write(attributeValue);
              }
            }

            jg.writeEnd();

          } else {
            jg.write(attributeSelect, attributeValue);
          }
        }
      }

      if (selects.contains(QueryField.CTX_PRODUCT_ID)) {
        String configurationItemId =
            queryContext != null ? queryContext.getConfigurationItemId() : "";
        jg.write(QueryField.CTX_PRODUCT_ID, configurationItemId);
      }
      if (selects.contains(QueryField.CTX_SERIAL_NUMBER)) {
        String serialNumber = queryContext != null ? queryContext.getSerialNumber() : "";
        jg.write(QueryField.CTX_SERIAL_NUMBER, serialNumber != null ? serialNumber : "");
      }
      if (selects.contains(QueryField.CTX_AMOUNT)) {
        String amount = row.getAmount() + "";
        jg.write(QueryField.CTX_AMOUNT, amount);
      }

      if (selects.contains(QueryField.CTX_P2P_SOURCE)) {
        Map<String, List<PartLinkList>> sources = row.getSources();
        String partLinksAsString = Tools.getPartLinksAsHumanString(sources);
        jg.write(QueryField.CTX_P2P_SOURCE, partLinksAsString);
      }

      if (selects.contains(QueryField.CTX_P2P_TARGET)) {
        Map<String, List<PartLinkList>> targets = row.getTargets();
        String partLinksAsString = Tools.getPartLinksAsHumanString(targets);
        jg.write(QueryField.CTX_P2P_TARGET, partLinksAsString);
      }

      if (selects.contains(QueryField.PART_MASTER_IS_STANDARD)) {
        boolean isStandard = row.getPartRevision().getPartMaster().isStandardPart();
        jg.write(QueryField.PART_MASTER_IS_STANDARD, isStandard);
      }

      jg.writeEnd();
    }

    jg.writeEnd();
    jg.flush();
  }