001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020package org.apache.isis.core.metamodel.specloader.specimpl; 021 022import org.apache.isis.applib.profiles.Localization; 023import org.apache.isis.core.metamodel.adapter.MutableProposedHolder; 024import org.apache.isis.core.metamodel.adapter.ObjectAdapter; 025import org.apache.isis.core.metamodel.facetapi.FeatureType; 026import org.apache.isis.core.metamodel.facets.TypedHolder; 027import org.apache.isis.core.metamodel.facets.maxlen.MaxLengthFacet; 028import org.apache.isis.core.metamodel.facets.multiline.MultiLineFacet; 029import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet; 030import org.apache.isis.core.metamodel.facets.typicallen.TypicalLengthFacet; 031import org.apache.isis.core.metamodel.spec.Instance; 032import org.apache.isis.core.metamodel.spec.ObjectSpecification; 033import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter; 034import org.apache.isis.core.metamodel.spec.feature.ParseableEntryActionParameter; 035 036public class ObjectActionParameterParseable extends ObjectActionParameterAbstract implements ParseableEntryActionParameter { 037 038 public ObjectActionParameterParseable(final int index, final ObjectActionImpl action, final TypedHolder peer) { 039 super(index, action, peer); 040 } 041 042 @Override 043 public int getNoLines() { 044 final MultiLineFacet facet = getFacet(MultiLineFacet.class); 045 return facet.numberOfLines(); 046 } 047 048 @Override 049 public boolean canWrap() { 050 final MultiLineFacet facet = getFacet(MultiLineFacet.class); 051 return !facet.preventWrapping(); 052 } 053 054 @Override 055 public int getMaximumLength() { 056 final MaxLengthFacet facet = getFacet(MaxLengthFacet.class); 057 return facet.value(); 058 } 059 060 @Override 061 public int getTypicalLineLength() { 062 final TypicalLengthFacet facet = getFacet(TypicalLengthFacet.class); 063 return facet.value(); 064 } 065 066 protected ObjectAdapter doCoerceProposedValue(ObjectAdapter adapter, Object proposedValue, final Localization localization) { 067 // try to parse 068 if (!(proposedValue instanceof String)) { 069 return null; 070 } 071 final String proposedString = (String) proposedValue; 072 073 final ObjectSpecification parameterSpecification = getSpecification(); 074 final ParseableFacet p = parameterSpecification.getFacet(ParseableFacet.class); 075 try { 076 final ObjectAdapter parsedAdapter = p.parseTextEntry(null, proposedString, localization); 077 return parsedAdapter; 078 } catch(Exception ex) { 079 return null; 080 } 081 } 082 083 084 // ///////////////////////////////////////////////////////////// 085 // getInstance 086 // ///////////////////////////////////////////////////////////// 087 088 @Override 089 public Instance getInstance(final ObjectAdapter adapter) { 090 final OneToOneActionParameter specification = this; 091 return adapter.getInstance(specification); 092 } 093 094 // ////////////////////////////////////////////////////////////////////// 095 // get, set 096 // ////////////////////////////////////////////////////////////////////// 097 098 /** 099 * Gets the proposed value of the {@link Instance} (downcast as a 100 * {@link MutableProposed}, wrapping the proposed value into a 101 * {@link ObjectAdapter}. 102 */ 103 @Override 104 public ObjectAdapter get(final ObjectAdapter owner) { 105 final MutableProposedHolder proposedHolder = getProposedHolder(owner); 106 final Object proposed = proposedHolder.getProposed(); 107 return getAdapterMap().adapterFor(proposed); 108 } 109 110 /** 111 * Sets the proposed value of the {@link Instance} (downcast as a 112 * {@link MutableProposed}, unwrapped the proposed value from a 113 * {@link ObjectAdapter}. 114 */ 115 public void set(final ObjectAdapter owner, final ObjectAdapter newValue) { 116 final MutableProposedHolder proposedHolder = getProposedHolder(owner); 117 final Object newValuePojo = newValue.getObject(); 118 proposedHolder.setProposed(newValuePojo); 119 } 120 121 private MutableProposedHolder getProposedHolder(final ObjectAdapter owner) { 122 final Instance instance = getInstance(owner); 123 if (!(instance instanceof MutableProposedHolder)) { 124 throw new IllegalArgumentException("Instance should implement MutableProposedHolder"); 125 } 126 final MutableProposedHolder proposedHolder = (MutableProposedHolder) instance; 127 return proposedHolder; 128 } 129 130 @Override 131 public FeatureType getFeatureType() { 132 return FeatureType.ACTION_PARAMETER; 133 } 134 135}