You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/06/24 06:57:47 UTC
[22/23] git commit: [OLINGO-326] URIbuilder issue on android,
and uri format issue of addressing derived types
[OLINGO-326] URIbuilder issue on android, and uri format issue of addressing derived types
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/1e8ad44a
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/1e8ad44a
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/1e8ad44a
Branch: refs/heads/clientjune
Commit: 1e8ad44a00ad68a63b2996582096621c887b3f19
Parents: b15439f
Author: challenh <ch...@microsoft.com>
Authored: Tue Jun 17 10:32:44 2014 +0800
Committer: challenh <ch...@microsoft.com>
Committed: Tue Jun 17 10:32:44 2014 +0800
----------------------------------------------------------------------
.../olingo/ext/proxy/commons/FilterImpl.java | 10 +++--
.../olingo/client/api/CommonConfiguration.java | 25 ++++++++++++
.../client/core/AbstractConfiguration.java | 12 ++++++
.../client/core/uri/AbstractURIBuilder.java | 41 +++++++++++++-------
4 files changed, 71 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1e8ad44a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/FilterImpl.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/FilterImpl.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/FilterImpl.java
index 42ce646..f328ac7 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/FilterImpl.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/FilterImpl.java
@@ -150,10 +150,12 @@ public class FilterImpl<T extends Serializable, EC extends AbstractEntityCollect
@Override
public EC getResult() {
- final CommonURIBuilder<?> uriBuilder = client.newURIBuilder(this.baseURI.toASCIIString()).
- appendDerivedEntityTypeSegment(new FullQualifiedName(
- ClassUtils.getNamespace(typeRef), ClassUtils.getEntityTypeName(typeRef)).toString());
-
+ CommonURIBuilder<?> uriBuilder = client.newURIBuilder(this.baseURI.toASCIIString());
+
+ if(this.client.getConfiguration().isAddressingDerivedTypes()){
+ uriBuilder = uriBuilder.appendDerivedEntityTypeSegment(new FullQualifiedName(
+ ClassUtils.getNamespace(typeRef), ClassUtils.getEntityTypeName(typeRef)).toString());
+ }
if (StringUtils.isNotBlank(filter)) {
uriBuilder.filter(filter);
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1e8ad44a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java
index 2e3a0d8..46f12b3 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/CommonConfiguration.java
@@ -203,6 +203,31 @@ public interface CommonConfiguration extends Serializable {
void setKeyAsSegment(boolean value);
/**
+ * Gets whether query URIs in request should contain fully qualified type name.
+ * - OData Intermediate Conformance Level:
+ * MUST support casting to a derived type according to [OData-URL] if derived types are present in the model.
+ * <br/>
+ * Example: http://host/service/Customers/Model.VipCustomer(102) or
+ * http://host/service/Customers/Model.VipCustomer
+ *
+ * @return whether query URIs in request should contain fully qualified type name.
+ * segment.
+ */
+ boolean isAddressingDerivedTypes() ;
+
+ /**
+ * Sets whether query URIs in request should contain fully qualified type name.
+ * - OData Intermediate Conformance Level:
+ * MUST support casting to a derived type according to [OData-URL] if derived types are present in the model.
+ * <br/>
+ * Example: http://host/service/Customers/Model.VipCustomer(102) or
+ * http://host/service/Customers/Model.VipCustomer
+ *
+ * @param value 'TRUE' to use this feature.
+ */
+ void setAddressingDerivedTypes(final boolean value);
+
+ /**
* Retrieves request executor service.
*
* @return request executor service.
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1e8ad44a/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java
index dc9ee6c..888452a 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/AbstractConfiguration.java
@@ -51,6 +51,8 @@ public abstract class AbstractConfiguration implements CommonConfiguration {
private static final String USE_XHTTP_METHOD = "useHTTPMethod";
private static final String KEY_AS_SEGMENT = "keyAsSegment";
+
+ private static final String ADDRESS_DERIVED_TYPE = "addressDerivedType";
private static final String GZIP_COMPRESSION = "gzipCompression";
@@ -213,6 +215,16 @@ public abstract class AbstractConfiguration implements CommonConfiguration {
}
@Override
+ public boolean isAddressingDerivedTypes() {
+ return (Boolean) getProperty(ADDRESS_DERIVED_TYPE, true);
+ }
+
+ @Override
+ public void setAddressingDerivedTypes(final boolean value) {
+ setProperty(ADDRESS_DERIVED_TYPE, value);
+ }
+
+ @Override
public ExecutorService getExecutor() {
return executor;
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/1e8ad44a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java
index 5b0b533..7a7c630 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/AbstractURIBuilder.java
@@ -24,9 +24,14 @@ import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.LinkedHashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+
import org.apache.commons.lang3.StringUtils;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.message.BasicNameValuePair;
import org.apache.olingo.client.api.CommonConfiguration;
import org.apache.olingo.client.api.uri.CommonURIBuilder;
import org.apache.olingo.client.api.uri.QueryOption;
@@ -269,7 +274,9 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme
break;
default:
- segmentsBuilder.append('/');
+ if(segmentsBuilder.length() > 0 && segmentsBuilder.charAt(segmentsBuilder.length()-1) != '/') {
+ segmentsBuilder.append('/');
+ }
}
}
@@ -284,19 +291,27 @@ public abstract class AbstractURIBuilder<UB extends CommonURIBuilder<?>> impleme
}
try {
- final org.apache.http.client.utils.URIBuilder builder =
- new org.apache.http.client.utils.URIBuilder(segmentsBuilder.toString());
-
- for (Map.Entry<String, String> option : queryOptions.entrySet()) {
- builder.addParameter("$" + option.getKey(), option.getValue());
+ StringBuilder sb = segmentsBuilder;
+ if((queryOptions.size() + parameters.size()) > 0){
+ sb.append("?");
+ List<NameValuePair> list1 = new LinkedList<NameValuePair>();
+ for (Map.Entry<String, String> option : queryOptions.entrySet()) {
+ list1.add(new BasicNameValuePair("$" + option.getKey(), option.getValue()));
+ }
+ for (Map.Entry<String, String> parameter : parameters.entrySet()) {
+ list1.add(new BasicNameValuePair("@" + parameter.getKey(), parameter.getValue()));
+ }
+
+ // don't use UriBuilder.build():
+ // it will try to call URLEncodedUtils.format(Iterable<>,Charset) method,
+ // which works in desktop java application, however, throws NoSuchMethodError in android OS,
+ // so here manually construct the URL by its overload URLEncodedUtils.format(List<>,String).
+ String queryStr = URLEncodedUtils.format(list1, "UTF-8");
+ sb.append(queryStr);
}
-
- for (Map.Entry<String, String> parameter : parameters.entrySet()) {
- builder.addParameter("@" + parameter.getKey(), parameter.getValue());
- }
-
- return builder.build().normalize();
- } catch (URISyntaxException e) {
+
+ return URI.create(sb.toString());
+ } catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Could not build valid URI", e);
}
}