[ 
https://issues.apache.org/jira/browse/DIRAPI-320?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16614397#comment-16614397
 ] 

Pavel Zlámal commented on DIRAPI-320:
-------------------------------------

So, based on your info I created three naive methods to get proper objects by 
their OIDs. {{SyntaxChecker}} by {{LdapSyntax}} OID and {{Normalizer}} and 
{{LdapComparator}} by {{MatchingRule}} OID.

I'm stil missing some bits. What do you mean by standard comparator ? I do 
return {{ComparableComprator}} for now if no OID matches. Should I return 
{{null}} instead?

I guess specific classes like {{RegexSyntaxChecker}} are meant for manual use.

I'm trying to get into state, where I can manually build most complete schema 
in best effort mode, so I can use generic code to check for stuff like "is MUST 
/ MAY attribute", "value is binary / human readable" etc. And I will either 
perform strict client side check (Directory API SchemaManger associated with 
connection and info read from Attribute->getAttributeType() etc.) or weak check 
(read from my schema).

Thank you for your help.
{code:java}
/**
 * Return instance of SyntaxChecker associated with LdapSyntax specified by its 
OID
 *
 * @param oid OID of LdapSyntax to get SyntaxChecker for
 * @return SyntaxChecker or NULL if OID is unknown
 */
