blob: e9799cb1475c0c91c63ca4618d66d872f11fc504 [file] [log] [blame]
/*
*
* 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.qpid.management.domain.model;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.qpid.management.domain.handler.impl.IMethodInvocationListener;
import org.apache.qpid.management.domain.handler.impl.MethodOrEventDataTransferObject;
import org.apache.qpid.management.domain.model.type.Binary;
/**
* Qpid package definition.
* A grouping of class definitions that are related to a single software component.
* The package concept is used to extend the management schema beyond just the QPID software components.
* The name is prefixed with "Qpid" for avoiding name conficts with java.lang.Package.
*
* @author Andrea Gazzarini
*/
final class QpidPackage
{
/**
* Qpid class identity.
* Each qpid class is uniquely identifier by its name and schema-hash.
* The schema hash is an MD5 checksum of the schema for a class.
* It is there so we can support the case where two different versions of the same class are present at the same time.
*
* @author Andrea Gazzarini
*/
class QpidClassIdentity {
final String name;
final Binary hash;
/**
* Builds a new class identity with the given name and hash.
*
* @param name the class name.
* @param hash is an MD5 checksum of the schema of this outer class.
*/
QpidClassIdentity(String name,Binary hash) {
this.name = name;
this.hash = hash;
}
@Override
public int hashCode ()
{
return name.hashCode()+hash.hashCode();
}
@Override
public boolean equals (Object obj)
{
QpidClassIdentity identity = (QpidClassIdentity) obj;
return name.equals(identity.name) && hash.equals(identity.hash);
}
}
private String _name;
private DomainModel _parent;
private Map<QpidClassIdentity, QpidClass> _classes = new HashMap<QpidClassIdentity, QpidClass>();
private Map<QpidClassIdentity, QpidEvent> _events = new HashMap<QpidClassIdentity, QpidEvent>();
/**
* Builds a new package with the supplied name.
*
* @param name the name of the package.
*/
QpidPackage(String name, DomainModel parent)
{
this._name = name;
this._parent = parent;
}
/**
* Returns the identifier of the broker which contains this package.
* @return
*/
UUID getOwnerId()
{
return _parent.getBrokerId();
}
/**
* Returns the name of this package.
*
* @return the name of this package.
*/
String getName ()
{
return _name;
}
/**
* Adds a class definition to this package.
* The class will be added only if its definition doesn't already exists.
*
* @param className the name of the class.
* @param classHash the class schema hash.
* @param properties the properties of the class.
* @param statistics the statistics of the class.
* @param methods the methods of the class.
* @param events the events of the class.
*
* @throws UnableToBuildFeatureException when the class definition cannot be built due to a feature build failure.
*/
void addClassDefinition (
String className,
Binary classHash,
List<Map<String, Object>> properties,
List<Map<String, Object>> statistics,
List<MethodOrEventDataTransferObject> methods) throws UnableToBuildFeatureException
{
getQpidClass(className,classHash,true).setSchema(properties,statistics,methods);
}
void addEventDefinition (
String eventClassName,
Binary classHash,
List<Map<String, Object>> arguments) throws UnableToBuildFeatureException
{
getQpidEvent(eventClassName,classHash,true).setSchema(arguments);
}
/**
* Returns true if this package contains the given class definition.
*
* @param className the name of the class.
* @return true if this package contains the class definition, false otherwise.
*/
boolean alreadyContainsClassDefinition (String className, Binary hash)
{
return _classes.containsKey(new QpidClassIdentity(className,hash));
}
/**
* Injects into a class the given object instance instrumentation data.
*
* @param className the of the class the injected object data belongs to.
* @param objectId the object identifier.
* @param rawData the instrumentation data (in raw format).
*/
void setObjectInstanceInstrumentationRawData (String className, Binary classHash,Binary objectId, byte[] rawData)
{
getQpidClass(className, classHash,true).addInstrumentationData(objectId,rawData);
}
/**
* Injects into a class the given object instance configuration data.
*
* @param className the of the class the injected object data belongs to.
* @param objectId the object identifier.
* @param rawData the configuration data (in raw format).
*/
void setObjectInstanceConfigurationRawData (String className,Binary classHash, Binary objectId, byte[] rawData)
{
getQpidClass(className,classHash,true).addConfigurationData(objectId,rawData);
}
void setEventInstanceRawData (String eventName,Binary eventHash, byte[] rawData,long currentTimestamp,int severity)
{
getQpidEvent(eventName,eventHash,true).addEventData(rawData, currentTimestamp, severity);
}
/**
* Returns the definition of the class with given name.
*
* @param className the name of the class.
* @param hash the class hash.
* @param store a flag indicating if a just created class must be stored or not.
* @return the definition of the class with given name.
*/
QpidClass getQpidClass(String className, Binary hash, boolean store)
{
QpidClassIdentity identity = new QpidClassIdentity(className,hash);
QpidClass classDefinition = _classes.get(identity);
if (classDefinition == null)
{
classDefinition = new QpidClass(className, hash,this);
if (store)
{
_classes.put(identity,classDefinition);
}
}
return classDefinition;
}
/**
* Returns the definition of the class with given name.
*
* @param className the name of the class.
* @param hash the class hash.
* @param store a flag indicating if a just created class must be stored or not.
* @return the definition of the class with given name.
*/
QpidEvent getQpidEvent(String className, Binary hash, boolean store)
{
QpidClassIdentity identity = new QpidClassIdentity(className,hash);
QpidEvent eventDefinition = _events.get(identity);
if (eventDefinition == null)
{
eventDefinition = new QpidEvent(className, hash,this);
if (store)
{
_events.put(identity,eventDefinition);
}
}
return eventDefinition;
}
/**
* Returns a string representation of this class.
* That is, this method returns the simple name (not FQN) of this class.
*/
@Override
public String toString ()
{
return _name;
}
/**
* Removes the object instance associated to the given parameters.
*
* @param className the class definition of the object instance.
* @param classHash the class hash
* @param objectId the object identifier.
*/
void removeObjectInstance (String className, Binary classHash, Binary objectId)
{
QpidClass qpidClass = getQpidClass(className,classHash,false);
qpidClass.removeObjectInstance(objectId);
}
/**
* Releases all previously acquired resources of this package.
*/
void releaseResources ()
{
for (QpidClass qpidClass : _classes.values())
{
qpidClass.releaseResources();
}
for (QpidEvent qpidEvent: _events.values())
{
qpidEvent.releaseResources();
}
}
/**
* Returns the method invocation listener of the corresponing parent domain model.
*
* @return the method invocation listener of the corresponing parent domain model.
*/
IMethodInvocationListener getMethodInvocationListener ()
{
return _parent.getMethodInvocationListener();
}
}