/* * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.querydsl.core.types.dsl; import java.io.Serializable; import java.util.*; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.querydsl.core.types.PathMetadata; /** * {@code PathInits} defines path initializations that can be attached to * properties via QueryInit annotations * * @author tiwe * */ public class PathInits implements Serializable { private static final long serialVersionUID = -2173980858324141095L; public static final PathInits DEFAULT = new PathInits(); public static final PathInits DIRECT = new PathInits("*"); public static final PathInits DIRECT2 = new PathInits("*.*"); private final boolean initAllProps; private final PathInits defaultValue; private final Map<String,PathInits> propertyToInits = new HashMap<String,PathInits>(); public PathInits(String... initStrs) { boolean initAllProps = false; PathInits defaultValue = DEFAULT; Map<String, Collection<String>> properties = Maps.newHashMap(); for (String initStr : initStrs) { if (initStr.equals("*")) { initAllProps = true; } else if (initStr.startsWith("*.")) { initAllProps = true; defaultValue = new PathInits(initStr.substring(2)); } else { String key = initStr; List<String> inits = Collections.emptyList(); if (initStr.contains(".")) { key = initStr.substring(0, initStr.indexOf('.')); inits = ImmutableList.of(initStr.substring(key.length() + 1)); } Collection<String> values = properties.get(key); if (values == null) { values = new ArrayList<String>(); properties.put(key, values); } values.addAll(inits); } } for (Map.Entry<String, Collection<String>> entry : properties.entrySet()) { PathInits inits = new PathInits(Iterables.toArray(entry.getValue(), String.class)); propertyToInits.put(entry.getKey(), inits); } this.initAllProps = initAllProps; this.defaultValue = defaultValue; } public PathInits get(String property) { if (propertyToInits.containsKey(property)) { return propertyToInits.get(property); } else if (initAllProps) { return defaultValue; } else { throw new IllegalArgumentException(property + " is not initialized"); } } public boolean isInitialized(String property) { return initAllProps || propertyToInits.containsKey(property); } public static PathInits getFor(PathMetadata metadata, PathInits root) { if (metadata.isRoot()) { return root; } else if (metadata.getParent().getMetadata().isRoot()) { return DIRECT; } else { return DEFAULT; } } }