Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Generator/Generator.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<ItemGroup>
<PackageReference Include="AngleSharp.Xml" Version="1.0.0" />
<PackageReference Include="Relewise.Client" Version="1.259.0" />
<PackageReference Include="Relewise.Client" Version="1.280.0" />
</ItemGroup>

</Project>
119 changes: 112 additions & 7 deletions Generator/JavaWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,13 @@ public void ClearFolder()

public JavaWriter(Assembly assembly, string basePath, XmlDocumentation xmlDocumentation)
{
_javaTypeWriters = new List<IJavaTypeWriter> { new JavaKeyValuePairWriter(this), new JavaEnumWriter(this), new JavaInterfaceWriter(this), new JavaClassWriter(this) };
_javaTypeWriters =
[
new JavaKeyValuePairWriter(this),
new JavaEnumWriter(this),
new JavaInterfaceWriter(this),
new JavaClassWriter(this)
];
_javaTypeResolver = new JavaTypeResolver(assembly);
Assembly = assembly;
BasePath = basePath;
Expand All @@ -47,19 +53,19 @@ public JavaWriter(Assembly assembly, string basePath, XmlDocumentation xmlDocume

public void WriteTypes(IEnumerable<Type> types)
{
foreach (var type in types)
foreach (Type type in types)
{
_javaTypeResolver.TypesToGenerate.Enqueue(type);
}

while (_javaTypeResolver.TypesToGenerate.Count > 0)
{
var type = _javaTypeResolver.TypesToGenerate.Dequeue();
Type type = _javaTypeResolver.TypesToGenerate.Dequeue();

if (type == typeof(object) || type == typeof(ValueType) || type == typeof(Enum))
continue;

var potentialNullableTypeName = TypeName(type);
string potentialNullableTypeName = TypeName(type);
string typeName = potentialNullableTypeName.RemoveNullable();

if (_javaTypeResolver.IsWritten(typeName)) continue;
Expand All @@ -69,10 +75,12 @@ public void WriteTypes(IEnumerable<Type> types)
continue;
}

DiscoverReferencedTypesFromSignatures(type);

using var streamWriter = File.CreateText($"{ModelsPath}{typeName}.java");
using var writer = new IndentedTextWriter(streamWriter);

var javaTypeWriter = _javaTypeWriters.FirstOrDefault(w => w.CanWrite(type));
IJavaTypeWriter? javaTypeWriter = _javaTypeWriters.FirstOrDefault(w => w.CanWrite(type));
if (javaTypeWriter is null)
{
MissingTypeDefinitions.Add(type);
Expand All @@ -85,17 +93,114 @@ public void WriteTypes(IEnumerable<Type> types)
}
}

private void DiscoverReferencedTypesFromSignatures(Type type)
{
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly;

foreach (var constructor in type.GetConstructors(flags))
{
foreach (var parameter in constructor.GetParameters())
{
DiscoverReferencedType(parameter.ParameterType);
}
}

foreach (var method in type.GetMethods(flags))
{
// Keep property/event accessors out of traversal, but include conversion operators.
if (method.IsSpecialName && method.Name is not "op_Implicit" and not "op_Explicit")
{
continue;
}
if (method.IsGenericMethodDefinition || method.ContainsGenericParameters)
{
continue;
}

DiscoverReferencedType(method.ReturnType);

foreach (var parameter in method.GetParameters())
{
DiscoverReferencedType(parameter.ParameterType);
}
}
}

private void DiscoverReferencedType(Type type)
{
if (type == typeof(void))
{
return;
}
if (type.ContainsGenericParameters)
{
return;
}

if (type.IsByRef || type.IsPointer)
{
if (type.GetElementType() is { } elementType)
{
DiscoverReferencedType(elementType);
}
return;
}

if (type.IsArray)
{
if (type.GetElementType() is { } elementType)
{
DiscoverReferencedType(elementType);
}
return;
}

if (type.IsGenericType || type.IsGenericTypeDefinition)
{
foreach (var genericArgument in type.GetGenericArguments())
{
if (genericArgument.IsGenericParameter)
{
foreach (var constraint in genericArgument.GetGenericParameterConstraints())
{
DiscoverReferencedType(constraint);
}
}
else
{
DiscoverReferencedType(genericArgument);
}
}
}

if (type.IsGenericParameter)
{
foreach (var constraint in type.GetGenericParameterConstraints())
{
DiscoverReferencedType(constraint);
}
return;
}

if (type.IsGenericTypeDefinition || type.Assembly != Assembly)
{
return;
}

TypeName(type);
}

public string TypeName(Type type) => _javaTypeResolver.ResolveType(type);

public string TypeName(PropertyInfo property)
{
var typeName = TypeName(property.PropertyType);
string typeName = TypeName(property.PropertyType);
return PrependNullableIfApplicable(typeName, new NullabilityInfoContext().Create(property));
}

public string TypeName(ParameterInfo property)
{
var typeName = TypeName(property.ParameterType);
string typeName = TypeName(property.ParameterType);
return PrependNullableIfApplicable(typeName, new NullabilityInfoContext().Create(property));
}

Expand Down
4 changes: 4 additions & 0 deletions src/src/main/java/com/relewise/client/Tracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ public void track(TrackSearchTermRequest trackingRequest) throws IOException, In
makeRequestAndValidate("TrackSearchTermRequest", trackingRequest, Void.class);
}

public void track(TrackUserAdministrativeActionRequest trackingRequest) throws IOException, InterruptedException, ClientException {
makeRequestAndValidate("TrackUserAdministrativeActionRequest", trackingRequest, Void.class);
}

public void track(TrackUserUpdateRequest trackingRequest) throws IOException, InterruptedException, ClientException {
makeRequestAndValidate("TrackUserUpdateRequest", trackingRequest, Void.class);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.relewise.client.model;

import com.fasterxml.jackson.annotation.*;
import javax.annotation.Nullable;
import java.io.IOException;
import java.time.Duration;
import java.time.OffsetDateTime;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Arrays;
import java.util.UUID;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.HashSet;

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "$type",
defaultImpl = AbandonedCartTriggerResultTriggerResultResponse.class)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AbandonedCartTriggerResultTriggerResultResponse extends TimedResponse
{
public String $type = "Relewise.Client.Responses.Triggers.TriggerResultResponse`1[[Relewise.Client.Responses.Triggers.Results.AbandonedCartTriggerResult, Relewise.Client, Version=1.280.0.0, Culture=neutral, PublicKeyToken=null]], Relewise.Client";
public AbandonedCartTriggerResult result;
public static AbandonedCartTriggerResultTriggerResultResponse create()
{
return new AbandonedCartTriggerResultTriggerResultResponse();
}
public AbandonedCartTriggerResultTriggerResultResponse()
{
}
public AbandonedCartTriggerResult getResult()
{
return this.result;
}
public AbandonedCartTriggerResultTriggerResultResponse setResult(AbandonedCartTriggerResult result)
{
this.result = result;
return this;
}
@Override
public AbandonedCartTriggerResultTriggerResultResponse setStatistics(Statistics statistics)
{
this.statistics = statistics;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.relewise.client.model;

import com.fasterxml.jackson.annotation.*;
import javax.annotation.Nullable;
import java.io.IOException;
import java.time.Duration;
import java.time.OffsetDateTime;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Arrays;
import java.util.UUID;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.HashSet;

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "$type",
defaultImpl = AbandonedSearchTriggerResultTriggerResultResponse.class)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AbandonedSearchTriggerResultTriggerResultResponse extends TimedResponse
{
public String $type = "Relewise.Client.Responses.Triggers.TriggerResultResponse`1[[Relewise.Client.Responses.Triggers.Results.AbandonedSearchTriggerResult, Relewise.Client, Version=1.280.0.0, Culture=neutral, PublicKeyToken=null]], Relewise.Client";
public AbandonedSearchTriggerResult result;
public static AbandonedSearchTriggerResultTriggerResultResponse create()
{
return new AbandonedSearchTriggerResultTriggerResultResponse();
}
public AbandonedSearchTriggerResultTriggerResultResponse()
{
}
public AbandonedSearchTriggerResult getResult()
{
return this.result;
}
public AbandonedSearchTriggerResultTriggerResultResponse setResult(AbandonedSearchTriggerResult result)
{
this.result = result;
return this;
}
@Override
public AbandonedSearchTriggerResultTriggerResultResponse setStatistics(Statistics statistics)
{
this.statistics = statistics;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.relewise.client.model;

import com.fasterxml.jackson.annotation.*;
import javax.annotation.Nullable;
import java.io.IOException;
import java.time.Duration;
import java.time.OffsetDateTime;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Arrays;
import java.util.UUID;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.HashSet;

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "$type",
defaultImpl = AuthenticatedIdCondition.class)
@JsonIgnoreProperties(ignoreUnknown = true)
public class AuthenticatedIdCondition extends UserCondition
{
public String $type = "Relewise.Client.DataTypes.UserConditions.AuthenticatedIdCondition, Relewise.Client";
public ArrayList<String> authenticatedIds;
public static AuthenticatedIdCondition create()
{
return new AuthenticatedIdCondition();
}
public AuthenticatedIdCondition()
{
this.negated = false;
}
public static AuthenticatedIdCondition create(Boolean negated)
{
return new AuthenticatedIdCondition(negated);
}
public AuthenticatedIdCondition(Boolean negated)
{
this.negated = negated;
}
public ArrayList<String> getAuthenticatedIds()
{
return this.authenticatedIds;
}
public AuthenticatedIdCondition setAuthenticatedIds(String... authenticatedIds)
{
this.authenticatedIds = new ArrayList<>(Arrays.asList(authenticatedIds));;
return this;
}
public AuthenticatedIdCondition addToAuthenticatedIds(String authenticatedIds)
{
if (this.authenticatedIds == null)
{
this.authenticatedIds = new ArrayList<>();
}
this.authenticatedIds.add(authenticatedIds);
return this;
}
@Override
public AuthenticatedIdCondition setNegated(Boolean negated)
{
this.negated = negated;
return this;
}
}
Loading