Return-Path: X-Original-To: apmail-incubator-isis-commits-archive@minotaur.apache.org Delivered-To: apmail-incubator-isis-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4F2BB677D for ; Sun, 26 Jun 2011 11:52:17 +0000 (UTC) Received: (qmail 90798 invoked by uid 500); 26 Jun 2011 11:52:17 -0000 Delivered-To: apmail-incubator-isis-commits-archive@incubator.apache.org Received: (qmail 90747 invoked by uid 500); 26 Jun 2011 11:52:17 -0000 Mailing-List: contact isis-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: isis-dev@incubator.apache.org Delivered-To: mailing list isis-commits@incubator.apache.org Received: (qmail 90718 invoked by uid 99); 26 Jun 2011 11:52:17 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 26 Jun 2011 11:52:17 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 26 Jun 2011 11:51:59 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id DE30B2388A9C; Sun, 26 Jun 2011 11:51:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1139763 [8/10] - in /incubator/isis/trunk/viewer: json/ json/applib2/ json/applib2/src/ json/applib2/src/main/ json/applib2/src/main/java/ json/applib2/src/main/java/META-INF/ json/applib2/src/main/java/org/ json/applib2/src/main/java/org/... Date: Sun, 26 Jun 2011 11:51:10 -0000 To: isis-commits@incubator.apache.org From: danhaywood@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110626115112.DE30B2388A9C@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,602 @@ +/* + * 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.restful.viewer.resources.objects; + +import java.io.InputStream; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +import javax.ws.rs.Path; +import javax.ws.rs.WebApplicationException; + +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.consent.Consent; +import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet; +import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet; +import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils; +import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet; +import org.apache.isis.core.metamodel.spec.ActionType; +import org.apache.isis.core.metamodel.spec.ObjectSpecification; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; +import org.apache.isis.core.metamodel.spec.feature.ObjectFeature; +import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation; +import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation; +import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext; +import org.apache.isis.viewer.restful.applib.resources.ObjectResource; +import org.apache.isis.viewer.restful.viewer.Constants; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.html.XhtmlTemplate; +import org.apache.isis.viewer.restful.viewer.resources.ResourceAbstract; +import org.apache.isis.viewer.restful.viewer.resources.objects.actions.TableColumnNakedObjectActionInvoke; +import org.apache.isis.viewer.restful.viewer.resources.objects.actions.TableColumnNakedObjectActionName; +import org.apache.isis.viewer.restful.viewer.resources.objects.actions.TableColumnNakedObjectActionParamCount; +import org.apache.isis.viewer.restful.viewer.resources.objects.actions.TableColumnNakedObjectActionRealTarget; +import org.apache.isis.viewer.restful.viewer.resources.objects.actions.TableColumnNakedObjectActionReturnType; +import org.apache.isis.viewer.restful.viewer.resources.objects.actions.TableColumnNakedObjectActionType; +import org.apache.isis.viewer.restful.viewer.resources.objects.collections.TableColumnOneToManyAssociationAccess; +import org.apache.isis.viewer.restful.viewer.resources.objects.collections.TableColumnOneToManyAssociationAddTo; +import org.apache.isis.viewer.restful.viewer.resources.objects.collections.TableColumnOneToManyAssociationInvalidReason; +import org.apache.isis.viewer.restful.viewer.resources.objects.collections.TableColumnOneToManyAssociationName; +import org.apache.isis.viewer.restful.viewer.resources.objects.collections.TableColumnOneToManyAssociationRemoveFrom; +import org.apache.isis.viewer.restful.viewer.resources.objects.properties.TableColumnOneToOneAssociationAccess; +import org.apache.isis.viewer.restful.viewer.resources.objects.properties.TableColumnOneToOneAssociationClear; +import org.apache.isis.viewer.restful.viewer.resources.objects.properties.TableColumnOneToOneAssociationInvalidReason; +import org.apache.isis.viewer.restful.viewer.resources.objects.properties.TableColumnOneToOneAssociationModify; +import org.apache.isis.viewer.restful.viewer.resources.objects.properties.TableColumnOneToOneAssociationName; +import org.apache.isis.viewer.restful.viewer.resources.objects.properties.TableColumnOneToOneAssociationParseable; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.util.ActionUtils; +import org.apache.isis.viewer.restful.viewer.util.InputStreamUtil; +import org.apache.isis.viewer.restful.viewer.util.ListUtils; +import org.apache.isis.viewer.restful.viewer.util.UrlDecoderUtils; +import org.apache.isis.viewer.restful.viewer.xom.TableColumn; + +/** + * Implementation note: it seems to be necessary to annotate the implementation with {@link Path} rather than the + * interface (at least under RestEasy 1.0.2 and 1.1-RC2). + */ +@Path("/object") +public class ObjectResourceImpl extends ResourceAbstract implements ObjectResource { + + @Override + public String object(final String oidEncodedStr) { + init(); + final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr); + + final ObjectAdapter objectAdapter = getObjectAdapter(oidStr); + if (objectAdapter == null) { + throw new WebApplicationException(responseOfGone("could not determine object")); + } + + final String javascriptFile = + isJavascriptDebug() ? Constants.JQUERY_SRC_JS : Constants.JQUERY_MIN_JS; + // html template + final XhtmlTemplate xhtml = + new XhtmlTemplate(objectAdapter.titleString(), getServletRequest(), javascriptFile, + Constants.ISIS_REST_SUPPORT_JS); + + xhtml.appendToBody(asDivIsisSession()); + xhtml.appendToBody(resourcesDiv()); + + // object div + final Element objectDiv = div(HtmlClass.OBJECT); + xhtml.appendToBody(objectDiv); + + // title & Oid + final Element objectSpecsDiv = asDivTableObjectDetails(objectAdapter); + xhtml.appendToDiv(objectDiv, objectSpecsDiv); + // xhtml.appendToBody(div); + + // properties (in line table) + final Element propertiesTableEl = asDivTableProperties(getSession(), objectAdapter); + xhtml.appendToDiv(objectDiv, propertiesTableEl); + // xhtml.appendToBody(propertiesTableEl); + + // collections + final Element collectionsDivEl = asDivTableCollections(getSession(), objectAdapter); + xhtml.appendToDiv(objectDiv, collectionsDivEl); + // xhtml.appendToBody(collectionsDivEl); + + // actions + final Element actionsDivEl = asDivTableActions(getSession(), objectAdapter); + xhtml.appendToDiv(objectDiv, actionsDivEl); + // xhtml.appendToBody(actionsDivEl); + + return xhtml.toXML(); + } + + public Element asDivTableProperties(final AuthenticationSession session, final ObjectAdapter nakedObject) { + final Element div = xhtmlRenderer.div_p("Properties", HtmlClass.PROPERTIES); + + final ObjectSpecification noSpec = nakedObject.getSpecification(); + final List rows = noSpec.getProperties(); + + final List> columns = new ArrayList>(); + columns.add(new TableColumnOneToOneAssociationName(noSpec, session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectAssociationType(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnNakedObjectMemberHidden(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnOneToOneAssociationAccess(session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectMemberDisabled(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnNakedObjectMemberDisabledReason(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnOneToOneAssociationParseable(session, nakedObject, getResourceContext())); + columns.add(new TableColumnOneToOneAssociationModify(session, nakedObject, getResourceContext())); + columns.add(new TableColumnOneToOneAssociationClear(session, nakedObject, getResourceContext())); + columns.add(new TableColumnOneToOneAssociationInvalidReason(session, nakedObject, getResourceContext())); + + final Element table = xhtmlRenderer.table(columns, rows, HtmlClass.FACETS); + div.appendChild(table); + return div; + } + + public Element asDivTableCollections(final AuthenticationSession session, final ObjectAdapter nakedObject) { + final Element div = xhtmlRenderer.div_p("Collections", HtmlClass.COLLECTIONS); + + final ObjectSpecification noSpec = nakedObject.getSpecification(); + final List rows = noSpec.getCollections(); + + final List> columns = new ArrayList>(); + columns.add(new TableColumnOneToManyAssociationName(noSpec, session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectAssociationType(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnNakedObjectMemberHidden(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnNakedObjectMemberDisabled(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnOneToManyAssociationAccess(session, nakedObject, getResourceContext())); + columns.add(new TableColumnOneToManyAssociationAddTo(session, nakedObject, getResourceContext())); + columns.add(new TableColumnOneToManyAssociationRemoveFrom(session, nakedObject, getResourceContext())); + columns.add(new TableColumnOneToManyAssociationInvalidReason(session, nakedObject, getResourceContext())); + + final Element table = xhtmlRenderer.table(columns, rows, HtmlClass.FACETS); + div.appendChild(table); + return div; + } + + private Element asDivTableActions(final AuthenticationSession session, final ObjectAdapter nakedObject) { + + final Element div = xhtmlRenderer.div_p("Actions", HtmlClass.ACTIONS); + final ObjectSpecification noSpec = nakedObject.getSpecification(); + + final List actions = new ArrayList(); + for (final ActionType type : ResourceAbstract.ACTION_TYPES) { + final List actionsForType = ActionUtils.flattened(noSpec.getObjectActions(type)); + actions.addAll(actionsForType); + } + final List rows = ListUtils.toList(actions.toArray(new ObjectAction[0])); + + final List> columns = new ArrayList>(); + columns.add(new TableColumnNakedObjectActionName(noSpec, session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectActionType(session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectActionReturnType(session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectActionParamCount(session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectMemberHidden(session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectMemberDisabled(session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectMemberDisabledReason(session, nakedObject, + getResourceContext())); + columns.add(new TableColumnNakedObjectActionRealTarget(session, nakedObject, getResourceContext())); + columns.add(new TableColumnNakedObjectActionInvoke(session, nakedObject, getResourceContext())); + + final Element table = xhtmlRenderer.table(columns, rows, HtmlClass.FACETS); + div.appendChild(table); + return div; + } + + // ///////////////////////////////////////////////////////////////////// + // properties + // ///////////////////////////////////////////////////////////////////// + + @Override + public String modifyProperty(final String oidEncodedStr, final String propertyEncodedId, + final String proposedEncodedValue) { + init(); + final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr); + final String propertyId = UrlDecoderUtils.urlDecode(propertyEncodedId); + final String proposedValue = UrlDecoderUtils.urlDecode(proposedEncodedValue); + + final ObjectAdapter nakedObject = getObjectAdapter(oidStr); + if (nakedObject == null) { + throw new WebApplicationException(responseOfGone("could not determine object")); + } + + final ObjectSpecification noSpec = nakedObject.getSpecification(); + + final OneToOneAssociation property = (OneToOneAssociation) noSpec.getAssociation(propertyId); + + final ObjectAdapter proposedValueNO = getObjectAdapter(proposedValue, nakedObject, property); + + // make sure we have a value (should be using clear otherwise) + if (proposedValueNO == null) { + throw new WebApplicationException(responseOfBadRequest("null argument")); + } + + // validate + final Consent consent = property.isAssociationValid(nakedObject, proposedValueNO); + if (consent.isVetoed()) { + throw new WebApplicationException(responseOfBadRequest(consent)); + } + + // html template + final XhtmlTemplate xhtml = + new XhtmlTemplate(nakedObject.titleString() + "." + propertyId, getServletRequest()); + xhtml.appendToBody(asDivIsisSession()); + xhtml.appendToBody(resourcesDiv()); + + // title & Oid + final Element div = asDivTableObjectDetails(nakedObject); + xhtml.appendToBody(div); + + // if valid, then set + property.setAssociation(nakedObject, proposedValueNO); + + return xhtml.toXML(); + } + + @Override + public String clearProperty(final String oidEncodedStr, final String propertyEncodedId) { + init(); + final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr); + final String propertyId = UrlDecoderUtils.urlDecode(propertyEncodedId); + + final ObjectAdapter objectAdapter = getObjectAdapter(oidStr); + if (objectAdapter == null) { + throw new WebApplicationException(responseOfGone("could not determine object")); + } + + final ObjectSpecification noSpec = objectAdapter.getSpecification(); + + final OneToOneAssociation property = (OneToOneAssociation) noSpec.getAssociation(propertyId); + + // validate + final Consent consent = property.isAssociationValid(objectAdapter, null); + if (consent.isVetoed()) { + throw new WebApplicationException(responseOfBadRequest(consent)); + } + + // html template + final XhtmlTemplate xhtml = + new XhtmlTemplate(objectAdapter.titleString() + "." + propertyId, getServletRequest()); + xhtml.appendToBody(asDivIsisSession()); + xhtml.appendToBody(resourcesDiv()); + + // title & Oid + final Element div = asDivTableObjectDetails(objectAdapter); + xhtml.appendToBody(div); + + // if valid, then clear + property.clearAssociation(objectAdapter); + + return xhtml.toXML(); + } + + // ///////////////////////////////////////////////////////////////////// + // collections + // ///////////////////////////////////////////////////////////////////// + + private enum CollectionModificationType { + ADD_TO, REMOVE_FROM + } + + @Override + public String accessCollection(final String oidEncodedStr, final String collectionEncodedId) { + init(); + final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr); + final String collectionId = UrlDecoderUtils.urlDecode(collectionEncodedId); + + final ObjectAdapter objectAdapter = getObjectAdapter(oidStr); + if (objectAdapter == null) { + throw new WebApplicationException(responseOfGone("could not determine object")); + } + + final ObjectSpecification noSpec = objectAdapter.getSpecification(); + final ObjectAssociation association = noSpec.getAssociation(collectionId); + if (!association.isOneToManyAssociation()) { + throw new WebApplicationException(responseOfBadRequest("Not a collection")); + } + + // html template + final XhtmlTemplate xhtml = + new XhtmlTemplate(objectAdapter.titleString() + "." + collectionId, getServletRequest()); + xhtml.appendToBody(asDivIsisSession()); + xhtml.appendToBody(resourcesDiv()); + + // title & Oid + Element div = asDivTableObjectDetails(objectAdapter); + xhtml.appendToBody(div); + + // collection name & contents + final OneToManyAssociation collection = (OneToManyAssociation) association; + + div = xhtmlRenderer.div_p(collectionId, HtmlClass.COLLECTION); + + final Element ul = xhtmlRenderer.ul(HtmlClass.COLLECTION); + div.appendChild(ul); + + final ObjectAdapter collectionObj = collection.get(objectAdapter); + + final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(collectionObj); + for (final Iterator iter = facet.iterator(collectionObj); iter.hasNext();) { + final ObjectAdapter associatedNO = iter.next(); + ul.appendChild(toLiAHref(associatedNO)); + } + + xhtml.appendToBody(div); + return xhtml.toXML(); + } + + @Override + public String addToCollection(final String oidStr, final String collectionEncodedId, + final String proposedValueEncodedOidStr) { + return modifyCollection(oidStr, collectionEncodedId, proposedValueEncodedOidStr, + CollectionModificationType.ADD_TO); + } + + @Override + public String removeFromCollection(final String oidStr, final String collectionEncodedId, + final String proposedValueEncodedOidStr) { + return modifyCollection(oidStr, collectionEncodedId, proposedValueEncodedOidStr, + CollectionModificationType.REMOVE_FROM); + } + + private String modifyCollection(final String oidEncodedStr, final String collectionEncodedId, + final String proposedValueEncodedOidStr, final CollectionModificationType modification) { + init(); + final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr); + final String collectionId = UrlDecoderUtils.urlDecode(collectionEncodedId); + final String proposedValueOidStr = UrlDecoderUtils.urlDecode(proposedValueEncodedOidStr); + + final ObjectAdapter objectAdapter = getObjectAdapter(oidStr); + if (objectAdapter == null) { + throw new WebApplicationException(responseOfGone("could not determine object")); + } + + final ObjectSpecification noSpec = objectAdapter.getSpecification(); + + final OneToManyAssociation collection = (OneToManyAssociation) noSpec.getAssociation(collectionId); + + ObjectAdapter proposedValueNO = null; + proposedValueNO = getObjectAdapter(proposedValueOidStr); + + if (proposedValueNO == null) { + throw new WebApplicationException(responseOfGone("could not determine proposed value")); + } + + // validate + final Consent consent = + modification == CollectionModificationType.ADD_TO ? collection.isValidToAdd(objectAdapter, proposedValueNO) + : collection.isValidToRemove(objectAdapter, proposedValueNO); + if (consent.isVetoed()) { + throw new WebApplicationException(responseOfBadRequest(consent)); + } + + // html template + final XhtmlTemplate xhtml = + new XhtmlTemplate(objectAdapter.titleString() + "." + collectionId, getServletRequest()); + xhtml.appendToBody(asDivIsisSession()); + xhtml.appendToBody(resourcesDiv()); + + // title & Oid + final Element div = asDivTableObjectDetails(objectAdapter); + xhtml.appendToBody(div); + + // if valid, then set + if (modification == CollectionModificationType.ADD_TO) { + collection.addElement(objectAdapter, proposedValueNO); + } else { + collection.removeElement(objectAdapter, proposedValueNO); + } + + return xhtml.toXML(); + } + + // ///////////////////////////////////////////////////////////////////// + // actions + // ///////////////////////////////////////////////////////////////////// + + @Override + public String invokeAction(final String oidEncodedStr, final String actionEncodedId, final InputStream body) { + init(); + + final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr); + final String actionId = UrlDecoderUtils.urlDecode(actionEncodedId); + final List argsEncodedArray = InputStreamUtil.getArgs(body); + final String[] argsEncoded = argsEncodedArray.toArray(new String[] {}); + final String[] args = urlDecode(argsEncoded); + + final ObjectAdapter nakedObject = getObjectAdapter(oidStr); + if (nakedObject == null) { + throw new WebApplicationException(responseOfGone("could not determine object")); + } + + final ObjectSpecification noSpec = nakedObject.getSpecification(); + final ObjectAction action = getObjectAction(noSpec, actionId); + + final List parameters = action.getParameters(); + final int parameterCount = parameters.size(); + final int argumentCount = args.length; + if (parameterCount > argumentCount) { + // this isn't an != check because JAX-RS will always give us 10 args, but some/all will be null. + final String reason = + MessageFormat.format("provided {0} parameters but {1} arguments", parameterCount, argumentCount); + throw new WebApplicationException(responseOfBadRequest(reason)); + } + + final ObjectAdapter[] proposedArguments = new ObjectAdapter[parameterCount]; + for (int i = 0; i < parameters.size(); i++) { + final String proposedArg = args[i]; + if (proposedArg != null) { + final ObjectAdapter argNO = getObjectAdapter(proposedArg, nakedObject, parameters.get(i)); + + if (argNO == null) { + throw new WebApplicationException(responseOfGone("could not determine proposed value")); + } + proposedArguments[i] = argNO; + } + } + + // html template + final XhtmlTemplate xhtml = new XhtmlTemplate(nakedObject.titleString() + "." + actionId, getServletRequest()); + xhtml.appendToBody(asDivIsisSession()); + + // title & Oid + Element div = asDivTableObjectDetails(nakedObject); + xhtml.appendToBody(div); + + // action Name + div = xhtmlRenderer.div_p(actionId, HtmlClass.COLLECTION); + xhtml.appendToBody(div); + + // TODO: should be checking if enabled, or indeed, if visible? + // probably for modifying properties and collections too. + + // validate + final Consent consent = action.isProposedArgumentSetValid(nakedObject, proposedArguments); + if (consent.isVetoed()) { + throw new WebApplicationException(responseOfBadRequest(consent)); + } + + // invoke the action + final ActionInvocationFacet actionInvocationFacet = action.getFacet(ActionInvocationFacet.class); + final ObjectAdapter result = actionInvocationFacet.invoke(nakedObject, proposedArguments); + if (result == null) { + // do nothing; + // NB: this is not a response of NO_CONTENT + // (not sure if it ought to be, can't see how you would return it) + } else { + final Object object = result.getObject(); + xhtml.appendToBody(actionResult(object)); + } + + return xhtml.toXML(); + } + + private static String[] urlDecode(final String[] encodedStrings) { + final String[] strings = new String[encodedStrings.length]; + for (int i = 0; i < encodedStrings.length; i++) { + strings[i] = UrlDecoderUtils.urlDecode(encodedStrings[i]); + } + return strings; + } + + // TODO: this is horrid - shouldn't have to search in this way... + private ObjectAction getObjectAction(final ObjectSpecification noSpec, final String actionId) { + ObjectAction action = null; + action = noSpec.getObjectAction(ActionType.USER, actionId); + if (action != null) { + return action; + } + action = noSpec.getObjectAction(ActionType.EXPLORATION, actionId); + if (action != null) { + return action; + } + action = noSpec.getObjectAction(ActionType.DEBUG, actionId); + if (action != null) { + return action; + } + return null; + } + + private Element actionResult(final Object result) { + final Element div_p = xhtmlRenderer.div_p("Action Results", HtmlClass.ACTION_RESULT); + div_p.appendChild(actionResultContent(result)); + return div_p; + } + + private Element actionResultContent(final Object result) { + if (result == null) { + return xhtmlRenderer.p(null, HtmlClass.ACTION_RESULT); + } + + // deal with as collection + if (result instanceof Collection) { + final Collection collection = (Collection) result; + final Element ul = xhtmlRenderer.ul(HtmlClass.ACTION_RESULT); + for (final Object object : collection) { + ul.appendChild(toLiAHref(object)); + } + return ul; + } + + // deal with as object + return toAHref(result); + } + + // ////////////////////////////////////////////////////////////// + // Helpers + // ////////////////////////////////////////////////////////////// + + private Element toLiAHref(final Object object) { + final Element li = new Element("li"); + li.appendChild(toAHref(object)); + return li; + } + + private Element toLiAHref(final ObjectAdapter nakedObject) { + final Element li = new Element("li"); + li.appendChild(toAHref(nakedObject)); + return li; + } + + private Element toAHref(final Object object) { + final ObjectAdapter nakedObject = getAdapterManager().getAdapterFor(object); + return toAHref(nakedObject); + } + + private Element toAHref(final ObjectAdapter nakedObject) { + final String uri = + MessageFormat.format("{0}/object/{1}", getServletRequest().getContextPath(), getOidStr(nakedObject)); + return xhtmlRenderer.aHref(uri, nakedObject.titleString(), "object", "results", HtmlClass.ACTION_RESULT); + } + + private ObjectAdapter getObjectAdapter(final String proposedValue, final ObjectAdapter nakedObject, + final ObjectFeature nakedObjectFeature) { + ObjectAdapter proposedValueNO = null; + ParseableFacet parseable = nakedObjectFeature.getFacet(ParseableFacet.class); + if (parseable == null) { + parseable = nakedObjectFeature.getSpecification().getFacet(ParseableFacet.class); + } + + if (parseable != null) { + proposedValueNO = parseable.parseTextEntry(nakedObject, proposedValue); + } else { + final String proposedValueOidStr = proposedValue; + proposedValueNO = getObjectAdapter(proposedValueOidStr); + } + return proposedValueNO; + } + + private boolean isJavascriptDebug() { + return getConfiguration().getBoolean(Constants.JAVASCRIPT_DEBUG_KEY, true); + } + + protected IsisConfiguration getConfiguration() { + return IsisContext.getConfiguration(); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociation.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociation.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociation.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociation.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,34 @@ +/* + * 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.restful.viewer.resources.objects; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public abstract class TableColumnNakedObjectAssociation extends + TableColumnNakedObjectMember { + + protected TableColumnNakedObjectAssociation(final String headerText, final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super(headerText, session, nakedObject, resourceContext); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationModifyAbstract.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationModifyAbstract.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationModifyAbstract.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationModifyAbstract.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,119 @@ +/* + * 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.restful.viewer.resources.objects; + +import java.text.MessageFormat; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; +import org.apache.isis.viewer.restful.viewer.tree.Attribute; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public abstract class TableColumnNakedObjectAssociationModifyAbstract extends + TableColumnNakedObjectAssociation { + + private final boolean inputField; + + public TableColumnNakedObjectAssociationModifyAbstract(final String columnName, + final AuthenticationSession session, final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + this(columnName, session, nakedObject, resourceContext, true); + } + + /** + * @param field + * - whether to include an input field. + */ + public TableColumnNakedObjectAssociationModifyAbstract(final String columnName, + final AuthenticationSession session, final ObjectAdapter nakedObject, final ResourceContext resourceContext, + final boolean field) { + super(columnName, session, nakedObject, resourceContext); + this.inputField = field; + } + + @Override + public Element doTd(final T association) { + if (!association.isVisible(getSession(), getNakedObject()).isAllowed()) { + return xhtmlRenderer.p(null, getHtmlClassAttribute()); + } + if (!association.isUsable(getSession(), getNakedObject()).isAllowed()) { + return xhtmlRenderer.p(null, getHtmlClassAttribute()); + } + + final Element div = xhtmlRenderer.div(getHtmlClassAttribute()); + + div.appendChild(form(association)); + return div; + } + + private Element form(final T association) { + final String associationId = association.getId(); + final String formName = getFormNamePrefix() + associationId; + final Element form = xhtmlRenderer.form(formName, getHtmlClassAttribute()); + form.addAttribute(new Attribute("class", associationId)); + + final String inputFieldName = "proposedValue"; + if (inputField) { + final Element inputValue = new Element("input"); + inputValue.addAttribute(new Attribute("type", "value")); + inputValue.addAttribute(new Attribute("name", inputFieldName)); + form.appendChild(inputValue); + } + + final Element inputButton = new Element("input"); + inputButton.addAttribute(new Attribute("type", "button")); + inputButton.addAttribute(new Attribute("value", getFormButtonLabel())); + final String servletContextName = getContextPath(); + final String url = MessageFormat.format("{0}/object/{1}", servletContextName, getOidStr()); + inputButton.addAttribute(new Attribute("onclick", invokeJavascript(url, associationId, inputFieldName))); + + form.appendChild(inputButton); + form.addAttribute(new Attribute("action", url)); + + return form; + } + + protected abstract String getFormButtonLabel(); + + /** + * Used to construct the <form name="xxx"> that holds the value used to make the change. + * + * @return + */ + protected abstract String getFormNamePrefix(); + + /** + * Used HTML Class attribute used variously throughout the rendered HTML form. + * + * @return + */ + protected abstract String getHtmlClassAttribute(); + + /** + * Invoke the appropriate Javascript function from isis-rest-support.js. + * + * @param url + * @param associationId + * @param inputFieldName + * @return + */ + protected abstract String invokeJavascript(String url, String associationId, String inputFieldName); + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationType.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationType.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationType.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectAssociationType.java Sun Jun 26 11:51:01 2011 @@ -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.restful.viewer.resources.objects; + +import java.text.MessageFormat; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectAssociationType extends + TableColumnNakedObjectAssociation { + + public TableColumnNakedObjectAssociationType(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Type", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final T association) { + final String assocTypeFullName = association.getSpecification().getFullIdentifier(); + final String uri = MessageFormat.format("{0}/specs/{1}", getContextPath(), assocTypeFullName); + return xhtmlRenderer.aHref(uri, assocTypeFullName, "propertyTypeSpec", "property", HtmlClass.PROPERTY); + } +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMember.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMember.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMember.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMember.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectMember; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; +import org.apache.isis.viewer.restful.viewer.xom.TableColumnAbstract; + +public abstract class TableColumnNakedObjectMember extends TableColumnAbstract { + + private final ObjectAdapter nakedObject; + private final AuthenticationSession session; + + protected TableColumnNakedObjectMember(final String headerText, final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super(headerText, resourceContext); + this.nakedObject = nakedObject; + this.session = session; + } + + protected String getOidStr() { + return getOidStr(getNakedObject()); + } + + public ObjectAdapter getNakedObject() { + return nakedObject; + } + + public AuthenticationSession getSession() { + return session; + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabled.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabled.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabled.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabled.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectMember; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectMemberDisabled extends TableColumnNakedObjectMember { + + public TableColumnNakedObjectMemberDisabled(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Disabled", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final T member) { + final boolean disabled = !member.isUsable(getSession(), getNakedObject()).isAllowed(); + return xhtmlRenderer.p(disabled, HtmlClass.USABLE); + } +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabledReason.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabledReason.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabledReason.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberDisabledReason.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.consent.Consent; +import org.apache.isis.core.metamodel.spec.feature.ObjectMember; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectMemberDisabledReason extends + TableColumnNakedObjectMember { + + public TableColumnNakedObjectMemberDisabledReason(final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super("Disabled Reason", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final T property) { + final Consent usable = property.isUsable(getSession(), getNakedObject()); + if (usable.isAllowed()) { + return xhtmlRenderer.p(null, null); + } + + return xhtmlRenderer.p(usable.getReason(), HtmlClass.USABLE); + } +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberHidden.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberHidden.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberHidden.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberHidden.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectMember; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectMemberHidden extends TableColumnNakedObjectMember { + + public TableColumnNakedObjectMemberHidden(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Hidden", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final T member) { + final boolean hidden = !member.isVisible(getSession(), getNakedObject()).isAllowed(); + return xhtmlRenderer.p(hidden, HtmlClass.VISIBLE); + } +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberInvalidReason.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberInvalidReason.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberInvalidReason.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberInvalidReason.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,47 @@ +/* + * 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.restful.viewer.resources.objects; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectMember; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public abstract class TableColumnNakedObjectMemberInvalidReason extends + TableColumnNakedObjectMember { + + public TableColumnNakedObjectMemberInvalidReason(final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super("Invalid Reason", session, nakedObject, resourceContext); + } + + /** + * Creates a <p id="association-invalid-associationId"/> element so that Javascript code can + * populate during validation. + */ + @Override + public Element doTd(final T member) { + return builder().el("p").classAttr(HtmlClass.VALID).idAttr(getDomId(member)).build(); + } + + protected abstract String getDomId(T member); + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberName.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberName.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberName.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/TableColumnNakedObjectMemberName.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects; + +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.metamodel.spec.feature.ObjectMember; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public abstract class TableColumnNakedObjectMemberName extends TableColumnNakedObjectMember { + private final ObjectSpecification noSpec; + + public TableColumnNakedObjectMemberName(final ObjectSpecification noSpec, final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super("Name", session, nakedObject, resourceContext); + this.noSpec = noSpec; + } + + protected ObjectSpecification getNoSpec() { + return noSpec; + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectAction.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectAction.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectAction.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectAction.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,39 @@ +/* + * 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.restful.viewer.resources.objects.actions; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.viewer.restful.viewer.resources.objects.TableColumnNakedObjectMember; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public abstract class TableColumnNakedObjectAction extends TableColumnNakedObjectMember { + + TableColumnNakedObjectAction(final String headerText, final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super(headerText, session, nakedObject, resourceContext); + } + + protected final String getOidStrRealTarget(final ObjectAction action) { + final ObjectAdapter realTarget = action.realTarget(getNakedObject()); + return getOidStr(realTarget); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvalidReason.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvalidReason.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvalidReason.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvalidReason.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects.actions; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.viewer.restful.viewer.resources.objects.TableColumnNakedObjectMemberInvalidReason; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectActionInvalidReason extends + TableColumnNakedObjectMemberInvalidReason { + + public TableColumnNakedObjectActionInvalidReason(final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super(session, nakedObject, resourceContext); + } + + @Override + protected String getDomId(final ObjectAction action) { + return "action-invalid-" + action.getId(); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvoke.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvoke.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvoke.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionInvoke.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,96 @@ +/* + * 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.restful.viewer.resources.objects.actions; + +import java.text.MessageFormat; +import java.util.List; + +import org.apache.isis.applib.Identifier; +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Attribute; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectActionInvoke extends TableColumnNakedObjectAction { + + private final static String INPUT_FIELD_NAME_PREFIX = "arg"; + + public TableColumnNakedObjectActionInvoke(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Invoke", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final ObjectAction action) { + final Identifier actionIdentifier = action.getIdentifier(); + final String actionId = actionIdentifier.toNameParmsIdentityString(); + + final String formName = "action-" + actionId; + final String uri = + MessageFormat.format("{0}/object/{1}/action/{2}", resourceContext.getHttpServletRequest().getContextPath(), + getOidStrRealTarget(action), actionId); + final List parameters = action.getParameters(); + + final Element div = xhtmlRenderer.div(HtmlClass.ACTION); + div.appendChild(renderForm(formName, uri, parameters)); + return div; + } + + private Element renderForm(final String formName, final String uri, final List parameters) { + + final Element form = xhtmlRenderer.form(formName, HtmlClass.ACTION); + form.addAttribute(new Attribute("method", "POST")); + form.addAttribute(new Attribute("action", uri)); + + renderInputFieldsForParameters(parameters, form); + + renderInputButton(form); + + return form; + } + + private void renderInputFieldsForParameters(final List parameters, final Element form) { + for (int i = 0; i < parameters.size(); i++) { + final ObjectActionParameter parameter = parameters.get(i); + final String inputFieldName = INPUT_FIELD_NAME_PREFIX + i; + + final Element inputLabel = new Element("p"); + inputLabel.appendChild(parameter.getName()); + form.appendChild(inputLabel); + + final Element inputValue = new Element("input"); + inputValue.addAttribute(new Attribute("type", "value")); + inputValue.addAttribute(new Attribute("name", inputFieldName)); + inputValue.addAttribute(new Attribute("class", parameter.getName())); + form.appendChild(inputValue); + } + } + + private void renderInputButton(final Element form) { + final Element inputButton = new Element("input"); + inputButton.addAttribute(new Attribute("type", "submit")); + inputButton.addAttribute(new Attribute("value", "Invoke")); + form.appendChild(inputButton); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionName.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionName.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionName.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionName.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects.actions; + +import java.text.MessageFormat; + +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.metamodel.spec.feature.ObjectAction; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.resources.objects.TableColumnNakedObjectMemberName; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public class TableColumnNakedObjectActionName extends TableColumnNakedObjectMemberName { + + public TableColumnNakedObjectActionName(final ObjectSpecification noSpec, final AuthenticationSession session, + final ObjectAdapter nakedObject, final ResourceContext resourceContext) { + super(noSpec, session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final ObjectAction nakedObjectAction) { + final String actionId = nakedObjectAction.getIdentifier().toNameParmsIdentityString(); + final String memberType = "action"; + final String uri = + MessageFormat.format("{0}/specs/{1}/{2}/{3}", getContextPath(), getNoSpec().getFullIdentifier(), + memberType, actionId); + return new Element(xhtmlRenderer.aHref(uri, nakedObjectAction.getName(), "actionSpec", memberType, + HtmlClass.ACTION)); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionParamCount.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionParamCount.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionParamCount.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionParamCount.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.isis.viewer.restful.viewer.resources.objects.actions; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectActionParamCount extends TableColumnNakedObjectAction { + + public TableColumnNakedObjectActionParamCount(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("# Params", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final ObjectAction action) { + return xhtmlRenderer.p("" + action.getParameterCount(), HtmlClass.ACTION); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionRealTarget.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionRealTarget.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionRealTarget.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionRealTarget.java Sun Jun 26 11:51:01 2011 @@ -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.restful.viewer.resources.objects.actions; + +import java.text.MessageFormat; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectActionRealTarget extends TableColumnNakedObjectAction { + + public TableColumnNakedObjectActionRealTarget(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Real Target", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final ObjectAction action) { + final String oidStrRealTarget = getOidStrRealTarget(action); + final String uri = MessageFormat.format("{0}/object/{1}", getContextPath(), oidStrRealTarget); + return new Element(xhtmlRenderer.aHref(uri, oidStrRealTarget, "actionRealTarget", "action", HtmlClass.ACTION)); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionReturnType.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionReturnType.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionReturnType.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionReturnType.java Sun Jun 26 11:51:01 2011 @@ -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.restful.viewer.resources.objects.actions; + +import java.text.MessageFormat; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectActionReturnType extends TableColumnNakedObjectAction { + + public TableColumnNakedObjectActionReturnType(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Type", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final ObjectAction action) { + final String returnTypeFullName = action.getReturnType().getFullIdentifier(); + final String uri = MessageFormat.format("{0}/specs/{1}", getContextPath(), returnTypeFullName); + return xhtmlRenderer.aHref(uri, returnTypeFullName, "actionReturnTypeSpec", "action", HtmlClass.ACTION); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionType.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionType.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionType.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/actions/TableColumnNakedObjectActionType.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,39 @@ +/* + * 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.restful.viewer.resources.objects.actions; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.ObjectAction; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnNakedObjectActionType extends TableColumnNakedObjectAction { + + public TableColumnNakedObjectActionType(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Type", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final ObjectAction action) { + return xhtmlRenderer.p(action.getType().name(), HtmlClass.ACTION); + } +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAccess.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAccess.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAccess.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAccess.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,52 @@ +/* + * 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.restful.viewer.resources.objects.collections; + +import java.text.MessageFormat; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.resources.objects.TableColumnNakedObjectAssociation; +import org.apache.isis.viewer.restful.viewer.tree.Element; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnOneToManyAssociationAccess extends + TableColumnNakedObjectAssociation { + + public TableColumnOneToManyAssociationAccess(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("Access", session, nakedObject, resourceContext); + } + + @Override + public Element doTd(final OneToManyAssociation collection) { + if (!collection.isVisible(getSession(), getNakedObject()).isAllowed()) { + return xhtmlRenderer.p(null, HtmlClass.PROPERTY); + } + + final String contextPath = resourceContext.getHttpServletRequest().getContextPath(); + final String collectionId = collection.getId(); + final String uri = + MessageFormat.format("{0}/object/{1}/collection/{2}", contextPath, getOidStr(), collectionId); + return xhtmlRenderer.aHref(uri, collectionId, "collection", "nakedObject", HtmlClass.COLLECTION); + } + +} Added: incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAddTo.java URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAddTo.java?rev=1139763&view=auto ============================================================================== --- incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAddTo.java (added) +++ incubator/isis/trunk/viewer/xhtml/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/collections/TableColumnOneToManyAssociationAddTo.java Sun Jun 26 11:51:01 2011 @@ -0,0 +1,69 @@ +/* + * 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.restful.viewer.resources.objects.collections; + +import java.text.MessageFormat; + +import org.apache.isis.core.commons.authentication.AuthenticationSession; +import org.apache.isis.core.metamodel.adapter.ObjectAdapter; +import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation; +import org.apache.isis.viewer.restful.viewer.html.HtmlClass; +import org.apache.isis.viewer.restful.viewer.resources.objects.TableColumnNakedObjectAssociationModifyAbstract; +import org.apache.isis.viewer.restful.viewer.util.StringUtil; +import org.apache.isis.viewer.restful.viewer.xom.ResourceContext; + +public final class TableColumnOneToManyAssociationAddTo extends + TableColumnNakedObjectAssociationModifyAbstract { + + public TableColumnOneToManyAssociationAddTo(final AuthenticationSession session, final ObjectAdapter nakedObject, + final ResourceContext resourceContext) { + super("AddTo", session, nakedObject, resourceContext); + } + + @Override + protected String getFormNamePrefix() { + return "collection-"; + } + + @Override + protected String getHtmlClassAttribute() { + return HtmlClass.COLLECTION; + } + + @Override + protected String getFormButtonLabel() { + return "Add"; + } + + /** + * Calls the addToCollection() Javascript function that lives in isis-rest-support.js + * + * @param url + * @param associationId + * @param inputFieldName + * - the name of the field in the form to read the value. + * @return + */ + @Override + protected String invokeJavascript(final String url, final String associationId, final String inputFieldName) { + return MessageFormat.format("addToCollection({0}, {1}, {2}.value);", StringUtil.quote(url), + StringUtil.quote(associationId), inputFieldName); + } + +}