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}