private static SyntaxChecker getSyntaxCheckerByOid(String oid) {

   switch (oid) {
      case SchemaConstants.ACCESS_POINT_SYNTAX: return 
AccessPointSyntaxChecker.INSTANCE;
      case SchemaConstants.ATTRIBUTE_TYPE_DESCRIPTION_SYNTAX: return 
AttributeTypeDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.ATTRIBUTE_TYPE_USAGE_SYNTAX: return 
AttributeTypeUsageSyntaxChecker.INSTANCE;
      case SchemaConstants.AUDIO_SYNTAX: return AudioSyntaxChecker.INSTANCE;
      case SchemaConstants.BINARY_SYNTAX: return BinarySyntaxChecker.INSTANCE;
      case SchemaConstants.BIT_STRING_SYNTAX: return 
BitStringSyntaxChecker.INSTANCE;
      case SchemaConstants.BOOLEAN_SYNTAX: return BooleanSyntaxChecker.INSTANCE;
      case SchemaConstants.CERTIFICATE_LIST_SYNTAX: return 
CertificateListSyntaxChecker.INSTANCE;
      case SchemaConstants.CERTIFICATE_PAIR_SYNTAX: return 
CertificatePairSyntaxChecker.INSTANCE;
      case SchemaConstants.CERTIFICATE_SYNTAX: return 
CertificateSyntaxChecker.INSTANCE;
      case SchemaConstants.COMPARATOR_SYNTAX: return 
ComparatorSyntaxChecker.INSTANCE;
      case SchemaConstants.COUNTRY_STRING_SYNTAX: return 
CountrySyntaxChecker.INSTANCE;
      case SchemaConstants.CSN_SID_SYNTAX: return CsnSidSyntaxChecker.INSTANCE;
      case SchemaConstants.CSN_SYNTAX: return CsnSyntaxChecker.INSTANCE;
      case SchemaConstants.DATA_QUALITY_SYNTAX: return 
DataQualitySyntaxSyntaxChecker.INSTANCE;
      case SchemaConstants.DELIVERY_METHOD_SYNTAX: return 
DeliveryMethodSyntaxChecker.INSTANCE;
      case SchemaConstants.DEREF_ALIAS_SYNTAX: return 
DerefAliasSyntaxChecker.INSTANCE;
      case SchemaConstants.DIRECTORY_STRING_SYNTAX: return 
DirectoryStringSyntaxChecker.INSTANCE;
      case SchemaConstants.DIT_CONTENT_RULE_SYNTAX: return 
DitContentRuleDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.DIT_STRUCTURE_RULE_SYNTAX: return 
DitStructureRuleDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.DL_SUBMIT_PERMISSION_SYNTAX: return 
DlSubmitPermissionSyntaxChecker.INSTANCE;
      case SchemaConstants.DN_SYNTAX: return DnSyntaxChecker.INSTANCE;
      case SchemaConstants.DSA_QUALITY_SYNTAX: return 
DsaQualitySyntaxSyntaxChecker.INSTANCE;
      case SchemaConstants.DSE_TYPE_SYNTAX: return 
DseTypeSyntaxChecker.INSTANCE;
      case SchemaConstants.ENHANCED_GUIDE_SYNTAX: return 
EnhancedGuideSyntaxChecker.INSTANCE;
      case SchemaConstants.FACSIMILE_TELEPHONE_NUMBER_SYNTAX: return 
FacsimileTelephoneNumberSyntaxChecker.INSTANCE;
      case SchemaConstants.FAX_SYNTAX: return FaxSyntaxChecker.INSTANCE;
      case SchemaConstants.GENERALIZED_TIME_SYNTAX: return 
GeneralizedTimeSyntaxChecker.INSTANCE;
      case SchemaConstants.GUIDE_SYNTAX: return GuideSyntaxChecker.INSTANCE;
      case SchemaConstants.IA5_STRING_SYNTAX: return 
Ia5StringSyntaxChecker.INSTANCE;
      case SchemaConstants.INTEGER_SYNTAX: return IntegerSyntaxChecker.INSTANCE;
      case SchemaConstants.JAVA_BYTE_SYNTAX: return 
JavaByteSyntaxChecker.INSTANCE;
      case SchemaConstants.JAVA_INT_SYNTAX: return 
JavaIntegerSyntaxChecker.INSTANCE;
      case SchemaConstants.JAVA_LONG_SYNTAX: return 
JavaLongSyntaxChecker.INSTANCE;
      case SchemaConstants.JAVA_SHORT_SYNTAX: return 
JavaShortSyntaxChecker.INSTANCE;
      case SchemaConstants.JPEG_SYNTAX: return JpegSyntaxChecker.INSTANCE;
      case SchemaConstants.LDAP_SYNTAX_DESCRIPTION_SYNTAX: return 
LdapSyntaxDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.MAIL_PREFERENCE_SYNTAX: return 
MailPreferenceSyntaxChecker.INSTANCE;
      case SchemaConstants.MASTER_AND_SHADOW_ACCESS_POINTS_SYNTAX: return 
MasterAndShadowAccessPointSyntaxChecker.INSTANCE;
      case SchemaConstants.MATCHING_RULE_DESCRIPTION_SYNTAX: return 
MatchingRuleDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.MATCHING_RULE_USE_DESCRIPTION_SYNTAX: return 
MatchingRuleUseDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.MHS_OR_ADDRESS_SYNTAX: return 
MhsOrAddressSyntaxChecker.INSTANCE;
      case SchemaConstants.NAME_AND_OPTIONAL_UID_SYNTAX: return 
NameAndOptionalUIDSyntaxChecker.INSTANCE;
      case SchemaConstants.NAME_FORM_DESCRIPTION_SYNTAX: return 
NameFormDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.NORMALIZER_SYNTAX: return 
NormalizerSyntaxChecker.INSTANCE;
      case SchemaConstants.NUMBER_SYNTAX: return NumberSyntaxChecker.INSTANCE;
      case SchemaConstants.NUMERIC_OID_SYNTAX: return 
NumericOidSyntaxChecker.INSTANCE;
      case SchemaConstants.NUMERIC_STRING_SYNTAX: return 
NumericStringSyntaxChecker.INSTANCE;
      case SchemaConstants.OBJECT_CLASS_DESCRIPTION_SYNTAX: return 
ObjectClassDescriptionSyntaxChecker.INSTANCE;
      case SchemaConstants.OBJECT_CLASS_TYPE_SYNTAX: return 
ObjectClassTypeSyntaxChecker.INSTANCE;
      case SchemaConstants.OBJECT_NAME_SYNTAX: return 
ObjectNameSyntaxChecker.INSTANCE;
      case SchemaConstants.OCTET_STRING_SYNTAX: return 
OctetStringSyntaxChecker.INSTANCE;
      case SchemaConstants.OID_LEN_SYNTAX: return OidLenSyntaxChecker.INSTANCE;
      // TODO - OpenLdapObjectIdentifierMacro ?
      case SchemaConstants.OTHER_MAILBOX_SYNTAX: return 
OtherMailboxSyntaxChecker.INSTANCE;
      case SchemaConstants.POSTAL_ADDRESS_SYNTAX: return 
PostalAddressSyntaxChecker.INSTANCE;
      case SchemaConstants.PRESENTATION_ADDRESS_SYNTAX: return 
PresentationAddressSyntaxChecker.INSTANCE;
      case SchemaConstants.PRINTABLE_STRING_SYNTAX: return 
PrintableStringSyntaxChecker.INSTANCE;
      case SchemaConstants.PROTOCOL_INFORMATION_SYNTAX: return 
ProtocolInformationSyntaxChecker.INSTANCE;
      // TODO - RegexSyntaxChecker
      case SchemaConstants.SEARCH_SCOPE_SYNTAX: return 
SearchScopeSyntaxChecker.INSTANCE;
      case SchemaConstants.SUBSTRING_ASSERTION_SYNTAX: return 
SubstringAssertionSyntaxChecker.INSTANCE;
      case SchemaConstants.SUBTREE_SPECIFICATION_SYNTAX: return 
SubtreeSpecificationSyntaxChecker.INSTANCE;
      case SchemaConstants.SUPPLIER_AND_CONSUMER_SYNTAX: return 
SupplierAndConsumerSyntaxChecker.INSTANCE;
      case SchemaConstants.SUPPLIER_INFORMATION_SYNTAX: return 
SupplierInformationSyntaxChecker.INSTANCE;
      case SchemaConstants.SUPPLIER_OR_CONSUMER_SYNTAX: return 
SupplierOrConsumerSyntaxChecker.INSTANCE;
      case SchemaConstants.SUPPORTED_ALGORITHM_SYNTAX: return 
SupportedAlgorithmSyntaxChecker.INSTANCE;
      case SchemaConstants.SYNTAX_CHECKER_SYNTAX: return 
SyntaxCheckerSyntaxChecker.INSTANCE;
      case SchemaConstants.TELEPHONE_NUMBER_SYNTAX: return 
TelephoneNumberSyntaxChecker.INSTANCE;
      case SchemaConstants.TELETEX_TERMINAL_IDENTIFIER_SYNTAX: return 
TeletexTerminalIdentifierSyntaxChecker.INSTANCE;
      case SchemaConstants.TELEX_NUMBER_SYNTAX: return 
TelexNumberSyntaxChecker.INSTANCE;
      case SchemaConstants.UTC_TIME_SYNTAX: return 
UtcTimeSyntaxChecker.INSTANCE;
      case SchemaConstants.UUID_SYNTAX: return UuidSyntaxChecker.INSTANCE;
      default:
         return null;
   }

}

