Search in sources :

Example 1 with TypeToken

use of io.cdap.cdap.internal.guava.reflect.TypeToken in project cdap by caskdata.

the class ReflectionSchemaGenerator method generateRecord.

@Override
protected Schema generateRecord(TypeToken<?> typeToken, Set<String> knowRecords, boolean acceptRecursion) throws UnsupportedTypeException {
    String recordName = typeToken.getRawType().getName();
    Map<String, TypeToken<?>> recordFieldTypes = typeToken.getRawType().isInterface() ? collectByMethods(typeToken, new TreeMap<>()) : collectByFields(typeToken, new TreeMap<>());
    // Recursively generate field type schema.
    List<Schema.Field> fields = new ArrayList<>();
    for (Map.Entry<String, TypeToken<?>> fieldType : recordFieldTypes.entrySet()) {
        Set<String> records = new HashSet<>(knowRecords);
        records.add(recordName);
        Schema fieldSchema = doGenerate(fieldType.getValue(), records, acceptRecursion);
        if (!fieldType.getValue().getRawType().isPrimitive()) {
            boolean isNotNull = typeToken.getRawType().isAnnotationPresent(Nonnull.class);
            boolean isNull = typeToken.getRawType().isAnnotationPresent(Nullable.class);
            // ii) if it is not nullable by default and nullable annotation is present
            if ((isNullableByDefault && !isNotNull) || (!isNullableByDefault && isNull)) {
                fieldSchema = Schema.unionOf(fieldSchema, Schema.of(Schema.Type.NULL));
            }
        }
        fields.add(Schema.Field.of(fieldType.getKey(), fieldSchema));
    }
    return Schema.recordOf(recordName, Collections.unmodifiableList(fields));
}
Also used : Schema(io.cdap.cdap.api.data.schema.Schema) ArrayList(java.util.ArrayList) TreeMap(java.util.TreeMap) Field(java.lang.reflect.Field) TypeToken(io.cdap.cdap.internal.guava.reflect.TypeToken) TreeMap(java.util.TreeMap) Map(java.util.Map) HashSet(java.util.HashSet)

Example 2 with TypeToken

use of io.cdap.cdap.internal.guava.reflect.TypeToken in project cdap by caskdata.

the class AdminAppTestRun method testAdminService.

