/*
* 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.api.catalog;
import java.util.Collection;
import java.util.NoSuchElementException;
import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Predicate;
public interface BrooklynCatalog {
/**
* Version set in catalog when creator does not supply a version, to mean a low priority item;
* and used when requesting to indicate the best version.
* (See {@link #getCatalogItem(String, String)} for discussion of the best version.)
*/
static String DEFAULT_VERSION = "0.0.0_DEFAULT_VERSION";
/** @return The item matching the given given
* {@link CatalogItem#getSymbolicName() symbolicName}
* and optionally {@link CatalogItem#getVersion()},
* taking the best version if the version is {@link #DEFAULT_VERSION} or null,
* returning null if no matches are found. */
CatalogItem<?,?> getCatalogItem(String symbolicName, String version);
/** @return Deletes the item with the given {@link CatalogItem#getSymbolicName()
* symbolicName} and version
* @throws NoSuchElementException if not found */
void deleteCatalogItem(String symbolicName, String version);
/** variant of {@link #getCatalogItem(String, String)} which checks (and casts) type for convenience
* (returns null if type does not match) */
<T,SpecT> CatalogItem<T,SpecT> getCatalogItem(Class<T> type, String symbolicName, String version);
/** @return All items in the catalog */
<T,SpecT> Iterable<CatalogItem<T,SpecT>> getCatalogItems();
/** convenience for filtering items in the catalog; see CatalogPredicates for useful filters */
<T,SpecT> Iterable<CatalogItem<T,SpecT>> getCatalogItems(Predicate<? super CatalogItem<T,SpecT>> filter);
/** persists the catalog item to the object store, if persistence is enabled */
public void persist(CatalogItem<?, ?> catalogItem);
/** @return The classloader which should be used to load classes and entities;
* this includes all the catalog's classloaders in the right order.
* This is a wrapper which will update as the underlying catalog items change,
* so it is safe for callers to keep a handle on this. */
public ClassLoader getRootClassLoader();
/** creates a spec for the given catalog item, throwing exceptions if any problems */
// TODO this should be cached on the item and renamed getSpec(...), else we re-create it too often (every time catalog is listed)
<T, SpecT extends AbstractBrooklynObjectSpec<? extends T, SpecT>> SpecT createSpec(CatalogItem<T, SpecT> item);
/**
* Adds an item (represented in yaml) to the catalog.
* Fails if the same version exists in catalog.
*
* @throws IllegalArgumentException if the yaml was invalid
* @deprecated since 0.7.0 use {@link #addItems(String, boolean)}
*/
@Deprecated
CatalogItem<?,?> addItem(String yaml);
/**
* Adds an item (represented in yaml) to the catalog.
*
* @param forceUpdate If true allows catalog update even when an
* item exists with the same symbolicName and version
*
* @throws IllegalArgumentException if the yaml was invalid
* @deprecated since 0.7.0 use {@link #addItems(String, boolean)}
*/
@Deprecated
CatalogItem<?,?> addItem(String yaml, boolean forceUpdate);
/**
* Adds items (represented in yaml) to the catalog.
* Fails if the same version exists in catalog.
*
* @throws IllegalArgumentException if the yaml was invalid
*/
Iterable<? extends CatalogItem<?,?>> addItems(String yaml);
/**
* Adds items (represented in yaml) to the catalog.
*
* @param forceUpdate If true allows catalog update even when an
* item exists with the same symbolicName and version
*
* @throws IllegalArgumentException if the yaml was invalid
*/
Iterable<? extends CatalogItem<?,?>> addItems(String yaml, boolean forceUpdate);
/**
* adds an item to the 'manual' catalog;
* this does not update the classpath or have a record to the java Class
*
* @deprecated since 0.7.0 Construct catalogs with yaml (referencing OSGi bundles) instead
*/
// TODO maybe this should stay on the API? -AH Apr 2015
@Deprecated
void addItem(CatalogItem<?,?> item);
/**
* Creates a catalog item and adds it to the 'manual' catalog,
* with the corresponding Class definition (loaded by a classloader)
* registered and available in the classloader.
* <p>
* Note that the class will be available for this session only,
* although the record of the item will appear in the catalog DTO if exported,
* so it is recommended to edit the 'manual' catalog DTO if using it to
* generate a catalog, either adding the appropriate classpath URL or removing this entry.
*
* @deprecated since 0.7.0 Construct catalogs with OSGi bundles instead.
* This is used in a handful of tests which should be rewritten to refer to OSGi bundles.
*/
@Deprecated
@VisibleForTesting
CatalogItem<?,?> addItem(Class<?> clazz);
void reset(Collection<CatalogItem<?, ?>> entries);
}