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 &quot;slot&quot;.
+ * 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 &quot;autoComplete&quot;).
+     * 
+     * <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'>&amp;</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
+     * &quot;AND&quot;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 &quot;CUS&quot; 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();
+}