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