private Metadata newPathMetadata(String schemaCode) {
   String code = schemaCode + "_path";
   Metadata metadata = mock(Metadata.class, code);
   when(metadata.getLocalCode()).thenReturn("path");
   when(metadata.getCode()).thenReturn(code);
   when(metadata.getType()).thenReturn(MetadataValueType.STRING);
   return metadata;
 }
 private Metadata newAllAuthorizationsMetadata(String schemaCode) {
   String code = schemaCode + "_allauthorizations";
   Metadata metadata = mock(Metadata.class, code);
   when(metadata.getLocalCode()).thenReturn("allauthorizations");
   when(metadata.getCode()).thenReturn(code);
   when(metadata.getType()).thenReturn(MetadataValueType.STRING);
   return metadata;
 }
  private Metadata configureMetadataWithHierarchyDependency(
      Metadata metadata, MetadataSchemaTypes types, String code) {

    when(metadata.getCode()).thenReturn(code);
    when(metadata.getLocalCode()).thenReturn(code.split("_")[2]);
    MetadataValueCalculator metadataValueCalculator = mock(MetadataValueCalculator.class);
    List dependencies = Arrays.asList(SpecialDependencies.HIERARCHY);
    when(metadataValueCalculator.getDependencies()).thenReturn(dependencies);
    when(metadata.getDataEntry()).thenReturn(new CalculatedDataEntry(metadataValueCalculator));
    return metadata;
  }
  private Metadata givenReferenceToSchemaType(
      Metadata metadata, MetadataSchemaTypes types, String code, boolean childOf, String type) {
    when(metadata.getCode()).thenReturn(code);
    when(metadata.getLocalCode()).thenReturn(code.split("_")[2]);
    when(metadata.getType()).thenReturn(MetadataValueType.REFERENCE);

    AllowedReferences allowedReferences = new AllowedReferences(type, null);
    when(metadata.getAllowedReferences()).thenReturn(allowedReferences);
    when(types.getMetadata(code)).thenReturn(metadata);

    return metadata;
  }
  private void addPropertyForSingleValueMetadata(
      Set<String> orgfilter,
      String typeId,
      PropertiesImpl result,
      Metadata metadata,
      Object value,
      String propertyCode) {
    if (metadata.getType().isStringOrText() || metadata.getType() == MetadataValueType.REFERENCE) {
      addPropertyString(result, typeId, orgfilter, propertyCode, (String) value);

    } else if (metadata.getType() == MetadataValueType.BOOLEAN) {
      addPropertyBoolean(result, typeId, orgfilter, propertyCode, (Boolean) value);

    } else if (metadata.getType() == MetadataValueType.ENUM) {
      addPropertyEnum(result, typeId, orgfilter, propertyCode, (EnumWithSmallCode) value);

    } else if (metadata.getType() == MetadataValueType.NUMBER) {
      addPropertyDouble(result, typeId, orgfilter, propertyCode, (Double) value);

    } else if (metadata.getType() == MetadataValueType.DATE_TIME
        || metadata.getType() == MetadataValueType.DATE) {
      GregorianCalendar calendarValue = getGregorianCalendar(value);
      addPropertyDateTime(result, typeId, orgfilter, propertyCode, calendarValue);

    } else if (metadata.getType() == MetadataValueType.CONTENT) {
      addPropertyString(result, typeId, orgfilter, propertyCode, ((Content) value).getId());
    }
  }
  private void addPropertyForMultiValueMetadata(
      Set<String> orgfilter,
      String typeId,
      PropertiesImpl result,
      Metadata metadata,
      Object value,
      String propertyCode) {
    if (!((List) value).isEmpty()) {
      if (metadata.getType().isStringOrText()
          || metadata.getType() == MetadataValueType.REFERENCE) {
        addPropertyListString(result, typeId, orgfilter, propertyCode, (List<String>) value);

      } else if (metadata.getType() == MetadataValueType.ENUM) {
        addPropertyListEnum(
            result, typeId, orgfilter, propertyCode, (List<EnumWithSmallCode>) value);

      } else if (metadata.getType() == MetadataValueType.BOOLEAN) {
        addPropertyListBoolean(result, typeId, orgfilter, propertyCode, (List<Boolean>) value);

      } else if (metadata.getType() == MetadataValueType.NUMBER) {
        addPropertyListInteger(result, typeId, orgfilter, propertyCode, (List<Long>) value);

      } else if (metadata.getType() == MetadataValueType.DATE_TIME
          || metadata.getType() == MetadataValueType.DATE) {
        List<GregorianCalendar> calendarValues = new ArrayList<>();
        for (Object dateObject : (List<Object>) value) {
          calendarValues.add(getGregorianCalendar(dateObject));
        }
        addPropertyListDateTime(result, typeId, orgfilter, propertyCode, calendarValues);
      }
    }
  }
 private void addPropertiesForMetadatas(
     Record record, Set<String> orgfilter, String typeId, PropertiesImpl result) {
   for (Metadata metadata :
       modelLayerFactory
           .getMetadataSchemasManager()
           .getSchemaTypes(record.getCollection())
           .getSchema(record.getSchemaCode())
           .getMetadatas()) {
     Object value = record.get(metadata);
     String propertyCode = metadata.getCode();
     if (value != null) {
       if (!metadata.isMultivalue()) {
         addPropertyForSingleValueMetadata(
             orgfilter, typeId, result, metadata, value, propertyCode);
       } else {
         addPropertyForMultiValueMetadata(
             orgfilter, typeId, result, metadata, value, propertyCode);
       }
     }
   }
 }
  public ConditionTemplate metadatasHasAnalyzedValue(String value, List<Metadata> metadatas) {

    List<String> availableLanguages =
        modelLayerFactory.getCollectionsListManager().getCollectionLanguages(collection);
    LanguageDetectionManager languageDetectionManager =
        modelLayerFactory.getLanguageDetectionManager();

    String language =
        availableLanguages.size() == 1
            ? availableLanguages.get(0)
            : languageDetectionManager.tryDetectLanguage(value);
    List<Metadata> searchedMetadatas = new ArrayList<>();
    for (Metadata metadata : metadatas) {
      if (!availableLanguages.contains(language) || language == null) {
        for (String availableLanguage : availableLanguages) {
          searchedMetadatas.add(metadata.getSearchableMetadataWithLanguage(availableLanguage));
        }
      } else {
        searchedMetadatas.add(metadata.getSearchableMetadataWithLanguage(language));
      }
    }

    return ConditionTemplate.anyField(searchedMetadatas, query(value));
  }
  @Before
  public void setUp() throws Exception {
    when(textMetadata.getDataStoreCode()).thenReturn("textMetadata");
    when(textMetadata.getType()).thenReturn(MetadataValueType.STRING);

    when(referenceMetadata.getDataStoreCode()).thenReturn("referenceMetadata");
    when(referenceMetadata.getType()).thenReturn(MetadataValueType.REFERENCE);

    when(numberMetadata.getDataStoreCode()).thenReturn("numberMetadata");
    when(numberMetadata.getType()).thenReturn(MetadataValueType.NUMBER);

    when(booleanMetadata.getDataStoreCode()).thenReturn("booleanMetadata");
    when(booleanMetadata.getType()).thenReturn(MetadataValueType.BOOLEAN);

    when(dateMetadata.getDataStoreCode()).thenReturn("dateTimeMetadata");
    when(dateMetadata.getType()).thenReturn(MetadataValueType.DATE_TIME);

    when(contentMetadata.getDataStoreCode()).thenReturn("contentMetadata");
    when(contentMetadata.getType()).thenReturn(MetadataValueType.CONTENT);
  }