1e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount/*
2e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * Copyright (C) 2015 The Android Open Source Project
3e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount *
4e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
5e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * you may not use this file except in compliance with the License.
6e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * You may obtain a copy of the License at
7e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount *
8e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
9e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount *
10e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * Unless required by applicable law or agreed to in writing, software
11e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
12e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * See the License for the specific language governing permissions and
14e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount * limitations under the License.
15e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount */
16e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mountpackage android.databinding.tool.writer;
17e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
18a128d1c99ea98bb48c45d648906652e3d618d513George Mountimport android.databinding.tool.reflection.ModelAnalyzer;
19a128d1c99ea98bb48c45d648906652e3d618d513George Mountimport android.databinding.tool.store.SetterStore;
20e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
21e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mountimport java.util.List;
22a128d1c99ea98bb48c45d648906652e3d618d513George Mountimport java.util.Map;
23e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
24e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mountpublic class ComponentWriter {
25e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    private static final String INDENT = "    ";
26e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
27a128d1c99ea98bb48c45d648906652e3d618d513George Mount    public ComponentWriter() {
28e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    }
29e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
30e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    public String createComponent() {
31e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        final StringBuilder builder = new StringBuilder();
32e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        builder.append("package android.databinding;\n\n");
33e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        builder.append("public interface DataBindingComponent {\n");
34a128d1c99ea98bb48c45d648906652e3d618d513George Mount        final SetterStore setterStore = SetterStore.get(ModelAnalyzer.getInstance());
35a128d1c99ea98bb48c45d648906652e3d618d513George Mount        Map<String, List<String>> bindingAdapters = setterStore.getComponentBindingAdapters();
36a128d1c99ea98bb48c45d648906652e3d618d513George Mount        for (final String simpleName : bindingAdapters.keySet()) {
37a128d1c99ea98bb48c45d648906652e3d618d513George Mount            final List<String> classes = bindingAdapters.get(simpleName);
38e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount            if (classes.size() > 1) {
39e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                int index = 1;
40e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                for (String className : classes) {
41e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                    addGetter(builder, simpleName, className, index++);
42e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                }
43e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount            } else {
44e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                addGetter(builder, simpleName, classes.iterator().next(), 0);
45e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount            }
46e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        }
47e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        builder.append("}\n");
48e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        return builder.toString();
49e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    }
50e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount
51e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    private static void addGetter(StringBuilder builder, String simpleName, String className,
52e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount            int index) {
53e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        builder.append(INDENT)
54e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                .append(className)
55e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                .append(" get")
56e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount                .append(simpleName);
57e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        if (index > 0) {
58e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount            builder.append(index);
59e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        }
60e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount        builder.append("();\n");
61e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount    }
62e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount}
63