use of com.github.davidmoten.odata.client.Context in project odata-client by davidmoten.
the class RequestHelper method uploader.
public static Optional<StreamUploaderSingleCall> uploader(ContextPath contextPath, ODataType item, String fieldName, HttpMethod method) {
Preconditions.checkNotNull(fieldName);
String editLink = (String) item.getUnmappedFields().get(fieldName + "@odata.mediaEditLink");
String contentType = (String) item.getUnmappedFields().get(fieldName + "@odata.mediaContentType");
if (editLink == null) {
return Optional.empty();
} else {
// TODO support relative editLink?
Context context = contextPath.context();
if (contentType == null) {
contentType = CONTENT_TYPE_APPLICATION_OCTET_STREAM;
}
Path path = new Path(editLink, contextPath.path().style());
return Optional.of(new StreamUploaderSingleCall(new ContextPath(context, path), contentType, method));
}
}
use of com.github.davidmoten.odata.client.Context in project odata-client by davidmoten.
the class Generator method writeContainer.
private void writeContainer(Schema schema, TEntityContainer t) {
names.getDirectoryContainer(schema).mkdirs();
String simpleClassName = names.getSimpleClassNameContainer(schema, t.getName());
Imports imports = new Imports(names.getFullClassNameContainer(schema, t.getName()));
Indent indent = new Indent();
StringWriter w = new StringWriter();
try (PrintWriter p = new PrintWriter(w)) {
p.format("package %s;\n\n", names.getPackageContainer(schema));
p.format(IMPORTSHERE);
final String extension;
if (t.getExtends() != null) {
extension = " extends " + imports.add(names.getFullClassNameFromTypeWithNamespace(t.getExtends()));
} else {
extension = "";
}
p.format("public final class %s%s implements %s {\n\n", simpleClassName, extension, imports.add(HasContext.class));
// TODO handle container extension
// write fields
p.format("%sprivate final %s contextPath;\n\n", indent.right(), imports.add(ContextPath.class));
// write constructor
p.format("%spublic %s(%s context) {\n", indent, simpleClassName, imports.add(Context.class));
p.format("%sthis.contextPath = new %s(context, context.service().getBasePath());\n", indent.right(), imports.add(ContextPath.class));
p.format("%s}\n", indent.left());
p.format("\n%s@%s\n", indent, imports.add(Override.class));
p.format("%spublic %s _context() {\n", indent, imports.add(Context.class));
p.format("%sreturn contextPath.context();\n", indent.right());
p.format("%s}\n", indent.left());
p.format("\n%spublic %s _service() {\n", indent, imports.add(HttpService.class));
p.format("%sreturn contextPath.context().service();\n", indent.right());
p.format("%s}\n", indent.left());
// write static testing method
p.format("\n%sstatic final class ContainerBuilderImpl extends %s<%s> {\n", indent, imports.add(ContainerBuilder.class), simpleClassName);
p.format("\n%s@%s\n", indent.right(), imports.add(Override.class));
p.format("%spublic %s _create(%s context) {\n", indent, simpleClassName, imports.add(Context.class));
p.format("%sreturn new %s(context);\n", indent.right(), simpleClassName);
p.format("%s}\n", indent.left());
p.format("%s}\n", indent.left());
p.format("\n%spublic static %s<%s<%s>, %s> test() {\n", indent, imports.add(BuilderBase.class), imports.add(ContainerBuilder.class), simpleClassName, simpleClassName);
p.format("%sreturn new ContainerBuilderImpl();\n", indent.right());
p.format("%s}\n", indent.left());
// write get methods from properties
//
Util.filter(t.getEntitySetOrActionImportOrFunctionImport(), TEntitySet.class).forEach(x -> {
Schema sch = names.getSchema(x.getEntityType());
boolean addedWithEmptyKeys = false;
if (names.isEntityWithNamespace(x.getEntityType())) {
String entityRequestType = names.getFullClassNameEntityRequestFromTypeWithNamespace(sch, x.getEntityType());
EntityType et = names.getEntityType(x.getEntityType());
KeyInfo k = getKeyInfo(et, imports);
p.format("\n%spublic %s %s(%s) {\n", indent, imports.add(entityRequestType), Names.getIdentifier(x.getName()), k.typedParams);
p.format("%sreturn new %s(contextPath.addSegment(\"%s\")%s, %s.empty());\n", indent.right(), imports.add(entityRequestType), x.getName(), k.addKeys, imports.add(Optional.class));
p.format("%s}\n", indent.left());
addedWithEmptyKeys = k.isEmpty();
}
if (!addedWithEmptyKeys) {
// don't add a collection method if there were no keys for the entity
EntitySet es = new EntitySet(schema, t, x, names);
p.format("\n%spublic %s %s() {\n", indent, imports.add(es.getFullClassNameEntitySet()), Names.getIdentifier(x.getName()));
p.format("%sreturn new %s(\n", indent.right(), imports.add(es.getFullClassNameEntitySet()));
p.format("%scontextPath.addSegment(\"%s\"));\n", indent.right().right().right().right(), x.getName());
p.format("%s}\n", indent.left().left().left().left().left());
}
});
//
Util.filter(t.getEntitySetOrActionImportOrFunctionImport(), //
TSingleton.class).forEach(x -> {
String importedType = toClassName(x, imports);
p.format("\n%spublic %s %s() {\n", indent, importedType, Names.getIdentifier(x.getName()));
p.format("%sreturn new %s(contextPath.addSegment(\"%s\"), %s.empty());\n", indent.right(), importedType, x.getName(), imports.add(Optional.class));
p.format("%s}\n", indent.left());
});
// write unbound actions
Set<String> methodNames = new HashSet<>();
//
Util.types(schema, //
TAction.class).filter(x -> !x.isIsBound()).forEach(x -> writeAction(imports, indent, p, new Action(x, names), methodNames));
//
Util.types(schema, //
TFunction.class).filter(x -> !x.isIsBound()).forEach(x -> writeFunction(imports, indent, p, new Function(x, names), methodNames));
p.format("\n}\n");
File classFile = names.getClassFileContainer(schema, t.getName());
writeToFile(imports, w, classFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
use of com.github.davidmoten.odata.client.Context in project odata-client by davidmoten.
the class RequestHelper method createStreamForEdmStream.
public static Optional<StreamProvider> createStreamForEdmStream(ContextPath contextPath, ODataType item, String fieldName, String base64) {
Preconditions.checkNotNull(fieldName);
String readLink = (String) item.getUnmappedFields().get(fieldName + "@odata.mediaReadLink");
String contentType = (String) item.getUnmappedFields().get(fieldName + "@odata.mediaContentType");
if (readLink == null && base64 == null) {
return Optional.empty();
} else {
if (contentType == null) {
contentType = CONTENT_TYPE_APPLICATION_OCTET_STREAM;
}
// TODO support relative editLink?
Context context = contextPath.context();
// path won't be used if readLink is null because base64 is not null
// $value is not appended for a stream property
Path path = new Path(readLink, contextPath.path().style());
return Optional.of(new //
StreamProvider(//
new ContextPath(context, path), //
RequestOptions.EMPTY, //
contentType, base64));
}
}
use of com.github.davidmoten.odata.client.Context in project odata-client by davidmoten.
the class RequestHelper method createStream.
// for HasStream case (only for entities, not for complexTypes)
public static Optional<StreamProvider> createStream(ContextPath contextPath, ODataEntityType entity) {
String editLink;
String contentType;
if (entity == null) {
editLink = null;
contentType = null;
} else {
editLink = (String) entity.getUnmappedFields().get("@odata.mediaEditLink");
if (editLink == null) {
editLink = (String) entity.getUnmappedFields().get("@odata.editLink");
}
contentType = (String) entity.getUnmappedFields().get("@odata.mediaContentType");
}
if (editLink == null && contextPath.context().propertyIsFalse(Properties.ATTEMPT_STREAM_WHEN_NO_METADATA)) {
return Optional.empty();
} else {
if (contentType == null) {
contentType = CONTENT_TYPE_APPLICATION_OCTET_STREAM;
}
// TODO support relative editLink?
Context context = contextPath.context();
if (editLink == null) {
editLink = contextPath.toUrl();
}
if (!editLink.startsWith(HTTPS)) {
// TODO should use the base path from @odata.context field?
editLink = concatenate(contextPath.context().service().getBasePath().toUrl(), editLink);
}
if (contextPath.context().propertyIsTrue(Properties.MODIFY_STREAM_EDIT_LINK) && entity != null) {
// Bug fix for Microsoft Graph only?
// When a collection is returned the editLink is terminated with the subclass if
// the collection type has subclasses. For example when a collection of
// Attachment (with full metadata) is requested the editLink of an individual
// attachment may end in /itemAttachment to indicate the type of the attachment.
// To get the $value download working we need to remove that type cast.
int i = endsWith(editLink, "/" + entity.odataTypeName());
if (i == -1) {
i = endsWith(editLink, "/" + entity.odataTypeName() + "/$value");
}
if (i == -1) {
i = endsWith(editLink, "/" + entity.odataTypeName() + "/%24value");
}
if (i != -1) {
editLink = editLink.substring(0, i);
}
}
Path path = new Path(editLink, contextPath.path().style());
if (!path.toUrl().endsWith("/$value")) {
path = path.addSegment("$value");
}
return Optional.of(new //
StreamProvider(//
new ContextPath(context, path), //
RequestOptions.EMPTY, //
contentType, null));
}
}
use of com.github.davidmoten.odata.client.Context in project odata-client by davidmoten.
the class MicrosoftClientBuilder method createService.
@SuppressWarnings("resource")
private static <T> T createService(String baseUrl, Authenticator authenticator, //
long connectTimeoutMs, //
long readTimeoutMs, //
Optional<String> proxyHost, //
Optional<Integer> proxyPort, Optional<String> proxyUsername, Optional<String> proxyPassword, Optional<Supplier<CloseableHttpClient>> supplier, Optional<Function<HttpClientBuilder, HttpClientBuilder>> httpClientBuilderExtras, //
Creator<T> creator, //
String authenticationEndpoint, //
Function<? super HttpService, ? extends HttpService> httpServiceTransformer, List<SchemaInfo> schemas, PathStyle pathStyle) {
final Supplier<CloseableHttpClient> clientSupplier = createClientSupplier(connectTimeoutMs, readTimeoutMs, proxyHost, proxyPort, proxyUsername, proxyPassword, supplier, httpClientBuilderExtras);
Path basePath = new Path(baseUrl, pathStyle);
HttpService httpService = new //
ApacheHttpClientHttpService(//
basePath, //
clientSupplier, authenticator::authenticate);
httpService = httpServiceTransformer.apply(httpService);
return creator.create(new Context(Serializer.INSTANCE, httpService, createProperties(), schemas));
}
Aggregations