// Copyright © 2015 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.back;
import java.util.List;
import com.querydsl.core.Tuple;
import com.querydsl.core.dml.StoreClause;
import com.querydsl.sql.RelationalPathBase;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.MappingProjection;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.StringPath;
import fi.hsl.parkandride.core.domain.Address;
class AddressMapping extends MappingProjection<Address> {
private final MultilingualStringMapping streetAddress;
private final Path<String> postalCode;
private final MultilingualStringMapping city;
public AddressMapping(RelationalPathBase<?> owner) {
super(Address.class, createExpressions(owner));
List<Expression<?>> args = getArgs();
this.streetAddress = (MultilingualStringMapping) args.get(0);
this.postalCode = (Path<String>) args.get(1);
this.city = (MultilingualStringMapping) args.get(2);
}
private static Expression<?>[] createExpressions(RelationalPathBase<?> table) {
Path<?>[] paths = table.all();
return new Expression<?>[] {
new MultilingualStringMapping(
findPath(paths, "streetAddressFi"),
findPath(paths, "streetAddressSv"),
findPath(paths, "streetAddressEn")),
findPath(paths, "postalCode"),
new MultilingualStringMapping(
findPath(paths, "cityFi"),
findPath(paths, "citySv"),
findPath(paths, "cityEn"))
};
}
private static StringPath findPath(Path<?>[] paths, String name) {
for (Path<?> path : paths) {
if (path.getMetadata().getName().equals(name)) {
return (StringPath) path;
}
}
throw new IllegalArgumentException("Path not found: " + name);
}
@Override
protected Address map(Tuple row) {
Address address = new Address();
address.streetAddress = streetAddress.map(row);
address.postalCode = row.get(postalCode);
address.city = city.map(row);
return address;
}
protected void populate(Address address, StoreClause<?> store) {
if (address == null) {
address = new Address();
}
streetAddress.populate(address.streetAddress, store);
store.set(postalCode, address.postalCode);
city.populate(address.city, store);
}
}