1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.databinding.tool; 18 19 import android.databinding.tool.processing.Scope; 20 import android.databinding.tool.processing.ScopedException; 21 import android.databinding.tool.store.ResourceBundle; 22 import android.databinding.tool.util.L; 23 import android.databinding.tool.writer.ComponentWriter; 24 import android.databinding.tool.writer.JavaFileWriter; 25 26 import java.util.ArrayList; 27 import java.util.HashSet; 28 import java.util.List; 29 import java.util.Map; 30 import java.util.Set; 31 32 /** 33 * The main class that handles parsing files and generating classes. 34 */ 35 public class DataBinder { 36 List<LayoutBinder> mLayoutBinders = new ArrayList<LayoutBinder>(); 37 private static final String COMPONENT_CLASS = "android.databinding.DataBindingComponent"; 38 39 private JavaFileWriter mFileWriter; 40 41 Set<String> writtenClasses = new HashSet<String>(); 42 DataBinder(ResourceBundle resourceBundle)43 public DataBinder(ResourceBundle resourceBundle) { 44 L.d("reading resource bundle into data binder"); 45 for (Map.Entry<String, List<ResourceBundle.LayoutFileBundle>> entry : 46 resourceBundle.getLayoutBundles().entrySet()) { 47 for (ResourceBundle.LayoutFileBundle bundle : entry.getValue()) { 48 try { 49 mLayoutBinders.add(new LayoutBinder(bundle)); 50 } catch (ScopedException ex) { 51 Scope.defer(ex); 52 } 53 } 54 } 55 } getLayoutBinders()56 public List<LayoutBinder> getLayoutBinders() { 57 return mLayoutBinders; 58 } 59 sealModels()60 public void sealModels() { 61 for (LayoutBinder layoutBinder : mLayoutBinders) { 62 layoutBinder.sealModel(); 63 } 64 } 65 writerBaseClasses(boolean isLibrary)66 public void writerBaseClasses(boolean isLibrary) { 67 for (LayoutBinder layoutBinder : mLayoutBinders) { 68 try { 69 Scope.enter(layoutBinder); 70 if (isLibrary || layoutBinder.hasVariations()) { 71 String className = layoutBinder.getClassName(); 72 String canonicalName = layoutBinder.getPackage() + "." + className; 73 if (writtenClasses.contains(canonicalName)) { 74 continue; 75 } 76 L.d("writing data binder base %s", canonicalName); 77 mFileWriter.writeToFile(canonicalName, 78 layoutBinder.writeViewBinderBaseClass(isLibrary)); 79 writtenClasses.add(canonicalName); 80 } 81 } catch (ScopedException ex){ 82 Scope.defer(ex); 83 } finally { 84 Scope.exit(); 85 } 86 } 87 } 88 writeBinders(int minSdk)89 public void writeBinders(int minSdk) { 90 for (LayoutBinder layoutBinder : mLayoutBinders) { 91 try { 92 Scope.enter(layoutBinder); 93 String className = layoutBinder.getImplementationName(); 94 String canonicalName = layoutBinder.getPackage() + "." + className; 95 L.d("writing data binder %s", canonicalName); 96 writtenClasses.add(canonicalName); 97 mFileWriter.writeToFile(canonicalName, layoutBinder.writeViewBinder(minSdk)); 98 } catch (ScopedException ex) { 99 Scope.defer(ex); 100 } finally { 101 Scope.exit(); 102 } 103 } 104 } 105 writeComponent()106 public void writeComponent() { 107 ComponentWriter componentWriter = new ComponentWriter(); 108 109 writtenClasses.add(COMPONENT_CLASS); 110 mFileWriter.writeToFile(COMPONENT_CLASS, componentWriter.createComponent()); 111 } 112 getWrittenClassNames()113 public Set<String> getWrittenClassNames() { 114 return writtenClasses; 115 } 116 setFileWriter(JavaFileWriter fileWriter)117 public void setFileWriter(JavaFileWriter fileWriter) { 118 mFileWriter = fileWriter; 119 } 120 getFileWriter()121 public JavaFileWriter getFileWriter() { 122 return mFileWriter; 123 } 124 } 125