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 org.apache.isis.applib.adapters.Parser; 023import org.apache.isis.applib.profiles.Localization; 024import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider; 025import org.apache.isis.core.commons.lang.ClassExtensions; 026import org.apache.isis.core.metamodel.adapter.ObjectAdapter; 027import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager; 028import org.apache.isis.core.metamodel.deployment.DeploymentCategory; 029import org.apache.isis.core.metamodel.facetapi.FacetAbstract; 030import org.apache.isis.core.metamodel.facetapi.FacetHolder; 031import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet; 032import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector; 033 034public abstract class ParseableFacetAbstract extends FacetAbstract implements ParseableFacet { 035 036 private final Class<?> parserClass; 037 038 // to delegate to 039 private final ParseableFacetUsingParser parseableFacetUsingParser; 040 041 public ParseableFacetAbstract(final String candidateParserName, final Class<?> candidateParserClass, final FacetHolder holder, DeploymentCategory deploymentCategory, final AuthenticationSessionProvider authenticationSessionProvider, final ServicesInjector dependencyInjector, final AdapterManager adapterManager) { 042 super(ParseableFacet.class, holder, Derivation.NOT_DERIVED); 043 044 this.parserClass = ParserUtil.parserOrNull(candidateParserClass, candidateParserName); 045 this.parseableFacetUsingParser = isValid()? 046 createParser(holder, deploymentCategory, authenticationSessionProvider, dependencyInjector, adapterManager):null; 047 } 048 049 private ParseableFacetUsingParser createParser(final FacetHolder holder, DeploymentCategory deploymentCategory, final AuthenticationSessionProvider authenticationSessionProvider, final ServicesInjector dependencyInjector, final AdapterManager adapterManager) { 050 final Parser<?> parser = (Parser<?>) ClassExtensions.newInstance(parserClass, FacetHolder.class, holder); 051 return new ParseableFacetUsingParser(parser, holder, deploymentCategory, authenticationSessionProvider, dependencyInjector, adapterManager); 052 } 053 054 /** 055 * Discover whether either of the candidate parser name or class is valid. 056 */ 057 public boolean isValid() { 058 return parserClass != null; 059 } 060 061 /** 062 * Guaranteed to implement the {@link Parser} class, thanks to generics in 063 * the applib. 064 */ 065 public Class<?> getParserClass() { 066 return parserClass; 067 } 068 069 @Override 070 protected String toStringValues() { 071 return parserClass.getName(); 072 } 073 074 @Override 075 public ObjectAdapter parseTextEntry(final ObjectAdapter original, final String entryText, final Localization localization) { 076 return parseableFacetUsingParser.parseTextEntry(original, entryText, localization); 077 } 078 079 @Override 080 public String parseableTitle(final ObjectAdapter existing) { 081 return parseableFacetUsingParser.parseableTitle(existing); 082 } 083}