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 2013/02/08 19:29:52 UTC

[19/32] ISIS-323: lots more refactoring of RO

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/RuntimeExceptionMapper.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/RuntimeExceptionMapper.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/RuntimeExceptionMapper.java
deleted file mode 100644
index d023f81..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/RuntimeExceptionMapper.java
+++ /dev/null
@@ -1,100 +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.restfulobjects.viewer;
-
-import java.util.List;
-
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-
-import com.google.common.collect.Lists;
-
-import org.apache.commons.lang.exception.ExceptionUtils;
-
-import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
-import org.apache.isis.viewer.restfulobjects.applib.RestfulResponse.HttpStatusCode;
-import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
-
-@Provider
-public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {
-
-    @Override
-    public Response toResponse(final RuntimeException ex) {
-        final ResponseBuilder builder = Response.status(HttpStatusCode.INTERNAL_SERVER_ERROR.getJaxrsStatusType()).type(RestfulMediaType.APPLICATION_JSON_ERROR).entity(jsonFor(ex));
-        return builder.build();
-    }
-
-    private static class ExceptionPojo {
-
-        public static ExceptionPojo create(final Exception ex) {
-            return new ExceptionPojo(ex);
-        }
-
-        private static String format(final StackTraceElement stackTraceElement) {
-            return stackTraceElement.toString();
-        }
-
-        private final String message;
-        private final List<String> stackTrace = Lists.newArrayList();
-        private ExceptionPojo causedBy;
-
-        public ExceptionPojo(final Throwable ex) {
-            this.message = messageFor(ex);
-            final StackTraceElement[] stackTraceElements = ex.getStackTrace();
-            for (final StackTraceElement stackTraceElement : stackTraceElements) {
-                this.stackTrace.add(format(stackTraceElement));
-            }
-            final Throwable cause = ex.getCause();
-            if (cause != null && cause != ex) {
-                this.causedBy = new ExceptionPojo(cause);
-            }
-        }
-
-        private static String messageFor(final Throwable ex) {
-            final String message = ex.getMessage();
-            return message != null ? message : ex.getClass().getName();
-        }
-
-        @SuppressWarnings("unused")
-        public String getMessage() {
-            return message;
-        }
-
-        @SuppressWarnings("unused")
-        public List<String> getStackTrace() {
-            return stackTrace;
-        }
-
-        @SuppressWarnings("unused")
-        public ExceptionPojo getCausedBy() {
-            return causedBy;
-        }
-    }
-
-    static String jsonFor(final Exception ex) {
-        try {
-            return JsonMapper.instance().write(ExceptionPojo.create(ex));
-        } catch (final Exception e) {
-            // fallback
-            return "{ \"exception\": \"" + ExceptionUtils.getFullStackTrace(ex) + "\" }";
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyBasicAuth.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyBasicAuth.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyBasicAuth.java
deleted file mode 100644
index 3a542cb..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyBasicAuth.java
+++ /dev/null
@@ -1,79 +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.restfulobjects.viewer.authentication;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import org.apache.commons.codec.binary.Base64;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.runtime.authentication.AuthenticationManager;
-import org.apache.isis.core.runtime.authentication.AuthenticationRequestPassword;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.webapp.auth.AuthenticationSessionStrategyAbstract;
-
-/**
- * Implements the HTTP Basic Auth protocol; does not bind the
- * {@link AuthenticationSession} onto the {@link HttpSession}.
- */
-public class AuthenticationSessionStrategyBasicAuth extends AuthenticationSessionStrategyAbstract {
-
-    private static Pattern USER_AND_PASSWORD_REGEX = Pattern.compile("^(.+):(.+)$");
-
-    @Override
-    public AuthenticationSession lookupValid(final ServletRequest servletRequest, final ServletResponse servletResponse) {
-
-        final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
-        final String authStr = httpServletRequest.getHeader("Authorization");
-
-        // value should be in the form:
-        // Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
-        if (authStr == null || !authStr.startsWith("Basic ")) {
-            return null;
-        }
-        final String digest = authStr.substring(6);
-
-        final String userAndPassword = new String(new Base64().decode(digest.getBytes()));
-        final Matcher matcher = USER_AND_PASSWORD_REGEX.matcher(userAndPassword);
-        if (!matcher.matches()) {
-            return null;
-        }
-
-        final String user = matcher.group(1);
-        final String password = matcher.group(2);
-
-        final AuthenticationSession authSession = getAuthenticationManager().authenticate(new AuthenticationRequestPassword(user, password));
-        return authSession;
-    }
-
-    // //////////////////////////////////////////////////////////
-    // Dependencies (from context)
-    // //////////////////////////////////////////////////////////
-
-    protected AuthenticationManager getAuthenticationManager() {
-        return IsisContext.getAuthenticationManager();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyHeader.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyHeader.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyHeader.java
deleted file mode 100644
index 2a61d5c..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyHeader.java
+++ /dev/null
@@ -1,66 +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.restfulobjects.viewer.authentication;
-
-import java.util.Collections;
-import java.util.List;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.runtime.authentication.standard.SimpleSession;
-import org.apache.isis.core.webapp.auth.AuthenticationSessionStrategyAbstract;
-
-/**
- * Implements a home-grown protocol, whereby the user id and roles are passed
- * using custom headers.
- * 
- * <p>
- * Does not bind the {@link AuthenticationSession} onto the {@link HttpSession}.
- */
-public class AuthenticationSessionStrategyHeader extends AuthenticationSessionStrategyAbstract {
-
-    @Override
-    public AuthenticationSession lookupValid(final ServletRequest servletRequest, final ServletResponse servletResponse) {
-
-        final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
-        final String user = httpServletRequest.getHeader("isis.user");
-        final List<String> roles = rolesFrom(httpServletRequest);
-
-        if (Strings.isNullOrEmpty(user)) {
-            return null;
-        }
-        return new SimpleSession(user, roles);
-    }
-
-    protected List<String> rolesFrom(final HttpServletRequest httpServletRequest) {
-        final String rolesStr = httpServletRequest.getHeader("isis.roles");
-        if (rolesStr == null) {
-            return Collections.emptyList();
-        }
-        return Lists.newArrayList(Splitter.on(",").split(rolesStr));
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyTrusted.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyTrusted.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyTrusted.java
deleted file mode 100644
index 4658a9b..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/authentication/AuthenticationSessionStrategyTrusted.java
+++ /dev/null
@@ -1,42 +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.restfulobjects.viewer.authentication;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.runtime.authentication.exploration.AuthenticationRequestExploration;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.webapp.auth.AuthenticationSessionStrategyDefault;
-
-public class AuthenticationSessionStrategyTrusted extends AuthenticationSessionStrategyDefault {
-
-    @Override
-    public AuthenticationSession lookupValid(final ServletRequest servletRequest, final ServletResponse servletResponse) {
-        final AuthenticationSession session = super.lookupValid(servletRequest, servletResponse);
-        if (session != null) {
-            return session;
-        }
-
-        // will always succeed.
-        final AuthenticationRequestExploration request = new AuthenticationRequestExploration();
-        return IsisContext.getAuthenticationManager().authenticate(request);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/EmbeddedWebViewerRestfulObjects.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/EmbeddedWebViewerRestfulObjects.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/EmbeddedWebViewerRestfulObjects.java
deleted file mode 100644
index 59cdccf..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/EmbeddedWebViewerRestfulObjects.java
+++ /dev/null
@@ -1,61 +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.restfulobjects.viewer.embedded;
-
-import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
-import org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap;
-
-import org.apache.isis.core.commons.lang.MapUtils;
-import org.apache.isis.core.runtime.viewer.web.WebAppSpecification;
-import org.apache.isis.core.runtime.web.EmbeddedWebViewer;
-import org.apache.isis.core.webapp.IsisSessionFilter;
-import org.apache.isis.core.webapp.IsisWebAppBootstrapper;
-import org.apache.isis.core.webapp.content.ResourceCachingFilter;
-import org.apache.isis.core.webapp.content.ResourceServlet;
-import org.apache.isis.viewer.restfulobjects.viewer.RestfulObjectsApplication;
-import org.apache.isis.viewer.restfulobjects.viewer.authentication.AuthenticationSessionStrategyTrusted;
-
-final class EmbeddedWebViewerRestfulObjects extends EmbeddedWebViewer {
-    @Override
-    public WebAppSpecification getWebAppSpecification() {
-        final WebAppSpecification webAppSpec = new WebAppSpecification();
-
-        webAppSpec.addServletContextListener(IsisWebAppBootstrapper.class);
-        
-        webAppSpec.addContextParams("isis.viewers", "restfulobjects");
-
-        webAppSpec.addContextParams(RestfulObjectsViewerInstaller.JAVAX_WS_RS_APPLICATION, RestfulObjectsApplication.class.getName());
-
-        webAppSpec.addFilterSpecification(IsisSessionFilter.class, 
-                MapUtils.asMap(
-                        IsisSessionFilter.AUTHENTICATION_SESSION_STRATEGY_KEY, AuthenticationSessionStrategyTrusted.class.getName(),
-                        IsisSessionFilter.WHEN_NO_SESSION_KEY, IsisSessionFilter.WhenNoSession.CONTINUE.name().toLowerCase()), 
-                RestfulObjectsViewerInstaller.EVERYTHING);
-
-        webAppSpec.addFilterSpecification(ResourceCachingFilter.class, RestfulObjectsViewerInstaller.STATIC_CONTENT);
-        webAppSpec.addServletSpecification(ResourceServlet.class, RestfulObjectsViewerInstaller.STATIC_CONTENT);
-
-        
-        webAppSpec.addServletContextListener(ResteasyBootstrap.class);
-        webAppSpec.addServletSpecification(HttpServletDispatcher.class, RestfulObjectsViewerInstaller.ROOT);
-
-
-        return webAppSpec;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/RestfulObjectsViewerInstaller.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/RestfulObjectsViewerInstaller.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/RestfulObjectsViewerInstaller.java
deleted file mode 100644
index ee53f72..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/embedded/RestfulObjectsViewerInstaller.java
+++ /dev/null
@@ -1,52 +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.restfulobjects.viewer.embedded;
-
-import org.apache.isis.Isis;
-import org.apache.isis.core.runtime.installerregistry.installerapi.IsisViewerInstallerAbstract;
-import org.apache.isis.core.runtime.viewer.IsisViewer;
-import org.apache.isis.core.runtime.viewer.web.WebAppSpecification;
-
-/**
- * Convenience implementation of a {@link IsisViewer} providing the ability to
- * configured for the JSON viewer from the {@link Isis command line} using
- * <tt>--viewer restful</tt> command line option.
- * 
- * <p>
- * In a production deployment the configuration represented by the
- * {@link WebAppSpecification} would be specified in the <tt>web.xml<tt> file.
- */
-public class RestfulObjectsViewerInstaller extends IsisViewerInstallerAbstract {
-
-    static final String JAVAX_WS_RS_APPLICATION = "javax.ws.rs.Application";
-
-    protected static final String EVERYTHING = "*";
-    protected static final String ROOT = "/";
-    protected static final String[] STATIC_CONTENT = new String[] { "*.js", "*.gif", "*.png", "*.html" };
-
-    public RestfulObjectsViewerInstaller() {
-        super("restfulobjects");
-    }
-
-    @Override
-    protected IsisViewer doCreateViewer() {
-        return new EmbeddedWebViewerRestfulObjects();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/GraphUtil.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/GraphUtil.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/GraphUtil.java
deleted file mode 100644
index e650b04..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/GraphUtil.java
+++ /dev/null
@@ -1,60 +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.restfulobjects.viewer.representations;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Maps;
-
-import org.apache.isis.viewer.restfulobjects.applib.util.PathNode;
-
-@SuppressWarnings({ "rawtypes", "unchecked" })
-public final class GraphUtil {
-
-    private GraphUtil() {
-    }
-
-    public final static Map<PathNode, Map> asGraph(final List<List<String>> links) {
-        if (links == null) {
-            return Collections.emptyMap();
-        }
-        final Map<PathNode, Map> map = Maps.newHashMap();
-        for (final List<String> link : links) {
-            GraphUtil.mergeInto(link, map);
-        }
-        return map;
-    }
-
-    private static void mergeInto(final List<String> list, final Map<PathNode, Map> map) {
-        if (list.size() == 0) {
-            return;
-        }
-        final String str = list.get(0);
-        final PathNode node = PathNode.parse(str);
-        Map<PathNode, Map> submap = map.get(node);
-        if (submap == null) {
-            submap = Maps.newHashMap();
-            map.put(node, submap);
-        }
-        mergeInto(list.subList(1, list.size()), submap);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkBuilder.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkBuilder.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkBuilder.java
deleted file mode 100644
index c475654..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkBuilder.java
+++ /dev/null
@@ -1,94 +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.restfulobjects.viewer.representations;
-
-import javax.ws.rs.core.MediaType;
-
-import org.apache.isis.viewer.restfulobjects.applib.HttpMethod;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.applib.links.Rel;
-import org.apache.isis.viewer.restfulobjects.viewer.RendererContext;
-
-public final class LinkBuilder {
-
-    public static LinkBuilder newBuilder(final RendererContext resourceContext, final Rel rel, final RepresentationType representationType, final String hrefFormat, final Object... hrefArgs) {
-        return newBuilder(resourceContext, rel, representationType.getMediaType(), hrefFormat, hrefArgs);
-    }
-
-    public static LinkBuilder newBuilder(final RendererContext resourceContext, final Rel rel, final MediaType mediaType, final String hrefFormat, final Object... hrefArgs) {
-        return new LinkBuilder(resourceContext, rel, String.format(hrefFormat, hrefArgs), mediaType);
-    }
-
-    private final RendererContext resourceContext;
-    private final JsonRepresentation representation = JsonRepresentation.newMap();
-
-    private final Rel rel;
-    private final String href;
-    private final MediaType mediaType;
-
-    private HttpMethod method = HttpMethod.GET;
-    private String title;
-    private JsonRepresentation arguments;
-    private JsonRepresentation value;
-    private String id;
-
-    protected LinkBuilder(final RendererContext resourceContext, final Rel rel, final String href, final MediaType mediaType) {
-        this.resourceContext = resourceContext;
-        this.rel = rel;
-        this.href = href;
-        this.mediaType = mediaType;
-    }
-
-    public LinkBuilder withHttpMethod(final HttpMethod method) {
-        this.method = method;
-        return this;
-    }
-
-    public LinkBuilder withTitle(final String title) {
-        this.title = title;
-        return this;
-    }
-
-    public LinkBuilder withArguments(final JsonRepresentation arguments) {
-        this.arguments = arguments;
-        return this;
-    }
-
-    public LinkBuilder withId(final String id) {
-        this.id = id;
-        return this;
-    }
-
-    public LinkBuilder withValue(final JsonRepresentation value) {
-        this.value = value;
-        return this;
-    }
-
-    public JsonRepresentation build() {
-        representation.mapPut("id", id);
-        representation.mapPut("rel", rel.getName());
-        representation.mapPut("href", resourceContext.urlFor(href));
-        representation.mapPut("method", method);
-        representation.mapPut("type", mediaType.toString());
-        representation.mapPut("title", title);
-        representation.mapPut("arguments", arguments);
-        representation.mapPut("value", value);
-        return representation;
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkFollower.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkFollower.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkFollower.java
deleted file mode 100644
index 7cb098c..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/LinkFollower.java
+++ /dev/null
@@ -1,124 +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.restfulobjects.viewer.representations;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.util.PathNode;
-
-@SuppressWarnings({ "rawtypes", "unchecked" })
-public final class LinkFollower {
-
-    public final static LinkFollower create(final List<List<String>> links) {
-        final Map<PathNode, Map> graph = GraphUtil.asGraph(links);
-        return new LinkFollower(graph, Mode.FOLLOWING, PathNode.NULL);
-    }
-
-    private enum Mode {
-        FOLLOWING, TERMINATED;
-    }
-
-    private final Map<PathNode, Map> graph;
-    private final Mode mode;
-    private final PathNode root;
-
-    private LinkFollower(final Map<PathNode, Map> graph, final Mode mode, final PathNode root) {
-        this.graph = graph;
-        this.mode = mode;
-        this.root = root;
-    }
-
-    /**
-     * A little algebra...
-     */
-    public LinkFollower follow(final String pathTemplate, final Object... args) {
-        final String path = String.format(pathTemplate, args);
-        if (path == null) {
-            return terminated(PathNode.NULL);
-        }
-        if (mode == Mode.TERMINATED) {
-            return terminated(this.root);
-        }
-        final PathNode node = PathNode.parse(path);
-        if (mode == Mode.FOLLOWING) {
-            final Map<PathNode, Map> remaining = graph.get(node);
-            if (remaining != null) {
-                final PathNode key = findKey(node);
-                return new LinkFollower(remaining, Mode.FOLLOWING, key);
-            } else {
-                return terminated(node);
-            }
-        }
-        return terminated(node);
-    }
-
-    /**
-     * somewhat bizarre, but we have to find the actual node that is in the
-     * graph; the one we matching on doesn't match on the
-     * {@link PathNode#getCriteria()} map.
-     */
-    private PathNode findKey(final PathNode node) {
-        final Set<PathNode> keySet = graph.keySet();
-        for (final PathNode key : keySet) {
-            if (key.equals(node)) {
-                return key;
-            }
-        }
-        // shouldn't happen
-        return node;
-    }
-
-    private static LinkFollower terminated(final PathNode node) {
-        return new LinkFollower(null, Mode.TERMINATED, node);
-    }
-
-    /**
-     * Not public API; use {@link #matches(JsonRepresentation)}.
-     */
-    boolean isFollowing() {
-        return mode == Mode.FOLLOWING;
-    }
-
-    public boolean isTerminated() {
-        return mode == Mode.TERMINATED;
-    }
-
-    public Map<String, String> criteria() {
-        return Collections.unmodifiableMap(root.getCriteria());
-    }
-
-    /**
-     * Ensure that every key present in the provided map matches the criterium.
-     * 
-     * <p>
-     * Any keys in the criterium that are not present in the map will be
-     * ignored.
-     */
-    public boolean matches(final JsonRepresentation link) {
-        if (!isFollowing()) {
-            return false;
-        }
-        return root == null || root.matches(link);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactory.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactory.java
deleted file mode 100644
index e467cf5..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactory.java
+++ /dev/null
@@ -1,32 +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.restfulobjects.viewer.representations;
-
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.viewer.RendererContext;
-import org.apache.isis.viewer.restfulobjects.viewer.ResourceContext;
-
-public interface RendererFactory {
-
-    RepresentationType getRepresentationType();
-
-    ReprRenderer<?, ?> newRenderer(RendererContext resourceContext, LinkFollower linkFollower, JsonRepresentation representation);
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactoryRegistry.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactoryRegistry.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactoryRegistry.java
deleted file mode 100644
index b449a04..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/RendererFactoryRegistry.java
+++ /dev/null
@@ -1,90 +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.restfulobjects.viewer.representations;
-
-import java.util.Map;
-
-import javax.ws.rs.core.MediaType;
-
-import com.google.common.collect.Maps;
-
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.ActionResultReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.DomainObjectReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.ListReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.ObjectActionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.ObjectCollectionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.ObjectPropertyReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.ScalarValueReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.ActionDescriptionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.ActionParameterDescriptionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.CollectionDescriptionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.DomainTypeReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.PropertyDescriptionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.TypeActionResultReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.TypeListReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.home.HomePageReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.user.UserReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.version.VersionReprRenderer;
-
-public class RendererFactoryRegistry {
-
-    // TODO: get rid of this horrible singleton
-    public final static RendererFactoryRegistry instance = new RendererFactoryRegistry();
-
-    private final Map<MediaType, RendererFactory> factoryByReprType = Maps.newHashMap();
-
-    RendererFactoryRegistry() {
-        registerDefaults();
-    }
-
-    private void registerDefaults() {
-        register(new HomePageReprRenderer.Factory());
-        register(new UserReprRenderer.Factory());
-        register(new VersionReprRenderer.Factory());
-        register(new DomainObjectReprRenderer.Factory());
-        register(new ObjectPropertyReprRenderer.Factory());
-        register(new ObjectCollectionReprRenderer.Factory());
-        register(new ObjectActionReprRenderer.Factory());
-        register(new ActionResultReprRenderer.Factory());
-        register(new ListReprRenderer.Factory());
-        register(new ScalarValueReprRenderer.Factory());
-        register(new TypeListReprRenderer.Factory());
-        register(new DomainTypeReprRenderer.Factory());
-        register(new PropertyDescriptionReprRenderer.Factory());
-        register(new CollectionDescriptionReprRenderer.Factory());
-        register(new ActionDescriptionReprRenderer.Factory());
-        register(new ActionParameterDescriptionReprRenderer.Factory());
-        register(new TypeActionResultReprRenderer.Factory());
-    }
-
-    public void register(final RendererFactory factory) {
-        final RepresentationType representationType = factory.getRepresentationType();
-        factoryByReprType.put(representationType.getMediaType(), factory);
-    }
-
-    public RendererFactory find(final MediaType mediaType) {
-        return factoryByReprType.get(mediaType);
-    }
-
-    public RendererFactory find(final RepresentationType representationType) {
-        return find(representationType.getMediaType());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRenderer.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRenderer.java
deleted file mode 100644
index c06f437..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRenderer.java
+++ /dev/null
@@ -1,32 +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.restfulobjects.viewer.representations;
-
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-
-public interface ReprRenderer<R extends ReprRenderer<R, T>, T> {
-
-    RepresentationType getRepresentationType();
-
-    R with(T t);
-
-    public JsonRepresentation render();
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererAbstract.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererAbstract.java
deleted file mode 100644
index 9ac34ca..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererAbstract.java
+++ /dev/null
@@ -1,185 +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.restfulobjects.viewer.representations;
-
-import java.util.List;
-
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
-import org.apache.isis.core.runtime.system.transaction.UpdateNotifier;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.applib.links.Rel;
-import org.apache.isis.viewer.restfulobjects.viewer.RendererContext;
-import org.apache.isis.viewer.restfulobjects.viewer.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects.DomainObjectReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.resources.domaintypes.DomainTypeReprRenderer;
-
-public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>, T> implements ReprRenderer<R, T> {
-
-    protected final RendererContext resourceContext;
-    private final LinkFollower linkFollower;
-    private final RepresentationType representationType;
-    protected final JsonRepresentation representation;
-
-    protected boolean includesSelf;
-
-    public ReprRendererAbstract(final RendererContext resourceContext, final LinkFollower linkFollower, final RepresentationType representationType, final JsonRepresentation representation) {
-        this.resourceContext = resourceContext;
-        this.linkFollower = asProvidedElseCreate(linkFollower);
-        this.representationType = representationType;
-        this.representation = representation;
-    }
-
-    public RendererContext getResourceContext() {
-        return resourceContext;
-    }
-
-    public LinkFollower getLinkFollower() {
-        return linkFollower;
-    }
-
-    private LinkFollower asProvidedElseCreate(final LinkFollower linkFollower) {
-        if (linkFollower != null) {
-            return linkFollower;
-        }
-        return LinkFollower.create(resourceContext.getFollowLinks());
-    }
-
-    @Override
-    public RepresentationType getRepresentationType() {
-        return representationType;
-    }
-
-    @SuppressWarnings("unchecked")
-    public R includesSelf() {
-        this.includesSelf = true;
-        return (R) this;
-    }
-
-    public R withSelf(final String href) {
-        if (href != null) {
-            getLinks().arrayAdd(LinkBuilder.newBuilder(resourceContext, Rel.SELF, representationType, href).build());
-        }
-        return cast(this);
-    }
-
-    public R withSelf(final JsonRepresentation link) {
-        final String rel = link.getString("rel");
-        if (rel == null || !rel.equals(Rel.SELF.getName())) {
-            throw new IllegalArgumentException("Provided link does not have a 'rel' of 'self'; was: " + link);
-        }
-        if (link != null) {
-            getLinks().arrayAdd(link);
-        }
-        return cast(this);
-    }
-
-    /**
-     * Will lazily create links array as required
-     */
-    protected JsonRepresentation getLinks() {
-        JsonRepresentation links = representation.getArray("links");
-        if (links == null) {
-            links = JsonRepresentation.newArray();
-            representation.mapPut("links", links);
-        }
-        return links;
-    }
-
-    protected void addLink(final Rel rel, final ObjectSpecification objectSpec) {
-        if (objectSpec == null) {
-            return;
-        }
-        final LinkBuilder linkBuilder = DomainTypeReprRenderer.newLinkToBuilder(getResourceContext(), rel, objectSpec);
-        getLinks().arrayAdd(linkBuilder.build());
-    }
-
-    /**
-     * Will lazily create extensions map as required
-     */
-    protected JsonRepresentation getExtensions() {
-        JsonRepresentation extensions = representation.getMap("extensions");
-        if (extensions == null) {
-            extensions = JsonRepresentation.newMap();
-            representation.mapPut("extensions", extensions);
-        }
-        return extensions;
-    }
-
-    public R withExtensions(final JsonRepresentation extensions) {
-        if (!extensions.isMap()) {
-            throw new IllegalArgumentException("extensions must be a map");
-        }
-        representation.mapPut("extensions", extensions);
-        return cast(this);
-    }
-
-    @SuppressWarnings("unchecked")
-    protected static <R extends ReprRendererAbstract<R, T>, T> R cast(final ReprRendererAbstract<R, T> builder) {
-        return (R) builder;
-    }
-
-    @Override
-    public abstract JsonRepresentation render();
-
-    /**
-     * Convenience for representations that are returned from objects that
-     * mutate state.
-     */
-    protected final void addExtensionsIsisProprietaryChangedObjects() {
-        final UpdateNotifier updateNotifier = getUpdateNotifier();
-
-        addToExtensions("changed", updateNotifier.getChangedObjects());
-        addToExtensions("disposed", updateNotifier.getDisposedObjects());
-    }
-
-    private void addToExtensions(final String key, final List<ObjectAdapter> adapters) {
-        final JsonRepresentation adapterList = JsonRepresentation.newArray();
-        getExtensions().mapPut(key, adapterList);
-        for (final ObjectAdapter adapter : adapters) {
-            adapterList.arrayAdd(DomainObjectReprRenderer.newLinkToBuilder(getResourceContext(), Rel.OBJECT, adapter).build());
-        }
-    }
-
-    protected List<ObjectAdapter> getServiceAdapters() {
-        return IsisContext.getPersistenceSession().getServices();
-    }
-
-    protected Persistor getPersistenceSession() {
-        return IsisContext.getPersistenceSession();
-    }
-
-    protected AuthenticationSession getSession() {
-        return IsisContext.getAuthenticationSession();
-    }
-
-    protected Localization getLocalization() {
-        return IsisContext.getLocalization();
-    }
-
-    protected UpdateNotifier getUpdateNotifier() {
-        return IsisContext.getCurrentTransaction().getUpdateNotifier();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererFactoryAbstract.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererFactoryAbstract.java
deleted file mode 100644
index 6e56d68..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/ReprRendererFactoryAbstract.java
+++ /dev/null
@@ -1,36 +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.restfulobjects.viewer.representations;
-
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-
-public abstract class ReprRendererFactoryAbstract implements RendererFactory {
-
-    private final RepresentationType representationType;
-
-    public ReprRendererFactoryAbstract(final RepresentationType representationType) {
-        this.representationType = representationType;
-    }
-
-    @Override
-    public RepresentationType getRepresentationType() {
-        return representationType;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/WellKnownType.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/WellKnownType.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/WellKnownType.java
deleted file mode 100644
index 31f4100..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/representations/WellKnownType.java
+++ /dev/null
@@ -1,66 +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.restfulobjects.viewer.representations;
-
-public enum WellKnownType {
-
-    STRING(java.lang.String.class), BYTE(java.lang.Byte.class), SHORT(java.lang.Short.class), INT(java.lang.Integer.class), LONG(java.lang.Long.class), BOOLEAN(java.lang.Boolean.class), FLOAT(java.lang.Float.class), DOUBLE(java.lang.Double.class), BIGINT(java.math.BigInteger.class), BIGDEC(
-            java.math.BigDecimal.class), OBJECT(java.lang.Object.class), LIST(java.util.List.class), SET(java.util.Set.class);
-
-    private final Class<?> cls;
-    private final String className;
-
-    private WellKnownType(final Class<?> cls) {
-        this.cls = cls;
-        this.className = cls.getName();
-    }
-
-    public String getName() {
-        return name().toLowerCase();
-    }
-
-    public static WellKnownType lookup(final Class<?> cls) {
-        for (final WellKnownType wellKnownType : values()) {
-            if (wellKnownType.cls.equals(cls)) {
-                return wellKnownType;
-            }
-        }
-        return null;
-    }
-
-    public static WellKnownType lookup(final String className) {
-        for (final WellKnownType wellKnownType : values()) {
-            if (wellKnownType.className.equals(className)) {
-                return wellKnownType;
-            }
-        }
-        return null;
-    }
-
-    public static String canonical(final String className) {
-        final WellKnownType wellKnownType = WellKnownType.lookup(className);
-        return wellKnownType != null ? wellKnownType.getName() : className;
-    }
-
-    public static String canonical(final Class<?> cls) {
-        final WellKnownType wellKnownType = WellKnownType.lookup(cls);
-        return wellKnownType != null ? wellKnownType.getName() : cls.getName();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java
deleted file mode 100644
index b8effb8..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/ResourceAbstract.java
+++ /dev/null
@@ -1,254 +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.restfulobjects.viewer.resources;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.CacheControl;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Request;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.UriInfo;
-
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.map.JsonMappingException;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.services.ServiceUtil;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.OidGenerator;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.applib.RestfulResponse.HttpStatusCode;
-import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
-import org.apache.isis.viewer.restfulobjects.viewer.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.viewer.RestfulObjectsApplicationException;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.RendererFactoryRegistry;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.ReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.util.OidUtils;
-import org.apache.isis.viewer.restfulobjects.viewer.util.UrlDecoderUtils;
-
-public abstract class ResourceAbstract {
-
-    protected final static JsonMapper jsonMapper = JsonMapper.instance();
-
-    public enum Caching {
-        ONE_DAY(24 * 60 * 60), ONE_HOUR(60 * 60), NONE(0);
-
-        private final CacheControl cacheControl;
-
-        private Caching(final int maxAge) {
-            this.cacheControl = new CacheControl();
-            if (maxAge > 0) {
-                cacheControl.setMaxAge(maxAge);
-            } else {
-                cacheControl.setNoCache(true);
-            }
-        }
-
-        public CacheControl getCacheControl() {
-            return cacheControl;
-        }
-    }
-
-    // nb: SET is excluded; we simply flatten contributed actions.
-    public final static ActionType[] ACTION_TYPES = { ActionType.USER, ActionType.DEBUG, ActionType.EXPLORATION };
-
-    // TODO: should inject this instead...
-    protected final static RendererFactoryRegistry rendererFactoryRegistry = RendererFactoryRegistry.instance;
-
-    @Context
-    HttpHeaders httpHeaders;
-
-    @Context
-    UriInfo uriInfo;
-
-    @Context
-    Request request;
-
-    @Context
-    HttpServletRequest httpServletRequest;
-
-    @Context
-    HttpServletResponse httpServletResponse;
-
-    @Context
-    SecurityContext securityContext;
-
-    private ResourceContext resourceContext;
-
-    protected void init(Where where) {
-        init(RepresentationType.GENERIC, where);
-    }
-
-    protected void init(final RepresentationType representationType, Where where) {
-        if (!IsisContext.inSession()) {
-            throw RestfulObjectsApplicationException.create(HttpStatusCode.UNAUTHORIZED);
-        } 
-        if (getAuthenticationSession() == null) {
-            throw RestfulObjectsApplicationException.create(HttpStatusCode.UNAUTHORIZED);
-        }
-
-        this.resourceContext = new ResourceContext(representationType, httpHeaders, uriInfo, request, httpServletRequest, httpServletResponse, securityContext, getLocalization(), getAuthenticationSession(), getPersistenceSession(), getAdapterManager(), getSpecificationLoader(), getConfiguration(), where);
-    }
-
-    protected ResourceContext getResourceContext() {
-        return resourceContext;
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // Rendering
-    // //////////////////////////////////////////////////////////////
-
-    protected static String jsonFor(final Object object) {
-        try {
-            return jsonMapper.write(object);
-        } catch (final JsonGenerationException e) {
-            throw new RuntimeException(e);
-        } catch (final JsonMappingException e) {
-            throw new RuntimeException(e);
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // Isis integration
-    // //////////////////////////////////////////////////////////////
-
-    protected ObjectSpecification getSpecification(final String specFullName) {
-        return getSpecificationLoader().loadSpecification(specFullName);
-    }
-
-    protected ObjectAdapter getObjectAdapter(final String oidEncodedStr) {
-
-        final ObjectAdapter objectAdapter = OidUtils.getObjectAdapter(resourceContext, oidEncodedStr);
-
-        if (objectAdapter == null) {
-            final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr);
-            throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND, "could not determine adapter for OID: '%s'", oidStr);
-        }
-        return objectAdapter;
-    }
-
-    protected ObjectAdapter getServiceAdapter(final String serviceId) {
-        final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
-        for (final ObjectAdapter serviceAdapter : serviceAdapters) {
-            final Object servicePojo = serviceAdapter.getObject();
-            final String id = ServiceUtil.id(servicePojo);
-            if (serviceId.equals(id)) {
-                return serviceAdapter;
-            }
-        }
-        throw RestfulObjectsApplicationException.create(HttpStatusCode.NOT_FOUND, "Could not locate service '%s'", serviceId);
-    }
-
-    protected String getOidStr(final ObjectAdapter objectAdapter) {
-        return OidUtils.getOidStr(resourceContext, objectAdapter);
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // Responses
-    // //////////////////////////////////////////////////////////////
-
-    public static ResponseBuilder responseOfNoContent() {
-        return responseOf(HttpStatusCode.NO_CONTENT);
-    }
-
-    public static ResponseBuilder responseOfOk(final ReprRenderer<?, ?> renderer, final Caching caching) {
-        return responseOfOk(renderer, caching, null);
-    }
-
-    public static ResponseBuilder responseOfOk(final ReprRenderer<?, ?> renderer, final Caching caching, final Version version) {
-        final RepresentationType representationType = renderer.getRepresentationType();
-        final ResponseBuilder response = responseOf(HttpStatusCode.OK).type(representationType.getMediaType()).cacheControl(caching.getCacheControl()).entity(jsonFor(renderer.render()));
-        return addLastModifiedAndETagIfAvailable(response, version);
-    }
-
-    private static ResponseBuilder responseOf(final HttpStatusCode httpStatusCode) {
-        return Response.status(httpStatusCode.getJaxrsStatusType()).type(MediaType.APPLICATION_JSON_TYPE);
-    }
-
-    public static ResponseBuilder addLastModifiedAndETagIfAvailable(final ResponseBuilder responseBuilder, final Version version) {
-        if (version != null && version.getTime() != null) {
-            final Date time = version.getTime();
-            responseBuilder.lastModified(time);
-            responseBuilder.tag("" + time);
-        }
-        return responseBuilder;
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // Dependencies (from singletons)
-    // //////////////////////////////////////////////////////////////
-
-    protected IsisConfiguration getConfiguration () {
-        return IsisContext.getConfiguration();
-    }
-
-    protected AuthenticationSession getAuthenticationSession() {
-        return IsisContext.getAuthenticationSession();
-    }
-
-    protected SpecificationLoaderSpi getSpecificationLoader() {
-        return IsisContext.getSpecificationLoader();
-    }
-
-    protected AdapterManager getAdapterManager() {
-        return getPersistenceSession().getAdapterManager();
-    }
-
-    protected PersistenceSession getPersistenceSession() {
-        return IsisContext.getPersistenceSession();
-    }
-
-    private OidGenerator getOidGenerator() {
-        return getPersistenceSession().getOidGenerator();
-    }
-
-    protected Localization getLocalization() {
-        return IsisContext.getLocalization();
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // Dependencies (injected via @Context)
-    // //////////////////////////////////////////////////////////////
-
-    protected HttpServletRequest getServletRequest() {
-        return getResourceContext().getHttpServletRequest();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java
deleted file mode 100644
index 4be4513..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java
+++ /dev/null
@@ -1,259 +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.restfulobjects.viewer.resources.domainobjects;
-
-import org.codehaus.jackson.node.NullNode;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.applib.links.Rel;
-import org.apache.isis.viewer.restfulobjects.viewer.RendererContext;
-import org.apache.isis.viewer.restfulobjects.viewer.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.LinkFollower;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.ReprRendererAbstract;
-
-public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbstract<R, ObjectAndMember<T>>, T extends ObjectMember> extends ReprRendererAbstract<R, ObjectAndMember<T>> {
-
-    protected enum Mode {
-        INLINE, FOLLOWED, STANDALONE, MUTATED, ARGUMENTS;
-
-        public boolean isInline() {
-            return this == INLINE;
-        }
-
-        public boolean isFollowed() {
-            return this == FOLLOWED;
-        }
-
-        public boolean isStandalone() {
-            return this == STANDALONE;
-        }
-
-        public boolean isMutated() {
-            return this == MUTATED;
-        }
-
-        public boolean isArguments() {
-            return this == ARGUMENTS;
-        }
-    }
-
-    protected ObjectAdapterLinkTo linkTo;
-
-    protected ObjectAdapter objectAdapter;
-    protected MemberType memberType;
-    protected T objectMember;
-    protected Mode mode = Mode.INLINE; // unless we determine otherwise
-
-    private final Where where;
-
-    public AbstractObjectMemberReprRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final RepresentationType representationType, final JsonRepresentation representation, Where where) {
-        super(resourceContext, linkFollower, representationType, representation);
-        this.where = where;
-    }
-
-    @Override
-    public R with(final ObjectAndMember<T> objectAndMember) {
-        this.objectAdapter = objectAndMember.getObjectAdapter();
-        this.objectMember = objectAndMember.getMember();
-        this.memberType = MemberType.determineFrom(objectMember);
-        usingLinkTo(new DomainObjectLinkTo());
-
-        // done eagerly so can use as criteria for x-ro-follow-links
-        representation.mapPut(memberType.getJsProp(), objectMember.getId());
-        representation.mapPut("memberType", memberType.getName());
-
-        return cast(this);
-    }
-
-    /**
-     * Must be called after {@link #with(ObjectAndMember)} (which provides the
-     * {@link #objectAdapter}).
-     */
-    public R usingLinkTo(final ObjectAdapterLinkTo linkTo) {
-        this.linkTo = linkTo.usingUrlBase(resourceContext).with(objectAdapter);
-        return cast(this);
-    }
-
-    /**
-     * Indicate that this is a standalone representation.
-     */
-    public R asStandalone() {
-        mode = Mode.STANDALONE;
-        return cast(this);
-    }
-
-    /**
-     * Indicate that this is a representation to include as the result of a
-     * followed link.
-     */
-    public R asFollowed() {
-        mode = Mode.FOLLOWED;
-        return cast(this);
-    }
-
-    /**
-     * Indicates that the representation was produced as the result of a
-     * resource that mutated the state.
-     * 
-     * <p>
-     * The effect of this is to suppress the link to self.
-     */
-    public R asMutated() {
-        mode = Mode.MUTATED;
-        return cast(this);
-    }
-
-    public R asArguments() {
-        mode = Mode.ARGUMENTS;
-        return cast(this);
-    }
-
-    /**
-     * For subclasses to call from their {@link #render()} method.
-     */
-    protected void renderMemberContent() {
-        if (mode.isInline()) {
-            addDetailsLinkIfPersistent();
-        }
-
-        if (mode.isStandalone()) {
-            addLinkToSelf();
-        }
-
-        if (mode.isStandalone() || mode.isMutated()) {
-            addLinkToUp();
-        }
-
-        if (mode.isFollowed() || mode.isStandalone() || mode.isMutated()) {
-            addMutatorsIfEnabled();
-
-            putExtensionsIsisProprietary();
-            addLinksToFormalDomainModel();
-            addLinksIsisProprietary();
-        }
-    }
-
-    private void addLinkToSelf() {
-        getLinks().arrayAdd(linkTo.memberBuilder(Rel.SELF, memberType, objectMember).build());
-    }
-
-    private void addLinkToUp() {
-        getLinks().arrayAdd(linkTo.builder(Rel.UP).build());
-    }
-
-    protected abstract void addMutatorsIfEnabled();
-
-    /**
-     * For subclasses to call back to when {@link #addMutatorsIfEnabled() adding
-     * mutators}.
-     */
-    protected void addLinkFor(final MutatorSpec mutatorSpec) {
-        if (!hasMemberFacet(mutatorSpec.mutatorFacetType)) {
-            return;
-        }
-        final JsonRepresentation arguments = mutatorArgs(mutatorSpec);
-        final RepresentationType representationType = memberType.getRepresentationType();
-        final JsonRepresentation mutatorLink = linkToForMutatorInvoke().memberBuilder(mutatorSpec.rel, memberType, objectMember, representationType, mutatorSpec.suffix).withHttpMethod(mutatorSpec.httpMethod).withArguments(arguments).build();
-        getLinks().arrayAdd(mutatorLink);
-    }
-
-    /**
-     * Hook to allow actions to render invoke links that point to the
-     * contributing service.
-     */
-    protected ObjectAdapterLinkTo linkToForMutatorInvoke() {
-        return linkTo;
-    }
-
-    /**
-     * Default implementation (common to properties and collections) that can be
-     * overridden (ie by actions) if required.
-     */
-    protected JsonRepresentation mutatorArgs(final MutatorSpec mutatorSpec) {
-        if (mutatorSpec.arguments.isNone()) {
-            return null;
-        }
-        if (mutatorSpec.arguments.isOne()) {
-            final JsonRepresentation repr = JsonRepresentation.newMap();
-            repr.mapPut("value", NullNode.getInstance()); // force a null into
-                                                          // the map
-            return repr;
-        }
-        // overridden by actions
-        throw new UnsupportedOperationException("override mutatorArgs() to populate for many arguments");
-    }
-
-    private void addDetailsLinkIfPersistent() {
-        if (!objectAdapter.representsPersistent()) {
-            return;
-        }
-        final JsonRepresentation link = linkTo.memberBuilder(Rel.DETAILS, memberType, objectMember).build();
-        getLinks().arrayAdd(link);
-
-        final LinkFollower membersLinkFollower = getLinkFollower();
-        final LinkFollower detailsLinkFollower = membersLinkFollower.follow("links[rel=%s]", Rel.DETAILS.getName());
-        if (membersLinkFollower.matches(representation) && detailsLinkFollower.matches(link)) {
-            followDetailsLink(link);
-        }
-        return;
-    }
-
-    protected abstract void followDetailsLink(JsonRepresentation detailsLink);
-
-    protected final void putDisabledReasonIfDisabled() {
-        final String disabledReasonRep = usability().getReason();
-        representation.mapPut("disabledReason", disabledReasonRep);
-    }
-
-    protected abstract void putExtensionsIsisProprietary();
-
-    protected abstract void addLinksToFormalDomainModel();
-
-    protected abstract void addLinksIsisProprietary();
-
-    /**
-     * Convenience method.
-     */
-    public boolean isMemberVisible() {
-        return visibility().isAllowed();
-    }
-
-    protected <F extends Facet> F getMemberSpecFacet(final Class<F> facetType) {
-        final ObjectSpecification otoaSpec = objectMember.getSpecification();
-        return otoaSpec.getFacet(facetType);
-    }
-
-    protected boolean hasMemberFacet(final Class<? extends Facet> facetType) {
-        return objectMember.getFacet(facetType) != null;
-    }
-
-    protected Consent usability() {
-        return objectMember.isUsable(getSession(), objectAdapter, where);
-    }
-
-    protected Consent visibility() {
-        return objectMember.isVisible(getSession(), objectAdapter, where);
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/ActionResultReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/ActionResultReprRenderer.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/ActionResultReprRenderer.java
deleted file mode 100644
index 158f41b..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/ActionResultReprRenderer.java
+++ /dev/null
@@ -1,183 +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.restfulobjects.viewer.resources.domainobjects;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.applib.links.Rel;
-import org.apache.isis.viewer.restfulobjects.domainobjects.ActionResultRepresentation.ResultType;
-import org.apache.isis.viewer.restfulobjects.viewer.RendererContext;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.LinkBuilder;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.LinkFollower;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.RendererFactory;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.RendererFactoryRegistry;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.ReprRenderer;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.ReprRendererAbstract;
-import org.apache.isis.viewer.restfulobjects.viewer.representations.ReprRendererFactoryAbstract;
-
-public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultReprRenderer, ObjectAndActionInvocation> {
-
-    private ObjectAdapterLinkTo adapterLinkTo = new DomainObjectLinkTo();
-
-    private ObjectAdapter objectAdapter;
-    private ObjectAction action;
-    private JsonRepresentation arguments;
-    private ObjectAdapter returnedAdapter;
-
-    public static class Factory extends ReprRendererFactoryAbstract {
-
-        public Factory() {
-            super(RepresentationType.ACTION_RESULT);
-        }
-
-        @Override
-        public ReprRenderer<?, ?> newRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final JsonRepresentation representation) {
-            return new ActionResultReprRenderer(resourceContext, linkFollower, getRepresentationType(), representation);
-        }
-    }
-
-    private ActionResultReprRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final RepresentationType representationType, final JsonRepresentation representation) {
-        super(resourceContext, linkFollower, representationType, representation);
-    }
-
-    @Override
-    public ActionResultReprRenderer with(final ObjectAndActionInvocation objectAndActionInvocation) {
-
-        objectAdapter = objectAndActionInvocation.getObjectAdapter();
-        action = objectAndActionInvocation.getAction();
-        arguments = objectAndActionInvocation.getArguments();
-        returnedAdapter = objectAndActionInvocation.getReturnedAdapter();
-
-        adapterLinkTo.with(returnedAdapter);
-
-        return this;
-    }
-
-    public void using(final ObjectAdapterLinkTo adapterLinkTo) {
-        this.adapterLinkTo = adapterLinkTo.with(objectAdapter);
-    }
-
-    @Override
-    public JsonRepresentation render() {
-
-        representationWithSelfFor(action, arguments);
-
-        addResult(representation);
-
-        addExtensionsIsisProprietaryChangedObjects();
-
-        return representation;
-    }
-
-    private void addResult(final JsonRepresentation representation) {
-        final JsonRepresentation result = JsonRepresentation.newMap();
-        final ResultType resultType = addResultTo(result);
-
-        if (!resultType.isVoid()) {
-            putResultType(representation, resultType);
-            representation.mapPut("result", result);
-        }
-    }
-
-    private ResultType addResultTo(final JsonRepresentation result) {
-
-        final ObjectSpecification returnType = this.action.getReturnType();
-
-        if (returnType.getCorrespondingClass() == void.class) {
-            // void
-            return ResultType.VOID;
-        }
-
-        final CollectionFacet collectionFacet = returnType.getFacet(CollectionFacet.class);
-        if (collectionFacet != null) {
-            // collection
-
-            final Collection<ObjectAdapter> collectionAdapters = collectionFacet.collection(returnedAdapter);
-
-            final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.LIST);
-            final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(resourceContext, null, result);
-            renderer.with(collectionAdapters).withReturnType(action.getReturnType()).withElementType(returnedAdapter.getElementSpecification());
-
-            renderer.render();
-            return ResultType.LIST;
-        }
-
-        final EncodableFacet encodableFacet = returnType.getFacet(EncodableFacet.class);
-        if (encodableFacet != null) {
-            // scalar
-
-            final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.SCALAR_VALUE);
-
-            final ScalarValueReprRenderer renderer = (ScalarValueReprRenderer) factory.newRenderer(resourceContext, null, result);
-            renderer.with(returnedAdapter).withReturnType(action.getReturnType());
-
-            renderer.render();
-            return ResultType.SCALAR_VALUE;
-
-        }
-
-        {
-            // object
-            final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.DOMAIN_OBJECT);
-            final DomainObjectReprRenderer renderer = (DomainObjectReprRenderer) factory.newRenderer(resourceContext, null, result);
-
-            renderer.with(returnedAdapter).includesSelf();
-
-            renderer.render();
-            return ResultType.DOMAIN_OBJECT;
-        }
-    }
-
-    private void putResultType(final JsonRepresentation representation, final ResultType resultType) {
-        representation.mapPut("resulttype", resultType.getValue());
-    }
-
-    private JsonRepresentation representationWithSelfFor(final ObjectAction action, final JsonRepresentation bodyArgs) {
-        final JsonRepresentation links = JsonRepresentation.newArray();
-        representation.mapPut("links", links);
-
-        final LinkBuilder selfLinkBuilder = adapterLinkTo.memberBuilder(Rel.SELF, MemberType.ACTION, action, RepresentationType.ACTION_RESULT, "invoke");
-
-        // TODO: remove duplication with AbstractObjectMember#addLinkTo
-        final MemberType memberType = MemberType.of(action);
-        final Map<String, MutatorSpec> mutators = memberType.getMutators();
-
-        final String mutator = InvokeKeys.getKeyFor(action.getSemantics());
-        final MutatorSpec mutatorSpec = mutators.get(mutator);
-        selfLinkBuilder.withHttpMethod(mutatorSpec.httpMethod);
-
-        final JsonRepresentation selfLink = selfLinkBuilder.build();
-
-        links.arrayAdd(selfLink);
-        selfLink.mapPut("args", bodyArgs);
-        return representation;
-    }
-
-    protected RendererFactoryRegistry getRendererFactoryRegistry() {
-        // TODO: yuck
-        return RendererFactoryRegistry.instance;
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/bb79d33e/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/BodyArgs.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/BodyArgs.java b/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/BodyArgs.java
deleted file mode 100644
index 08aeac5..0000000
--- a/component/viewer/restfulobjects/impl/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/resources/domainobjects/BodyArgs.java
+++ /dev/null
@@ -1,41 +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.restfulobjects.viewer.resources.domainobjects;
-
-public enum BodyArgs {
-    /**
-     * eg property clear
-     */
-    NONE,
-    /**
-     * eg property modify, collection addto/remove
-     */
-    ONE,
-    /**
-     * eg action invoke
-     */
-    MANY;
-
-    public boolean isOne() {
-        return this == ONE;
-    }
-
-    public boolean isNone() {
-        return this == NONE;
-    }
-
-}