/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.isis.core.metamodel.services.appfeat;
import org.apache.isis.core.commons.lang.StringExtensions;
public enum ApplicationFeatureType {
PACKAGE {
@Override
void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
feature.setPackageName(fullyQualifiedName);
feature.setClassName(null);
feature.setMemberName(null);
feature.type = this;
}
},
CLASS {
@Override
void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
final int i = fullyQualifiedName.lastIndexOf(".");
if(i != -1) {
feature.setPackageName(fullyQualifiedName.substring(0, i));
feature.setClassName(fullyQualifiedName.substring(i+1));
} else {
feature.setPackageName("");
feature.setClassName(fullyQualifiedName);
}
feature.setMemberName(null);
feature.type = this;
}
},
MEMBER {
@Override
void init(final ApplicationFeatureId feature, final String fullyQualifiedName) {
final int i = fullyQualifiedName.lastIndexOf("#");
if(i == -1) {
throw new IllegalArgumentException("Malformed, expected a '#': " + fullyQualifiedName);
}
final String className = fullyQualifiedName.substring(0, i);
final String memberName = fullyQualifiedName.substring(i+1);
CLASS.init(feature, className);
feature.setMemberName(memberName);
feature.type = this;
}
};
public boolean hideClassName() {
return this == ApplicationFeatureType.PACKAGE;
}
public boolean hideMember() {
return this == ApplicationFeatureType.PACKAGE || this == ApplicationFeatureType.CLASS;
}
abstract void init(ApplicationFeatureId applicationFeatureId, String fullyQualifiedName);
static void ensurePackage(final ApplicationFeatureId feature) {
if(feature.type != ApplicationFeatureType.PACKAGE) {
throw new IllegalStateException("Can only be called for a package; " + feature.toString());
}
}
static void ensurePackageOrClass(final ApplicationFeatureId applicationFeatureId) {
if(applicationFeatureId.type != ApplicationFeatureType.PACKAGE && applicationFeatureId.type != ApplicationFeatureType.CLASS) {
throw new IllegalStateException("Can only be called for a package or a class; " + applicationFeatureId.toString());
}
}
static void ensureClass(final ApplicationFeatureId feature) {
if(feature.type != ApplicationFeatureType.CLASS) {
throw new IllegalStateException("Can only be called for a class; " + feature.toString());
}
}
static void ensureMember(final ApplicationFeatureId feature) {
if(feature.type != ApplicationFeatureType.MEMBER) {
throw new IllegalStateException("Can only be called for a member; " + feature.toString());
}
}
@Override
public String toString() {
return StringExtensions.capitalize(name());
}
}