@Test
public void testAdminService() throws Exception {
    // Start the service
    ServiceManager serviceManager = appManager.getServiceManager(AdminApp.SERVICE_NAME).start();
    String namespaceX = "x";
    try {
        URI serviceURI = serviceManager.getServiceURL(10, TimeUnit.SECONDS).toURI();
        // dataset nn should not exist
        HttpResponse response = executeHttp(HttpRequest.get(serviceURI.resolve("exists/nn").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        Assert.assertEquals("false", response.getResponseBodyAsString());
        // create nn as a table
        response = executeHttp(HttpRequest.put(serviceURI.resolve("create/nn/table").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        // now nn should exist
        response = executeHttp(HttpRequest.get(serviceURI.resolve("exists/nn").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        Assert.assertEquals("true", response.getResponseBodyAsString());
        // create it again as a fileset -> should fail with conflict
        response = executeHttp(HttpRequest.put(serviceURI.resolve("create/nn/fileSet").toURL()).build());
        Assert.assertEquals(409, response.getResponseCode());
        // get the type for xx -> not found
        response = executeHttp(HttpRequest.get(serviceURI.resolve("type/xx").toURL()).build());
        Assert.assertEquals(404, response.getResponseCode());
        // get the type for nn -> table
        response = executeHttp(HttpRequest.get(serviceURI.resolve("type/nn").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        Assert.assertEquals("table", response.getResponseBodyAsString());
        // update xx's properties -> should get not-found
        Map<String, String> nnProps = TableProperties.builder().setTTL(1000L).build().getProperties();
        response = executeHttp(HttpRequest.put(serviceURI.resolve("update/xx").toURL()).withBody(GSON.toJson(nnProps)).build());
        Assert.assertEquals(404, response.getResponseCode());
        // update nn's properties
        response = executeHttp(HttpRequest.put(serviceURI.resolve("update/nn").toURL()).withBody(GSON.toJson(nnProps)).build());
        Assert.assertEquals(200, response.getResponseCode());
        // get properties for xx -> not found
        response = executeHttp(HttpRequest.get(serviceURI.resolve("props/xx").toURL()).build());
        Assert.assertEquals(404, response.getResponseCode());
        // get properties for nn and validate
        response = executeHttp(HttpRequest.get(serviceURI.resolve("props/nn").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        Map<String, String> returnedProps = GSON.fromJson(response.getResponseBodyAsString(), new TypeToken<Map<String, String>>() {
        }.getType());
        Assert.assertEquals(nnProps, returnedProps);
        // write some data to the table
        DataSetManager<Table> nnManager = getDataset("nn");
        nnManager.get().put(new Put("x", "y", "z"));
        nnManager.flush();
        // in a new tx, validate that data is in table
        Assert.assertFalse(nnManager.get().get(new Get("x")).isEmpty());
        Assert.assertEquals("z", nnManager.get().get(new Get("x", "y")).getString("y"));
        nnManager.flush();
        // truncate xx -> not found
        response = executeHttp(HttpRequest.post(serviceURI.resolve("truncate/xx").toURL()).build());
        Assert.assertEquals(404, response.getResponseCode());
        // truncate nn
        response = executeHttp(HttpRequest.post(serviceURI.resolve("truncate/nn").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        // validate table is empty
        Assert.assertTrue(nnManager.get().get(new Get("x")).isEmpty());
        nnManager.flush();
        // delete nn
        response = executeHttp(HttpRequest.delete(serviceURI.resolve("delete/nn").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        // delete again -> not found
        response = executeHttp(HttpRequest.delete(serviceURI.resolve("delete/nn").toURL()).build());
        Assert.assertEquals(404, response.getResponseCode());
        // delete xx which never existed -> not found
        response = executeHttp(HttpRequest.delete(serviceURI.resolve("delete/xx").toURL()).build());
        Assert.assertEquals(404, response.getResponseCode());
        // exists should now return false for nn
        response = executeHttp(HttpRequest.get(serviceURI.resolve("exists/nn").toURL()).build());
        Assert.assertEquals(200, response.getResponseCode());
        Assert.assertEquals("false", response.getResponseBodyAsString());
        Assert.assertNull(getDataset("nn").get());
        // test Admin.namespaceExists()
        HttpRequest request = HttpRequest.get(serviceURI.resolve("namespaces/y").toURL()).build();
        response = executeHttp(request);
        Assert.assertEquals(404, response.getResponseCode());
        // test Admin.getNamespaceSummary()
        NamespaceMeta namespaceXMeta = new NamespaceMeta.Builder().setName(namespaceX).setGeneration(10L).build();
        getNamespaceAdmin().create(namespaceXMeta);
        request = HttpRequest.get(serviceURI.resolve("namespaces/" + namespaceX).toURL()).build();
        response = executeHttp(request);
        NamespaceSummary namespaceSummary = GSON.fromJson(response.getResponseBodyAsString(), NamespaceSummary.class);
        NamespaceSummary expectedX = new NamespaceSummary(namespaceXMeta.getName(), namespaceXMeta.getDescription(), namespaceXMeta.getGeneration());
        Assert.assertEquals(expectedX, namespaceSummary);
        // test ArtifactManager.listArtifacts()
        ArtifactId pluginArtifactId = new NamespaceId(namespaceX).artifact("r1", "1.0.0");
        // add a plugin artifact to namespace X
        addPluginArtifact(pluginArtifactId, ADMIN_APP_ARTIFACT, DummyPlugin.class);
        // no plugins should be listed in the default namespace, but the app artifact should
        request = HttpRequest.get(serviceURI.resolve("namespaces/default/plugins").toURL()).build();
        response = executeHttp(request);
        Assert.assertEquals(200, response.getResponseCode());
        Type setType = new TypeToken<Set<ArtifactSummary>>() {
        }.getType();
        Assert.assertEquals(Collections.singleton(ADMIN_ARTIFACT_SUMMARY), GSON.fromJson(response.getResponseBodyAsString(), setType));
        // the plugin should be listed in namespace X
        request = HttpRequest.get(serviceURI.resolve("namespaces/x/plugins").toURL()).build();
        response = executeHttp(request);
        Assert.assertEquals(200, response.getResponseCode());
        ArtifactSummary expected = new ArtifactSummary(pluginArtifactId.getArtifact(), pluginArtifactId.getVersion());
        Assert.assertEquals(Collections.singleton(expected), GSON.fromJson(response.getResponseBodyAsString(), setType));
    } finally {
        serviceManager.stop();
        if (getNamespaceAdmin().exists(new NamespaceId(namespaceX))) {
            getNamespaceAdmin().delete(new NamespaceId(namespaceX));
        }
    }
}
Also used : HttpRequest(io.cdap.common.http.HttpRequest) KeyValueTable(io.cdap.cdap.api.dataset.lib.KeyValueTable) Table(io.cdap.cdap.api.dataset.table.Table) Set(java.util.Set) FileSet(io.cdap.cdap.api.dataset.lib.FileSet) ArtifactId(io.cdap.cdap.proto.id.ArtifactId) HttpResponse(io.cdap.common.http.HttpResponse) URI(java.net.URI) Put(io.cdap.cdap.api.dataset.table.Put) Type(java.lang.reflect.Type) ArtifactSummary(io.cdap.cdap.api.artifact.ArtifactSummary) ServiceManager(io.cdap.cdap.test.ServiceManager) TypeToken(io.cdap.cdap.internal.guava.reflect.TypeToken) NamespaceMeta(io.cdap.cdap.proto.NamespaceMeta) Get(io.cdap.cdap.api.dataset.table.Get) NamespaceSummary(io.cdap.cdap.api.NamespaceSummary) NamespaceId(io.cdap.cdap.proto.id.NamespaceId) Test(org.junit.Test)

Example 3 with TypeToken

use of io.cdap.cdap.internal.guava.reflect.TypeToken in project cdap by caskdata.

the class AbstractSpecificationCodec method deserializeMap.

protected final <V> Map<String, V> deserializeMap(JsonElement json, JsonDeserializationContext context, Class<V> valueType) {
    Type type = new TypeToken<Map<String, V>>() {
    }.where(new TypeParameter<V>() {
    }, valueType).getType();
    Map<String, V> map = context.deserialize(json, type);
    return map == null ? Collections.<String, V>emptyMap() : map;
}
Also used : Type(java.lang.reflect.Type) TypeParameter(io.cdap.cdap.internal.guava.reflect.TypeParameter) TypeToken(io.cdap.cdap.internal.guava.reflect.TypeToken)

Example 4 with TypeToken

use of io.cdap.cdap.internal.guava.reflect.TypeToken in project cdap by caskdata.

the class AbstractSpecificationCodec method deserializeSet.

protected final <V> Set<V> deserializeSet(JsonElement json, JsonDeserializationContext context, Class<V> valueType) {
    Type type = new TypeToken<Set<V>>() {
    }.where(new TypeParameter<V>() {
    }, valueType).getType();
    Set<V> set = context.deserialize(json, type);
    return set == null ? Collections.<V>emptySet() : set;
}
Also used : Type(java.lang.reflect.Type) TypeParameter(io.cdap.cdap.internal.guava.reflect.TypeParameter) TypeToken(io.cdap.cdap.internal.guava.reflect.TypeToken)

Example 5 with TypeToken

use of io.cdap.cdap.internal.guava.reflect.TypeToken in project cdap by caskdata.

the class AbstractSpecificationCodec method deserializeList.

protected final <V> List<V> deserializeList(JsonElement json, JsonDeserializationContext context, Class<V> valueType) {
    Type type = new TypeToken<List<V>>() {
    }.where(new TypeParameter<V>() {
    }, valueType).getType();
    List<V> list = context.deserialize(json, type);
    return list == null ? Collections.<V>emptyList() : list;
}
Also used : Type(java.lang.reflect.Type) TypeParameter(io.cdap.cdap.internal.guava.reflect.TypeParameter) TypeToken(io.cdap.cdap.internal.guava.reflect.TypeToken)

Aggregations

TypeToken (io.cdap.cdap.internal.guava.reflect.TypeToken)6 Type (java.lang.reflect.Type)4 TypeParameter (io.cdap.cdap.internal.guava.reflect.TypeParameter)3 NamespaceId (io.cdap.cdap.proto.id.NamespaceId)2 HttpRequest (io.cdap.common.http.HttpRequest)2 HashSet (java.util.HashSet)2 JsonObject (com.google.gson.JsonObject)1 NamespaceSummary (io.cdap.cdap.api.NamespaceSummary)1 ArtifactRange (io.cdap.cdap.api.artifact.ArtifactRange)1 ArtifactSummary (io.cdap.cdap.api.artifact.ArtifactSummary)1 InvalidArtifactRangeException (io.cdap.cdap.api.artifact.InvalidArtifactRangeException)1 Schema (io.cdap.cdap.api.data.schema.Schema)1 FileSet (io.cdap.cdap.api.dataset.lib.FileSet)1 KeyValueTable (io.cdap.cdap.api.dataset.lib.KeyValueTable)1 Get (io.cdap.cdap.api.dataset.table.Get)1 Put (io.cdap.cdap.api.dataset.table.Put)1 Table (io.cdap.cdap.api.dataset.table.Table)1 ArtifactAlreadyExistsException (io.cdap.cdap.common.ArtifactAlreadyExistsException)1 Id (io.cdap.cdap.common.id.Id)1 NamespaceMeta (io.cdap.cdap.proto.NamespaceMeta)1