[
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)