/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.kernel.jsonwebservice; import com.liferay.portal.kernel.servlet.HttpMethods; import com.liferay.portal.kernel.util.CamelCaseUtil; import com.liferay.portal.kernel.util.MethodParameter; import com.liferay.portal.kernel.util.MethodParametersResolverUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; import java.util.Set; /** * @author Igor Spasic */ public class JSONWebServiceNaming { public String convertMethodToHttpMethod(Method method) { String methodName = method.getName(); String methodNamePrefix = getMethodNamePrefix(methodName); if (prefixes.contains(methodNamePrefix)) { return HttpMethods.GET; } return HttpMethods.POST; } public String convertMethodToPath(Method method) { return CamelCaseUtil.fromCamelCase(method.getName()); } public String convertModelClassToImplClassName(Class<?> clazz) { String className = clazz.getName(); className = StringUtil.replace(className, ".kernel.", "."); className = StringUtil.replace(className, ".model.", ".model.impl.") + "Impl"; return className; } public String convertServiceClassToPath(Class<?> clazz) { String className = convertServiceClassToSimpleName(clazz); return StringUtil.toLowerCase(className); } public String convertServiceClassToSimpleName(Class<?> clazz) { String className = clazz.getSimpleName(); className = StringUtil.replace(className, "Impl", StringPool.BLANK); className = StringUtil.replace(className, "Service", StringPool.BLANK); return className; } public String convertServiceImplClassToUtilClassName(Class<?> clazz) { String className = clazz.getName(); if (className.endsWith("Impl")) { className = className.substring(0, className.length() - 4); } return StringUtil.replace( className + "Util", ".impl.", StringPool.PERIOD); } public boolean isIncludedMethod(Method method) { if ((excludedMethodNames != null) && excludedMethodNames.contains(method.getName())) { return false; } if (excludedTypesNames == null) { return true; } Class<?> returnType = method.getReturnType(); if (returnType.isArray()) { returnType = returnType.getComponentType(); } String returnTypeName = returnType.getName(); for (String excludedTypesName : excludedTypesNames) { if (excludedTypesName.startsWith(returnTypeName)) { return false; } } MethodParameter[] methodParameters = MethodParametersResolverUtil.resolveMethodParameters(method); Class<?>[] parameterTypes = method.getParameterTypes(); for (int i = 0; i < parameterTypes.length; i++) { MethodParameter methodParameter = methodParameters[i]; Class<?> parameterType = parameterTypes[i]; if (parameterType.isArray()) { parameterType = parameterType.getComponentType(); } String parameterTypeName = parameterType.getName(); for (String excludedTypesName : excludedTypesNames) { if (parameterTypeName.startsWith(excludedTypesName)) { return false; } Class<?>[] genericTypes = methodParameter.getGenericTypes(); if (genericTypes != null) { for (Class<?> genericType : genericTypes) { String genericName = genericType.getName(); if (genericName.startsWith(excludedTypesName)) { return false; } } } } } return true; } public boolean isIncludedPath(String contextPath, String path) { String portalContextPath = PortalUtil.getPathContext(); if (!contextPath.equals(portalContextPath)) { path = contextPath + StringPool.PERIOD + path.substring(1); } for (String excludedPath : excludedPaths) { if (StringUtil.wildcardMatches( path, excludedPath, '?', '*', '\\', false)) { return false; } } if (includedPaths.length == 0) { return true; } for (String includedPath : includedPaths) { if (StringUtil.wildcardMatches( path, includedPath, '?', '*', '\\', false)) { return true; } } return false; } public boolean isValidHttpMethod(String httpMethod) { if (invalidHttpMethods.contains(httpMethod)) { return false; } return true; } protected String getMethodNamePrefix(String methodName) { int i = 0; while (i < methodName.length()) { if (Character.isUpperCase(methodName.charAt(i))) { break; } i++; } return methodName.substring(0, i); } protected Set<String> excludedMethodNames = SetUtil.fromArray( PropsUtil.getArray(PropsKeys.JSON_SERVICE_INVALID_METHOD_NAMES)); protected String[] excludedPaths = PropsUtil.getArray( PropsKeys.JSONWS_WEB_SERVICE_PATHS_EXCLUDES); protected String[] excludedTypesNames = {InputStream.class.getName(), OutputStream.class.getName(), "javax."}; protected String[] includedPaths = PropsUtil.getArray( PropsKeys.JSONWS_WEB_SERVICE_PATHS_INCLUDES); protected Set<String> invalidHttpMethods = SetUtil.fromArray( PropsUtil.getArray(PropsKeys.JSONWS_WEB_SERVICE_INVALID_HTTP_METHODS)); protected Set<String> prefixes = SetUtil.fromArray( new String[] {"get", "has", "is"}); }