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.ignore.javalang; 021 022import java.lang.reflect.Method; 023 024import org.apache.isis.core.commons.lang.ClassExtensions; 025import org.apache.isis.core.metamodel.facetapi.Facet; 026import org.apache.isis.core.metamodel.facetapi.FeatureType; 027import org.apache.isis.core.metamodel.facetapi.MethodRemover; 028import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; 029 030/** 031 * Removes all superclass methods of the class, but doesn't add any 032 * {@link Facet}s. 033 */ 034public class RemoveSuperclassMethodsFacetFactory extends FacetFactoryAbstract { 035 036 @SuppressWarnings("unused") 037 private static final String JAVA_CLASS_PREFIX = "java."; 038 039 public RemoveSuperclassMethodsFacetFactory() { 040 super(FeatureType.OBJECTS_ONLY); 041 } 042 043 @Override 044 public void process(final ProcessClassContext processClassContext) { 045 removeSuperclassMethods(processClassContext.getCls(), processClassContext); 046 } 047 048 private void removeSuperclassMethods(final Class<?> type, final MethodRemover methodRemover) { 049 if (type == null) { 050 return; 051 } 052 053 if (!ClassExtensions.isJavaClass(type)) { 054 removeSuperclassMethods(type.getSuperclass(), methodRemover); 055 return; 056 } 057 058 final Method[] methods = type.getMethods(); 059 for (final Method method : methods) { 060 methodRemover.removeMethod(method); 061 } 062 063 } 064 065}