/**
 * Return instance of value Normalizer associated with MatchingRule specified 
by OID.
 *
 * @param oid OID of MatchingRule to get Normalizer for
 * @return Normalizer or NoOpNormalizer if OID is unknown
 */
private static Normalizer getNormalizerByOid(String oid) {

   switch (oid) {

      case SchemaConstants.BOOLEAN_MATCH_MR_OID:
         return new BooleanNormalizer();

      // TODO - ConcreteNameComponentNormalizer ??

      case SchemaConstants.CASE_EXACT_IA5_MATCH_MR_OID:
      case SchemaConstants.PROTOCOL_INFORMATION_MATCH_MR_OID:
      case SchemaConstants.CASE_EXACT_MATCH_MR_OID:
      case SchemaConstants.CASE_EXACT_SUBSTRING_MATCH_MR_OID:
         return new DeepTrimNormalizer(oid);

      case SchemaConstants.SUP_DIT_STRUCTURE_RULE_MATCH_OID:
      case SchemaConstants.RULE_ID_MATCH_OID:
      case SchemaConstants.CASE_IGNORE_IA5_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_IA5_SUBSTRINGS_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_LIST_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_LIST_SUBSTRINGS_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_ORDERING_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_SUBSTRING_MATCH_MR_OID:
         return new DeepTrimToLowerNormalizer(oid);

      case SchemaConstants.DISTINGUISHED_NAME_MATCH_MR_OID:
         return new DnNormalizer();

      case SchemaConstants.GENERALIZED_TIME_MATCH_MR_OID:
      case SchemaConstants.GENERALIZED_TIME_ORDERING_MATCH_MR_OID:
         return new GeneralizedTimeNormalizer();

      case SchemaConstants.NAME_OR_NUMERIC_ID_MATCH_OID:
         return new NameOrNumericIdNormalizer();

      case SchemaConstants.NUMERIC_STRING_MATCH_MR_OID:
      case SchemaConstants.NUMERIC_STRING_ORDERING_MATCH_MR_OID:
      case SchemaConstants.NUMERIC_STRING_SUBSTRINGS_MATCH_MR_OID:
      case SchemaConstants.INTEGER_MATCH_MR_OID:
      case SchemaConstants.INTEGER_ORDERING_MATCH_MR_OID:
         return new NumericNormalizer();

      case SchemaConstants.OBJECT_IDENTIFIER_MATCH_MR_OID:
         return new ObjectIdentifierNormalizer();

      // TODO - OidNormalizer - unused in Directory API schemas ??
      // TODO - RegexNormalizer ??

      case SchemaConstants.TELEPHONE_NUMBER_MATCH_MR_OID:
      case SchemaConstants.TELEPHONE_NUMBER_SUBSTRINGS_MATCH_MR_OID:
         return new TelephoneNumberNormalizer();

      case SchemaConstants.UNIQUE_MEMBER_MATCH_MR_OID:
         return new UniqueMemberNormalizer();

      default:
         return new NoOpNormalizer(oid);
   }

}

