| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.openjpa.slice.jdbc; |
| |
| import org.apache.openjpa.jdbc.kernel.JDBCFetchConfigurationImpl; |
| import org.apache.openjpa.kernel.FetchConfiguration; |
| import org.apache.openjpa.slice.SlicePersistence; |
| import org.apache.openjpa.util.InternalException; |
| import org.apache.openjpa.util.UserException; |
| |
| /** |
| * A fetch configuration that is aware of special hint to narrow its operation on |
| * subset of slices. |
| * |
| * @author Pinaki Poddar |
| * |
| */ |
| @SuppressWarnings("serial") |
| public class TargetFetchConfiguration extends JDBCFetchConfigurationImpl implements FetchConfiguration { |
| boolean _explicitTarget = false; |
| |
| public TargetFetchConfiguration() { |
| super(); |
| } |
| |
| /** |
| * Setting hints on this configuration is treated specially if the given key |
| * is {@linkplain SlicePersistence#HINT_TARGET a target hint}. |
| * |
| * @param value if the given key is target hint, then the value can be either |
| * null, a String or a non-zero sized String array. It can not be a zero-sized |
| * String array. |
| */ |
| @Override |
| public void setHint(String key, Object value) { |
| super.setHint(key, value); |
| _explicitTarget = SlicePersistence.HINT_TARGET.equals(key); |
| } |
| |
| public void setHint(String key, Object value, Object original) { |
| super.setHint(key, value, original); |
| _explicitTarget = SlicePersistence.HINT_TARGET.equals(key); |
| } |
| |
| public void setTargets(String[] targets) { |
| super.setHint(SlicePersistence.HINT_TARGET, targets); |
| _explicitTarget = false; |
| } |
| |
| /** |
| * Affirms if the target is set on this receiver explicitly (i.e. by the user). |
| */ |
| public boolean isExplicitTarget() { |
| return _explicitTarget; |
| } |
| |
| String[] toSliceNames(Object o, boolean user) { |
| if (o == null) |
| return null; |
| if (o instanceof String) { |
| return new String[]{o.toString()}; |
| } |
| if (o instanceof String[]) { |
| if (((String[])o).length == 0) { |
| throw new InternalException("Hint values " + o + " are wrong type " + o.getClass()); |
| |
| } |
| return (String[])o; |
| } |
| throw new InternalException("Hint values " + o + " are wrong type " + o.getClass()); |
| } |
| |
| void assertTargets(String[] targets, boolean user) { |
| if (targets != null && targets.length == 0) { |
| if (user) { |
| throw new UserException("Hint values " + targets + " are empty"); |
| } |
| } |
| } |
| |
| protected TargetFetchConfiguration newInstance(ConfigurationState state) { |
| JDBCConfigurationState jstate = (state == null) ? null : _state; |
| return new TargetFetchConfiguration(state, jstate); |
| } |
| |
| protected TargetFetchConfiguration(ConfigurationState state, |
| JDBCConfigurationState jstate) { |
| super(state, jstate); |
| } |
| |
| |
| } |