/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.isis.applib.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.jdo.annotations.NotPersistent;
import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
import org.apache.isis.applib.spec.Specification;
import org.apache.isis.applib.value.Blob;
import org.apache.isis.applib.value.Clob;
/**
* Domain semantics for domain object property.
*/
@Inherited
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Property {
/**
* Indicates that changes to the property that should be posted to the
* {@link org.apache.isis.applib.services.eventbus.EventBusService event bus} using a custom (subclass of)
* {@link org.apache.isis.applib.services.eventbus.PropertyDomainEvent}.
*
* <p>For example:
* </p>
*
* <pre>
* public static class StartDateChanged extends PropertyDomainEvent { ... }
*
* @Property(domainEvent=StartDateChanged.class)
* public LocalDate getStartDate() { ...}
* </pre>
*
* <p>
* Only domain services should be registered as subscribers; only domain services are guaranteed to be instantiated
* and resident in memory. The typical implementation of a domain service subscriber is to identify the impacted
* entities, load them using a repository, and then to delegate to the event to them.
* </p>
*
* <p>
* This subclass must provide a no-arg constructor; the fields are set reflectively.
* </p>
*/
Class<? extends PropertyDomainEvent<?,?>> domainEvent() default PropertyDomainEvent.Default.class;
/**
* Indicates where the property is not visible to the user.
*/
Where hidden() default Where.NOWHERE;
/**
* Whether the properties of this domain object can be edited, or collections of this object be added to/removed from.
*
* <p>
* Note that non-editable objects can nevertheless have actions invoked upon them.
* </p>
*/
Editing editing() default Editing.AS_CONFIGURED;
/**
* If {@link #editing()} is set to {@link Editing#DISABLED},
* then the reason to provide to the user as to why this property cannot be edited.
*/
String editingDisabledReason() default "";
/**
* Whether the property edit should be reified into a {@link org.apache.isis.applib.services.command.Command} object.
*/
CommandReification command() default CommandReification.AS_CONFIGURED;
/**
* How the {@link org.apache.isis.applib.services.command.Command Command} object provided by the
* {@link org.apache.isis.applib.services.command.CommandContext CommandContext} domain service should be persisted.
*/
CommandPersistence commandPersistence() default CommandPersistence.PERSISTED;
/**
* How the command/property edit should be executed.
*
* <p>
* If the corresponding {@link org.apache.isis.applib.services.command.Command Command} object is persisted,
* then its {@link org.apache.isis.applib.services.command.Command#getExecuteIn() invocationType} property
* will be set to this value.
* </p>
*/
CommandExecuteIn commandExecuteIn() default CommandExecuteIn.FOREGROUND;
/**
* Whether the property edit should be published.
*
* <p>
* Requires that an implementation of the {@link org.apache.isis.applib.services.publish.PublishingService}
* or {@link org.apache.isis.applib.services.publish.PublisherService} is registered with the framework.
* </p>
*/
Publishing publishing() default Publishing.AS_CONFIGURED;
/**
* The maximum entry length of a field.
*
* <p>
* The default value (<code>-1</code>) indicates that no maxLength has been specified.
* </p>
*/
int maxLength() default -1;
/**
* The {@link org.apache.isis.applib.spec.Specification}(s) to be satisfied by this property.
*
* <p>
* If more than one is provided, then all must be satisfied (in effect "AND"ed together).
* </p>
*/
Class<? extends Specification>[] mustSatisfy() default {};
// //////////////////////////////////////
/**
* Indicates that the property should be excluded from snapshots.
*
* <p>
* To ensure that the property is actually not persisted in the objectstore, also annotate with {@link NotPersistent}.
* </p>
*/
boolean notPersisted() default false;
/**
* Whether this property is optional or is mandatory (ie required).
*
* <p>
* For properties the default value, {@link org.apache.isis.applib.annotation.Optionality#DEFAULT}, usually
* means that the property is required unless it has been overridden by {@link javax.jdo.annotations.Column}
* with its {@link javax.jdo.annotations.Column#allowsNull() allowNulls()} attribute set to true.
* </p>
*/
Optionality optionality() default Optionality.DEFAULT;
/**
* Regular expression pattern that a value should conform to, and can be formatted as.
*/
String regexPattern() default "";
/**
* Pattern flags, as per {@link java.util.regex.Pattern#compile(String, int)} .
*
* <p>
* The default value, <code>0</code>, means that no flags have been specified.
* </p>
*/
int regexPatternFlags() default 0;
/**
* Replacement text for the pattern in generated error message.
*/
String regexPatternReplacement() default "Doesn't match pattern";
/**
* For uploading {@link Blob} or {@link Clob}, optionally restrict the files accepted (eg <tt>.xslx</tt>).
*
* <p>
* The value should be of the form "file_extension|audio/*|video/*|image/*|media_type".
* </p>
*
* @see <a href="http://www.w3schools.com/tags/att_input_accept.asp">http://www.w3schools.com</a>
*/
String fileAccept() default "";
}