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 2017/09/14 17:46:23 UTC

[01/13] isis git commit: ISIS-1616 - support for "As-is" HTML rendering

Repository: isis
Updated Branches:
  refs/heads/master ce866aaa3 -> 2ba098ce9


ISIS-1616 - support for "As-is" HTML rendering

+ introducing a new value type: Markup
+ Markup holds immutable HTML
+ Markup is applicable as action result and as property type


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/cdd7d0a1
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/cdd7d0a1
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/cdd7d0a1

Branch: refs/heads/master
Commit: cdd7d0a138fb220bc19e140d72963404c39688ac
Parents: b441012
Author: hobrom <ho...@gmx.at>
Authored: Fri Aug 18 15:47:02 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Fri Aug 18 15:47:02 2017 +0200

----------------------------------------------------------------------
 .../org/apache/isis/applib/value/Markup.java    |  76 +++++++++++++
 .../facets/value/markup/MarkupValueFacet.java   |  29 +++++
 ...ValueFacetUsingSemanticsProviderFactory.java |  38 +++++++
 .../markup/MarkupValueSemanticsProvider.java    | 113 +++++++++++++++++++
 .../scalars/ScalarPanelTextFieldAbstract.java   |   2 +-
 .../scalars/markup/MarkupComponent.java         |  65 +++++++++++
 .../components/scalars/markup/MarkupPanel.java  |  83 ++++++++++++++
 .../scalars/markup/MarkupPanelFactory.java      | 105 +++++++++++++++++
 .../scalars/markup/StandaloneMarkupPanel.html   |  32 ++++++
 .../scalars/markup/StandaloneMarkupPanel.java   |  35 ++++++
 10 files changed, 577 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java b/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
