/*
* 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.testspec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists;
import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.filter.Filter;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.config.IsisConfigurationDefault;
import org.apache.isis.core.commons.exceptions.IsisException;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.consent.Consent;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.consent.InteractionResult;
import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
import org.apache.isis.core.metamodel.facetapi.FeatureType;
import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
import org.apache.isis.core.metamodel.spec.ActionType;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.Persistability;
import org.apache.isis.core.metamodel.spec.feature.Contributed;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSpecification {
private ObjectAction action;
public List<ObjectAssociation> fields = Lists.newArrayList();
private final String name;
private List<ObjectSpecification> subclasses = Collections.emptyList();
private String title;
/**
* lazily derived, see {@link #getSpecId()}
*/
private ObjectSpecId specId;
private Persistability persistable;
private ServicesInjector servicesInjector;
public ObjectSpecificationStub(final Class<?> type) {
this(type.getName());
IsisConfigurationDefault stubConfiguration = new IsisConfigurationDefault(null);
this.servicesInjector = new ServicesInjector(Collections.emptyList(), stubConfiguration);
servicesInjector.addFallbackIfRequired(ConfigurationServiceInternal.class, stubConfiguration);
}
@Override
public Class<?> getCorrespondingClass() {
try {
return Class.forName(name);
} catch (final ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public ObjectSpecificationStub(final String name) {
this.name = name;
title = "";
persistable = Persistability.USER_PERSISTABLE;
}
@Override
public FeatureType getFeatureType() {
return FeatureType.OBJECT;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public boolean isAbstract() {
return false;
}
@Override
public boolean isService() {
return false;
}
@Override
public ObjectAssociation getAssociation(final String name) {
for (int i = 0; i < fields.size(); i++) {
if (fields.get(i).getId().equals(name)) {
return fields.get(i);
}
}
throw new IsisException("Field not found: " + name);
}
@Override
public List<ObjectAssociation> getAssociations(final Contributed contributed) {
return fields;
}
@Deprecated
@Override
public List<ObjectAssociation> getAssociations(final Filter<ObjectAssociation> filter) {
return getAssociations(Contributed.INCLUDED, filter);
}
@Override
@SuppressWarnings("unchecked")
public List<OneToOneAssociation> getProperties(final Contributed contributed) {
@SuppressWarnings("rawtypes")
final List list = getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.PROPERTIES);
return new ArrayList<OneToOneAssociation>(list);
}
@Override
@SuppressWarnings("unchecked")
public List<OneToManyAssociation> getCollections(final Contributed contributed) {
@SuppressWarnings("rawtypes")
final List list = getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.COLLECTIONS);
return new ArrayList<>(list);
}
@Override
public List<ObjectAssociation> getAssociations(final Contributed contributed, final Filter<ObjectAssociation> filter) {
final List<ObjectAssociation> allFields = getAssociations(Contributed.EXCLUDED);
final List<ObjectAssociation> selectedFields = Lists.newArrayList();
for (int i = 0; i < allFields.size(); i++) {
if (filter.accept(allFields.get(i))) {
selectedFields.add(allFields.get(i));
}
}
return selectedFields;
}
@Override
public String getFullIdentifier() {
return name;
}
@Override
public ObjectSpecId getSpecId() {
if(specId == null) {
specId = getFacet(ObjectSpecIdFacet.class).value();
}
return specId;
}
@Override
public String getIconName(final ObjectAdapter reference) {
return null;
}
@Override
public String getCssClass() {
return null;
}
@Override
public String getCssClass(final ObjectAdapter reference) {
return null;
}
@Override
public ObjectAction getObjectAction(final ActionType type, final String name, final List<ObjectSpecification> parameters) {
if (action != null && action.getId().equals(name)) {
return action;
}
return null;
}
@Override
public ObjectAction getObjectAction(final ActionType type, final String id) {
final int openBracket = id.indexOf('(');
return getObjectAction(type, id.substring(0, openBracket), null);
}
@Override
public ObjectAction getObjectAction(final String nameParmsIdentityString) {
for (final ActionType type : ActionType.values()) {
final ObjectAction action = getObjectAction(type, nameParmsIdentityString);
if (action != null) {
return action;
}
}
return null;
}
@Override
public String getPluralName() {
return null;
}
@Override
public String getShortIdentifier() {
return name.substring(name.lastIndexOf('.') + 1);
}
@Override
public String getSingularName() {
return name + " (singular)";
}
@Override
public String getDescription() {
return getSingularName();
}
@Override
public String getHelp() {
return null;
}
@Override
public String getTitle(final ObjectAdapter targetAdapter) {
return getTitle(null, targetAdapter);
}
@Override
public String getTitle(
final ObjectAdapter contextAdapterIfAny,
final ObjectAdapter targetAdapter) {
return title;
}
@Override
public boolean hasSubclasses() {
return false;
}
@Override
public List<ObjectSpecification> interfaces() {
return Collections.emptyList();
}
@Override
public boolean isOfType(final ObjectSpecification cls) {
return cls == this;
}
@Override
public boolean isEncodeable() {
return false;
}
@Override
public boolean isParseable() {
return false;
}
@Override
public boolean isValueOrIsParented() {
return false;
}
@Override
public boolean isValue() {
return false;
}
@Override
public boolean isParented() {
return false;
}
@Override
public Persistability persistability() {
return persistable;
}
@Override
public List<ObjectSpecification> subclasses() {
return subclasses;
}
@Override
public ObjectSpecification superclass() {
return null;
}
@Override
public Consent isValid(final ObjectAdapter targetAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
return null;
}
@Override
public Object getDefaultValue() {
return null;
}
@Override
public Identifier getIdentifier() {
return Identifier.classIdentifier(name);
}
// TODO: not used
public void setupPersistable(final Persistability persistable) {
this.persistable = persistable;
}
@Override
public boolean isParentedOrFreeCollection() {
return false;
}
@Override
public boolean isHidden() {
return false;
}
@Override
public boolean isNotCollection() {
return !isParentedOrFreeCollection();
}
@Override
public boolean isImmutable() {
return containsFacet(ImmutableFacet.class);
}
@Override
public ObjectValidityContext createValidityInteractionContext(
final ObjectAdapter targetAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
return null;
}
@Override
public ObjectTitleContext createTitleInteractionContext(final AuthenticationSession session, final InteractionInitiatedBy invocationMethod, final ObjectAdapter targetObjectAdapter) {
return null;
}
@Override
public InteractionResult isValidResult(
final ObjectAdapter targetAdapter,
final InteractionInitiatedBy interactionInitiatedBy) {
return null;
}
// /////////////////////////////////////////////////////////////
// introspection
// /////////////////////////////////////////////////////////////
@Override
public List<ObjectAction> getObjectActions(final Contributed contributed) {
return null;
}
@Override
public List<ObjectAction> getObjectActions(final ActionType type, final Contributed contributed, final Filter<ObjectAction> filter) {
return null;
}
@Override
public List<ObjectAction> getObjectActions(final List<ActionType> types, final Contributed contributed, final Filter<ObjectAction> filter) {
return null;
}
// /////////////////////////////////////////////////////////
// view models and wizards
// /////////////////////////////////////////////////////////
@Override
public boolean isViewModel() {
return false;
}
@Override
public boolean isViewModelCloneable(final ObjectAdapter targetAdapter) {
return false;
}
@Override
public boolean isWizard() {
return false;
}
@Override
public boolean isMixin() {
return false;
}
@Override
public boolean isPersistenceCapable() {
return false;
}
@Override
public boolean isPersistenceCapableOrViewModel() {
return false;
}
@Override
public String toString() {
return getFullIdentifier();
}
}