[OLINGO-169] Enhancing EdmActionImportInfo and EdmFunctionImportInfo support for V3

This commit is contained in:
Francesco Chicchiriccò 2014-03-06 16:38:08 +01:00
parent 1264aecd5c
commit d1b341dfaa
6 changed files with 141 additions and 33 deletions

View File

@ -25,16 +25,15 @@ import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.apache.olingo.odata4.client.api.edm.xml.CommonFunctionImport;
import org.apache.olingo.odata4.client.api.edm.xml.EntityContainer;
import org.apache.olingo.odata4.client.api.edm.xml.EntitySet;
import org.apache.olingo.odata4.client.api.edm.xml.Schema;
import org.apache.olingo.odata4.client.api.edm.xml.XMLMetadata;
import org.apache.olingo.odata4.commons.api.edm.EdmActionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmEntitySetInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmServiceMetadata;
import org.apache.olingo.odata4.commons.core.edm.EdmEntitySetInfoImpl;
import org.apache.olingo.odata4.commons.core.edm.EdmFunctionImportInfoImpl;
public abstract class AbstractEdmServiceMetadataImpl implements EdmServiceMetadata {
@ -42,7 +41,9 @@ public abstract class AbstractEdmServiceMetadataImpl implements EdmServiceMetada
private List<EdmEntitySetInfo> entitySetInfos;
private List<EdmFunctionImportInfo> functionImportInfos;
protected List<EdmFunctionImportInfo> functionImportInfos;
protected List<EdmActionImportInfo> actionImportInfos;
public static EdmServiceMetadata getInstance(final XMLMetadata xmlMetadata) {
return xmlMetadata instanceof org.apache.olingo.odata4.client.core.edm.xml.v3.XMLMetadataImpl
@ -80,24 +81,6 @@ public abstract class AbstractEdmServiceMetadataImpl implements EdmServiceMetada
}
}
@Override
public List<EdmFunctionImportInfo> getFunctionImportInfos() {
synchronized (this) {
if (functionImportInfos == null) {
functionImportInfos = new ArrayList<EdmFunctionImportInfo>();
for (Schema schema : xmlMetadata.getSchemas()) {
for (EntityContainer entityContainer : schema.getEntityContainers()) {
for (CommonFunctionImport functionImport : entityContainer.getFunctionImports()) {
functionImportInfos.add(
new EdmFunctionImportInfoImpl(entityContainer.getName(), functionImport.getName()));
}
}
}
}
}
return functionImportInfos;
}
@Override
public boolean equals(final Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);

View File