/**
 * Return instance of LdapComparator associated with MatchingRule specified by 
OID.
 *
 * @param oid OID of MatchingRule to get LdapComparator for
 * @return Specific LdapComparator instance or ComparableComparator if OID is 
unknown
 */
private static LdapComparator getComparatorByOid(String oid) {

   switch (oid) {

      case SchemaConstants.BIT_STRING_MATCH_MR_OID:
         return new BitStringComparator(oid);

      case SchemaConstants.BOOLEAN_MATCH_MR_OID:
         return new BooleanComparator(oid);

      case SchemaConstants.OCTET_STRING_MATCH_MR_OID:
      case SchemaConstants.OCTET_STRING_ORDERING_MATCH_MR_OID:
      case SchemaConstants.OCTET_STRING_SUBSTRINGS_MATCH_MR_OID:
         return new ByteArrayComparator(oid);

      // TODO - missing in SchemaConstants - certificateExactMatch matching rule
      case "2.5.13.34":
         return new CertificateComparator(oid);

      case SchemaConstants.CSN_MATCH_MR_OID:
      case SchemaConstants.CSN_ORDERING_MATCH_MR_OID:
         return new CsnComparator(oid);

      case SchemaConstants.CSN_SID_MATCH_MR_OID:
         return new CsnSidComparator(oid);

      // TODO - missing SchemaConstants - caseExactIA5SubstringsMatch matching 
rule
      case "1.3.6.1.4.1.4203.1.2.1":
      case SchemaConstants.CASE_EXACT_IA5_MATCH_MR_OID:
      case SchemaConstants.PROTOCOL_INFORMATION_MATCH_MR_OID:
      case SchemaConstants.CASE_EXACT_MATCH_MR_OID:
      case SchemaConstants.CASE_EXACT_SUBSTRING_MATCH_MR_OID:
         return new DeepTrimComparator(oid);

      case SchemaConstants.SUP_DIT_STRUCTURE_RULE_MATCH_OID:
      case SchemaConstants.RULE_ID_MATCH_OID:
      case SchemaConstants.CASE_IGNORE_IA5_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_IA5_SUBSTRINGS_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_ORDERING_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_SUBSTRING_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_LIST_MATCH_MR_OID:
      case SchemaConstants.CASE_IGNORE_LIST_SUBSTRINGS_MATCH_MR_OID:
         return new DeepTrimToLowerComparator(oid);

      case SchemaConstants.DISTINGUISHED_NAME_MATCH_MR_OID:
         return new DnComparator(oid);

      case SchemaConstants.GENERALIZED_TIME_MATCH_MR_OID:
      case SchemaConstants.GENERALIZED_TIME_ORDERING_MATCH_MR_OID:
         return new GeneralizedTimeComparator(oid);

      case SchemaConstants.INTEGER_MATCH_MR_OID:
      case SchemaConstants.INTEGER_ORDERING_MATCH_MR_OID:
         return new IntegerComparator(oid);

      case SchemaConstants.BIG_INTEGER_MATCH_MR_OID:
         return new LongComparator(oid);

      // TODO - NormalizingComparator

      case SchemaConstants.NUMERIC_STRING_MATCH_MR_OID:
      case SchemaConstants.NUMERIC_STRING_ORDERING_MATCH_MR_OID:
      case SchemaConstants.NUMERIC_STRING_SUBSTRINGS_MATCH_MR_OID:
         return new NumericStringComparator(oid);

      case SchemaConstants.OBJECT_CLASS_TYPE_MATCH_OID:
         return new ObjectClassTypeComparator(oid);

      case SchemaConstants.OBJECT_IDENTIFIER_MATCH_MR_OID:
         return new ObjectIdentifierComparator(oid);

      // TODO - this comparator is not used in DirectoryAPI schemas, but 
Comparator and MR exists with documented OID
      case SchemaConstants.OBJECT_IDENTIFIER_FIRST_COMPONENT_MATCH_MR_OID:
         return new ObjectIdentifierFirstComponentComparator(oid);

      // TODO - Parsed DN Comparator ?
      // TODO - SerializableComparator

      case SchemaConstants.NUMERIC_OID_MATCH_OID:
      case SchemaConstants.JDBM_STRING_MATCH_MR_OID:
         return new StringComparator(oid);

      case SchemaConstants.TELEPHONE_NUMBER_MATCH_MR_OID:
      case SchemaConstants.TELEPHONE_NUMBER_SUBSTRINGS_MATCH_MR_OID:
         return new TelephoneNumberComparator(oid);

      case SchemaConstants.NAME_OR_NUMERIC_ID_MATCH_OID:
      case SchemaConstants.UNIQUE_MEMBER_MATCH_MR_OID:
         return new UniqueMemberComparator(oid);

      case SchemaConstants.UUID_MATCH_MR_OID:
      case SchemaConstants.UUID_ORDERING_MATCH_MR_OID:
         return new UuidComparator(oid);

      case SchemaConstants.WORD_MATCH_MR_OID:
      case SchemaConstants.KEYWORD_MATCH_MR_OID:
         return new WordComparator(oid);

      default:
         return new ComparableComparator(oid);

   }

}
{code}

