You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ar...@apache.org on 2008/09/29 14:02:56 UTC

svn commit: r700077 [4/4] - in /incubator/qpid/trunk/qpid/java: client/src/main/java/org/apache/qpid/management/ client/src/main/java/org/apache/qpid/management/configuration/ client/src/main/java/org/apache/qpid/management/domain/ client/src/main/java...

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/AbsTime.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/AbsTime.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/AbsTime.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/AbsTime.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class AbsTime extends Type
+{
+    public AbsTime()
+    {
+        super(Long.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return decoder.readUint64();
+    }
+
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUint64((Long)value);
+    }  
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Binary.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Binary.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Binary.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Binary.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,129 @@
+/*
+ *
+ * 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.type;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.UUID;
+
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+/**
+ * It is a simple wrapper for a byte array (for example a 128bin).
+ * It is used to let QMan deal with an object instead of an array.
+ * 
+ * @author Andrea Gazzarini
+ */
+public final class Binary implements Serializable
+{
+    private static final long serialVersionUID = -6865585077320637567L;
+
+    // instance identifider.
+    private final UUID uuid;
+    
+    // Marker internal (empty) interface 
+    private interface State extends Serializable{}
+    
+    /**
+     * Internal state of this object used to denote the situation when the hashcode() method has never been called.
+     * After the hashcode has been computed this class switches the state of the outer object to the next state. 
+     */
+    State hashCodeNotYetComputed = new State()
+    {
+        private static final long serialVersionUID = 221632033761266959L;
+
+    @Override
+       public int hashCode ()
+       {
+           hashCode = Arrays.hashCode(bytes);
+           state = hashCodeAlreadyComputed;
+           return hashCode;
+       } 
+    };
+    
+    /**
+     * Internal state of this object used to denote the situation where the hashcode() method has already been computed.
+     * Simply it returns the just computed value for the hashcode.
+     */
+    State hashCodeAlreadyComputed = new State() 
+    {
+        private static final long serialVersionUID = 221632033761266959L;
+        
+        @Override
+        public int hashCode ()
+        {
+            return hashCode;
+        }
+    };
+
+    private final byte [] bytes;
+    private int hashCode;
+    
+    /** Current state (hashcode computation). */
+    State state = hashCodeNotYetComputed;
+    
+    /**
+     * Builds a new binary with the given byte array.
+     * 
+     * @param bytes the wrapped data.
+     */
+    public Binary(byte [] bytes)
+    {
+        this.bytes = bytes;
+        uuid = UUID.randomUUID();
+    }
+    
+    @Override
+    public int hashCode ()
+    {
+        return state.hashCode();
+    }
+    
+    @Override
+    public boolean equals (Object obj)
+    {
+        try
+        {
+            Binary binary = (Binary)obj;
+            return Arrays.equals(bytes, binary.bytes);
+        } catch (Exception exception)
+        {
+            return false;
+        }
+    }
+    
+    /**
+     * Encodes the content (wrapped byte array) of this instance using the given encoder.
+     * 
+     * @param encoder the encoder used to encode instance content.
+     */
+    public void encode(ManagementEncoder encoder)
+    {
+      encoder.writeBin128(bytes);  
+    }
+    
+    // TODO
+    @Override
+    public String toString ()
+    {
+        return uuid.toString();
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Boolean.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Boolean.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Boolean.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Boolean.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Boolean extends Type
+{
+    public Boolean()
+    {
+        super(java.lang.Boolean.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return (decoder.readUint8() == 1);
+    }
+
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUint8( ((java.lang.Boolean)value) ? (short)1 : (short)0);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/DeltaTime.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/DeltaTime.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/DeltaTime.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/DeltaTime.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class DeltaTime extends Type
+{
+    public DeltaTime()
+    {
+        super(Long.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return decoder.readUint64();
+    }
+
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUint64((Long)value);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Map.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Map.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Map.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Map.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Map extends Type
+{
+    public Map()
+    {
+        super(java.util.Map.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return decoder.readMap();
+    }
+
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeMap((java.util.Map<String, Object>)value);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/ObjectReference.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/ObjectReference.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/ObjectReference.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/ObjectReference.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class ObjectReference extends Type
+{
+    public ObjectReference()
+    {
+        super(byte[].class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return decoder.readBin128();
+    }
+
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        ((Binary)value).encode(encoder);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str16.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str16.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str16.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str16.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Str16 extends Type
+{
+    public Str16()
+    {
+        super(String.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return decoder.readStr16();
+    }
+
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeStr16((String)value);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str8.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str8.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str8.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Str8.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Str8 extends Type
+{
+    public Str8()
+    {
+        super(String.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return  decoder.readStr8();
+    }
+    
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeStr8((String)value);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Type.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Type.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Type.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Type.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,95 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+/**
+ * Layer supertype for all management "types".
+ * 
+ * @author Andrea Gazzarini
+ */
+public abstract class Type
+{
+    /** Java representation of this type. */
+    protected final Class<?> javaType;
+    
+    /**
+     * Builds a new management type wiich wraps the given java type.
+     * 
+     * @param javaType the java type.
+     */
+    Type(Class<?> javaType)
+    {
+        this.javaType = javaType;
+    }
+
+    /**
+     * Returns the wrapped java type.
+     * 
+     * @return the wrapped java type.
+     */
+    public Class<?> getJavaType ()
+    {
+        return javaType;
+    }
+
+    /**
+     * Each concrete subclass must define here how to decode incoming data according.
+     * 
+     * @param decoder the decoder used to extract data.
+     * @return the "typed" value.
+     * 
+     */
+    public abstract Object decode(ManagementDecoder decoder);
+    
+    /**
+     * Returns a string representation of this type.
+     * 
+     * @return a string representation of this type.
+     */
+    @Override
+    public String toString ()
+    {
+        return new StringBuilder(getClass().getName())
+            .append(" (wraps ")
+            .append(javaType.getName())
+            .append(')').toString();
+    }
+    
+    /**
+     * Identity for types is based on wrapped java type identity.
+     */
+    @Override
+    public boolean equals (Object obj)
+    {
+        return getClass() == obj.getClass();
+    }
+    
+    @Override
+    public int hashCode ()
+    {
+        return getClass().hashCode();
+    }
+
+    public abstract void encode (Object value, ManagementEncoder encoder);
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint16.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint16.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint16.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint16.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Uint16 extends Type
+{
+    public Uint16()
+    {
+        super(Integer.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return new Integer(decoder.readUint16());
+    }
+    
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUint16((Integer)value);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint32.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint32.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint32.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint32.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Uint32 extends Type
+{
+    public Uint32()
+    {
+        super(Long.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return new Long(decoder.readUint32());
+    }
+    
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUint32((Integer)value);
+    }    
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint64.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint64.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint64.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint64.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Uint64 extends Type
+{
+    public Uint64()
+    {
+        super(Long.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return new Long(decoder.readUint64());
+    }
+    
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUint64((Integer)value);
+    }    
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint8.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint8.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint8.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uint8.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,44 @@
+/*
+ *
+ * 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.type;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Uint8 extends Type
+{
+    public Uint8()
+    {
+        super(Short.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return new Short(decoder.readUint8());
+    }
+    
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUint8((Short)value);
+    }    
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uuid.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uuid.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uuid.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/model/type/Uuid.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,46 @@
+/*
+ *
+ * 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.type;
+
+import java.util.UUID;
+
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.codec.ManagementEncoder;
+
+public class Uuid extends Type
+{
+    public Uuid()
+    {
+        super(UUID.class);
+    }
+
+    @Override
+    public Object decode (ManagementDecoder decoder)
+    {
+        return decoder.readUuid();
+    }
+    
+    @Override
+    public void encode (Object value, ManagementEncoder encoder)
+    {
+        encoder.writeUuid((UUID)value);
+    }    
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/BrokerMessageListener.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/BrokerMessageListener.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/BrokerMessageListener.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/BrokerMessageListener.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,181 @@
+/*
+ *
+ * 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.services;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.qpid.api.Message;
+import org.apache.qpid.management.Protocol;
+import org.apache.qpid.management.domain.handler.base.IMessageHandler;
+import org.apache.qpid.management.domain.model.DomainModel;
+import org.apache.qpid.nclient.util.MessageListener;
+import org.apache.qpid.transport.codec.ManagementDecoder;
+import org.apache.qpid.transport.util.Logger;
+
+/**
+ * Message listener used for processing incoming messages.
+ * So it is installed as a consumer on a specific channel and when a new message arrives: 
+ * 
+ * 1) Performs a sanity check on the message (magic number, sequence number)
+ * 2) Extracts the opcode and looks for one message handler associated with that opcode.
+ * 3) If a message handler is found the delegates the message processing; otherwise a log message is written to indicate
+ * that the message will be skipped.
+ * 
+ * @author Andrea Gazzarini
+ */
+class BrokerMessageListener implements MessageListener
+{
+    private  final static Logger LOGGER = Logger.get(BrokerMessageListener.class);
+    
+    private static class Log 
+    {            
+        // Debugs the content of the incoming message.
+        static void debugIncomingMessage(ByteBuffer message)
+        {
+            if (LOGGER.isDebugEnabled()) 
+            {
+                LOGGER.debug(
+                        "<QMAN-200006> : New incoming message has been received. Message content : %s", 
+                        Arrays.toString(message.array()));
+            }
+        }
+
+        // Debugs all the configured handlers.
+        static void debugConfiguredHandlers (Map<Character, IMessageHandler> _handlers)
+        {
+            if (LOGGER.isDebugEnabled())
+            {
+                for (Entry<Character, IMessageHandler> entry : _handlers.entrySet())
+                {
+                  LOGGER.debug("<QMAN-200007> : \"%s\" opcode is associated to handler %s",entry.getKey(),entry.getValue());  
+                }
+            }
+        }
+    }
+    
+    Map<Character, IMessageHandler> _handlers = new HashMap<Character, IMessageHandler>();
+    private DomainModel _domainModel;
+        
+    /**
+     * Builds a new message listener with the given  broker domain model.
+     * 
+     * @param model the managed broker domain model.
+     */
+    BrokerMessageListener(DomainModel model) 
+    {
+        this._domainModel = model;
+    }
+    
+    /**
+     * When a new message arrives this method is called. 
+     * 1) Performs a sanity check on the message (magic number, sequence number)
+     * 2) Extracts the opcode and looks for one message handler associated with that opcode.
+     * 3) If a message handler is found the delegates the message processing; otherwise a log message is written to indicate
+     * that the message will be skipped.
+     * 
+     * @param message the incoming message.
+     */
+    public void onMessage (Message message)
+    {
+        try 
+        { 
+            ByteBuffer buffer = message.readData();
+
+            // TODO : Should be better...!
+            String magicNumber = new String(new byte[] {buffer.get(),buffer.get(),buffer.get()});
+            if (!Protocol.MAGIC_NUMBER.equals(magicNumber))
+            {
+                LOGGER.error(
+                        "<QMAN-100003> : Message processing failure : incoming message contains a bad magic number (%s) " +
+                        "and therefore will be discaded.", 
+                        magicNumber);
+                return;
+            }
+            
+            char opcode = (char)buffer.get();
+            
+            IMessageHandler handler = _handlers.get(opcode); 
+            if (handler != null) 
+            {
+                ManagementDecoder decoder = new ManagementDecoder();
+                decoder.init(buffer);
+                
+                LOGGER.debug(
+                        "<QMAN-200008> : Incoming message with \"%s\" as opcode will be forwarded to %s for processing.", 
+                        opcode, 
+                        handler);
+                
+                handler.process(decoder,decoder.readSequenceNo());
+            } else 
+            {
+                LOGGER.warn(
+                        "<QMAN-300001> : No handler has been configured for processing messages with \"%s\" as opcode. " +
+                            "This message will be discarded.",
+                         opcode);                                      
+                
+                Log.debugConfiguredHandlers(_handlers);
+            }
+        } catch(IOException exception) 
+        {
+           LOGGER.error(
+                   exception,
+                   "<QMAN-100004> : Message I/O failure : unable to read byte message content and therefore it will be discarded.");                        
+        } catch(Exception exception) 
+        {
+            LOGGER.error(
+                    exception,
+                    "<QMAN-100005> : Message processing failure : unknown exception; see logs for more details.");            
+        }    
+    }
+    
+    /**
+     * Configures a new handler with this listener.
+     * After that, each time a message arrives with the specified opcode, this handler will be responsible for 
+     * processing.
+     * Note that calling this method will switch this listener to a WORKING state.
+     * 
+     * @param opcode the operation code.
+     * @param handler the message handler.
+     */
+    void setHandlers(Map<Character, IMessageHandler> handlers)
+    {
+        for (Entry<Character, IMessageHandler> entry : handlers.entrySet())
+        {
+            char opcode = entry.getKey();
+            IMessageHandler handler = entry.getValue();
+            try 
+            {
+                handler.setDomainModel(_domainModel);
+                _handlers.put(opcode, handler);
+            } catch(Exception exception) {
+                LOGGER.error(
+                        exception, 
+                        "<QMAN-100006> : Message handler configured for opcode %s thrown an exception in initialization and therefore will be discarded.", 
+                        opcode);
+            }
+        }        
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/ManagementClient.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/ManagementClient.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/ManagementClient.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/ManagementClient.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,256 @@
+/*
+ *
+ * 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.services;
+
+import java.util.UUID;
+
+import org.apache.qpid.QpidException;
+import org.apache.qpid.management.Names;
+import org.apache.qpid.management.configuration.BrokerConnectionData;
+import org.apache.qpid.management.configuration.Configuration;
+import org.apache.qpid.management.domain.model.DomainModel;
+import org.apache.qpid.transport.util.Logger;
+
+/**
+ * This is the Object representation of a management client.
+ * According to specification : "A software component that is separate from the messaging broker, connected to the 
+ * management broker via an AMQP connection, which allows any software component to be managed remotely by QPID."
+ *
+ * @author Andrea Gazzarini
+ */
+final class ManagementClient
+{      
+    private final static Logger LOGGER = Logger.get(ManagementClient.class);
+    
+    private final String _managementQueueName;
+    private final String _methodReplyQueueName;
+    
+    private DomainModel _domainModel;
+    private QpidService _service;
+    
+    /**
+     * Builds a new <code>ManagementClient</code> with the given identifier and connection data.
+     * 
+     * @param brokerId the broker identifier.
+     * @param connectionData the broker connection data (host, port, etc...)
+     */
+    ManagementClient(UUID brokerId,BrokerConnectionData connectionData)
+    {
+        _service = new QpidService(brokerId);
+        _domainModel = new DomainModel(brokerId);
+        _managementQueueName = Configuration.getInstance().getManagementQueueName();
+        _methodReplyQueueName = Configuration.getInstance().getMethodReplyQueueName();
+    }
+
+    /**
+     * Establishing initial communication Between Client and Broker.
+     * According to specification :
+     * "Communication is established between the management client and management agent using normal AMQP procedures. 
+     * The client creates a connection to the broker and then establishes a session with its corresponding channel.
+     * Two private queues are then declared. 
+     * A management queue is declared and bound to the qpid.management exchange with "mgmt.#" as routing key; in that 
+     * way all management-related messages sent to the exchange will be received by this client. 
+     * When a client successfully binds to the qpid.management exchange, the management agent schedules a schema 
+     * broadcast to be sent to the exchange. 
+     * The agent will publish, via the exchange, a description of the schema for all manageable objects in its control. That 
+     * schema is therefore received by this service and it will be part of service's domain model."
+     * 
+     * @throws StartupFailureException when this management client cannot perform startup operations due to an error.
+     */
+    void estabilishFirstConnectionWithBroker() throws StartupFailureException{
+        try {
+            connectWithBroker();
+            
+            createAndBindMethodReplyQueue();
+            createAndBindManagementQueue();
+                    
+            registerConsumerOnManagementQueue();
+            registerConsumerOnMethodReplyQueue();
+            
+            synchronize();
+        } catch(Exception exception) 
+        {
+            try {
+                _service.close();
+            } catch(Exception ignore) 
+            {                
+            }            
+            throw new StartupFailureException(exception);
+        }
+    }
+
+    /**
+     * Shutdown procedure for this management client.
+     */
+    void shutdown ()
+    {        
+        LOGGER.info(
+                "<QMAN-000033> : The shutdown sequence has been initiated for management client connected with broker %s",
+                _domainModel.getBrokerId());
+        
+        removeMethodReplyConsumer();
+        destroyAndUnbingMethodReplyQueue();
+        
+        removeManagementConsumer();
+        destroyAndUnbingManagementQueue();
+        
+        _domainModel.releaseResources();
+        
+        _service.close();
+
+        LOGGER.info(
+                "<QMAN-000034> : Management client connected with broker %s shut down successfully.",
+                _domainModel.getBrokerId());
+    }
+
+    /**
+     * Registers a consumer (that is, a listener) on the method-reply queue.
+     */
+    private void registerConsumerOnMethodReplyQueue ()
+    {
+        BrokerMessageListener methodReplyChannelListener = new BrokerMessageListener(_domainModel);
+        methodReplyChannelListener.setHandlers(Configuration.getInstance().getMethodReplyQueueHandlers());
+        _service.createSubscription(_methodReplyQueueName, _methodReplyQueueName, methodReplyChannelListener);
+        
+        LOGGER.info(
+                "<QMAN-000039> : Method-reply queue consumer has been successfully installed and bound on broker %s.", 
+                _domainModel.getBrokerId());             
+    }
+
+    /**
+     * Registers a consumer (listener) on the management queue.
+     */
+    private void registerConsumerOnManagementQueue () throws QpidException
+    {  
+        BrokerMessageListener managementChannelListener = new BrokerMessageListener(_domainModel);
+        managementChannelListener.setHandlers(Configuration.getInstance().getManagementQueueHandlers());        
+        _service.createSubscription(_managementQueueName, _managementQueueName, managementChannelListener);
+        
+        LOGGER.info(
+                "<QMAN-000038> : Management queue consumer has been successfully installed and bound on broker %s.", 
+                _domainModel.getBrokerId());               
+    }
+
+    /**
+     * Declares a management queue and bound it to the "qpid.management" exchange with "mgmt.#" as routing key; 
+     */
+    private void createAndBindManagementQueue ()
+    {
+        _service.declareQueue(_managementQueueName);
+        _service.declareBinding(
+                _managementQueueName, 
+                Names.MANAGEMENT_EXCHANGE, 
+                Names.MANAGEMENT_ROUTING_KEY);
+
+        LOGGER.info(
+                "<QMAN-000037> : Management queue with name %s has been successfully declared and bound on broker %s.", 
+                _managementQueueName,
+                _domainModel.getBrokerId());       
+    }
+    
+    /**
+     * Declares a private queue for receiving method replies (after method invocations). 
+     * This queue is bound to the amq.direct exchange using a routing key equal to the name of the queue.
+     */
+    private void createAndBindMethodReplyQueue ()
+    {
+        _service.declareQueue(_methodReplyQueueName);
+        _service.declareBinding(_methodReplyQueueName, Names.AMQ_DIRECT_QUEUE, _methodReplyQueueName);
+        
+        LOGGER.info(
+                "<QMAN-000037> : Method-reply queue with name %s has been successfully declared and bound on broker %s.", 
+                _methodReplyQueueName,
+                _domainModel.getBrokerId());       
+    }    
+    
+    /**
+     * Removes the method-reply queue consumer. 
+     */
+    private void removeMethodReplyConsumer()
+    {
+        _service.removeSubscription(_methodReplyQueueName); 
+        
+        LOGGER.info(
+                "<QMAN-000034> : Consumer %s has been removed from broker %s.", 
+                _methodReplyQueueName,
+                _domainModel.getBrokerId());
+    }
+    
+    /**
+     * Unbind the method reply queue and after that destroy it from remote broker.
+     */
+    private void destroyAndUnbingMethodReplyQueue()
+    {
+        _service.declareUnbinding(_methodReplyQueueName, Names.AMQ_DIRECT_QUEUE, _methodReplyQueueName);
+        _service.deleteQueue(_methodReplyQueueName);        
+        
+        LOGGER.info(
+                "<QMAN-000035> : Queue %s has been removed from broker %s.", 
+                _methodReplyQueueName,
+                _domainModel.getBrokerId());
+    }
+    
+    /**
+     * Removes the management queue consumer. 
+     */
+    private void removeManagementConsumer()
+    {
+        _service.removeSubscription(_managementQueueName);  
+
+        LOGGER.info(
+                "<QMAN-000036> : Consumer %s has been removed from broker %s.", 
+                _managementQueueName,
+                _domainModel.getBrokerId());
+    }
+    
+    /**
+     * Unbind the management queue and after that destroy it from remote broker.
+     */
+    private void destroyAndUnbingManagementQueue()
+    {
+        _service.declareUnbinding(_managementQueueName, Names.MANAGEMENT_EXCHANGE, Names.MANAGEMENT_ROUTING_KEY);
+        _service.deleteQueue(_managementQueueName);        
+
+        LOGGER.info(
+                "<QMAN-000037> : Queue %s has been removed from broker %s.", 
+                _managementQueueName,
+                _domainModel.getBrokerId());
+    }    
+    
+    /**
+     * Connects this client with the broker.
+     * 
+     * @throws QpidException when it's not possibile to connect with the broker.
+     */
+    private void connectWithBroker() throws Exception 
+    {
+        _service.connect();
+    }
+
+    /**
+     * All the Management client commands are asynchronous. 
+     * Synchronous behavior is achieved through invoking the sync method.
+     */
+    private void synchronize() 
+    {
+        _service.sync();
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QMan.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QMan.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QMan.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QMan.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,103 @@
+/*
+ *
+ * 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.services;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.Map.Entry;
+
+import org.apache.qpid.management.configuration.BrokerConnectionData;
+import org.apache.qpid.management.configuration.Configuration;
+import org.apache.qpid.management.configuration.ConfigurationException;
+import org.apache.qpid.management.configuration.Configurator;
+import org.apache.qpid.transport.util.Logger;
+
+/**
+ * Main entry point for starting Q-Man application.
+ * 
+ * @author Andrea Gazzarini
+ */
+public class QMan
+{
+    private final static Logger LOGGER = Logger.get(QMan.class);
+    private final static List<ManagementClient> managementClients = new ArrayList<ManagementClient>();
+    
+    /**
+     * Main method used for starting Q-Man.
+     * 
+     * @param args the command line arguments.
+     */
+    public static void main (String[] args) throws IOException
+    {  
+        // SHUTDOWN HOOK
+        Runtime.getRuntime().addShutdownHook(new Thread(){
+            @Override
+            public void run ()
+            {
+                LOGGER.info("<QMAN-000006> : Shutting down Q-Man...");
+                for (ManagementClient client : managementClients)
+                {   
+                    client.shutdown();  
+                }
+                LOGGER.info("<QMAN-000007> : Q-Man shut down.");                
+            }
+        });
+        
+        LOGGER.info("<QMAN-000001> : Starting Q-Man...");
+        LOGGER.info("<QMAN-000002> : Reading Q-Man configuration...");
+        
+        Configurator configurator = new Configurator();
+        try
+        {
+            configurator.configure();            
+            LOGGER.info("<QMAN-000003> : Creating management client(s)...");
+            for (Entry<UUID, BrokerConnectionData> entry : Configuration.getInstance().getConnectionInfos())
+            {
+                UUID brokerId = entry.getKey();
+                BrokerConnectionData data = entry.getValue();
+                try 
+                {
+                    ManagementClient client = new ManagementClient(brokerId,data);
+                    managementClients.add(client);
+                    client.estabilishFirstConnectionWithBroker();
+                    
+                    LOGGER.info("<QMAN-000004> : Management client for broker %s successfully connected.",brokerId);
+                } catch(StartupFailureException exception) {
+                    LOGGER.error(exception, "<QMAN-100001>: Cannot connect to broker %s on %s:%s",brokerId,data.getHost(),data.getPort());
+                }
+            }
+            LOGGER.info("<QMAN-000004> : Q-Man open for e-business.");
+
+            // TODO : console enhancement (i.e. : connect another broker)
+            System.out.println("Type \"q\" to quit.");
+            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
+            while ( !"q".equals(reader.readLine()) ){
+            }
+       } catch(ConfigurationException exception) {
+            LOGGER.error(exception, "<QMAN-100002> : Q-Man was unable to startup correctly : a configuration error occurred.");
+            System.exit(1);
+        } 
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QpidService.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QpidService.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QpidService.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/QpidService.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,270 @@
+/*
+ *
+ * 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.services;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.UUID;
+
+import org.apache.qpid.QpidException;
+import org.apache.qpid.management.Constants;
+import org.apache.qpid.management.Names;
+import org.apache.qpid.management.configuration.Configuration;
+import org.apache.qpid.management.configuration.QpidDatasource;
+import org.apache.qpid.nclient.Connection;
+import org.apache.qpid.nclient.Session;
+import org.apache.qpid.nclient.util.MessageListener;
+import org.apache.qpid.nclient.util.MessagePartListenerAdapter;
+import org.apache.qpid.transport.MessageAcceptMode;
+import org.apache.qpid.transport.MessageAcquireMode;
+import org.apache.qpid.transport.MessageCreditUnit;
+import org.apache.qpid.transport.Option;
+import org.apache.qpid.transport.util.Logger;
+
+/**
+ * Qpid Broker facade.
+ * 
+ * @author Andrea Gazzarini
+ */
+public class QpidService
+{
+    private final static Logger LOGGER = Logger.get(QpidService.class);
+
+    // Inner static class used for logging and avoid conditional logic (isDebugEnabled()) duplication.
+    private static class Log 
+    {            
+        /**
+         * Logs the content f the message.
+         * This will be written on log only if DEBUG level is enabled.
+         * 
+         * @param messageContent the raw content of the message.
+         */
+        static void logMessageContent(byte [] messageContent) 
+        {
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug(
+                        "<QMAN-200001> : Message has been sent to management exchange. Message content : %s",
+                        Arrays.toString(messageContent));
+            }
+        }
+        
+        /**
+         * Logs the content f the message.
+         * This will be written on log only if DEBUG level is enabled.
+         * 
+         * @param messageContent the raw content of the message.
+         */
+        static void logMessageContent(ByteBuffer messageContent) 
+        {
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug(
+                        "<QMAN-200002> : Message has been sent to management exchange.");
+            }
+        }        
+    }
+    
+    private UUID _brokerId;
+    private Connection _connection;
+    private Session _session;
+    
+    /**
+     * Builds a new service with the given connection data.
+     * 
+     * @param connectionData the connection data of the broker.
+     */
+    public QpidService(UUID brokerId) 
+    {
+        this._brokerId = brokerId;
+    }
+    
+    /**
+     * Estabilishes a connection with the broker.
+     * 
+     * @throws QpidException in case of connection failure.
+     */
+    public void connect() throws Exception
+    {
+        _connection = QpidDatasource.getInstance().getConnection(_brokerId);
+        _session = _connection.createSession(Constants.NO_EXPIRATION);
+    }
+    
+    /**
+     * All the previously entered outstanding commands are asynchronous. 
+     * Synchronous behavior is achieved through invoking this  method.
+     */
+    public void sync() 
+    {
+        _session.sync();
+    }
+    
+    /**
+     * Closes communication with broker.
+     */
+    public void close()
+    {
+        try
+        {
+            _session.close();
+            _session = null;
+        } catch (Exception e)
+        {
+        }
+        try
+        {
+            _connection.close();        
+            _connection = null;
+        } catch (Exception e)
+        {
+        }
+    }
+    
+    /**
+     * Associate a message listener with a destination therefore creating a new subscription.
+     * 
+     * @param queueName The name of the queue that the subscriber is receiving messages from.
+     * @param destinationName the name of the destination, or delivery tag, for the subscriber.
+     * @param listener the listener for this destination. 
+     * 
+     * @see Session#messageSubscribe(String, String, short, short, org.apache.qpid.nclient.MessagePartListener, java.util.Map, org.apache.qpid.transport.Option...)
+     */
+    public void createSubscription(String queueName, String destinationName,MessageListener listener)
+    {
+        _session.messageSubscribe(
+                queueName,
+                destinationName,
+                Session.TRANSFER_CONFIRM_MODE_NOT_REQUIRED,
+                Session.TRANSFER_ACQUIRE_MODE_PRE_ACQUIRE,
+                new MessagePartListenerAdapter(listener), null);
+        
+        _session.messageFlow(destinationName, MessageCreditUnit.BYTE, Session.MESSAGE_FLOW_MAX_BYTES);
+        _session.messageFlow(destinationName, MessageCreditUnit.MESSAGE, Integer.MAX_VALUE);
+        
+        LOGGER.debug(
+                "<QMAN-200003> : New subscription between queue %s and destination %s has been declared.", 
+                queueName,
+                destinationName);
+    }
+    
+    /**
+     * Removes a previously declared consumer from the broker.
+     * 
+     * @param destinationName the name of the destination, or delivery tag, for the subscriber.
+     * @see Session#messageCancel(String, Option...)
+     */
+    public void removeSubscription(String destinationName)
+    {
+        _session.messageCancel(destinationName);
+        LOGGER.debug(
+                "<QMAN-200026> : Subscription named %s has been removed from remote broker.", 
+                destinationName);
+    }    
+    
+    /**
+     * Declares a queue on the broker with the given name.
+     *
+     * @param queueName the name of the declared queue.
+     * @see Session#queueDeclare(String, String, java.util.Map, Option...)
+     */
+    public void declareQueue(String queueName)
+    {
+        _session.queueDeclare(queueName, null, null);
+        LOGGER.debug("<QMAN-200004> : New queue with name %s has been declared.",queueName);
+    }
+
+    /**
+     * Removes the queue with the given name from the broker.
+     *
+     * @param queueName the name of the queue.
+     * @see Session#queueDelete(String, Option...)
+     */
+    public void deleteQueue(String queueName)
+    {
+        _session.queueDelete(queueName);
+        LOGGER.debug("<QMAN-2000025> : Queue with name %s has been removed.",queueName);
+    }
+    
+    /**
+     * Binds (on the broker) a queue with an exchange.
+     *
+     * @param queueName the name of the queue to bind. 
+     * @param exchangeName the exchange name.
+     * @param routingKey the routing key used for the binding. 
+     * @see Session#exchangeBind(String, String, String, java.util.Map, Option...)
+     */
+    public void declareBinding(String queueName, String exchangeName, String routingKey)
+    {
+        _session.exchangeBind(queueName, exchangeName, routingKey, null);
+        LOGGER.debug(
+                "<QMAN-200005> : New binding with %s as routing key has been declared between queue %s and exchange %s.", 
+                routingKey,queueName,
+                exchangeName);
+    }
+    
+    /**
+     * Removes a previously declare binding between an exchange and a queue.
+     * 
+     * @param queueName the name of the queue.
+     * @param exchangeName the name of the exchange.
+     * @param routingKey the routing key used for binding.
+     */
+    public void declareUnbinding(String queueName, String exchangeName, String routingKey)
+    {
+        _session.exchangeUnbind(queueName, exchangeName, routingKey);
+        LOGGER.debug(
+                "<QMAN-200005> : Binding with %s as routing key has been removed between queue %s and exchange %s.", 
+                routingKey,queueName,
+                exchangeName);
+    }
+    
+    /**
+     * Sends a command message with the given data on the management queue.
+     * 
+     * @param messageData the command message content.
+     */
+    public void sendCommandMessage(byte [] messageData) 
+    {
+        _session.messageTransfer(
+                Names.MANAGEMENT_EXCHANGE,
+                MessageAcceptMode.EXPLICIT,
+                MessageAcquireMode.PRE_ACQUIRED,
+                Configuration.getInstance().getCommandMessageHeader(),
+                messageData);     
+        
+        Log.logMessageContent (messageData);
+    }
+    
+    /**
+     * Sends a command message with the given data on the management queue.
+     * 
+     * @param messageData the command message content.
+     */
+    public void sendCommandMessage(ByteBuffer messageData) 
+    {
+        _session.messageTransfer(
+                Names.MANAGEMENT_EXCHANGE,
+                MessageAcceptMode.EXPLICIT,
+                MessageAcquireMode.PRE_ACQUIRED,
+                Configuration.getInstance().getCommandMessageHeader(),
+                messageData);     
+        
+        Log.logMessageContent (messageData);
+    }    
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/StartupFailureException.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/StartupFailureException.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/StartupFailureException.java (added)
+++ incubator/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/management/domain/services/StartupFailureException.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,42 @@
+/*
+ *
+ * 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.services;
+
+/**
+ * Thrown in case of service startup failure.
+ * For example the configuration file couldn't be read because is not well-formed.
+ * 
+ * @author Andrea Gazzarini.
+ */
+public class StartupFailureException extends Exception
+{
+    private static final long serialVersionUID = -4102037574602857703L;
+
+    /**
+     * Builds a new StartupFailureException with the given exception.
+     * 
+     * @param exception the exception cause.
+     */
+    public StartupFailureException(Exception exception)
+    {
+        super(exception);
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementDecoder.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementDecoder.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementDecoder.java (added)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementDecoder.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,109 @@
+package org.apache.qpid.transport.codec;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+import java.util.UUID;
+
+
+/*
+ * Extends BBDecoder to add some additional methods.
+ *
+ * FIXME (Gazza) : I don't like very much this class...this code should be part of BBDecoder
+ */
+public class ManagementDecoder
+{
+    private BBDecoder _decoder;
+    private ByteBuffer _buffer;
+
+    public void init(ByteBuffer buffer)
+    {
+        this._buffer = buffer;
+        this._decoder = new BBDecoder();
+        _decoder.init(_buffer);
+    }
+
+    public byte[] readReaminingBytes ()
+    {
+        byte[] result = new byte[_buffer.limit() - _buffer.position()];
+        _decoder.get(result);
+        return result;
+    }
+
+    public byte[] readBin128() {
+        byte[] result = new byte[16];
+        _decoder.get(result);
+        return result;
+    }
+
+    public byte[] readBytes (int howMany)
+    {
+        byte [] result = new byte[howMany];
+        _decoder.get(result);
+        return result;
+    }
+
+    public long readDatetime ()
+    {
+        return _decoder.readDatetime();
+    }
+
+    public Map<String, Object> readMap ()
+    {
+        return _decoder.readMap();
+    }
+
+    public int readSequenceNo ()
+    {
+        return _decoder.readSequenceNo();
+    }
+
+    public String readStr16 ()
+    {
+        return _decoder.readStr16();
+    }
+
+    public String readStr8 ()
+    {
+        return _decoder.readStr8();
+    }
+
+    public int readUint16 ()
+    {
+        return _decoder.readUint16();
+    }
+
+    public long readUint32 ()
+    {
+        return _decoder.readUint32();
+    }
+
+    public long readUint64 ()
+    {
+        return _decoder.readUint64();
+    }
+
+    public short readUint8 ()
+    {
+        return _decoder.readUint8();
+    }
+
+    public UUID readUuid ()
+    {
+        return _decoder.readUuid();
+    }
+
+    public byte[] readVbin16 ()
+    {
+        return _decoder.readVbin16();
+    }
+
+    public byte[] readVbin32 ()
+    {
+        return _decoder.readVbin32();
+    }
+
+    public byte[] readVbin8 ()
+    {
+        return _decoder.readVbin8();
+    }
+}
\ No newline at end of file

Added: incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementEncoder.java
URL: http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementEncoder.java?rev=700077&view=auto
==============================================================================
--- incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementEncoder.java (added)
+++ incubator/qpid/trunk/qpid/java/common/src/main/java/org/apache/qpid/transport/codec/ManagementEncoder.java Mon Sep 29 05:02:54 2008
@@ -0,0 +1,86 @@
+package org.apache.qpid.transport.codec;
+
+
+import java.nio.ByteBuffer;
+
+import org.apache.qpid.transport.codec.AbstractEncoder;
+
+/*
+ * @author rahulapi@gmailcom
+ *
+ * Management Encoder extends the basic java encoer (AbastractEncoder)
+ * its a java encoder we use to encode the incoming messages
+ * (encode the fields of the message)
+ *
+ * TODO (Gazza) : I don't like very much this class...this code should be part of BBDecoder
+ */
+public class ManagementEncoder extends AbstractEncoder{
+
+
+	public  ByteBuffer _out=null;
+
+	public ManagementEncoder(ByteBuffer out)
+	{
+
+		_out = out;
+	}
+
+	protected void doPut(byte b)
+	{
+		_out.put(b);
+	}
+
+	protected void doPut(ByteBuffer src)
+	{
+		_out.put(src);
+	}
+
+	public void writeBin128(byte[] s)
+	{
+		if(s==null)
+		{
+			s=new byte[16];
+
+		}else if(s.length!=16){
+			throw new IllegalArgumentException(""+s);
+		}
+		put(s);
+	}
+
+	@Override
+	protected int beginSize16() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	protected int beginSize32() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	protected int beginSize8() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	protected void endSize16(int pos) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	protected void endSize32(int pos) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	protected void endSize8(int pos) {
+		// TODO Auto-generated method stub
+
+	}
+
+}
\ No newline at end of file