aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/query/textserialize/item/CompositeConverter.java
blob: 81d45cb40c99b4078895b64688a5115f4e4f613f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.query.textserialize.item;

import com.yahoo.prelude.query.CompositeItem;
import com.yahoo.prelude.query.Item;
import com.yahoo.search.query.textserialize.serializer.DispatchForm;
import com.yahoo.search.query.textserialize.serializer.ItemIdMapper;

import java.lang.reflect.InvocationTargetException;
import java.util.ListIterator;

/**
 * @author Tony Vaagenes
 */
public class CompositeConverter<T extends CompositeItem> implements ItemFormConverter {
    private final Class<T> itemClass;

    public CompositeConverter(Class<T> itemClass) {
        this.itemClass = itemClass;
    }

    @Override
    public Object formToItem(String name, ItemArguments arguments, ItemContext itemContext) {
        T item = newInstance();
        addChildren(item, arguments, itemContext);
        return item;
    }

    protected void addChildren(T item, ItemArguments arguments, ItemContext itemContext) {
        for (Object child : arguments.children) {
            item.addItem(asItem(child));
        }
        ItemInitializer.initialize(item, arguments, itemContext);
    }

    private static Item asItem(Object child) {
        if (!(child instanceof Item) && child != null) {
            throw new RuntimeException("Expected query item, but got '" + child.toString() +
                    "' [" + child.getClass().getName() + "]");
        }
        return (Item) child;
    }

    private T newInstance() {
        try {
            return itemClass.getDeclaredConstructor().newInstance();
        } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public DispatchForm itemToForm(Item item, ItemIdMapper itemIdMapper) {
        CompositeItem compositeItem = (CompositeItem) item;

        DispatchForm form = new DispatchForm(getFormName(item));
        for (ListIterator<Item> i = compositeItem.getItemIterator(); i.hasNext() ;) {
            form.addChild(i.next());
        }
        ItemInitializer.initializeForm(form, item, itemIdMapper);
        return form;
    }

    protected String getFormName(Item item) {
        return item.getItemType().name();
    }
}