/*
* 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.brooklyn.core.catalog.internal;
import java.util.Collection;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.brooklyn.api.catalog.CatalogItem;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.api.mgmt.rebind.RebindSupport;
import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.objs.BrooklynObjectInternal;
import org.apache.brooklyn.core.relations.EmptyRelationSupport;
import com.google.common.base.Preconditions;
public class CatalogItemDo<T,SpecT> implements CatalogItem<T,SpecT>, BrooklynObjectInternal {
protected final CatalogDo catalog;
protected final CatalogItemDtoAbstract<T,SpecT> itemDto;
protected volatile Class<T> javaClass;
public CatalogItemDo(CatalogDo catalog, CatalogItem<T,SpecT> itemDto) {
this.catalog = Preconditions.checkNotNull(catalog, "catalog");
this.itemDto = (CatalogItemDtoAbstract<T, SpecT>) Preconditions.checkNotNull(itemDto, "itemDto");
}
public CatalogItem<T,SpecT> getDto() {
return itemDto;
}
/**
* @throws UnsupportedOperationException; Config not supported for catalog item. See {@link #getPlanYaml()}.
*/
@Override
public ConfigurationSupportInternal config() {
throw new UnsupportedOperationException();
}
/**
* @throws UnsupportedOperationException; subscriptions are not supported for catalog items
*/
@Override
public SubscriptionSupportInternal subscriptions() {
throw new UnsupportedOperationException();
}
/**
* Overrides the parent so that relations are not visible.
* @return an immutable empty relation support object; relations are not supported,
* but we do not throw on access to enable reads in a consistent manner
*/
@Override
public RelationSupportInternal<CatalogItem<T,SpecT>> relations() {
return new EmptyRelationSupport<CatalogItem<T,SpecT>>(this);
}
@Override
public <U> U getConfig(ConfigKey<U> key) {
return config().get(key);
}
@Override
public <U> U setConfig(ConfigKey<U> key, U val) {
return config().set(key, val);
}
@Override
public CatalogItemType getCatalogItemType() {
return itemDto.getCatalogItemType();
}
@Override
public Class<T> getCatalogItemJavaType() {
return itemDto.getCatalogItemJavaType();
}
@Override
public String getId() {
return itemDto.getId();
}
@Override
public String getCatalogItemId() {
return itemDto.getCatalogItemId();
}
@Override
public void setDeprecated(boolean deprecated) {
itemDto.setDeprecated(deprecated);
}
@Override
public boolean isDeprecated() {
return itemDto.isDeprecated();
}
@Override
public void setDisabled(boolean diabled) {
itemDto.setDisabled(diabled);
}
@Override
public boolean isDisabled() {
return itemDto.isDisabled();
}
@Override
public void setCatalogItemId(String id) {
itemDto.setCatalogItemId(id);
}
@Override
public String getJavaType() {
return itemDto.getJavaType();
}
@Deprecated
@Override
public String getName() {
return getDisplayName();
}
@Deprecated
@Override
public String getRegisteredTypeName() {
return getSymbolicName();
}
@Override
public String getDisplayName() {
return itemDto.getDisplayName();
}
@Override
public TagSupport tags() {
return itemDto.tags();
}
@Override
public String getDescription() {
return itemDto.getDescription();
}
@Override
public String getIconUrl() {
return itemDto.getIconUrl();
}
@Override
public String getSymbolicName() {
return itemDto.getSymbolicName();
}
@Override
public String getVersion() {
return itemDto.getVersion();
}
@Nonnull // but it is still null sometimes, see in CatalogDo.loadJavaClass
@Override
public Collection<CatalogBundle> getLibraries() {
return itemDto.getLibraries();
}
/** @deprecated since 0.7.0 this is the legacy mechanism; still needed for policies and apps, but being phased out.
* new items should use {@link #getPlanYaml} and {@link #newClassLoadingContext} */
@Deprecated
public Class<T> getJavaClass() {
if (javaClass==null) loadJavaClass(null);
return javaClass;
}
@SuppressWarnings("unchecked")
@Deprecated
Class<? extends T> loadJavaClass(final ManagementContext mgmt) {
if (javaClass!=null) return javaClass;
javaClass = (Class<T>)CatalogUtils.newClassLoadingContext(mgmt, getId(), getLibraries(), catalog.getRootClassLoader()).loadClass(getJavaType());
return javaClass;
}
@Override
public String toString() {
return getClass().getCanonicalName()+"["+itemDto+"]";
}
@Override
public String toXmlString() {
return itemDto.toXmlString();
}
@Override
public Class<SpecT> getSpecType() {
return itemDto.getSpecType();
}
@Nullable @Override
public String getPlanYaml() {
return itemDto.getPlanYaml();
}
@Override
public RebindSupport<CatalogItemMemento> getRebindSupport() {
return itemDto.getRebindSupport();
}
}