new file mode 100644
index 0000000..915f119
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
@@ -0,0 +1,76 @@
+/*
+ *  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.value;
+
+import java.io.Serializable;
+
+import org.apache.isis.applib.annotation.Value;
+
+/**
+ * Immutable value type holding pre-rendered HTML.    
+ * 
+ */
+@Value(semanticsProviderName = "org.apache.isis.core.metamodel.facets.value.markup.MarkupValueSemanticsProvider")
+public class Markup implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private final String html;
+	
+    public Markup() {
+		this(null);
+	}
+    
+    public Markup(String html) {
+		this.html = html!=null ? html : "";
+	}
+    
+    public String asString() {
+    	return html;
+    }
+    
+    public boolean isEqualTo(final Markup other) {
+        return this.html.equals(other.html);
+    }
+
+    public String title() {
+    	return "Markup[lenght="+html.length()+"]";
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass()) 
+            return false;
+        return isEqualTo((Markup) obj);
+    }
+
+    @Override
+    public int hashCode() {
+        return html.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return "Markup[lenght="+html.length()+", html="+html+"]";
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacet.java
new file mode 100644
index 0000000..434c24f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacet.java
@@ -0,0 +1,29 @@
+/*
+ *  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.core.metamodel.facets.value.markup;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+
+public interface MarkupValueFacet extends Facet {
+	String markupValue(ObjectAdapter object);
+    ObjectAdapter createValue(ObjectAdapter object, String html);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java
new file mode 100644
index 0000000..740e87c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java
@@ -0,0 +1,38 @@
+/*
+ *  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.core.metamodel.facets.value.markup;
+
+import org.apache.isis.applib.value.Markup;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
+
+public class MarkupValueFacetUsingSemanticsProviderFactory extends ValueFacetUsingSemanticsProviderFactory<Markup> {
+	
+	@Override
+	public void process(final ProcessClassContext processClassContext) {
+		final Class<?> type = processClassContext.getCls();
+		final FacetHolder holder = processClassContext.getFacetHolder();
+
+		if (type != Markup.class) {
+			return;
+		}
+		addFacets(new MarkupValueSemanticsProvider(holder, getContext()));
+	}
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemanticsProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemanticsProvider.java
new file mode 100644
index 0000000..bf19b44
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemanticsProvider.java
@@ -0,0 +1,113 @@
+/*
+ *  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.core.metamodel.facets.value.markup;
+
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.value.Markup;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+
+public class MarkupValueSemanticsProvider extends ValueSemanticsProviderAndFacetAbstract<Markup> implements MarkupValueFacet {
+
+	private static final int TYPICAL_LENGTH = 0;
+
+	private static Class<? extends Facet> type() {
+		return MarkupValueFacet.class;
+	}
+
+	private static final Markup DEFAULT_VALUE = null;
+	
+	 /**
+     * Required because implementation of {@link Parser} and
+     * {@link EncoderDecoder}.
+     */
+    public MarkupValueSemanticsProvider() {
+        this(null, null);
+    }
+
+	public MarkupValueSemanticsProvider(final FacetHolder holder, final ServicesInjector context) {
+        super(type(), holder, Markup.class, TYPICAL_LENGTH, null, Immutability.IMMUTABLE, EqualByContent.NOT_HONOURED, DEFAULT_VALUE, context);
+    }
+	
+    // //////////////////////////////////////////////////////////////////
+    // Parser
+    // //////////////////////////////////////////////////////////////////
+
+    @Override
+    protected Markup doParse(final Object context, final String html) {
+    	return doRestore(html);        
+    }
+
+	@Override
+	public String titleString(final Object object) {
+		return object != null? ((Markup)object).asString(): "[null]";
+	}
+
+	@Override
+	public String titleStringWithMask(final Object value, final String usingMask) {
+		return titleString(value);
+	}
+
+	// //////////////////////////////////////////////////////////////////
+    // MarkupValueFacet
+    // //////////////////////////////////////////////////////////////////
+
+    @Override
+    public String markupValue(final ObjectAdapter object) {
+        if (object == null) {
+            return "";
+        }
+        final Markup markup = (Markup) object.getObject();
+        return markup.asString();
+    }
+
+    @Override
+    public ObjectAdapter createValue(final ObjectAdapter object, final String html) {
+        final Markup markup = new Markup(html);
+        return getAdapterManager().adapterFor(markup);
+    }
+
+	// //////////////////////////////////////////////////////////////////
+	// EncoderDecoder
+	// //////////////////////////////////////////////////////////////////
+
+	@Override
+	protected String doEncode(final Object object) {
+		Markup markup = (Markup)object;
+		return markup.asString();
+	}
+
+	@Override
+	protected Markup doRestore(final String html) {
+		return new Markup(html);
+	}
+
+	// /////// toString ///////
+
+	@Override
+	public String toString() {
+		return "MarkupValueSemanticsProvider";
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 40cda67..4e6457b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -154,7 +154,7 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         component.add(new ReplaceDisabledTagWithReadonlyTagBehaviour());
     }
 
-    private MarkupContainer createScalarIfRegularFormGroup() {
+    protected MarkupContainer createScalarIfRegularFormGroup() {
         Fragment textFieldFragment = createTextFieldFragment("scalarValueContainer");
         final String name = getModel().getName();
         textField.setLabel(Model.of(name));

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
new file mode 100644
index 0000000..31ab585
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java
@@ -0,0 +1,65 @@
+/*
+ *  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.viewer.wicket.ui.components.scalars.markup;
+
+import org.apache.isis.applib.value.Markup;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.wicket.markup.ComponentTag;
+import org.apache.wicket.markup.MarkupStream;
+import org.apache.wicket.markup.html.WebComponent;
+import org.apache.wicket.markup.parser.XmlTag.TagType;
+import org.apache.wicket.model.IModel;
+
+public class MarkupComponent extends WebComponent {
+	
+	private static final long serialVersionUID = 1L;
+
+	public MarkupComponent(final String id, IModel<?> model){
+		super(id, model);
+	}
+
+	@Override
+	public void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag){
+		final ObjectAdapter objAdapter = (ObjectAdapter) getDefaultModelObject();
+		replaceComponentTagBody(markupStream, openTag, extractHtmlOrElse(objAdapter, ""));
+	}
+
+	@Override
+	protected void onComponentTag(ComponentTag tag)	{
+		super.onComponentTag(tag);
+		tag.setType(TagType.OPEN);
+	}
+	
+	// -- HELPER
+	
+	private CharSequence extractHtmlOrElse(ObjectAdapter objAdapter, final String fallback) {
+		
+		if(objAdapter==null || objAdapter.getObject()==null)
+			return fallback;
+		
+		final Object value = objAdapter.getObject();
+		
+		if(!(value instanceof Markup))
+			return fallback;
+		
+		return ((Markup)value).asString();
+		
+	}
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java
new file mode 100644
index 0000000..633daac
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanel.java
@@ -0,0 +1,83 @@
+/*
+ *  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.viewer.wicket.ui.components.scalars.markup;
+
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldParseableAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.Model;
+
+/**
+ * Panel for rendering scalars of type {@link org.apache.isis.applib.value.Markup}.
+ */
+public class MarkupPanel extends ScalarPanelTextFieldParseableAbstract 
+{
+
+	private static final long serialVersionUID = 1L;
+
+	public MarkupPanel(final String id, final ScalarModel scalarModel) {
+		super(id, scalarModel);
+	}
+
+	@Override
+	protected String getScalarPanelType() {
+		return "markupPanel";
+	}
+
+	@Override
+	protected MarkupContainer createScalarIfRegularFormGroup() {
+		
+		if(getModel().isEditMode()) {
+			// fallback to text editor
+			return super.createScalarIfRegularFormGroup();
+		}
+		
+		final MarkupComponent markupComponent = createMarkupComponent("scalarValueContainer");
+				
+		getTextField().setLabel(Model.of(getModel().getName()));
+
+		final FormGroup formGroup = new FormGroup(ID_SCALAR_IF_REGULAR, getTextField());
+		formGroup.add(markupComponent);
+
+		final String labelCaption = getRendering().getLabelCaption(getTextField());
+		final Label scalarName = createScalarName(ID_SCALAR_NAME, labelCaption);
+
+		formGroup.add(scalarName);
+
+		return formGroup;
+	}
+	
+    @Override
+    protected Component createComponentForCompact() {
+    	return createMarkupComponent(ID_SCALAR_IF_COMPACT);
+    }
+    
+    // -- HELPER
+    
+    private MarkupComponent createMarkupComponent(String id) {
+    	MarkupComponent markupComponent = new MarkupComponent(id, getModel());
+		markupComponent.setEnabled(false);
+		return markupComponent;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactory.java
new file mode 100644
index 0000000..c039489
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupPanelFactory.java
@@ -0,0 +1,105 @@
+/*
+ *  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.viewer.wicket.ui.components.scalars.markup;
+
+import org.apache.isis.applib.value.Markup;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.wicket.Component;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.IModel;
+
+/**
+ * {@link ComponentFactory} for {@link MarkupPanel}.
+ */
+public class MarkupPanelFactory extends ComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public MarkupPanelFactory(ComponentType componentType) {
+        super(componentType, MarkupPanel.class);
+    }
+
+    @Override
+    public ApplicationAdvice appliesTo(final IModel<?> model) {
+    	switch (getComponentType()) {
+		case SCALAR_NAME_AND_VALUE:
+			return appliesToIfScalar(model);
+		case VALUE:
+			return appliesToIfValue(model);
+		default:
+			return ApplicationAdvice.DOES_NOT_APPLY;
+		}
+    }
+    
+    @Override
+    public final Component createComponent(final String id, final IModel<?> model) {
+    	
+    	switch (getComponentType()) {
+		case SCALAR_NAME_AND_VALUE:
+			return createComponentIfScalar(id, model);
+		case VALUE:
+			return createComponentIfValue(id, model);
+		default:
+			return new Label(id, "MarkupPanelFactory.createComponent: case not handled '"+getComponentType()+"'");
+		}
+    }
+    
+    // -- VARIANTS OF APPLIES TO
+    
+	private ApplicationAdvice appliesToIfScalar(IModel<?> model) {
+		if (!(model instanceof ScalarModel))
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        
+        final ScalarModel scalarModel = (ScalarModel) model;
+        
+        if(!scalarModel.isScalarTypeAnyOf(org.apache.isis.applib.value.Markup.class)) 
+            return ApplicationAdvice.DOES_NOT_APPLY;
+
+        return appliesIf( !scalarModel.hasChoices() );
+	}
+	
+    private ApplicationAdvice appliesToIfValue(IModel<?> model) {
+    	if (!(model instanceof ValueModel))
+            return ApplicationAdvice.DOES_NOT_APPLY;
+    	final ValueModel valueModel = (ValueModel) model;
+    	final ObjectAdapter adapter = valueModel.getObject();
+    	if(adapter==null || adapter.getObject()==null)
+    		return ApplicationAdvice.DOES_NOT_APPLY;
+    	
+    	return appliesIf( adapter.getObject() instanceof Markup );
+	}
+
+    // -- VARIANTS OF CREATE COMPONENT
+    
+    private final Component createComponentIfScalar(final String id, final IModel<?> model) {
+        return new MarkupPanel(id, (ScalarModel) model);
+    }
+    
+    private final Component createComponentIfValue(final String id, final IModel<?> model) {
+        return new StandaloneMarkupPanel(id, (ValueModel) model);
+    }
+    
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.html
new file mode 100644
index 0000000..e6e4b64
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.html
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
+      xml:lang="en"  
+      lang="en">
+	<body>
+		<wicket:panel>
+			<div class="standaloneMarkupPanel standaloneValueComponentType">
+				<div wicket:id="standaloneValue" class="standaloneValue" />
+			</div>
+		</wicket:panel>
+	</body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/cdd7d0a1/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.java
new file mode 100644
index 0000000..60d665d
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/StandaloneMarkupPanel.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.viewer.wicket.ui.components.scalars.markup;
+
+import org.apache.isis.viewer.wicket.model.models.ValueModel;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class StandaloneMarkupPanel extends PanelAbstract<ValueModel> {
+
+    private static final long serialVersionUID = 1L;
+    private static final String ID_STANDALONE_VALUE = "standaloneValue";
+
+    public StandaloneMarkupPanel(final String id, final ValueModel valueModel) {
+        super(id, valueModel);
+        add(new MarkupComponent(ID_STANDALONE_VALUE, getModel()));
+    }
+
+}


[10/13] isis git commit: Merge branch 'ISIS-1715_pr-84'

Posted by da...@apache.org.
Merge branch 'ISIS-1715_pr-84'


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/40107995
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/40107995
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/40107995

Branch: refs/heads/master
Commit: 40107995b25b05d1bc9d72a65cf5512290a7165d
Parents: 09d46bd 1b60ce1
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Sep 14 15:13:24 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Sep 14 17:44:58 2017 +0100

----------------------------------------------------------------------
 .../core/commons/compare/SequenceCompare.java   | 92 ++++++++++++++++++++
 .../domainservice/DomainServiceMenuOrder.java   | 65 ++++++++++++++
 .../MemberOrderFacetComparator.java             | 60 +------------
 .../ServicesInstallerFromAnnotation.java        | 28 +-----
 .../serviceactions/ServiceActionUtil.java       | 34 ++++----
 .../serviceactions/ServiceAndAction.java        |  1 +
 6 files changed, 180 insertions(+), 100 deletions(-)
----------------------------------------------------------------------



[08/13] isis git commit: Fix ISIS-1698 CollectionLayout.defaultView not honored

Posted by da...@apache.org.
Fix ISIS-1698 CollectionLayout.defaultView not honored

Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/25c3f8e3
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/25c3f8e3
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/25c3f8e3

Branch: refs/heads/master
Commit: 25c3f8e357f090d09d4592b4d68a3afbe850ae75
Parents: 1b60ce1
Author: hobrom <ho...@gmx.at>
Authored: Tue Sep 12 21:58:51 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Tue Sep 12 21:58:51 2017 +0200

----------------------------------------------------------------------
 .../isis/viewer/wicket/ui/components/layout/bs3/col/Col.java | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/25c3f8e3/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
index 11dbd06..0770f66 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/col/Col.java
@@ -263,12 +263,14 @@ public class Col extends PanelAbstract<EntityModel> implements HasDynamicallyVis
             final RepeatingViewWithDynamicallyVisibleContent collectionRv =
                     new RepeatingViewWithDynamicallyVisibleContent(ID_COLLECTIONS);
 
+            final EntityModel entityModel = getModel();
+            final CollectionLayoutData snapshot = entityModel.getCollectionLayoutData();
+            
             for (CollectionLayoutData collection : collections) {
 
                 final String id = collectionRv.newChildId();
 
                 // we successively trample over the layout data; but that's ok, this is synchronous code anyway...
-                final EntityModel entityModel = getModel();
                 entityModel.setCollectionLayoutData(collection);
 
                 // the entityModel's getLayoutData() provides the hint as to which collection of the entity to render.
@@ -280,6 +282,10 @@ public class Col extends PanelAbstract<EntityModel> implements HasDynamicallyVis
             }
             div.add(collectionRv);
             visible = visible || collectionRv.isVisible();
+            
+            //XXX ISIS-1698 restore original state after trampling over
+            entityModel.setCollectionLayoutData(snapshot);
+            
         } else {
             Components.permanentlyHide(div, ID_COLLECTIONS);
         }


[07/13] isis git commit: Fix ISIS-1715 menuOrder Dewey Decimal format not honored

Posted by da...@apache.org.
Fix ISIS-1715 menuOrder Dewey Decimal format not honored

Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/1b60ce18
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/1b60ce18
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/1b60ce18

Branch: refs/heads/master
Commit: 1b60ce18f28e7369364e5712c546f6da32099c6a
Parents: 312ac31
Author: hobrom <ho...@gmx.at>
Authored: Tue Sep 12 18:03:50 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Tue Sep 12 18:03:50 2017 +0200

----------------------------------------------------------------------
 .../domainservice/DomainServiceMenuOrder.java   | 40 +++++++++-------
 .../ServicesInstallerFromAnnotation.java        |  2 +-
 .../serviceactions/ServiceActionUtil.java       |  3 --
 .../serviceactions/ServiceAndAction.java        |  6 +--
 .../serviceactions/ServiceAndActionOrder.java   | 49 --------------------
 5 files changed, 24 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1b60ce18/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
index f681449..67224b1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
@@ -22,40 +22,44 @@ package org.apache.isis.core.metamodel.facets.object.domainservice;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.core.commons.compare.SequenceCompare;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 
 public class DomainServiceMenuOrder {
+	
+	private final static String UNDEFINED = "" + Integer.MAX_VALUE;
 
-	public static int compare(ObjectAdapter serviceAdapter1, ObjectAdapter serviceAdapter2) {
-		
-		return SequenceCompare.compareNullLast(
-				orderOf(serviceAdapter1.getSpecification().getCorrespondingClass()),
-				orderOf(serviceAdapter2.getSpecification().getCorrespondingClass()) );
-	}
+	//TODO can be safely removed
+//	public static int compare(ObjectAdapter serviceAdapter1, ObjectAdapter serviceAdapter2) {
+//		return SequenceCompare.compareNullLast(
+//				orderOf(serviceAdapter1.getSpecification().getCorrespondingClass()),
+//				orderOf(serviceAdapter2.getSpecification().getCorrespondingClass()) );
+//	}
 	
-	// -- HELPER
-    
     public static String orderOf(final Class<?> cls) {
         final DomainServiceLayout domainServiceLayout = cls.getAnnotation(DomainServiceLayout.class);
         String dslayoutOrder = domainServiceLayout != null ? domainServiceLayout.menuOrder(): null;
         final DomainService domainService = cls.getAnnotation(DomainService.class);
-        String dsOrder = domainService != null ? domainService.menuOrder() : "" + Integer.MAX_VALUE;
-
-        return minimumOf(dslayoutOrder, dsOrder);
+        String dsOrder = domainService != null ? domainService.menuOrder() : null;
+        
+        String min = minimumOf(dslayoutOrder, dsOrder);
+        return min!=null ? min : UNDEFINED; 
     }
 
+	// -- HELPER
+
     private static String minimumOf(final String dslayoutOrder, final String dsOrder) {
-        if(isUndefined(dslayoutOrder)) {
+        if(isUndefined(dslayoutOrder))
             return dsOrder;
-        }
-        if(isUndefined(dsOrder)) {
+        if(isUndefined(dsOrder))
             return dslayoutOrder;
-        }
-        return dslayoutOrder.compareTo(dsOrder) < 0 ? dslayoutOrder : dsOrder;
+        
+        //XXX ISIS-1715 honor member order (use Dewey Decimal format)
+        return SequenceCompare.compareNullLast(dslayoutOrder, dsOrder) < 0
+        		? dslayoutOrder 
+        		: dsOrder;
     }
 
     private static boolean isUndefined(final String str) {
-        return str == null || str.equals("" + Integer.MAX_VALUE);
+        return str == null || str.equals(UNDEFINED);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1b60ce18/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
index e9031bb..5a2ca5a 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
@@ -233,7 +233,7 @@ public class ServicesInstallerFromAnnotation extends ServicesInstallerAbstract {
 
     //endregion
 
-    //region > helpers: orderOf, nameOf, asList
+    //region > helpers: nameOf, asList
 
     private static String nameOf(final Class<?> cls) {
         final DomainServiceLayout domainServiceLayout = cls.getAnnotation(DomainServiceLayout.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/1b60ce18/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
index efc2ea4..3f01ece 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
@@ -203,9 +203,6 @@ public final class ServiceActionUtil {
             collateServiceActions(serviceAdapter, ActionType.USER, serviceActions);
             collateServiceActions(serviceAdapter, ActionType.PROTOTYPE, serviceActions);
         }
-
-        //XXX ISIS-1715 honor member order
-        Collections.sort(serviceActions);
         
         final Set<String> serviceNamesInOrder = serviceNamesInOrder(serviceAdapters, serviceActions);
         final Map<String, List<ServiceAndAction>> serviceActionsByName = groupByServiceName(serviceActions);

http://git-wip-us.apache.org/repos/asf/isis/blob/1b60ce18/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
index 65ec519..436edbb 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
@@ -19,7 +19,7 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.serviceactions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 
-class ServiceAndAction implements Comparable<ServiceAndAction> {
+class ServiceAndAction {
     final String serviceName;
     final EntityModel serviceEntityModel;
     final ObjectAction objectAction;
@@ -42,8 +42,4 @@ class ServiceAndAction implements Comparable<ServiceAndAction> {
         return serviceName + " ~ " + objectAction.getIdentifier().toFullIdentityString();
     }
 
-	@Override
-	public int compareTo(ServiceAndAction other) {
-		return ServiceAndActionOrder.compare(this, other);
-	}
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1b60ce18/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java
deleted file mode 100644
index 19be3e1..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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.viewer.wicket.ui.components.actionmenu.serviceactions;
-
-import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
-import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceMenuOrder;
-import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
-
-class ServiceAndActionOrder {
-
-	private final static MemberOrderFacetComparator memberOrder = 
-			new MemberOrderFacetComparator(false);
-	
-	public static int compare(ServiceAndAction a, ServiceAndAction b) {
-		
-		int c  = a.serviceName.compareTo(b.serviceName);
-		if(c!=0)
-			return c;
-		
-		c = DomainServiceMenuOrder.compare(
-				a.serviceEntityModel.getObject(),
-				b.serviceEntityModel.getObject() );
-		if(c!=0)
-			return c;
-		
-		return memberOrder.compare(
-				a.objectAction.getFacet(MemberOrderFacet.class), 
-				b.objectAction.getFacet(MemberOrderFacet.class) );
-		
-	}
-
-}


[09/13] isis git commit: Merge branch 'ISIS-1616_pr-84'

Posted by da...@apache.org.
Merge branch 'ISIS-1616_pr-84'


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/09d46bdf
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/09d46bdf
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/09d46bdf

Branch: refs/heads/master
Commit: 09d46bdf48043c2fa52623fe996af6baa028d9c8
Parents: ce866aa 2f7a414
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Sep 14 15:12:10 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Sep 14 17:44:55 2017 +0100

----------------------------------------------------------------------
 .../org/apache/isis/applib/value/Markup.java    |  76 +++++++++++++
 .../facets/value/markup/MarkupValueFacet.java   |  29 +++++
 ...ValueFacetUsingSemanticsProviderFactory.java |  38 +++++++
 .../markup/MarkupValueSemanticsProvider.java    | 113 +++++++++++++++++++
 .../ComponentFactoryRegistrarDefault.java       |   5 +
 .../scalars/ScalarPanelTextFieldAbstract.java   |   2 +-
 .../scalars/markup/MarkupComponent.java         |  65 +++++++++++
 .../components/scalars/markup/MarkupPanel.java  |  83 ++++++++++++++
 .../scalars/markup/MarkupPanelFactory.java      | 105 +++++++++++++++++
 .../scalars/markup/StandaloneMarkupPanel.html   |  32 ++++++
 .../scalars/markup/StandaloneMarkupPanel.java   |  35 ++++++
 11 files changed, 582 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[12/13] isis git commit: ISIS-1715: adds unit test, removes commented out code.

Posted by da...@apache.org.
ISIS-1715: adds unit test, removes commented out code.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/4de5824f
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/4de5824f
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/4de5824f

Branch: refs/heads/master
Commit: 4de5824f98c8092c32a4a84ce3b0f691b65dc5b4
Parents: e54952a
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Sep 14 17:17:56 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Sep 14 17:45:03 2017 +0100

----------------------------------------------------------------------
 .../domainservice/DomainServiceMenuOrder.java   |  7 ---
 .../DomainServiceMenuOrder_UnitTest.java        | 65 ++++++++++++++++++++
 2 files changed, 65 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/4de5824f/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
index 67224b1..5443d41 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
@@ -27,13 +27,6 @@ public class DomainServiceMenuOrder {
 	
 	private final static String UNDEFINED = "" + Integer.MAX_VALUE;
 
-	//TODO can be safely removed
-//	public static int compare(ObjectAdapter serviceAdapter1, ObjectAdapter serviceAdapter2) {
-//		return SequenceCompare.compareNullLast(
-//				orderOf(serviceAdapter1.getSpecification().getCorrespondingClass()),
-//				orderOf(serviceAdapter2.getSpecification().getCorrespondingClass()) );
-//	}
-	
     public static String orderOf(final Class<?> cls) {
         final DomainServiceLayout domainServiceLayout = cls.getAnnotation(DomainServiceLayout.class);
         String dslayoutOrder = domainServiceLayout != null ? domainServiceLayout.menuOrder(): null;

http://git-wip-us.apache.org/repos/asf/isis/blob/4de5824f/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder_UnitTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder_UnitTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder_UnitTest.java
new file mode 100644
index 0000000..2960ea1
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder_UnitTest.java
@@ -0,0 +1,65 @@
+package org.apache.isis.core.metamodel.facets.object.domainservice;
+
+import org.junit.Test;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class DomainServiceMenuOrder_UnitTest {
+
+    @DomainService(menuOrder = "100")
+    public static class ServiceWithDomainService100 {
+    }
+
+    @DomainServiceLayout(menuOrder = "100")
+    public static class ServiceWithDomainServiceLayout100 {
+    }
+
+    @DomainService(menuOrder = "100")
+    @DomainServiceLayout(menuOrder = "101")
+    public static class ServiceWithDomainService100AndDomainServiceLayout101 {
+    }
+
+    @DomainService(menuOrder = "101")
+    @DomainServiceLayout(menuOrder = "100")
+    public static class ServiceWithDomainService101AndDomainServiceLayout100 {
+    }
+
+    @DomainService()
+    @DomainServiceLayout()
+    public static class ServiceWithDomainServiceAndDomainServiceLayout {
+    }
+
+    @DomainService()
+    public static class ServiceWithDomainService {
+    }
+
+    @DomainServiceLayout()
+    public static class ServiceWithDomainServiceLayout {
+    }
+
+    @Test
+    public void orderOf() throws Exception {
+        assertOrder(ServiceWithDomainService.class, Integer.MAX_VALUE - 100);
+        assertOrder(ServiceWithDomainServiceLayout.class, Integer.MAX_VALUE - 100);
+        assertOrder(ServiceWithDomainServiceAndDomainServiceLayout.class, Integer.MAX_VALUE - 100);
+
+        assertOrder(ServiceWithDomainService100.class, 100);
+        assertOrder(ServiceWithDomainServiceLayout100.class, 100);
+
+        assertOrder(ServiceWithDomainService100AndDomainServiceLayout101.class, 100);
+        assertOrder(ServiceWithDomainService101AndDomainServiceLayout100.class, 100);
+    }
+
+    private static void assertOrder(final Class<?> cls, final int expected) {
+        String menuOrder = DomainServiceMenuOrder.orderOf(cls);
+        assertThat(menuOrder, is(equalTo("" + expected)));
+    }
+
+
+
+}
\ No newline at end of file


[03/13] isis git commit: prevent NPE

Posted by da...@apache.org.
prevent NPE

Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/45b4d403
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/45b4d403
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/45b4d403

Branch: refs/heads/master
Commit: 45b4d403b032e93f04fd975345cfaf33ce1141bb
Parents: d795df2
Author: hobrom <ho...@gmx.at>
Authored: Fri Aug 18 18:39:52 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Fri Aug 18 18:39:52 2017 +0200

----------------------------------------------------------------------
 core/applib/src/main/java/org/apache/isis/applib/value/Markup.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/45b4d403/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java b/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
index 915f119..88eb641 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
@@ -45,7 +45,7 @@ public class Markup implements Serializable {
     }
     
     public boolean isEqualTo(final Markup other) {
-        return this.html.equals(other.html);
+        return other==null ? false : this.html.equals(other.html);
     }
 
     public String title() {


[02/13] isis git commit: ISIS-1616 - support for "As-is" HTML rendering

Posted by da...@apache.org.
ISIS-1616 -  support for "As-is" HTML rendering

Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/d795df24
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/d795df24
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/d795df24

Branch: refs/heads/master
Commit: d795df241a86656c070abb5629149344a98ef212
Parents: cdd7d0a
Author: hobrom <ho...@gmx.at>
Authored: Fri Aug 18 17:28:12 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Fri Aug 18 17:28:12 2017 +0200

----------------------------------------------------------------------
 .../registries/components/ComponentFactoryRegistrarDefault.java | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d795df24/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index b9a63c4..ec9e27d 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.viewer.registries.components;
 
 import com.google.inject.Singleton;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistrar;
 import org.apache.isis.viewer.wicket.ui.components.about.AboutPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.actionlink.ActionLinkPanelFactory;
@@ -54,6 +55,7 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath.JavaMathBigIn
 import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.JodaDateTimePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.JodaLocalDatePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.jodatime.JodaLocalDateTimePanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.*;
 import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanelFactory;
@@ -169,6 +171,7 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
     }
 
     protected void addComponentFactoriesForValue(final ComponentFactoryList componentFactories) {
+    	componentFactories.add(new MarkupPanelFactory(ComponentType.VALUE));
         componentFactories.add(new StandaloneValuePanelFactory());
     }
 
@@ -176,6 +179,8 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
 
         componentFactories.add(new ReferencePanelFactory());
 
+        componentFactories.add(new MarkupPanelFactory(ComponentType.SCALAR_NAME_AND_VALUE));
+        
         componentFactories.add(new BooleanPanelFactory());
         componentFactories.add(new BytePanelFactory());
         componentFactories.add(new ShortPanelFactory());


[06/13] isis git commit: Fix ISIS-1715 menuOrder not honored

Posted by da...@apache.org.
Fix ISIS-1715 menuOrder not honored

Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/312ac31b
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/312ac31b
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/312ac31b

Branch: refs/heads/master
Commit: 312ac31b770308a4dd14b115f30fcfc1cf2d45b4
Parents: 2f7a414
Author: hobrom <ho...@gmx.at>
Authored: Tue Sep 12 16:31:47 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Tue Sep 12 16:31:47 2017 +0200

----------------------------------------------------------------------
 .../core/commons/compare/SequenceCompare.java   | 92 ++++++++++++++++++++
 .../domainservice/DomainServiceMenuOrder.java   | 61 +++++++++++++
 .../MemberOrderFacetComparator.java             | 60 +------------
 .../ServicesInstallerFromAnnotation.java        | 26 +-----
 .../serviceactions/ServiceActionUtil.java       | 35 ++++----
 .../serviceactions/ServiceAndAction.java        |  7 +-
 .../serviceactions/ServiceAndActionOrder.java   | 49 +++++++++++
 7 files changed, 231 insertions(+), 99 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/312ac31b/core/metamodel/src/main/java/org/apache/isis/core/commons/compare/SequenceCompare.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/compare/SequenceCompare.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/compare/SequenceCompare.java
new file mode 100644
index 0000000..39b5355
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/compare/SequenceCompare.java
@@ -0,0 +1,92 @@
+/*
+ *  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.core.commons.compare;
+
+import java.util.StringTokenizer;
+
+public class SequenceCompare {
+
+    public static int compareNullLast(String sequence1, String sequence2) {
+        if (sequence1 == null && sequence2 == null) {
+            return 0;
+        }
+
+        if (sequence1 == null && sequence2 != null) {
+            return +1; // non-null before null
+        }
+        if (sequence1 != null && sequence2 == null) {
+            return -1; // non-null before null
+        }
+
+        final String[] components1 = componentsFor(sequence1);
+        final String[] components2 = componentsFor(sequence2);
+
+        final int length1 = components1.length;
+        final int length2 = components2.length;
+
+        // shouldn't happen but just in case.
+        if (length1 == 0 && length2 == 0) {
+            return 0;
+        }
+
+        // continue to loop until we run out of components.
+        int n = 0;
+        while (true) {
+            final int length = n + 1;
+            // check if run out of components in either side
+            if (length1 < length && length2 >= length) {
+                return -1; // o1 before o2
+            }
+            if (length2 < length && length1 >= length) {
+                return +1; // o2 before o1
+            }
+            if (length1 < length && length2 < length) {
+                // run out of components
+                return 0;
+            }
+            // we have this component on each side
+
+            int componentCompare = 0;
+            try {
+                final Integer c1 = Integer.valueOf(components1[n]);
+                final Integer c2 = Integer.valueOf(components2[n]);
+                componentCompare = c1.compareTo(c2);
+            } catch (final NumberFormatException nfe) {
+                // not integers compare as strings
+                componentCompare = components1[n].compareTo(components2[n]);
+            }
+
+            if (componentCompare != 0) {
+                return componentCompare;
+            }
+            // this component is the same; lets look at the next
+            n++;
+        }
+    }
+
+    private static String[] componentsFor(final String sequence) {
+        final StringTokenizer tokens = new StringTokenizer(sequence, ".", false);
+        final String[] components = new String[tokens.countTokens()];
+        for (int i = 0; tokens.hasMoreTokens(); i++) {
+            components[i] = tokens.nextToken();
+        }
+        return components;
+    }
+	
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/312ac31b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.java
new file mode 100644
index 0000000..f681449
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceMenuOrder.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.core.metamodel.facets.object.domainservice;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.core.commons.compare.SequenceCompare;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+
+public class DomainServiceMenuOrder {
+
+	public static int compare(ObjectAdapter serviceAdapter1, ObjectAdapter serviceAdapter2) {
+		
+		return SequenceCompare.compareNullLast(
+				orderOf(serviceAdapter1.getSpecification().getCorrespondingClass()),
+				orderOf(serviceAdapter2.getSpecification().getCorrespondingClass()) );
+	}
+	
+	// -- HELPER
+    
+    public static String orderOf(final Class<?> cls) {
+        final DomainServiceLayout domainServiceLayout = cls.getAnnotation(DomainServiceLayout.class);
+        String dslayoutOrder = domainServiceLayout != null ? domainServiceLayout.menuOrder(): null;
+        final DomainService domainService = cls.getAnnotation(DomainService.class);
+        String dsOrder = domainService != null ? domainService.menuOrder() : "" + Integer.MAX_VALUE;
+
+        return minimumOf(dslayoutOrder, dsOrder);
+    }
+
+    private static String minimumOf(final String dslayoutOrder, final String dsOrder) {
+        if(isUndefined(dslayoutOrder)) {
+            return dsOrder;
+        }
+        if(isUndefined(dsOrder)) {
+            return dslayoutOrder;
+        }
+        return dslayoutOrder.compareTo(dsOrder) < 0 ? dslayoutOrder : dsOrder;
+    }
+
+    private static boolean isUndefined(final String str) {
+        return str == null || str.equals("" + Integer.MAX_VALUE);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/312ac31b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberOrderFacetComparator.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberOrderFacetComparator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberOrderFacetComparator.java
index 2314454..05474af 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberOrderFacetComparator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/memberorderfacet/MemberOrderFacetComparator.java
@@ -20,8 +20,8 @@
 package org.apache.isis.core.metamodel.layout.memberorderfacet;
 
 import java.util.Comparator;
-import java.util.StringTokenizer;
 
+import org.apache.isis.core.commons.compare.SequenceCompare;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
 
 public class MemberOrderFacetComparator implements Comparator<MemberOrderFacet> {
@@ -47,63 +47,9 @@ public class MemberOrderFacetComparator implements Comparator<MemberOrderFacet>
         if (ensureInSameGroup && !m1.name().equals(m2.name())) {
             throw new IllegalArgumentException("Not in same group");
         }
+        
+        return SequenceCompare.compareNullLast(m1.sequence(), m2.sequence());
 
-        final String sequence1 = m1.sequence();
-        final String sequence2 = m2.sequence();
-
-        final String[] components1 = componentsFor(sequence1);
-        final String[] components2 = componentsFor(sequence2);
-
-        final int length1 = components1.length;
-        final int length2 = components2.length;
-
-        // shouldn't happen but just in case.
-        if (length1 == 0 && length2 == 0) {
-            return 0;
-        }
-
-        // continue to loop until we run out of components.
-        int n = 0;
-        while (true) {
-            final int length = n + 1;
-            // check if run out of components in either side
-            if (length1 < length && length2 >= length) {
-                return -1; // o1 before o2
-            }
-            if (length2 < length && length1 >= length) {
-                return +1; // o2 before o1
-            }
-            if (length1 < length && length2 < length) {
-                // run out of components
-                return 0;
-            }
-            // we have this component on each side
-
-            int componentCompare = 0;
-            try {
-                final Integer c1 = Integer.valueOf(components1[n]);
-                final Integer c2 = Integer.valueOf(components2[n]);
-                componentCompare = c1.compareTo(c2);
-            } catch (final NumberFormatException nfe) {
-                // not integers compare as strings
-                componentCompare = components1[n].compareTo(components2[n]);
-            }
-
-            if (componentCompare != 0) {
-                return componentCompare;
-            }
-            // this component is the same; lets look at the next
-            n++;
-        }
-    }
-
-    private static String[] componentsFor(final String sequence) {
-        final StringTokenizer tokens = new StringTokenizer(sequence, ".", false);
-        final String[] components = new String[tokens.countTokens()];
-        for (int i = 0; tokens.hasMoreTokens(); i++) {
-            components[i] = tokens.nextToken();
-        }
-        return components;
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/312ac31b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
index 9f2da65..e9031bb 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
@@ -46,6 +46,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryServiceUsingReflections;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
+import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceMenuOrder;
 import org.apache.isis.core.metamodel.util.DeweyOrderComparator;
 
 import static com.google.common.base.Predicates.and;
@@ -220,7 +221,7 @@ public class ServicesInstallerFromAnnotation extends ServicesInstallerAbstract {
         final List<Class<?>> domainServiceClasses = Lists.newArrayList(Iterables.filter(domainServiceTypes, instantiatable()));
         for (final Class<?> cls : domainServiceClasses) {
 
-            final String order = orderOf(cls);
+            final String order = DomainServiceMenuOrder.orderOf(cls);
             // we want the class name in order to instantiate it
             // (and *not* the value of the @DomainServiceLayout(named=...) annotation attribute)
             final String fullyQualifiedClassName = cls.getName();
@@ -234,29 +235,6 @@ public class ServicesInstallerFromAnnotation extends ServicesInstallerAbstract {
 
     //region > helpers: orderOf, nameOf, asList
 
-    private static String orderOf(final Class<?> cls) {
-        final DomainServiceLayout domainServiceLayout = cls.getAnnotation(DomainServiceLayout.class);
-        String dslayoutOrder = domainServiceLayout != null ? domainServiceLayout.menuOrder(): null;
-        final DomainService domainService = cls.getAnnotation(DomainService.class);
-        String dsOrder = domainService != null ? domainService.menuOrder() : "" + Integer.MAX_VALUE;
-
-        return minimumOf(dslayoutOrder, dsOrder);
-    }
-
-    private static String minimumOf(final String dslayoutOrder, final String dsOrder) {
-        if(isUndefined(dslayoutOrder)) {
-            return dsOrder;
-        }
-        if(isUndefined(dsOrder)) {
-            return dslayoutOrder;
-        }
-        return dslayoutOrder.compareTo(dsOrder) < 0 ? dslayoutOrder : dsOrder;
-    }
-
-    private static boolean isUndefined(final String str) {
-        return str == null || str.equals("" + Integer.MAX_VALUE);
-    }
-
     private static String nameOf(final Class<?> cls) {
         final DomainServiceLayout domainServiceLayout = cls.getAnnotation(DomainServiceLayout.class);
         String name = domainServiceLayout != null ? domainServiceLayout.named(): null;

http://git-wip-us.apache.org/repos/asf/isis/blob/312ac31b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
index 9d7569c..efc2ea4 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
@@ -19,27 +19,12 @@
 
 package org.apache.isis.viewer.wicket.ui.components.actionmenu.serviceactions;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.link.AbstractLink;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Fragment;
-import org.apache.wicket.model.Model;
-import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -58,8 +43,21 @@ import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ServiceActionsModel;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior;
-import org.apache.isis.viewer.wicket.ui.panels.PanelUtil;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.model.Model;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipBehavior;
 import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
@@ -206,6 +204,9 @@ public final class ServiceActionUtil {
             collateServiceActions(serviceAdapter, ActionType.PROTOTYPE, serviceActions);
         }
 
+        //XXX ISIS-1715 honor member order
+        Collections.sort(serviceActions);
+        
         final Set<String> serviceNamesInOrder = serviceNamesInOrder(serviceAdapters, serviceActions);
         final Map<String, List<ServiceAndAction>> serviceActionsByName = groupByServiceName(serviceActions);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/312ac31b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
index 8aecb15..65ec519 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndAction.java
@@ -19,7 +19,7 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.serviceactions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 
-class ServiceAndAction {
+class ServiceAndAction implements Comparable<ServiceAndAction> {
     final String serviceName;
     final EntityModel serviceEntityModel;
     final ObjectAction objectAction;
@@ -41,4 +41,9 @@ class ServiceAndAction {
     public String toString() {
         return serviceName + " ~ " + objectAction.getIdentifier().toFullIdentityString();
     }
+
+	@Override
+	public int compareTo(ServiceAndAction other) {
+		return ServiceAndActionOrder.compare(this, other);
+	}
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/312ac31b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java
new file mode 100644
index 0000000..19be3e1
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceAndActionOrder.java
@@ -0,0 +1,49 @@
+/*
+ *  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.viewer.wicket.ui.components.actionmenu.serviceactions;
+
+import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceMenuOrder;
+import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
+
+class ServiceAndActionOrder {
+
+	private final static MemberOrderFacetComparator memberOrder = 
+			new MemberOrderFacetComparator(false);
+	
+	public static int compare(ServiceAndAction a, ServiceAndAction b) {
+		
+		int c  = a.serviceName.compareTo(b.serviceName);
+		if(c!=0)
+			return c;
+		
+		c = DomainServiceMenuOrder.compare(
+				a.serviceEntityModel.getObject(),
+				b.serviceEntityModel.getObject() );
+		if(c!=0)
+			return c;
+		
+		return memberOrder.compare(
+				a.objectAction.getFacet(MemberOrderFacet.class), 
+				b.objectAction.getFacet(MemberOrderFacet.class) );
+		
+	}
+
+}


[04/13] isis git commit: typo

Posted by da...@apache.org.
typo

Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/66985739
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/66985739
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/66985739

Branch: refs/heads/master
Commit: 6698573948003018bf32b1c95a80f4e16515237a
Parents: 45b4d40
Author: hobrom <ho...@gmx.at>
Authored: Fri Aug 18 18:50:21 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Fri Aug 18 18:50:21 2017 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/isis/applib/value/Markup.java       | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/66985739/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java b/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
index 88eb641..212c334 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/value/Markup.java
@@ -49,7 +49,7 @@ public class Markup implements Serializable {
     }
 
     public String title() {
-    	return "Markup[lenght="+html.length()+"]";
+    	return "Markup[length="+html.length()+"]";
     }
 
     @Override
@@ -70,7 +70,7 @@ public class Markup implements Serializable {
 
     @Override
     public String toString() {
-        return "Markup[lenght="+html.length()+", html="+html+"]";
+        return "Markup[length="+html.length()+", html="+html+"]";
     }
     
 }


[11/13] isis git commit: Merge branch 'ISIS-1698_pr-84'

Posted by da...@apache.org.
Merge branch 'ISIS-1698_pr-84'


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/e54952a7
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/e54952a7
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/e54952a7

Branch: refs/heads/master
Commit: e54952a72fafb3c73c5b0134e39b5f9351b57ab2
Parents: 4010799 25c3f8e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Sep 14 15:13:59 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Sep 14 17:45:01 2017 +0100

----------------------------------------------------------------------
 .../isis/viewer/wicket/ui/components/layout/bs3/col/Col.java | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[05/13] isis git commit: Merge branch 'master' of https://github.com/apache/isis

Posted by da...@apache.org.
Merge branch 'master' of https://github.com/apache/isis

Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/2f7a414f
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/2f7a414f
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/2f7a414f

Branch: refs/heads/master
Commit: 2f7a414f74afcf046ad96dbb23db060f3c9c46c2
Parents: 6698573 3c0750a
Author: hobrom <ho...@gmx.at>
Authored: Tue Sep 12 10:47:51 2017 +0200
Committer: hobrom <ho...@gmx.at>
Committed: Tue Sep 12 10:47:51 2017 +0200

----------------------------------------------------------------------
 .../asciidoc/guides/dg/_dg_ide_intellij.adoc    | 68 ++++++++++----------
 .../guides/rgcfg/_rgcfg_configuring-core.adoc   |  4 +-
 .../rgcms/_rgcms_methods_reserved_disable.adoc  |  6 +-
 .../main/asciidoc/guides/rgmvn/_rgmvn_xsd.adoc  |  2 +-
 ...dless-access_BackgroundCommandExecution.adoc |  2 +-
 .../_ugbtb_hints-and-tips_are-you-sure.adoc     |  8 +--
 ...g_disabling-persistence-by-reachability.adoc |  2 +-
 .../_ugsec_configuring-isis-to-use-shiro.adoc   |  2 +-
 ...and-tips_configuring-isis-to-use-bypass.adoc |  2 +-
 ...c_shiro-realm-implementations_ini-realm.adoc |  2 +-
 ...o-realm-implementations_isis-ldap-realm.adoc | 12 ++--
 ...ations_isisaddons-security-module-realm.adoc |  4 +-
 ..._shiro-realm-implementations_jdbc-realm.adoc |  2 +-
 .../_ugtst_fixture-scripts_api-and-usage.adoc   |  4 +-
 ...gtst_integ-test-support_wrapper-factory.adoc |  2 +-
 .../asciidoc/guides/ugtst/_ugtst_overview.adoc  |  2 +-
 .../documentation/src/main/asciidoc/index.html  | 17 ++++-
 .../main/asciidoc/js/toc-scroll/toc-scroll.js   | 35 ++++++----
 .../_migration-notes_1.14.0-to-1.15.0.adoc      | 23 ++++++-
 .../documentation/src/main/asciidoc/quotes.adoc | 14 ++++
 core/pom.xml                                    | 12 +++-
 .../scalars/ScalarPanelSelect2Abstract.java     |  4 +-
 .../scalars/reference/ReferencePanel.java       | 19 +-----
 .../valuechoices/ValueChoicesSelect2Panel.java  | 24 +------
 .../application/manifest/isis.properties        | 12 +++-
 .../webapp/src/main/webapp/WEB-INF/shiro.ini    | 10 +--
 26 files changed, 164 insertions(+), 130 deletions(-)
----------------------------------------------------------------------



[13/13] isis git commit: ISIS-1616: adds documentation and DataNucleus support

Posted by da...@apache.org.
ISIS-1616: adds documentation and DataNucleus support


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/2ba098ce
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/2ba098ce
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/2ba098ce

Branch: refs/heads/master
Commit: 2ba098ce91a1f3cd596cc3b65167f7a55050e240
Parents: 4de5824
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Sep 14 18:43:47 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Sep 14 18:43:47 2017 +0100

----------------------------------------------------------------------
 .../rgcms/_rgcms_classes_value-types.adoc       | 125 +++++++------------
 .../_rgcms_classes_value-types_Markup.adoc      |  44 +++++++
 .../guides/rgcms/images/value-types/markup.png  | Bin 0 -> 19232 bytes
 .../typeconverters/IsisMarkupConverter.java     |  43 +++++++
 core/runtime/src/main/resources/plugin.xml      |  18 +++
 5 files changed, 147 insertions(+), 83 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/2ba098ce/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types.adoc b/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types.adoc
index 4093814..e2a1dcd 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types.adoc
@@ -4,116 +4,75 @@
 :_basedir: ../../
 :_imagesdir: images/
 
-NOTE: FIXME
 
+Apache Isis can render and persist all of the JDK primitives and wrapper classes, and a number of other JDK (7.x) classes that represent value types.
 
+It also supports some of the link:http://www.joda.org/joda-time/[Joda-Time] datatypes, and a number of value types that are shipped by the framework itself.
 
-.JDK Classes
-[cols="1,1", options="header"]
-|===
+In addition to primitives, the JDK Classes supported are:
 
-|Type
-|Description
+* the wrapper classes:
 
-|`java.lang.Boolean`
-|
+** `java.lang.Boolean`
+** `java.lang.Character`
+**`java.lang.Double`
+**`java.lang.Float`
+**`java.lang.Integer`
+**`java.lang.Long`
+**`java.lang.Short`
 
-|`java.lang.Character`
-|
+* `java.lang.String`
 
-|`java.lang.Double`
-|
+* numeric data types:
 
-|`java.lang.Float`
-|
+** `java.math.BigDecimal`
+** `java.math.BigInteger`
 
-|`java.lang.Integer`
-|
+* date types:
 
-|`java.lang.Long`
-|
+** `java.sql.Date`
+** `java.sql.Time`
+** `java.sql.Timestamp`
+** `java.util.Date`
 
-|`java.lang.Short`
-|
+It supports these Joda-Time classes:
 
-|`java.lang.String`
-|
+* `org.joda.time.DateTime`
+* `org.joda.time.LocalDateTime`
+* `org.joda.time.LocalDate`
 
-|`java.math.BigDecimal`
-|
 
-|`java.math.BigInteger`
-|
+The value types defined by the framework itself (in the applib) are:
 
-|`java.sql.Date`
-|
+* `o.a.i.applib.value.Blob`
++
+binary large object, eg PDFs or images
 
-|`java.sql.Time`
-|
+* `o.a.i.applib.value.Clob`
 
-|`java.sql.Timestamp`
-|
++
+character large objects, eg XML
 
-|`java.util.Date`
-|
+* `o.a.i.applib.value.Money`
 
-|===
++
+A currency and amount
 
+* `o.a.i.applib.value.Password`
 
-.JodaTime classes
-[cols="1,1", options="header"]
-|===
++
+A simple wrapper around a string, but never shown in plain-text.
 
-|Type
-|Description
+* `o.a.i.applib.value.Markup`
 
-|`org.joda.time.DateTime`
-|
-
-|`org.joda.time.LocalDateTime`
-|
-
-|`org.joda.time.LocalDate`
-|
-
-|===
-
-
-
-
-.Isis Applib classes
-[cols="1,1", options="header"]
-|===
-
-|Type
-|Description
-
-|`o.a.i.applib.value.` +
-`Blob`
-|
-
-|`o.a.i.applib.value.` +
-`Clob`
-|
-
-|`o.a.i.applib.value.` +
-`Color`
-|
-
-|`o.a.i.applib.value.` +
-`Money`
-|
-
-|`o.a.i.applib.value.` +
-`Password`
-|
-
-|===
++
+(As of `1.15.1-SNAPSHOT`), intended for use as a read-only property to display arbitrary HTML.
 
 
 
 include::_rgcms_classes_value-types_Blob.adoc[leveloffset=+1]
 include::_rgcms_classes_value-types_Clob.adoc[leveloffset=+1]
-include::_rgcms_classes_value-types_Color.adoc[leveloffset=+1]
+//include::_rgcms_classes_value-types_Color.adoc[leveloffset=+1]
 include::_rgcms_classes_value-types_Money.adoc[leveloffset=+1]
 include::_rgcms_classes_value-types_Password.adoc[leveloffset=+1]
+include::_rgcms_classes_value-types_Markup.adoc[leveloffset=+1]

http://git-wip-us.apache.org/repos/asf/isis/blob/2ba098ce/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types_Markup.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types_Markup.adoc b/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types_Markup.adoc
new file mode 100644
index 0000000..679bf4d
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/rgcms/_rgcms_classes_value-types_Markup.adoc
@@ -0,0 +1,44 @@
+[[_rgcms_classes_value-types_Markup]]
+= `Markup`
+:Notice: 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.
+:_basedir: ../../
+:_imagesdir: images/
+
+
+The `Markup` value type (introduced in `1.15.1-SNAPSHOT`) is intended to be used as a read-only property, to render arbitrary markup into the user interface.
+
+For example:
+
+image::{_imagesdir}value-types/markup.png[width="px",link="{_imagesdir}value-types/markup/.png"]
+
+Corresponds to:
+
+[source,java]
+----
+@javax.jdo.annotations.Persistent
+@javax.jdo.annotations.Column(allowsNull = "true", length = 4000)
+@lombok.Getter @lombok.Setter
+@Property(optionality=Optionality.OPTIONAL, editing = Editing.DISABLED)
+private Markup someMarkup;
+
+public BlobClobObject updateSomeMarkup(Markup markup) {
+    setSomeMarkup(markup);
+    return this;
+}
+public Markup defaultUpdate0SomeMarkup(String markup) {
+    return getSomeMarkup();
+}
+----
+
+with this corresponding `layout.xml`:
+
+[source,xml]
+----
+<cpt:fieldSet name="Markup" id="markup">
+    <cpt:action id="updateSomeMarkup"/>
+    <cpt:property id="someMarkup" labelPosition="NONE">
+    </cpt:property>
+</cpt:fieldSet>
+----
+
+If the property is also editable then an text edit box is also displayed - unlikely to be the desired effect.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/2ba098ce/adocs/documentation/src/main/asciidoc/guides/rgcms/images/value-types/markup.png
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/rgcms/images/value-types/markup.png b/adocs/documentation/src/main/asciidoc/guides/rgcms/images/value-types/markup.png
new file mode 100644
index 0000000..3f6ef43
Binary files /dev/null and b/adocs/documentation/src/main/asciidoc/guides/rgcms/images/value-types/markup.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/2ba098ce/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.java
new file mode 100644
index 0000000..f709ec9
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/typeconverters/IsisMarkupConverter.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.objectstore.jdo.datanucleus.typeconverters;
+
+import org.datanucleus.store.types.converters.TypeConverter;
+
+import org.apache.isis.applib.value.Markup;
+
+public class IsisMarkupConverter implements TypeConverter<Markup, String>{
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public String toDatastoreType(final Markup memberValue) {
+        return memberValue != null
+                ? memberValue.asString()
+                : null;
+    }
+
+    @Override
+    public Markup toMemberType(final String datastoreValue) {
+        return datastoreValue != null
+                ? new Markup(datastoreValue)
+                : null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2ba098ce/core/runtime/src/main/resources/plugin.xml
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/resources/plugin.xml b/core/runtime/src/main/resources/plugin.xml
index ffbcff1..24c94e3 100644
--- a/core/runtime/src/main/resources/plugin.xml
+++ b/core/runtime/src/main/resources/plugin.xml
@@ -68,6 +68,13 @@
                 converter-name="isis.password-string" />
     </extension>
 
+    <extension point="org.datanucleus.java_type">
+        <java-type
+                name="org.apache.isis.applib.value.Markup"
+                dfg="true"
+                converter-name="isis.markup-string" />
+    </extension>
+
     <!--
     http://www.datanucleus.org/extensions/type_converter.html
     -->
@@ -79,4 +86,15 @@
                 converter-class="org.apache.isis.objectstore.jdo.datanucleus.typeconverters.IsisPasswordConverter"/>
     </extension>
 
+    <!--
+    http://www.datanucleus.org/extensions/type_converter.html
+    -->
+    <extension point="org.datanucleus.type_converter">
+        <type-converter
+                name="isis.markup-string"
+                member-type="org.apache.isis.applib.value.Markup"
+                datastore-type="java.lang.String"
+                converter-class="org.apache.isis.objectstore.jdo.datanucleus.typeconverters.IsisMarkupConverter"/>
+    </extension>
+
 </plugin>