| /* |
| * Copyright 2003-2012 Dave Griffith, Bas Leijdekkers |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.siyeh.ig.psiutils; |
| |
| import com.intellij.psi.*; |
| import com.intellij.psi.util.InheritanceUtil; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| public class SerializationUtils { |
| |
| private SerializationUtils() {} |
| |
| public static boolean isSerializable(@Nullable PsiClass aClass) { |
| return InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_IO_SERIALIZABLE); |
| } |
| |
| public static boolean isExternalizable(@Nullable PsiClass aClass) { |
| return InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_IO_EXTERNALIZABLE); |
| } |
| |
| public static boolean isDirectlySerializable(@NotNull PsiClass aClass) { |
| final PsiReferenceList implementsList = aClass.getImplementsList(); |
| if (implementsList == null) { |
| return false; |
| } |
| final PsiJavaCodeReferenceElement[] interfaces = implementsList.getReferenceElements(); |
| for (PsiJavaCodeReferenceElement aInterfaces : interfaces) { |
| final PsiClass implemented = (PsiClass)aInterfaces.resolve(); |
| if (implemented == null) { |
| continue; |
| } |
| final String name = implemented.getQualifiedName(); |
| if (CommonClassNames.JAVA_IO_SERIALIZABLE.equals(name)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public static boolean hasReadObject(@NotNull PsiClass aClass) { |
| final PsiMethod[] methods = aClass.findMethodsByName("readObject", false); |
| for (final PsiMethod method : methods) { |
| if (isReadObject(method)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public static boolean hasReadResolve(@NotNull PsiClass aClass) { |
| final PsiMethod[] methods = aClass.findMethodsByName("readResolve", true); |
| for (PsiMethod method : methods) { |
| if (isReadResolve(method)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public static boolean hasWriteObject(@NotNull PsiClass aClass) { |
| final PsiMethod[] methods = aClass.findMethodsByName("writeObject", false); |
| for (final PsiMethod method : methods) { |
| if (isWriteObject(method)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public static boolean hasWriteReplace(@NotNull PsiClass aClass) { |
| final PsiMethod[] methods = aClass.findMethodsByName("writeReplace", true); |
| for (PsiMethod method : methods) { |
| if (isWriteReplace(method)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public static boolean isReadObject(@NotNull PsiMethod method) { |
| final PsiClassType type = TypeUtils.getType("java.io.ObjectInputStream", method); |
| return MethodUtils.methodMatches(method, null, PsiType.VOID, "readObject", type); |
| } |
| |
| public static boolean isWriteObject(@NotNull PsiMethod method) { |
| final PsiClassType type = TypeUtils.getType("java.io.ObjectOutputStream", method); |
| return MethodUtils.methodMatches(method, null, PsiType.VOID, "writeObject", type); |
| } |
| |
| public static boolean isReadResolve(@NotNull PsiMethod method) { |
| return MethodUtils.simpleMethodMatches(method, null, CommonClassNames.JAVA_LANG_OBJECT, "readResolve"); |
| } |
| |
| public static boolean isWriteReplace(@NotNull PsiMethod method) { |
| return MethodUtils.simpleMethodMatches(method, null, CommonClassNames.JAVA_LANG_OBJECT, "writeReplace"); |
| } |
| |
| public static boolean isProbablySerializable(PsiType type) { |
| if (type instanceof PsiWildcardType) { |
| return true; |
| } |
| if (type instanceof PsiPrimitiveType) { |
| return true; |
| } |
| if (type instanceof PsiArrayType) { |
| final PsiArrayType arrayType = (PsiArrayType)type; |
| final PsiType componentType = arrayType.getComponentType(); |
| return isProbablySerializable(componentType); |
| } |
| if (type instanceof PsiClassType) { |
| final PsiClassType classTYpe = (PsiClassType)type; |
| final PsiClass psiClass = classTYpe.resolve(); |
| if (isSerializable(psiClass)) { |
| return true; |
| } |
| if (isExternalizable(psiClass)) { |
| return true; |
| } |
| if (InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_COLLECTION) || |
| InheritanceUtil.isInheritor(psiClass, CommonClassNames.JAVA_UTIL_MAP)) { |
| final PsiType[] parameters = classTYpe.getParameters(); |
| for (PsiType parameter : parameters) { |
| if (!isProbablySerializable(parameter)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| return false; |
| } |
| return false; |
| } |
| } |