/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* 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 org.uberfire.annotations.processors.facades;
import java.util.Map;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.util.Elements;
import org.uberfire.annotations.processors.GeneratorUtils;
/**
* A collection of type names in the UberFire Client API module.
* Due to a bug in Eclipse annotation processor dependencies, we refer to all UberFire type names using Strings,
* Elements, and TypeMirrors. We cannot refer to the annotation types as types themselves.
*/
public class ClientAPIModule {
public static final String IDENTIFIER = "identifier";
public static final String SIZE = "size";
public static final String OWNING_PERSPECTIVE = "owningPerspective";
public static final String IS_DEFAULT = "isDefault";
public static final String IS_DYNAMIC = "isDynamic";
public static final String IS_TRANSIENT = "isTransient";
public static final String IS_TEMPLATE = "isTemplate";
public static final String IS_ENABLED = "isEnabled";
public static final String VALUE = "value";
public static final String workbenchSplashScreen = "org.uberfire.client.annotations.WorkbenchSplashScreen";
public static final String workbenchPerspective = "org.uberfire.client.annotations.WorkbenchPerspective";
public static final String workbenchPopup = "org.uberfire.client.annotations.WorkbenchPopup";
public static final String workbenchScreen = "org.uberfire.client.annotations.WorkbenchScreen";
public static final String workbenchContext = "org.uberfire.client.annotations.WorkbenchContext";
public static final String workbenchEditor = "org.uberfire.client.annotations.WorkbenchEditor";
public static final String defaultPosition = "org.uberfire.client.annotations.DefaultPosition";
public static final String workbenchPartTitle = "org.uberfire.client.annotations.WorkbenchPartTitle";
public static final String workbenchContextId = "org.uberfire.client.annotations.WorkbenchContextId";
public static final String workbenchPartTitleDecoration = "org.uberfire.client.annotations.WorkbenchPartTitleDecoration";
public static final String workbenchPartView = "org.uberfire.client.annotations.WorkbenchPartView";
public static final String workbenchMenu = "org.uberfire.client.annotations.WorkbenchMenu";
public static final String workbenchToolBar = "org.uberfire.client.annotations.WorkbenchToolBar";
public static final String perspective = "org.uberfire.client.annotations.Perspective";
public static final String splashFilter = "org.uberfire.client.annotations.SplashFilter";
public static final String splashBodyHeight = "org.uberfire.client.annotations.SplashBodyHeight";
public static final String intercept = "org.uberfire.client.annotations.Intercept";
public static final String workbenchPanel = "org.uberfire.client.annotations.WorkbenchPanel";
public static final String jsType = "jsinterop.annotations.JsType";
private ClientAPIModule() {
}
public static String getWorkbenchScreenClass() {
return workbenchScreen;
}
public static String getSplashFilterClass() {
return splashFilter;
}
public static String getSplashBodyHeightClass() {
return splashBodyHeight;
}
public static String getInterceptClass() {
return intercept;
}
public static String getPerspectiveClass() {
return perspective;
}
public static String getWorkbenchToolBarClass() {
return workbenchToolBar;
}
public static String getWorkbenchMenuClass() {
return workbenchMenu;
}
public static String getWorkbenchPartViewClass() {
return workbenchPartView;
}
public static String getWorkbenchPartTitleDecorationsClass() {
return workbenchPartTitleDecoration;
}
public static String getWorkbenchContextIdClass() {
return workbenchContextId;
}
public static String getWorkbenchPartTitleClass() {
return workbenchPartTitle;
}
public static String getDefaultPositionClass() {
return defaultPosition;
}
public static String getWorkbenchContextClass() {
return workbenchContext;
}
public static String getWorkbenchEditorClass() {
return workbenchEditor;
}
public static String getWorkbenchPopupClass() {
return workbenchPopup;
}
public static String getWorkbenchSplashScreenClass() {
return workbenchSplashScreen;
}
public static String getWorkbenchPerspectiveClass() {
return workbenchPerspective;
}
public static String getWorkbenchPanel() {
return workbenchPanel;
}
/**
* Returns the value of the String-valued Annotation parameter on the given type, ignoring any default value that
* exists on the annotation. Returns an empty string if the type lacks the given annotation, or if the annotation
* lacks the given parameter.
*/
private static String getAnnotationStringParam(TypeElement target,
String annotationClassName,
String annotationParamName) {
AnnotationValue paramValue = getAnnotationParamValue(target,
annotationClassName,
annotationParamName);
if (paramValue == null) {
return "";
}
return paramValue.getValue().toString();
}
/**
* Returns the value of the Boolean-valued Annotation parameter on the given type, ignoring any default value that
* exists on the annotation. Returns false if the type lacks the given annotation, or if the annotation
* lacks the given parameter.
*/
private static Boolean getAnnotationBooleanParam(TypeElement target,
String annotationClassName,
String annotationParamName) {
AnnotationValue paramValue = getAnnotationParamValue(target,
annotationClassName,
annotationParamName);
if (paramValue == null) {
return null;
}
return Boolean.parseBoolean(paramValue.getValue().toString());
}
/**
* Returns the value associated with the given parameter of the given annotation on the given class element,
* ignoring any default value that exists on the annotation. Returns null if the type lacks the given annotation, or
* if the annotation lacks the given parameter.
*/
private static AnnotationValue getAnnotationParamValue(TypeElement target,
String annotationClassName,
String annotationName) {
for (final AnnotationMirror am : target.getAnnotationMirrors()) {
if (annotationClassName.equals(am.getAnnotationType().toString())) {
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : am.getElementValues().entrySet()) {
if (annotationName.equals(entry.getKey().getSimpleName().toString())) {
return entry.getValue();
}
}
}
}
return null;
}
public static Boolean getWbPerspectiveScreenIsDefaultValueOnClass(TypeElement classElement) {
String bool = (getAnnotationStringParam(classElement,
workbenchPerspective,
IS_DEFAULT));
return Boolean.valueOf(bool);
}
public static Boolean getWbPerspectiveScreenIsDynamicValueOnClass(TypeElement classElement) {
String bool = (getAnnotationStringParam(classElement,
workbenchPerspective,
IS_DYNAMIC));
return Boolean.valueOf(bool);
}
public static Boolean getWbScreenIsDynamicValueOnClass(TypeElement classElement) {
String bool = (getAnnotationStringParam(classElement,
workbenchScreen,
IS_DYNAMIC));
return Boolean.valueOf(bool);
}
public static Boolean getWbEditorIsDynamicValueOnClass(TypeElement classElement) {
String bool = (getAnnotationStringParam(classElement,
workbenchEditor,
IS_DYNAMIC));
return Boolean.valueOf(bool);
}
public static Boolean getWbPerspectiveScreenIsTransientValueOnClass(TypeElement classElement) {
String bool = (getAnnotationStringParam(classElement,
workbenchPerspective,
IS_TRANSIENT));
// XXX this is non-ideal because it restates the default of the isTransient property
// we should use the getAnnotationValueWithDefaults method in this entire class so
// we aren't redundantly declaring defaults here
if (bool.isEmpty()) {
return true;
}
return Boolean.valueOf(bool);
}
public static String getWbPerspectiveScreenIdentifierValueOnClass(TypeElement classElement) {
return getAnnotationStringParam(classElement,
workbenchPerspective,
IDENTIFIER);
}
public static String getWbPopupScreenIdentifierValueOnClass(TypeElement classElement) {
return getAnnotationStringParam(classElement,
workbenchPopup,
IDENTIFIER);
}
public static String getWbPopupScreenSizeValueOnClass(TypeElement classElement) {
return getAnnotationStringParam(classElement,
workbenchPopup,
SIZE);
}
public static String getWbSplashScreenIdentifierValueOnClass(TypeElement classElement) {
return getAnnotationStringParam(classElement,
workbenchSplashScreen,
IDENTIFIER);
}
public static boolean getWbSplashScreenIsEnabledValueOnClass(TypeElement classElement) {
final Boolean bool = getAnnotationBooleanParam(classElement,
workbenchSplashScreen,
IS_ENABLED);
return bool == null || bool;
}
public static String getWbScreenIdentifierValueOnClass(TypeElement classElement) {
return getAnnotationStringParam(classElement,
workbenchScreen,
IDENTIFIER);
}
public static String getWbContextIdentifierValueOnClass(TypeElement classElement) {
return getAnnotationStringParam(classElement,
workbenchContext,
IDENTIFIER);
}
public static boolean isATemplate(Elements elementUtils,
Element element) {
return GeneratorUtils.getAnnotation(elementUtils,
element,
workbenchPanel) != null;
}
}