> ClassCastException on Objects.equals(Value,Value) for userPassword attribute
> ----------------------------------------------------------------------------
>
>                 Key: DIRAPI-320
>                 URL: https://issues.apache.org/jira/browse/DIRAPI-320
>             Project: Directory Client API
>          Issue Type: Bug
>    Affects Versions: 2.0.0.AM2
>            Reporter: Pavel Zlámal
>            Priority: Minor
>
> When I use _JarLdifSchemaLoader_ it seems to load _userPassword_ attribute 
> type with different Comparator than when I load it from LDAP connection 
> (openLDAP in my case).
> Then If I call:
> {code:java}
> Objects.equals(val, attribute.get())
> {code}
> to check if value passed to my method is the first in the attribute, I get 
> _ClassCastException_, since it tries to pass _String_ (normalized value) to 
> the _ByteArrayComparator._
> When I use Schema only loaded from connection, then it works, since it uses 
> _ComparableComparator._
> {code:java}
> java.lang.ClassCastException: java.lang.String cannot be cast to [B
>     at 
> org.apache.directory.api.ldap.model.schema.comparators.ByteArrayComparator.compare(ByteArrayComparator.java:32)
>     at org.apache.directory.api.ldap.model.entry.Value.equals(Value.java:1389)
>     at java.util.Objects.equals(Objects.java:59)
> {code}
> So there is probably bug in schema ldif included in JAR or in equals() 
> implementation of Value.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to