http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java deleted file mode 100644 index f30803e..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDo.java +++ /dev/null @@ -1,364 +0,0 @@ -/* - * 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.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.core.catalog.internal.CatalogClasspathDo.CatalogScanningModes; -import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.javalang.AggregateClassLoader; -import org.apache.brooklyn.util.net.Urls; -import org.apache.brooklyn.util.time.CountdownTimer; -import org.apache.brooklyn.util.time.Duration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Objects; -import com.google.common.base.Preconditions; - -public class CatalogDo { - - private static final Logger log = LoggerFactory.getLogger(CatalogDo.class); - - volatile boolean isLoaded = false; - final CatalogDto dto; - ManagementContext mgmt = null; - CatalogDo parent = null; - - List<CatalogDo> childrenCatalogs = new ArrayList<CatalogDo>(); - CatalogClasspathDo classpath; - private Map<String, CatalogItemDo<?,?>> cacheById; - - AggregateClassLoader childrenClassLoader = AggregateClassLoader.newInstanceWithNoLoaders(); - ClassLoader recursiveClassLoader; - - protected CatalogDo(CatalogDto dto) { - this.dto = Preconditions.checkNotNull(dto); - } - - public CatalogDo(ManagementContext mgmt, CatalogDto dto) { - this(dto); - this.mgmt = mgmt; - } - - boolean isLoaded() { - return isLoaded; - } - - /** Calls {@link #load(CatalogDo)} with a null parent. */ - public CatalogDo load() { - return load(null); - } - - /** Calls {@link #load(ManagementContext, CatalogDo)} with the catalog's existing management context. */ - public CatalogDo load(CatalogDo parent) { - return load(mgmt, parent); - } - - /** Calls {@link #load(ManagementContext, CatalogDo, boolean)} failing on load errors. */ - public synchronized CatalogDo load(ManagementContext mgmt, CatalogDo parent) { - return load(mgmt, parent, true); - } - - /** causes all URL-based catalogs to have their manifests loaded, - * and all scanning-based classpaths to scan the classpaths - * (but does not load all JARs) - */ - public synchronized CatalogDo load(ManagementContext mgmt, CatalogDo parent, boolean failOnLoadError) { - if (isLoaded()) { - if (mgmt!=null && !Objects.equal(mgmt, this.mgmt)) { - throw new IllegalStateException("Cannot set mgmt "+mgmt+" on "+this+" after catalog is loaded"); - } - log.debug("Catalog "+this+" is already loaded"); - return this; - } - loadThisCatalog(mgmt, parent, failOnLoadError); - loadChildrenCatalogs(failOnLoadError); - buildCaches(); - return this; - } - - protected synchronized void loadThisCatalog(ManagementContext mgmt, CatalogDo parent, boolean failOnLoadError) { - if (isLoaded()) return; - CatalogUtils.logDebugOrTraceIfRebinding(log, "Loading catalog {} into {}", this, parent); - if (this.parent!=null && !this.parent.equals(parent)) - log.warn("Catalog "+this+" being initialised with different parent "+parent+" when already parented by "+this.parent, new Throwable("source of reparented "+this)); - if (this.mgmt!=null && !this.mgmt.equals(mgmt)) - log.warn("Catalog "+this+" being initialised with different mgmt "+mgmt+" when already managed by "+this.mgmt, new Throwable("source of reparented "+this)); - this.parent = parent; - this.mgmt = mgmt; - dto.populate(); - loadCatalogClasspath(); - loadCatalogItems(failOnLoadError); - isLoaded = true; - synchronized (this) { - notifyAll(); - } - } - - private void loadCatalogClasspath() { - try { - classpath = new CatalogClasspathDo(this); - classpath.load(); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - log.error("Unable to load catalog "+this+" (ignoring): "+e); - log.info("Trace for failure to load "+this+": "+e, e); - } - } - - private void loadCatalogItems(boolean failOnLoadError) { - Iterable<CatalogItemDtoAbstract<?, ?>> entries = dto.getUniqueEntries(); - if (entries!=null) { - for (CatalogItemDtoAbstract<?,?> entry : entries) { - try { - CatalogUtils.installLibraries(mgmt, entry.getLibraries()); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - if (failOnLoadError) { - Exceptions.propagate(e); - } else { - log.error("Loading bundles for catalog item " + entry + " failed: " + e.getMessage(), e); - } - } - } - } - } - - public boolean blockIfNotLoaded(Duration timeout) throws InterruptedException { - if (isLoaded()) return true; - synchronized (this) { - if (isLoaded()) return true; - CountdownTimer timer = CountdownTimer.newInstanceStarted(timeout); - while (!isLoaded()) - if (!timer.waitOnForExpiry(this)) - return false; - return true; - } - } - - protected void loadChildrenCatalogs(boolean failOnLoadError) { - if (dto.catalogs!=null) { - for (CatalogDto child: dto.catalogs) { - loadCatalog(child, failOnLoadError); - } - } - } - - CatalogDo loadCatalog(CatalogDto child, boolean failOnLoadError) { - CatalogDo childL = new CatalogDo(child); - childrenCatalogs.add(childL); - childL.load(mgmt, this, failOnLoadError); - childrenClassLoader.addFirst(childL.getRecursiveClassLoader()); - clearCache(false); - return childL; - } - - protected Map<String, CatalogItemDo<?,?>> getIdCache() { - Map<String, CatalogItemDo<?,?>> cache = this.cacheById; - if (cache==null) cache = buildCaches(); - return cache; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected synchronized Map<String, CatalogItemDo<?,?>> buildCaches() { - if (cacheById != null) return cacheById; - CatalogUtils.logDebugOrTraceIfRebinding(log, "Building cache for {}", this); - if (!isLoaded()) - log.debug("Catalog not fully loaded when loading cache of "+this); - - Map<String, CatalogItemDo<?,?>> cache = new LinkedHashMap<String, CatalogItemDo<?,?>>(); - - // build the cache; first from children catalogs, then from local entities - // so that root and near-root takes precedence over deeper items; - // and go through in reverse order so that things at the top of the file take precedence - // (both in the cache and in the aggregate class loader); - // however anything added _subsequently_ will take precedence (again in both) - if (dto.catalogs!=null) { - List<CatalogDo> catalogsReversed = new ArrayList<CatalogDo>(childrenCatalogs); - Collections.reverse(catalogsReversed); - for (CatalogDo child: catalogsReversed) { - cache.putAll(child.getIdCache()); - } - } - if (dto.getUniqueEntries()!=null) { - List<CatalogItemDtoAbstract<?,?>> entriesReversed = MutableList.copyOf(dto.getUniqueEntries()); - Collections.reverse(entriesReversed); - for (CatalogItemDtoAbstract<?,?> entry: entriesReversed) - cache.put(entry.getId(), new CatalogItemDo(this, entry)); - } - this.cacheById = cache; - return cache; - } - - protected synchronized void clearCache(boolean deep) { - this.cacheById = null; - if (deep) { - for (CatalogDo child : childrenCatalogs) { - child.clearCache(true); - } - } - clearParentCache(); - } - protected void clearParentCache() { - if (this.parent!=null) - this.parent.clearCache(false); - } - - /** - * Adds the given entry to the catalog, with no enrichment. - * Callers may prefer {@link CatalogClasspathDo#addCatalogEntry(CatalogItemDtoAbstract, Class)} - */ - public synchronized void addEntry(CatalogItemDtoAbstract<?,?> entry) { - dto.addEntry(entry); - - // could do clearCache(false); but this is slightly more efficient... - if (cacheById != null) { - @SuppressWarnings({ "unchecked", "rawtypes" }) - CatalogItemDo<?, ?> cdo = new CatalogItemDo(this, entry); - cacheById.put(entry.getId(), cdo); - } - clearParentCache(); - - if (mgmt != null) { - mgmt.getRebindManager().getChangeListener().onManaged(entry); - } - } - - /** - * Removes the given entry from the catalog. - */ - public synchronized void deleteEntry(CatalogItemDtoAbstract<?, ?> entry) { - dto.removeEntry(entry); - - // could do clearCache(false); but this is slightly more efficient... - if (cacheById != null) { - cacheById.remove(entry.getId()); - } - clearParentCache(); - - if (mgmt != null) { - // TODO: Can the entry be in more than one catalogue? The management context has no notion of - // catalogue hierarchy so this will effectively remove it from all catalogues. - // (YES- we're assuming ID's are unique across all catalogues; if not, things get out of sync; - // however see note at top of BasicBrooklynCatalog -- - // manualCatalog and OSGi is used for everything now except legacy XML trees) - mgmt.getRebindManager().getChangeListener().onUnmanaged(entry); - } - } - - /** returns loaded catalog, if this has been loaded */ - CatalogDo addCatalog(CatalogDto child) { - if (dto.catalogs == null) - dto.catalogs = new ArrayList<CatalogDto>(); - dto.catalogs.add(child); - if (!isLoaded()) - return null; - return loadCatalog(child, true); - } - - /** adds the given urls; filters out any nulls supplied */ - public synchronized void addToClasspath(String ...urls) { - if (dto.classpath == null) - dto.classpath = new CatalogClasspathDto(); - for (String url: urls) { - if (url!=null) - dto.classpath.addEntry(url); - } - if (isLoaded()) - throw new IllegalStateException("dynamic classpath entry value update not supported"); - // easy enough to add, just support unload+reload (and can also allow dynamic setScan below) - // but more predictable if we don't; the one exception is in the manualAdditionsCatalog - // where BasicBrooklynCatalog reaches in and updates the DTO and/or CompositeClassLoader directly, if necessary -// for (String url: urls) -// loadedClasspath.addEntry(url); - } - - public synchronized void setClasspathScanForEntities(CatalogScanningModes value) { - if (dto.classpath == null) - dto.classpath = new CatalogClasspathDto(); - dto.classpath.scan = value; - if (isLoaded()) - throw new IllegalStateException("dynamic classpath scan value update not supported"); - // easy enough to add, see above - } - - @Override - public String toString() { - String size = cacheById == null ? "not yet loaded" : "size " + cacheById.size(); - return "Loaded:" + dto + "(" + size + ")"; - } - - /** is "local" if it and all ancestors are not based on any remote urls */ - public boolean isLocal() { - if (dto.url != null) { - String proto = Urls.getProtocol(dto.url); - if (proto != null) { - // 'file' is the only protocol accepted as "local" - if (!"file".equals(proto)) return false; - } - } - return parent == null || parent.isLocal(); - } - - /** classloader for only the entries in this catalog's classpath */ - public ClassLoader getLocalClassLoader() { - if (classpath != null) return classpath.getLocalClassLoader(); - return null; - } - - /** recursive classloader is the local classloader plus all children catalog's classloader */ - public ClassLoader getRecursiveClassLoader() { - if (recursiveClassLoader == null) loadRecursiveClassLoader(); - return recursiveClassLoader; - } - - protected synchronized void loadRecursiveClassLoader() { - if (recursiveClassLoader!=null) return; - AggregateClassLoader cl = AggregateClassLoader.newInstanceWithNoLoaders(); - cl.addFirst(childrenClassLoader); - ClassLoader local = getLocalClassLoader(); - if (local != null) cl.addFirst(local); - if (parent == null) { - // we are root. include the mgmt base classloader and/or standard class loaders - ClassLoader base = mgmt != null ? ((ManagementContextInternal)mgmt).getBaseClassLoader() : null; - if (base != null) cl.addFirst(base); - else { - cl.addFirst(getClass().getClassLoader()); - cl.addFirst(Object.class.getClassLoader()); - } - } - recursiveClassLoader = cl; - } - - /** the root classloader is the recursive CL from the outermost catalog - * (which includes the base classloader from the mgmt context, if set) */ - public ClassLoader getRootClassLoader() { - if (parent != null) return parent.getRootClassLoader(); - return getRecursiveClassLoader(); - } - -}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDto.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDto.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDto.java deleted file mode 100644 index 1bd2236..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDto.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * 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.io.InputStream; -import java.io.StringReader; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.brooklyn.api.catalog.CatalogItem; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.exceptions.PropagatedRuntimeException; -import org.apache.brooklyn.util.stream.Streams; - -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.Lists; - -@Beta -public class CatalogDto { - - private static final Logger LOG = LoggerFactory.getLogger(CatalogDto.class); - - String id; - String url; - String contents; - String contentsDescription; - String name; - String description; - CatalogClasspathDto classpath; - private List<CatalogItemDtoAbstract<?,?>> entries = null; - - // for thread-safety, any dynamic additions to this should be handled by a method - // in this class which does copy-on-write - List<CatalogDto> catalogs = null; - - public static CatalogDto newDefaultLocalScanningDto(CatalogClasspathDo.CatalogScanningModes scanMode) { - CatalogDo result = new CatalogDo( - newNamedInstance("Local Scanned Catalog", "All annotated Brooklyn entities detected in the default classpath", "scanning-local-classpath") ); - result.setClasspathScanForEntities(scanMode); - return result.dto; - } - - /** @deprecated since 0.7.0 use {@link #newDtoFromXmlUrl(String)} if you must, but note the xml format itself is deprecated */ - @Deprecated - public static CatalogDto newDtoFromUrl(String url) { - return newDtoFromXmlUrl(url); - } - - /** @deprecated since 0.7.0 the xml format is deprecated; use YAML parse routines on BasicBrooklynCatalog */ - @Deprecated - public static CatalogDto newDtoFromXmlUrl(String url) { - if (LOG.isDebugEnabled()) LOG.debug("Retrieving catalog from: {}", url); - try { - InputStream source = ResourceUtils.create().getResourceFromUrl(url); - String contents = Streams.readFullyString(source); - return newDtoFromXmlContents(contents, url); - } catch (Throwable t) { - Exceptions.propagateIfFatal(t); - throw new PropagatedRuntimeException("Unable to retrieve catalog from " + url + ": " + t, t); - } - } - - /** @deprecated since 0.7.0 the xml format is deprecated; use YAML parse routines on BasicBrooklynCatalog */ - @Deprecated - public static CatalogDto newDtoFromXmlContents(String xmlContents, String originDescription) { - CatalogDto result = (CatalogDto) new CatalogXmlSerializer().deserialize(new StringReader(xmlContents)); - result.contentsDescription = originDescription; - - if (LOG.isDebugEnabled()) LOG.debug("Retrieved catalog from: {}", originDescription); - return result; - } - - /** - * Creates a DTO. - * <p> - * The way contents is treated may change; thus this (and much of catalog) should be treated as beta. - * - * @param name - * @param description - * @param optionalContentsDescription optional description of contents; if null, we normally expect source 'contents' to be set later; - * if the DTO has no 'contents' (ie XML source) then a description should be supplied so we know who is populating it - * (e.g. manual additions); without this, warnings may be generated - * - * @return a new Catalog DTO - */ - public static CatalogDto newNamedInstance(String name, String description, String optionalContentsDescription) { - CatalogDto result = new CatalogDto(); - result.name = name; - result.description = description; - if (optionalContentsDescription!=null) result.contentsDescription = optionalContentsDescription; - return result; - } - - /** Used when caller wishes to create an explicitly empty catalog */ - public static CatalogDto newEmptyInstance(String optionalContentsDescription) { - CatalogDto result = new CatalogDto(); - if (optionalContentsDescription!=null) result.contentsDescription = optionalContentsDescription; - return result; - } - - public static CatalogDto newLinkedInstance(String url) { - CatalogDto result = new CatalogDto(); - result.contentsDescription = url; - result.contents = ResourceUtils.create().getResourceAsString(url); - return result; - } - - /** @deprecated since 0.7.0 use {@link #newDtoFromCatalogItems(Collection, String)}, supplying a description for tracking */ - @Deprecated - public static CatalogDto newDtoFromCatalogItems(Collection<CatalogItem<?, ?>> entries) { - return newDtoFromCatalogItems(entries, null); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - public static CatalogDto newDtoFromCatalogItems(Collection<CatalogItem<?, ?>> entries, String description) { - CatalogDto result = new CatalogDto(); - result.contentsDescription = description; - // Weird casts because compiler does not seem to like - // .copyInto(Lists.<CatalogItemDtoAbstract<?, ?>>newArrayListWithExpectedSize(entries.size())); - result.entries = (List<CatalogItemDtoAbstract<?, ?>>) (List) FluentIterable.from(entries) - .filter(CatalogItemDtoAbstract.class) - .copyInto(Lists.newArrayListWithExpectedSize(entries.size())); - return result; - } - - void populate() { - if (contents==null) { - if (url != null) { - contents = ResourceUtils.create().getResourceAsString(url); - contentsDescription = url; - } else if (contentsDescription==null) { - LOG.debug("Catalog DTO has no contents and no description; ignoring call to populate it. Description should be set to suppress this message."); - return; - } else { - LOG.trace("Nothing needs doing (no contents or URL) for catalog with contents described as "+contentsDescription+"."); - return; - } - } - - CatalogDto remoteDto = newDtoFromXmlContents(contents, contentsDescription); - try { - copyFrom(remoteDto, true); - } catch (Exception e) { - Exceptions.propagate(e); - } - } - - /** - * @throws NullPointerException If source is null (and !skipNulls) - */ - void copyFrom(CatalogDto source, boolean skipNulls) throws IllegalAccessException { - if (source==null) { - if (skipNulls) return; - throw new NullPointerException("source DTO is null, when copying to "+this); - } - - if (!skipNulls || source.id != null) id = source.id; - if (!skipNulls || source.contentsDescription != null) contentsDescription = source.contentsDescription; - if (!skipNulls || source.contents != null) contents = source.contents; - if (!skipNulls || source.name != null) name = source.name; - if (!skipNulls || source.description != null) description = source.description; - if (!skipNulls || source.classpath != null) classpath = source.classpath; - if (!skipNulls || source.entries != null) entries = source.entries; - } - - @Override - public String toString() { - return Objects.toStringHelper(this) - .omitNullValues() - .add("name", name) - .add("id", id) - .add("contentsDescription", contentsDescription) - .toString(); - } - - // temporary fix for issue where entries might not be unique - Iterable<CatalogItemDtoAbstract<?, ?>> getUniqueEntries() { - if (entries==null) return null; - Map<String, CatalogItemDtoAbstract<?, ?>> result = getEntriesMap(); - return result.values(); - } - - private Map<String, CatalogItemDtoAbstract<?, ?>> getEntriesMap() { - if (entries==null) return null; - Map<String,CatalogItemDtoAbstract<?, ?>> result = MutableMap.of(); - for (CatalogItemDtoAbstract<?,?> entry: entries) { - result.put(entry.getId(), entry); - } - return result; - } - - void removeEntry(CatalogItemDtoAbstract<?, ?> entry) { - if (entries!=null) - entries.remove(entry); - } - - void addEntry(CatalogItemDtoAbstract<?, ?> entry) { - if (entries == null) entries = MutableList.of(); - CatalogItemDtoAbstract<?, ?> oldEntry = getEntriesMap().get(entry.getId()); - entries.add(entry); - if (oldEntry!=null) - removeEntry(oldEntry); - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoUtils.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoUtils.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoUtils.java deleted file mode 100644 index 93a5cc1..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogDtoUtils.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.io.InputStream; -import java.io.InputStreamReader; - -import org.apache.brooklyn.core.catalog.internal.CatalogClasspathDo.CatalogScanningModes; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class CatalogDtoUtils { - - private static final Logger log = LoggerFactory.getLogger(CatalogDtoUtils.class); - - public static CatalogDto newDefaultLocalScanningDto(CatalogScanningModes scanMode) { - return CatalogDto.newDefaultLocalScanningDto(scanMode); - } - - /** throws if there are any problems in retrieving or copying */ - public static void populateFromUrl(CatalogDto dto, String url) { - CatalogDto remoteDto = newDtoFromUrl(url); - try { - copyDto(remoteDto, dto, true); - } catch (Exception e) { - Exceptions.propagate(e); - } - } - - /** does a shallow copy. - * "skipNulls" means not to copy any fields from the source which are null */ - static void copyDto(CatalogDto source, CatalogDto target, boolean skipNulls) throws IllegalArgumentException, IllegalAccessException { - target.copyFrom(source, skipNulls); - } - - public static CatalogDto newDtoFromUrl(String url) { - if (log.isDebugEnabled()) log.debug("Retrieving catalog from: {}", url); - try { - InputStream source = ResourceUtils.create().getResourceFromUrl(url); - CatalogDto result = (CatalogDto) new CatalogXmlSerializer().deserialize(new InputStreamReader(source)); - if (log.isDebugEnabled()) log.debug("Retrieved catalog from: {}", url); - return result; - } catch (Throwable t) { - log.debug("Unable to retrieve catalog from: "+url+" ("+t+")"); - throw Exceptions.propagate(t); - } - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogEntityItemDto.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogEntityItemDto.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogEntityItemDto.java deleted file mode 100644 index 851287a..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogEntityItemDto.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.EntitySpec; - - -public class CatalogEntityItemDto extends CatalogItemDtoAbstract<Entity,EntitySpec<?>> { - - @Override - public CatalogItemType getCatalogItemType() { - return CatalogItemType.ENTITY; - } - - @Override - public Class<Entity> getCatalogItemJavaType() { - return Entity.class; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public Class<EntitySpec<?>> getSpecType() { - return (Class)EntitySpec.class; - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java deleted file mode 100644 index 37783cd..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogInitialization.java +++ /dev/null @@ -1,453 +0,0 @@ -/* - * 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.io.File; -import java.util.Collection; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.brooklyn.api.catalog.CatalogItem; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState; -import org.apache.brooklyn.core.catalog.CatalogLoadMode; -import org.apache.brooklyn.core.mgmt.ManagementContextInjectable; -import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal; -import org.apache.brooklyn.core.server.BrooklynServerConfig; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.core.flags.TypeCoercions; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.exceptions.FatalRuntimeException; -import org.apache.brooklyn.util.exceptions.RuntimeInterruptedException; -import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.javalang.JavaClassNames; -import org.apache.brooklyn.util.os.Os; -import org.apache.brooklyn.util.text.Strings; - -import com.google.common.annotations.Beta; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - -@Beta -public class CatalogInitialization implements ManagementContextInjectable { - - /* - - A1) if not persisting, go to B1 - A2) if --catalog-reset, delete persisted catalog items - A3) if there is a persisted catalog (and it wasn't not deleted by A2), read it and go to C1 - A4) go to B1 - - B1) look for --catalog-initial, if so read it, then go to C1 - B2) look for BrooklynServerConfig.BROOKLYN_CATALOG_URL, if so, read it, supporting YAML or XML (warning if XML), then go to C1 - B3) look for ~/.brooklyn/catalog.bom, if exists, read it then go to C1 - B4) look for ~/.brooklyn/brooklyn.xml, if exists, warn, read it then go to C1 - B5) read all classpath://brooklyn/default.catalog.bom items, if they exist (and for now they will) - B6) go to C1 - - C1) if --catalog-add, read and add those items - - D1) if persisting, read the rest of the persisted items (entities etc) - - */ - - private static final Logger log = LoggerFactory.getLogger(CatalogInitialization.class); - - private String initialUri; - private boolean reset; - private String additionsUri; - private boolean force; - - private boolean disallowLocal = false; - private List<Function<CatalogInitialization, Void>> callbacks = MutableList.of(); - private boolean - /** has run an unofficial initialization (i.e. an early load, triggered by an early read of the catalog) */ - hasRunUnofficialInitialization = false, - /** has run an official initialization, but it is not a permanent one (e.g. during a hot standby mode, or a run failed) */ - hasRunTransientOfficialInitialization = false, - /** has run an official initialization which is permanent (node is master, and the new catalog is now set) */ - hasRunFinalInitialization = false; - /** is running a populate method; used to prevent recursive loops */ - private boolean isPopulating = false; - - private ManagementContext managementContext; - private boolean isStartingUp = false; - private boolean failOnStartupErrors = false; - - private Object populatingCatalogMutex = new Object(); - - public CatalogInitialization(String initialUri, boolean reset, String additionUri, boolean force) { - this.initialUri = initialUri; - this.reset = reset; - this.additionsUri = additionUri; - this.force = force; - } - - public CatalogInitialization() { - this(null, false, null, false); - } - - @Override - public void setManagementContext(ManagementContext managementContext) { - Preconditions.checkNotNull(managementContext, "management context"); - if (this.managementContext!=null && managementContext!=this.managementContext) - throw new IllegalStateException("Cannot switch management context, from "+this.managementContext+" to "+managementContext); - this.managementContext = managementContext; - } - - /** Called by the framework to set true while starting up, and false afterwards, - * in order to assist in appropriate logging and error handling. */ - public void setStartingUp(boolean isStartingUp) { - this.isStartingUp = isStartingUp; - } - - public void setFailOnStartupErrors(boolean startupFailOnCatalogErrors) { - this.failOnStartupErrors = startupFailOnCatalogErrors; - } - - public CatalogInitialization addPopulationCallback(Function<CatalogInitialization, Void> callback) { - callbacks.add(callback); - return this; - } - - public ManagementContext getManagementContext() { - return Preconditions.checkNotNull(managementContext, "management context has not been injected into "+this); - } - - public boolean isInitialResetRequested() { - return reset; - } - - /** Returns true if the canonical initialization has completed, - * that is, an initialization which is done when a node is rebinded as master - * (or an initialization done by the startup routines when not running persistence); - * see also {@link #hasRunAnyInitialization()}. */ - public boolean hasRunFinalInitialization() { return hasRunFinalInitialization; } - /** Returns true if an official initialization has run, - * even if it was a transient run, e.g. so that the launch sequence can tell whether rebind has triggered initialization */ - public boolean hasRunOfficialInitialization() { return hasRunFinalInitialization || hasRunTransientOfficialInitialization; } - /** Returns true if the initializer has run at all, - * including transient initializations which might be needed before a canonical becoming-master rebind, - * for instance because the catalog is being accessed before loading rebind information - * (done by {@link #populateUnofficial(BasicBrooklynCatalog)}) */ - public boolean hasRunAnyInitialization() { return hasRunFinalInitialization || hasRunTransientOfficialInitialization || hasRunUnofficialInitialization; } - - /** makes or updates the mgmt catalog, based on the settings in this class - * @param nodeState the management node for which this is being read; if master, then we expect this run to be the last one, - * and so subsequent applications should ignore any initialization data (e.g. on a subsequent promotion to master, - * after a master -> standby -> master cycle) - * @param needsInitialItemsLoaded whether the catalog needs the initial items loaded - * @param needsAdditionalItemsLoaded whether the catalog needs the additions loaded - * @param optionalExcplicitItemsForResettingCatalog - * if supplied, the catalog is reset to contain only these items, before calling any other initialization - * for use primarily when rebinding - */ - public void populateCatalog(ManagementNodeState nodeState, boolean needsInitialItemsLoaded, boolean needsAdditionsLoaded, Collection<CatalogItem<?, ?>> optionalExcplicitItemsForResettingCatalog) { - if (log.isDebugEnabled()) { - String message = "Populating catalog for "+nodeState+", needsInitial="+needsInitialItemsLoaded+", needsAdditional="+needsAdditionsLoaded+", explicitItems="+(optionalExcplicitItemsForResettingCatalog==null ? "null" : optionalExcplicitItemsForResettingCatalog.size())+"; from "+JavaClassNames.callerNiceClassAndMethod(1); - if (!ManagementNodeState.isHotProxy(nodeState)) { - log.debug(message); - } else { - // in hot modes, make this message trace so we don't get too much output then - log.trace(message); - } - } - synchronized (populatingCatalogMutex) { - try { - if (hasRunFinalInitialization() && (needsInitialItemsLoaded || needsAdditionsLoaded)) { - // if we have already run "final" then we should only ever be used to reset the catalog, - // not to initialize or add; e.g. we are being given a fixed list on a subsequent master rebind after the initial master rebind - log.warn("Catalog initialization called to populate initial, even though it has already run the final official initialization"); - } - isPopulating = true; - BasicBrooklynCatalog catalog = (BasicBrooklynCatalog) managementContext.getCatalog(); - if (!catalog.getCatalog().isLoaded()) { - catalog.load(); - } else { - if (needsInitialItemsLoaded && hasRunAnyInitialization()) { - // an indication that something caused it to load early; not severe, but unusual - if (hasRunTransientOfficialInitialization) { - log.debug("Catalog initialization now populating, but has noted a previous official run which was not final (probalby loaded while in a standby mode, or a previous run failed); overwriting any items installed earlier"); - } else { - log.warn("Catalog initialization now populating, but has noted a previous unofficial run (it may have been an early web request); overwriting any items installed earlier"); - } - catalog.reset(ImmutableList.<CatalogItem<?,?>>of()); - } - } - - populateCatalogImpl(catalog, needsInitialItemsLoaded, needsAdditionsLoaded, optionalExcplicitItemsForResettingCatalog); - if (nodeState == ManagementNodeState.MASTER) { - // TODO ideally this would remain false until it has *persisted* the changed catalog; - // if there is a subsequent startup failure the forced additions will not be persisted, - // but nor will they be loaded on a subsequent run. - // callers will have to restart a brooklyn, or reach into this class to change this field, - // or (recommended) manually adjust the catalog. - // TODO also, if a node comes up in standby, the addition might not take effector for a while - // - // however since these options are mainly for use on the very first brooklyn run, it's not such a big deal; - // once up and running the typical way to add items is via the REST API - hasRunFinalInitialization = true; - } - } catch (Throwable e) { - log.warn("Error populating catalog (rethrowing): "+e, e); - throw Exceptions.propagate(e); - } finally { - if (!hasRunFinalInitialization) { - hasRunTransientOfficialInitialization = true; - } - isPopulating = false; - } - } - } - - private void populateCatalogImpl(BasicBrooklynCatalog catalog, boolean needsInitialItemsLoaded, boolean needsAdditionsLoaded, Collection<CatalogItem<?, ?>> optionalItemsForResettingCatalog) { - applyCatalogLoadMode(); - - if (optionalItemsForResettingCatalog!=null) { - catalog.reset(optionalItemsForResettingCatalog); - } - - if (needsInitialItemsLoaded) { - populateInitial(catalog); - } - - if (needsAdditionsLoaded) { - populateAdditions(catalog); - populateViaCallbacks(catalog); - } - } - - private enum PopulateMode { YAML, XML, AUTODETECT } - - protected void populateInitial(BasicBrooklynCatalog catalog) { - if (disallowLocal) { - if (!hasRunFinalInitialization()) { - log.debug("CLI initial catalog not being read when local catalog load mode is disallowed."); - } - return; - } - -// B1) look for --catalog-initial, if so read it, then go to C1 -// B2) look for BrooklynServerConfig.BROOKLYN_CATALOG_URL, if so, read it, supporting YAML or XML (warning if XML), then go to C1 -// B3) look for ~/.brooklyn/catalog.bom, if exists, read it then go to C1 -// B4) look for ~/.brooklyn/brooklyn.xml, if exists, warn, read it then go to C1 -// B5) read all classpath://brooklyn/default.catalog.bom items, if they exist (and for now they will) -// B6) go to C1 - - if (initialUri!=null) { - populateInitialFromUri(catalog, initialUri, PopulateMode.AUTODETECT); - return; - } - - String catalogUrl = managementContext.getConfig().getConfig(BrooklynServerConfig.BROOKLYN_CATALOG_URL); - if (Strings.isNonBlank(catalogUrl)) { - populateInitialFromUri(catalog, catalogUrl, PopulateMode.AUTODETECT); - return; - } - - catalogUrl = Os.mergePaths(BrooklynServerConfig.getMgmtBaseDir( managementContext.getConfig() ), "catalog.bom"); - if (new File(catalogUrl).exists()) { - populateInitialFromUri(catalog, new File(catalogUrl).toURI().toString(), PopulateMode.YAML); - return; - } - - catalogUrl = Os.mergePaths(BrooklynServerConfig.getMgmtBaseDir( managementContext.getConfig() ), "catalog.xml"); - if (new File(catalogUrl).exists()) { - populateInitialFromUri(catalog, new File(catalogUrl).toURI().toString(), PopulateMode.XML); - return; - } - - // otherwise look for for classpath:/brooklyn/default.catalog.bom -- - // there is one on the classpath which says to scan, and provides a few templates; - // if one is supplied by user in the conf/ dir that will override the item from the classpath - // (TBD - we might want to scan for all such bom's?) - - catalogUrl = "classpath:/brooklyn/default.catalog.bom"; - if (new ResourceUtils(this).doesUrlExist(catalogUrl)) { - populateInitialFromUri(catalog, catalogUrl, PopulateMode.YAML); - return; - } - - log.info("No catalog found on classpath or specified; catalog will not be initialized."); - return; - } - - private void populateInitialFromUri(BasicBrooklynCatalog catalog, String catalogUrl, PopulateMode mode) { - log.debug("Loading initial catalog from {}", catalogUrl); - - Exception problem = null; - Object result = null; - - String contents = null; - try { - contents = new ResourceUtils(this).getResourceAsString(catalogUrl); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - if (problem==null) problem = e; - } - - if (contents!=null && (mode==PopulateMode.YAML || mode==PopulateMode.AUTODETECT)) { - // try YAML first - try { - catalog.reset(MutableList.<CatalogItem<?,?>>of()); - result = catalog.addItems(contents); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - if (problem==null) problem = e; - } - } - - if (result==null && contents!=null && (mode==PopulateMode.XML || mode==PopulateMode.AUTODETECT)) { - // then try XML - try { - populateInitialFromUriXml(catalog, catalogUrl, contents); - // clear YAML problem - problem = null; - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - if (problem==null) problem = e; - } - } - - if (result!=null) { - log.debug("Loaded initial catalog from {}: {}", catalogUrl, result); - } - if (problem!=null) { - log.warn("Error importing catalog from " + catalogUrl + ": " + problem, problem); - // TODO inform mgmt of error - } - - } - - // deprecated XML format - @SuppressWarnings("deprecation") - private void populateInitialFromUriXml(BasicBrooklynCatalog catalog, String catalogUrl, String contents) { - CatalogDto dto = CatalogDto.newDtoFromXmlContents(contents, catalogUrl); - if (dto!=null) { - catalog.reset(dto); - } - } - - boolean hasRunAdditions = false; - protected void populateAdditions(BasicBrooklynCatalog catalog) { - if (Strings.isNonBlank(additionsUri)) { - if (disallowLocal) { - if (!hasRunAdditions) { - log.warn("CLI additions supplied but not supported when catalog load mode disallows local loads; ignoring."); - } - return; - } - if (!hasRunAdditions) { - log.debug("Adding to catalog from CLI: "+additionsUri+" (force: "+force+")"); - } - Iterable<? extends CatalogItem<?, ?>> items = catalog.addItems( - new ResourceUtils(this).getResourceAsString(additionsUri), force); - - if (!hasRunAdditions) - log.debug("Added to catalog from CLI: "+items); - else - log.debug("Added to catalog from CLI: count "+Iterables.size(items)); - - hasRunAdditions = true; - } - } - - protected void populateViaCallbacks(BasicBrooklynCatalog catalog) { - for (Function<CatalogInitialization, Void> callback: callbacks) - callback.apply(this); - } - - private Object setFromCLMMutex = new Object(); - private boolean setFromCatalogLoadMode = false; - - /** @deprecated since introduced in 0.7.0, only for legacy compatibility with - * {@link CatalogLoadMode} {@link BrooklynServerConfig#CATALOG_LOAD_MODE}, - * allowing control of catalog loading from a brooklyn property */ - @Deprecated - public void applyCatalogLoadMode() { - synchronized (setFromCLMMutex) { - if (setFromCatalogLoadMode) return; - setFromCatalogLoadMode = true; - Maybe<Object> clmm = ((ManagementContextInternal)managementContext).getConfig().getConfigRaw(BrooklynServerConfig.CATALOG_LOAD_MODE, false); - if (clmm.isAbsent()) return; - org.apache.brooklyn.core.catalog.CatalogLoadMode clm = TypeCoercions.coerce(clmm.get(), org.apache.brooklyn.core.catalog.CatalogLoadMode.class); - log.warn("Legacy CatalogLoadMode "+clm+" set: applying, but this should be changed to use new CLI --catalogXxx commands"); - switch (clm) { - case LOAD_BROOKLYN_CATALOG_URL: - reset = true; - break; - case LOAD_BROOKLYN_CATALOG_URL_IF_NO_PERSISTED_STATE: - // now the default - break; - case LOAD_PERSISTED_STATE: - disallowLocal = true; - break; - } - } - } - - /** Creates the catalog based on parameters set here, if not yet loaded, - * but ignoring persisted state and warning if persistence is on and we are starting up - * (because the official persistence is preferred and the catalog will be subsequently replaced); - * for use when the catalog is accessed before persistence is completed. - * <p> - * This method is primarily used during testing, which in many cases does not enforce the full startup order - * and which wants a local catalog in any case. It may also be invoked if a client requests the catalog - * while the server is starting up. */ - public void populateUnofficial(BasicBrooklynCatalog catalog) { - synchronized (populatingCatalogMutex) { - // check isPopulating in case this method gets called from inside another populate call - if (hasRunAnyInitialization() || isPopulating) return; - log.debug("Populating catalog unofficially ("+catalog+")"); - isPopulating = true; - try { - if (isStartingUp) { - log.warn("Catalog access requested when not yet initialized; populating best effort rather than through recommended pathway. Catalog data may be replaced subsequently."); - } - populateCatalogImpl(catalog, true, true, null); - } finally { - hasRunUnofficialInitialization = true; - isPopulating = false; - } - } - } - - public void handleException(Throwable throwable, Object details) { - if (throwable instanceof InterruptedException) - throw new RuntimeInterruptedException((InterruptedException) throwable); - if (throwable instanceof RuntimeInterruptedException) - throw (RuntimeInterruptedException) throwable; - - String throwableText = Exceptions.collapseText(throwable); - log.error("Error loading catalog item '"+details+"': "+throwableText); - log.debug("Trace for error loading catalog item '"+details+"': "+throwableText, throwable); - - // TODO give more detail when adding - ((ManagementContextInternal)getManagementContext()).errors().add(throwable); - - if (isStartingUp && failOnStartupErrors) { - throw new FatalRuntimeException("Unable to load catalog item '"+details+"': "+throwableText, throwable); - } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java deleted file mode 100644 index 299abdb..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemBuilder.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * 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 java.util.Collections; - -import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle; -import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType; - -import com.google.common.base.Preconditions; - -public class CatalogItemBuilder<CIConcreteType extends CatalogItemDtoAbstract<?, ?>> { - private CIConcreteType dto; - - public static CatalogItemBuilder<?> newItem(CatalogItemType itemType, String symbolicName, String version) { - Preconditions.checkNotNull(itemType, "itemType required"); - switch (itemType) { - case ENTITY: return newEntity(symbolicName, version); - case TEMPLATE: return newTemplate(symbolicName, version); - case POLICY: return newPolicy(symbolicName, version); - case LOCATION: return newLocation(symbolicName, version); - } - throw new IllegalStateException("Unexpected itemType: "+itemType); - } - - public static CatalogItemBuilder<CatalogEntityItemDto> newEntity(String symbolicName, String version) { - return new CatalogItemBuilder<CatalogEntityItemDto>(new CatalogEntityItemDto()) - .symbolicName(symbolicName) - .version(version); - } - - public static CatalogItemBuilder<CatalogTemplateItemDto> newTemplate(String symbolicName, String version) { - return new CatalogItemBuilder<CatalogTemplateItemDto>(new CatalogTemplateItemDto()) - .symbolicName(symbolicName) - .version(version); - } - - public static CatalogItemBuilder<CatalogPolicyItemDto> newPolicy(String symbolicName, String version) { - return new CatalogItemBuilder<CatalogPolicyItemDto>(new CatalogPolicyItemDto()) - .symbolicName(symbolicName) - .version(version); - } - - public static CatalogItemBuilder<CatalogLocationItemDto> newLocation(String symbolicName, String version) { - return new CatalogItemBuilder<CatalogLocationItemDto>(new CatalogLocationItemDto()) - .symbolicName(symbolicName) - .version(version); - } - - public CatalogItemBuilder(CIConcreteType dto) { - this.dto = dto; - this.dto.setLibraries(Collections.<CatalogBundle>emptyList()); - } - - public CatalogItemBuilder<CIConcreteType> symbolicName(String symbolicName) { - dto.setSymbolicName(symbolicName); - return this; - } - - @Deprecated - public CatalogItemBuilder<CIConcreteType> javaType(String javaType) { - dto.setJavaType(javaType); - return this; - } - - /** @deprecated since 0.7.0 use {@link #displayName}*/ - @Deprecated - public CatalogItemBuilder<CIConcreteType> name(String name) { - return displayName(name); - } - - public CatalogItemBuilder<CIConcreteType> displayName(String displayName) { - dto.setDisplayName(displayName); - return this; - } - - public CatalogItemBuilder<CIConcreteType> description(String description) { - dto.setDescription(description); - return this; - } - - public CatalogItemBuilder<CIConcreteType> iconUrl(String iconUrl) { - dto.setIconUrl(iconUrl); - return this; - } - - public CatalogItemBuilder<CIConcreteType> version(String version) { - dto.setVersion(version); - return this; - } - - public CatalogItemBuilder<CIConcreteType> deprecated(boolean deprecated) { - dto.setDeprecated(deprecated); - return this; - } - - public CatalogItemBuilder<CIConcreteType> disabled(boolean disabled) { - dto.setDisabled(disabled); - return this; - } - - public CatalogItemBuilder<CIConcreteType> libraries(Collection<CatalogBundle> libraries) { - dto.setLibraries(libraries); - return this; - } - - public CatalogItemBuilder<CIConcreteType> plan(String yaml) { - dto.setPlanYaml(yaml); - return this; - } - - public CatalogItemBuilder<CIConcreteType> tag(Object tag) { - dto.tags().addTag(tag); - return this; - } - - public CIConcreteType build() { - Preconditions.checkNotNull(dto.getSymbolicName()); - Preconditions.checkNotNull(dto.getVersion()); - - if (dto.getLibraries() == null) { - dto.setLibraries(Collections.<CatalogBundle>emptyList()); - } - - CIConcreteType ret = dto; - - //prevent mutations through the builder - dto = null; - - return ret; - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemComparator.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemComparator.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemComparator.java deleted file mode 100644 index abd4d08..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemComparator.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.Collections; -import java.util.Comparator; - -import org.apache.brooklyn.api.catalog.CatalogItem; -import org.apache.brooklyn.util.text.VersionComparator; - -/** - * Largest version first order. - * - * When using the comparator to sort - first using symbolicName - * and if equal puts larger versions first, snapshots at the back. - */ -public class CatalogItemComparator<T,SpecT> implements Comparator<CatalogItem<T, SpecT>> { - - public static final CatalogItemComparator<?, ?> INSTANCE = new CatalogItemComparator<Object, Object>(); - - @SuppressWarnings("unchecked") - public static <T,SpecT> CatalogItemComparator<T,SpecT> getInstance() { - return (CatalogItemComparator<T, SpecT>) INSTANCE; - } - - @Override - public int compare(CatalogItem<T, SpecT> o1, CatalogItem<T, SpecT> o2) { - int symbolicNameComparison = o1.getSymbolicName().compareTo(o2.getSymbolicName()); - if (symbolicNameComparison != 0) { - return symbolicNameComparison; - } else { - return Collections.reverseOrder(VersionComparator.INSTANCE).compare(o1.getVersion(), o2.getVersion()); - } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java deleted file mode 100644 index 1766ad7..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDo.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * 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(); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java deleted file mode 100644 index df0d2e4..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogItemDtoAbstract.java +++ /dev/null @@ -1,439 +0,0 @@ -/* - * 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 java.util.Collections; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import org.apache.brooklyn.api.catalog.CatalogItem; -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.mgmt.rebind.BasicCatalogItemRebindSupport; -import org.apache.brooklyn.core.objs.AbstractBrooklynObject; -import org.apache.brooklyn.core.relations.EmptyRelationSupport; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.core.flags.FlagUtils; -import org.apache.brooklyn.util.core.flags.SetFromFlag; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; - -public abstract class CatalogItemDtoAbstract<T, SpecT> extends AbstractBrooklynObject implements CatalogItem<T, SpecT> { - - private static Logger LOG = LoggerFactory.getLogger(CatalogItemDtoAbstract.class); - - private @SetFromFlag String symbolicName; - private @SetFromFlag String version = BasicBrooklynCatalog.NO_VERSION; - - private @SetFromFlag String displayName; - private @SetFromFlag String description; - private @SetFromFlag String iconUrl; - - private @SetFromFlag String javaType; - /**@deprecated since 0.7.0, left for deserialization backwards compatibility (including xml based catalog format) */ - private @Deprecated @SetFromFlag String type; - private @SetFromFlag String planYaml; - - private @SetFromFlag Collection<CatalogBundle> libraries; - private @SetFromFlag Set<Object> tags = Sets.newLinkedHashSet(); - private @SetFromFlag boolean deprecated; - private @SetFromFlag boolean disabled; - - /** - * @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(); - } - - @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 String getId() { - return getCatalogItemId(); - } - - @Override - public String getCatalogItemId() { - return CatalogUtils.getVersionedId(getSymbolicName(), getVersion()); - } - - @Override - public String getJavaType() { - if (javaType != null) return javaType; - return type; - } - - @Override - @Deprecated - public String getName() { - return getDisplayName(); - } - - @Override - @Deprecated - public String getRegisteredTypeName() { - return getSymbolicName(); - } - - @Override - public String getDisplayName() { - return displayName; - } - - @Override - public String getDescription() { - return description; - } - - @Override - public String getIconUrl() { - return iconUrl; - } - - @Override - public String getSymbolicName() { - if (symbolicName != null) return symbolicName; - return getJavaType(); - } - - @Override - public String getVersion() { - // The property is set to NO_VERSION when the object is initialized so it's not supposed to be null ever. - // But xstream doesn't call constructors when reading from the catalog.xml file which results in null value - // for the version property. That's why we have to fix it in the getter. - if (version != null) { - return version; - } else { - return BasicBrooklynCatalog.NO_VERSION; - } - } - - @Override - public boolean isDeprecated() { - return deprecated; - } - - @Override - public void setDeprecated(boolean deprecated) { - this.deprecated = deprecated; - } - - @Override - public boolean isDisabled() { - return disabled; - } - - @Override - public void setDisabled(boolean disabled) { - this.disabled = disabled; - } - - @Nonnull - @Override - public Collection<CatalogBundle> getLibraries() { - if (libraries != null) { - return ImmutableList.copyOf(libraries); - } else { - return Collections.emptyList(); - } - } - - @Nullable @Override - public String getPlanYaml() { - return planYaml; - } - - @Override - public int hashCode() { - return Objects.hashCode(symbolicName, planYaml, javaType, nullIfEmpty(libraries), version, getCatalogItemId()); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (getClass() != obj.getClass()) return false; - CatalogItemDtoAbstract<?,?> other = (CatalogItemDtoAbstract<?,?>) obj; - if (!Objects.equal(symbolicName, other.symbolicName)) return false; - if (!Objects.equal(planYaml, other.planYaml)) return false; - if (!Objects.equal(javaType, other.javaType)) return false; - if (!Objects.equal(nullIfEmpty(libraries), nullIfEmpty(other.libraries))) return false; - if (!Objects.equal(getCatalogItemId(), other.getCatalogItemId())) return false; - if (!Objects.equal(version, other.version)) return false; - if (!Objects.equal(deprecated, other.deprecated)) return false; - if (!Objects.equal(description, other.description)) return false; - if (!Objects.equal(displayName, other.displayName)) return false; - if (!Objects.equal(iconUrl, other.iconUrl)) return false; - if (!Objects.equal(tags, other.tags)) return false; - // 'type' not checked, because deprecated, - // and in future we might want to allow it to be removed/blanked in some impls without affecting equality - // (in most cases it is the same as symbolicName so doesn't matter) - return true; - } - - private static <T> Collection<T> nullIfEmpty(Collection<T> coll) { - if (coll==null || coll.isEmpty()) return null; - return coll; - } - - @Override - public String toString() { - return getClass().getSimpleName()+"["+getId()+"/"+getDisplayName()+"]"; - } - - @Override - public abstract Class<SpecT> getSpecType(); - - transient CatalogXmlSerializer serializer; - - @Override - public String toXmlString() { - if (serializer==null) loadSerializer(); - return serializer.toString(this); - } - - private synchronized void loadSerializer() { - if (serializer == null) { - serializer = new CatalogXmlSerializer(); - } - } - - @Override - public RebindSupport<CatalogItemMemento> getRebindSupport() { - return new BasicCatalogItemRebindSupport(this); - } - - /** - * 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 void setDisplayName(String newName) { - this.displayName = newName; - } - - @Override - protected CatalogItemDtoAbstract<T, SpecT> configure(Map<?, ?> flags) { - FlagUtils.setFieldsFromFlags(flags, this); - return this; - } - - @Override - public TagSupport tags() { - return new BasicTagSupport(); - } - - /* - * Using a custom tag support class rather than the one in AbstractBrooklynObject because - * when XStream unmarshals a catalog item with no tags (e.g. from any catalog.xml file) - * super.tags will be null, and any call to getTags throws a NullPointerException on the - * synchronized (tags) statement. It can't just be initialised here because super.tags is - * final. - */ - private class BasicTagSupport implements TagSupport { - - private void setTagsIfNull() { - // Possible if the class was unmarshalled by Xstream with no tags - synchronized (CatalogItemDtoAbstract.this) { - if (tags == null) { - tags = Sets.newLinkedHashSet(); - } - } - } - - @Nonnull - @Override - public Set<Object> getTags() { - synchronized (CatalogItemDtoAbstract.this) { - setTagsIfNull(); - return ImmutableSet.copyOf(tags); - } - } - - @Override - public boolean containsTag(Object tag) { - synchronized (CatalogItemDtoAbstract.this) { - setTagsIfNull(); - return tags.contains(tag); - } - } - - @Override - public boolean addTag(Object tag) { - boolean result; - synchronized (CatalogItemDtoAbstract.this) { - setTagsIfNull(); - result = tags.add(tag); - } - onTagsChanged(); - return result; - } - - @Override - public boolean addTags(Iterable<?> newTags) { - boolean result; - synchronized (CatalogItemDtoAbstract.this) { - setTagsIfNull(); - result = Iterables.addAll(tags, newTags); - } - onTagsChanged(); - return result; - } - - @Override - public boolean removeTag(Object tag) { - boolean result; - synchronized (CatalogItemDtoAbstract.this) { - setTagsIfNull(); - result = tags.remove(tag); - } - onTagsChanged(); - return result; - } - } - - @Override - @Deprecated - public void setCatalogItemId(String id) { - //no op, should be used by rebind code only - } - - protected void setSymbolicName(String symbolicName) { - this.symbolicName = symbolicName; - } - - protected void setVersion(String version) { - this.version = version; - } - - protected void setDescription(String description) { - this.description = description; - } - - protected void setIconUrl(String iconUrl) { - this.iconUrl = iconUrl; - } - - protected void setJavaType(String javaType) { - this.javaType = javaType; - this.type = null; - } - - protected void setPlanYaml(String planYaml) { - this.planYaml = planYaml; - } - - protected void setLibraries(Collection<CatalogBundle> libraries) { - this.libraries = libraries; - } - - protected void setTags(Set<Object> tags) { - this.tags = tags; - } - - protected void setSerializer(CatalogXmlSerializer serializer) { - this.serializer = serializer; - } - - /** - * Parses an instance of CatalogLibrariesDto from the given List. Expects the list entries - * to be either Strings or Maps of String -> String. Will skip items that are not. - */ - public static Collection<CatalogBundle> parseLibraries(Collection<?> possibleLibraries) { - Collection<CatalogBundle> dto = MutableList.of(); - for (Object object : possibleLibraries) { - if (object instanceof Map) { - Map<?, ?> entry = (Map<?, ?>) object; - String name = stringValOrNull(entry, "name"); - String version = stringValOrNull(entry, "version"); - String url = stringValOrNull(entry, "url"); - dto.add(new CatalogBundleDto(name, version, url)); - } else if (object instanceof String) { - String inlineRef = (String) object; - - final String name; - final String version; - final String url; - - //Infer reference type (heuristically) - if (inlineRef.contains("/") || inlineRef.contains("\\")) { - //looks like an url/file path - name = null; - version = null; - url = inlineRef; - } else if (CatalogUtils.looksLikeVersionedId(inlineRef)) { - //looks like a name+version ref - name = CatalogUtils.getSymbolicNameFromVersionedId(inlineRef); - version = CatalogUtils.getVersionFromVersionedId(inlineRef); - url = null; - } else { - //assume it to be relative url - name = null; - version = null; - url = inlineRef; - } - - dto.add(new CatalogBundleDto(name, version, url)); - } else { - LOG.debug("Unexpected entry in libraries list neither string nor map: " + object); - } - } - return dto; - } - - private static String stringValOrNull(Map<?, ?> map, String key) { - Object val = map.get(key); - return val != null ? String.valueOf(val) : null; - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d03f254b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogLibrariesDo.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogLibrariesDo.java b/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogLibrariesDo.java deleted file mode 100644 index 99041d2..0000000 --- a/brooklyn-server/core/src/main/java/org/apache/brooklyn/core/catalog/internal/CatalogLibrariesDo.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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 org.apache.brooklyn.api.catalog.CatalogItem; - -import com.google.common.base.Preconditions; - -@Deprecated -public class CatalogLibrariesDo implements CatalogItem.CatalogItemLibraries { - - private final CatalogLibrariesDto librariesDto; - - - public CatalogLibrariesDo(CatalogLibrariesDto librariesDto) { - this.librariesDto = Preconditions.checkNotNull(librariesDto, "librariesDto"); - } - - @Override - public Collection<String> getBundles() { - return librariesDto.getBundles(); - } - -}
