/*
* Copyright (c) 2009, SQL Power Group Inc.
*
* This file is part of SQL Power Library.
*
* SQL Power Library is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* SQL Power 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package ca.sqlpower.object.annotation;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import ca.sqlpower.dao.helper.SPPersisterHelper;
import ca.sqlpower.object.SPObject;
/**
* This {@link Annotation} defines a getter method in an {@link SPObject} class
* as an accessor for a persistable property. The getter method name must be in
* a JavaBean format. Every persistable property should have a respective
* annotated setter and getter method. Thus, there should be an equal number of
* {@link Accessor} and {@link Mutator} annotations within each {@link SPObject}
* class. The {@link SPAnnotationProcessorFactory} should recognize this
* annotation as a supported annotation type by the
* {@link SPAnnotationProcessorFactory#supportedAnnotationTypes()} method. The
* {@link SPAnnotationProcessor} needs to validate that a given method in
* {@link SPObject} is tagged with this annotation before proceeding to generate
* source code for the
* {@link SPPersisterHelper#findProperty(SPObject, String, ca.sqlpower.dao.session.SessionPersisterSuperConverter)}
* method.
* <p>
* This annotation is retained at runtime for the benefits of tests only. There
* will be no need to access this annotation at runtime when the app is running.
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Accessor {
/**
* Set to true if the user would be interested in knowing about this
* property when we are displaying diffs between objects.
*/
boolean isInteresting() default false;
/**
* Defines whether the property the annotated getter method returns should
* be persisted if its value is null. A false value means the property
* should not be persisted if its value is null. There may be cases where a
* certain property is null and should not be persisted. For example, the
* currentCube property in OlapQuery in Wabit. Thus the getCurrentCube()
* method for OlapQuery should be annotated as
* <code>@Accessor(persistOnlyIfNonNull = true)</code>. By default, this is
* false.
*/
boolean persistOnlyIfNonNull() default false;
/**
* Defines the additional properties that this property depends on when
* persisting to an {@link SPPersister}, for converting from a complex to
* basic type. For example, the OlapQuery's currentCube property in Wabit
* requires olapDataSource in order to persist correctly. Thus the
* getCurrentCube() method for OlapQuery should be annotated as
* <code>@Accessor(additionalInfo = {"currentCube"})</code>.
*
* @see SessionPersisterSuperConverter#convertToBasicType(Object, Object...)
*/
String[] additionalInfo() default {};
}