You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2012/12/03 14:24:33 UTC

[3/3] ISIS-282: mostly implemented

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/MoneyValueSemanticsProviderTest.java
----------------------------------------------------------------------
diff --git a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/MoneyValueSemanticsProviderTest.java b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/MoneyValueSemanticsProviderTest.java
index 23f7d39..2933b15 100644
--- a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/MoneyValueSemanticsProviderTest.java
+++ b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/MoneyValueSemanticsProviderTest.java
@@ -45,8 +45,6 @@ public class MoneyValueSemanticsProviderTest extends ValueSemanticsProviderAbstr
     @Before
     public void setUpObjects() throws Exception {
         Locale.setDefault(Locale.UK);
-        setupSpecification(Money.class);
-        // originalMoney = new Money(10.5, "gbp");
         holder = new FacetHolderImpl();
         setValue(adapter = new MoneyValueSemanticsProvider(holder, mockConfiguration, mockContext));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PercentageValueSemanticsProviderTest.java
----------------------------------------------------------------------
diff --git a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PercentageValueSemanticsProviderTest.java b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PercentageValueSemanticsProviderTest.java
index b0ba505..2696e12 100644
--- a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PercentageValueSemanticsProviderTest.java
+++ b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PercentageValueSemanticsProviderTest.java
@@ -45,8 +45,6 @@ public class PercentageValueSemanticsProviderTest extends ValueSemanticsProvider
             }
         });
 
-        setupSpecification(Percentage.class);
-
         percentage = new Percentage(0.105f);
         allowMockAdapterToReturn(percentage);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PolishMoneyValueSemanticsProviderTest.java
----------------------------------------------------------------------
diff --git a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PolishMoneyValueSemanticsProviderTest.java b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PolishMoneyValueSemanticsProviderTest.java
index 4e9cad1..1bb9068 100644
--- a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PolishMoneyValueSemanticsProviderTest.java
+++ b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/PolishMoneyValueSemanticsProviderTest.java
@@ -53,7 +53,6 @@ public class PolishMoneyValueSemanticsProviderTest extends ValueSemanticsProvide
     @Before
     public void setUpObjects() throws Exception {
         Locale.setDefault(new Locale("pl", "PL"));
-        setupSpecification(Money.class);
         originalMoney = new Money(10.50, "pln");
         holder = new FacetHolderImpl();
         setValue(adapter = new MoneyValueSemanticsProvider(holder, mockConfiguration, mockContext));

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/TimeValueSemanticsProviderTest.java
----------------------------------------------------------------------
diff --git a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/TimeValueSemanticsProviderTest.java b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/TimeValueSemanticsProviderTest.java
index 78ff1e7..bc67d2f 100644
--- a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/TimeValueSemanticsProviderTest.java
+++ b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/TimeValueSemanticsProviderTest.java
@@ -49,7 +49,6 @@ public class TimeValueSemanticsProviderTest extends ValueSemanticsProviderAbstra
         });
 
         TestClock.initialize();
-        setupSpecification(Time.class);
         time = new Time(8, 13);
         holder = new FacetHolderImpl();
         setValue(adapter = new TimeValueSemanticsProvider(holder, mockConfiguration, mockContext));

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
----------------------------------------------------------------------
diff --git a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index c4c6138..898cd4d 100644
--- a/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -20,8 +20,10 @@
 package org.apache.isis.core.progmodel.facets.value;
 
 import static org.apache.isis.core.testsupport.jmock.ReturnArgumentJMockAction.returnArgument;
+import static org.hamcrest.CoreMatchers.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
 import java.util.Locale;
@@ -29,6 +31,7 @@ import java.util.Locale;
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.After;
+import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -56,7 +59,6 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-
     private ValueSemanticsProviderAndFacetAbstract<?> valueSemanticsProvider;
     private EncodableFacetUsingEncoderDecoder encodeableFacet;
     private ParseableFacetUsingParser parseableFacet;
@@ -134,19 +136,13 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
         return parseableFacet;
     }
 
