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.facets;
021
022 import java.util.ArrayList;
023 import java.util.List;
024
025 import org.apache.isis.core.commons.exceptions.IsisException;
026 import org.apache.isis.core.commons.factory.InstanceUtil;
027 import org.apache.isis.core.metamodel.facetapi.Facet;
028 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
029 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
030 import org.apache.isis.core.metamodel.facets.FacetFactory;
031 import org.apache.isis.core.metamodel.facets.facets.FacetsFacet;
032
033 public abstract class FacetsFacetAbstract extends FacetAbstract implements FacetsFacet {
034
035 public static Class<? extends Facet> type() {
036 return FacetsFacet.class;
037 }
038
039 private final Class<? extends FacetFactory>[] facetFactories;
040
041 public FacetsFacetAbstract(final String[] names, final Class<?>[] classes, final FacetHolder holder) {
042 super(type(), holder, false);
043 final List<Class<? extends FacetFactory>> facetFactories = new ArrayList<Class<? extends FacetFactory>>();
044 for (final String name : names) {
045 final Class<? extends FacetFactory> facetFactory = facetFactoryOrNull(name);
046 if (facetFactory != null) {
047 facetFactories.add(facetFactory);
048 }
049 }
050 for (final Class<?> classe : classes) {
051 final Class<? extends FacetFactory> facetFactory = facetFactoryOrNull(classe);
052 if (facetFactory != null) {
053 facetFactories.add(facetFactory);
054 }
055 }
056 this.facetFactories = asArray(facetFactories);
057 }
058
059 @SuppressWarnings("unchecked")
060 private Class<? extends FacetFactory>[] asArray(final List<Class<? extends FacetFactory>> facetFactories) {
061 return facetFactories.toArray(new Class[] {});
062 }
063
064 @Override
065 public Class<? extends FacetFactory>[] facetFactories() {
066 return facetFactories;
067 }
068
069 private Class<? extends FacetFactory> facetFactoryOrNull(final String classCandidateName) {
070 if (classCandidateName == null) {
071 return null;
072 }
073 Class<?> classCandidate = null;
074 try {
075 classCandidate = InstanceUtil.loadClass(classCandidateName);
076 return facetFactoryOrNull(classCandidate);
077 } catch (final IsisException ex) {
078 return null;
079 }
080 }
081
082 @SuppressWarnings("unchecked")
083 private Class<? extends FacetFactory> facetFactoryOrNull(final Class classCandidate) {
084 if (classCandidate == null) {
085 return null;
086 }
087 return FacetFactory.class.isAssignableFrom(classCandidate) ? classCandidate : null;
088 }
089
090 }