blob: 1919bac41148d6fccf25e6acc6c4d9e607a5488b [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.console;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
import org.apache.qpid.transport.codec.Decoder;
import org.apache.qpid.transport.codec.Encoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.emory.mathcs.backport.java.util.Arrays;
public class QMFObject
{
private static Logger log = LoggerFactory.getLogger(QMFObject.class);
protected SchemaClass schema;
private java.util.Date createTime;
private java.util.Date currentTime;
private java.util.Date deleteTime;
private ObjectID objectID;
private Session session;
private boolean managed;
public java.util.HashMap<String, Object> properties = new java.util.HashMap<String, Object>();
public java.util.HashMap<String, Object> statistics = new java.util.HashMap<String, Object>();
// This constructor is the "naked" constructor which creates
// an object without a session or a schema. It is used by
// subclasses which are auto generated
public QMFObject()
{
}
public QMFObject(QMFObject source)
{
this.setSession(source.getSession());
this.setSchema(source.getSchema());
this.managed = source.managed;
this.setCurrentTime(source.getCurrentTime());
this.setCreateTime(source.getCreateTime());
this.setDeleteTime(source.getDeleteTime());
this.setObjectID(source.getObjectID());
this.properties = source.properties;
this.statistics = source.statistics;
}
// This constructor is used by a session make object call to
// create a blank object from a schema.
public QMFObject(Session session, SchemaClass schema,
boolean hasProperties, boolean hasStats, boolean isManaged)
{
setSession(session);
setSchema(schema);
managed = isManaged;
if (hasProperties)
{
for (SchemaProperty prop : getSchema().getAllProperties())
{
Object propValue = null;
if (!prop.getOptional())
{
propValue = Util.defaultValue(prop.getType());
}
this.setProperty(prop.getName(), propValue);
}
}
if (hasStats)
{
for (SchemaStatistic stat : getSchema().statistics)
{
setStatistic(stat.getName(), Util.defaultValue(stat.getType()));
}
}
}
// This constructor is used by the session to create an object based on a
// data
// stream by the agent.
public QMFObject(Session session, SchemaClass schema, Decoder dec,
boolean hasProperties, boolean hasStats, boolean isManaged)
{
setSession(session);
setSchema(schema);
managed = isManaged;
if (managed)
{
// FIXME DateTime or Uint64??
setCurrentTime(new java.util.Date(dec.readDatetime()));
setCreateTime(new java.util.Date(dec.readDatetime()));
setDeleteTime(new java.util.Date(dec.readDatetime()));
setObjectID(new ObjectID(dec));
}
if (hasProperties)
{
java.util.ArrayList<String> excluded = processPresenceMasks(dec,
getSchema());
for (SchemaProperty prop : getSchema().getAllProperties())
{
if (excluded.contains(prop.getName()))
{
// log.Debug(String.Format("Setting Property Default {0}",
// prop.Name)) ;
safeAddProperty(prop.getName(), null);
} else
{
// log.Debug(String.Format("Setting Property {0}",
// prop.Name)) ;
safeAddProperty(prop.getName(), session.decodeValue(dec,
prop.getType()));
}
}
}
if (hasStats)
{
for (SchemaStatistic stat : getSchema().getAllStatistics())
{
// log.Debug(String.Format("Setting Statistic {0}", stat.Name))
// ;
statistics.put(stat.getName(), session.decodeValue(dec, stat
.getType()));
}
}
}
public final long agentBank()
{
return getObjectID().agentBank();
}
public final long brokerBank()
{
return getObjectID().brokerBank();
}
public final void encode(Encoder enc)
{
int mask = 0;
int bit = 0;
java.util.ArrayList<SchemaProperty> propsToEncode = new java.util.ArrayList<SchemaProperty>();
log.debug(String.format("Encoding class %s:%s", getSchema()
.getPackageName(), getSchema().getClassName()));
enc.writeUint8((short) 20);
getSchema().getKey().encode(enc);
for (SchemaProperty prop : getSchema().getAllProperties())
{
if (prop.getOptional())
{
if (bit == 0)
{
bit = 1;
}
if ((properties.containsKey(prop.getName()))
&& (properties.get(prop.getName()) != null))
{
mask |= bit;
propsToEncode.add(prop);
} else
{
}
bit = bit << 1;
if (bit == 256)
{
bit = 0;
enc.writeUint8((short) mask);
mask = 0;
}
} else
{
propsToEncode.add(prop);
}
}
if (bit != 0)
{
enc.writeUint8((short) mask);
}
for (SchemaProperty prop : propsToEncode)
{
Object obj = properties.get(prop.getName());
// log.Debug(String.Format("Encoding property {0}", prop.Name)) ;
getSession().encodeValue(enc, prop.getType(), obj);
}
for (SchemaStatistic stat : getSchema().statistics)
{
Object obj = statistics.get(stat.getName());
getSession().encodeValue(enc, stat.getType(), obj);
}
log.debug("Done");
}
public final Date getCreateTime()
{
return createTime;
}
public final Date getCurrentTime()
{
return currentTime;
}
public final Date getDeleteTime()
{
return deleteTime;
}
protected final ArrayList<SchemaMethod> getMethods()
{
return getSchema().getAllMethods();
}
public final ObjectID getObjectID()
{
return objectID;
}
public final Object getProperty(String attributeName)
{
return properties.get(attributeName);
}
public SchemaClass getSchema()
{
return schema;
}
public final Session getSession()
{
return session;
}
protected final MethodResult internalInvokeMethod(String name,
List<Object> args, boolean synchronous, int timeToLive)
{
if (!managed)
{
throw new ConsoleException("Object is not Managed");
}
if (getSchema().getMethod(name) == null)
{
throw new ConsoleException(String.format(
"Method named '%s' does not exist", name));
}
return getSession().invokeMethod(this, name, args, synchronous,
timeToLive);
}
public final MethodResult invokeMethod(String name, boolean synchronous,
int timeToLive, Object... args)
{
return this.internalInvokeMethod(name, Arrays.asList(args),
synchronous, timeToLive);
}
public final MethodResult invokeMethod(String name, boolean synchronous,
Object... args)
{
return this.internalInvokeMethod(name, Arrays.asList(args),
synchronous, Broker.SYNC_TIME);
}
public final MethodResult invokeMethod(String name, int timeToLive,
Object... args)
{
return this.internalInvokeMethod(name, Arrays.asList(args), true,
timeToLive);
}
public final MethodResult invokeMethod(String name, Object... args)
{
return this.internalInvokeMethod(name, Arrays.asList(args), true,
Broker.SYNC_TIME);
}
public final boolean isDeleted()
{
return !getDeleteTime().equals(new java.util.Date(0));
}
protected final ArrayList<String> processPresenceMasks(Decoder dec,
SchemaClass schema)
{
java.util.ArrayList<String> excludes = new java.util.ArrayList<String>();
short bit = 0;
short mask = 0;
for (SchemaProperty prop : getSchema().getAllProperties())
{
if (prop.getOptional())
{
// log.Debug(String.Format("Property named {0} is optional",
// prop.Name)) ;
if (bit == 0)
{
mask = dec.readUint8();
bit = 1;
}
if ((mask & bit) == 0)
{
// log.Debug(String.Format("Property named {0} is not present",
// prop.Name)) ;
excludes.add(prop.getName());
}
bit *= 2;
if (bit == 256)
{
bit = 0;
}
}
}
return excludes;
}
public final String routingKey()
{
return getObjectID().routingCode();
}
protected final void safeAddProperty(String propName, Object value)
{
if (properties.containsKey(propName))
{
properties.put(propName, value);
} else
{
properties.put(propName, value);
}
}
public final void setCreateTime(java.util.Date value)
{
createTime = value;
}
public final void setCurrentTime(java.util.Date value)
{
currentTime = value;
}
public final void setDeleteTime(java.util.Date value)
{
deleteTime = value;
}
public final void setObjectID(ObjectID value)
{
objectID = value;
}
public final void setProperty(String attributeName, Object newValue)
{
properties.put(attributeName, newValue);
}
public void setSchema(SchemaClass value)
{
schema = value;
}
public final void setSession(Session value)
{
session = value;
}
protected final void setStatistic(String attributeName, Object newValue)
{
statistics.put(attributeName, newValue);
}
@Override
public String toString()
{
String propertyString = "";
for (Entry<String, Object> pair : properties.entrySet())
{
propertyString = propertyString
+ String.format("(Name: '%0$s' Value: '%1$s')", pair
.getKey(), pair.getValue());
}
String statsString = "";
for (Entry<String, Object> sPair : statistics.entrySet())
{
statsString = statsString
+ String.format("(Name: '%0$s' Value: '%1$s')", sPair
.getKey(), sPair.getValue());
}
if (managed)
{
return String
.format(
"Managed QMFObject %0$s:%1$s(%2$s) Properties: [%3$s] Statistics: [%4$s])",
getSchema().getPackageName(), getSchema()
.getClassName(), getObjectID(),
propertyString, statsString);
} else
{
return String
.format(
"QMFObject %0$s:%1$s Properties: [%2$s] Statistics: [%3$s]",
getSchema().getPackageName(), getSchema()
.getClassName(), propertyString,
statsString);
}
}
}