|
| 1 | +/** |
| 2 | + * Copyright (C) 2016-2019 the AndroidAnnotations project |
| 3 | + * |
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| 5 | + * use this file except in compliance with the License. You may obtain a copy of |
| 6 | + * 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, WITHOUT |
| 12 | + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 13 | + * License for the specific language governing permissions and limitations under |
| 14 | + * the License. |
| 15 | + */ |
| 16 | +package org.androidannotations.helper; |
| 17 | + |
| 18 | +import java.io.FileInputStream; |
| 19 | +import java.io.InputStream; |
| 20 | +import java.io.Serializable; |
| 21 | +import java.sql.SQLException; |
| 22 | +import java.util.Arrays; |
| 23 | +import java.util.Collections; |
| 24 | +import java.util.HashMap; |
| 25 | +import java.util.HashSet; |
| 26 | +import java.util.List; |
| 27 | +import java.util.Map; |
| 28 | + |
| 29 | +import javax.annotation.processing.ProcessingEnvironment; |
| 30 | + |
| 31 | +import com.helger.jcodemodel.AbstractJClass; |
| 32 | +import com.helger.jcodemodel.JClassAlreadyExistsException; |
| 33 | +import com.helger.jcodemodel.JCodeModel; |
| 34 | +import com.helger.jcodemodel.JDefinedClass; |
| 35 | + |
| 36 | +public class ClassesHolder { |
| 37 | + |
| 38 | + // CHECKSTYLE:OFF |
| 39 | + public class Classes { |
| 40 | + |
| 41 | + /* |
| 42 | + * Java |
| 43 | + */ |
| 44 | + public final AbstractJClass RUNTIME_EXCEPTION = refClass(RuntimeException.class); |
| 45 | + public final AbstractJClass EXCEPTION = refClass(Exception.class); |
| 46 | + public final AbstractJClass THROWABLE = refClass(Throwable.class); |
| 47 | + public final AbstractJClass CHAR_SEQUENCE = refClass(CharSequence.class); |
| 48 | + public final AbstractJClass CLASS_CAST_EXCEPTION = refClass(ClassCastException.class); |
| 49 | + public final AbstractJClass SERIALIZABLE = refClass(Serializable.class); |
| 50 | + public final AbstractJClass STRING = refClass(String.class); |
| 51 | + public final AbstractJClass STRING_BUILDER = refClass(StringBuilder.class); |
| 52 | + public final AbstractJClass SYSTEM = refClass(System.class); |
| 53 | + public final AbstractJClass INPUT_STREAM = refClass(InputStream.class); |
| 54 | + public final AbstractJClass FILE_INPUT_STREAM = refClass(FileInputStream.class); |
| 55 | + public final AbstractJClass SQL_EXCEPTION = refClass(SQLException.class); |
| 56 | + public final AbstractJClass COLLECTIONS = refClass(Collections.class); |
| 57 | + public final AbstractJClass THREAD = refClass(Thread.class); |
| 58 | + public final AbstractJClass HASH_MAP = refClass(HashMap.class); |
| 59 | + public final AbstractJClass LIST = refClass(List.class); |
| 60 | + public final AbstractJClass OBJECT = refClass(Object.class); |
| 61 | + public final AbstractJClass ARRAYS = refClass(Arrays.class); |
| 62 | + public final AbstractJClass HASH_SET = refClass(HashSet.class); |
| 63 | + public final AbstractJClass CLASS = refClass(Class.class); |
| 64 | + public final AbstractJClass MAP = refClass(Map.class); |
| 65 | + |
| 66 | + /* |
| 67 | + * Android |
| 68 | + */ |
| 69 | + public final AbstractJClass LOG = refClass(CanonicalNameConstants.LOG); |
| 70 | + public final AbstractJClass BUNDLE = refClass(CanonicalNameConstants.BUNDLE); |
| 71 | + public final AbstractJClass ACTIVITY = refClass(CanonicalNameConstants.ACTIVITY); |
| 72 | + public final AbstractJClass EDITABLE = refClass(CanonicalNameConstants.EDITABLE); |
| 73 | + public final AbstractJClass TEXT_WATCHER = refClass(CanonicalNameConstants.TEXT_WATCHER); |
| 74 | + public final AbstractJClass SEEKBAR = refClass(CanonicalNameConstants.SEEKBAR); |
| 75 | + public final AbstractJClass ON_SEEKBAR_CHANGE_LISTENER = refClass(CanonicalNameConstants.ON_SEEKBAR_CHANGE_LISTENER); |
| 76 | + public final AbstractJClass TEXT_VIEW = refClass(CanonicalNameConstants.TEXT_VIEW); |
| 77 | + public final AbstractJClass TEXT_VIEW_ON_EDITOR_ACTION_LISTENER = refClass(CanonicalNameConstants.TEXT_VIEW_ON_EDITOR_ACTION_LISTENER); |
| 78 | + public final AbstractJClass COMPOUND_BUTTON = refClass(CanonicalNameConstants.COMPOUND_BUTTON); |
| 79 | + public final AbstractJClass COMPOUND_BUTTON_ON_CHECKED_CHANGE_LISTENER = refClass(CanonicalNameConstants.COMPOUND_BUTTON_ON_CHECKED_CHANGE_LISTENER); |
| 80 | + public final AbstractJClass VIEW = refClass(CanonicalNameConstants.VIEW); |
| 81 | + public final AbstractJClass VIEW_ON_CLICK_LISTENER = refClass(CanonicalNameConstants.VIEW_ON_CLICK_LISTENER); |
| 82 | + public final AbstractJClass VIEW_ON_TOUCH_LISTENER = refClass(CanonicalNameConstants.VIEW_ON_TOUCH_LISTENER); |
| 83 | + public final AbstractJClass VIEW_ON_LONG_CLICK_LISTENER = refClass(CanonicalNameConstants.VIEW_ON_LONG_CLICK_LISTENER); |
| 84 | + public final AbstractJClass VIEW_ON_FOCUS_CHANGE_LISTENER = refClass(CanonicalNameConstants.VIEW_ON_FOCUS_CHANGE_LISTENER); |
| 85 | + public final AbstractJClass VIEW_GROUP_LAYOUT_PARAMS = refClass(CanonicalNameConstants.VIEW_GROUP_LAYOUT_PARAMS); |
| 86 | + public final AbstractJClass KEY_EVENT = refClass(CanonicalNameConstants.KEY_EVENT); |
| 87 | + public final AbstractJClass CONTEXT = refClass(CanonicalNameConstants.CONTEXT); |
| 88 | + public final AbstractJClass INTENT = refClass(CanonicalNameConstants.INTENT); |
| 89 | + public final AbstractJClass INTENT_FILTER = refClass(CanonicalNameConstants.INTENT_FILTER); |
| 90 | + public final AbstractJClass BROADCAST_RECEIVER = refClass(CanonicalNameConstants.BROADCAST_RECEIVER); |
| 91 | + public final AbstractJClass LOCAL_BROADCAST_MANAGER = refClass(CanonicalNameConstants.LOCAL_BROADCAST_MANAGER); |
| 92 | + public final AbstractJClass COMPONENT_NAME = refClass(CanonicalNameConstants.COMPONENT_NAME); |
| 93 | + public final AbstractJClass VIEW_GROUP = refClass(CanonicalNameConstants.VIEW_GROUP); |
| 94 | + public final AbstractJClass LAYOUT_INFLATER = refClass(CanonicalNameConstants.LAYOUT_INFLATER); |
| 95 | + public final AbstractJClass FRAGMENT_ACTIVITY = refClass(CanonicalNameConstants.FRAGMENT_ACTIVITY); |
| 96 | + public final AbstractJClass FRAGMENT = refClass(CanonicalNameConstants.FRAGMENT); |
| 97 | + public final AbstractJClass SUPPORT_V4_FRAGMENT = refClass(CanonicalNameConstants.SUPPORT_V4_FRAGMENT); |
| 98 | + public final AbstractJClass HTML = refClass(CanonicalNameConstants.HTML); |
| 99 | + public final AbstractJClass WINDOW_MANAGER_LAYOUT_PARAMS = refClass(CanonicalNameConstants.WINDOW_MANAGER_LAYOUT_PARAMS); |
| 100 | + public final AbstractJClass ADAPTER_VIEW = refClass(CanonicalNameConstants.ADAPTER_VIEW); |
| 101 | + public final AbstractJClass ON_ITEM_LONG_CLICK_LISTENER = refClass(CanonicalNameConstants.ON_ITEM_LONG_CLICK_LISTENER); |
| 102 | + public final AbstractJClass ON_ITEM_CLICK_LISTENER = refClass(CanonicalNameConstants.ON_ITEM_CLICK_LISTENER); |
| 103 | + public final AbstractJClass ON_ITEM_SELECTED_LISTENER = refClass(CanonicalNameConstants.ON_ITEM_SELECTED_LISTENER); |
| 104 | + public final AbstractJClass WINDOW = refClass(CanonicalNameConstants.WINDOW); |
| 105 | + public final AbstractJClass MENU_ITEM = refClass(CanonicalNameConstants.MENU_ITEM); |
| 106 | + public final AbstractJClass MENU_INFLATER = refClass(CanonicalNameConstants.MENU_INFLATER); |
| 107 | + public final AbstractJClass MENU = refClass(CanonicalNameConstants.MENU); |
| 108 | + public final AbstractJClass ANIMATION_UTILS = refClass(CanonicalNameConstants.ANIMATION_UTILS); |
| 109 | + public final AbstractJClass RESOURCES = refClass(CanonicalNameConstants.RESOURCES); |
| 110 | + public final AbstractJClass CONFIGURATION = refClass(CanonicalNameConstants.CONFIGURATION); |
| 111 | + public final AbstractJClass MOTION_EVENT = refClass(CanonicalNameConstants.MOTION_EVENT); |
| 112 | + public final AbstractJClass HANDLER = refClass(CanonicalNameConstants.HANDLER); |
| 113 | + public final AbstractJClass KEY_STORE = refClass(CanonicalNameConstants.KEY_STORE); |
| 114 | + public final AbstractJClass VIEW_SERVER = refClass(CanonicalNameConstants.VIEW_SERVER); |
| 115 | + public final AbstractJClass PARCELABLE = refClass(CanonicalNameConstants.PARCELABLE); |
| 116 | + public final AbstractJClass LOOPER = refClass(CanonicalNameConstants.LOOPER); |
| 117 | + public final AbstractJClass POWER_MANAGER = refClass(CanonicalNameConstants.POWER_MANAGER); |
| 118 | + public final AbstractJClass WAKE_LOCK = refClass(CanonicalNameConstants.WAKE_LOCK); |
| 119 | + public final AbstractJClass BUILD_VERSION = refClass(CanonicalNameConstants.BUILD_VERSION); |
| 120 | + public final AbstractJClass BUILD_VERSION_CODES = refClass(CanonicalNameConstants.BUILD_VERSION_CODES); |
| 121 | + public final AbstractJClass ACTIVITY_COMPAT = refClass(CanonicalNameConstants.ACTIVITY_COMPAT); |
| 122 | + public final AbstractJClass CONTEXT_COMPAT = refClass(CanonicalNameConstants.CONTEXT_COMPAT); |
| 123 | + public final AbstractJClass APP_WIDGET_MANAGER = refClass(CanonicalNameConstants.APP_WIDGET_MANAGER); |
| 124 | + public final AbstractJClass VIEW_PAGER = refClass(CanonicalNameConstants.VIEW_PAGER); |
| 125 | + public final AbstractJClass PAGE_CHANGE_LISTENER = refClass(CanonicalNameConstants.PAGE_CHANGE_LISTENER); |
| 126 | + |
| 127 | + public final AbstractJClass PREFERENCE = refClass(CanonicalNameConstants.PREFERENCE); |
| 128 | + public final AbstractJClass SUPPORT_V7_PREFERENCE = refClass(CanonicalNameConstants.SUPPORT_V7_PREFERENCE); |
| 129 | + public final AbstractJClass PREFERENCE_CHANGE_LISTENER = refClass(CanonicalNameConstants.PREFERENCE_CHANGE_LISTENER); |
| 130 | + public final AbstractJClass SUPPORT_V7_PREFERENCE_CHANGE_LISTENER = refClass(CanonicalNameConstants.SUPPORT_V7_PREFERENCE_CHANGE_LISTENER); |
| 131 | + public final AbstractJClass PREFERENCE_CLICK_LISTENER = refClass(CanonicalNameConstants.PREFERENCE_CLICK_LISTENER); |
| 132 | + public final AbstractJClass SUPPORT_V7_PREFERENCE_CLICK_LISTENER = refClass(CanonicalNameConstants.SUPPORT_V7_PREFERENCE_CLICK_LISTENER); |
| 133 | + public final AbstractJClass PREFERENCE_ACTIVITY_HEADER = refClass(CanonicalNameConstants.PREFERENCE_ACTIVITY_HEADER); |
| 134 | + |
| 135 | + public final AbstractJClass VIEW_DATA_BINDING = refClass(CanonicalNameConstants.VIEW_DATA_BINDING); |
| 136 | + public final AbstractJClass DATA_BINDING_UTIL = refClass(CanonicalNameConstants.DATA_BINDING_UTIL); |
| 137 | + |
| 138 | + /* |
| 139 | + * Android X |
| 140 | + */ |
| 141 | + public final AbstractJClass ANDROIDX_ACTIVITY_COMPAT = refClass(CanonicalNameConstants.ANDROIDX_ACTIVITY_COMPAT); |
| 142 | + public final AbstractJClass ANDROIDX_FRAGMENT = refClass(CanonicalNameConstants.ANDROIDX_FRAGMENT); |
| 143 | + public final AbstractJClass ANDROIDX_FRAGMENT_ACTIVITY = refClass(CanonicalNameConstants.ANDROIDX_FRAGMENT_ACTIVITY); |
| 144 | + public final AbstractJClass ANDROIDX_LOCAL_BROADCAST_MANAGER = refClass(CanonicalNameConstants.ANDROIDX_LOCAL_BROADCAST_MANAGER); |
| 145 | + public final AbstractJClass ANDROIDX_CONTEXT_COMPAT = refClass(CanonicalNameConstants.ANDROIDX_CONTEXT_COMPAT); |
| 146 | + public final AbstractJClass ANDROIDX_PREFERENCE = refClass(CanonicalNameConstants.ANDROIDX_PREFERENCE); |
| 147 | + public final AbstractJClass ANDROIDX_PREFERENCE_CLICK_LISTENER = refClass(CanonicalNameConstants.ANDROIDX_PREFERENCE_CLICK_LISTENER); |
| 148 | + public final AbstractJClass ANDROIDX_PREFERENCE_CHANGE_LISTENER = refClass(CanonicalNameConstants.ANDROIDX_PREFERENCE_CHANGE_LISTENER); |
| 149 | + public final AbstractJClass ANDROIDX_VIEW_PAGER = refClass(CanonicalNameConstants.ANDROIDX_VIEW_PAGER); |
| 150 | + public final AbstractJClass ANDROIDX_PAGE_CHANGE_LISTENER = refClass(CanonicalNameConstants.ANDROIDX_PAGE_CHANGE_LISTENER); |
| 151 | + public final AbstractJClass ANDROIDX_VIEW_DATA_BINDING = refClass(CanonicalNameConstants.ANDROIDX_VIEW_DATA_BINDING); |
| 152 | + public final AbstractJClass ANDROIDX_DATA_BINDING_UTIL = refClass(CanonicalNameConstants.ANDROIDX_DATA_BINDING_UTIL); |
| 153 | + |
| 154 | + /* |
| 155 | + * HttpClient |
| 156 | + */ |
| 157 | + public final AbstractJClass CLIENT_CONNECTION_MANAGER = refClass(CanonicalNameConstants.CLIENT_CONNECTION_MANAGER); |
| 158 | + public final AbstractJClass DEFAULT_HTTP_CLIENT = refClass(CanonicalNameConstants.DEFAULT_HTTP_CLIENT); |
| 159 | + public final AbstractJClass SSL_SOCKET_FACTORY = refClass(CanonicalNameConstants.SSL_SOCKET_FACTORY); |
| 160 | + public final AbstractJClass PLAIN_SOCKET_FACTORY = refClass(CanonicalNameConstants.PLAIN_SOCKET_FACTORY); |
| 161 | + public final AbstractJClass SCHEME = refClass(CanonicalNameConstants.SCHEME); |
| 162 | + public final AbstractJClass SCHEME_REGISTRY = refClass(CanonicalNameConstants.SCHEME_REGISTRY); |
| 163 | + public final AbstractJClass SINGLE_CLIENT_CONN_MANAGER = refClass(CanonicalNameConstants.SINGLE_CLIENT_CONN_MANAGER); |
| 164 | + } |
| 165 | + |
| 166 | + // CHECKSTYLE:ON |
| 167 | + |
| 168 | + private final Map<String, AbstractJClass> loadedClasses = new HashMap<>(); |
| 169 | + |
| 170 | + private final JCodeModel codeModel; |
| 171 | + |
| 172 | + private final Classes classes; |
| 173 | + |
| 174 | + public ClassesHolder(ProcessingEnvironment processingEnvironment) { |
| 175 | + codeModel = new JCodeModel(); |
| 176 | + codeModel.addDontImportClass(refClass("android.R")); |
| 177 | + classes = new Classes(); |
| 178 | + } |
| 179 | + |
| 180 | + public AbstractJClass refClass(Class<?> clazz) { |
| 181 | + AbstractJClass referencedClass = codeModel.ref(clazz); |
| 182 | + loadedClasses.put(clazz.getCanonicalName(), referencedClass); |
| 183 | + return referencedClass; |
| 184 | + } |
| 185 | + |
| 186 | + public AbstractJClass refClass(String fullyQualifiedClassName) { |
| 187 | + |
| 188 | + int arrayCounter = 0; |
| 189 | + while (fullyQualifiedClassName.endsWith("[]")) { |
| 190 | + arrayCounter++; |
| 191 | + fullyQualifiedClassName = fullyQualifiedClassName.substring(0, fullyQualifiedClassName.length() - 2); |
| 192 | + } |
| 193 | + |
| 194 | + AbstractJClass refClass = loadedClasses.get(fullyQualifiedClassName); |
| 195 | + |
| 196 | + if (refClass == null) { |
| 197 | + refClass = codeModel.directClass(fullyQualifiedClassName); |
| 198 | + loadedClasses.put(fullyQualifiedClassName, refClass); |
| 199 | + } |
| 200 | + |
| 201 | + for (int i = 0; i < arrayCounter; i++) { |
| 202 | + refClass = refClass.array(); |
| 203 | + } |
| 204 | + |
| 205 | + return refClass; |
| 206 | + } |
| 207 | + |
| 208 | + public JDefinedClass definedClass(String fullyQualifiedClassName) { |
| 209 | + JDefinedClass refClass = (JDefinedClass) loadedClasses.get(fullyQualifiedClassName); |
| 210 | + if (refClass == null) { |
| 211 | + try { |
| 212 | + refClass = codeModel._class(fullyQualifiedClassName); |
| 213 | + } catch (JClassAlreadyExistsException e) { |
| 214 | + refClass = (JDefinedClass) refClass(fullyQualifiedClassName); |
| 215 | + } |
| 216 | + loadedClasses.put(fullyQualifiedClassName, refClass); |
| 217 | + } |
| 218 | + return refClass; |
| 219 | + } |
| 220 | + |
| 221 | + public JCodeModel codeModel() { |
| 222 | + return codeModel; |
| 223 | + } |
| 224 | + |
| 225 | + public ClassesHolder.Classes classes() { |
| 226 | + return classes; |
| 227 | + } |
| 228 | + |
| 229 | +} |
0 commit comments