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    
020    package org.apache.isis.core.progmodel.facets.object.encodeable;
021    
022    import org.apache.isis.applib.adapters.EncoderDecoder;
023    import org.apache.isis.core.commons.ensure.Assert;
024    import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
025    import org.apache.isis.core.metamodel.adapter.map.AdapterMap;
026    import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
027    import org.apache.isis.core.metamodel.facetapi.FacetHolder;
028    import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
029    import org.apache.isis.core.metamodel.runtimecontext.DependencyInjector;
030    
031    public class EncodableFacetUsingEncoderDecoder extends FacetAbstract implements EncodableFacet {
032    
033        private final EncoderDecoder encoderDecoder;
034        private final DependencyInjector dependencyInjector;
035        private final AdapterMap adapterManager;
036    
037        public EncodableFacetUsingEncoderDecoder(final EncoderDecoder encoderDecoder, final FacetHolder holder,
038            final AdapterMap adapterManager, final DependencyInjector dependencyInjector) {
039            super(EncodableFacet.class, holder, false);
040            this.encoderDecoder = encoderDecoder;
041            this.dependencyInjector = dependencyInjector;
042            this.adapterManager = adapterManager;
043        }
044    
045        // TODO: is this safe? really?
046        public static String ENCODED_NULL = "NULL";
047    
048        @Override
049        protected String toStringValues() {
050            getDependencyInjector().injectDependenciesInto(encoderDecoder);
051            return encoderDecoder.toString();
052        }
053    
054        @Override
055        public ObjectAdapter fromEncodedString(final String encodedData) {
056            Assert.assertNotNull(encodedData);
057            if (ENCODED_NULL.equals(encodedData)) {
058                return null;
059            } else {
060                getDependencyInjector().injectDependenciesInto(encoderDecoder);
061                final Object decodedObject = encoderDecoder.fromEncodedString(encodedData);
062                return getAdapterManager().adapterFor(decodedObject);
063            }
064    
065        }
066    
067        @Override
068        public String toEncodedString(final ObjectAdapter object) {
069            getDependencyInjector().injectDependenciesInto(encoderDecoder);
070            return object == null ? ENCODED_NULL : encoderDecoder.toEncodedString(object.getObject());
071        }
072    
073        // //////////////////////////////////////////////////////
074        // Dependencies (from constructor)
075        // //////////////////////////////////////////////////////
076    
077        public DependencyInjector getDependencyInjector() {
078            return dependencyInjector;
079        }
080    
081        public AdapterMap getAdapterManager() {
082            return adapterManager;
083        }
084    
085    }