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.parseable;
021
022import com.google.common.base.Strings;
023
024import org.apache.isis.applib.annotation.Parseable;
025import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
026import org.apache.isis.core.commons.authentication.AuthenticationSessionProviderAware;
027import org.apache.isis.core.commons.config.IsisConfiguration;
028import org.apache.isis.core.commons.config.IsisConfigurationAware;
029import org.apache.isis.core.commons.lang.StringExtensions;
030import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
031import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
032import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
033import org.apache.isis.core.metamodel.facetapi.FacetHolder;
034import org.apache.isis.core.metamodel.facetapi.FacetUtil;
035import org.apache.isis.core.metamodel.facetapi.FeatureType;
036import org.apache.isis.core.metamodel.facets.Annotations;
037import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
038import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
039import org.apache.isis.core.metamodel.runtimecontext.RuntimeContextAware;
040import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
041import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
042
043public class ParseableFacetFactory extends FacetFactoryAbstract implements IsisConfigurationAware, AuthenticationSessionProviderAware, AdapterManagerAware, ServicesInjectorAware, RuntimeContextAware {
044
045    private IsisConfiguration configuration;
046
047    private AuthenticationSessionProvider authenticationSessionProvider;
048    private AdapterManager adapterManager;
049    private ServicesInjector servicesInjector;
050
051    private RuntimeContext runtimeContext;
052
053    public ParseableFacetFactory() {
054        super(FeatureType.OBJECTS_ONLY);
055    }
056
057    @Override
058    public void process(final ProcessClassContext processClassContaxt) {
059        FacetUtil.addFacet(create(processClassContaxt.getCls(), processClassContaxt.getFacetHolder()));
060    }
061
062    private ParseableFacetAbstract create(final Class<?> cls, final FacetHolder holder) {
063        final Parseable annotation = Annotations.getAnnotation(cls, Parseable.class);
064
065        // create from annotation, if present
066        if (annotation != null) {
067            final ParseableFacetAnnotation facet = new ParseableFacetAnnotation(cls, getIsisConfiguration(), holder, getDeploymentCategory(), authenticationSessionProvider, adapterManager, servicesInjector);
068            if (facet.isValid()) {
069                return facet;
070            }
071        }
072
073        // otherwise, try to create from configuration, if present
074        final String parserName = ParserUtil.parserNameFromConfiguration(cls, getIsisConfiguration());
075        if (!Strings.isNullOrEmpty(parserName)) {
076            final ParseableFacetFromConfiguration facet = new ParseableFacetFromConfiguration(parserName, holder, getDeploymentCategory(), authenticationSessionProvider, servicesInjector, adapterManager);
077            if (facet.isValid()) {
078                return facet;
079            }
080        }
081
082        return null;
083    }
084
085    // ////////////////////////////////////////////////////////////////////
086    // Dependencies (injected via setters since *Aware)
087    // ////////////////////////////////////////////////////////////////////
088
089    /**
090     * Derived from {@link #setRuntimeContext(RuntimeContext)} (since {@link RuntimeContextAware}).
091     */
092    private DeploymentCategory getDeploymentCategory() {
093        return runtimeContext.getDeploymentCategory();
094    }
095
096    public IsisConfiguration getIsisConfiguration() {
097        return configuration;
098    }
099
100    /**
101     * Injected since {@link IsisConfigurationAware}.
102     */
103    @Override
104    public void setConfiguration(final IsisConfiguration configuration) {
105        this.configuration = configuration;
106    }
107
108    @Override
109    public void setAuthenticationSessionProvider(final AuthenticationSessionProvider authenticationSessionProvider) {
110        this.authenticationSessionProvider = authenticationSessionProvider;
111    }
112
113    @Override
114    public void setAdapterManager(final AdapterManager adapterManager) {
115        this.adapterManager = adapterManager;
116    }
117
118    @Override
119    public void setServicesInjector(final ServicesInjector dependencyInjector) {
120        this.servicesInjector = dependencyInjector;
121    }
122
123    @Override
124    public void setRuntimeContext(RuntimeContext runtimeContext) {
125        this.runtimeContext = runtimeContext;
126    }
127
128}