@SuppressWarnings("unchecked") @Override public B dataSource(ItemDataProvider<PropertyBox> dataProvider, final Property... identifierProperties) { ObjectUtils.argumentNotNull(identifierProperties, "Identifier properties must be not null"); if (identifierProperties.length == 0) { throw new IllegalArgumentException("Identifier properties must be not empty"); } final PropertySet<?> propertySet = PropertySet.builderOf(identifierProperties) .identifiers(Arrays.asList(identifierProperties)).build(); return dataSource(dataProvider, item -> { PropertyBox.Builder builder = PropertyBox.builder(propertySet); for (Property p : identifierProperties) { item.getValueIfPresent(p).ifPresent(v -> builder.set(p, v)); } return builder.build(); }); }
@Override public B dataSource(Datastore datastore, DataTarget<?> dataTarget, Property... identifierProperties) { if (identifierProperties == null || identifierProperties.length == 0) { return dataSource(datastore, dataTarget); } // set given identifier properties ad property set identifiers PropertySet<?> propertySet = PropertySet.builder().add(properties) .identifiers(Arrays.asList(identifierProperties)).build(); // set data source dataSource(ItemDataProvider.create(datastore, dataTarget, propertySet)); // set commit handler commitHandler(CommitHandler.datastore(datastore, dataTarget)); return builder(); }
/** * Create a {@link DatastoreDataProvider} and use given <code>identifierProperties</code> as {@link PropertyBox} * items identifiers. * <p> * The {@link PropertyBox} items will be fetched from the persistence source using a properly configured Datastore * query, with given <code>dataTarget</code> representing the persistent entity to query. The {@link PropertyBox} * items will be built using given <code>propertySet</code>. * </p> * <p> * The provided identifier properties will be used as {@link PropertyBox} item identifiers, i.e. the * <code>equals</code> and <code>hashCode</code> logic of the items will be implemented accordingly to the values of * the identifier properties. * </p> * @param datastore The {@link Datastore} to use (not null) * @param target The data target to use (not null) * @param propertySet The query projection property set (not null) * @param identifierProperties Properties to use as item identifiers * @return A new {@link DatastoreDataProvider} instance */ static DatastoreDataProvider create(Datastore datastore, DataTarget<?> target, PropertySet<?> propertySet, Property<?>... identifierProperties) { if (identifierProperties == null || identifierProperties.length == 0) { return create(datastore, target, propertySet); } // set given identifier properties as property set identifiers PropertySet<?> propertySetWithIds = PropertySet.builder().add(propertySet) .identifiers(Arrays.asList(identifierProperties)).build(); return builder().datastore(datastore).target(target).withProperties(propertySetWithIds).build(); }