- final Identifier<?> identifier;
- try {
- identifier = (Identifier<?>) ctorInvoker.invokeExact(ctor, bindingValues);
- } catch (Throwable e) {
- Throwables.throwIfUnchecked(e);
- throw new RuntimeException(e);
+ @Override
+ Identifier<?> deserializeIdentifierImpl(final NodeIdentifierWithPredicates nip) throws Throwable {
+ final Object[] bindingValues = new Object[keysInBindingOrder.size()];
+ int offset = 0;
+ for (final QName key : keysInBindingOrder) {
+ bindingValues[offset++] = keyValueContexts.get(key).deserialize(nip.getValue(key));
+ }
+
+ return (Identifier<?>) ctor.invokeExact(bindingValues);
+ }
+
+ @Override
+ NodeIdentifierWithPredicates serializeIdentifier(final QName qname, final Identifier<?> key) {
+ final Object[] values = new Object[keyValueContexts.size()];
+ int offset = 0;
+ for (final ValueContext valueCtx : keyValueContexts.values()) {
+ values[offset++] = valueCtx.getAndSerialize(key);
+ }
+
+ return NodeIdentifierWithPredicates.of(qname, predicateTemplate.instantiateWithValues(values));
+ }
+ }
+
+ private static final Logger LOG = LoggerFactory.getLogger(IdentifiableItemCodec.class);
+
+ private final Class<?> identifiable;
+ private final QName qname;
+
+ IdentifiableItemCodec(final ListSchemaNode schema, final Class<? extends Identifier<?>> keyClass,
+ final Class<?> identifiable) {
+ this.identifiable = requireNonNull(identifiable);
+ this.qname = schema.getQName();
+ }
+
+ static IdentifiableItemCodec of(final ListSchemaNode schema,
+ final Class<? extends Identifier<?>> keyClass, final Class<?> identifiable,
+ final Map<QName, ValueContext> keyValueContexts) {
+ switch (keyValueContexts.size()) {
+ case 0:
+ throw new IllegalArgumentException("Key " + keyClass + " of " + identifiable + " has no components");
+ case 1:
+ final Entry<QName, ValueContext> entry = keyValueContexts.entrySet().iterator().next();
+ return new SingleKey(schema, keyClass, identifiable, entry.getKey(), entry.getValue());
+ default:
+ return new MultiKey(schema, keyClass, identifiable, keyValueContexts);