-    protected void setupSpecification(final Class<?> type) {
-        // final TestProxySpecification specification =
-        // system.getSpecification(cls);
-        // specification.setupHasNoIdentity(true);
-    }
-
     protected ObjectAdapter createAdapter(final Object object) {
-        // return system.createAdapterForTransient(object);
         return mockAdapter;
     }
 
     @Test
     public void testParseNull() throws Exception {
+        Assume.assumeThat(valueSemanticsProvider.getParser(), is(not(nullValue())));
         try {
             valueSemanticsProvider.parseTextEntry(null, null, null);
             fail();
@@ -156,18 +152,24 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
 
     @Test
     public void testParseEmptyString() throws Exception {
+        Assume.assumeThat(valueSemanticsProvider.getParser(), is(not(nullValue())));
+
         final Object newValue = valueSemanticsProvider.parseTextEntry(null, "", null);
         assertNull(newValue);
     }
 
     @Test
     public void testDecodeNULL() throws Exception {
+        Assume.assumeThat(valueSemanticsProvider.getEncoderDecoder(), is(not(nullValue())));
+        
         final Object newValue = encodeableFacet.fromEncodedString(EncodableFacetUsingEncoderDecoder.ENCODED_NULL);
         assertNull(newValue);
     }
 
     @Test
     public void testEmptyEncoding() {
+        Assume.assumeThat(valueSemanticsProvider.getEncoderDecoder(), is(not(nullValue())));
+
         assertEquals(EncodableFacetUsingEncoderDecoder.ENCODED_NULL, encodeableFacet.toEncodedString(null));
     }
 
@@ -175,5 +177,4 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     public void testTitleOfForNullObject() {
         assertEquals("", valueSemanticsProvider.displayTitleOf(null, (Localization) null));
     }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 408160a..dd5fded 100644
--- a/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -155,12 +155,14 @@ import org.apache.isis.core.progmodel.facets.properties.validate.perspec.MustSat
 import org.apache.isis.core.progmodel.facets.properties.validate.regexannot.RegExFacetAnnotationForPropertyFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.bigdecimal.BigDecimalValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.biginteger.BigIntegerValueTypeFacetFactory;
+import org.apache.isis.core.progmodel.facets.value.blobs.BlobValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.booleans.BooleanPrimitiveValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.booleans.BooleanWrapperValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.bytes.BytePrimitiveValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.bytes.ByteWrapperValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.chars.CharPrimitiveValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.chars.CharWrapperValueTypeFacetFactory;
+import org.apache.isis.core.progmodel.facets.value.clobs.ClobValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.color.ColorValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.date.DateValueTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.value.datejodalocal.JodaLocalDateValueTypeFacetFactory;
@@ -401,7 +403,11 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(JavaSqlTimeStampValueTypeFacetFactory.class);
         addFactory(StringValueTypeFacetFactory.class);
 
+        addFactory(JavaAwtImageValueTypeFacetFactory.class);
+        
         // applib values
+        addFactory(BlobValueTypeFacetFactory.class);
+        addFactory(ClobValueTypeFacetFactory.class);
         addFactory(DateValueTypeFacetFactory.class);
         addFactory(DateTimeValueTypeFacetFactory.class);
         addFactory(ColorValueTypeFacetFactory.class);
@@ -411,7 +417,6 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(TimeStampValueTypeFacetFactory.class);
         addFactory(TimeValueTypeFacetFactory.class);
         addFactory(ImageValueTypeFacetFactory.class);
-        addFactory(JavaAwtImageValueTypeFacetFactory.class);
 
         // jodatime values
         addFactory(JodaLocalDateValueTypeFacetFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/runtimes/dflt/objectstores/jdo/jdo-applib/src/main/resources/plugin.xml
----------------------------------------------------------------------
diff --git a/framework/runtimes/dflt/objectstores/jdo/jdo-applib/src/main/resources/plugin.xml b/framework/runtimes/dflt/objectstores/jdo/jdo-applib/src/main/resources/plugin.xml
index 41474b3..426a18b 100644
--- a/framework/runtimes/dflt/objectstores/jdo/jdo-applib/src/main/resources/plugin.xml
+++ b/framework/runtimes/dflt/objectstores/jdo/jdo-applib/src/main/resources/plugin.xml
@@ -32,6 +32,19 @@
             dfg="true" 
             embedded="true"
             long-converter="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.IsisDateTimeConverter"/>
+
+        <java-type 
+            name="org.apache.isis.applib.value.Blob" 
+            persistent="true" 
+            dfg="false" 
+            embedded="true"
+            string-converter="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.IsisBlobConverter"/>
+        <java-type 
+            name="org.apache.isis.applib.value.Clob" 
+            persistent="true" 
+            dfg="false" 
+            embedded="true"
+            string-converter="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.IsisClobConverter"/>
     </extension>
 
     <extension point="org.datanucleus.store_mapping">
@@ -41,15 +54,13 @@
         <mapping 
             java-type="org.apache.isis.applib.value.DateTime" 
             mapping-class="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.IsisDateTimeMapping"/>
-<!--        <mapping 
-            java-type="org.joda.time.LocalDate" 
-            mapping-class="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.JodaLocalDateMapping"/>
+
         <mapping 
-            java-type="org.joda.time.DateTime" 
-            mapping-class="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.JodaDateTimeMapping"/>
+            java-type="org.apache.isis.applib.value.Blob" 
+            mapping-class="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.IsisBlobMapping"/>
         <mapping 
-            java-type="org.joda.time.LocalDateTime" 
-            mapping-class="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.JodaLocalDateTimeMapping"/>
--->
+            java-type="org.apache.isis.applib.value.Clob" 
+            mapping-class="org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes.IsisClobMapping"/>
+
     </extension>
 </plugin>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 939bff5..d85b382 100644
--- a/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -63,6 +63,10 @@ import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSessi
 import org.apache.isis.runtimes.dflt.runtime.system.transaction.EnlistedObjectDirtying;
 import org.apache.isis.runtimes.dflt.runtime.system.transaction.IsisTransactionManager;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
 /**
  * Configuration files are read in the usual fashion (as per {@link Installer#getConfigurationResources()}, ie will consult all of:
  * <ul>

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobConverter.java
----------------------------------------------------------------------
diff --git a/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobConverter.java b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobConverter.java
new file mode 100644
index 0000000..aadd5fc
--- /dev/null
+++ b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobConverter.java
@@ -0,0 +1,27 @@
+package org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes;
+
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.core.progmodel.facets.value.blobs.BlobValueSemanticsProvider;
+import org.datanucleus.store.types.converters.TypeConverter;
+
+public class IsisBlobConverter implements TypeConverter<Blob, String>{
+
+    private static final long serialVersionUID = 1L;
+    private EncoderDecoder<Blob> encoderDecoder;
+
+    public IsisBlobConverter() {
+        encoderDecoder = new BlobValueSemanticsProvider().getEncoderDecoder();
+    }
+    
+    @Override
+    public String toDatastoreType(Blob memberValue) {
+        return encoderDecoder.toEncodedString(memberValue);
+    }
+
+    @Override
+    public Blob toMemberType(String datastoreValue) {
+        return encoderDecoder.fromEncodedString(datastoreValue);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobMapping.java
----------------------------------------------------------------------
diff --git a/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobMapping.java b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobMapping.java
new file mode 100644
index 0000000..02d50ee
--- /dev/null
+++ b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisBlobMapping.java
@@ -0,0 +1,88 @@
+package org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes;
+
+import org.apache.isis.applib.value.Blob;
+import org.datanucleus.ClassLoaderResolver;
+import org.datanucleus.ClassNameConstants;
+import org.datanucleus.NucleusContext;
+import org.datanucleus.metadata.AbstractMemberMetaData;
+import org.datanucleus.store.ExecutionContext;
+import org.datanucleus.store.mapped.DatastoreContainerObject;
+import org.datanucleus.store.mapped.MappedStoreManager;
+import org.datanucleus.store.mapped.mapping.SingleFieldMultiMapping;
+
+public class IsisBlobMapping extends SingleFieldMultiMapping {
+
+    public IsisBlobMapping() {
+    }
+    
+    @Override
+    public Class<?> getJavaType() {
+        return org.apache.isis.applib.value.Blob.class;
+    }
+
+    public void initialize(AbstractMemberMetaData mmd, DatastoreContainerObject container, ClassLoaderResolver clr)
+    {
+        super.initialize(mmd, container, clr);
+        addDatastoreFields();
+    }
+
+    public void initialize(MappedStoreManager storeMgr, String type)
+    {
+        super.initialize(storeMgr, type);
+        addDatastoreFields();
+    }
+
+    protected void addDatastoreFields()
+    {
+        addDatastoreField(ClassNameConstants.JAVA_LANG_STRING); // name
+        addDatastoreField(ClassNameConstants.JAVA_LANG_STRING); // mime type
+        addDatastoreField(ClassNameConstants.JAVA_LANG_BYTE_ARRAY); // bytes
+    }
+
+    public Object getValueForDatastoreMapping(NucleusContext nucleusCtx, int index, Object value)
+    {
+        Blob blob = ((Blob)value);
+        switch (index) {
+            case 0: return blob.getName();
+            case 1: return blob.getMimeType().getBaseType();
+            case 2: return blob.getBytes();
+        }
+        throw new IndexOutOfBoundsException();
+    }
+
+    public void setObject(ExecutionContext ec, Object preparedStmt, int[] exprIndex, Object value)
+    {
+        Blob blob = ((Blob)value);
+        if (blob == null) {
+            getDatastoreMapping(0).setObject(preparedStmt, exprIndex[0], null);
+            getDatastoreMapping(1).setObject(preparedStmt, exprIndex[1], null);
+            getDatastoreMapping(2).setObject(preparedStmt, exprIndex[2], null);
+        } else {
+            getDatastoreMapping(0).setString(preparedStmt, exprIndex[0], blob.getName());
+            getDatastoreMapping(1).setString(preparedStmt, exprIndex[1], blob.getMimeType().getBaseType());
+            getDatastoreMapping(2).setObject(preparedStmt, exprIndex[2], blob.getBytes());
+        }
+    }
+    
+    public Object getObject(ExecutionContext ec, Object resultSet, int[] exprIndex)
+    {
+        try
+        {
+            // Check for null entries
+            if (getDatastoreMapping(0).getObject(resultSet, exprIndex[0]) == null)
+            {
+                return null;
+            }
+        }
+        catch (Exception e)
+        {
+            // Do nothing
+        }
+
+        String name = getDatastoreMapping(0).getString(resultSet, exprIndex[0]); 
+        String mimeTypeBase = getDatastoreMapping(1).getString(resultSet, exprIndex[1]); 
+        byte[] bytes = (byte[]) getDatastoreMapping(2).getObject(resultSet,exprIndex[2]); 
+        return new Blob(name, mimeTypeBase, bytes);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobConverter.java
----------------------------------------------------------------------
diff --git a/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobConverter.java b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobConverter.java
new file mode 100644
index 0000000..024b619
--- /dev/null
+++ b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobConverter.java
@@ -0,0 +1,27 @@
+package org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes;
+
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.value.Clob;
+import org.apache.isis.core.progmodel.facets.value.clobs.ClobValueSemanticsProvider;
+import org.datanucleus.store.types.converters.TypeConverter;
+
+public class IsisClobConverter implements TypeConverter<Clob, String>{
+
+    private static final long serialVersionUID = 1L;
+    private EncoderDecoder<Clob> encoderDecoder;
+
+    public IsisClobConverter() {
+        encoderDecoder = new ClobValueSemanticsProvider().getEncoderDecoder();
+    }
+    
+    @Override
+    public String toDatastoreType(Clob memberValue) {
+        return encoderDecoder.toEncodedString(memberValue);
+    }
+
+    @Override
+    public Clob toMemberType(String datastoreValue) {
+        return encoderDecoder.fromEncodedString(datastoreValue);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobMapping.java
----------------------------------------------------------------------
diff --git a/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobMapping.java b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobMapping.java
new file mode 100644
index 0000000..5ab97fa
--- /dev/null
+++ b/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/valuetypes/IsisClobMapping.java
@@ -0,0 +1,88 @@
+package org.apache.isis.runtimes.dflt.objectstores.jdo.datanucleus.valuetypes;
+
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.value.Clob;
+import org.datanucleus.ClassLoaderResolver;
+import org.datanucleus.ClassNameConstants;
+import org.datanucleus.NucleusContext;
+import org.datanucleus.metadata.AbstractMemberMetaData;
+import org.datanucleus.store.ExecutionContext;
+import org.datanucleus.store.mapped.DatastoreContainerObject;
+import org.datanucleus.store.mapped.MappedStoreManager;
+import org.datanucleus.store.mapped.mapping.SingleFieldMultiMapping;
+
+public class IsisClobMapping extends SingleFieldMultiMapping {
+
+    public IsisClobMapping() {
+    }
+    
+    @Override
+    public Class<?> getJavaType() {
+        return org.apache.isis.applib.value.Clob.class;
+    }
+
+    public void initialize(AbstractMemberMetaData mmd, DatastoreContainerObject container, ClassLoaderResolver clr)
+    {
+        super.initialize(mmd, container, clr);
+        addDatastoreFields();
+    }
+
+    public void initialize(MappedStoreManager storeMgr, String type)
+    {
+        super.initialize(storeMgr, type);
+        addDatastoreFields();
+    }
+
+    protected void addDatastoreFields()
+    {
+        addDatastoreField(ClassNameConstants.JAVA_LANG_STRING); // name
+        addDatastoreField(ClassNameConstants.JAVA_LANG_STRING); // mime type
+        addDatastoreField(ClassNameConstants.JAVA_LANG_CHARACTER_ARRAY); // chars
+    }
+
+    public Object getValueForDatastoreMapping(NucleusContext nucleusCtx, int index, Object value)
+    {
+        Clob clob = ((Clob)value);
+        switch (index) {
+            case 0: return clob.getName();
+            case 1: return clob.getMimeType().getBaseType();
+            case 2: return clob.getChars();
+        }
+        throw new IndexOutOfBoundsException();
+    }
+
+    public void setObject(ExecutionContext ec, Object preparedStmt, int[] exprIndex, Object value)
+    {
+        Clob clob = ((Clob)value);
+        if (clob == null) {
+            getDatastoreMapping(0).setObject(preparedStmt, exprIndex[0], null);
+            getDatastoreMapping(1).setObject(preparedStmt, exprIndex[1], null);
+            getDatastoreMapping(2).setObject(preparedStmt, exprIndex[2], null);
+        } else {
+            getDatastoreMapping(0).setString(preparedStmt, exprIndex[0], clob.getName());
+            getDatastoreMapping(1).setString(preparedStmt, exprIndex[1], clob.getMimeType().getBaseType());
+            getDatastoreMapping(2).setObject(preparedStmt, exprIndex[2], clob.getChars());
+        }
+    }
+    
+    public Object getObject(ExecutionContext ec, Object resultSet, int[] exprIndex)
+    {
+        try
+        {
+            // Check for null entries
+            if (getDatastoreMapping(0).getObject(resultSet, exprIndex[0]) == null)
+            {
+                return null;
+            }
+        }
+        catch (Exception e)
+        {
+            // Do nothing
+        }
+
+        String name = getDatastoreMapping(0).getString(resultSet, exprIndex[0]); 
+        String mimeTypeBase = getDatastoreMapping(1).getString(resultSet, exprIndex[1]); 
+        char[] chars = (char[]) getDatastoreMapping(2).getObject(resultSet,exprIndex[2]); 
+        return new Clob(name, mimeTypeBase, chars);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/memento/Memento.java
----------------------------------------------------------------------
diff --git a/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/memento/Memento.java b/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/memento/Memento.java
index fab702c..7ae622f 100644
--- a/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/memento/Memento.java
+++ b/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/memento/Memento.java
@@ -89,7 +89,7 @@ public class Memento implements Serializable {
     ////////////////////////////////////////////////
 
     private Data createData(final ObjectAdapter adapter) {
-        if (adapter.getSpecification().isParentedOrFreeCollection()) {
+        if (adapter.getSpecification().isParentedOrFreeCollection() && !adapter.getSpecification().isEncodeable()) {
             return createCollectionData(adapter);
         } else {
             return createObjectData(adapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.css
----------------------------------------------------------------------
diff --git a/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.css b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.css
new file mode 100644
index 0000000..eaeea17
--- /dev/null
+++ b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.css
@@ -0,0 +1,18 @@
+/*
+ *  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.
+ */

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.html
----------------------------------------------------------------------
diff --git a/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.html b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.html
new file mode 100644
index 0000000..3c6603d
--- /dev/null
+++ b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.html
@@ -0,0 +1,41 @@
+<?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.
+-->
+<html>
+	<body>
+		<wicket:panel>
+			<div class="isisBlobPanel scalarNameAndValueComponentType">
+				<label for="scalarValue" wicket:id="scalarIfRegular">
+	      			<span wicket:id="scalarName" class="scalarName">[Label text]</span>
+	      			<span class="scalarValue">
+		      			<input type="file" name="scalarValue" id="scalarValue" wicket:id="scalarValue"/>
+	      			</span>
+                    <a wicket:id="scalarIfRegularDownload">Download</a>
+                    <a wicket:id="scalarIfRegularClear">Clear</a>
+	                <span wicket:id="feedback"></span>
+				</label>
+
+                <span wicket:id="scalarIfCompact">
+                	<a wicket:id="scalarIfCompactDownload">Download</a>
+                </span>
+
+			</div>
+		</wicket:panel>
+	</body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java
----------------------------------------------------------------------
diff --git a/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java
new file mode 100644
index 0000000..2799eed
--- /dev/null
+++ b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java
@@ -0,0 +1,204 @@
+/*
+ *  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.isisapplib;
+
+import java.util.List;
+
+import org.apache.isis.applib.value.Blob;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.bookmarkedpages.BookmarkedPagesPanel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.Components;
+import org.apache.log4j.Logger;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.FormComponentLabel;
+import org.apache.wicket.markup.html.form.upload.FileUpload;
+import org.apache.wicket.markup.html.form.upload.FileUploadField;
+import org.apache.wicket.markup.html.link.ResourceLink;
+import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.request.resource.ByteArrayResource;
+
+/**
+ * Panel for rendering scalars of type {@link Blob Isis' applib.Blob}.
+ */
+public class IsisBlobPanel extends ScalarPanelAbstract {
+
+    private static final long serialVersionUID = 1L;
+    
+    @SuppressWarnings("unused")
+    private static final Logger LOG = Logger.getLogger(IsisBlobPanel.class);
+    
+    private static final String ID_SCALAR_IF_REGULAR = "scalarIfRegular";
+    private static final String ID_SCALAR_IF_REGULAR_DOWNLOAD = "scalarIfRegularDownload";
+    private static final String ID_SCALAR_IF_REGULAR_CLEAR = "scalarIfRegularClear";
+    private static final String ID_SCALAR_NAME = "scalarName";
+    private static final String ID_SCALAR_VALUE = "scalarValue";
+    private static final String ID_FEEDBACK = "feedback";
+    
+    private static final String ID_SCALAR_IF_COMPACT = "scalarIfCompact";
+    private static final String ID_SCALAR_IF_COMPACT_DOWNLOAD = "scalarIfCompactDownload";
+    
+    public IsisBlobPanel(final String id, final ScalarModel model) {
+        super(id, model);
+    }
+    
+    @Override
+    protected FormComponentLabel addComponentForRegular() {
+        final FileUploadField fileUploadField = createFileUploadField(ID_SCALAR_VALUE);
+        fileUploadField.setLabel(Model.of(getModel().getName()));
+        
+        final FormComponentLabel scalarIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, fileUploadField);
+        scalarIfRegular.add(fileUploadField);
+        
+        final Label scalarName = new Label(ID_SCALAR_NAME, getModel().getName());
+        scalarIfRegular.add(scalarName);
+        
+        updateDownloadLink(ID_SCALAR_IF_REGULAR_DOWNLOAD, scalarIfRegular);
+        scalarIfRegular.addOrReplace(new ComponentFeedbackPanel(ID_FEEDBACK, fileUploadField));
+        
+        addOrReplace(scalarIfRegular);
+        
+        return scalarIfRegular;
+    }
+
+    @Override
+    protected Component addComponentForCompact() {
+        final MarkupContainer scalarIfCompact = new WebMarkupContainer(ID_SCALAR_IF_COMPACT);
+        updateDownloadLink(ID_SCALAR_IF_COMPACT_DOWNLOAD, scalarIfCompact);
+        addOrReplace(scalarIfCompact);
+        return scalarIfCompact;
+    }
+
+    protected void onBeforeRenderWhenViewMode() {
+        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE);
+    }
+
+    protected void onBeforeRenderWhenDisabled(final String disableReason) {
+        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE);
+    }
+
+    protected void onBeforeRenderWhenEnabled() {
+        updateRegularFormComponents(InputFieldVisibility.VISIBLE);
+    }
+
+    
+    ///////////////////////////////////////////////
+    // helpers
+    ///////////////////////////////////////////////
+    
+    private FileUploadField createFileUploadField(String componentId) {
+        final FileUploadField fileUploadField = new FileUploadField(componentId, new IModel<List<FileUpload>>() {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void setObject(final List<FileUpload> fileUploads) {
+                if (fileUploads == null || fileUploads.isEmpty()) {
+                    return;
+                }
+                
+                final FileUpload fileUpload = fileUploads.get(0);
+                final String contentType = fileUpload.getContentType();
+                final String clientFileName = fileUpload.getClientFileName();
+                final byte[] bytes = fileUpload.getBytes();
+                final Blob blob = new Blob(clientFileName, contentType, bytes);
+                
+                final ObjectAdapter adapter = getAdapterManager().adapterFor(blob);
+                getModel().setObject(adapter);
+            }
+
+            @Override
+            public void detach() {
+            }
+
+            @Override
+            public List<FileUpload> getObject() {
+                return null;
+            }
+            
+        });
+        return fileUploadField;
+    }
+
+    private Blob getBlob(final ScalarModel model) {
+        ObjectAdapter adapter = model.getObject();
+        return adapter != null? (Blob) adapter.getObject(): null;
+    }
+
+    private enum InputFieldVisibility {
+        VISIBLE, NOT_VISIBLE;
+    }
+    
+    private void updateRegularFormComponents(InputFieldVisibility visibility) {
+        MarkupContainer formComponentLabel = (MarkupContainer) getComponentForRegular();
+        formComponentLabel.get(ID_SCALAR_VALUE).setVisible(visibility == InputFieldVisibility.VISIBLE);
+        updateClearLink(visibility);
+        updateDownloadLink(ID_SCALAR_IF_REGULAR_DOWNLOAD, formComponentLabel);
+    }
+
+    private void updateClearLink(InputFieldVisibility visibility) {
+        final MarkupContainer formComponent = (MarkupContainer) getComponentForRegular();
+        formComponent.setOutputMarkupId(true); // enable ajax link
+
+        final AjaxLink<Void> ajaxLink = new AjaxLink<Void>(ID_SCALAR_IF_REGULAR_CLEAR){
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void onClick(AjaxRequestTarget target) {
+                setEnabled(false);
+                getModel().setObject(null);
+                target.add(formComponent);
+            }
+        };
+        ajaxLink.setOutputMarkupId(true);
+        formComponent.addOrReplace(ajaxLink);
+
+        final Blob blob = getBlob(getModel());
+        formComponent.get(ID_SCALAR_IF_REGULAR_CLEAR).setVisible(blob != null && visibility == InputFieldVisibility.VISIBLE);
+    }
+
+    private ResourceLink<?> updateDownloadLink(String downloadId, MarkupContainer container) {
+        final ResourceLink<?> resourceLink = createResourceLink(downloadId);
+        if(resourceLink != null) {
+            container.addOrReplace(resourceLink);
+        } else {
+            Components.permanentlyHide(container, downloadId);
+        }
+        return resourceLink;
+    }
+
+    private ResourceLink<?> createResourceLink(String id) {
+        final Blob blob = getBlob(getModel());
+        if(blob == null) {
+            return null;
+        }
+        final ByteArrayResource bar = new ByteArrayResource(blob.getMimeType().getBaseType(), blob.getBytes(), blob.getName());
+        return new ResourceLink<Object>(id, bar);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanelFactory.java
----------------------------------------------------------------------
diff --git a/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanelFactory.java b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanelFactory.java
new file mode 100644
index 0000000..633708c
--- /dev/null
+++ b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanelFactory.java
@@ -0,0 +1,44 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib;
+
+import org.apache.wicket.Component;
+
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ComponentFactoryScalarAbstract;
+
+/**
+ * {@link ComponentFactory} for {@link IsisColorPanel}.
+ */
+public class IsisBlobPanelFactory extends ComponentFactoryScalarAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public IsisBlobPanelFactory() {
+        super(org.apache.isis.applib.value.Blob.class);
+    }
+
+    @Override
+    public Component createComponent(final String id, final ScalarModel scalarModel) {
+        return new IsisBlobPanel(id, scalarModel);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
----------------------------------------------------------------------
diff --git a/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
index 8e57402..fa1242b 100644
--- a/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
+++ b/framework/viewer/wicket/wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
@@ -21,6 +21,12 @@ package org.apache.isis.viewer.wicket.ui.selector.links;
 
 import java.util.List;
 
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.annotation.Resolve.Type;
 import org.apache.isis.core.commons.lang.StringUtils;
 import org.apache.isis.core.metamodel.facets.members.resolve.ResolveFacet;
@@ -44,12 +50,6 @@ import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
 public abstract class LinksSelectorPanelAbstract<T extends IModel<?>> extends PanelAbstract<T> {
 
     private static final long serialVersionUID = 1L;

http://git-wip-us.apache.org/repos/asf/isis/blob/22cdbe0d/framework/viewer/wicket/wicket-viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
----------------------------------------------------------------------
diff --git a/framework/viewer/wicket/wicket-viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/framework/viewer/wicket/wicket-viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index bb98fce..d6f2f0a 100644
--- a/framework/viewer/wicket/wicket-viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/framework/viewer/wicket/wicket-viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -46,6 +46,7 @@ import org.apache.isis.viewer.wicket.ui.components.entity.icontitle.EntityIconAn
 import org.apache.isis.viewer.wicket.ui.components.entity.properties.EntityPropertiesPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.entity.selector.dropdown.EntityDropDownSelectorPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.entity.selector.links.EntityLinksSelectorPanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisBlobPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisColorPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisDatePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisDateTimePanelFactory;
@@ -220,6 +221,8 @@ public class ComponentFactoryRegistrarDefault implements ComponentFactoryRegistr
         componentFactories.add(new IsisPercentagePanelFactory());
         componentFactories.add(new IsisPasswordPanelFactory());
 
+        componentFactories.add(new IsisBlobPanelFactory()); 
+        
         componentFactories.add(new JavaMathBigIntegerPanelFactory());
         componentFactories.add(new JavaMathBigDecimalPanelFactory());