blob: 786285cbc3e7f9fea7bf12f1ee34d8631e94293f [file] [log] [blame]
/*
* 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.olingo.commons.core.edm;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.EdmBindingTarget;
import org.apache.olingo.commons.api.edm.EdmEntityContainer;
import org.apache.olingo.commons.api.edm.EdmEntityType;
import org.apache.olingo.commons.api.edm.EdmException;
import org.apache.olingo.commons.api.edm.EdmMapping;
import org.apache.olingo.commons.api.edm.EdmNavigationPropertyBinding;
import org.apache.olingo.commons.api.edm.provider.CsdlBindingTarget;
import org.apache.olingo.commons.api.edm.provider.CsdlNavigationPropertyBinding;
public abstract class AbstractEdmBindingTarget extends AbstractEdmNamed implements EdmBindingTarget {
private final CsdlBindingTarget target;
private final EdmEntityContainer container;
private List<EdmNavigationPropertyBinding> navigationPropertyBindings;
public AbstractEdmBindingTarget(final Edm edm, final EdmEntityContainer container, final CsdlBindingTarget target) {
super(edm, target.getName(), target);
this.container = container;
this.target = target;
}
@Override
public List<EdmNavigationPropertyBinding> getNavigationPropertyBindings() {
if (navigationPropertyBindings == null) {
List<CsdlNavigationPropertyBinding> providerBindings = target.getNavigationPropertyBindings();
final List<EdmNavigationPropertyBinding> navigationPropertyBindingsLocal =
new ArrayList<EdmNavigationPropertyBinding>();
if (providerBindings != null) {
for (CsdlNavigationPropertyBinding binding : providerBindings) {
navigationPropertyBindingsLocal.add(new EdmNavigationPropertyBindingImpl(binding.getPath(),
binding.getTarget()));
}
navigationPropertyBindings = Collections.unmodifiableList(navigationPropertyBindingsLocal);
}
}
return navigationPropertyBindings;
}
@Override
public EdmEntityContainer getEntityContainer() {
return container;
}
@Override
public EdmEntityType getEntityType() {
final EdmEntityType entityType = edm.getEntityType(target.getTypeFQN());
if (entityType == null) {
throw new EdmException("Can´t find entity type: " + target.getTypeFQN() + " for entity set or singleton: "
+ getName());
}
return entityType;
}
@Override
public EdmEntityType getEntityTypeWithAnnotations() {
final EdmEntityType entityType = ((AbstractEdm)edm).
getEntityTypeWithAnnotations(target.getTypeFQN(), true);
if (entityType == null) {
throw new EdmException("Can´t find entity type: " + target.getTypeFQN() + " for entity set or singleton: "
+ getName());
}
return entityType;
}
@Override
public EdmBindingTarget getRelatedBindingTarget(final String path) {
if (path == null) {
return null;
}
EdmBindingTarget bindingTarget = null;
boolean found = false;
for (final Iterator<EdmNavigationPropertyBinding> itor = getNavigationPropertyBindings().iterator(); itor.hasNext()
&& !found;) {
final EdmNavigationPropertyBinding binding = itor.next();
if (binding.getPath() == null || binding.getTarget() == null) {
throw new EdmException("Path or Target in navigation property binding must not be null!");
}
if (path.equals(binding.getPath())) {
final Target edmTarget = new Target(binding.getTarget(), container);
final EdmEntityContainer entityContainer = edm.getEntityContainer(edmTarget.getEntityContainer());
if (entityContainer == null) {
throw new EdmException("Cannot find entity container with name: " + edmTarget.getEntityContainer());
}
try {
bindingTarget = entityContainer.getEntitySet(edmTarget.getTargetName());
if (bindingTarget == null) {
throw new EdmException("Cannot find EntitySet " + edmTarget.getTargetName());
}
} catch (EdmException e) {
// try with singletons ...
bindingTarget = entityContainer.getSingleton(edmTarget.getTargetName());
if (bindingTarget == null) {
throw new EdmException("Cannot find Singleton " + edmTarget.getTargetName(), e);
}
} finally {
found = bindingTarget != null;
}
}
}
return bindingTarget;
}
@Override
public String getTitle() {
return target.getTitle();
}
@Override
public EdmMapping getMapping() {
return target.getMapping();
}
}