@ -42,9 +42,9 @@ import org.apache.olingo.odata4.client.api.edm.xml.EntityContainer;
import org.apache.olingo.odata4.client.api.edm.xml.v3.FunctionImport;
import org.apache.olingo.odata4.client.api.edm.xml.v4.Action;
import org.apache.olingo.odata4.client.api.edm.xml.v4.Function;
import org.apache.olingo.odata4.client.api.http.HttpMethod;
import org.apache.olingo.odata4.client.core.edm.v3.EdmActionProxy;
import org.apache.olingo.odata4.client.core.edm.v3.EdmFunctionProxy;
import org.apache.olingo.odata4.client.core.edm.v3.V3FunctionImportUtils;
import org.apache.olingo.odata4.commons.api.edm.EdmAction;
import org.apache.olingo.odata4.commons.api.edm.EdmComplexType;
import org.apache.olingo.odata4.commons.api.edm.EdmEntityContainer;
@ -164,12 +164,6 @@ public class EdmClientImpl extends AbstractEdmImpl {
return result;
}
private boolean canProxyFunction(final FunctionImport functionImport) {
return functionImport.getHttpMethod() == null
? !functionImport.isSideEffecting()
: HttpMethod.GET.name().equals(functionImport.getHttpMethod());
}
@Override
protected EdmAction createUnboundAction(final FullQualifiedName actionName) {
EdmAction result = null;
@ -194,7 +188,7 @@ public class EdmClientImpl extends AbstractEdmImpl {
boolean found = false;
for (final Iterator<FunctionImport> itor = functionImports.iterator(); itor.hasNext() && !found;) {
final FunctionImport functionImport = itor.next();
if (!canProxyFunction(functionImport) && !functionImport.isBindable()) {
if (!V3FunctionImportUtils.canProxyFunction(functionImport) && !functionImport.isBindable()) {
found = functionImport.getParameters().isEmpty();
result = EdmActionProxy.getInstance(this, actionName, functionImport);
}
@ -235,7 +229,7 @@ public class EdmClientImpl extends AbstractEdmImpl {
boolean found = false;
for (final Iterator<FunctionImport> itor = functionImports.iterator(); itor.hasNext() && !found;) {
final FunctionImport functionImport = itor.next();
if (canProxyFunction(functionImport) && !functionImport.isBindable()) {
if (V3FunctionImportUtils.canProxyFunction(functionImport) && !functionImport.isBindable()) {
final Set<String> functionParamNames = new HashSet<String>();
for (CommonParameter param : functionImport.getParameters()) {
functionParamNames.add(param.getName());
@ -283,7 +277,7 @@ public class EdmClientImpl extends AbstractEdmImpl {
boolean found = false;
for (final Iterator<FunctionImport> itor = functionImports.iterator(); itor.hasNext() && !found;) {
final FunctionImport functionImport = itor.next();
if (!canProxyFunction(functionImport) && functionImport.isBindable()) {
if (!V3FunctionImportUtils.canProxyFunction(functionImport) && functionImport.isBindable()) {
final EdmTypeInfo boundParam = new EdmTypeInfo(functionImport.getParameters().get(0).getType());
if (bindingParameterTypeName.equals(boundParam.getFullQualifiedName())
&& isBindingParameterCollection.booleanValue() == boundParam.isCollection()) {
@ -337,7 +331,7 @@ public class EdmClientImpl extends AbstractEdmImpl {
boolean found = false;
for (final Iterator<FunctionImport> itor = functionImports.iterator(); itor.hasNext() && !found;) {
final FunctionImport functionImport = itor.next();
if (!canProxyFunction(functionImport) && functionImport.isBindable()) {
if (!V3FunctionImportUtils.canProxyFunction(functionImport) && functionImport.isBindable()) {
final EdmTypeInfo boundParam = new EdmTypeInfo(functionImport.getParameters().get(0).getType());
if (bindingParameterTypeName.equals(boundParam.getFullQualifiedName())
&& isBindingParameterCollection.booleanValue() == boundParam.isCollection()) {

View File

@ -18,13 +18,21 @@
*/
package org.apache.olingo.odata4.client.core.edm.v3;
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.odata4.client.api.UnsupportedInV3Exception;
import org.apache.olingo.odata4.client.api.edm.xml.CommonFunctionImport;
import org.apache.olingo.odata4.client.api.edm.xml.EntityContainer;
import org.apache.olingo.odata4.client.api.edm.xml.Schema;
import org.apache.olingo.odata4.client.api.edm.xml.v3.FunctionImport;
import org.apache.olingo.odata4.client.core.edm.AbstractEdmServiceMetadataImpl;
import org.apache.olingo.odata4.client.core.edm.xml.v3.XMLMetadataImpl;
import org.apache.olingo.odata4.commons.api.edm.EdmActionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmSingletonInfo;
import org.apache.olingo.odata4.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.odata4.commons.core.edm.EdmActionImportInfoImpl;
import org.apache.olingo.odata4.commons.core.edm.EdmFunctionImportInfoImpl;
public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
@ -44,9 +52,46 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
throw new UnsupportedInV3Exception();
}
@Override
public List<EdmFunctionImportInfo> getFunctionImportInfos() {
synchronized (this) {
if (functionImportInfos == null) {
functionImportInfos = new ArrayList<EdmFunctionImportInfo>();
for (Schema schema : xmlMetadata.getSchemas()) {
for (EntityContainer entityContainer : schema.getEntityContainers()) {
for (CommonFunctionImport functionImport : entityContainer.getFunctionImports()) {
final FunctionImport _funFunctionImport = (FunctionImport) functionImport;
if (V3FunctionImportUtils.canProxyFunction(_funFunctionImport)) {
functionImportInfos.add(
new EdmFunctionImportInfoImpl(entityContainer.getName(), functionImport.getName()));
}
}
}
}
}
return functionImportInfos;
}
}
@Override
public List<EdmActionImportInfo> getActionImportInfos() {
throw new UnsupportedInV3Exception();
synchronized (this) {
if (actionImportInfos == null) {
actionImportInfos = new ArrayList<EdmActionImportInfo>();
for (Schema schema : xmlMetadata.getSchemas()) {
for (EntityContainer entityContainer : schema.getEntityContainers()) {
for (CommonFunctionImport functionImport : entityContainer.getFunctionImports()) {
final FunctionImport _funFunctionImport = (FunctionImport) functionImport;
if (!V3FunctionImportUtils.canProxyFunction(_funFunctionImport)) {
actionImportInfos.add(
new EdmActionImportInfoImpl(entityContainer.getName(), functionImport.getName()));
}
}
}
}
}
return actionImportInfos;
}
}
}

View File

@ -0,0 +1,36 @@
/*
* 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.odata4.client.core.edm.v3;
import org.apache.olingo.odata4.client.api.edm.xml.v3.FunctionImport;
import org.apache.olingo.odata4.client.api.http.HttpMethod;
public final class V3FunctionImportUtils {
public static boolean canProxyFunction(final FunctionImport functionImport) {
return functionImport.getHttpMethod() == null
? !functionImport.isSideEffecting()
: HttpMethod.GET.name().equals(functionImport.getHttpMethod());
}
private V3FunctionImportUtils() {
// empty constructor for static utility classes
}
}

View File

@ -20,6 +20,7 @@ package org.apache.olingo.odata4.client.core.edm.v4;
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.odata4.client.api.edm.xml.CommonFunctionImport;
import org.apache.olingo.odata4.client.api.edm.xml.Schema;
import org.apache.olingo.odata4.client.api.edm.xml.v4.ActionImport;
import org.apache.olingo.odata4.client.api.edm.xml.v4.EntityContainer;
@ -27,9 +28,11 @@ import org.apache.olingo.odata4.client.api.edm.xml.v4.Singleton;
import org.apache.olingo.odata4.client.core.edm.AbstractEdmServiceMetadataImpl;
import org.apache.olingo.odata4.client.core.edm.xml.v4.XMLMetadataImpl;
import org.apache.olingo.odata4.commons.api.edm.EdmActionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmSingletonInfo;
import org.apache.olingo.odata4.commons.api.edm.constants.ODataServiceVersion;
import org.apache.olingo.odata4.commons.core.edm.EdmActionImportInfoImpl;
import org.apache.olingo.odata4.commons.core.edm.EdmFunctionImportInfoImpl;
import org.apache.olingo.odata4.commons.core.edm.EdmSingletonInfoImpl;
public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
@ -65,6 +68,24 @@ public class EdmServiceMetadataImpl extends AbstractEdmServiceMetadataImpl {
}
}
@Override
public List<EdmFunctionImportInfo> getFunctionImportInfos() {
synchronized (this) {
if (functionImportInfos == null) {
functionImportInfos = new ArrayList<EdmFunctionImportInfo>();
for (Schema schema : xmlMetadata.getSchemas()) {
for (org.apache.olingo.odata4.client.api.edm.xml.EntityContainer entityContainer : schema.getEntityContainers()) {
for (CommonFunctionImport functionImport : entityContainer.getFunctionImports()) {
functionImportInfos.add(
new EdmFunctionImportInfoImpl(entityContainer.getName(), functionImport.getName()));
}
}
}
}
}
return functionImportInfos;
}
@Override
public List<EdmActionImportInfo> getActionImportInfos() {
synchronized (this) {

View File

@ -19,6 +19,7 @@
package org.apache.olingo.odata4.client.core.v3;
import java.util.Arrays;
import java.util.HashSet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@ -26,6 +27,7 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Set;
import org.apache.olingo.odata4.client.api.edm.xml.EntityContainer;
import org.apache.olingo.odata4.client.api.edm.xml.EntityType;
import org.apache.olingo.odata4.client.api.edm.xml.Schema;
@ -37,11 +39,13 @@ import org.apache.olingo.odata4.client.core.edm.xml.v3.XMLMetadataImpl;
import org.apache.olingo.odata4.commons.api.edm.Edm;
import org.apache.olingo.odata4.commons.api.edm.EdmAction;
import org.apache.olingo.odata4.commons.api.edm.EdmActionImport;
import org.apache.olingo.odata4.commons.api.edm.EdmActionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.EdmComplexType;
import org.apache.olingo.odata4.commons.api.edm.EdmEntityContainer;
import org.apache.olingo.odata4.commons.api.edm.EdmEntityType;
import org.apache.olingo.odata4.commons.api.edm.EdmFunction;
import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImport;
import org.apache.olingo.odata4.commons.api.edm.EdmFunctionImportInfo;
import org.apache.olingo.odata4.commons.api.edm.FullQualifiedName;
import org.apache.olingo.odata4.commons.core.edm.primitivetype.EdmPrimitiveTypeKind;
import org.junit.Test;
@ -139,6 +143,31 @@ public class MetadataTest extends AbstractTest {
readMetadata(getClass().getResourceAsStream("metadata.xml"));
assertNotNull(metadata);
final Set<String> actionImports = new HashSet<String>();
for (EdmActionImportInfo info : metadata.getServiceMetadata().getActionImportInfos()) {
actionImports.add(info.getActionImportName());
}
final Set<String> expectedAI = new HashSet<String>(Arrays.asList(new String[]{
"ResetDataSource",
"IncreaseSalaries",
"Sack",
"GetComputer",
"ChangeProductDimensions",
"ResetComputerDetailsSpecifications"}));
assertEquals(expectedAI, actionImports);
final Set<String> functionImports = new HashSet<String>();
for (EdmFunctionImportInfo info : metadata.getServiceMetadata().getFunctionImportInfos()) {
functionImports.add(info.getFunctionImportName());
}
final Set<String> expectedFI = new HashSet<String>(Arrays.asList(new String[]{
"GetPrimitiveString",
"GetSpecificCustomer",
"GetCustomerCount",
"GetArgumentPlusOne",
"EntityProjectionReturnsCollectionOfComplexTypes",
"InStreamErrorGetCustomer"}));
assertEquals(expectedFI, functionImports);
final EdmEntityContainer container = metadata.getEntityContainer(
new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService", "DefaultContainer"));
assertNotNull(container);