You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2012/12/06 11:10:34 UTC
[18/51] [partial] ISIS-188: moving modules into core
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java
new file mode 100644
index 0000000..bc73e02
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java
@@ -0,0 +1,122 @@
+/*
+ * 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.adapters;
+
+import org.apache.isis.applib.annotation.TypicalLength;
+import org.apache.isis.applib.profiles.Localization;
+
+/**
+ * Provides a mechanism for parsing and rendering string representations of
+ * objects.
+ *
+ * <p>
+ * Specifically, this interface embodies three related capabilties:
+ * <ul>
+ * <li>to parse a string representation and convert to an object.
+ * <li>to provide a string representation of the object, for use as its title.
+ * <li>to indicate the typical length of such a string representation.
+ * </ul>
+ *
+ * <p>
+ * For custom-written (as opposed to third-party) value types, the ability for
+ * the {@link Parser} to provide a title responsibilities overlap with other
+ * conventions for domain objects. Specifically, normally we write a
+ * <tt>title()</tt> method to return a title. In such cases a typical
+ * implementation of {@link Parser} would just delegate to the value type itself
+ * to obtain the title (ie invoking the <tt>title()</tt> method directly rather
+ * than having the framework do this).
+ *
+ * <p>
+ * Similarly, the ability to return a typical length also overlaps with the
+ * {@link TypicalLength} annotation; which is why {@link TypicalLength} cannot
+ * be applied to types, only to properties and parameters.
+ *
+ * <p>
+ * For third-party value types, eg {@link http://timeandmoney.sourceforge.net/
+ * Time-and-Money} there is no ability to write <tt>title()</tt> methods or
+ * annotated with {@link TypicalLength}; so this is the main reason that this
+ * interface has to deal with titles and lengths.
+ *
+ * <p>
+ * This interface is used in two complementary ways:
+ * <ul>
+ * <li>As one option, it allows objects to take control of their own parsing, by
+ * implementing directly. However, the instance is used as a factory for itself.
+ * The framework will instantiate an instance, invoke the appropriate method
+ * method, and use the returned object. The instantiated instance itself will be
+ * discarded.</li>
+ * <li>Alternatively, an implementor of this interface can be nominated in the
+ * {@link org.apache.isis.applib.annotation.Parseable} annotation, allowing a
+ * class that needs to be parseable to indicate how it can be parsed.</li>
+ *
+ * <p>
+ * Whatever the class that implements this interface, it must also expose either
+ * a <tt>public</tt> no-arg constructor, or (for implementations that also are
+ * <tt>Facet</tt>s) a <tt>public</tt> constructor that accepts a single
+ * <tt>FacetHolder</tt>. This constructor allows the framework to instantiate
+ * the object reflectively.
+ *
+ * @see DefaultsProvider
+ * @see EncoderDecoder
+ * @see ValueSemanticsProvider
+ */
+public interface Parser<T> {
+
+ /**
+ * Parses a string to an instance of the object.
+ *
+ * <p>
+ * Note that here the implementing class is acting as a factory for itself.
+ * @param localization TODO
+ * @param context
+ * - the context domain object for which the text is being
+ * parsed. For example +3 might mean add 3 to the current number.
+ */
+ T parseTextEntry(Object contextPojo, String entry, Localization localization);
+
+ /**
+ * The typical length of objects that can be parsed.
+ */
+ int typicalLength();
+
+ /**
+ * The title of the object.
+ */
+ String displayTitleOf(T object, Localization localization);
+
+ /**
+ * The title of the object using a mask.
+ */
+ String displayTitleOf(T object, String usingMask);
+
+ /**
+ * A title for the object that is valid but which may be easier to edit than
+ * the title provided by a
+ * {@link org.apache.isis.metamodel.facets.object.ident.TitleFacet}.
+ *
+ * <p>
+ * The idea here is that the viewer can display a parseable title for an
+ * existing object when, for example, the user initially clicks in the
+ * field. So, a date might be rendered via a {@link TitleFacet} as
+ * <tt>May 2, 2007</tt>, but its editable form might be <tt>20070502</tt>.
+ */
+ String parseableTitleOf(T existing);
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ParsingException.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ParsingException.java b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ParsingException.java
new file mode 100644
index 0000000..a219eaf
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ParsingException.java
@@ -0,0 +1,45 @@
+/*
+ * 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.adapters;
+
+/**
+ * Indicates that parsing has failed, ie the entry is illegal (rather than
+ * invalid).
+ */
+public class ParsingException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ public ParsingException() {
+ super();
+ }
+
+ public ParsingException(final String msg) {
+ super(msg);
+ }
+
+ public ParsingException(final String msg, final Throwable cause) {
+ super(msg, cause);
+ }
+
+ public ParsingException(final Throwable cause) {
+ super(cause);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
new file mode 100644
index 0000000..c062cba
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
@@ -0,0 +1,100 @@
+/*
+ * 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.adapters;
+
+import java.math.BigDecimal;
+
+import org.apache.isis.applib.annotation.Aggregated;
+import org.apache.isis.applib.annotation.Defaulted;
+import org.apache.isis.applib.annotation.Encodable;
+import org.apache.isis.applib.annotation.EqualByContent;
+import org.apache.isis.applib.annotation.Immutable;
+import org.apache.isis.applib.annotation.Parseable;
+import org.apache.isis.applib.annotation.Value;
+
+/**
+ * Provides a mechanism for providing a set of value semantics.
+ *
+ * <p>
+ * As explained in the Javadoc of the {@link Value} annotation, value semantics
+ * only actually implies that the type is {@link Aggregated aggregated}.
+ * However, values are very often also {@link Parseable}, {@link Encodable},
+ * {@link Immutable} and implement {@link EqualByContent} semantics. In
+ * addition, there may be a {@link Defaulted default value}.
+ *
+ * <p>
+ * This interface is used by {@link Value} to allow these semantics to be
+ * provided through a single point. Alternatively, {@link Value} supports this
+ * information being provided via the configuration files.
+ *
+ * <p>
+ * Whatever the class that implements this interface, it must also expose either
+ * a <tt>public</tt> no-arg constructor, or (for implementations that also are
+ * <tt>Facet</tt>s) a <tt>public</tt> constructor that accepts a
+ * <tt>FacetHolder</tt>, and <tt>IsisConfiguration</tt> and a
+ * <tt>ValueSemanticsProviderContext</tt>. This constructor is then used by the
+ * framework to instantiate the object reflectively.
+ *
+ * @see Parser
+ * @see EncoderDecoder
+ * @see DefaultsProvider
+ */
+public interface ValueSemanticsProvider<T> {
+
+ /**
+ * The {@link Parser}, if any.
+ *
+ * <p>
+ * If not <tt>null</tt>, implies that the value is {@link Parseable}.
+ */
+ Parser<T> getParser();
+
+ /**
+ * The {@link EncoderDecoder}, if any.
+ *
+ * <p>
+ * If not <tt>null</tt>, implies that the value is {@link Encodable}.
+ */
+ EncoderDecoder<T> getEncoderDecoder();
+
+ /**
+ * The {@link DefaultsProvider}, if any.
+ *
+ * <p>
+ * If not <tt>null</tt>, implies that the value has (or may have) a default.
+ */
+ DefaultsProvider<T> getDefaultsProvider();
+
+ /**
+ * Whether the value is {@link Immutable}.
+ */
+ boolean isImmutable();
+
+ /**
+ * Whether the value has {@link EqualByContent equal by content} semantics.
+ *
+ * <p>
+ * If so, then it must implement <tt>equals(Object)</tt> and
+ * <tt>hashCode()</tt> consistently. Examples in the Java language that do
+ * this are {@link String} and {@link BigDecimal}, for example.
+ */
+ boolean isEqualByContent();
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/package-info.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/package-info.java b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/package-info.java
new file mode 100644
index 0000000..0dc1b87
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/adapters/package-info.java
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+/**
+ * The classes in this package are used for implementing custom value types.
+ *
+ * <p>
+ * The {@link org.apache.isis.applib.adapters.ValueSemanticsProvider} interface
+ * allows the framework to recognize its corresponding type as being a value
+ * type (that is, having value semantics). The {@link org.apache.isis.applib.adapters.AbstractValueSemanticsProvider}
+ * class is an base adapter for this interface.
+ *
+ * <p>
+ * The association between {@link org.apache.isis.applib.adapters.ValueSemanticsProvider}
+ * and its corresponding type can be done in several ways. Most straightforward
+ * is to annotate the class with the {@link org.apache.isis.applib.annotation.Value}
+ * annotation. However, if the value type source code cannot be modified (for
+ * example, if it is a third-party type such as joda-time), then the association
+ * can be made using configuration properties.
+ */
+package org.apache.isis.applib.adapters;
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionOrder.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionOrder.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionOrder.java
new file mode 100644
index 0000000..534a9a1
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionOrder.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * Indicates the order that actions should be grouped/displayed in.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ActionOrder {
+ String value();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionSemantics.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionSemantics.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionSemantics.java
new file mode 100644
index 0000000..e27d8c3
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionSemantics.java
@@ -0,0 +1,82 @@
+/*
+ * 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 org.apache.isis.applib.util.Enums;
+
+/**
+ * Indicates that an instance cannot be persisted by a user, but only
+ * programmatically.
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ActionSemantics {
+
+ public enum Of {
+ /**
+ * Safe, with no side-effects.
+ *
+ * <p>
+ * In other words, a query-only action. By definition, is also idempotent.
+ */
+ SAFE,
+ /**
+ * Post-conditions are always the same, irrespective as to how many times called.
+ *
+ * <p>
+ * An example might be <tt>placeOrder()</tt>, that is a no-op if the order has already been placed.
+ */
+ IDEMPOTENT,
+ /**
+ * Neither safe nor idempotent; every invocation is likely to change the state of the object.
+ *
+ * <p>
+ * An example is increasing the quantity of a line item in an Order by 1.
+ */
+ NON_IDEMPOTENT;
+
+ public String getFriendlyName() {
+ return Enums.getFriendlyNameOf(this);
+ }
+
+ public String getCamelCaseName() {
+ return Enums.enumToCamelCase(this);
+ }
+
+ /**
+ * {@link #SAFE} is idempotent in nature, as well as, obviously, {@link #IDEMPOTENT}.
+ */
+ public boolean isIdempotentInNature() {
+ return this == SAFE || this == IDEMPOTENT;
+ }
+
+
+ }
+
+ Of value() default Of.NON_IDEMPOTENT;
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Aggregated.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Aggregated.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Aggregated.java
new file mode 100644
index 0000000..2afdad3
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Aggregated.java
@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+/**
+ * Indicates that every instance of this type is part of
+ * (aggregated within) a larger aggregate.
+ *
+ * <p>
+ * This is/should be interpreted by viewers as meaning that references to the
+ * object may not be shared between instances. So for example in the DnD viewer
+ * an aggregated object may not be drag/dropped into an empty "slot".
+ * Instead, the user would need to use copy/paste.
+ *
+ * @see Value
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Aggregated {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/AutoComplete.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/AutoComplete.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/AutoComplete.java
new file mode 100644
index 0000000..5115e75
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/AutoComplete.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.apache.isis.applib.bookmarks.Bookmark;
+
+/**
+ * Specifies a repository action to use to support auto-complete.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AutoComplete {
+
+ /**
+ * A candidate match for the auto-complete.
+ *
+ * <p>
+ * The auto-complete action is required to return a list of these instances.
+ * The title can be used by the viewer in the drop down, while the
+ * {@link #getBookmark()} identifies the object.
+ */
+ public static class Candidate {
+ private final String title;
+ private final Bookmark bookmark;
+ public Candidate(String title, Bookmark bookmark) {
+ this.title = title;
+ this.bookmark = bookmark;
+ }
+ public String getTitle() {
+ return title;
+ }
+ public Bookmark getBookmark() {
+ return bookmark;
+ }
+ }
+
+ /**
+ * The class of the repository to use.
+ *
+ * <p>
+ * It is sufficient to specify an interface rather than a concrete type.
+ */
+ Class<?> repository();
+
+ /**
+ * The action to use in order to perform the auto-complete search
+ * (defaults to "autoComplete").
+ *
+ * <p>
+ * The action is required to accept a single string parameter, and must return
+ *
+ */
+ String action() default "autoComplete";
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Bounded.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Bounded.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Bounded.java
new file mode 100644
index 0000000..4ee5034
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Bounded.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+/**
+ * Indicates that the class has a bounded, or finite, set of instances.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Bounded {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Debug.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Debug.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Debug.java
new file mode 100644
index 0000000..ca15538
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Debug.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+/**
+ * Indicates the an action should be only available for debugging.
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Debug {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Defaulted.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Defaulted.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Defaulted.java
new file mode 100644
index 0000000..2c0b266
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Defaulted.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.apache.isis.applib.adapters.DefaultsProvider;
+
+/**
+ * Indicates that the class should have a default, by providing a link to a
+ * {@link DefaultsProvider}, or some externally-configured mechanism.
+ *
+ * <p>
+ * This possibly seems a little tortuous. The more obvious means to provide a
+ * default would seem to be a simple <tt>@DefaultsTo(new SomeObject())</tt>.
+ * However, Java only allows primitives, strings and class literals to be used
+ * in annotations. We therefore need delegate to an external implementation.
+ * (This more complex design is also more flexible of course; the implementation
+ * of {@link DefaultsProvider} could adjust the default it provides according to
+ * circumstance, for example).
+ *
+ * @see Encodable
+ * @see Parseable
+ * @see Value
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Defaulted {
+
+ /**
+ * The fully qualified name of a class that implements the
+ * {@link DefaultsProvider} interface.
+ *
+ * <p>
+ * This is optional because some implementations may pick up the defaults
+ * provider via a configuration file, or via the equivalent
+ * {@link #defaultsProviderClass()}.
+ *
+ * <p>
+ * Implementation note: the default value provided here is simply an empty
+ * string because <tt>null</tt> is not a valid default.
+ */
+ String defaultsProviderName() default "";
+
+ /**
+ * As per {@link #defaultsProviderName()}, but specifying a class literal
+ * rather than a fully qualified class name.
+ *
+ * <p>
+ * Implementation note: the default value provided here is simply the
+ * {@link Defaulted}'s own class, because <tt>null</tt> is not a valid
+ * default.
+ */
+ Class<?> defaultsProviderClass() default Defaulted.class;
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/DescribedAs.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/DescribedAs.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/DescribedAs.java
new file mode 100644
index 0000000..a3414be
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/DescribedAs.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * Description of a property/action.
+ */
+@Inherited
+@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface DescribedAs {
+ String value();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Disabled.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Disabled.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Disabled.java
new file mode 100644
index 0000000..36cc7c5
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Disabled.java
@@ -0,0 +1,37 @@
+/*
+ * 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;
+
+/**
+ * Indicates that a property/action is to be always unavailable to the user.
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Disabled {
+ When when() default When.ALWAYS;
+ Where where() default Where.ANYWHERE;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Encodable.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Encodable.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Encodable.java
new file mode 100644
index 0000000..c641f37
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Encodable.java
@@ -0,0 +1,78 @@
+/*
+ * 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 org.apache.isis.applib.adapters.EncoderDecoder;
+
+/**
+ * Indicates that the class can be encoded or decoded either by delegating to an
+ * {@link EncoderDecoder} or through some externally-configured mechanism.
+ *
+ * @see Defaulted
+ * @see Parseable
+ * @see Value
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Encodable {
+
+ /**
+ * The fully qualified name of a class that implements the
+ * {@link EncoderDecoder} interface.
+ *
+ * <p>
+ * This is optional because some implementations may pick up encodeability
+ * via a configuration file, or via the equivalent
+ * {@link #encoderDecoderClass()}.
+ *
+ * <p>
+ * It is common for value classes to act as their own encoder/decoders. Note
+ * that the framework requires that the nominated class provides a
+ * <tt>public</tt> no-arg constructor on the class. It instantiates an
+ * instance in order to do the encoding or decoding, uses the result and
+ * discards the instantiated object. What that means in particular is that a
+ * self-encoding class shouldn't encode its own state, it should encode the
+ * state of the object passed to it.
+ *
+ * <p>
+ * Implementation note: the default value provided here is simply an empty
+ * string because <tt>null</tt> is not a valid default.
+ */
+ String encoderDecoderName() default "";
+
+ /**
+ * As per {@link #encoderDecoderName()}, but specifying a class literal
+ * rather than a fully qualified class name.
+ *
+ * <p>
+ * Implementation note: the default value provided here is simply the
+ * {@link Encodable}'s own class, because <tt>null</tt> is not a valid
+ * default.
+ */
+ Class<?> encoderDecoderClass() default Encodable.class;
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/EqualByContent.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/EqualByContent.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/EqualByContent.java
new file mode 100644
index 0000000..7d87a90
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/EqualByContent.java
@@ -0,0 +1,62 @@
+/*
+ * 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 java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+
+/**
+ * Indicates that the class follows the equal-by-content contract, usually
+ * associated with {@link Value value} types.
+ *
+ * <p>
+ * If a class claims to be equal-by-content then its {@link #equals(Object)}
+ * should return <tt>true</tt> if its content (as opposed to identity) is the
+ * same. For example, {@link String}, {@link BigDecimal} and {@link Date} follow
+ * this contract.
+ *
+ * <p>
+ * Note also that the Java Language Specification requires that two objects that
+ * are {@link #equals(Object) equal} must return the same value from
+ * {@link #hashCode()}. Failure to do this means that that the object will not
+ * behave correctly when used as a key into a hashing structure (eg a
+ * {@link HashMap}).
+ *
+ * <p>
+ * By default any {@link Value value} types are assumed to follow the
+ * equal-by-content rule, though this can be overridden if required. Value types
+ * are usually also {@link Immutable immutable} (though there are some classic
+ * exceptions to this, such as {@link Date}).
+ *
+ * @see Immutable
+ * @see Value
+ */
+@Inherited
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface EqualByContent {
+ When value() default When.ALWAYS;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Exploration.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Exploration.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Exploration.java
new file mode 100644
index 0000000..cddb41f
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Exploration.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+/**
+ * Indicates the an action should be only available in exploration mode
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Exploration {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Facets.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Facets.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Facets.java
new file mode 100644
index 0000000..4d88389
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Facets.java
@@ -0,0 +1,60 @@
+/*
+ * 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;
+
+/**
+ * Indicates that the class has additional facets, and specifies the how to
+ * obtain the <tt>FacetFactory</tt> to manufacture them.
+ *
+ * <p>
+ * At least one named factory (as per {@link #facetFactoryNames()}) or one class
+ * factory (as per {@link #facetFactoryClasses()}) should be specified.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Facets {
+ /**
+ * Array of fully qualified names of classes each implementing
+ * <tt>org.apache.isis.metamodel.facets.FacetFactory</tt>.
+ *
+ * <p>
+ * Either the array provided by this method or by
+ * {@link #facetFactoryClasses()} should be non-empty.
+ */
+ String[] facetFactoryNames() default {};
+
+ /**
+ * Array of {@link Class}s, each indicating a class implementing
+ * <tt>org.apache.isis.metamodel.facets.FacetFactory</tt>.
+ *
+ * <p>
+ * Either the array provided by this method or by
+ * {@link #facetFactoryNames()} should be non-empty.
+ */
+ Class<?>[] facetFactoryClasses() default {};
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/FieldOrder.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/FieldOrder.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/FieldOrder.java
new file mode 100644
index 0000000..f2b3494
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/FieldOrder.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * Indicates the order that properties should be displayed in.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface FieldOrder {
+ String value();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Hidden.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Hidden.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Hidden.java
new file mode 100644
index 0000000..caccc94
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Hidden.java
@@ -0,0 +1,42 @@
+/*
+ * 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;
+
+/**
+ * Indicates that a property, collection or action is to be hidden from the
+ * user.
+ *
+ * <p>
+ * For a repository action, is equivalent to {@link NotContributed} and also
+ * {@link NotInServiceMenu}.
+ */
+@Inherited
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Hidden {
+ When when() default When.ALWAYS;
+ Where where() default Where.ANYWHERE;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Idempotent.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Idempotent.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Idempotent.java
new file mode 100644
index 0000000..c79bdbb
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Idempotent.java
@@ -0,0 +1,45 @@
+/*
+ * 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;
+
+/**
+ * Indicates that an action is idempotent; invoking may modify domain object
+ * state, but invoking it once more will not make further changes (meaning that
+ * it is safe to invoke multiple times).
+ *
+ * <p>
+ * More formally, the post-conditions of the action are guaranteed to be the
+ * same whether called once or more than once.
+ *
+ * <p>
+ * Deprecated - use <tt>@ActionSemantics(Of.IDEMPOTENT)</tt> instead.
+ */
+@Deprecated
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Idempotent {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Ignore.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Ignore.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Ignore.java
new file mode 100644
index 0000000..c273d2d
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Ignore.java
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+/**
+ * Indicates that an property, collection or action should be ignored from the
+ * metamodel.
+ *
+ * <p>
+ * Use of this annotation is discouraged because of the nameclash with
+ * <tt>org.junit.Ignore</tt>.
+ *
+ * Instead, use {@link Programmatic}, which is functionally identical.
+ *
+ * @see Programmatic
+ */
+@Deprecated
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Ignore {
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Immutable.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Immutable.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Immutable.java
new file mode 100644
index 0000000..c892fa2
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Immutable.java
@@ -0,0 +1,50 @@
+/*
+ * 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;
+
+/**
+ * Indicates that an instance cannot be changed.
+ *
+ * <p>
+ * To make something always immutable used the form <tt>@Immutable</tt>. To make
+ * something immutable only once persisted use the form
+ * <tt>@Immutable(Immutable.ONCE_PERSISTED)</tt>.
+ *
+ * <p>
+ * By default any {@link Value value} types are assumed to be immutable, though
+ * this can be overridden if required. Immutable objects that are acting as a
+ * value type should almost certainly also follow the {@link EqualByContent
+ * equal-by-content} contract.
+ *
+ * @see Value
+ * @see EqualByContent
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Immutable {
+ When value() default When.ALWAYS;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Mask.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Mask.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Mask.java
new file mode 100644
index 0000000..1c48af3
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Mask.java
@@ -0,0 +1,200 @@
+/*
+ * 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;
+
+/**
+ * Provides a mask that a value entry should conform to
+ *
+ * A mask to apply to string attributes.
+ *
+ * <p>
+ * The characters that can be used are shown in the following table (adapted
+ * from masks used by Swing's MaskFormatter, Java's SimpleDateFormat and also
+ * Microsoft's MaskedEdit control):
+ *
+ * <table border='2'>
+ * <tr>
+ * <th align='center'>Character</th>
+ * <th align='center'>Description</th>
+ * <th align='center'>Source</th>
+ * </tr>
+ * <tr>
+ * <td align='center'>#</td>
+ * <td align='left'>Digit placeholder.</td>
+ * <td align='left'>MS, Swing</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>.</td>
+ * <td align='left'>Decimal placeholder. The actual character used is the one
+ * specified as the decimal placeholder in your international settings. This
+ * character is treated as a literal for masking purposes.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>,</td>
+ * <td align='left'>Thousands separator. The actual character used is the one
+ * specified as the thousands separator in your international settings. This
+ * character is treated as a literal for masking purposes.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>:</td>
+ * <td align='left'>Time separator. This character is treated as a literal for
+ * masking purposes.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>/</td>
+ * <td align='left'>Date separator. This character is treated as a literal for
+ * masking purposes.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>&</td>
+ * <td align='left'>Character placeholder. Valid values for this placeholder are
+ * ANSI characters in the following ranges: 32-126 and 128-255.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ *
+ * <tr>
+ * <td align='center'>A</td>
+ * <td align='left'>Alphanumeric character placeholder (
+ * <code>Character.isLetter</code> or <code>Character.isDigit</code>), with
+ * entry required. For example: a ~ z, A ~ Z, or 0 ~ 9.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ *
+ * <tr>
+ * <td align='center'>a</td>
+ * <td align='left'>Alphanumeric character placeholder (entry optional).</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>9</td>
+ * <td align='left'>Digit placeholder (entry optional). For example: 0 ~ 9.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>?</td>
+ * <td align='left'>Letter placeholder (<code>Character.isLetter</code>). For
+ * example: a ~ z or A ~ Z.</td>
+ * <td align='left'>MS, Swing</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>U</td>
+ * <td align='left'>Any character (<code>Character.isLetter</code>). All
+ * lowercase letters are mapped to upper case.</td>
+ * <td align='left'>Swing</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>L</td>
+ * <td align='left'>Any character (<code>Character.isLetter</code>). All
+ * lowercase letters are mapped to lower case.</td>
+ * <td align='left'>Swing</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>Literal</td>
+ * <td align='left'>All other symbols are displayed as literals; that is, as
+ * themselves.</td>
+ * <td align='left'>MS</td>
+ * </tr>
+ * </table>
+ *
+ * <p>
+ * Can also be specified for types that are annotated as <tt>@Value</tt> types.
+ * To apply, the value must have string semantics.
+ *
+ * <p>
+ * Not yet implemented:
+ * <table border='2'>
+ * <tr>
+ * <th align='center'>Character</th>
+ * <th align='center'>Description</th>
+ * <th align='center'>Source</th>
+ * </tr>
+ * <tr>
+ * <td align='center'>\ or '</td>
+ * <td align='left'>Treat the next character in the mask string as a literal.
+ * This allows you to include the '#', '&', 'A', and '?' characters in the mask.
+ * This character is treated as a literal for masking purposes.</td>
+ * <td align='left'>MS (\), Swing (')</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>H</td>
+ * <td align='left'>Character.isLetter or Character.isDigit.</td>
+ * <td align='left'>Swing</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>yy or yyyy</td>
+ * <td align='left'>Year, eg 1996; 96.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>MM</td>
+ * <td align='left'>Two digit representation of month, eg 07 for July.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>MMM</td>
+ * <td align='left'>Three character representation of month, eg <i>Jul</i> for
+ * July.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>d</td>
+ * <td align='left'>Day in month, eg 3 or 28.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>dd</td>
+ * <td align='left'>Two digit representation of day in month, eg 03 or 28.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>HH</td>
+ * <td align='left'>Two digit representation of hour in day (24 hour clock), eg
+ * 05 or 19.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>mm</td>
+ * <td align='left'>Minute in hour, eg 02 or 47.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * <tr>
+ * <td align='center'>ss</td>
+ * <td align='left'>Second in minute in hour, eg 08 or 35.</td>
+ * <td align='left'>DateFormat</td>
+ * </tr>
+ * </table>
+ *
+ */
+@Inherited
+@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Mask {
+ String value();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MaxLength.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MaxLength.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MaxLength.java
new file mode 100644
index 0000000..35626b7
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MaxLength.java
@@ -0,0 +1,40 @@
+/*
+ * 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;
+
+/**
+ * The maximum entry length of a field.
+ *
+ * <p>
+ * Can also be specified for types that are annotated as <tt>@Value</tt> types.
+ * To apply, the value must have string semantics.
+ */
+@Inherited
+@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MaxLength {
+ int value();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
new file mode 100644
index 0000000..9aed671
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberGroups.java
@@ -0,0 +1,51 @@
+/*
+ * 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;
+
+/**
+ * Indicates that the class has additional facets, and specifies the how to
+ * obtain the <tt>FacetFactory</tt> to manufacture them.
+ *
+ * <p>
+ * At least one named factory (as per {@link #facetFactoryNames()}) or one class
+ * factory (as per {@link #facetFactoryClasses()}) should be specified.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MemberGroups {
+
+ /**
+ * Array of group names, as they appear as names in the {@link MemberOrder} annotation.
+ *
+ * <p>
+ * The order in this list determines the order that the groups will be rendered. By convention
+ * any {@link MemberOrder} that does not have a {@link MemberOrder#name() name} is considered
+ * to be in the default group, whose name is hard-coded as <i>General</i>.
+ */
+ String[] value() default {};
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberOrder.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberOrder.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberOrder.java
new file mode 100644
index 0000000..3164278
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MemberOrder.java
@@ -0,0 +1,45 @@
+/*
+ * 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;
+
+/**
+ * Indicates the position a method should be placed in.
+ */
+@Inherited
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MemberOrder {
+
+ /**
+ * Number in Dewey Decimal format representing the order.
+ */
+ String sequence();
+
+ /**
+ * Name of the group this set should be known as.
+ */
+ String name() default "";
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MultiLine.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MultiLine.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MultiLine.java
new file mode 100644
index 0000000..008ba4b
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MultiLine.java
@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+/**
+ * Indicates that a string property may have more than one line (ie may contain
+ * carriage returns).
+ *
+ * <p>
+ * In addition you can specify the typical number of lines (defaults to 6) and
+ * whether the lines should not be wrapped (by default they will not be
+ * wrapped).
+ *
+ * <p>
+ * Can also be specified for types that are annotated as <tt>@Value</tt> types.
+ * To apply, the value must have string semantics.
+ *
+ * <p>
+ * Note that if this annotation is applied, then any choices for the property
+ * (ie as per a <tt>choicesXxx</tt> method) will be ignored.
+ */
+@Inherited
+@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MultiLine {
+
+ int numberOfLines() default 6;
+
+ boolean preventWrapping() default true;
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MustSatisfy.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MustSatisfy.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MustSatisfy.java
new file mode 100644
index 0000000..c139c3b
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/MustSatisfy.java
@@ -0,0 +1,45 @@
+/*
+ * 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 org.apache.isis.applib.spec.Specification;
+
+/**
+ *
+ */
+@Inherited
+@Target({ ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MustSatisfy {
+ /**
+ * The {@link Specification}(s) to be satisfied.
+ *
+ * <p>
+ * If more than one is provided, then all must be satisfied (in effect
+ * "AND"ed together).
+ */
+ Class<? extends Specification>[] value();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Named.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Named.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Named.java
new file mode 100644
index 0000000..b1d3a02
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/Named.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * Indicates the name that a property/action should be been known by.
+ */
+@Inherited
+@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Named {
+ String value();
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotContributed.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotContributed.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotContributed.java
new file mode 100644
index 0000000..b809565
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotContributed.java
@@ -0,0 +1,43 @@
+/*
+ * 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;
+
+/**
+ * Indicates the a (repository) action should be not be contributed.
+ *
+ * <p>
+ * It may still be appear in the repository menu (unless it has been annotated
+ * as {@link NotInServiceMenu}). If {@link Hidden}, then also implies that the
+ * menu should not be contributed.
+ *
+ * <p>
+ * Has no meanings for actions on regular entities.
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NotContributed {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java
new file mode 100644
index 0000000..2bcece5
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java
@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+/**
+ * Indicates the a (service) action should be not be displayed in the service
+ * menu.
+ *
+ * <p>
+ * It may still be contributed (unless it has been annotated as
+ * {@link NotContributed}). If {@link Hidden}, then also implies that the menu
+ * should not appear in the service menu.
+ *
+ * <p>
+ * Has no meanings for actions on regular entities.
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NotInServiceMenu {
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersistable.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersistable.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersistable.java
new file mode 100644
index 0000000..7bd25dc
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersistable.java
@@ -0,0 +1,61 @@
+/*
+ * 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 org.apache.isis.applib.marker.NonPersistable;
+import org.apache.isis.applib.marker.ProgramPersistable;
+import org.apache.isis.applib.util.Enums;
+
+/**
+ * Indicates that an instance cannot be persisted by a user, but only
+ * programmatically.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NotPersistable {
+
+ public enum By {
+ USER,
+ USER_OR_PROGRAM;
+
+ public static By lookupForMarkerInterface(final Class<?> cls) {
+ if (ProgramPersistable.class.isAssignableFrom(cls)) {
+ return USER;
+ } else if (NonPersistable.class.isAssignableFrom(cls)) {
+ return USER_OR_PROGRAM;
+ }
+ return null;
+ }
+
+ public String getFriendlyName() {
+ return Enums.getFriendlyNameOf(this);
+ }
+ }
+
+ By value() default By.USER_OR_PROGRAM;
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersisted.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersisted.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersisted.java
new file mode 100644
index 0000000..33a7a11
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/NotPersisted.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+/**
+ * Indicates that a property should not be persisted.
+ */
+@Inherited
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NotPersisted {
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/dbb64345/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ObjectType.java
----------------------------------------------------------------------
diff --git a/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ObjectType.java b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ObjectType.java
new file mode 100644
index 0000000..793c315
--- /dev/null
+++ b/framework/core/applib/src/main/java/org/apache/isis/applib/annotation/ObjectType.java
@@ -0,0 +1,40 @@
+/*
+ * 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;
+
+/**
+ * Provides a unique abbreviation for the object type, eg "CUS" for Customer.
+ *
+ * <p>
+ * This value, if specified, is used in the serialized form of the object's OID. An OID is
+ * used by the framework to unique identify an object over time (same concept as a URN).
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ObjectType {
+ String value();
+}