JBoss hornetq SVN: r10747 - trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-27 07:45:21 -0400 (Fri, 27 May 2011)
New Revision: 10747
Modified:
trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalCompactTest.java
trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalImplTest.java
Log:
HORNETQ-698 Fix JournalConstants references
Modified: trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalCompactTest.java
===================================================================
--- trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalCompactTest.java 2011-05-27 11:35:32 UTC (rev 10746)
+++ trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalCompactTest.java 2011-05-27 11:45:21 UTC (rev 10747)
@@ -17,9 +17,9 @@
import junit.framework.TestSuite;
-import org.hornetq.core.config.impl.ConfigurationImpl;
import org.hornetq.core.journal.SequentialFileFactory;
import org.hornetq.core.journal.impl.AIOSequentialFileFactory;
+import org.hornetq.core.journal.impl.JournalConstants;
import org.hornetq.tests.util.UnitTestCase;
/**
@@ -60,7 +60,7 @@
file.mkdir();
return new AIOSequentialFileFactory(getTestDir(),
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
1000000,
false);
}
Modified: trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalImplTest.java
===================================================================
--- trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalImplTest.java 2011-05-27 11:35:32 UTC (rev 10746)
+++ trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/journal/AIOJournalImplTest.java 2011-05-27 11:45:21 UTC (rev 10747)
@@ -19,20 +19,20 @@
import junit.framework.TestSuite;
import org.hornetq.core.asyncio.impl.AsynchronousFileImpl;
-import org.hornetq.core.config.impl.ConfigurationImpl;
import org.hornetq.core.journal.SequentialFileFactory;
import org.hornetq.core.journal.impl.AIOSequentialFileFactory;
+import org.hornetq.core.journal.impl.JournalConstants;
import org.hornetq.core.logging.Logger;
import org.hornetq.tests.unit.core.journal.impl.JournalImplTestUnit;
import org.hornetq.tests.util.UnitTestCase;
/**
- *
+ *
* A RealJournalImplTest
* you need to define -Djava.library.path=${project-root}/native/src/.libs when calling the JVM
* If you are running this test in eclipse you should do:
* I - Run->Open Run Dialog
- * II - Find the class on the list (you will find it if you already tried running this testcase before)
+ * II - Find the class on the list (you will find it if you already tried running this testcase before)
* III - Add -Djava.library.path=<your project place>/native/src/.libs
*
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
@@ -72,7 +72,7 @@
file.mkdir();
return new AIOSequentialFileFactory(getTestDir(),
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
1000000,
false);
}
13 years, 7 months
JBoss hornetq SVN: r10746 - trunk/hornetq-journal.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-27 07:35:32 -0400 (Fri, 27 May 2011)
New Revision: 10746
Modified:
trunk/hornetq-journal/pom.xml
Log:
HORNETQ-698 Adjust dependency type
Modified: trunk/hornetq-journal/pom.xml
===================================================================
--- trunk/hornetq-journal/pom.xml 2011-05-26 17:19:55 UTC (rev 10745)
+++ trunk/hornetq-journal/pom.xml 2011-05-27 11:35:32 UTC (rev 10746)
@@ -21,7 +21,6 @@
<groupId>org.hornetq</groupId>
<artifactId>hornetq-commons</artifactId>
<version>${project.version}</version>
- <scope>provided</scope>
</dependency>
</dependencies>
13 years, 7 months
JBoss hornetq SVN: r10745 - trunk/etc.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 13:19:55 -0400 (Thu, 26 May 2011)
New Revision: 10745
Modified:
trunk/etc/org.eclipse.jdt.core.prefs
trunk/etc/org.eclipse.jdt.ui.prefs
Log:
Eclipse formatter settings set to always format Javadoc.
Modified: trunk/etc/org.eclipse.jdt.core.prefs
===================================================================
--- trunk/etc/org.eclipse.jdt.core.prefs 2011-05-26 16:28:28 UTC (rev 10744)
+++ trunk/etc/org.eclipse.jdt.core.prefs 2011-05-26 17:19:55 UTC (rev 10745)
@@ -1,4 +1,4 @@
-#Tue May 10 16:33:23 CEST 2011
+#Thu May 26 18:16:51 CEST 2011
eclipse.preferences.version=1
org.eclipse.jdt.core.codeComplete.argumentPrefixes=
org.eclipse.jdt.core.codeComplete.argumentSuffixes=
@@ -26,14 +26,14 @@
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=82
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=82
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=82
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=82
-org.eclipse.jdt.core.formatter.alignment_for_assignment=82
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_assignment=32
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=82
org.eclipse.jdt.core.formatter.alignment_for_compact_if=82
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=82
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=82
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=82
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=32
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=82
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=82
@@ -70,14 +70,14 @@
org.eclipse.jdt.core.formatter.comment.format_block_comments=false
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=false
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
org.eclipse.jdt.core.formatter.comment.format_line_comments=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
-org.eclipse.jdt.core.formatter.comment.line_length=120
+org.eclipse.jdt.core.formatter.comment.line_length=100
org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
org.eclipse.jdt.core.formatter.compact_else_if=true
Modified: trunk/etc/org.eclipse.jdt.ui.prefs
===================================================================
--- trunk/etc/org.eclipse.jdt.ui.prefs 2011-05-26 16:28:28 UTC (rev 10744)
+++ trunk/etc/org.eclipse.jdt.ui.prefs 2011-05-26 17:19:55 UTC (rev 10745)
@@ -1,4 +1,4 @@
-#Tue May 24 16:58:44 CEST 2011
+#Thu May 26 18:07:06 CEST 2011
cleanup.add_default_serial_version_id=false
cleanup.add_generated_serial_version_id=true
cleanup.add_missing_annotations=true
@@ -53,7 +53,7 @@
cleanup_settings_version=2
eclipse.preferences.version=1
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_JBM
+formatter_profile=_'JBM'
formatter_settings_version=11
org.eclipse.jdt.ui.exception.name=e
org.eclipse.jdt.ui.gettersetter.use.is=true
13 years, 7 months
JBoss hornetq SVN: r10744 - trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 12:28:28 -0400 (Thu, 26 May 2011)
New Revision: 10744
Modified:
trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/UnitTestCase.java
Log:
Use class objects instead of hardcoded classnames.
Modified: trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/UnitTestCase.java
===================================================================
--- trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/UnitTestCase.java 2011-05-26 16:18:41 UTC (rev 10743)
+++ trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/UnitTestCase.java 2011-05-26 16:28:28 UTC (rev 10744)
@@ -65,7 +65,11 @@
import org.hornetq.core.postoffice.PostOffice;
import org.hornetq.core.postoffice.QueueBinding;
import org.hornetq.core.postoffice.impl.LocalQueueBinding;
+import org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory;
+import org.hornetq.core.remoting.impl.invm.InVMConnectorFactory;
import org.hornetq.core.remoting.impl.invm.InVMRegistry;
+import org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory;
+import org.hornetq.core.remoting.impl.netty.NettyConnectorFactory;
import org.hornetq.core.server.HornetQServer;
import org.hornetq.core.server.JournalType;
import org.hornetq.core.server.MessageReference;
@@ -90,13 +94,13 @@
private static final Logger log = Logger.getLogger(UnitTestCase.class);
- public static final String INVM_ACCEPTOR_FACTORY = "org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory";
+ public static final String INVM_ACCEPTOR_FACTORY = InVMAcceptorFactory.class.getCanonicalName();
- public static final String INVM_CONNECTOR_FACTORY = "org.hornetq.core.remoting.impl.invm.InVMConnectorFactory";
+ public static final String INVM_CONNECTOR_FACTORY = InVMConnectorFactory.class.getCanonicalName();
- public static final String NETTY_ACCEPTOR_FACTORY = "org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory";
+ public static final String NETTY_ACCEPTOR_FACTORY = NettyAcceptorFactory.class.getCanonicalName();
- public static final String NETTY_CONNECTOR_FACTORY = "org.hornetq.core.remoting.impl.netty.NettyConnectorFactory";
+ public static final String NETTY_CONNECTOR_FACTORY = NettyConnectorFactory.class.getCanonicalName();
// Attributes ----------------------------------------------------
@@ -211,7 +215,7 @@
return System.getProperty("TEST-UDP-ADDRESS", "230.1.2.3");
}
- protected static String getUDPDiscoveryAddress(int variant)
+ protected static String getUDPDiscoveryAddress(final int variant)
{
String value = getUDPDiscoveryAddress();
@@ -274,7 +278,7 @@
}
}
- public static void forceGC(Reference<?> ref, long timeout)
+ public static void forceGC(final Reference<?> ref, final long timeout)
{
long waitUntil = System.currentTimeMillis() + timeout;
// A loop that will wait GC, using the minimal time as possible
@@ -859,7 +863,7 @@
protected void setUp() throws Exception
{
super.setUp();
-
+
OperationContextImpl.clearContext();
deleteDirectory(new File(getTestDir()));
@@ -887,12 +891,12 @@
if (stackTraceElement.getMethodName().contains("getConnectionWithRetry") && !alreadyFailedThread.contains(thread))
{
alreadyFailedThread.add(thread);
- System.out.println(threadDump(this.getName() + " has left threads running. Look at thread " +
+ System.out.println(threadDump(getName() + " has left threads running. Look at thread " +
thread.getName() +
" id = " +
thread.getId() +
" has running locators on test " +
- this.getName() +
+ getName() +
" on this following dump"));
fail("test left serverlocator running, this could effect other tests");
// System.exit(0);
@@ -900,12 +904,12 @@
else if (stackTraceElement.getMethodName().contains("BroadcastGroupImpl.run") && !alreadyFailedThread.contains(thread))
{
alreadyFailedThread.add(thread);
- System.out.println(threadDump(this.getName() + " has left threads running. Look at thread " +
+ System.out.println(threadDump(getName() + " has left threads running. Look at thread " +
thread.getName() +
" id = " +
thread.getId() +
" is still broadcasting " +
- this.getName() +
+ getName() +
" on this following dump"));
fail("test left broadcastgroupimpl running, this could effect other tests");
// System.exit(0);
@@ -920,10 +924,10 @@
{
StringBuffer buffer = new StringBuffer();
-
+
buffer.append("*********************************************************************************\n");
buffer.append("LEAKING THREADS\n");
-
+
for (Thread aliveThread : postThreads.keySet())
{
if (!aliveThread.getName().contains("SunPKCS11") && !previousThreads.containsKey(aliveThread))
@@ -944,14 +948,14 @@
System.out.println(buffer.toString());
}
-
+
//assertFalse("Thread Failed", failedThread);
super.tearDown();
}
/**
- *
+ *
*/
protected void cleanupPools()
{
@@ -971,7 +975,7 @@
AsynchronousFileImpl.resetMaxAIO();
Assert.fail("test did not close all its files " + AsynchronousFileImpl.getTotalMaxIO());
}
-
+
// We shutdown the global pools to give a better isolation between tests
ServerLocatorImpl.clearThreadPools();
}
@@ -1218,7 +1222,9 @@
return messageCount;
}
- protected List<QueueBinding> getLocalQueueBindings(final PostOffice postOffice, final String address) throws Exception
+ protected
+ List<QueueBinding>
+ getLocalQueueBindings(final PostOffice postOffice, final String address) throws Exception
{
ArrayList<QueueBinding> bindingsFound = new ArrayList<QueueBinding>();
13 years, 7 months
JBoss hornetq SVN: r10743 - in trunk/tests/unit-tests/src/test/java/org/hornetq/tests: util and 1 other directory.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 12:18:41 -0400 (Thu, 26 May 2011)
New Revision: 10743
Modified:
trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/ConfigurationImplTest.java
trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/DefaultsFileConfigurationTest.java
trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/ServiceTestBase.java
Log:
HORNETQ-698 Fix more references to JournalConstants
Modified: trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/ConfigurationImplTest.java
===================================================================
--- trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/ConfigurationImplTest.java 2011-05-26 15:38:46 UTC (rev 10742)
+++ trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/ConfigurationImplTest.java 2011-05-26 16:18:41 UTC (rev 10743)
@@ -23,14 +23,15 @@
import org.hornetq.api.core.SimpleString;
import org.hornetq.core.config.Configuration;
import org.hornetq.core.config.impl.ConfigurationImpl;
+import org.hornetq.core.journal.impl.JournalConstants;
import org.hornetq.core.server.JournalType;
import org.hornetq.tests.util.RandomUtil;
import org.hornetq.tests.util.UnitTestCase;
/**
- *
+ *
* A ConfigurationImplTest
- *
+ *
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
*
*/
@@ -87,10 +88,10 @@
Assert.assertEquals(ConfigurationImpl.DEFAULT_PAGING_DIR, conf.getPagingDirectory());
Assert.assertEquals(ConfigurationImpl.DEFAULT_LARGE_MESSAGES_DIR, conf.getLargeMessagesDirectory());
Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_COMPACT_PERCENTAGE, conf.getJournalCompactPercentage());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO, conf.getJournalBufferTimeout_AIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO, conf.getJournalBufferTimeout_NIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO, conf.getJournalBufferSize_AIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO, conf.getJournalBufferSize_NIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO, conf.getJournalBufferTimeout_AIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO, conf.getJournalBufferTimeout_NIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO, conf.getJournalBufferSize_AIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO, conf.getJournalBufferSize_NIO());
Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_LOG_WRITE_RATE, conf.isLogJournalWriteRate());
Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_PERF_BLAST_PAGES, conf.getJournalPerfBlastPages());
Assert.assertEquals(ConfigurationImpl.DEFAULT_MESSAGE_COUNTER_ENABLED, conf.isMessageCounterEnabled());
Modified: trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/DefaultsFileConfigurationTest.java
===================================================================
--- trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/DefaultsFileConfigurationTest.java 2011-05-26 15:38:46 UTC (rev 10742)
+++ trunk/tests/unit-tests/src/test/java/org/hornetq/tests/unit/core/config/impl/DefaultsFileConfigurationTest.java 2011-05-26 16:18:41 UTC (rev 10743)
@@ -20,11 +20,12 @@
import org.hornetq.core.config.Configuration;
import org.hornetq.core.config.impl.ConfigurationImpl;
import org.hornetq.core.config.impl.FileConfiguration;
+import org.hornetq.core.journal.impl.JournalConstants;
/**
- *
+ *
* A DefaultsFileConfigurationTest
- *
+ *
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
* @author <a href="jmesnil(a)redhat.com">Jeff Mesnil</a>
*
@@ -109,15 +110,15 @@
Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_AIO, conf.getJournalMaxIO_AIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO, conf.getJournalBufferTimeout_AIO());
+ Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_NIO, conf.getJournalMaxIO_NIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO, conf.getJournalBufferSize_AIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO, conf.getJournalBufferTimeout_AIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_NIO, conf.getJournalMaxIO_NIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO, conf.getJournalBufferSize_AIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO, conf.getJournalBufferTimeout_NIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO, conf.getJournalBufferTimeout_NIO());
- Assert.assertEquals(ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO, conf.getJournalBufferSize_NIO());
+ Assert.assertEquals(JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO, conf.getJournalBufferSize_NIO());
Assert.assertEquals(ConfigurationImpl.DEFAULT_CREATE_BINDINGS_DIR, conf.isCreateBindingsDir());
Modified: trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/ServiceTestBase.java
===================================================================
--- trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/ServiceTestBase.java 2011-05-26 15:38:46 UTC (rev 10742)
+++ trunk/tests/unit-tests/src/test/java/org/hornetq/tests/util/ServiceTestBase.java 2011-05-26 16:18:41 UTC (rev 10743)
@@ -50,9 +50,9 @@
import org.hornetq.spi.core.security.HornetQSecurityManagerImpl;
/**
- *
+ *
* Base class with basic utilities on starting up a basic server
- *
+ *
* @author <a href="mailto:clebert.suconic@jboss.com">Clebert Suconic</a>
*
*/
@@ -71,7 +71,7 @@
protected static final String NETTY_CONNECTOR_FACTORY = NettyConnectorFactory.class.getCanonicalName();
- private List<ServerLocator> locators = new ArrayList<ServerLocator>();
+ private final List<ServerLocator> locators = new ArrayList<ServerLocator>();
@Override
protected void tearDown() throws Exception
@@ -115,9 +115,9 @@
return params;
}
- protected static TransportConfiguration createTransportConfiguration(boolean netty,
- boolean acceptor,
- Map<String, Object> params)
+ protected static TransportConfiguration createTransportConfiguration(final boolean netty,
+ final boolean acceptor,
+ final Map<String, Object> params)
{
String className;
if (netty)
@@ -206,7 +206,7 @@
{
return createServer(realFiles, configuration, pageSize, maxAddressSize, AddressFullMessagePolicy.PAGE, settings);
}
-
+
protected HornetQServer createServer(final boolean realFiles,
final Configuration configuration,
final int pageSize,
@@ -284,7 +284,7 @@
protected HornetQServer createInVMFailoverServer(final boolean realFiles,
final Configuration configuration,
- NodeManager nodeManager)
+ final NodeManager nodeManager)
{
return createInVMFailoverServer(realFiles,
configuration,
@@ -299,7 +299,7 @@
final int pageSize,
final int maxAddressSize,
final Map<String, AddressSettings> settings,
- NodeManager nodeManager)
+ final NodeManager nodeManager)
{
HornetQServer server;
HornetQSecurityManager securityManager = new HornetQSecurityManagerImpl();
@@ -417,7 +417,7 @@
}
}
- protected void createQueue(String address, String queue) throws Exception
+ protected void createQueue(final String address, final String queue) throws Exception
{
ServerLocator locator = createInVMNonHALocator();
ClientSessionFactory sf = locator.createSessionFactory();
@@ -440,8 +440,9 @@
protected ServerLocator createNonHALocator(final boolean isNetty)
{
- ServerLocator locatorWithoutHA = isNetty ? HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(NETTY_CONNECTOR_FACTORY))
- : HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(INVM_CONNECTOR_FACTORY));
+ ServerLocator locatorWithoutHA =
+ isNetty ? HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(NETTY_CONNECTOR_FACTORY))
+ : HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(INVM_CONNECTOR_FACTORY));
locators.add(locatorWithoutHA);
return locatorWithoutHA;
}
@@ -487,7 +488,8 @@
}
/**
- * Deleting a file on LargeDire is an asynchronous process. Wee need to keep looking for a while if the file hasn't been deleted yet
+ * Deleting a file on LargeDire is an asynchronous process. Wee need to keep looking for a while
+ * if the file hasn't been deleted yet
*/
protected void validateNoFilesOnLargeDir(final int expect) throws Exception
{
@@ -499,8 +501,8 @@
{
Thread.sleep(100);
}
-
-
+
+
if (expect != largeMessagesFileDir.listFiles().length)
{
for (File file : largeMessagesFileDir.listFiles())
@@ -513,7 +515,8 @@
}
/**
- * Deleting a file on LargeDire is an asynchronous process. Wee need to keep looking for a while if the file hasn't been deleted yet
+ * Deleting a file on LargeDire is an asynchronous process. Wee need to keep looking for a while
+ * if the file hasn't been deleted yet
*/
protected void validateNoFilesOnLargeDir() throws Exception
{
@@ -527,43 +530,45 @@
{
final NodeManager nodeManager;
- public InVMNodeManagerServer(NodeManager nodeManager)
+ public InVMNodeManagerServer(final NodeManager nodeManager)
{
super();
this.nodeManager = nodeManager;
}
- public InVMNodeManagerServer(Configuration configuration, NodeManager nodeManager)
+ public InVMNodeManagerServer(final Configuration configuration, final NodeManager nodeManager)
{
super(configuration);
this.nodeManager = nodeManager;
}
- public InVMNodeManagerServer(Configuration configuration, MBeanServer mbeanServer, NodeManager nodeManager)
+ public InVMNodeManagerServer(final Configuration configuration,
+ final MBeanServer mbeanServer,
+ final NodeManager nodeManager)
{
super(configuration, mbeanServer);
this.nodeManager = nodeManager;
}
- public InVMNodeManagerServer(Configuration configuration,
- HornetQSecurityManager securityManager,
- NodeManager nodeManager)
+ public InVMNodeManagerServer(final Configuration configuration,
+ final HornetQSecurityManager securityManager,
+ final NodeManager nodeManager)
{
super(configuration, securityManager);
this.nodeManager = nodeManager;
}
- public InVMNodeManagerServer(Configuration configuration,
- MBeanServer mbeanServer,
- HornetQSecurityManager securityManager,
- NodeManager nodeManager)
+ public InVMNodeManagerServer(final Configuration configuration,
+ final MBeanServer mbeanServer,
+ final HornetQSecurityManager securityManager,
+ final NodeManager nodeManager)
{
super(configuration, mbeanServer, securityManager);
this.nodeManager = nodeManager;
}
@Override
- protected NodeManager createNodeManager(String directory)
+ protected NodeManager createNodeManager(final String directory)
{
return nodeManager;
}
13 years, 7 months
JBoss hornetq SVN: r10742 - in trunk: hornetq-core/src/main/java/org/hornetq/core/config/impl and 3 other directories.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 11:38:46 -0400 (Thu, 26 May 2011)
New Revision: 10742
Modified:
trunk/hornetq-core/src/main/java/org/hornetq/core/config/Configuration.java
trunk/hornetq-core/src/main/java/org/hornetq/core/config/impl/ConfigurationImpl.java
trunk/hornetq-core/src/main/java/org/hornetq/core/deployers/impl/FileConfigurationParser.java
trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java
trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/SyncSpeedTest.java
trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/logging/LogDelegateTest.java
Log:
HORNETQ-698 Remove journal constants from ConfigurationImpl. Adjust references.
Modified: trunk/hornetq-core/src/main/java/org/hornetq/core/config/Configuration.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/config/Configuration.java 2011-05-26 15:17:04 UTC (rev 10741)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/config/Configuration.java 2011-05-26 15:38:46 UTC (rev 10742)
@@ -29,20 +29,20 @@
import org.hornetq.spi.core.logging.LogDelegateFactory;
/**
- *
+ *
* A Configuration is used to configure HornetQ servers.
- *
+ *
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
*
*/
public interface Configuration extends Serializable
{
// General attributes -------------------------------------------------------------------
-
-
+
+
/** To be used on dependency management on the application server */
String getName();
-
+
/** To be used on dependency management on the application server */
void setName(String name);
@@ -204,7 +204,7 @@
* Sets whether this server is manageable using JMX or not.
*/
void setJMXManagementEnabled(boolean enabled);
-
+
/**
* Returns the domain used by JMX MBeans (provided JMX management is enabled).
* <br>
@@ -214,7 +214,7 @@
/**
* Sets the domain used by JMX MBeans (provided JMX management is enabled).
- *
+ *
* Changing this JMX domain is required if multiple HornetQ servers are run inside
* the same JVM and all servers are using the same MBeanServer.
*/
@@ -280,7 +280,7 @@
/**
* Returns the name of the connector used to connect to the live node - only used when using shared nothing (shared store = false).
- * <br>
+ * <br>
*/
String getLiveConnectorName();
@@ -587,7 +587,7 @@
/**
* Returns the timeout (in nanoseconds) used to flush buffers in the AIO queue.
* <br>
- * Default value is {@value org.hornetq.core.config.impl.ConfigurationImpl#DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO}.
+ * Default value is {@value org.hornetq.core.journal.impl.JournalConstants#DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO}.
*/
int getJournalBufferTimeout_AIO();
@@ -599,7 +599,7 @@
/**
* Returns the buffer size (in bytes) for AIO.
* <br>
- * Default value is {@value org.hornetq.core.config.impl.ConfigurationImpl#DEFAULT_JOURNAL_BUFFER_SIZE_AIO}.
+ * Default value is {@value org.hornetq.core.journal.impl.JournalConstants#DEFAULT_JOURNAL_BUFFER_SIZE_AIO}.
*/
int getJournalBufferSize_AIO();
@@ -623,7 +623,7 @@
/**
* Returns the timeout (in nanoseconds) used to flush buffers in the NIO.
* <br>
- * Default value is {@value org.hornetq.core.config.impl.ConfigurationImpl#DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO}.
+ * Default value is {@value org.hornetq.core.journal.impl.JournalConstants#DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO}.
*/
int getJournalBufferTimeout_NIO();
@@ -635,7 +635,7 @@
/**
* Returns the buffer size (in bytes) for NIO.
* <br>
- * Default value is {@value org.hornetq.core.config.impl.ConfigurationImpl#DEFAULT_JOURNAL_BUFFER_SIZE_NIO}.
+ * Default value is {@value org.hornetq.core.journal.impl.JournalConstants#DEFAULT_JOURNAL_BUFFER_SIZE_NIO}.
*/
int getJournalBufferSize_NIO();
@@ -737,7 +737,7 @@
void setWildcardRoutingEnabled(boolean enabled);
/**
- * Returns the timeout (in milliseconds) after which transactions is removed
+ * Returns the timeout (in milliseconds) after which transactions is removed
* from the resource manager after it was created.
* <br>
* Default value is {@value org.hornetq.core.config.impl.ConfigurationImpl#DEFAULT_TRANSACTION_TIMEOUT}.
@@ -745,7 +745,7 @@
long getTransactionTimeout();
/**
- * Sets the timeout (in milliseconds) after which transactions is removed
+ * Sets the timeout (in milliseconds) after which transactions is removed
* from the resource manager after it was created.
*/
void setTransactionTimeout(long timeout);
@@ -771,7 +771,7 @@
/**
* Sets the sample period to take message counter snapshot.
- *
+ *
* @param period value must be greater than 1000ms
*/
void setMessageCounterSamplePeriod(long period);
@@ -785,13 +785,13 @@
/**
* Sets the maximum number of days kept in memory for message counter.
- *
+ *
* @param maxDayHistory value must be greater than 0
*/
void setMessageCounterMaxDayHistory(int maxDayHistory);
/**
- * Returns the frequency (in milliseconds) to scan transactions to detect which transactions
+ * Returns the frequency (in milliseconds) to scan transactions to detect which transactions
* have timed out.
* <br>
* Default value is {@value org.hornetq.core.config.impl.ConfigurationImpl#DEFAULT_TRANSACTION_TIMEOUT_SCAN_PERIOD}.
@@ -799,13 +799,13 @@
long getTransactionTimeoutScanPeriod();
/**
- * Sets the frequency (in milliseconds) to scan transactions to detect which transactions
+ * Sets the frequency (in milliseconds) to scan transactions to detect which transactions
* have timed out.
*/
void setTransactionTimeoutScanPeriod(long period);
/**
- * Returns the frequency (in milliseconds) to scan messages to detect which messages
+ * Returns the frequency (in milliseconds) to scan messages to detect which messages
* have expired.
* <br>
* Default value is {@value org.hornetq.core.config.impl.ConfigurationImpl#DEFAULT_MESSAGE_EXPIRY_SCAN_PERIOD}.
@@ -813,7 +813,7 @@
long getMessageExpiryScanPeriod();
/**
- * Sets the frequency (in milliseconds) to scan messages to detect which messages
+ * Sets the frequency (in milliseconds) to scan messages to detect which messages
* have expired.
*/
void setMessageExpiryScanPeriod(long messageExpiryScanPeriod);
@@ -831,7 +831,7 @@
void setMessageExpiryThreadPriority(int messageExpiryThreadPriority);
/**
- *
+ *
* @return A list of AddressSettings per matching to be deployed to the address settings repository
*/
Map<String, AddressSettings> getAddressesSettings();
@@ -842,25 +842,25 @@
void setAddressesSettings(Map<String, AddressSettings> addressesSettings);
/**
- *
+ *
* @param roles a list of roles per matching
*/
void setSecurityRoles(Map<String, Set<Role>> roles);
/**
- *
+ *
* @return a list of roles per matching
*/
Map<String, Set<Role>> getSecurityRoles();
/**
- *
- * @param
+ *
+ * @param
*/
void setConnectorServiceConfigurations(List<ConnectorServiceConfiguration> configs);
/**
- *
- * @return
+ *
+ * @return
*/
List<ConnectorServiceConfiguration> getConnectorServiceConfigurations();
Modified: trunk/hornetq-core/src/main/java/org/hornetq/core/config/impl/ConfigurationImpl.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/config/impl/ConfigurationImpl.java 2011-05-26 15:17:04 UTC (rev 10741)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/config/impl/ConfigurationImpl.java 2011-05-26 15:38:46 UTC (rev 10742)
@@ -31,6 +31,7 @@
import org.hornetq.core.config.ConnectorServiceConfiguration;
import org.hornetq.core.config.CoreQueueConfiguration;
import org.hornetq.core.config.DivertConfiguration;
+import org.hornetq.core.journal.impl.JournalConstants;
import org.hornetq.core.logging.impl.JULLogDelegateFactory;
import org.hornetq.core.security.Role;
import org.hornetq.core.server.JournalType;
@@ -109,16 +110,8 @@
public static final int DEFAULT_JOURNAL_MAX_IO_AIO = 500;
- public static final int DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO = (int)(1000000000d / 2000);
-
- public static final int DEFAULT_JOURNAL_BUFFER_SIZE_AIO = 490 * 1024;
-
public static final int DEFAULT_JOURNAL_MAX_IO_NIO = 1;
- public static final int DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO = (int)(1000000000d / 300);
-
- public static final int DEFAULT_JOURNAL_BUFFER_SIZE_NIO = 490 * 1024;
-
public static final boolean DEFAULT_JOURNAL_LOG_WRITE_RATE = false;
public static final int DEFAULT_JOURNAL_PERF_BLAST_PAGES = -1;
@@ -157,7 +150,7 @@
public static final int DEFAULT_ID_CACHE_SIZE = 2000;
public static final boolean DEFAULT_PERSIST_ID_CACHE = true;
-
+
public static final boolean DEFAULT_CLUSTER_DUPLICATE_DETECTION = true;
public static final boolean DEFAULT_CLUSTER_FORWARD_WHEN_NO_CONSUMERS = false;
@@ -185,7 +178,7 @@
public static final String DEFAULT_LOG_DELEGATE_FACTORY_CLASS_NAME = JULLogDelegateFactory.class.getCanonicalName();
// Attributes -----------------------------------------------------------------------------
-
+
protected String name = "ConfigurationImpl::" + System.identityHashCode(this);
protected boolean clustered = ConfigurationImpl.DEFAULT_CLUSTERED;
@@ -231,7 +224,7 @@
protected String logDelegateFactoryClassName = ConfigurationImpl.DEFAULT_LOG_DELEGATE_FACTORY_CLASS_NAME;
protected List<String> interceptorClassNames = new ArrayList<String>();
-
+
protected Map<String, TransportConfiguration> connectorConfigs = new HashMap<String, TransportConfiguration>();
protected Set<TransportConfiguration> acceptorConfigs = new HashSet<TransportConfiguration>();
@@ -284,15 +277,15 @@
protected int journalMaxIO_AIO = ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_AIO;
- protected int journalBufferTimeout_AIO = ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO;
+ protected int journalBufferTimeout_AIO = JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO;
- protected int journalBufferSize_AIO = ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO;
+ protected int journalBufferSize_AIO = JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO;
protected int journalMaxIO_NIO = ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_NIO;
- protected int journalBufferTimeout_NIO = ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO;
+ protected int journalBufferTimeout_NIO = JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO;
- protected int journalBufferSize_NIO = ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO;
+ protected int journalBufferSize_NIO = JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO;
protected boolean logJournalWriteRate = ConfigurationImpl.DEFAULT_JOURNAL_LOG_WRITE_RATE;
@@ -356,7 +349,7 @@
return allowAutoFailBack;
}
- public void setAllowAutoFailBack(boolean allowAutoFailBack)
+ public void setAllowAutoFailBack(final boolean allowAutoFailBack)
{
this.allowAutoFailBack = allowAutoFailBack;
}
@@ -513,7 +506,7 @@
{
this.liveConnectorName = liveConnectorName;
}
-
+
public GroupingHandlerConfiguration getGroupingHandlerConfiguration()
{
return groupingHandlerConfiguration;
@@ -894,7 +887,7 @@
return failoverOnServerShutdown;
}
- public void setFailoverOnServerShutdown(boolean failoverOnServerShutdown)
+ public void setFailoverOnServerShutdown(final boolean failoverOnServerShutdown)
{
this.failoverOnServerShutdown = failoverOnServerShutdown;
}
@@ -1359,7 +1352,7 @@
public List<ConnectorServiceConfiguration> getConnectorServiceConfigurations()
{
- return this.connectorServiceConfigurations;
+ return connectorServiceConfigurations;
}
public long getFailbackDelay()
@@ -1367,14 +1360,14 @@
return failbackDelay;
}
- public void setFailbackDelay(long failbackDelay)
+ public void setFailbackDelay(final long failbackDelay)
{
this.failbackDelay = failbackDelay;
}
public void setConnectorServiceConfigurations(final List<ConnectorServiceConfiguration> configs)
{
- this.connectorServiceConfigurations = configs;
+ connectorServiceConfigurations = configs;
}
/* (non-Javadoc)
@@ -1388,7 +1381,7 @@
/* (non-Javadoc)
* @see org.hornetq.core.config.Configuration#setName(java.lang.String)
*/
- public void setName(String name)
+ public void setName(final String name)
{
this.name = name;
}
Modified: trunk/hornetq-core/src/main/java/org/hornetq/core/deployers/impl/FileConfigurationParser.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/deployers/impl/FileConfigurationParser.java 2011-05-26 15:17:04 UTC (rev 10741)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/deployers/impl/FileConfigurationParser.java 2011-05-26 15:38:46 UTC (rev 10742)
@@ -28,11 +28,18 @@
import org.hornetq.api.core.SimpleString;
import org.hornetq.api.core.TransportConfiguration;
import org.hornetq.api.core.client.HornetQClient;
-import org.hornetq.core.config.*;
+import org.hornetq.core.config.BridgeConfiguration;
+import org.hornetq.core.config.BroadcastGroupConfiguration;
+import org.hornetq.core.config.ClusterConnectionConfiguration;
+import org.hornetq.core.config.Configuration;
+import org.hornetq.core.config.ConnectorServiceConfiguration;
+import org.hornetq.core.config.CoreQueueConfiguration;
+import org.hornetq.core.config.DivertConfiguration;
import org.hornetq.core.config.impl.ConfigurationImpl;
import org.hornetq.core.config.impl.FileConfiguration;
import org.hornetq.core.config.impl.Validators;
import org.hornetq.core.journal.impl.AIOSequentialFileFactory;
+import org.hornetq.core.journal.impl.JournalConstants;
import org.hornetq.core.logging.Logger;
import org.hornetq.core.security.Role;
import org.hornetq.core.server.JournalType;
@@ -139,7 +146,7 @@
/**
* @param validateAIO the validateAIO to set
*/
- public void setValidateAIO(boolean validateAIO)
+ public void setValidateAIO(final boolean validateAIO)
{
this.validateAIO = validateAIO;
}
@@ -479,14 +486,14 @@
int journalBufferTimeout = XMLConfigurationUtil.getInteger(e,
"journal-buffer-timeout",
- config.getJournalType() == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO
- : ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
+ config.getJournalType() == JournalType.ASYNCIO ? JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO
+ : JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
Validators.GT_ZERO);
int journalBufferSize = XMLConfigurationUtil.getInteger(e,
"journal-buffer-size",
- config.getJournalType() == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO
- : ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
+ config.getJournalType() == JournalType.ASYNCIO ? JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO
+ : JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
Validators.GT_ZERO);
int journalMaxIO = XMLConfigurationUtil.getInteger(e,
@@ -1206,7 +1213,7 @@
mainConfig.getBridgeConfigurations().add(config);
}
- private void getStaticConnectors(List<String> staticConnectorNames, Node child)
+ private void getStaticConnectors(final List<String> staticConnectorNames, final Node child)
{
NodeList children2 = ((Element)child).getElementsByTagName("connector-ref");
Modified: trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java
===================================================================
--- trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java 2011-05-26 15:17:04 UTC (rev 10741)
+++ trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java 2011-05-26 15:38:46 UTC (rev 10742)
@@ -54,8 +54,8 @@
public AIOSequentialFileFactory(final String journalDir)
{
this(journalDir,
- JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
- JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO,
false);
}
Modified: trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/SyncSpeedTest.java
===================================================================
--- trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/SyncSpeedTest.java 2011-05-26 15:17:04 UTC (rev 10741)
+++ trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/SyncSpeedTest.java 2011-05-26 15:38:46 UTC (rev 10742)
@@ -27,11 +27,8 @@
import org.hornetq.core.logging.Logger;
/**
- * A SyncSpeedTest
- *
- * This class just provides some diagnostics on how fast your disk can sync
- * Useful when determining performance issues
- *
+ * SyncSpeedTest provides diagnostics on how fast your disk can sync.<p>
+ * It is used to investigate performance issues.
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a> fox
*
*
Modified: trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/logging/LogDelegateTest.java
===================================================================
--- trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/logging/LogDelegateTest.java 2011-05-26 15:17:04 UTC (rev 10741)
+++ trunk/tests/integration-tests/src/test/java/org/hornetq/tests/integration/logging/LogDelegateTest.java 2011-05-26 15:38:46 UTC (rev 10742)
@@ -16,7 +16,6 @@
import junit.framework.Assert;
import org.hornetq.core.config.Configuration;
-import org.hornetq.core.config.impl.ConfigurationImpl;
import org.hornetq.core.logging.Logger;
import org.hornetq.core.logging.impl.JULLogDelegate;
import org.hornetq.core.logging.impl.JULLogDelegateFactory;
13 years, 7 months
JBoss hornetq SVN: r10741 - trunk/hornetq-core.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 11:17:04 -0400 (Thu, 26 May 2011)
New Revision: 10741
Modified:
trunk/hornetq-core/pom.xml
Log:
HORNETQ-698 hornetq-core depends on hornetq-journal.
Modified: trunk/hornetq-core/pom.xml
===================================================================
--- trunk/hornetq-core/pom.xml 2011-05-26 15:06:40 UTC (rev 10740)
+++ trunk/hornetq-core/pom.xml 2011-05-26 15:17:04 UTC (rev 10741)
@@ -19,6 +19,11 @@
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>org.hornetq</groupId>
+ <artifactId>hornetq-journal</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</dependency>
13 years, 7 months
JBoss hornetq SVN: r10740 - in trunk: hornetq-commons/src/main/java/org/hornetq/api/core and 12 other directories.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 11:06:40 -0400 (Thu, 26 May 2011)
New Revision: 10740
Added:
trunk/hornetq-commons/src/main/java/org/hornetq/api/core/PropertyConversionException.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/Base64.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentHashSet.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentSet.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/HornetQThreadFactory.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/ReusableLatch.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/TypedProperties.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUID.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDGenerator.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDTimer.java
trunk/hornetq-journal/
trunk/hornetq-journal/pom.xml
trunk/hornetq-journal/src/
trunk/hornetq-journal/src/main/
trunk/hornetq-journal/src/main/java/
trunk/hornetq-journal/src/main/java/org/
trunk/hornetq-journal/src/main/java/org/hornetq/
trunk/hornetq-journal/src/main/java/org/hornetq/core/
trunk/hornetq-journal/src/main/java/org/hornetq/core/asyncio/
trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/
trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/JournalConstants.java
Removed:
trunk/hornetq-core/src/main/java/org/hornetq/api/core/PropertyConversionException.java
trunk/hornetq-core/src/main/java/org/hornetq/core/asyncio/
trunk/hornetq-core/src/main/java/org/hornetq/core/journal/
trunk/hornetq-core/src/main/java/org/hornetq/utils/Base64.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentHashSet.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentSet.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/HornetQThreadFactory.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/ReusableLatch.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/TypedProperties.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/UUID.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDGenerator.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDTimer.java
Modified:
trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java
trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AbstractSequentialFileFactory.java
trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/NIOSequentialFileFactory.java
trunk/pom.xml
Log:
HORNETQ-698 Create new hornetq-journals package, move files around to suit new project.
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/api/core/PropertyConversionException.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/api/core/PropertyConversionException.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/api/core/PropertyConversionException.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/api/core/PropertyConversionException.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.api.core;
+
+/**
+ * A PropertyConversionException is thrown by Message methods
+ * when a property can not be converted to the expected type.
+ *
+ * @author <a href="mailto:jmesnil@redhat.com">Jeff Mesnil</a>
+ *
+ * @see Message
+ *
+ */
+public class PropertyConversionException extends RuntimeException
+{
+
+ // Constants -----------------------------------------------------
+
+ private static final long serialVersionUID = -3010008708334904332L;
+
+ // Attributes ----------------------------------------------------
+
+ // Static --------------------------------------------------------
+
+ // Constructors --------------------------------------------------
+
+
+ public PropertyConversionException(final String message)
+ {
+ super(message);
+ }
+
+ // Public --------------------------------------------------------
+
+ // Package protected ---------------------------------------------
+
+ // Protected -----------------------------------------------------
+
+ // Private -------------------------------------------------------
+
+ // Inner classes -------------------------------------------------
+
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/Base64.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/Base64.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/Base64.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/Base64.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,2350 @@
+package org.hornetq.utils;
+
+/**
+ * <p>Encodes and decodes to and from Base64 notation.</p>
+ * <p>Homepage: <a href="http://iharder.net/base64">http://iharder.net/base64</a>.</p>
+ *
+ * <p>The <tt>options</tt> parameter, which appears in a few places, is used to pass
+ * several pieces of information to the encoder. In the "higher level" methods such as
+ * encodeBytes( bytes, options ) the options parameter can be used to indicate such
+ * things as first gzipping the bytes before encoding them, not inserting linefeeds
+ * (though that breaks strict Base64 compatibility), and encoding using the URL-safe
+ * and Ordered dialects.</p>
+ *
+ * <p>The constants defined in Base64 can be OR-ed together to combine options, so you
+ * might make a call like this:</p>
+ *
+ * <code>String encoded = Base64.encodeBytes( mybytes, Base64.GZIP | Base64.DONT_BREAK_LINES );</code>
+ *
+ * <p>to compress the data before encoding it and then making the output have no newline characters.</p>
+ *
+ *
+ * <p>
+ * Change Log:
+ * </p>
+ * <ul>
+ * <li>v2.2.2 - Fixed encodeFileToFile and decodeFileToFile to use the
+ * Base64.InputStream class to encode and decode on the fly which uses
+ * less memory than encoding/decoding an entire file into memory before writing.</li>
+ * <li>v2.2.1 - Fixed bug using URL_SAFE and ORDERED encodings. Fixed bug
+ * when using very small files (~< 40 bytes).</li>
+ * <li>v2.2 - Added some helper methods for encoding/decoding directly from
+ * one file to the next. Also added a main() method to support command line
+ * encoding/decoding from one file to the next. Also added these Base64 dialects:
+ * <ol>
+ * <li>The default is RFC3548 format.</li>
+ * <li>Calling Base64.setFormat(Base64.BASE64_FORMAT.URLSAFE_FORMAT) generates
+ * URL and file name friendly format as described in Section 4 of RFC3548.
+ * http://www.faqs.org/rfcs/rfc3548.html</li>
+ * <li>Calling Base64.setFormat(Base64.BASE64_FORMAT.ORDERED_FORMAT) generates
+ * URL and file name friendly format that preserves lexical ordering as described
+ * in http://www.faqs.org/qa/rfcc-1940.html</li>
+ * </ol>
+ * Special thanks to Jim Kellerman at <a href="http://www.powerset.com/">http://www.powerset.com/</a>
+ * for contributing the new Base64 dialects.
+ * </li>
+ *
+ * <li>v2.1 - Cleaned up javadoc comments and unused variables and methods. Added
+ * some convenience methods for reading and writing to and from files.</li>
+ * <li>v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems
+ * with other encodings (like EBCDIC).</li>
+ * <li>v2.0.1 - Fixed an error when decoding a single byte, that is, when the
+ * encoded data was a single byte.</li>
+ * <li>v2.0 - I got rid of methods that used booleans to set options.
+ * Now everything is more consolidated and cleaner. The code now detects
+ * when data that's being decoded is gzip-compressed and will decompress it
+ * automatically. Generally things are cleaner. You'll probably have to
+ * change some method calls that you were making to support the new
+ * options format (<tt>int</tt>s that you "OR" together).</li>
+ * <li>v1.5.1 - Fixed bug when decompressing and decoding to a
+ * byte[] using <tt>decode( String s, boolean gzipCompressed )</tt>.
+ * Added the ability to "suspend" encoding in the Output Stream so
+ * you can turn on and off the encoding if you need to embed base64
+ * data in an otherwise "normal" stream (like an XML file).</li>
+ * <li>v1.5 - Output stream pases on flush() command but doesn't do anything itself.
+ * This helps when using GZIP streams.
+ * Added the ability to GZip-compress objects before encoding them.</li>
+ * <li>v1.4 - Added helper methods to read/write files.</li>
+ * <li>v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.</li>
+ * <li>v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream
+ * where last buffer being read, if not completely full, was not returned.</li>
+ * <li>v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.</li>
+ * <li>v1.3.3 - Fixed I/O streams which were totally messed up.</li>
+ * </ul>
+ *
+ * <p>
+ * I am placing this code in the Public Domain. Do with it as you will.
+ * This software comes with no guarantees or warranties but with
+ * plenty of well-wishing instead!
+ * Please visit <a href="http://iharder.net/base64">http://iharder.net/base64</a>
+ * periodically to check for updates or to contribute improvements.
+ * </p>
+ *
+ * @author Robert Harder
+ * @author rob(a)iharder.net
+ * @version 2.2.2
+ */
+public class Base64
+{
+
+ /* ******** P U B L I C F I E L D S ******** */
+
+ /** No options specified. Value is zero. */
+ public final static int NO_OPTIONS = 0;
+
+ /** Specify encoding. */
+ public final static int ENCODE = 1;
+
+ /** Specify decoding. */
+ public final static int DECODE = 0;
+
+ /** Specify that data should be gzip-compressed. */
+ public final static int GZIP = 2;
+
+ /** Don't break lines when encoding (violates strict Base64 specification) */
+ public final static int DONT_BREAK_LINES = 8;
+
+ /**
+ * Encode using Base64-like encoding that is URL- and Filename-safe as described
+ * in Section 4 of RFC3548:
+ * <a href="http://www.faqs.org/rfcs/rfc3548.html">http://www.faqs.org/rfcs/rfc3548.html</a>.
+ * It is important to note that data encoded this way is <em>not</em> officially valid Base64,
+ * or at the very least should not be called Base64 without also specifying that is
+ * was encoded using the URL- and Filename-safe dialect.
+ */
+ public final static int URL_SAFE = 16;
+
+ /**
+ * Encode using the special "ordered" dialect of Base64 described here:
+ * <a href="http://www.faqs.org/qa/rfcc-1940.html">http://www.faqs.org/qa/rfcc-1940.html</a>.
+ */
+ public final static int ORDERED = 32;
+
+ /* ******** P R I V A T E F I E L D S ******** */
+
+ /** Maximum line length (76) of Base64 output. */
+ private final static int MAX_LINE_LENGTH = 76;
+
+ /** The equals sign (=) as a byte. */
+ private final static byte EQUALS_SIGN = (byte)'=';
+
+ /** The new line character (\n) as a byte. */
+ private final static byte NEW_LINE = (byte)'\n';
+
+ /** Preferred encoding. */
+ private final static String PREFERRED_ENCODING = "UTF-8";
+
+ // I think I end up not using the BAD_ENCODING indicator.
+ // private final static byte BAD_ENCODING = -9; // Indicates error in encoding
+ private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding
+
+ private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding
+
+ /* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */
+
+ /** The 64 valid Base64 values. */
+ // private final static byte[] ALPHABET;
+ /* Host platform me be something funny like EBCDIC, so we hardcode these values. */
+ private final static byte[] _STANDARD_ALPHABET = { (byte)'A',
+ (byte)'B',
+ (byte)'C',
+ (byte)'D',
+ (byte)'E',
+ (byte)'F',
+ (byte)'G',
+ (byte)'H',
+ (byte)'I',
+ (byte)'J',
+ (byte)'K',
+ (byte)'L',
+ (byte)'M',
+ (byte)'N',
+ (byte)'O',
+ (byte)'P',
+ (byte)'Q',
+ (byte)'R',
+ (byte)'S',
+ (byte)'T',
+ (byte)'U',
+ (byte)'V',
+ (byte)'W',
+ (byte)'X',
+ (byte)'Y',
+ (byte)'Z',
+ (byte)'a',
+ (byte)'b',
+ (byte)'c',
+ (byte)'d',
+ (byte)'e',
+ (byte)'f',
+ (byte)'g',
+ (byte)'h',
+ (byte)'i',
+ (byte)'j',
+ (byte)'k',
+ (byte)'l',
+ (byte)'m',
+ (byte)'n',
+ (byte)'o',
+ (byte)'p',
+ (byte)'q',
+ (byte)'r',
+ (byte)'s',
+ (byte)'t',
+ (byte)'u',
+ (byte)'v',
+ (byte)'w',
+ (byte)'x',
+ (byte)'y',
+ (byte)'z',
+ (byte)'0',
+ (byte)'1',
+ (byte)'2',
+ (byte)'3',
+ (byte)'4',
+ (byte)'5',
+ (byte)'6',
+ (byte)'7',
+ (byte)'8',
+ (byte)'9',
+ (byte)'+',
+ (byte)'/' };
+
+ /**
+ * Translates a Base64 value to either its 6-bit reconstruction value
+ * or a negative number indicating some other meaning.
+ **/
+ private final static byte[] _STANDARD_DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ -5,
+ -5, // Whitespace: Tab and Linefeed
+ -9,
+ -9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 14 - 26
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 33 - 42
+ 62, // Plus sign at decimal 43
+ -9,
+ -9,
+ -9, // Decimal 44 - 46
+ 63, // Slash at decimal 47
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61, // Numbers zero through nine
+ -9,
+ -9,
+ -9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9,
+ -9,
+ -9, // Decimal 62 - 64
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13, // Letters 'A' through 'N'
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25, // Letters 'O' through 'Z'
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 91 - 96
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38, // Letters 'a' through 'm'
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51, // Letters 'n' through 'z'
+ -9,
+ -9,
+ -9,
+ -9 // Decimal 123 - 126
+ /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+ };
+
+ /* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */
+
+ /**
+ * Used in the URL- and Filename-safe dialect described in Section 4 of RFC3548:
+ * <a href="http://www.faqs.org/rfcs/rfc3548.html">http://www.faqs.org/rfcs/rfc3548.html</a>.
+ * Notice that the last two bytes become "hyphen" and "underscore" instead of "plus" and "slash."
+ */
+ private final static byte[] _URL_SAFE_ALPHABET = { (byte)'A',
+ (byte)'B',
+ (byte)'C',
+ (byte)'D',
+ (byte)'E',
+ (byte)'F',
+ (byte)'G',
+ (byte)'H',
+ (byte)'I',
+ (byte)'J',
+ (byte)'K',
+ (byte)'L',
+ (byte)'M',
+ (byte)'N',
+ (byte)'O',
+ (byte)'P',
+ (byte)'Q',
+ (byte)'R',
+ (byte)'S',
+ (byte)'T',
+ (byte)'U',
+ (byte)'V',
+ (byte)'W',
+ (byte)'X',
+ (byte)'Y',
+ (byte)'Z',
+ (byte)'a',
+ (byte)'b',
+ (byte)'c',
+ (byte)'d',
+ (byte)'e',
+ (byte)'f',
+ (byte)'g',
+ (byte)'h',
+ (byte)'i',
+ (byte)'j',
+ (byte)'k',
+ (byte)'l',
+ (byte)'m',
+ (byte)'n',
+ (byte)'o',
+ (byte)'p',
+ (byte)'q',
+ (byte)'r',
+ (byte)'s',
+ (byte)'t',
+ (byte)'u',
+ (byte)'v',
+ (byte)'w',
+ (byte)'x',
+ (byte)'y',
+ (byte)'z',
+ (byte)'0',
+ (byte)'1',
+ (byte)'2',
+ (byte)'3',
+ (byte)'4',
+ (byte)'5',
+ (byte)'6',
+ (byte)'7',
+ (byte)'8',
+ (byte)'9',
+ (byte)'-',
+ (byte)'_' };
+
+ /**
+ * Used in decoding URL- and Filename-safe dialects of Base64.
+ */
+ private final static byte[] _URL_SAFE_DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ -5,
+ -5, // Whitespace: Tab and Linefeed
+ -9,
+ -9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 14 - 26
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 33 - 42
+ -9, // Plus sign at decimal 43
+ -9, // Decimal 44
+ 62, // Minus sign at decimal 45
+ -9, // Decimal 46
+ -9, // Slash at decimal 47
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61, // Numbers zero through nine
+ -9,
+ -9,
+ -9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9,
+ -9,
+ -9, // Decimal 62 - 64
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13, // Letters 'A' through 'N'
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23,
+ 24,
+ 25, // Letters 'O' through 'Z'
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 91 - 94
+ 63, // Underscore at decimal 95
+ -9, // Decimal 96
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36,
+ 37,
+ 38, // Letters 'a' through 'm'
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50,
+ 51, // Letters 'n' through 'z'
+ -9,
+ -9,
+ -9,
+ -9 // Decimal 123 - 126
+ /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+ };
+
+ /* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */
+
+ /**
+ * I don't get the point of this technique, but it is described here:
+ * <a href="http://www.faqs.org/qa/rfcc-1940.html">http://www.faqs.org/qa/rfcc-1940.html</a>.
+ */
+ private final static byte[] _ORDERED_ALPHABET = { (byte)'-',
+ (byte)'0',
+ (byte)'1',
+ (byte)'2',
+ (byte)'3',
+ (byte)'4',
+ (byte)'5',
+ (byte)'6',
+ (byte)'7',
+ (byte)'8',
+ (byte)'9',
+ (byte)'A',
+ (byte)'B',
+ (byte)'C',
+ (byte)'D',
+ (byte)'E',
+ (byte)'F',
+ (byte)'G',
+ (byte)'H',
+ (byte)'I',
+ (byte)'J',
+ (byte)'K',
+ (byte)'L',
+ (byte)'M',
+ (byte)'N',
+ (byte)'O',
+ (byte)'P',
+ (byte)'Q',
+ (byte)'R',
+ (byte)'S',
+ (byte)'T',
+ (byte)'U',
+ (byte)'V',
+ (byte)'W',
+ (byte)'X',
+ (byte)'Y',
+ (byte)'Z',
+ (byte)'_',
+ (byte)'a',
+ (byte)'b',
+ (byte)'c',
+ (byte)'d',
+ (byte)'e',
+ (byte)'f',
+ (byte)'g',
+ (byte)'h',
+ (byte)'i',
+ (byte)'j',
+ (byte)'k',
+ (byte)'l',
+ (byte)'m',
+ (byte)'n',
+ (byte)'o',
+ (byte)'p',
+ (byte)'q',
+ (byte)'r',
+ (byte)'s',
+ (byte)'t',
+ (byte)'u',
+ (byte)'v',
+ (byte)'w',
+ (byte)'x',
+ (byte)'y',
+ (byte)'z' };
+
+ /**
+ * Used in decoding the "ordered" dialect of Base64.
+ */
+ private final static byte[] _ORDERED_DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
+ -5,
+ -5, // Whitespace: Tab and Linefeed
+ -9,
+ -9, // Decimal 11 - 12
+ -5, // Whitespace: Carriage Return
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 14 - 26
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 27 - 31
+ -5, // Whitespace: Space
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 33 - 42
+ -9, // Plus sign at decimal 43
+ -9, // Decimal 44
+ 0, // Minus sign at decimal 45
+ -9, // Decimal 46
+ -9, // Slash at decimal 47
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10, // Numbers zero through nine
+ -9,
+ -9,
+ -9, // Decimal 58 - 60
+ -1, // Equals sign at decimal 61
+ -9,
+ -9,
+ -9, // Decimal 62 - 64
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23, // Letters 'A' through 'M'
+ 24,
+ 25,
+ 26,
+ 27,
+ 28,
+ 29,
+ 30,
+ 31,
+ 32,
+ 33,
+ 34,
+ 35,
+ 36, // Letters 'N' through 'Z'
+ -9,
+ -9,
+ -9,
+ -9, // Decimal 91 - 94
+ 37, // Underscore at decimal 95
+ -9, // Decimal 96
+ 38,
+ 39,
+ 40,
+ 41,
+ 42,
+ 43,
+ 44,
+ 45,
+ 46,
+ 47,
+ 48,
+ 49,
+ 50, // Letters 'a' through 'm'
+ 51,
+ 52,
+ 53,
+ 54,
+ 55,
+ 56,
+ 57,
+ 58,
+ 59,
+ 60,
+ 61,
+ 62,
+ 63, // Letters 'n' through 'z'
+ -9,
+ -9,
+ -9,
+ -9 // Decimal 123 - 126
+ /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+ -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+ };
+
+ /* ******** D E T E R M I N E W H I C H A L H A B E T ******** */
+
+ /**
+ * Returns one of the _SOMETHING_ALPHABET byte arrays depending on
+ * the options specified.
+ * It's possible, though silly, to specify ORDERED and URLSAFE
+ * in which case one of them will be picked, though there is
+ * no guarantee as to which one will be picked.
+ */
+ private final static byte[] getAlphabet(final int options)
+ {
+ if ((options & Base64.URL_SAFE) == Base64.URL_SAFE)
+ {
+ return Base64._URL_SAFE_ALPHABET;
+ }
+ else if ((options & Base64.ORDERED) == Base64.ORDERED)
+ {
+ return Base64._ORDERED_ALPHABET;
+ }
+ else
+ {
+ return Base64._STANDARD_ALPHABET;
+ }
+
+ } // end getAlphabet
+
+ /**
+ * Returns one of the _SOMETHING_DECODABET byte arrays depending on
+ * the options specified.
+ * It's possible, though silly, to specify ORDERED and URL_SAFE
+ * in which case one of them will be picked, though there is
+ * no guarantee as to which one will be picked.
+ */
+ private final static byte[] getDecodabet(final int options)
+ {
+ if ((options & Base64.URL_SAFE) == Base64.URL_SAFE)
+ {
+ return Base64._URL_SAFE_DECODABET;
+ }
+ else if ((options & Base64.ORDERED) == Base64.ORDERED)
+ {
+ return Base64._ORDERED_DECODABET;
+ }
+ else
+ {
+ return Base64._STANDARD_DECODABET;
+ }
+
+ } // end getAlphabet
+
+ /** Defeats instantiation. */
+ private Base64()
+ {
+ }
+
+ /**
+ * Encodes or decodes two files from the command line;
+ * <strong>feel free to delete this method (in fact you probably should)
+ * if you're embedding this code into a larger program.</strong>
+ */
+ public final static void main(final String[] args)
+ {
+ if (args.length < 3)
+ {
+ Base64.usage("Not enough arguments.");
+ } // end if: args.length < 3
+ else
+ {
+ String flag = args[0];
+ String infile = args[1];
+ String outfile = args[2];
+ if (flag.equals("-e"))
+ {
+ Base64.encodeFileToFile(infile, outfile);
+ } // end if: encode
+ else if (flag.equals("-d"))
+ {
+ Base64.decodeFileToFile(infile, outfile);
+ } // end else if: decode
+ else
+ {
+ Base64.usage("Unknown flag: " + flag);
+ } // end else
+ } // end else
+ } // end main
+
+ /**
+ * Prints command line usage.
+ *
+ * @param msg A message to include with usage info.
+ */
+ private final static void usage(final String msg)
+ {
+ System.err.println(msg);
+ System.err.println("Usage: java Base64 -e|-d inputfile outputfile");
+ } // end usage
+
+ /* ******** E N C O D I N G M E T H O D S ******** */
+
+ /**
+ * Encodes up to the first three bytes of array <var>threeBytes</var>
+ * and returns a four-byte array in Base64 notation.
+ * The actual number of significant bytes in your array is
+ * given by <var>numSigBytes</var>.
+ * The array <var>threeBytes</var> needs only be as big as
+ * <var>numSigBytes</var>.
+ * Code can reuse a byte array by passing a four-byte array as <var>b4</var>.
+ *
+ * @param b4 A reusable byte array to reduce array instantiation
+ * @param threeBytes the array to convert
+ * @param numSigBytes the number of significant bytes in your array
+ * @return four byte array in Base64 notation.
+ * @since 1.5.1
+ */
+ private static byte[] encode3to4(final byte[] b4, final byte[] threeBytes, final int numSigBytes, final int options)
+ {
+ Base64.encode3to4(threeBytes, 0, numSigBytes, b4, 0, options);
+ return b4;
+ } // end encode3to4
+
+ /**
+ * <p>Encodes up to three bytes of the array <var>source</var>
+ * and writes the resulting four Base64 bytes to <var>destination</var>.
+ * The source and destination arrays can be manipulated
+ * anywhere along their length by specifying
+ * <var>srcOffset</var> and <var>destOffset</var>.
+ * This method does not check to make sure your arrays
+ * are large enough to accomodate <var>srcOffset</var> + 3 for
+ * the <var>source</var> array or <var>destOffset</var> + 4 for
+ * the <var>destination</var> array.
+ * The actual number of significant bytes in your array is
+ * given by <var>numSigBytes</var>.</p>
+ * <p>This is the lowest level of the encoding methods with
+ * all possible parameters.</p>
+ *
+ * @param source the array to convert
+ * @param srcOffset the index where conversion begins
+ * @param numSigBytes the number of significant bytes in your array
+ * @param destination the array to hold the conversion
+ * @param destOffset the index where output will be put
+ * @return the <var>destination</var> array
+ * @since 1.3
+ */
+ private static byte[] encode3to4(final byte[] source,
+ final int srcOffset,
+ final int numSigBytes,
+ final byte[] destination,
+ final int destOffset,
+ final int options)
+ {
+ byte[] ALPHABET = Base64.getAlphabet(options);
+
+ // 1 2 3
+ // 01234567890123456789012345678901 Bit position
+ // --------000000001111111122222222 Array position from threeBytes
+ // --------| || || || | Six bit groups to index ALPHABET
+ // >>18 >>12 >> 6 >> 0 Right shift necessary
+ // 0x3f 0x3f 0x3f Additional AND
+
+ // Create buffer with zero-padding if there are only one or two
+ // significant bytes passed in the array.
+ // We have to shift left 24 in order to flush out the 1's that appear
+ // when Java treats a value as negative that is cast from a byte to an int.
+ int inBuff = (numSigBytes > 0 ? source[srcOffset] << 24 >>> 8 : 0) | (numSigBytes > 1 ? source[srcOffset + 1] << 24 >>> 16
+ : 0) |
+ (numSigBytes > 2 ? source[srcOffset + 2] << 24 >>> 24 : 0);
+
+ switch (numSigBytes)
+ {
+ case 3:
+ destination[destOffset] = ALPHABET[(inBuff >>> 18)];
+ destination[destOffset + 1] = ALPHABET[inBuff >>> 12 & 0x3f];
+ destination[destOffset + 2] = ALPHABET[inBuff >>> 6 & 0x3f];
+ destination[destOffset + 3] = ALPHABET[inBuff & 0x3f];
+ return destination;
+
+ case 2:
+ destination[destOffset] = ALPHABET[(inBuff >>> 18)];
+ destination[destOffset + 1] = ALPHABET[inBuff >>> 12 & 0x3f];
+ destination[destOffset + 2] = ALPHABET[inBuff >>> 6 & 0x3f];
+ destination[destOffset + 3] = Base64.EQUALS_SIGN;
+ return destination;
+
+ case 1:
+ destination[destOffset] = ALPHABET[(inBuff >>> 18)];
+ destination[destOffset + 1] = ALPHABET[inBuff >>> 12 & 0x3f];
+ destination[destOffset + 2] = Base64.EQUALS_SIGN;
+ destination[destOffset + 3] = Base64.EQUALS_SIGN;
+ return destination;
+
+ default:
+ return destination;
+ } // end switch
+ } // end encode3to4
+
+ /**
+ * Serializes an object and returns the Base64-encoded
+ * version of that serialized object. If the object
+ * cannot be serialized or there is another error,
+ * the method will return <tt>null</tt>.
+ * The object is not GZip-compressed before being encoded.
+ *
+ * @param serializableObject The object to encode
+ * @return The Base64-encoded object
+ * @since 1.4
+ */
+ public static String encodeObject(final java.io.Serializable serializableObject)
+ {
+ return Base64.encodeObject(serializableObject, Base64.NO_OPTIONS);
+ } // end encodeObject
+
+ /**
+ * Serializes an object and returns the Base64-encoded
+ * version of that serialized object. If the object
+ * cannot be serialized or there is another error,
+ * the method will return <tt>null</tt>.
+ * <p>
+ * Valid options:<pre>
+ * GZIP: gzip-compresses object before encoding it.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>encodeObject( myObj, Base64.GZIP )</code> or
+ * <p>
+ * Example: <code>encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+ *
+ * @param serializableObject The object to encode
+ * @param options Specified options
+ * @return The Base64-encoded object
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeObject(final java.io.Serializable serializableObject, final int options)
+ {
+ // Streams
+ java.io.ByteArrayOutputStream baos = null;
+ java.io.OutputStream b64os = null;
+ java.io.ObjectOutputStream oos = null;
+ java.util.zip.GZIPOutputStream gzos = null;
+
+ // Isolate options
+ int gzip = options & Base64.GZIP;
+ int dontBreakLines = options & Base64.DONT_BREAK_LINES;
+
+ try
+ {
+ // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
+ baos = new java.io.ByteArrayOutputStream();
+ b64os = new Base64.OutputStream(baos, Base64.ENCODE | options);
+
+ // GZip?
+ if (gzip == Base64.GZIP)
+ {
+ gzos = new java.util.zip.GZIPOutputStream(b64os);
+ oos = new java.io.ObjectOutputStream(gzos);
+ } // end if: gzip
+ else
+ {
+ oos = new java.io.ObjectOutputStream(b64os);
+ }
+
+ oos.writeObject(serializableObject);
+ } // end try
+ catch (java.io.IOException e)
+ {
+ e.printStackTrace();
+ return null;
+ } // end catch
+ finally
+ {
+ try
+ {
+ oos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ gzos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ b64os.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ baos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ // Return value according to relevant encoding.
+ try
+ {
+ return new String(baos.toByteArray(), Base64.PREFERRED_ENCODING);
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ return new String(baos.toByteArray());
+ } // end catch
+
+ } // end encode
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * Does not GZip-compress data.
+ *
+ * @param source The data to convert
+ * @since 1.4
+ */
+ public static String encodeBytes(final byte[] source)
+ {
+ return Base64.encodeBytes(source, 0, source.length, Base64.NO_OPTIONS);
+ } // end encodeBytes
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * <p>
+ * Valid options:<pre>
+ * GZIP: gzip-compresses object before encoding it.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+ *
+ *
+ * @param source The data to convert
+ * @param options Specified options
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeBytes(final byte[] source, final int options)
+ {
+ return Base64.encodeBytes(source, 0, source.length, options);
+ } // end encodeBytes
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * Does not GZip-compress data.
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @since 1.4
+ */
+ public static String encodeBytes(final byte[] source, final int off, final int len)
+ {
+ return Base64.encodeBytes(source, off, len, Base64.NO_OPTIONS);
+ } // end encodeBytes
+
+ /**
+ * Encodes a byte array into Base64 notation.
+ * <p>
+ * Valid options:<pre>
+ * GZIP: gzip-compresses object before encoding it.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+ * <p>
+ * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+ *
+ *
+ * @param source The data to convert
+ * @param off Offset in array where conversion should begin
+ * @param len Length of data to convert
+ * @param options options alphabet type is pulled from this (standard, url-safe, ordered)
+ * @see Base64#GZIP
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public static String encodeBytes(final byte[] source, final int off, final int len, final int options)
+ {
+ // Isolate options
+ int dontBreakLines = options & Base64.DONT_BREAK_LINES;
+ int gzip = options & Base64.GZIP;
+
+ // Compress?
+ if (gzip == Base64.GZIP)
+ {
+ java.io.ByteArrayOutputStream baos = null;
+ java.util.zip.GZIPOutputStream gzos = null;
+ Base64.OutputStream b64os = null;
+
+ try
+ {
+ // GZip -> Base64 -> ByteArray
+ baos = new java.io.ByteArrayOutputStream();
+ b64os = new Base64.OutputStream(baos, Base64.ENCODE | options);
+ gzos = new java.util.zip.GZIPOutputStream(b64os);
+
+ gzos.write(source, off, len);
+ gzos.close();
+ } // end try
+ catch (java.io.IOException e)
+ {
+ e.printStackTrace();
+ return null;
+ } // end catch
+ finally
+ {
+ try
+ {
+ gzos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ b64os.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ baos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ // Return value according to relevant encoding.
+ try
+ {
+ return new String(baos.toByteArray(), Base64.PREFERRED_ENCODING);
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ return new String(baos.toByteArray());
+ } // end catch
+ } // end if: compress
+
+ // Else, don't compress. Better not to use streams at all then.
+ else
+ {
+ // Convert option to boolean in way that code likes it.
+ boolean breakLines = dontBreakLines == 0;
+
+ int len43 = len * 4 / 3;
+ byte[] outBuff = new byte[len43 + (len % 3 > 0 ? 4 : 0) // Account for padding
+ +
+ (breakLines ? len43 / Base64.MAX_LINE_LENGTH : 0)]; // New lines
+ int d = 0;
+ int e = 0;
+ int len2 = len - 2;
+ int lineLength = 0;
+ for (; d < len2; d += 3, e += 4)
+ {
+ Base64.encode3to4(source, d + off, 3, outBuff, e, options);
+
+ lineLength += 4;
+ if (breakLines && lineLength == Base64.MAX_LINE_LENGTH)
+ {
+ outBuff[e + 4] = Base64.NEW_LINE;
+ e++;
+ lineLength = 0;
+ } // end if: end of line
+ } // en dfor: each piece of array
+
+ if (d < len)
+ {
+ Base64.encode3to4(source, d + off, len - d, outBuff, e, options);
+ e += 4;
+ } // end if: some padding needed
+
+ // Return value according to relevant encoding.
+ try
+ {
+ return new String(outBuff, 0, e, Base64.PREFERRED_ENCODING);
+ } // end try
+ catch (java.io.UnsupportedEncodingException uue)
+ {
+ return new String(outBuff, 0, e);
+ } // end catch
+
+ } // end else: don't compress
+
+ } // end encodeBytes
+
+ /* ******** D E C O D I N G M E T H O D S ******** */
+
+ /**
+ * Decodes four bytes from array <var>source</var>
+ * and writes the resulting bytes (up to three of them)
+ * to <var>destination</var>.
+ * The source and destination arrays can be manipulated
+ * anywhere along their length by specifying
+ * <var>srcOffset</var> and <var>destOffset</var>.
+ * This method does not check to make sure your arrays
+ * are large enough to accomodate <var>srcOffset</var> + 4 for
+ * the <var>source</var> array or <var>destOffset</var> + 3 for
+ * the <var>destination</var> array.
+ * This method returns the actual number of bytes that
+ * were converted from the Base64 encoding.
+ * <p>This is the lowest level of the decoding methods with
+ * all possible parameters.</p>
+ *
+ *
+ * @param source the array to convert
+ * @param srcOffset the index where conversion begins
+ * @param destination the array to hold the conversion
+ * @param destOffset the index where output will be put
+ * @param options alphabet type is pulled from this (standard, url-safe, ordered)
+ * @return the number of decoded bytes converted
+ * @since 1.3
+ */
+ private static int decode4to3(final byte[] source,
+ final int srcOffset,
+ final byte[] destination,
+ final int destOffset,
+ final int options)
+ {
+ byte[] DECODABET = Base64.getDecodabet(options);
+
+ // Example: Dk==
+ if (source[srcOffset + 2] == Base64.EQUALS_SIGN)
+ {
+ // Two ways to do the same thing. Don't know which way I like best.
+ // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+ // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
+ int outBuff = (DECODABET[source[srcOffset]] & 0xFF) << 18 | (DECODABET[source[srcOffset + 1]] & 0xFF) << 12;
+
+ destination[destOffset] = (byte)(outBuff >>> 16);
+ return 1;
+ }
+
+ // Example: DkL=
+ else if (source[srcOffset + 3] == Base64.EQUALS_SIGN)
+ {
+ // Two ways to do the same thing. Don't know which way I like best.
+ // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+ // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+ // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
+ int outBuff = (DECODABET[source[srcOffset]] & 0xFF) << 18 | (DECODABET[source[srcOffset + 1]] & 0xFF) << 12 |
+ (DECODABET[source[srcOffset + 2]] & 0xFF) << 6;
+
+ destination[destOffset] = (byte)(outBuff >>> 16);
+ destination[destOffset + 1] = (byte)(outBuff >>> 8);
+ return 2;
+ }
+
+ // Example: DkLE
+ else
+ {
+ try
+ {
+ // Two ways to do the same thing. Don't know which way I like best.
+ // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+ // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+ // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
+ // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
+ int outBuff = (DECODABET[source[srcOffset]] & 0xFF) << 18 | (DECODABET[source[srcOffset + 1]] & 0xFF) << 12 |
+ (DECODABET[source[srcOffset + 2]] & 0xFF) << 6 |
+ DECODABET[source[srcOffset + 3]] &
+ 0xFF;
+
+ destination[destOffset] = (byte)(outBuff >> 16);
+ destination[destOffset + 1] = (byte)(outBuff >> 8);
+ destination[destOffset + 2] = (byte)outBuff;
+
+ return 3;
+ }
+ catch (Exception e)
+ {
+ System.out.println("" + source[srcOffset] + ": " + DECODABET[source[srcOffset]]);
+ System.out.println("" + source[srcOffset + 1] + ": " + DECODABET[source[srcOffset + 1]]);
+ System.out.println("" + source[srcOffset + 2] + ": " + DECODABET[source[srcOffset + 2]]);
+ System.out.println("" + source[srcOffset + 3] + ": " + DECODABET[source[srcOffset + 3]]);
+ return -1;
+ } // end catch
+ }
+ } // end decodeToBytes
+
+ /**
+ * Very low-level access to decoding ASCII characters in
+ * the form of a byte array. Does not support automatically
+ * gunzipping or any other "fancy" features.
+ *
+ * @param source The Base64 encoded data
+ * @param off The offset of where to begin decoding
+ * @param len The length of characters to decode
+ * @return decoded data
+ * @since 1.3
+ */
+ public static byte[] decode(final byte[] source, final int off, final int len, final int options)
+ {
+ byte[] DECODABET = Base64.getDecodabet(options);
+
+ int len34 = len * 3 / 4;
+ byte[] outBuff = new byte[len34]; // Upper limit on size of output
+ int outBuffPosn = 0;
+
+ byte[] b4 = new byte[4];
+ int b4Posn = 0;
+ int i = 0;
+ byte sbiCrop = 0;
+ byte sbiDecode = 0;
+ for (i = off; i < off + len; i++)
+ {
+ sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits
+ sbiDecode = DECODABET[sbiCrop];
+
+ if (sbiDecode >= Base64.WHITE_SPACE_ENC) // White space, Equals sign or better
+ {
+ if (sbiDecode >= Base64.EQUALS_SIGN_ENC)
+ {
+ b4[b4Posn++] = sbiCrop;
+ if (b4Posn > 3)
+ {
+ outBuffPosn += Base64.decode4to3(b4, 0, outBuff, outBuffPosn, options);
+ b4Posn = 0;
+
+ // If that was the equals sign, break out of 'for' loop
+ if (sbiCrop == Base64.EQUALS_SIGN)
+ {
+ break;
+ }
+ } // end if: quartet built
+
+ } // end if: equals sign or better
+
+ } // end if: white space, equals sign or better
+ else
+ {
+ System.err.println("Bad Base64 input character at " + i + ": " + source[i] + "(decimal)");
+ return null;
+ } // end else:
+ } // each input character
+
+ byte[] out = new byte[outBuffPosn];
+ System.arraycopy(outBuff, 0, out, 0, outBuffPosn);
+ return out;
+ } // end decode
+
+ /**
+ * Decodes data from Base64 notation, automatically
+ * detecting gzip-compressed data and decompressing it.
+ *
+ * @param s the string to decode
+ * @return the decoded data
+ * @since 1.4
+ */
+ public static byte[] decode(final String s)
+ {
+ return Base64.decode(s, Base64.NO_OPTIONS);
+ }
+
+ /**
+ * Decodes data from Base64 notation, automatically
+ * detecting gzip-compressed data and decompressing it.
+ *
+ * @param s the string to decode
+ * @param options encode options such as URL_SAFE
+ * @return the decoded data
+ * @since 1.4
+ */
+ public static byte[] decode(final String s, final int options)
+ {
+ byte[] bytes;
+ try
+ {
+ bytes = s.getBytes(Base64.PREFERRED_ENCODING);
+ } // end try
+ catch (java.io.UnsupportedEncodingException uee)
+ {
+ bytes = s.getBytes();
+ } // end catch
+ // </change>
+
+ // Decode
+ bytes = Base64.decode(bytes, 0, bytes.length, options);
+
+ // Check to see if it's gzip-compressed
+ // GZIP Magic Two-Byte Number: 0x8b1f (35615)
+ if (bytes != null && bytes.length >= 4)
+ {
+
+ int head = bytes[0] & 0xff | bytes[1] << 8 & 0xff00;
+ if (java.util.zip.GZIPInputStream.GZIP_MAGIC == head)
+ {
+ java.io.ByteArrayInputStream bais = null;
+ java.util.zip.GZIPInputStream gzis = null;
+ java.io.ByteArrayOutputStream baos = null;
+ byte[] buffer = new byte[2048];
+ int length = 0;
+
+ try
+ {
+ baos = new java.io.ByteArrayOutputStream();
+ bais = new java.io.ByteArrayInputStream(bytes);
+ gzis = new java.util.zip.GZIPInputStream(bais);
+
+ while ((length = gzis.read(buffer)) >= 0)
+ {
+ baos.write(buffer, 0, length);
+ } // end while: reading input
+
+ // No error? Get new bytes.
+ bytes = baos.toByteArray();
+
+ } // end try
+ catch (java.io.IOException e)
+ {
+ // Just return originally-decoded bytes
+ } // end catch
+ finally
+ {
+ try
+ {
+ baos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ gzis.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ bais.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ } // end if: gzipped
+ } // end if: bytes.length >= 2
+
+ return bytes;
+ } // end decode
+
+ /**
+ * Attempts to decode Base64 data and deserialize a Java
+ * Object within. Returns <tt>null</tt> if there was an error.
+ *
+ * @param encodedObject The Base64 data to decode
+ * @return The decoded and deserialized object
+ * @since 1.5
+ */
+ public static Object decodeToObject(final String encodedObject)
+ {
+ // Decode and gunzip if necessary
+ byte[] objBytes = Base64.decode(encodedObject);
+
+ java.io.ByteArrayInputStream bais = null;
+ java.io.ObjectInputStream ois = null;
+ Object obj = null;
+
+ try
+ {
+ bais = new java.io.ByteArrayInputStream(objBytes);
+ ois = new java.io.ObjectInputStream(bais);
+
+ obj = ois.readObject();
+ } // end try
+ catch (java.io.IOException e)
+ {
+ e.printStackTrace();
+ obj = null;
+ } // end catch
+ catch (java.lang.ClassNotFoundException e)
+ {
+ e.printStackTrace();
+ obj = null;
+ } // end catch
+ finally
+ {
+ try
+ {
+ bais.close();
+ }
+ catch (Exception e)
+ {
+ }
+ try
+ {
+ ois.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ return obj;
+ } // end decodeObject
+
+ /**
+ * Convenience method for encoding data to a file.
+ *
+ * @param dataToEncode byte array of data to encode in base64 form
+ * @param filename Filename for saving encoded data
+ * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+ *
+ * @since 2.1
+ */
+ public static boolean encodeToFile(final byte[] dataToEncode, final String filename)
+ {
+ boolean success = false;
+ Base64.OutputStream bos = null;
+ try
+ {
+ bos = new Base64.OutputStream(new java.io.FileOutputStream(filename), Base64.ENCODE);
+ bos.write(dataToEncode);
+ success = true;
+ } // end try
+ catch (java.io.IOException e)
+ {
+
+ success = false;
+ } // end catch: IOException
+ finally
+ {
+ try
+ {
+ bos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ return success;
+ } // end encodeToFile
+
+ /**
+ * Convenience method for decoding data to a file.
+ *
+ * @param dataToDecode Base64-encoded data as a string
+ * @param filename Filename for saving decoded data
+ * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+ *
+ * @since 2.1
+ */
+ public static boolean decodeToFile(final String dataToDecode, final String filename)
+ {
+ boolean success = false;
+ Base64.OutputStream bos = null;
+ try
+ {
+ bos = new Base64.OutputStream(new java.io.FileOutputStream(filename), Base64.DECODE);
+ bos.write(dataToDecode.getBytes(Base64.PREFERRED_ENCODING));
+ success = true;
+ } // end try
+ catch (java.io.IOException e)
+ {
+ success = false;
+ } // end catch: IOException
+ finally
+ {
+ try
+ {
+ bos.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ return success;
+ } // end decodeToFile
+
+ /**
+ * Convenience method for reading a base64-encoded
+ * file and decoding it.
+ *
+ * @param filename Filename for reading encoded data
+ * @return decoded byte array or null if unsuccessful
+ *
+ * @since 2.1
+ */
+ public static byte[] decodeFromFile(final String filename)
+ {
+ byte[] decodedData = null;
+ Base64.InputStream bis = null;
+ try
+ {
+ // Set up some useful variables
+ java.io.File file = new java.io.File(filename);
+ byte[] buffer = null;
+ int length = 0;
+ int numBytes = 0;
+
+ // Check for size of file
+ if (file.length() > Integer.MAX_VALUE)
+ {
+ System.err.println("File is too big for this convenience method (" + file.length() + " bytes).");
+ return null;
+ } // end if: file too big for int index
+ buffer = new byte[(int)file.length()];
+
+ // Open a stream
+ bis = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(file)), Base64.DECODE);
+
+ // Read until done
+ while ((numBytes = bis.read(buffer, length, 4096)) >= 0)
+ {
+ length += numBytes;
+ }
+
+ // Save in a variable to return
+ decodedData = new byte[length];
+ System.arraycopy(buffer, 0, decodedData, 0, length);
+
+ } // end try
+ catch (java.io.IOException e)
+ {
+ System.err.println("Error decoding from file " + filename);
+ } // end catch: IOException
+ finally
+ {
+ try
+ {
+ bis.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ return decodedData;
+ } // end decodeFromFile
+
+ /**
+ * Convenience method for reading a binary file
+ * and base64-encoding it.
+ *
+ * @param filename Filename for reading binary data
+ * @return base64-encoded string or null if unsuccessful
+ *
+ * @since 2.1
+ */
+ public static String encodeFromFile(final String filename)
+ {
+ String encodedData = null;
+ Base64.InputStream bis = null;
+ try
+ {
+ // Set up some useful variables
+ java.io.File file = new java.io.File(filename);
+ byte[] buffer = new byte[Math.max((int)(file.length() * 1.4), 40)]; // Need max() for math on small files
+ // (v2.2.1)
+ int length = 0;
+ int numBytes = 0;
+
+ // Open a stream
+ bis = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(file)), Base64.ENCODE);
+
+ // Read until done
+ while ((numBytes = bis.read(buffer, length, 4096)) >= 0)
+ {
+ length += numBytes;
+ }
+
+ // Save in a variable to return
+ encodedData = new String(buffer, 0, length, Base64.PREFERRED_ENCODING);
+
+ } // end try
+ catch (java.io.IOException e)
+ {
+ System.err.println("Error encoding from file " + filename);
+ } // end catch: IOException
+ finally
+ {
+ try
+ {
+ bis.close();
+ }
+ catch (Exception e)
+ {
+ }
+ } // end finally
+
+ return encodedData;
+ } // end encodeFromFile
+
+ /**
+ * Reads <tt>infile</tt> and encodes it to <tt>outfile</tt>.
+ *
+ * @param infile Input file
+ * @param outfile Output file
+ * @return true if the operation is successful
+ * @since 2.2
+ */
+ public static boolean encodeFileToFile(final String infile, final String outfile)
+ {
+ boolean success = false;
+ java.io.InputStream in = null;
+ java.io.OutputStream out = null;
+ try
+ {
+ in = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(infile)),
+ Base64.ENCODE);
+ out = new java.io.BufferedOutputStream(new java.io.FileOutputStream(outfile));
+ byte[] buffer = new byte[65536]; // 64K
+ int read = -1;
+ while ((read = in.read(buffer)) >= 0)
+ {
+ out.write(buffer, 0, read);
+ } // end while: through file
+ success = true;
+ }
+ catch (java.io.IOException exc)
+ {
+ exc.printStackTrace();
+ }
+ finally
+ {
+ try
+ {
+ in.close();
+ }
+ catch (Exception exc)
+ {
+ }
+ try
+ {
+ out.close();
+ }
+ catch (Exception exc)
+ {
+ }
+ } // end finally
+
+ return success;
+ } // end encodeFileToFile
+
+ /**
+ * Reads <tt>infile</tt> and decodes it to <tt>outfile</tt>.
+ *
+ * @param infile Input file
+ * @param outfile Output file
+ * @return true if the operation is successful
+ * @since 2.2
+ */
+ public static boolean decodeFileToFile(final String infile, final String outfile)
+ {
+ boolean success = false;
+ java.io.InputStream in = null;
+ java.io.OutputStream out = null;
+ try
+ {
+ in = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(infile)),
+ Base64.DECODE);
+ out = new java.io.BufferedOutputStream(new java.io.FileOutputStream(outfile));
+ byte[] buffer = new byte[65536]; // 64K
+ int read = -1;
+ while ((read = in.read(buffer)) >= 0)
+ {
+ out.write(buffer, 0, read);
+ } // end while: through file
+ success = true;
+ }
+ catch (java.io.IOException exc)
+ {
+ exc.printStackTrace();
+ }
+ finally
+ {
+ try
+ {
+ in.close();
+ }
+ catch (Exception exc)
+ {
+ }
+ try
+ {
+ out.close();
+ }
+ catch (Exception exc)
+ {
+ }
+ } // end finally
+
+ return success;
+ } // end decodeFileToFile
+
+ /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */
+
+ /**
+ * A {@link Base64.InputStream} will read data from another
+ * <tt>java.io.InputStream</tt>, given in the constructor,
+ * and encode/decode to/from Base64 notation on the fly.
+ *
+ * @see Base64
+ * @since 1.3
+ */
+ public static class InputStream extends java.io.FilterInputStream
+ {
+ private final boolean encode; // Encoding or decoding
+
+ private int position; // Current position in the buffer
+
+ private final byte[] buffer; // Small buffer holding converted data
+
+ private final int bufferLength; // Length of buffer (3 or 4)
+
+ private int numSigBytes; // Number of meaningful bytes in the buffer
+
+ private int lineLength;
+
+ private final boolean breakLines; // Break lines at less than 80 characters
+
+ private final int options; // Record options used to create the stream.
+
+ private final byte[] alphabet; // Local copies to avoid extra method calls
+
+ private final byte[] decodabet; // Local copies to avoid extra method calls
+
+ /**
+ * Constructs a {@link Base64.InputStream} in DECODE mode.
+ *
+ * @param in the <tt>java.io.InputStream</tt> from which to read data.
+ * @since 1.3
+ */
+ public InputStream(final java.io.InputStream in)
+ {
+ this(in, Base64.DECODE);
+ } // end constructor
+
+ /**
+ * Constructs a {@link Base64.InputStream} in
+ * either ENCODE or DECODE mode.
+ * <p>
+ * Valid options:<pre>
+ * ENCODE or DECODE: Encode or Decode as data is read.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * (only meaningful when encoding)
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>new Base64.InputStream( in, Base64.DECODE )</code>
+ *
+ *
+ * @param in the <tt>java.io.InputStream</tt> from which to read data.
+ * @param options Specified options
+ * @see Base64#ENCODE
+ * @see Base64#DECODE
+ * @see Base64#DONT_BREAK_LINES
+ * @since 2.0
+ */
+ public InputStream(final java.io.InputStream in, final int options)
+ {
+ super(in);
+ breakLines = (options & Base64.DONT_BREAK_LINES) != Base64.DONT_BREAK_LINES;
+ encode = (options & Base64.ENCODE) == Base64.ENCODE;
+ bufferLength = encode ? 4 : 3;
+ buffer = new byte[bufferLength];
+ position = -1;
+ lineLength = 0;
+ this.options = options; // Record for later, mostly to determine which alphabet to use
+ alphabet = Base64.getAlphabet(options);
+ decodabet = Base64.getDecodabet(options);
+ } // end constructor
+
+ /**
+ * Reads enough of the input stream to convert
+ * to/from Base64 and returns the next byte.
+ *
+ * @return next byte
+ * @since 1.3
+ */
+ @Override
+ public int read() throws java.io.IOException
+ {
+ // Do we need to get data?
+ if (position < 0)
+ {
+ if (encode)
+ {
+ byte[] b3 = new byte[3];
+ int numBinaryBytes = 0;
+ for (int i = 0; i < 3; i++)
+ {
+ try
+ {
+ int b = in.read();
+
+ // If end of stream, b is -1.
+ if (b >= 0)
+ {
+ b3[i] = (byte)b;
+ numBinaryBytes++;
+ } // end if: not end of stream
+
+ } // end try: read
+ catch (java.io.IOException e)
+ {
+ // Only a problem if we got no data at all.
+ if (i == 0)
+ {
+ throw e;
+ }
+
+ } // end catch
+ } // end for: each needed input byte
+
+ if (numBinaryBytes > 0)
+ {
+ Base64.encode3to4(b3, 0, numBinaryBytes, buffer, 0, options);
+ position = 0;
+ numSigBytes = 4;
+ } // end if: got data
+ else
+ {
+ return -1;
+ }
+ } // end if: encoding
+
+ // Else decoding
+ else
+ {
+ byte[] b4 = new byte[4];
+ int i = 0;
+ for (i = 0; i < 4; i++)
+ {
+ // Read four "meaningful" bytes:
+ int b = 0;
+ do
+ {
+ b = in.read();
+ }
+ while (b >= 0 && decodabet[b & 0x7f] <= Base64.WHITE_SPACE_ENC);
+
+ if (b < 0)
+ {
+ break; // Reads a -1 if end of stream
+ }
+
+ b4[i] = (byte)b;
+ } // end for: each needed input byte
+
+ if (i == 4)
+ {
+ numSigBytes = Base64.decode4to3(b4, 0, buffer, 0, options);
+ position = 0;
+ } // end if: got four characters
+ else if (i == 0)
+ {
+ return -1;
+ }
+ else
+ {
+ // Must have broken out from above.
+ throw new java.io.IOException("Improperly padded Base64 input.");
+ }
+
+ } // end else: decode
+ } // end else: get data
+
+ // Got data?
+ if (position >= 0)
+ {
+ // End of relevant data?
+ if ( /*!encode &&*/position >= numSigBytes)
+ {
+ return -1;
+ }
+
+ if (encode && breakLines && lineLength >= Base64.MAX_LINE_LENGTH)
+ {
+ lineLength = 0;
+ return '\n';
+ } // end if
+ else
+ {
+ lineLength++; // This isn't important when decoding
+ // but throwing an extra "if" seems
+ // just as wasteful.
+
+ int b = buffer[position++];
+
+ if (position >= bufferLength)
+ {
+ position = -1;
+ }
+
+ return b & 0xFF; // This is how you "cast" a byte that's
+ // intended to be unsigned.
+ } // end else
+ } // end if: position >= 0
+ else
+ {
+ // When JDK1.4 is more accepted, use an assertion here.
+ throw new java.io.IOException("Error in Base64 code reading stream.");
+ }
+ } // end read
+
+ /**
+ * Calls {@link #read()} repeatedly until the end of stream
+ * is reached or <var>len</var> bytes are read.
+ * Returns number of bytes read into array or -1 if
+ * end of stream is encountered.
+ *
+ * @param dest array to hold values
+ * @param off offset for array
+ * @param len max number of bytes to read into array
+ * @return bytes read into array or -1 if end of stream is encountered.
+ * @since 1.3
+ */
+ @Override
+ public int read(final byte[] dest, final int off, final int len) throws java.io.IOException
+ {
+ int i;
+ int b;
+ for (i = 0; i < len; i++)
+ {
+ b = read();
+
+ // if( b < 0 && i == 0 )
+ // return -1;
+
+ if (b >= 0)
+ {
+ dest[off + i] = (byte)b;
+ }
+ else if (i == 0)
+ {
+ return -1;
+ }
+ else
+ {
+ break; // Out of 'for' loop
+ }
+ } // end for: each byte read
+ return i;
+ } // end read
+
+ } // end inner class InputStream
+
+ /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */
+
+ /**
+ * A {@link Base64.OutputStream} will write data to another
+ * <tt>java.io.OutputStream</tt>, given in the constructor,
+ * and encode/decode to/from Base64 notation on the fly.
+ *
+ * @see Base64
+ * @since 1.3
+ */
+ public static class OutputStream extends java.io.FilterOutputStream
+ {
+ private final boolean encode;
+
+ private int position;
+
+ private byte[] buffer;
+
+ private final int bufferLength;
+
+ private int lineLength;
+
+ private final boolean breakLines;
+
+ private final byte[] b4; // Scratch used in a few places
+
+ private boolean suspendEncoding;
+
+ private final int options; // Record for later
+
+ private final byte[] alphabet; // Local copies to avoid extra method calls
+
+ private final byte[] decodabet; // Local copies to avoid extra method calls
+
+ /**
+ * Constructs a {@link Base64.OutputStream} in ENCODE mode.
+ *
+ * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+ * @since 1.3
+ */
+ public OutputStream(final java.io.OutputStream out)
+ {
+ this(out, Base64.ENCODE);
+ } // end constructor
+
+ /**
+ * Constructs a {@link Base64.OutputStream} in
+ * either ENCODE or DECODE mode.
+ * <p>
+ * Valid options:<pre>
+ * ENCODE or DECODE: Encode or Decode as data is read.
+ * DONT_BREAK_LINES: don't break lines at 76 characters
+ * (only meaningful when encoding)
+ * <i>Note: Technically, this makes your encoding non-compliant.</i>
+ * </pre>
+ * <p>
+ * Example: <code>new Base64.OutputStream( out, Base64.ENCODE )</code>
+ *
+ * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+ * @param options Specified options.
+ * @see Base64#ENCODE
+ * @see Base64#DECODE
+ * @see Base64#DONT_BREAK_LINES
+ * @since 1.3
+ */
+ public OutputStream(final java.io.OutputStream out, final int options)
+ {
+ super(out);
+ breakLines = (options & Base64.DONT_BREAK_LINES) != Base64.DONT_BREAK_LINES;
+ encode = (options & Base64.ENCODE) == Base64.ENCODE;
+ bufferLength = encode ? 3 : 4;
+ buffer = new byte[bufferLength];
+ position = 0;
+ lineLength = 0;
+ suspendEncoding = false;
+ b4 = new byte[4];
+ this.options = options;
+ alphabet = Base64.getAlphabet(options);
+ decodabet = Base64.getDecodabet(options);
+ } // end constructor
+
+ /**
+ * Writes the byte to the output stream after
+ * converting to/from Base64 notation.
+ * When encoding, bytes are buffered three
+ * at a time before the output stream actually
+ * gets a write() call.
+ * When decoding, bytes are buffered four
+ * at a time.
+ *
+ * @param theByte the byte to write
+ * @since 1.3
+ */
+ @Override
+ public void write(final int theByte) throws java.io.IOException
+ {
+ // Encoding suspended?
+ if (suspendEncoding)
+ {
+ super.out.write(theByte);
+ return;
+ } // end if: supsended
+
+ // Encode?
+ if (encode)
+ {
+ buffer[position++] = (byte)theByte;
+ if (position >= bufferLength) // Enough to encode.
+ {
+ out.write(Base64.encode3to4(b4, buffer, bufferLength, options));
+
+ lineLength += 4;
+ if (breakLines && lineLength >= Base64.MAX_LINE_LENGTH)
+ {
+ out.write(Base64.NEW_LINE);
+ lineLength = 0;
+ } // end if: end of line
+
+ position = 0;
+ } // end if: enough to output
+ } // end if: encoding
+
+ // Else, Decoding
+ else
+ {
+ // Meaningful Base64 character?
+ if (decodabet[theByte & 0x7f] > Base64.WHITE_SPACE_ENC)
+ {
+ buffer[position++] = (byte)theByte;
+ if (position >= bufferLength) // Enough to output.
+ {
+ int len = Base64.decode4to3(buffer, 0, b4, 0, options);
+ out.write(b4, 0, len);
+ // out.write( Base64.decode4to3( buffer ) );
+ position = 0;
+ } // end if: enough to output
+ } // end if: meaningful base64 character
+ else if (decodabet[theByte & 0x7f] != Base64.WHITE_SPACE_ENC)
+ {
+ throw new java.io.IOException("Invalid character in Base64 data.");
+ }
+ } // end else: decoding
+ } // end write
+
+ /**
+ * Calls {@link #write(int)} repeatedly until <var>len</var>
+ * bytes are written.
+ *
+ * @param theBytes array from which to read bytes
+ * @param off offset for array
+ * @param len max number of bytes to read into array
+ * @since 1.3
+ */
+ @Override
+ public void write(final byte[] theBytes, final int off, final int len) throws java.io.IOException
+ {
+ // Encoding suspended?
+ if (suspendEncoding)
+ {
+ super.out.write(theBytes, off, len);
+ return;
+ } // end if: supsended
+
+ for (int i = 0; i < len; i++)
+ {
+ write(theBytes[off + i]);
+ } // end for: each byte written
+
+ } // end write
+
+ /**
+ * Method added by PHIL. [Thanks, PHIL. -Rob]
+ * This pads the buffer without closing the stream.
+ */
+ public void flushBase64() throws java.io.IOException
+ {
+ if (position > 0)
+ {
+ if (encode)
+ {
+ out.write(Base64.encode3to4(b4, buffer, position, options));
+ position = 0;
+ } // end if: encoding
+ else
+ {
+ throw new java.io.IOException("Base64 input not properly padded.");
+ }
+ } // end if: buffer partially full
+
+ } // end flush
+
+ /**
+ * Flushes and closes (I think, in the superclass) the stream.
+ *
+ * @since 1.3
+ */
+ @Override
+ public void close() throws java.io.IOException
+ {
+ // 1. Ensure that pending characters are written
+ flushBase64();
+
+ // 2. Actually close the stream
+ // Base class both flushes and closes.
+ super.close();
+
+ buffer = null;
+ out = null;
+ } // end close
+
+ /**
+ * Suspends encoding of the stream.
+ * May be helpful if you need to embed a piece of
+ * base640-encoded data in a stream.
+ *
+ * @since 1.5.1
+ */
+ public void suspendEncoding() throws java.io.IOException
+ {
+ flushBase64();
+ suspendEncoding = true;
+ } // end suspendEncoding
+
+ /**
+ * Resumes encoding of the stream.
+ * May be helpful if you need to embed a piece of
+ * base640-encoded data in a stream.
+ *
+ * @since 1.5.1
+ */
+ public void resumeEncoding()
+ {
+ suspendEncoding = false;
+ } // end resumeEncoding
+
+ } // end inner class OutputStream
+
+} // end class Base64
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentHashSet.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentHashSet.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentHashSet.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentHashSet.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.utils;
+
+import java.util.AbstractSet;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ *
+ * A ConcurrentHashSet.
+ *
+ * Offers same concurrency as ConcurrentHashMap but for a Set
+ *
+ * @author <a href="tim.fox(a)jboss.com">Tim Fox</a>
+ * @version <tt>$Revision: 1935 $</tt>
+ *
+ * $Id: ConcurrentReaderHashSet.java 1935 2007-01-09 23:29:20Z clebert.suconic(a)jboss.com $
+ */
+public class ConcurrentHashSet<E> extends AbstractSet<E> implements ConcurrentSet<E>
+{
+ private final ConcurrentMap<E, Object> theMap;
+
+ private static final Object dummy = new Object();
+
+ public ConcurrentHashSet()
+ {
+ theMap = new ConcurrentHashMap<E, Object>();
+ }
+
+ @Override
+ public int size()
+ {
+ return theMap.size();
+ }
+
+ @Override
+ public Iterator<E> iterator()
+ {
+ return theMap.keySet().iterator();
+ }
+
+ @Override
+ public boolean isEmpty()
+ {
+ return theMap.isEmpty();
+ }
+
+ @Override
+ public boolean add(final E o)
+ {
+ return theMap.put(o, ConcurrentHashSet.dummy) == null;
+ }
+
+ @Override
+ public boolean contains(final Object o)
+ {
+ return theMap.containsKey(o);
+ }
+
+ @Override
+ public void clear()
+ {
+ theMap.clear();
+ }
+
+ @Override
+ public boolean remove(final Object o)
+ {
+ return theMap.remove(o) == ConcurrentHashSet.dummy;
+ }
+
+ public boolean addIfAbsent(final E o)
+ {
+ Object obj = theMap.putIfAbsent(o, ConcurrentHashSet.dummy);
+
+ return obj == null;
+ }
+
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentSet.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentSet.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentSet.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/ConcurrentSet.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.utils;
+
+import java.util.Set;
+
+/**
+ *
+ * A ConcurrentSet
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ * @param <E>
+ */
+public interface ConcurrentSet<E> extends Set<E>
+{
+ boolean addIfAbsent(E o);
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/HornetQThreadFactory.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/HornetQThreadFactory.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/HornetQThreadFactory.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/HornetQThreadFactory.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.utils;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.hornetq.core.logging.Logger;
+
+/**
+ *
+ * A HornetQThreadFactory
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ */
+public class HornetQThreadFactory implements ThreadFactory
+{
+ private static final Logger log = Logger.getLogger(HornetQThreadFactory.class);
+
+ private final ThreadGroup group;
+
+ private final AtomicInteger threadCount = new AtomicInteger(0);
+
+ private final int threadPriority;
+
+ private final boolean daemon;
+
+ private final ClassLoader tccl;
+
+ public HornetQThreadFactory(final String groupName, final boolean daemon, final ClassLoader tccl)
+ {
+ this(groupName, Thread.NORM_PRIORITY, daemon, tccl);
+ }
+
+ public HornetQThreadFactory(final String groupName, final int threadPriority, final boolean daemon, final ClassLoader tccl)
+ {
+ group = new ThreadGroup(groupName + "-" + System.identityHashCode(this));
+
+ this.threadPriority = threadPriority;
+
+ this.tccl = tccl;
+
+ this.daemon = daemon;
+ }
+
+ public Thread newThread(final Runnable command)
+ {
+ final Thread t;
+ // attach the thread to a group only if there is no security manager:
+ // when sandboxed, the code does not have the RuntimePermission modifyThreadGroup
+ if (System.getSecurityManager() == null)
+ {
+ t = new Thread(group, command, "Thread-" + threadCount.getAndIncrement() + " (group:" + group.getName() + ")");
+ }
+ else
+ {
+ t = new Thread(command, "Thread-" + threadCount.getAndIncrement());
+ }
+
+ AccessController.doPrivileged(new PrivilegedAction<Object>()
+ {
+ public Object run()
+ {
+ t.setDaemon(daemon);
+ t.setPriority(threadPriority);
+ return null;
+ }
+ });
+
+ try
+ {
+ AccessController.doPrivileged(new PrivilegedAction<Object>()
+ {
+ public Object run()
+ {
+ t.setContextClassLoader(tccl);
+ return null;
+ }
+ });
+ }
+ catch (java.security.AccessControlException e)
+ {
+ log.warn("Missing privileges to set Thread Context Class Loader on Thread Factory. Using current Thread Context Class Loader");
+ }
+
+ return t;
+ }
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/ReusableLatch.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/ReusableLatch.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/ReusableLatch.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/ReusableLatch.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.utils;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.AbstractQueuedSynchronizer;
+
+/**
+ *
+ * <p>This class will use the framework provided to by AbstractQueuedSynchronizer.</p>
+ * <p>AbstractQueuedSynchronizer is the framework for any sort of concurrent synchronization, such as Semaphores, events, etc, based on AtomicIntegers.</p>
+ *
+ * <p>This class works just like CountDownLatch, with the difference you can also increase the counter</p>
+ *
+ * <p>It could be used for sync points when one process is feeding the latch while another will wait when everything is done. (e.g. waiting IO completions to finish)</p>
+ *
+ * <p>On HornetQ we have the requirement of increment and decrement a counter until the user fires a ready event (commit). At that point we just act as a regular countDown.</p>
+ *
+ * <p>Note: This latch is reusable. Once it reaches zero, you can call up again, and reuse it on further waits.</p>
+ *
+ * <p>For example: prepareTransaction will wait for the current completions, and further adds will be called on the latch. Later on when commit is called you can reuse the same latch.</p>
+ *
+ * @author Clebert Suconic
+ * */
+public class ReusableLatch
+{
+ /**
+ * Look at the doc and examples provided by AbstractQueuedSynchronizer for more information
+ * @see AbstractQueuedSynchronizer*/
+ @SuppressWarnings("serial")
+ private static class CountSync extends AbstractQueuedSynchronizer
+ {
+ public CountSync(int count)
+ {
+ setState(count);
+ }
+
+ public int getCount()
+ {
+ return getState();
+ }
+
+ public void setCount(final int count)
+ {
+ setState(count);
+ }
+
+ @Override
+ public int tryAcquireShared(final int numberOfAqcquires)
+ {
+ return getState() == 0 ? 1 : -1;
+ }
+
+ public void add()
+ {
+ for (;;)
+ {
+ int actualState = getState();
+ int newState = actualState + 1;
+ if (compareAndSetState(actualState, newState))
+ {
+ return;
+ }
+ }
+ }
+
+ @Override
+ public boolean tryReleaseShared(final int numberOfReleases)
+ {
+ for (;;)
+ {
+ int actualState = getState();
+ if (actualState == 0)
+ {
+ return true;
+ }
+
+ int newState = actualState - numberOfReleases;
+
+ if (newState < 0)
+ {
+ newState = 0;
+ }
+
+ if (compareAndSetState(actualState, newState))
+ {
+ return newState == 0;
+ }
+ }
+ }
+ }
+
+ private final CountSync control;
+
+ public ReusableLatch()
+ {
+ this(0);
+ }
+
+ public ReusableLatch(final int count)
+ {
+ control = new CountSync(count);
+ }
+
+ public int getCount()
+ {
+ return control.getCount();
+ }
+
+ public void setCount(final int count)
+ {
+ control.setCount(count);
+ }
+
+ public void countUp()
+ {
+ control.add();
+ }
+
+ public void countDown()
+ {
+ control.releaseShared(1);
+ }
+
+
+ public void countDown(final int count)
+ {
+ control.releaseShared(count);
+ }
+
+ public void await() throws InterruptedException
+ {
+ control.acquireSharedInterruptibly(1);
+ }
+
+ public boolean await(final long milliseconds) throws InterruptedException
+ {
+ return control.tryAcquireSharedNanos(1, TimeUnit.MILLISECONDS.toNanos(milliseconds));
+ }
+
+ public boolean await(final long timeWait, TimeUnit timeUnit) throws InterruptedException
+ {
+ return control.tryAcquireSharedNanos(1, timeUnit.toNanos(timeWait));
+ }
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/TypedProperties.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/TypedProperties.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/TypedProperties.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/TypedProperties.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,1060 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.utils;
+
+import static org.hornetq.utils.DataConstants.BOOLEAN;
+import static org.hornetq.utils.DataConstants.BYTE;
+import static org.hornetq.utils.DataConstants.BYTES;
+import static org.hornetq.utils.DataConstants.CHAR;
+import static org.hornetq.utils.DataConstants.DOUBLE;
+import static org.hornetq.utils.DataConstants.FLOAT;
+import static org.hornetq.utils.DataConstants.INT;
+import static org.hornetq.utils.DataConstants.LONG;
+import static org.hornetq.utils.DataConstants.NULL;
+import static org.hornetq.utils.DataConstants.SHORT;
+import static org.hornetq.utils.DataConstants.STRING;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.hornetq.api.core.HornetQBuffer;
+import org.hornetq.api.core.PropertyConversionException;
+import org.hornetq.api.core.SimpleString;
+import org.hornetq.core.logging.Logger;
+
+/**
+ *
+ * Property Value Conversion.
+ * <p>
+ * This implementation follows section 3.5.4 of the <i>Java Message Service<i>
+ * specification (Version 1.1 April 12, 2002).
+ * <p>
+ * TODO - should have typed property getters and do conversions herein
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ * @author <a href="mailto:clebert.suconic@jboss.com">Clebert Suconic</a>
+ * @see <i>Java Message Service<i> specification (Version 1.1 April 12, 2002), section 3.5.4.
+ */
+public class TypedProperties
+{
+ private static final Logger log = Logger.getLogger(TypedProperties.class);
+
+ private static final SimpleString HQ_PROPNAME = new SimpleString("_HQ_");
+
+ private Map<SimpleString, PropertyValue> properties;
+
+ private volatile int size;
+
+ private boolean internalProperties;
+
+ public TypedProperties()
+ {
+ }
+
+ public int getMemoryOffset()
+ {
+ // The estimate is basically the encode size + 2 object references for each entry in the map
+ // Note we don't include the attributes or anything else since they already included in the memory estimate
+ // of the ServerMessage
+
+ return properties == null ? 0 : size + 2 * DataConstants.SIZE_INT * properties.size();
+ }
+
+ public TypedProperties(final TypedProperties other)
+ {
+ properties = other.properties == null ? null : new HashMap<SimpleString, PropertyValue>(other.properties);
+ size = other.size;
+ }
+
+ public boolean hasInternalProperties()
+ {
+ return internalProperties;
+ }
+
+ public void putBooleanProperty(final SimpleString key, final boolean value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new BooleanValue(value));
+ }
+
+ public void putByteProperty(final SimpleString key, final byte value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new ByteValue(value));
+ }
+
+ public void putBytesProperty(final SimpleString key, final byte[] value)
+ {
+ checkCreateProperties();
+ doPutValue(key, value == null ? new NullValue() : new BytesValue(value));
+ }
+
+ public void putShortProperty(final SimpleString key, final short value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new ShortValue(value));
+ }
+
+ public void putIntProperty(final SimpleString key, final int value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new IntValue(value));
+ }
+
+ public void putLongProperty(final SimpleString key, final long value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new LongValue(value));
+ }
+
+ public void putFloatProperty(final SimpleString key, final float value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new FloatValue(value));
+ }
+
+ public void putDoubleProperty(final SimpleString key, final double value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new DoubleValue(value));
+ }
+
+ public void putSimpleStringProperty(final SimpleString key, final SimpleString value)
+ {
+ checkCreateProperties();
+ doPutValue(key, value == null ? new NullValue() : new StringValue(value));
+ }
+
+ public void putCharProperty(final SimpleString key, final char value)
+ {
+ checkCreateProperties();
+ doPutValue(key, new CharValue(value));
+ }
+
+ public void putTypedProperties(final TypedProperties otherProps)
+ {
+ if (otherProps == null || otherProps.properties == null)
+ {
+ return;
+ }
+
+ checkCreateProperties();
+ Set<Entry<SimpleString, PropertyValue>> otherEntries = otherProps.properties.entrySet();
+ for (Entry<SimpleString, PropertyValue> otherEntry : otherEntries)
+ {
+ doPutValue(otherEntry.getKey(), otherEntry.getValue());
+ }
+ }
+
+ public Object getProperty(final SimpleString key)
+ {
+ return doGetProperty(key);
+ }
+
+ public Boolean getBooleanProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ return Boolean.valueOf(null);
+ }
+ else if (value instanceof Boolean)
+ {
+ return (Boolean)value;
+ }
+ else if (value instanceof SimpleString)
+ {
+ return Boolean.valueOf(((SimpleString)value).toString()).booleanValue();
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid conversion");
+ }
+ }
+
+ public Byte getByteProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ return Byte.valueOf(null);
+ }
+ else if (value instanceof Byte)
+ {
+ return (Byte)value;
+ }
+ else if (value instanceof SimpleString)
+ {
+ return Byte.parseByte(((SimpleString)value).toString());
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid conversion");
+ }
+ }
+
+ public Character getCharProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ throw new NullPointerException("Invalid conversion");
+ }
+
+ if (value instanceof Character)
+ {
+ return ((Character)value).charValue();
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid conversion");
+ }
+ }
+
+ public byte[] getBytesProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ return null;
+ }
+ else if (value instanceof byte[])
+ {
+ return (byte[])value;
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid conversion");
+ }
+ }
+
+ public Double getDoubleProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ return Double.valueOf(null);
+ }
+ else if (value instanceof Float)
+ {
+ return ((Float)value).doubleValue();
+ }
+ else if (value instanceof Double)
+ {
+ return (Double)value;
+ }
+ else if (value instanceof SimpleString)
+ {
+ return Double.parseDouble(((SimpleString)value).toString());
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid conversion");
+ }
+ }
+
+ public Integer getIntProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ return Integer.valueOf(null);
+ }
+ else if (value instanceof Integer)
+ {
+ return (Integer)value;
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte)value).intValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short)value).intValue();
+ }
+ else if (value instanceof SimpleString)
+ {
+ return Integer.parseInt(((SimpleString)value).toString());
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid conversion");
+ }
+ }
+
+ public Long getLongProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ return Long.valueOf(null);
+ }
+ else if (value instanceof Long)
+ {
+ return (Long)value;
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte)value).longValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short)value).longValue();
+ }
+ else if (value instanceof Integer)
+ {
+ return ((Integer)value).longValue();
+ }
+ else if (value instanceof SimpleString)
+ {
+ return Long.parseLong(((SimpleString)value).toString());
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid conversion");
+ }
+ }
+
+ public Short getShortProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ {
+ return Short.valueOf(null);
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte)value).shortValue();
+ }
+ else if (value instanceof Short)
+ {
+ return (Short)value;
+ }
+ else if (value instanceof SimpleString)
+ {
+ return Short.parseShort(((SimpleString)value).toString());
+ }
+ else
+ {
+ throw new PropertyConversionException("Invalid Conversion.");
+ }
+ }
+
+ public Float getFloatProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+ if (value == null)
+ return Float.valueOf(null);
+ if (value instanceof Float)
+ {
+ return ((Float)value).floatValue();
+ }
+ if (value instanceof SimpleString)
+ {
+ return Float.parseFloat(((SimpleString)value).toString());
+ }
+ throw new PropertyConversionException("Invalid conversion: " + key);
+ }
+
+ public SimpleString getSimpleStringProperty(final SimpleString key) throws PropertyConversionException
+ {
+ Object value = doGetProperty(key);
+
+ if (value == null)
+ {
+ return null;
+ }
+
+ if (value instanceof SimpleString)
+ {
+ return (SimpleString)value;
+ }
+ else if (value instanceof Boolean)
+ {
+ return new SimpleString(value.toString());
+ }
+ else if (value instanceof Character)
+ {
+ return new SimpleString(value.toString());
+ }
+ else if (value instanceof Byte)
+ {
+ return new SimpleString(value.toString());
+ }
+ else if (value instanceof Short)
+ {
+ return new SimpleString(value.toString());
+ }
+ else if (value instanceof Integer)
+ {
+ return new SimpleString(value.toString());
+ }
+ else if (value instanceof Long)
+ {
+ return new SimpleString(value.toString());
+ }
+ else if (value instanceof Float)
+ {
+ return new SimpleString(value.toString());
+ }
+ else if (value instanceof Double)
+ {
+ return new SimpleString(value.toString());
+ }
+ throw new PropertyConversionException("Invalid conversion");
+ }
+
+ public Object removeProperty(final SimpleString key)
+ {
+ return doRemoveProperty(key);
+ }
+
+ public boolean containsProperty(final SimpleString key)
+ {
+ if (size == 0)
+ {
+ return false;
+
+ }
+ else
+ {
+ return properties.containsKey(key);
+ }
+ }
+
+ public Set<SimpleString> getPropertyNames()
+ {
+ if (size == 0)
+ {
+ return Collections.emptySet();
+ }
+ else
+ {
+ return properties.keySet();
+ }
+ }
+
+ public synchronized void decode(final HornetQBuffer buffer)
+ {
+ byte b = buffer.readByte();
+
+ if (b == DataConstants.NULL)
+ {
+ properties = null;
+ }
+ else
+ {
+ int numHeaders = buffer.readInt();
+
+ properties = new HashMap<SimpleString, PropertyValue>(numHeaders);
+ size = 0;
+
+ for (int i = 0; i < numHeaders; i++)
+ {
+ int len = buffer.readInt();
+ byte[] data = new byte[len];
+ buffer.readBytes(data);
+ SimpleString key = new SimpleString(data);
+
+ byte type = buffer.readByte();
+
+ PropertyValue val;
+
+ switch (type)
+ {
+ case NULL:
+ {
+ val = new NullValue();
+ doPutValue(key, val);
+ break;
+ }
+ case CHAR:
+ {
+ val = new CharValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case BOOLEAN:
+ {
+ val = new BooleanValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case BYTE:
+ {
+ val = new ByteValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case BYTES:
+ {
+ val = new BytesValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case SHORT:
+ {
+ val = new ShortValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case INT:
+ {
+ val = new IntValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case LONG:
+ {
+ val = new LongValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case FLOAT:
+ {
+ val = new FloatValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case DOUBLE:
+ {
+ val = new DoubleValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ case STRING:
+ {
+ val = new StringValue(buffer);
+ doPutValue(key, val);
+ break;
+ }
+ default:
+ {
+ throw new IllegalArgumentException("Invalid type: " + type);
+ }
+ }
+ }
+ }
+ }
+
+ public synchronized void encode(final HornetQBuffer buffer)
+ {
+ if (properties == null)
+ {
+ buffer.writeByte(DataConstants.NULL);
+ }
+ else
+ {
+ buffer.writeByte(DataConstants.NOT_NULL);
+
+ buffer.writeInt(properties.size());
+
+ for (Map.Entry<SimpleString, PropertyValue> entry : properties.entrySet())
+ {
+ SimpleString s = entry.getKey();
+ byte[] data = s.getData();
+ buffer.writeInt(data.length);
+ buffer.writeBytes(data);
+
+ entry.getValue().write(buffer);
+ }
+ }
+ }
+
+ public int getEncodeSize()
+ {
+ if (properties == null)
+ {
+ return DataConstants.SIZE_BYTE;
+ }
+ else
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + size;
+ }
+ }
+
+ public void clear()
+ {
+ if (properties != null)
+ {
+ properties.clear();
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return "TypedProperties[" + properties + "]";
+ }
+
+ // Private ------------------------------------------------------------------------------------
+
+ private void checkCreateProperties()
+ {
+ if (properties == null)
+ {
+ properties = new HashMap<SimpleString, PropertyValue>();
+ }
+ }
+
+ private synchronized void doPutValue(final SimpleString key, final PropertyValue value)
+ {
+ if (key.startsWith(HQ_PROPNAME))
+ {
+ internalProperties = true;
+ }
+
+ PropertyValue oldValue = properties.put(key, value);
+ if (oldValue != null)
+ {
+ size += value.encodeSize() - oldValue.encodeSize();
+ }
+ else
+ {
+ size += SimpleString.sizeofString(key) + value.encodeSize();
+ }
+ }
+
+ private synchronized Object doRemoveProperty(final SimpleString key)
+ {
+ if (properties == null)
+ {
+ return null;
+ }
+
+ PropertyValue val = properties.remove(key);
+
+ if (val == null)
+ {
+ return null;
+ }
+ else
+ {
+ size -= SimpleString.sizeofString(key) + val.encodeSize();
+
+ return val.getValue();
+ }
+ }
+
+ private synchronized Object doGetProperty(final Object key)
+ {
+ if (size == 0)
+ {
+ return null;
+ }
+
+ PropertyValue val = properties.get(key);
+
+ if (val == null)
+ {
+ return null;
+ }
+ else
+ {
+ return val.getValue();
+ }
+ }
+
+ // Inner classes ------------------------------------------------------------------------------
+
+ private static abstract class PropertyValue
+ {
+ abstract Object getValue();
+
+ abstract void write(HornetQBuffer buffer);
+
+ abstract int encodeSize();
+
+ @Override
+ public String toString()
+ {
+ return "" + getValue();
+ }
+ }
+
+ private static final class NullValue extends PropertyValue
+ {
+ public NullValue()
+ {
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return null;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.NULL);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE;
+ }
+
+ }
+
+ private static final class BooleanValue extends PropertyValue
+ {
+ final boolean val;
+
+ public BooleanValue(final boolean val)
+ {
+ this.val = val;
+ }
+
+ public BooleanValue(final HornetQBuffer buffer)
+ {
+ val = buffer.readBoolean();
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.BOOLEAN);
+ buffer.writeBoolean(val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_BOOLEAN;
+ }
+
+ }
+
+ private static final class ByteValue extends PropertyValue
+ {
+ final byte val;
+
+ public ByteValue(final byte val)
+ {
+ this.val = val;
+ }
+
+ public ByteValue(final HornetQBuffer buffer)
+ {
+ val = buffer.readByte();
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.BYTE);
+ buffer.writeByte(val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_BYTE;
+ }
+ }
+
+ private static final class BytesValue extends PropertyValue
+ {
+ final byte[] val;
+
+ public BytesValue(final byte[] val)
+ {
+ this.val = val;
+ }
+
+ public BytesValue(final HornetQBuffer buffer)
+ {
+ int len = buffer.readInt();
+ val = new byte[len];
+ buffer.readBytes(val);
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.BYTES);
+ buffer.writeInt(val.length);
+ buffer.writeBytes(val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + val.length;
+ }
+
+ }
+
+ private static final class ShortValue extends PropertyValue
+ {
+ final short val;
+
+ public ShortValue(final short val)
+ {
+ this.val = val;
+ }
+
+ public ShortValue(final HornetQBuffer buffer)
+ {
+ val = buffer.readShort();
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.SHORT);
+ buffer.writeShort(val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_SHORT;
+ }
+ }
+
+ private static final class IntValue extends PropertyValue
+ {
+ final int val;
+
+ public IntValue(final int val)
+ {
+ this.val = val;
+ }
+
+ public IntValue(final HornetQBuffer buffer)
+ {
+ val = buffer.readInt();
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.INT);
+ buffer.writeInt(val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT;
+ }
+ }
+
+ private static final class LongValue extends PropertyValue
+ {
+ final long val;
+
+ public LongValue(final long val)
+ {
+ this.val = val;
+ }
+
+ public LongValue(final HornetQBuffer buffer)
+ {
+ val = buffer.readLong();
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.LONG);
+ buffer.writeLong(val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_LONG;
+ }
+ }
+
+ private static final class FloatValue extends PropertyValue
+ {
+ final float val;
+
+ public FloatValue(final float val)
+ {
+ this.val = val;
+ }
+
+ public FloatValue(final HornetQBuffer buffer)
+ {
+ val = Float.intBitsToFloat(buffer.readInt());
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.FLOAT);
+ buffer.writeInt(Float.floatToIntBits(val));
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_FLOAT;
+ }
+
+ }
+
+ private static final class DoubleValue extends PropertyValue
+ {
+ final double val;
+
+ public DoubleValue(final double val)
+ {
+ this.val = val;
+ }
+
+ public DoubleValue(final HornetQBuffer buffer)
+ {
+ val = Double.longBitsToDouble(buffer.readLong());
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.DOUBLE);
+ buffer.writeLong(Double.doubleToLongBits(val));
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_DOUBLE;
+ }
+ }
+
+ private static final class CharValue extends PropertyValue
+ {
+ final char val;
+
+ public CharValue(final char val)
+ {
+ this.val = val;
+ }
+
+ public CharValue(final HornetQBuffer buffer)
+ {
+ val = (char)buffer.readShort();
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.CHAR);
+ buffer.writeShort((short)val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_CHAR;
+ }
+ }
+
+ private static final class StringValue extends PropertyValue
+ {
+ final SimpleString val;
+
+ public StringValue(final SimpleString val)
+ {
+ this.val = val;
+ }
+
+ public StringValue(final HornetQBuffer buffer)
+ {
+ val = buffer.readSimpleString();
+ }
+
+ @Override
+ public Object getValue()
+ {
+ return val;
+ }
+
+ @Override
+ public void write(final HornetQBuffer buffer)
+ {
+ buffer.writeByte(DataConstants.STRING);
+ buffer.writeSimpleString(val);
+ }
+
+ @Override
+ public int encodeSize()
+ {
+ return DataConstants.SIZE_BYTE + SimpleString.sizeofString(val);
+ }
+ }
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUID.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/UUID.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUID.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUID.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,236 @@
+/* JUG Java Uuid Generator
+ *
+ * Copyright (c) 2002- Tatu Saloranta, tatu.saloranta(a)iki.fi
+ *
+ * Licensed under the License specified in the file licenses/LICENSE.txt which is
+ * included with the source code.
+ * You may not use this file except in compliance with the License.
+ *
+ * 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.hornetq.utils;
+
+/**
+ * UUID represents Universally Unique Identifiers (aka Global UID in Windows
+ * world). UUIDs are usually generated via UUIDGenerator (or in case of 'Null
+ * UUID', 16 zero bytes, via static method getNullUUID()), or received from
+ * external systems.
+ *
+ * By default class caches the string presentations of UUIDs so that description
+ * is only created the first time it's needed. For memory stingy applications
+ * this caching can be turned off (note though that if uuid.toString() is never
+ * called, desc is never calculated so only loss is the space allocated for the
+ * desc pointer... which can of course be commented out to save memory).
+ *
+ * Similarly, hash code is calculated when it's needed for the first time, and
+ * from thereon that value is just returned. This means that using UUIDs as keys
+ * should be reasonably efficient.
+ *
+ * UUIDs can be compared for equality, serialized, cloned and even sorted.
+ * Equality is a simple bit-wise comparison. Ordering (for sorting) is done by
+ * first ordering based on type (in the order of numeric values of types),
+ * secondarily by time stamp (only for time-based time stamps), and finally by
+ * straight numeric byte-by-byte comparison (from most to least significant
+ * bytes).
+ */
+
+public final class UUID
+{
+ private final static String kHexChars = "0123456789abcdefABCDEF";
+
+ public final static byte INDEX_CLOCK_HI = 6;
+
+ public final static byte INDEX_CLOCK_MID = 4;
+
+ public final static byte INDEX_CLOCK_LO = 0;
+
+ public final static byte INDEX_TYPE = 6;
+
+ // Clock seq. & variant are multiplexed...
+ public final static byte INDEX_CLOCK_SEQUENCE = 8;
+
+ public final static byte INDEX_VARIATION = 8;
+
+ public final static byte TYPE_NULL = 0;
+
+ public final static byte TYPE_TIME_BASED = 1;
+
+ public final static byte TYPE_DCE = 2; // Not used
+
+ public final static byte TYPE_NAME_BASED = 3;
+
+ public final static byte TYPE_RANDOM_BASED = 4;
+
+ /*
+ * 'Standard' namespaces defined (suggested) by UUID specs:
+ */
+ public final static String NAMESPACE_DNS = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
+
+ public final static String NAMESPACE_URL = "6ba7b811-9dad-11d1-80b4-00c04fd430c8";
+
+ public final static String NAMESPACE_OID = "6ba7b812-9dad-11d1-80b4-00c04fd430c8";
+
+ public final static String NAMESPACE_X500 = "6ba7b814-9dad-11d1-80b4-00c04fd430c8";
+
+ /*
+ * By default let's cache desc, can be turned off. For hash code there's no
+ * point in turning it off (since the int is already part of the instance
+ * memory allocation); if you want to save those 4 bytes (or possibly bit
+ * more if alignment is bad) just comment out hash caching.
+ */
+ private static boolean sDescCaching = true;
+
+ private final byte[] mId;
+
+ // Both string presentation and hash value may be cached...
+ private transient String mDesc = null;
+
+ private transient int mHashCode = 0;
+
+ /**
+ *
+ *
+ * @param type
+ * UUID type
+ * @param data
+ * 16 byte UUID contents
+ */
+ public UUID(final int type, final byte[] data)
+ {
+ mId = data;
+ // Type is multiplexed with time_hi:
+ mId[UUID.INDEX_TYPE] &= (byte)0x0F;
+ mId[UUID.INDEX_TYPE] |= (byte)(type << 4);
+ // Variant masks first two bits of the clock_seq_hi:
+ mId[UUID.INDEX_VARIATION] &= (byte)0x3F;
+ mId[UUID.INDEX_VARIATION] |= (byte)0x80;
+ }
+
+ public final byte[] asBytes()
+ {
+ return mId;
+ }
+
+ /**
+ * Could use just the default hash code, but we can probably create a better
+ * identity hash (ie. same contents generate same hash) manually, without
+ * sacrificing speed too much. Although multiplications with modulos would
+ * generate better hashing, let's use just shifts, and do 2 bytes at a time.
+ * <p>
+ * Of course, assuming UUIDs are randomized enough, even simpler approach
+ * might be good enough?
+ * <p>
+ * Is this a good hash? ... one of these days I better read more about basic
+ * hashing techniques I swear!
+ */
+ private final static int[] kShifts = { 3, 7, 17, 21, 29, 4, 9 };
+
+ @Override
+ public final int hashCode()
+ {
+ if (mHashCode == 0)
+ {
+ // Let's handle first and last byte separately:
+ int result = mId[0] & 0xFF;
+
+ result |= result << 16;
+ result |= result << 8;
+
+ for (int i = 1; i < 15; i += 2)
+ {
+ int curr = (mId[i] & 0xFF) << 8 | mId[i + 1] & 0xFF;
+ int shift = UUID.kShifts[i >> 1];
+
+ if (shift > 16)
+ {
+ result ^= curr << shift | curr >>> 32 - shift;
+ }
+ else
+ {
+ result ^= curr << shift;
+ }
+ }
+
+ // and then the last byte:
+ int last = mId[15] & 0xFF;
+ result ^= last << 3;
+ result ^= last << 13;
+
+ result ^= last << 27;
+ // Let's not accept hash 0 as it indicates 'not hashed yet':
+ if (result == 0)
+ {
+ mHashCode = -1;
+ }
+ else
+ {
+ mHashCode = result;
+ }
+ }
+ return mHashCode;
+ }
+
+ @Override
+ public final String toString()
+ {
+ /*
+ * Could be synchronized, but there isn't much harm in just taking our
+ * chances (ie. in the worst case we'll form the string more than once...
+ * but result is the same)
+ */
+
+ if (mDesc == null)
+ {
+ StringBuffer b = new StringBuffer(36);
+
+ for (int i = 0; i < 16; ++i)
+ {
+ // Need to bypass hyphens:
+ switch (i)
+ {
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ b.append('-');
+ }
+ int hex = mId[i] & 0xFF;
+ b.append(UUID.kHexChars.charAt(hex >> 4));
+ b.append(UUID.kHexChars.charAt(hex & 0x0f));
+ }
+ if (!UUID.sDescCaching)
+ {
+ return b.toString();
+ }
+ mDesc = b.toString();
+ }
+ return mDesc;
+ }
+
+ /**
+ * Checking equality of UUIDs is easy; just compare the 128-bit number.
+ */
+ @Override
+ public final boolean equals(final Object o)
+ {
+ if (!(o instanceof UUID))
+ {
+ return false;
+ }
+ byte[] otherId = ((UUID)o).mId;
+ byte[] thisId = mId;
+ for (int i = 0; i < 16; ++i)
+ {
+ if (otherId[i] != thisId[i])
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDGenerator.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDGenerator.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDGenerator.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDGenerator.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,293 @@
+/* JUG Java Uuid Generator
+ *
+ * Copyright (c) 2002- Tatu Saloranta, tatu.saloranta(a)iki.fi
+ *
+ * Licensed under the License specified in the file licenses/LICENSE.txt which is
+ * included with the source code.
+ * You may not use this file except in compliance with the License.
+ *
+ * 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.hornetq.utils;
+
+import java.lang.reflect.Method;
+import java.net.NetworkInterface;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Random;
+
+import org.hornetq.api.core.SimpleString;
+import org.hornetq.core.logging.Logger;
+
+public final class UUIDGenerator
+{
+ private final static UUIDGenerator sSingleton = new UUIDGenerator();
+
+ private static final Logger log = Logger.getLogger(UUIDGenerator.class);
+
+ // Windows has some fake adapters that will return the same HARDWARE ADDRESS on any computer. We need to ignore those
+ private static final byte[][] BLACK_LIST = new byte[][] { { 2, 0, 84, 85, 78, 1 } };
+
+ /**
+ * Random-generator, used by various UUID-generation methods:
+ */
+ private Random mRnd = null;
+
+ private final Object mTimerLock = new Object();
+
+ private UUIDTimer mTimer = null;
+
+ private byte[] address;
+
+ /**
+ * Constructor is private to enforce singleton access.
+ */
+ private UUIDGenerator()
+ {
+ }
+
+ /**
+ * Method used for accessing the singleton generator instance.
+ */
+ public static UUIDGenerator getInstance()
+ {
+ return UUIDGenerator.sSingleton;
+ }
+
+ /*
+ * ///////////////////////////////////////////////////// // Configuration
+ * /////////////////////////////////////////////////////
+ */
+
+ /**
+ * Method for getting the shared random number generator used for generating
+ * the UUIDs. This way the initialization cost is only taken once; access
+ * need not be synchronized (or in cases where it has to, SecureRandom takes
+ * care of it); it might even be good for getting really 'random' stuff to
+ * get shared access...
+ */
+ public final Random getRandomNumberGenerator()
+ {
+ /*
+ * Could be synchronized, but since side effects are trivial (ie.
+ * possibility of generating more than one SecureRandom, of which all but
+ * one are dumped) let's not add synchronization overhead:
+ */
+ if (mRnd == null)
+ {
+ mRnd = new SecureRandom();
+ }
+ return mRnd;
+ }
+
+ public final UUID generateTimeBasedUUID(final byte[] byteAddr)
+ {
+ byte[] contents = new byte[16];
+ int pos = 10;
+ for (int i = 0; i < 6; ++i)
+ {
+ contents[pos + i] = byteAddr[i];
+ }
+
+ synchronized (mTimerLock)
+ {
+ if (mTimer == null)
+ {
+ mTimer = new UUIDTimer(getRandomNumberGenerator());
+ }
+
+ mTimer.getTimestamp(contents);
+ }
+
+ return new UUID(UUID.TYPE_TIME_BASED, contents);
+ }
+
+ public final byte[] generateDummyAddress()
+ {
+ Random rnd = getRandomNumberGenerator();
+ byte[] dummy = new byte[6];
+ rnd.nextBytes(dummy);
+ /* Need to set the broadcast bit to indicate it's not a real
+ * address.
+ */
+ dummy[0] |= (byte)0x01;
+
+ if (UUIDGenerator.log.isDebugEnabled())
+ {
+ UUIDGenerator.log.debug("using dummy address " + UUIDGenerator.asString(dummy));
+ }
+ return dummy;
+ }
+
+ /**
+ * If running java 6 or above, returns {@link NetworkInterface#getHardwareAddress()}, else return <code>null</code>.
+ * The first hardware address is returned when iterating all the NetworkInterfaces
+ */
+ public final static byte[] getHardwareAddress()
+ {
+ Method getHardwareAddressMethod;
+ Method isUpMethod;
+ Method isLoopbackMethod;
+ Method isVirtualMethod;
+ try
+ {
+ getHardwareAddressMethod = NetworkInterface.class.getMethod("getHardwareAddress");
+ isUpMethod = NetworkInterface.class.getMethod("isUp");
+ isLoopbackMethod = NetworkInterface.class.getMethod("isLoopback");
+ isVirtualMethod = NetworkInterface.class.getMethod("isVirtual");
+ }
+ catch (Throwable t)
+ {
+ // not on Java 6 or not enough security permission
+ return null;
+ }
+
+ try
+ {
+ Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
+ while (networkInterfaces.hasMoreElements())
+ {
+ NetworkInterface networkInterface = networkInterfaces.nextElement();
+ boolean up = (Boolean)isUpMethod.invoke(networkInterface);
+ boolean loopback = (Boolean)isLoopbackMethod.invoke(networkInterface);
+ boolean virtual = (Boolean)isVirtualMethod.invoke(networkInterface);
+
+ if (loopback || virtual || !up)
+ {
+ continue;
+ }
+
+ Object res = getHardwareAddressMethod.invoke(networkInterface);
+ if (res != null && res instanceof byte[])
+ {
+ byte[] address = (byte[])res;
+ byte[] paddedAddress = UUIDGenerator.getZeroPaddedSixBytes(address);
+
+ if (UUIDGenerator.isBlackList(address))
+ {
+ continue;
+ }
+
+ if (paddedAddress != null)
+ {
+ if (UUIDGenerator.log.isDebugEnabled())
+ {
+ UUIDGenerator.log.debug("using hardware address " + UUIDGenerator.asString(paddedAddress));
+ }
+ return paddedAddress;
+ }
+ }
+ }
+ }
+ catch (Throwable t)
+ {
+ }
+
+ return null;
+ }
+
+ public final SimpleString generateSimpleStringUUID()
+ {
+ return new SimpleString(generateStringUUID());
+ }
+
+ public final UUID generateUUID()
+ {
+ byte[] address = getAddressBytes();
+
+ UUID uid = generateTimeBasedUUID(address);
+
+ return uid;
+ }
+
+ public final String generateStringUUID()
+ {
+ byte[] address = getAddressBytes();
+
+ if (address == null)
+ {
+ return java.util.UUID.randomUUID().toString();
+ }
+ else
+ {
+ return generateTimeBasedUUID(address).toString();
+ }
+ }
+
+ public final static byte[] getZeroPaddedSixBytes(final byte[] bytes)
+ {
+ if (bytes == null)
+ {
+ return null;
+ }
+ if (bytes.length > 0 && bytes.length <= 6)
+ {
+ if (bytes.length == 6)
+ {
+ return bytes;
+ }
+ else
+ {
+ // pad with zeroes to have a 6-byte array
+ byte[] paddedAddress = new byte[6];
+ System.arraycopy(bytes, 0, paddedAddress, 0, bytes.length);
+ for (int i = bytes.length; i < 6; i++)
+ {
+ paddedAddress[i] = 0;
+ }
+ return paddedAddress;
+ }
+ }
+ return null;
+ }
+
+ // Private -------------------------------------------------------
+
+ private static final boolean isBlackList(final byte[] address)
+ {
+ for (byte[] blackList : UUIDGenerator.BLACK_LIST)
+ {
+ if (Arrays.equals(address, blackList))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private final byte[] getAddressBytes()
+ {
+ if (address == null)
+ {
+ address = UUIDGenerator.getHardwareAddress();
+ if (address == null)
+ {
+ address = generateDummyAddress();
+ }
+ }
+
+ return address;
+ }
+
+ private static final String asString(final byte[] bytes)
+ {
+ if (bytes == null)
+ {
+ return null;
+ }
+
+ String s = "";
+ for (int i = 0; i < bytes.length - 1; i++)
+ {
+ s += Integer.toHexString(bytes[i]) + ":";
+ }
+ s += bytes[bytes.length - 1];
+ return s;
+ }
+}
\ No newline at end of file
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDTimer.java (from rev 10739, trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDTimer.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDTimer.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/UUIDTimer.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,326 @@
+/* JUG Java Uuid Generator
+ *
+ * Copyright (c) 2002- Tatu Saloranta, tatu.saloranta(a)iki.fi
+ *
+ * Licensed under the License specified in the file licenses/LICENSE.txt which is
+ * included with the source code.
+ * You may not use this file except in compliance with the License.
+ *
+ * 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.hornetq.utils;
+
+import java.util.Random;
+
+/**
+ * UUIDTimer produces the time stamps required for time-based UUIDs. It works as
+ * outlined in the UUID specification, with following implementation:
+ * <ul>
+ * <li>Java classes can only product time stamps with maximum resolution of one
+ * millisecond (at least before JDK 1.5). To compensate, an additional counter
+ * is used, so that more than one UUID can be generated between java clock
+ * updates. Counter may be used to generate up to 10000 UUIDs for each distrinct
+ * java clock value.
+ * <li>Due to even lower clock resolution on some platforms (older Windows
+ * versions use 55 msec resolution), timestamp value can also advanced ahead of
+ * physical value within limits (by default, up 100 millisecond ahead of
+ * reported), iff necessary (ie. 10000 instances created before clock time
+ * advances).
+ * <li>As an additional precaution, counter is initialized not to 0 but to a
+ * random 8-bit number, and each time clock changes, lowest 8-bits of counter
+ * are preserved. The purpose it to make likelyhood of multi-JVM multi-instance
+ * generators to collide, without significantly reducing max. UUID generation
+ * speed. Note though that using more than one generator (from separate JVMs) is
+ * strongly discouraged, so hopefully this enhancement isn't needed. This 8-bit
+ * offset has to be reduced from total max. UUID count to preserve ordering
+ * property of UUIDs (ie. one can see which UUID was generated first for given
+ * UUID generator); the resulting 9500 UUIDs isn't much different from the
+ * optimal choice.
+ * <li>Finally, as of version 2.0 and onwards, optional external timestamp
+ * synchronization can be done. This is done similar to the way UUID
+ * specification suggests; except that since there is no way to lock the whole
+ * system, file-based locking is used. This works between multiple JVMs and Jug
+ * instances.
+ * </ul>
+ * <p>
+ * Some additional assumptions about calculating the timestamp:
+ * <ul>
+ * <li>System.currentTimeMillis() is assumed to give time offset in UTC, or at
+ * least close enough thing to get correct timestamps. The alternate route would
+ * have to go through calendar object, use TimeZone offset to get to UTC, and
+ * then modify. Using currentTimeMillis should be much faster to allow rapid
+ * UUID creation.
+ * <li>Similarly, the constant used for time offset between 1.1.1970 and start
+ * of Gregorian calendar is assumed to be correct (which seems to be the case
+ * when testing with Java calendars).
+ * </ul>
+ * <p>
+ * Note about synchronization: this class is assumed to always be called from a
+ * synchronized context (caller locks on either this object, or a similar timer
+ * lock), and so has no method synchronization.
+ */
+public class UUIDTimer
+{
+ // // // Constants
+
+ /**
+ * Since System.longTimeMillis() returns time from january 1st 1970, and
+ * UUIDs need time from the beginning of gregorian calendar (15-oct-1582),
+ * need to apply the offset:
+ */
+ private final static long kClockOffset = 0x01b21dd213814000L;
+
+ /**
+ * Also, instead of getting time in units of 100nsecs, we get something with
+ * max resolution of 1 msec... and need the multiplier as well
+ */
+ private final static long kClockMultiplier = 10000;
+
+ private final static long kClockMultiplierL = 10000L;
+
+ /**
+ * Let's allow "virtual" system time to advance at most 100 milliseconds
+ * beyond actual physical system time, before adding delays.
+ */
+ private final static long kMaxClockAdvance = 100L;
+
+ // // // Configuration
+
+ private final Random mRnd;
+
+ // // // Clock state:
+
+ /**
+ * Additional state information used to protect against anomalous cases
+ * (clock time going backwards, node id getting mixed up). Third byte is
+ * actually used for seeding counter on counter overflow.
+ */
+ private final byte[] mClockSequence = new byte[3];
+
+ /**
+ * Last physical timestamp value <code>System.currentTimeMillis()</code>
+ * returned: used to catch (and report) cases where system clock goes
+ * backwards. Is also used to limit "drifting", that is, amount timestamps
+ * used can differ from the system time value. This value is not guaranteed
+ * to be monotonically increasing.
+ */
+ private long mLastSystemTimestamp = 0L;
+
+ /**
+ * Timestamp value last used for generating a UUID (along with
+ * {@link #mClockCounter}. Usually the same as {@link #mLastSystemTimestamp},
+ * but not always (system clock moved backwards). Note that this value is
+ * guaranteed to be monotonically increasing; that is, at given absolute time
+ * points t1 and t2 (where t2 is after t1), t1 <= t2 will always hold true.
+ */
+ private long mLastUsedTimestamp = 0L;
+
+ /**
+ * Counter used to compensate inadequate resolution of JDK system timer.
+ */
+ private int mClockCounter = 0;
+
+ UUIDTimer(final Random rnd)
+ {
+ mRnd = rnd;
+ initCounters(rnd);
+ mLastSystemTimestamp = 0L;
+ // This may get overwritten by the synchronizer
+ mLastUsedTimestamp = 0L;
+ }
+
+ private void initCounters(final Random rnd)
+ {
+ /*
+ * Let's generate the clock sequence field now; as with counter, this
+ * reduces likelihood of collisions (as explained in UUID specs)
+ */
+ rnd.nextBytes(mClockSequence);
+ /*
+ * Ok, let's also initialize the counter... Counter is used to make it
+ * slightly less likely that two instances of UUIDGenerator (from separate
+ * JVMs as no more than one can be created in one JVM) would produce
+ * colliding time-based UUIDs. The practice of using multiple generators,
+ * is strongly discouraged, of course, but just in case...
+ */
+ mClockCounter = mClockSequence[2] & 0xFF;
+ }
+
+ public void getTimestamp(final byte[] uuidData)
+ {
+ // First the clock sequence:
+ uuidData[UUID.INDEX_CLOCK_SEQUENCE] = mClockSequence[0];
+ uuidData[UUID.INDEX_CLOCK_SEQUENCE + 1] = mClockSequence[1];
+
+ long systime = System.currentTimeMillis();
+
+ /*
+ * Let's first verify that the system time is not going backwards;
+ * independent of whether we can use it:
+ */
+ if (systime < mLastSystemTimestamp)
+ {
+ // Logger.logWarning("System time going backwards! (got value
+ // "+systime+", last "+mLastSystemTimestamp);
+ // Let's write it down, still
+ mLastSystemTimestamp = systime;
+ }
+
+ /*
+ * But even without it going backwards, it may be less than the last one
+ * used (when generating UUIDs fast with coarse clock resolution; or if
+ * clock has gone backwards over reboot etc).
+ */
+ if (systime <= mLastUsedTimestamp)
+ {
+ /*
+ * Can we just use the last time stamp (ok if the counter hasn't hit
+ * max yet)
+ */
+ if (mClockCounter < UUIDTimer.kClockMultiplier)
+ { // yup, still have room
+ systime = mLastUsedTimestamp;
+ }
+ else
+ { // nope, have to roll over to next value and maybe wait
+ long actDiff = mLastUsedTimestamp - systime;
+ long origTime = systime;
+ systime = mLastUsedTimestamp + 1L;
+
+ // Logger.logWarning("Timestamp over-run: need to reinitialize
+ // random sequence");
+
+ /*
+ * Clock counter is now at exactly the multiplier; no use just
+ * anding its value. So, we better get some random numbers
+ * instead...
+ */
+ initCounters(mRnd);
+
+ /*
+ * But do we also need to slow down? (to try to keep virtual time
+ * close to physical time; ie. either catch up when system clock has
+ * been moved backwards, or when coarse clock resolution has forced
+ * us to advance virtual timer too far)
+ */
+ if (actDiff >= UUIDTimer.kMaxClockAdvance)
+ {
+ UUIDTimer.slowDown(origTime, actDiff);
+ }
+ }
+ }
+ else
+ {
+ /*
+ * Clock has advanced normally; just need to make sure counter is reset
+ * to a low value (need not be 0; good to leave a small residual to
+ * further decrease collisions)
+ */
+ mClockCounter &= 0xFF;
+ }
+
+ mLastUsedTimestamp = systime;
+
+ /*
+ * Now, let's translate the timestamp to one UUID needs, 100ns unit offset
+ * from the beginning of Gregorian calendar...
+ */
+ systime *= UUIDTimer.kClockMultiplierL;
+ systime += UUIDTimer.kClockOffset;
+
+ // Plus add the clock counter:
+ systime += mClockCounter;
+ // and then increase
+ ++mClockCounter;
+
+ /*
+ * Time fields are nicely split across the UUID, so can't just linearly
+ * dump the stamp:
+ */
+ int clockHi = (int)(systime >>> 32);
+ int clockLo = (int)systime;
+
+ uuidData[UUID.INDEX_CLOCK_HI] = (byte)(clockHi >>> 24);
+ uuidData[UUID.INDEX_CLOCK_HI + 1] = (byte)(clockHi >>> 16);
+ uuidData[UUID.INDEX_CLOCK_MID] = (byte)(clockHi >>> 8);
+ uuidData[UUID.INDEX_CLOCK_MID + 1] = (byte)clockHi;
+
+ uuidData[UUID.INDEX_CLOCK_LO] = (byte)(clockLo >>> 24);
+ uuidData[UUID.INDEX_CLOCK_LO + 1] = (byte)(clockLo >>> 16);
+ uuidData[UUID.INDEX_CLOCK_LO + 2] = (byte)(clockLo >>> 8);
+ uuidData[UUID.INDEX_CLOCK_LO + 3] = (byte)clockLo;
+ }
+
+ /*
+ * /////////////////////////////////////////////////////////// // Private
+ * methods ///////////////////////////////////////////////////////////
+ */
+
+ private final static int MAX_WAIT_COUNT = 50;
+
+ /**
+ * Simple utility method to use to wait for couple of milliseconds, to let
+ * system clock hopefully advance closer to the virtual timestamps used.
+ * Delay is kept to just a millisecond or two, to prevent excessive blocking;
+ * but that should be enough to eventually synchronize physical clock with
+ * virtual clock values used for UUIDs.
+ *
+ * @param msecs
+ * Number of milliseconds to wait for from current time point
+ */
+ private final static void slowDown(final long startTime, final long actDiff)
+ {
+ /*
+ * First, let's determine how long we'd like to wait. This is based on how
+ * far ahead are we as of now.
+ */
+ long ratio = actDiff / UUIDTimer.kMaxClockAdvance;
+ long delay;
+
+ if (ratio < 2L)
+ { // 200 msecs or less
+ delay = 1L;
+ }
+ else if (ratio < 10L)
+ { // 1 second or less
+ delay = 2L;
+ }
+ else if (ratio < 600L)
+ { // 1 minute or less
+ delay = 3L;
+ }
+ else
+ {
+ delay = 5L;
+ }
+ // Logger.logWarning("Need to wait for "+delay+" milliseconds; virtual
+ // clock advanced too far in the future");
+ long waitUntil = startTime + delay;
+ int counter = 0;
+ do
+ {
+ try
+ {
+ Thread.sleep(delay);
+ }
+ catch (InterruptedException ie)
+ {
+ }
+ delay = 1L;
+ /*
+ * This is just a sanity check: don't want an "infinite" loop if clock
+ * happened to be moved backwards by, say, an hour...
+ */
+ if (++counter > UUIDTimer.MAX_WAIT_COUNT)
+ {
+ break;
+ }
+ }
+ while (System.currentTimeMillis() < waitUntil);
+ }
+}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/api/core/PropertyConversionException.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/api/core/PropertyConversionException.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/api/core/PropertyConversionException.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,54 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.api.core;
-
-/**
- * A PropertyConversionException is thrown by Message methods
- * when a property can not be converted to the expected type.
- *
- * @author <a href="mailto:jmesnil@redhat.com">Jeff Mesnil</a>
- *
- * @see Message
- *
- */
-public class PropertyConversionException extends RuntimeException
-{
-
- // Constants -----------------------------------------------------
-
- private static final long serialVersionUID = -3010008708334904332L;
-
- // Attributes ----------------------------------------------------
-
- // Static --------------------------------------------------------
-
- // Constructors --------------------------------------------------
-
-
- public PropertyConversionException(final String message)
- {
- super(message);
- }
-
- // Public --------------------------------------------------------
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
- // Private -------------------------------------------------------
-
- // Inner classes -------------------------------------------------
-
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/Base64.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/Base64.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/Base64.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,2350 +0,0 @@
-package org.hornetq.utils;
-
-/**
- * <p>Encodes and decodes to and from Base64 notation.</p>
- * <p>Homepage: <a href="http://iharder.net/base64">http://iharder.net/base64</a>.</p>
- *
- * <p>The <tt>options</tt> parameter, which appears in a few places, is used to pass
- * several pieces of information to the encoder. In the "higher level" methods such as
- * encodeBytes( bytes, options ) the options parameter can be used to indicate such
- * things as first gzipping the bytes before encoding them, not inserting linefeeds
- * (though that breaks strict Base64 compatibility), and encoding using the URL-safe
- * and Ordered dialects.</p>
- *
- * <p>The constants defined in Base64 can be OR-ed together to combine options, so you
- * might make a call like this:</p>
- *
- * <code>String encoded = Base64.encodeBytes( mybytes, Base64.GZIP | Base64.DONT_BREAK_LINES );</code>
- *
- * <p>to compress the data before encoding it and then making the output have no newline characters.</p>
- *
- *
- * <p>
- * Change Log:
- * </p>
- * <ul>
- * <li>v2.2.2 - Fixed encodeFileToFile and decodeFileToFile to use the
- * Base64.InputStream class to encode and decode on the fly which uses
- * less memory than encoding/decoding an entire file into memory before writing.</li>
- * <li>v2.2.1 - Fixed bug using URL_SAFE and ORDERED encodings. Fixed bug
- * when using very small files (~< 40 bytes).</li>
- * <li>v2.2 - Added some helper methods for encoding/decoding directly from
- * one file to the next. Also added a main() method to support command line
- * encoding/decoding from one file to the next. Also added these Base64 dialects:
- * <ol>
- * <li>The default is RFC3548 format.</li>
- * <li>Calling Base64.setFormat(Base64.BASE64_FORMAT.URLSAFE_FORMAT) generates
- * URL and file name friendly format as described in Section 4 of RFC3548.
- * http://www.faqs.org/rfcs/rfc3548.html</li>
- * <li>Calling Base64.setFormat(Base64.BASE64_FORMAT.ORDERED_FORMAT) generates
- * URL and file name friendly format that preserves lexical ordering as described
- * in http://www.faqs.org/qa/rfcc-1940.html</li>
- * </ol>
- * Special thanks to Jim Kellerman at <a href="http://www.powerset.com/">http://www.powerset.com/</a>
- * for contributing the new Base64 dialects.
- * </li>
- *
- * <li>v2.1 - Cleaned up javadoc comments and unused variables and methods. Added
- * some convenience methods for reading and writing to and from files.</li>
- * <li>v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems
- * with other encodings (like EBCDIC).</li>
- * <li>v2.0.1 - Fixed an error when decoding a single byte, that is, when the
- * encoded data was a single byte.</li>
- * <li>v2.0 - I got rid of methods that used booleans to set options.
- * Now everything is more consolidated and cleaner. The code now detects
- * when data that's being decoded is gzip-compressed and will decompress it
- * automatically. Generally things are cleaner. You'll probably have to
- * change some method calls that you were making to support the new
- * options format (<tt>int</tt>s that you "OR" together).</li>
- * <li>v1.5.1 - Fixed bug when decompressing and decoding to a
- * byte[] using <tt>decode( String s, boolean gzipCompressed )</tt>.
- * Added the ability to "suspend" encoding in the Output Stream so
- * you can turn on and off the encoding if you need to embed base64
- * data in an otherwise "normal" stream (like an XML file).</li>
- * <li>v1.5 - Output stream pases on flush() command but doesn't do anything itself.
- * This helps when using GZIP streams.
- * Added the ability to GZip-compress objects before encoding them.</li>
- * <li>v1.4 - Added helper methods to read/write files.</li>
- * <li>v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.</li>
- * <li>v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream
- * where last buffer being read, if not completely full, was not returned.</li>
- * <li>v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.</li>
- * <li>v1.3.3 - Fixed I/O streams which were totally messed up.</li>
- * </ul>
- *
- * <p>
- * I am placing this code in the Public Domain. Do with it as you will.
- * This software comes with no guarantees or warranties but with
- * plenty of well-wishing instead!
- * Please visit <a href="http://iharder.net/base64">http://iharder.net/base64</a>
- * periodically to check for updates or to contribute improvements.
- * </p>
- *
- * @author Robert Harder
- * @author rob(a)iharder.net
- * @version 2.2.2
- */
-public class Base64
-{
-
- /* ******** P U B L I C F I E L D S ******** */
-
- /** No options specified. Value is zero. */
- public final static int NO_OPTIONS = 0;
-
- /** Specify encoding. */
- public final static int ENCODE = 1;
-
- /** Specify decoding. */
- public final static int DECODE = 0;
-
- /** Specify that data should be gzip-compressed. */
- public final static int GZIP = 2;
-
- /** Don't break lines when encoding (violates strict Base64 specification) */
- public final static int DONT_BREAK_LINES = 8;
-
- /**
- * Encode using Base64-like encoding that is URL- and Filename-safe as described
- * in Section 4 of RFC3548:
- * <a href="http://www.faqs.org/rfcs/rfc3548.html">http://www.faqs.org/rfcs/rfc3548.html</a>.
- * It is important to note that data encoded this way is <em>not</em> officially valid Base64,
- * or at the very least should not be called Base64 without also specifying that is
- * was encoded using the URL- and Filename-safe dialect.
- */
- public final static int URL_SAFE = 16;
-
- /**
- * Encode using the special "ordered" dialect of Base64 described here:
- * <a href="http://www.faqs.org/qa/rfcc-1940.html">http://www.faqs.org/qa/rfcc-1940.html</a>.
- */
- public final static int ORDERED = 32;
-
- /* ******** P R I V A T E F I E L D S ******** */
-
- /** Maximum line length (76) of Base64 output. */
- private final static int MAX_LINE_LENGTH = 76;
-
- /** The equals sign (=) as a byte. */
- private final static byte EQUALS_SIGN = (byte)'=';
-
- /** The new line character (\n) as a byte. */
- private final static byte NEW_LINE = (byte)'\n';
-
- /** Preferred encoding. */
- private final static String PREFERRED_ENCODING = "UTF-8";
-
- // I think I end up not using the BAD_ENCODING indicator.
- // private final static byte BAD_ENCODING = -9; // Indicates error in encoding
- private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding
-
- private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding
-
- /* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */
-
- /** The 64 valid Base64 values. */
- // private final static byte[] ALPHABET;
- /* Host platform me be something funny like EBCDIC, so we hardcode these values. */
- private final static byte[] _STANDARD_ALPHABET = { (byte)'A',
- (byte)'B',
- (byte)'C',
- (byte)'D',
- (byte)'E',
- (byte)'F',
- (byte)'G',
- (byte)'H',
- (byte)'I',
- (byte)'J',
- (byte)'K',
- (byte)'L',
- (byte)'M',
- (byte)'N',
- (byte)'O',
- (byte)'P',
- (byte)'Q',
- (byte)'R',
- (byte)'S',
- (byte)'T',
- (byte)'U',
- (byte)'V',
- (byte)'W',
- (byte)'X',
- (byte)'Y',
- (byte)'Z',
- (byte)'a',
- (byte)'b',
- (byte)'c',
- (byte)'d',
- (byte)'e',
- (byte)'f',
- (byte)'g',
- (byte)'h',
- (byte)'i',
- (byte)'j',
- (byte)'k',
- (byte)'l',
- (byte)'m',
- (byte)'n',
- (byte)'o',
- (byte)'p',
- (byte)'q',
- (byte)'r',
- (byte)'s',
- (byte)'t',
- (byte)'u',
- (byte)'v',
- (byte)'w',
- (byte)'x',
- (byte)'y',
- (byte)'z',
- (byte)'0',
- (byte)'1',
- (byte)'2',
- (byte)'3',
- (byte)'4',
- (byte)'5',
- (byte)'6',
- (byte)'7',
- (byte)'8',
- (byte)'9',
- (byte)'+',
- (byte)'/' };
-
- /**
- * Translates a Base64 value to either its 6-bit reconstruction value
- * or a negative number indicating some other meaning.
- **/
- private final static byte[] _STANDARD_DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
- -5,
- -5, // Whitespace: Tab and Linefeed
- -9,
- -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 14 - 26
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 33 - 42
- 62, // Plus sign at decimal 43
- -9,
- -9,
- -9, // Decimal 44 - 46
- 63, // Slash at decimal 47
- 52,
- 53,
- 54,
- 55,
- 56,
- 57,
- 58,
- 59,
- 60,
- 61, // Numbers zero through nine
- -9,
- -9,
- -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9,
- -9,
- -9, // Decimal 62 - 64
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13, // Letters 'A' through 'N'
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24,
- 25, // Letters 'O' through 'Z'
- -9,
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 91 - 96
- 26,
- 27,
- 28,
- 29,
- 30,
- 31,
- 32,
- 33,
- 34,
- 35,
- 36,
- 37,
- 38, // Letters 'a' through 'm'
- 39,
- 40,
- 41,
- 42,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51, // Letters 'n' through 'z'
- -9,
- -9,
- -9,
- -9 // Decimal 123 - 126
- /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
- };
-
- /* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */
-
- /**
- * Used in the URL- and Filename-safe dialect described in Section 4 of RFC3548:
- * <a href="http://www.faqs.org/rfcs/rfc3548.html">http://www.faqs.org/rfcs/rfc3548.html</a>.
- * Notice that the last two bytes become "hyphen" and "underscore" instead of "plus" and "slash."
- */
- private final static byte[] _URL_SAFE_ALPHABET = { (byte)'A',
- (byte)'B',
- (byte)'C',
- (byte)'D',
- (byte)'E',
- (byte)'F',
- (byte)'G',
- (byte)'H',
- (byte)'I',
- (byte)'J',
- (byte)'K',
- (byte)'L',
- (byte)'M',
- (byte)'N',
- (byte)'O',
- (byte)'P',
- (byte)'Q',
- (byte)'R',
- (byte)'S',
- (byte)'T',
- (byte)'U',
- (byte)'V',
- (byte)'W',
- (byte)'X',
- (byte)'Y',
- (byte)'Z',
- (byte)'a',
- (byte)'b',
- (byte)'c',
- (byte)'d',
- (byte)'e',
- (byte)'f',
- (byte)'g',
- (byte)'h',
- (byte)'i',
- (byte)'j',
- (byte)'k',
- (byte)'l',
- (byte)'m',
- (byte)'n',
- (byte)'o',
- (byte)'p',
- (byte)'q',
- (byte)'r',
- (byte)'s',
- (byte)'t',
- (byte)'u',
- (byte)'v',
- (byte)'w',
- (byte)'x',
- (byte)'y',
- (byte)'z',
- (byte)'0',
- (byte)'1',
- (byte)'2',
- (byte)'3',
- (byte)'4',
- (byte)'5',
- (byte)'6',
- (byte)'7',
- (byte)'8',
- (byte)'9',
- (byte)'-',
- (byte)'_' };
-
- /**
- * Used in decoding URL- and Filename-safe dialects of Base64.
- */
- private final static byte[] _URL_SAFE_DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
- -5,
- -5, // Whitespace: Tab and Linefeed
- -9,
- -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 14 - 26
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 33 - 42
- -9, // Plus sign at decimal 43
- -9, // Decimal 44
- 62, // Minus sign at decimal 45
- -9, // Decimal 46
- -9, // Slash at decimal 47
- 52,
- 53,
- 54,
- 55,
- 56,
- 57,
- 58,
- 59,
- 60,
- 61, // Numbers zero through nine
- -9,
- -9,
- -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9,
- -9,
- -9, // Decimal 62 - 64
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13, // Letters 'A' through 'N'
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23,
- 24,
- 25, // Letters 'O' through 'Z'
- -9,
- -9,
- -9,
- -9, // Decimal 91 - 94
- 63, // Underscore at decimal 95
- -9, // Decimal 96
- 26,
- 27,
- 28,
- 29,
- 30,
- 31,
- 32,
- 33,
- 34,
- 35,
- 36,
- 37,
- 38, // Letters 'a' through 'm'
- 39,
- 40,
- 41,
- 42,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50,
- 51, // Letters 'n' through 'z'
- -9,
- -9,
- -9,
- -9 // Decimal 123 - 126
- /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
- };
-
- /* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */
-
- /**
- * I don't get the point of this technique, but it is described here:
- * <a href="http://www.faqs.org/qa/rfcc-1940.html">http://www.faqs.org/qa/rfcc-1940.html</a>.
- */
- private final static byte[] _ORDERED_ALPHABET = { (byte)'-',
- (byte)'0',
- (byte)'1',
- (byte)'2',
- (byte)'3',
- (byte)'4',
- (byte)'5',
- (byte)'6',
- (byte)'7',
- (byte)'8',
- (byte)'9',
- (byte)'A',
- (byte)'B',
- (byte)'C',
- (byte)'D',
- (byte)'E',
- (byte)'F',
- (byte)'G',
- (byte)'H',
- (byte)'I',
- (byte)'J',
- (byte)'K',
- (byte)'L',
- (byte)'M',
- (byte)'N',
- (byte)'O',
- (byte)'P',
- (byte)'Q',
- (byte)'R',
- (byte)'S',
- (byte)'T',
- (byte)'U',
- (byte)'V',
- (byte)'W',
- (byte)'X',
- (byte)'Y',
- (byte)'Z',
- (byte)'_',
- (byte)'a',
- (byte)'b',
- (byte)'c',
- (byte)'d',
- (byte)'e',
- (byte)'f',
- (byte)'g',
- (byte)'h',
- (byte)'i',
- (byte)'j',
- (byte)'k',
- (byte)'l',
- (byte)'m',
- (byte)'n',
- (byte)'o',
- (byte)'p',
- (byte)'q',
- (byte)'r',
- (byte)'s',
- (byte)'t',
- (byte)'u',
- (byte)'v',
- (byte)'w',
- (byte)'x',
- (byte)'y',
- (byte)'z' };
-
- /**
- * Used in decoding the "ordered" dialect of Base64.
- */
- private final static byte[] _ORDERED_DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8
- -5,
- -5, // Whitespace: Tab and Linefeed
- -9,
- -9, // Decimal 11 - 12
- -5, // Whitespace: Carriage Return
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 14 - 26
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 27 - 31
- -5, // Whitespace: Space
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9,
- -9, // Decimal 33 - 42
- -9, // Plus sign at decimal 43
- -9, // Decimal 44
- 0, // Minus sign at decimal 45
- -9, // Decimal 46
- -9, // Slash at decimal 47
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10, // Numbers zero through nine
- -9,
- -9,
- -9, // Decimal 58 - 60
- -1, // Equals sign at decimal 61
- -9,
- -9,
- -9, // Decimal 62 - 64
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23, // Letters 'A' through 'M'
- 24,
- 25,
- 26,
- 27,
- 28,
- 29,
- 30,
- 31,
- 32,
- 33,
- 34,
- 35,
- 36, // Letters 'N' through 'Z'
- -9,
- -9,
- -9,
- -9, // Decimal 91 - 94
- 37, // Underscore at decimal 95
- -9, // Decimal 96
- 38,
- 39,
- 40,
- 41,
- 42,
- 43,
- 44,
- 45,
- 46,
- 47,
- 48,
- 49,
- 50, // Letters 'a' through 'm'
- 51,
- 52,
- 53,
- 54,
- 55,
- 56,
- 57,
- 58,
- 59,
- 60,
- 61,
- 62,
- 63, // Letters 'n' through 'z'
- -9,
- -9,
- -9,
- -9 // Decimal 123 - 126
- /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
- };
-
- /* ******** D E T E R M I N E W H I C H A L H A B E T ******** */
-
- /**
- * Returns one of the _SOMETHING_ALPHABET byte arrays depending on
- * the options specified.
- * It's possible, though silly, to specify ORDERED and URLSAFE
- * in which case one of them will be picked, though there is
- * no guarantee as to which one will be picked.
- */
- private final static byte[] getAlphabet(final int options)
- {
- if ((options & Base64.URL_SAFE) == Base64.URL_SAFE)
- {
- return Base64._URL_SAFE_ALPHABET;
- }
- else if ((options & Base64.ORDERED) == Base64.ORDERED)
- {
- return Base64._ORDERED_ALPHABET;
- }
- else
- {
- return Base64._STANDARD_ALPHABET;
- }
-
- } // end getAlphabet
-
- /**
- * Returns one of the _SOMETHING_DECODABET byte arrays depending on
- * the options specified.
- * It's possible, though silly, to specify ORDERED and URL_SAFE
- * in which case one of them will be picked, though there is
- * no guarantee as to which one will be picked.
- */
- private final static byte[] getDecodabet(final int options)
- {
- if ((options & Base64.URL_SAFE) == Base64.URL_SAFE)
- {
- return Base64._URL_SAFE_DECODABET;
- }
- else if ((options & Base64.ORDERED) == Base64.ORDERED)
- {
- return Base64._ORDERED_DECODABET;
- }
- else
- {
- return Base64._STANDARD_DECODABET;
- }
-
- } // end getAlphabet
-
- /** Defeats instantiation. */
- private Base64()
- {
- }
-
- /**
- * Encodes or decodes two files from the command line;
- * <strong>feel free to delete this method (in fact you probably should)
- * if you're embedding this code into a larger program.</strong>
- */
- public final static void main(final String[] args)
- {
- if (args.length < 3)
- {
- Base64.usage("Not enough arguments.");
- } // end if: args.length < 3
- else
- {
- String flag = args[0];
- String infile = args[1];
- String outfile = args[2];
- if (flag.equals("-e"))
- {
- Base64.encodeFileToFile(infile, outfile);
- } // end if: encode
- else if (flag.equals("-d"))
- {
- Base64.decodeFileToFile(infile, outfile);
- } // end else if: decode
- else
- {
- Base64.usage("Unknown flag: " + flag);
- } // end else
- } // end else
- } // end main
-
- /**
- * Prints command line usage.
- *
- * @param msg A message to include with usage info.
- */
- private final static void usage(final String msg)
- {
- System.err.println(msg);
- System.err.println("Usage: java Base64 -e|-d inputfile outputfile");
- } // end usage
-
- /* ******** E N C O D I N G M E T H O D S ******** */
-
- /**
- * Encodes up to the first three bytes of array <var>threeBytes</var>
- * and returns a four-byte array in Base64 notation.
- * The actual number of significant bytes in your array is
- * given by <var>numSigBytes</var>.
- * The array <var>threeBytes</var> needs only be as big as
- * <var>numSigBytes</var>.
- * Code can reuse a byte array by passing a four-byte array as <var>b4</var>.
- *
- * @param b4 A reusable byte array to reduce array instantiation
- * @param threeBytes the array to convert
- * @param numSigBytes the number of significant bytes in your array
- * @return four byte array in Base64 notation.
- * @since 1.5.1
- */
- private static byte[] encode3to4(final byte[] b4, final byte[] threeBytes, final int numSigBytes, final int options)
- {
- Base64.encode3to4(threeBytes, 0, numSigBytes, b4, 0, options);
- return b4;
- } // end encode3to4
-
- /**
- * <p>Encodes up to three bytes of the array <var>source</var>
- * and writes the resulting four Base64 bytes to <var>destination</var>.
- * The source and destination arrays can be manipulated
- * anywhere along their length by specifying
- * <var>srcOffset</var> and <var>destOffset</var>.
- * This method does not check to make sure your arrays
- * are large enough to accomodate <var>srcOffset</var> + 3 for
- * the <var>source</var> array or <var>destOffset</var> + 4 for
- * the <var>destination</var> array.
- * The actual number of significant bytes in your array is
- * given by <var>numSigBytes</var>.</p>
- * <p>This is the lowest level of the encoding methods with
- * all possible parameters.</p>
- *
- * @param source the array to convert
- * @param srcOffset the index where conversion begins
- * @param numSigBytes the number of significant bytes in your array
- * @param destination the array to hold the conversion
- * @param destOffset the index where output will be put
- * @return the <var>destination</var> array
- * @since 1.3
- */
- private static byte[] encode3to4(final byte[] source,
- final int srcOffset,
- final int numSigBytes,
- final byte[] destination,
- final int destOffset,
- final int options)
- {
- byte[] ALPHABET = Base64.getAlphabet(options);
-
- // 1 2 3
- // 01234567890123456789012345678901 Bit position
- // --------000000001111111122222222 Array position from threeBytes
- // --------| || || || | Six bit groups to index ALPHABET
- // >>18 >>12 >> 6 >> 0 Right shift necessary
- // 0x3f 0x3f 0x3f Additional AND
-
- // Create buffer with zero-padding if there are only one or two
- // significant bytes passed in the array.
- // We have to shift left 24 in order to flush out the 1's that appear
- // when Java treats a value as negative that is cast from a byte to an int.
- int inBuff = (numSigBytes > 0 ? source[srcOffset] << 24 >>> 8 : 0) | (numSigBytes > 1 ? source[srcOffset + 1] << 24 >>> 16
- : 0) |
- (numSigBytes > 2 ? source[srcOffset + 2] << 24 >>> 24 : 0);
-
- switch (numSigBytes)
- {
- case 3:
- destination[destOffset] = ALPHABET[(inBuff >>> 18)];
- destination[destOffset + 1] = ALPHABET[inBuff >>> 12 & 0x3f];
- destination[destOffset + 2] = ALPHABET[inBuff >>> 6 & 0x3f];
- destination[destOffset + 3] = ALPHABET[inBuff & 0x3f];
- return destination;
-
- case 2:
- destination[destOffset] = ALPHABET[(inBuff >>> 18)];
- destination[destOffset + 1] = ALPHABET[inBuff >>> 12 & 0x3f];
- destination[destOffset + 2] = ALPHABET[inBuff >>> 6 & 0x3f];
- destination[destOffset + 3] = Base64.EQUALS_SIGN;
- return destination;
-
- case 1:
- destination[destOffset] = ALPHABET[(inBuff >>> 18)];
- destination[destOffset + 1] = ALPHABET[inBuff >>> 12 & 0x3f];
- destination[destOffset + 2] = Base64.EQUALS_SIGN;
- destination[destOffset + 3] = Base64.EQUALS_SIGN;
- return destination;
-
- default:
- return destination;
- } // end switch
- } // end encode3to4
-
- /**
- * Serializes an object and returns the Base64-encoded
- * version of that serialized object. If the object
- * cannot be serialized or there is another error,
- * the method will return <tt>null</tt>.
- * The object is not GZip-compressed before being encoded.
- *
- * @param serializableObject The object to encode
- * @return The Base64-encoded object
- * @since 1.4
- */
- public static String encodeObject(final java.io.Serializable serializableObject)
- {
- return Base64.encodeObject(serializableObject, Base64.NO_OPTIONS);
- } // end encodeObject
-
- /**
- * Serializes an object and returns the Base64-encoded
- * version of that serialized object. If the object
- * cannot be serialized or there is another error,
- * the method will return <tt>null</tt>.
- * <p>
- * Valid options:<pre>
- * GZIP: gzip-compresses object before encoding it.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- * <p>
- * Example: <code>encodeObject( myObj, Base64.GZIP )</code> or
- * <p>
- * Example: <code>encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
- *
- * @param serializableObject The object to encode
- * @param options Specified options
- * @return The Base64-encoded object
- * @see Base64#GZIP
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public static String encodeObject(final java.io.Serializable serializableObject, final int options)
- {
- // Streams
- java.io.ByteArrayOutputStream baos = null;
- java.io.OutputStream b64os = null;
- java.io.ObjectOutputStream oos = null;
- java.util.zip.GZIPOutputStream gzos = null;
-
- // Isolate options
- int gzip = options & Base64.GZIP;
- int dontBreakLines = options & Base64.DONT_BREAK_LINES;
-
- try
- {
- // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
- baos = new java.io.ByteArrayOutputStream();
- b64os = new Base64.OutputStream(baos, Base64.ENCODE | options);
-
- // GZip?
- if (gzip == Base64.GZIP)
- {
- gzos = new java.util.zip.GZIPOutputStream(b64os);
- oos = new java.io.ObjectOutputStream(gzos);
- } // end if: gzip
- else
- {
- oos = new java.io.ObjectOutputStream(b64os);
- }
-
- oos.writeObject(serializableObject);
- } // end try
- catch (java.io.IOException e)
- {
- e.printStackTrace();
- return null;
- } // end catch
- finally
- {
- try
- {
- oos.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- gzos.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- b64os.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- baos.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- // Return value according to relevant encoding.
- try
- {
- return new String(baos.toByteArray(), Base64.PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uue)
- {
- return new String(baos.toByteArray());
- } // end catch
-
- } // end encode
-
- /**
- * Encodes a byte array into Base64 notation.
- * Does not GZip-compress data.
- *
- * @param source The data to convert
- * @since 1.4
- */
- public static String encodeBytes(final byte[] source)
- {
- return Base64.encodeBytes(source, 0, source.length, Base64.NO_OPTIONS);
- } // end encodeBytes
-
- /**
- * Encodes a byte array into Base64 notation.
- * <p>
- * Valid options:<pre>
- * GZIP: gzip-compresses object before encoding it.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- * <p>
- * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
- * <p>
- * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
- *
- *
- * @param source The data to convert
- * @param options Specified options
- * @see Base64#GZIP
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public static String encodeBytes(final byte[] source, final int options)
- {
- return Base64.encodeBytes(source, 0, source.length, options);
- } // end encodeBytes
-
- /**
- * Encodes a byte array into Base64 notation.
- * Does not GZip-compress data.
- *
- * @param source The data to convert
- * @param off Offset in array where conversion should begin
- * @param len Length of data to convert
- * @since 1.4
- */
- public static String encodeBytes(final byte[] source, final int off, final int len)
- {
- return Base64.encodeBytes(source, off, len, Base64.NO_OPTIONS);
- } // end encodeBytes
-
- /**
- * Encodes a byte array into Base64 notation.
- * <p>
- * Valid options:<pre>
- * GZIP: gzip-compresses object before encoding it.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- * <p>
- * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
- * <p>
- * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
- *
- *
- * @param source The data to convert
- * @param off Offset in array where conversion should begin
- * @param len Length of data to convert
- * @param options options alphabet type is pulled from this (standard, url-safe, ordered)
- * @see Base64#GZIP
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public static String encodeBytes(final byte[] source, final int off, final int len, final int options)
- {
- // Isolate options
- int dontBreakLines = options & Base64.DONT_BREAK_LINES;
- int gzip = options & Base64.GZIP;
-
- // Compress?
- if (gzip == Base64.GZIP)
- {
- java.io.ByteArrayOutputStream baos = null;
- java.util.zip.GZIPOutputStream gzos = null;
- Base64.OutputStream b64os = null;
-
- try
- {
- // GZip -> Base64 -> ByteArray
- baos = new java.io.ByteArrayOutputStream();
- b64os = new Base64.OutputStream(baos, Base64.ENCODE | options);
- gzos = new java.util.zip.GZIPOutputStream(b64os);
-
- gzos.write(source, off, len);
- gzos.close();
- } // end try
- catch (java.io.IOException e)
- {
- e.printStackTrace();
- return null;
- } // end catch
- finally
- {
- try
- {
- gzos.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- b64os.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- baos.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- // Return value according to relevant encoding.
- try
- {
- return new String(baos.toByteArray(), Base64.PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uue)
- {
- return new String(baos.toByteArray());
- } // end catch
- } // end if: compress
-
- // Else, don't compress. Better not to use streams at all then.
- else
- {
- // Convert option to boolean in way that code likes it.
- boolean breakLines = dontBreakLines == 0;
-
- int len43 = len * 4 / 3;
- byte[] outBuff = new byte[len43 + (len % 3 > 0 ? 4 : 0) // Account for padding
- +
- (breakLines ? len43 / Base64.MAX_LINE_LENGTH : 0)]; // New lines
- int d = 0;
- int e = 0;
- int len2 = len - 2;
- int lineLength = 0;
- for (; d < len2; d += 3, e += 4)
- {
- Base64.encode3to4(source, d + off, 3, outBuff, e, options);
-
- lineLength += 4;
- if (breakLines && lineLength == Base64.MAX_LINE_LENGTH)
- {
- outBuff[e + 4] = Base64.NEW_LINE;
- e++;
- lineLength = 0;
- } // end if: end of line
- } // en dfor: each piece of array
-
- if (d < len)
- {
- Base64.encode3to4(source, d + off, len - d, outBuff, e, options);
- e += 4;
- } // end if: some padding needed
-
- // Return value according to relevant encoding.
- try
- {
- return new String(outBuff, 0, e, Base64.PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uue)
- {
- return new String(outBuff, 0, e);
- } // end catch
-
- } // end else: don't compress
-
- } // end encodeBytes
-
- /* ******** D E C O D I N G M E T H O D S ******** */
-
- /**
- * Decodes four bytes from array <var>source</var>
- * and writes the resulting bytes (up to three of them)
- * to <var>destination</var>.
- * The source and destination arrays can be manipulated
- * anywhere along their length by specifying
- * <var>srcOffset</var> and <var>destOffset</var>.
- * This method does not check to make sure your arrays
- * are large enough to accomodate <var>srcOffset</var> + 4 for
- * the <var>source</var> array or <var>destOffset</var> + 3 for
- * the <var>destination</var> array.
- * This method returns the actual number of bytes that
- * were converted from the Base64 encoding.
- * <p>This is the lowest level of the decoding methods with
- * all possible parameters.</p>
- *
- *
- * @param source the array to convert
- * @param srcOffset the index where conversion begins
- * @param destination the array to hold the conversion
- * @param destOffset the index where output will be put
- * @param options alphabet type is pulled from this (standard, url-safe, ordered)
- * @return the number of decoded bytes converted
- * @since 1.3
- */
- private static int decode4to3(final byte[] source,
- final int srcOffset,
- final byte[] destination,
- final int destOffset,
- final int options)
- {
- byte[] DECODABET = Base64.getDecodabet(options);
-
- // Example: Dk==
- if (source[srcOffset + 2] == Base64.EQUALS_SIGN)
- {
- // Two ways to do the same thing. Don't know which way I like best.
- // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
- // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
- int outBuff = (DECODABET[source[srcOffset]] & 0xFF) << 18 | (DECODABET[source[srcOffset + 1]] & 0xFF) << 12;
-
- destination[destOffset] = (byte)(outBuff >>> 16);
- return 1;
- }
-
- // Example: DkL=
- else if (source[srcOffset + 3] == Base64.EQUALS_SIGN)
- {
- // Two ways to do the same thing. Don't know which way I like best.
- // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
- // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
- // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
- int outBuff = (DECODABET[source[srcOffset]] & 0xFF) << 18 | (DECODABET[source[srcOffset + 1]] & 0xFF) << 12 |
- (DECODABET[source[srcOffset + 2]] & 0xFF) << 6;
-
- destination[destOffset] = (byte)(outBuff >>> 16);
- destination[destOffset + 1] = (byte)(outBuff >>> 8);
- return 2;
- }
-
- // Example: DkLE
- else
- {
- try
- {
- // Two ways to do the same thing. Don't know which way I like best.
- // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
- // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
- // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
- // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
- int outBuff = (DECODABET[source[srcOffset]] & 0xFF) << 18 | (DECODABET[source[srcOffset + 1]] & 0xFF) << 12 |
- (DECODABET[source[srcOffset + 2]] & 0xFF) << 6 |
- DECODABET[source[srcOffset + 3]] &
- 0xFF;
-
- destination[destOffset] = (byte)(outBuff >> 16);
- destination[destOffset + 1] = (byte)(outBuff >> 8);
- destination[destOffset + 2] = (byte)outBuff;
-
- return 3;
- }
- catch (Exception e)
- {
- System.out.println("" + source[srcOffset] + ": " + DECODABET[source[srcOffset]]);
- System.out.println("" + source[srcOffset + 1] + ": " + DECODABET[source[srcOffset + 1]]);
- System.out.println("" + source[srcOffset + 2] + ": " + DECODABET[source[srcOffset + 2]]);
- System.out.println("" + source[srcOffset + 3] + ": " + DECODABET[source[srcOffset + 3]]);
- return -1;
- } // end catch
- }
- } // end decodeToBytes
-
- /**
- * Very low-level access to decoding ASCII characters in
- * the form of a byte array. Does not support automatically
- * gunzipping or any other "fancy" features.
- *
- * @param source The Base64 encoded data
- * @param off The offset of where to begin decoding
- * @param len The length of characters to decode
- * @return decoded data
- * @since 1.3
- */
- public static byte[] decode(final byte[] source, final int off, final int len, final int options)
- {
- byte[] DECODABET = Base64.getDecodabet(options);
-
- int len34 = len * 3 / 4;
- byte[] outBuff = new byte[len34]; // Upper limit on size of output
- int outBuffPosn = 0;
-
- byte[] b4 = new byte[4];
- int b4Posn = 0;
- int i = 0;
- byte sbiCrop = 0;
- byte sbiDecode = 0;
- for (i = off; i < off + len; i++)
- {
- sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits
- sbiDecode = DECODABET[sbiCrop];
-
- if (sbiDecode >= Base64.WHITE_SPACE_ENC) // White space, Equals sign or better
- {
- if (sbiDecode >= Base64.EQUALS_SIGN_ENC)
- {
- b4[b4Posn++] = sbiCrop;
- if (b4Posn > 3)
- {
- outBuffPosn += Base64.decode4to3(b4, 0, outBuff, outBuffPosn, options);
- b4Posn = 0;
-
- // If that was the equals sign, break out of 'for' loop
- if (sbiCrop == Base64.EQUALS_SIGN)
- {
- break;
- }
- } // end if: quartet built
-
- } // end if: equals sign or better
-
- } // end if: white space, equals sign or better
- else
- {
- System.err.println("Bad Base64 input character at " + i + ": " + source[i] + "(decimal)");
- return null;
- } // end else:
- } // each input character
-
- byte[] out = new byte[outBuffPosn];
- System.arraycopy(outBuff, 0, out, 0, outBuffPosn);
- return out;
- } // end decode
-
- /**
- * Decodes data from Base64 notation, automatically
- * detecting gzip-compressed data and decompressing it.
- *
- * @param s the string to decode
- * @return the decoded data
- * @since 1.4
- */
- public static byte[] decode(final String s)
- {
- return Base64.decode(s, Base64.NO_OPTIONS);
- }
-
- /**
- * Decodes data from Base64 notation, automatically
- * detecting gzip-compressed data and decompressing it.
- *
- * @param s the string to decode
- * @param options encode options such as URL_SAFE
- * @return the decoded data
- * @since 1.4
- */
- public static byte[] decode(final String s, final int options)
- {
- byte[] bytes;
- try
- {
- bytes = s.getBytes(Base64.PREFERRED_ENCODING);
- } // end try
- catch (java.io.UnsupportedEncodingException uee)
- {
- bytes = s.getBytes();
- } // end catch
- // </change>
-
- // Decode
- bytes = Base64.decode(bytes, 0, bytes.length, options);
-
- // Check to see if it's gzip-compressed
- // GZIP Magic Two-Byte Number: 0x8b1f (35615)
- if (bytes != null && bytes.length >= 4)
- {
-
- int head = bytes[0] & 0xff | bytes[1] << 8 & 0xff00;
- if (java.util.zip.GZIPInputStream.GZIP_MAGIC == head)
- {
- java.io.ByteArrayInputStream bais = null;
- java.util.zip.GZIPInputStream gzis = null;
- java.io.ByteArrayOutputStream baos = null;
- byte[] buffer = new byte[2048];
- int length = 0;
-
- try
- {
- baos = new java.io.ByteArrayOutputStream();
- bais = new java.io.ByteArrayInputStream(bytes);
- gzis = new java.util.zip.GZIPInputStream(bais);
-
- while ((length = gzis.read(buffer)) >= 0)
- {
- baos.write(buffer, 0, length);
- } // end while: reading input
-
- // No error? Get new bytes.
- bytes = baos.toByteArray();
-
- } // end try
- catch (java.io.IOException e)
- {
- // Just return originally-decoded bytes
- } // end catch
- finally
- {
- try
- {
- baos.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- gzis.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- bais.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- } // end if: gzipped
- } // end if: bytes.length >= 2
-
- return bytes;
- } // end decode
-
- /**
- * Attempts to decode Base64 data and deserialize a Java
- * Object within. Returns <tt>null</tt> if there was an error.
- *
- * @param encodedObject The Base64 data to decode
- * @return The decoded and deserialized object
- * @since 1.5
- */
- public static Object decodeToObject(final String encodedObject)
- {
- // Decode and gunzip if necessary
- byte[] objBytes = Base64.decode(encodedObject);
-
- java.io.ByteArrayInputStream bais = null;
- java.io.ObjectInputStream ois = null;
- Object obj = null;
-
- try
- {
- bais = new java.io.ByteArrayInputStream(objBytes);
- ois = new java.io.ObjectInputStream(bais);
-
- obj = ois.readObject();
- } // end try
- catch (java.io.IOException e)
- {
- e.printStackTrace();
- obj = null;
- } // end catch
- catch (java.lang.ClassNotFoundException e)
- {
- e.printStackTrace();
- obj = null;
- } // end catch
- finally
- {
- try
- {
- bais.close();
- }
- catch (Exception e)
- {
- }
- try
- {
- ois.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- return obj;
- } // end decodeObject
-
- /**
- * Convenience method for encoding data to a file.
- *
- * @param dataToEncode byte array of data to encode in base64 form
- * @param filename Filename for saving encoded data
- * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
- *
- * @since 2.1
- */
- public static boolean encodeToFile(final byte[] dataToEncode, final String filename)
- {
- boolean success = false;
- Base64.OutputStream bos = null;
- try
- {
- bos = new Base64.OutputStream(new java.io.FileOutputStream(filename), Base64.ENCODE);
- bos.write(dataToEncode);
- success = true;
- } // end try
- catch (java.io.IOException e)
- {
-
- success = false;
- } // end catch: IOException
- finally
- {
- try
- {
- bos.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- return success;
- } // end encodeToFile
-
- /**
- * Convenience method for decoding data to a file.
- *
- * @param dataToDecode Base64-encoded data as a string
- * @param filename Filename for saving decoded data
- * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
- *
- * @since 2.1
- */
- public static boolean decodeToFile(final String dataToDecode, final String filename)
- {
- boolean success = false;
- Base64.OutputStream bos = null;
- try
- {
- bos = new Base64.OutputStream(new java.io.FileOutputStream(filename), Base64.DECODE);
- bos.write(dataToDecode.getBytes(Base64.PREFERRED_ENCODING));
- success = true;
- } // end try
- catch (java.io.IOException e)
- {
- success = false;
- } // end catch: IOException
- finally
- {
- try
- {
- bos.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- return success;
- } // end decodeToFile
-
- /**
- * Convenience method for reading a base64-encoded
- * file and decoding it.
- *
- * @param filename Filename for reading encoded data
- * @return decoded byte array or null if unsuccessful
- *
- * @since 2.1
- */
- public static byte[] decodeFromFile(final String filename)
- {
- byte[] decodedData = null;
- Base64.InputStream bis = null;
- try
- {
- // Set up some useful variables
- java.io.File file = new java.io.File(filename);
- byte[] buffer = null;
- int length = 0;
- int numBytes = 0;
-
- // Check for size of file
- if (file.length() > Integer.MAX_VALUE)
- {
- System.err.println("File is too big for this convenience method (" + file.length() + " bytes).");
- return null;
- } // end if: file too big for int index
- buffer = new byte[(int)file.length()];
-
- // Open a stream
- bis = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(file)), Base64.DECODE);
-
- // Read until done
- while ((numBytes = bis.read(buffer, length, 4096)) >= 0)
- {
- length += numBytes;
- }
-
- // Save in a variable to return
- decodedData = new byte[length];
- System.arraycopy(buffer, 0, decodedData, 0, length);
-
- } // end try
- catch (java.io.IOException e)
- {
- System.err.println("Error decoding from file " + filename);
- } // end catch: IOException
- finally
- {
- try
- {
- bis.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- return decodedData;
- } // end decodeFromFile
-
- /**
- * Convenience method for reading a binary file
- * and base64-encoding it.
- *
- * @param filename Filename for reading binary data
- * @return base64-encoded string or null if unsuccessful
- *
- * @since 2.1
- */
- public static String encodeFromFile(final String filename)
- {
- String encodedData = null;
- Base64.InputStream bis = null;
- try
- {
- // Set up some useful variables
- java.io.File file = new java.io.File(filename);
- byte[] buffer = new byte[Math.max((int)(file.length() * 1.4), 40)]; // Need max() for math on small files
- // (v2.2.1)
- int length = 0;
- int numBytes = 0;
-
- // Open a stream
- bis = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(file)), Base64.ENCODE);
-
- // Read until done
- while ((numBytes = bis.read(buffer, length, 4096)) >= 0)
- {
- length += numBytes;
- }
-
- // Save in a variable to return
- encodedData = new String(buffer, 0, length, Base64.PREFERRED_ENCODING);
-
- } // end try
- catch (java.io.IOException e)
- {
- System.err.println("Error encoding from file " + filename);
- } // end catch: IOException
- finally
- {
- try
- {
- bis.close();
- }
- catch (Exception e)
- {
- }
- } // end finally
-
- return encodedData;
- } // end encodeFromFile
-
- /**
- * Reads <tt>infile</tt> and encodes it to <tt>outfile</tt>.
- *
- * @param infile Input file
- * @param outfile Output file
- * @return true if the operation is successful
- * @since 2.2
- */
- public static boolean encodeFileToFile(final String infile, final String outfile)
- {
- boolean success = false;
- java.io.InputStream in = null;
- java.io.OutputStream out = null;
- try
- {
- in = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(infile)),
- Base64.ENCODE);
- out = new java.io.BufferedOutputStream(new java.io.FileOutputStream(outfile));
- byte[] buffer = new byte[65536]; // 64K
- int read = -1;
- while ((read = in.read(buffer)) >= 0)
- {
- out.write(buffer, 0, read);
- } // end while: through file
- success = true;
- }
- catch (java.io.IOException exc)
- {
- exc.printStackTrace();
- }
- finally
- {
- try
- {
- in.close();
- }
- catch (Exception exc)
- {
- }
- try
- {
- out.close();
- }
- catch (Exception exc)
- {
- }
- } // end finally
-
- return success;
- } // end encodeFileToFile
-
- /**
- * Reads <tt>infile</tt> and decodes it to <tt>outfile</tt>.
- *
- * @param infile Input file
- * @param outfile Output file
- * @return true if the operation is successful
- * @since 2.2
- */
- public static boolean decodeFileToFile(final String infile, final String outfile)
- {
- boolean success = false;
- java.io.InputStream in = null;
- java.io.OutputStream out = null;
- try
- {
- in = new Base64.InputStream(new java.io.BufferedInputStream(new java.io.FileInputStream(infile)),
- Base64.DECODE);
- out = new java.io.BufferedOutputStream(new java.io.FileOutputStream(outfile));
- byte[] buffer = new byte[65536]; // 64K
- int read = -1;
- while ((read = in.read(buffer)) >= 0)
- {
- out.write(buffer, 0, read);
- } // end while: through file
- success = true;
- }
- catch (java.io.IOException exc)
- {
- exc.printStackTrace();
- }
- finally
- {
- try
- {
- in.close();
- }
- catch (Exception exc)
- {
- }
- try
- {
- out.close();
- }
- catch (Exception exc)
- {
- }
- } // end finally
-
- return success;
- } // end decodeFileToFile
-
- /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */
-
- /**
- * A {@link Base64.InputStream} will read data from another
- * <tt>java.io.InputStream</tt>, given in the constructor,
- * and encode/decode to/from Base64 notation on the fly.
- *
- * @see Base64
- * @since 1.3
- */
- public static class InputStream extends java.io.FilterInputStream
- {
- private final boolean encode; // Encoding or decoding
-
- private int position; // Current position in the buffer
-
- private final byte[] buffer; // Small buffer holding converted data
-
- private final int bufferLength; // Length of buffer (3 or 4)
-
- private int numSigBytes; // Number of meaningful bytes in the buffer
-
- private int lineLength;
-
- private final boolean breakLines; // Break lines at less than 80 characters
-
- private final int options; // Record options used to create the stream.
-
- private final byte[] alphabet; // Local copies to avoid extra method calls
-
- private final byte[] decodabet; // Local copies to avoid extra method calls
-
- /**
- * Constructs a {@link Base64.InputStream} in DECODE mode.
- *
- * @param in the <tt>java.io.InputStream</tt> from which to read data.
- * @since 1.3
- */
- public InputStream(final java.io.InputStream in)
- {
- this(in, Base64.DECODE);
- } // end constructor
-
- /**
- * Constructs a {@link Base64.InputStream} in
- * either ENCODE or DECODE mode.
- * <p>
- * Valid options:<pre>
- * ENCODE or DECODE: Encode or Decode as data is read.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * (only meaningful when encoding)
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- * <p>
- * Example: <code>new Base64.InputStream( in, Base64.DECODE )</code>
- *
- *
- * @param in the <tt>java.io.InputStream</tt> from which to read data.
- * @param options Specified options
- * @see Base64#ENCODE
- * @see Base64#DECODE
- * @see Base64#DONT_BREAK_LINES
- * @since 2.0
- */
- public InputStream(final java.io.InputStream in, final int options)
- {
- super(in);
- breakLines = (options & Base64.DONT_BREAK_LINES) != Base64.DONT_BREAK_LINES;
- encode = (options & Base64.ENCODE) == Base64.ENCODE;
- bufferLength = encode ? 4 : 3;
- buffer = new byte[bufferLength];
- position = -1;
- lineLength = 0;
- this.options = options; // Record for later, mostly to determine which alphabet to use
- alphabet = Base64.getAlphabet(options);
- decodabet = Base64.getDecodabet(options);
- } // end constructor
-
- /**
- * Reads enough of the input stream to convert
- * to/from Base64 and returns the next byte.
- *
- * @return next byte
- * @since 1.3
- */
- @Override
- public int read() throws java.io.IOException
- {
- // Do we need to get data?
- if (position < 0)
- {
- if (encode)
- {
- byte[] b3 = new byte[3];
- int numBinaryBytes = 0;
- for (int i = 0; i < 3; i++)
- {
- try
- {
- int b = in.read();
-
- // If end of stream, b is -1.
- if (b >= 0)
- {
- b3[i] = (byte)b;
- numBinaryBytes++;
- } // end if: not end of stream
-
- } // end try: read
- catch (java.io.IOException e)
- {
- // Only a problem if we got no data at all.
- if (i == 0)
- {
- throw e;
- }
-
- } // end catch
- } // end for: each needed input byte
-
- if (numBinaryBytes > 0)
- {
- Base64.encode3to4(b3, 0, numBinaryBytes, buffer, 0, options);
- position = 0;
- numSigBytes = 4;
- } // end if: got data
- else
- {
- return -1;
- }
- } // end if: encoding
-
- // Else decoding
- else
- {
- byte[] b4 = new byte[4];
- int i = 0;
- for (i = 0; i < 4; i++)
- {
- // Read four "meaningful" bytes:
- int b = 0;
- do
- {
- b = in.read();
- }
- while (b >= 0 && decodabet[b & 0x7f] <= Base64.WHITE_SPACE_ENC);
-
- if (b < 0)
- {
- break; // Reads a -1 if end of stream
- }
-
- b4[i] = (byte)b;
- } // end for: each needed input byte
-
- if (i == 4)
- {
- numSigBytes = Base64.decode4to3(b4, 0, buffer, 0, options);
- position = 0;
- } // end if: got four characters
- else if (i == 0)
- {
- return -1;
- }
- else
- {
- // Must have broken out from above.
- throw new java.io.IOException("Improperly padded Base64 input.");
- }
-
- } // end else: decode
- } // end else: get data
-
- // Got data?
- if (position >= 0)
- {
- // End of relevant data?
- if ( /*!encode &&*/position >= numSigBytes)
- {
- return -1;
- }
-
- if (encode && breakLines && lineLength >= Base64.MAX_LINE_LENGTH)
- {
- lineLength = 0;
- return '\n';
- } // end if
- else
- {
- lineLength++; // This isn't important when decoding
- // but throwing an extra "if" seems
- // just as wasteful.
-
- int b = buffer[position++];
-
- if (position >= bufferLength)
- {
- position = -1;
- }
-
- return b & 0xFF; // This is how you "cast" a byte that's
- // intended to be unsigned.
- } // end else
- } // end if: position >= 0
- else
- {
- // When JDK1.4 is more accepted, use an assertion here.
- throw new java.io.IOException("Error in Base64 code reading stream.");
- }
- } // end read
-
- /**
- * Calls {@link #read()} repeatedly until the end of stream
- * is reached or <var>len</var> bytes are read.
- * Returns number of bytes read into array or -1 if
- * end of stream is encountered.
- *
- * @param dest array to hold values
- * @param off offset for array
- * @param len max number of bytes to read into array
- * @return bytes read into array or -1 if end of stream is encountered.
- * @since 1.3
- */
- @Override
- public int read(final byte[] dest, final int off, final int len) throws java.io.IOException
- {
- int i;
- int b;
- for (i = 0; i < len; i++)
- {
- b = read();
-
- // if( b < 0 && i == 0 )
- // return -1;
-
- if (b >= 0)
- {
- dest[off + i] = (byte)b;
- }
- else if (i == 0)
- {
- return -1;
- }
- else
- {
- break; // Out of 'for' loop
- }
- } // end for: each byte read
- return i;
- } // end read
-
- } // end inner class InputStream
-
- /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */
-
- /**
- * A {@link Base64.OutputStream} will write data to another
- * <tt>java.io.OutputStream</tt>, given in the constructor,
- * and encode/decode to/from Base64 notation on the fly.
- *
- * @see Base64
- * @since 1.3
- */
- public static class OutputStream extends java.io.FilterOutputStream
- {
- private final boolean encode;
-
- private int position;
-
- private byte[] buffer;
-
- private final int bufferLength;
-
- private int lineLength;
-
- private final boolean breakLines;
-
- private final byte[] b4; // Scratch used in a few places
-
- private boolean suspendEncoding;
-
- private final int options; // Record for later
-
- private final byte[] alphabet; // Local copies to avoid extra method calls
-
- private final byte[] decodabet; // Local copies to avoid extra method calls
-
- /**
- * Constructs a {@link Base64.OutputStream} in ENCODE mode.
- *
- * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
- * @since 1.3
- */
- public OutputStream(final java.io.OutputStream out)
- {
- this(out, Base64.ENCODE);
- } // end constructor
-
- /**
- * Constructs a {@link Base64.OutputStream} in
- * either ENCODE or DECODE mode.
- * <p>
- * Valid options:<pre>
- * ENCODE or DECODE: Encode or Decode as data is read.
- * DONT_BREAK_LINES: don't break lines at 76 characters
- * (only meaningful when encoding)
- * <i>Note: Technically, this makes your encoding non-compliant.</i>
- * </pre>
- * <p>
- * Example: <code>new Base64.OutputStream( out, Base64.ENCODE )</code>
- *
- * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
- * @param options Specified options.
- * @see Base64#ENCODE
- * @see Base64#DECODE
- * @see Base64#DONT_BREAK_LINES
- * @since 1.3
- */
- public OutputStream(final java.io.OutputStream out, final int options)
- {
- super(out);
- breakLines = (options & Base64.DONT_BREAK_LINES) != Base64.DONT_BREAK_LINES;
- encode = (options & Base64.ENCODE) == Base64.ENCODE;
- bufferLength = encode ? 3 : 4;
- buffer = new byte[bufferLength];
- position = 0;
- lineLength = 0;
- suspendEncoding = false;
- b4 = new byte[4];
- this.options = options;
- alphabet = Base64.getAlphabet(options);
- decodabet = Base64.getDecodabet(options);
- } // end constructor
-
- /**
- * Writes the byte to the output stream after
- * converting to/from Base64 notation.
- * When encoding, bytes are buffered three
- * at a time before the output stream actually
- * gets a write() call.
- * When decoding, bytes are buffered four
- * at a time.
- *
- * @param theByte the byte to write
- * @since 1.3
- */
- @Override
- public void write(final int theByte) throws java.io.IOException
- {
- // Encoding suspended?
- if (suspendEncoding)
- {
- super.out.write(theByte);
- return;
- } // end if: supsended
-
- // Encode?
- if (encode)
- {
- buffer[position++] = (byte)theByte;
- if (position >= bufferLength) // Enough to encode.
- {
- out.write(Base64.encode3to4(b4, buffer, bufferLength, options));
-
- lineLength += 4;
- if (breakLines && lineLength >= Base64.MAX_LINE_LENGTH)
- {
- out.write(Base64.NEW_LINE);
- lineLength = 0;
- } // end if: end of line
-
- position = 0;
- } // end if: enough to output
- } // end if: encoding
-
- // Else, Decoding
- else
- {
- // Meaningful Base64 character?
- if (decodabet[theByte & 0x7f] > Base64.WHITE_SPACE_ENC)
- {
- buffer[position++] = (byte)theByte;
- if (position >= bufferLength) // Enough to output.
- {
- int len = Base64.decode4to3(buffer, 0, b4, 0, options);
- out.write(b4, 0, len);
- // out.write( Base64.decode4to3( buffer ) );
- position = 0;
- } // end if: enough to output
- } // end if: meaningful base64 character
- else if (decodabet[theByte & 0x7f] != Base64.WHITE_SPACE_ENC)
- {
- throw new java.io.IOException("Invalid character in Base64 data.");
- }
- } // end else: decoding
- } // end write
-
- /**
- * Calls {@link #write(int)} repeatedly until <var>len</var>
- * bytes are written.
- *
- * @param theBytes array from which to read bytes
- * @param off offset for array
- * @param len max number of bytes to read into array
- * @since 1.3
- */
- @Override
- public void write(final byte[] theBytes, final int off, final int len) throws java.io.IOException
- {
- // Encoding suspended?
- if (suspendEncoding)
- {
- super.out.write(theBytes, off, len);
- return;
- } // end if: supsended
-
- for (int i = 0; i < len; i++)
- {
- write(theBytes[off + i]);
- } // end for: each byte written
-
- } // end write
-
- /**
- * Method added by PHIL. [Thanks, PHIL. -Rob]
- * This pads the buffer without closing the stream.
- */
- public void flushBase64() throws java.io.IOException
- {
- if (position > 0)
- {
- if (encode)
- {
- out.write(Base64.encode3to4(b4, buffer, position, options));
- position = 0;
- } // end if: encoding
- else
- {
- throw new java.io.IOException("Base64 input not properly padded.");
- }
- } // end if: buffer partially full
-
- } // end flush
-
- /**
- * Flushes and closes (I think, in the superclass) the stream.
- *
- * @since 1.3
- */
- @Override
- public void close() throws java.io.IOException
- {
- // 1. Ensure that pending characters are written
- flushBase64();
-
- // 2. Actually close the stream
- // Base class both flushes and closes.
- super.close();
-
- buffer = null;
- out = null;
- } // end close
-
- /**
- * Suspends encoding of the stream.
- * May be helpful if you need to embed a piece of
- * base640-encoded data in a stream.
- *
- * @since 1.5.1
- */
- public void suspendEncoding() throws java.io.IOException
- {
- flushBase64();
- suspendEncoding = true;
- } // end suspendEncoding
-
- /**
- * Resumes encoding of the stream.
- * May be helpful if you need to embed a piece of
- * base640-encoded data in a stream.
- *
- * @since 1.5.1
- */
- public void resumeEncoding()
- {
- suspendEncoding = false;
- } // end resumeEncoding
-
- } // end inner class OutputStream
-
-} // end class Base64
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentHashSet.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentHashSet.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentHashSet.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,92 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.utils;
-
-import java.util.AbstractSet;
-import java.util.Iterator;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- *
- * A ConcurrentHashSet.
- *
- * Offers same concurrency as ConcurrentHashMap but for a Set
- *
- * @author <a href="tim.fox(a)jboss.com">Tim Fox</a>
- * @version <tt>$Revision: 1935 $</tt>
- *
- * $Id: ConcurrentReaderHashSet.java 1935 2007-01-09 23:29:20Z clebert.suconic(a)jboss.com $
- */
-public class ConcurrentHashSet<E> extends AbstractSet<E> implements ConcurrentSet<E>
-{
- private final ConcurrentMap<E, Object> theMap;
-
- private static final Object dummy = new Object();
-
- public ConcurrentHashSet()
- {
- theMap = new ConcurrentHashMap<E, Object>();
- }
-
- @Override
- public int size()
- {
- return theMap.size();
- }
-
- @Override
- public Iterator<E> iterator()
- {
- return theMap.keySet().iterator();
- }
-
- @Override
- public boolean isEmpty()
- {
- return theMap.isEmpty();
- }
-
- @Override
- public boolean add(final E o)
- {
- return theMap.put(o, ConcurrentHashSet.dummy) == null;
- }
-
- @Override
- public boolean contains(final Object o)
- {
- return theMap.containsKey(o);
- }
-
- @Override
- public void clear()
- {
- theMap.clear();
- }
-
- @Override
- public boolean remove(final Object o)
- {
- return theMap.remove(o) == ConcurrentHashSet.dummy;
- }
-
- public boolean addIfAbsent(final E o)
- {
- Object obj = theMap.putIfAbsent(o, ConcurrentHashSet.dummy);
-
- return obj == null;
- }
-
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentSet.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentSet.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/ConcurrentSet.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,29 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.utils;
-
-import java.util.Set;
-
-/**
- *
- * A ConcurrentSet
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- * @param <E>
- */
-public interface ConcurrentSet<E> extends Set<E>
-{
- boolean addIfAbsent(E o);
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/HornetQThreadFactory.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/HornetQThreadFactory.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/HornetQThreadFactory.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,101 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.utils;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.hornetq.core.logging.Logger;
-
-/**
- *
- * A HornetQThreadFactory
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- */
-public class HornetQThreadFactory implements ThreadFactory
-{
- private static final Logger log = Logger.getLogger(HornetQThreadFactory.class);
-
- private final ThreadGroup group;
-
- private final AtomicInteger threadCount = new AtomicInteger(0);
-
- private final int threadPriority;
-
- private final boolean daemon;
-
- private final ClassLoader tccl;
-
- public HornetQThreadFactory(final String groupName, final boolean daemon, final ClassLoader tccl)
- {
- this(groupName, Thread.NORM_PRIORITY, daemon, tccl);
- }
-
- public HornetQThreadFactory(final String groupName, final int threadPriority, final boolean daemon, final ClassLoader tccl)
- {
- group = new ThreadGroup(groupName + "-" + System.identityHashCode(this));
-
- this.threadPriority = threadPriority;
-
- this.tccl = tccl;
-
- this.daemon = daemon;
- }
-
- public Thread newThread(final Runnable command)
- {
- final Thread t;
- // attach the thread to a group only if there is no security manager:
- // when sandboxed, the code does not have the RuntimePermission modifyThreadGroup
- if (System.getSecurityManager() == null)
- {
- t = new Thread(group, command, "Thread-" + threadCount.getAndIncrement() + " (group:" + group.getName() + ")");
- }
- else
- {
- t = new Thread(command, "Thread-" + threadCount.getAndIncrement());
- }
-
- AccessController.doPrivileged(new PrivilegedAction<Object>()
- {
- public Object run()
- {
- t.setDaemon(daemon);
- t.setPriority(threadPriority);
- return null;
- }
- });
-
- try
- {
- AccessController.doPrivileged(new PrivilegedAction<Object>()
- {
- public Object run()
- {
- t.setContextClassLoader(tccl);
- return null;
- }
- });
- }
- catch (java.security.AccessControlException e)
- {
- log.warn("Missing privileges to set Thread Context Class Loader on Thread Factory. Using current Thread Context Class Loader");
- }
-
- return t;
- }
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/ReusableLatch.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/ReusableLatch.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/ReusableLatch.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,156 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.utils;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.AbstractQueuedSynchronizer;
-
-/**
- *
- * <p>This class will use the framework provided to by AbstractQueuedSynchronizer.</p>
- * <p>AbstractQueuedSynchronizer is the framework for any sort of concurrent synchronization, such as Semaphores, events, etc, based on AtomicIntegers.</p>
- *
- * <p>This class works just like CountDownLatch, with the difference you can also increase the counter</p>
- *
- * <p>It could be used for sync points when one process is feeding the latch while another will wait when everything is done. (e.g. waiting IO completions to finish)</p>
- *
- * <p>On HornetQ we have the requirement of increment and decrement a counter until the user fires a ready event (commit). At that point we just act as a regular countDown.</p>
- *
- * <p>Note: This latch is reusable. Once it reaches zero, you can call up again, and reuse it on further waits.</p>
- *
- * <p>For example: prepareTransaction will wait for the current completions, and further adds will be called on the latch. Later on when commit is called you can reuse the same latch.</p>
- *
- * @author Clebert Suconic
- * */
-public class ReusableLatch
-{
- /**
- * Look at the doc and examples provided by AbstractQueuedSynchronizer for more information
- * @see AbstractQueuedSynchronizer*/
- @SuppressWarnings("serial")
- private static class CountSync extends AbstractQueuedSynchronizer
- {
- public CountSync(int count)
- {
- setState(count);
- }
-
- public int getCount()
- {
- return getState();
- }
-
- public void setCount(final int count)
- {
- setState(count);
- }
-
- @Override
- public int tryAcquireShared(final int numberOfAqcquires)
- {
- return getState() == 0 ? 1 : -1;
- }
-
- public void add()
- {
- for (;;)
- {
- int actualState = getState();
- int newState = actualState + 1;
- if (compareAndSetState(actualState, newState))
- {
- return;
- }
- }
- }
-
- @Override
- public boolean tryReleaseShared(final int numberOfReleases)
- {
- for (;;)
- {
- int actualState = getState();
- if (actualState == 0)
- {
- return true;
- }
-
- int newState = actualState - numberOfReleases;
-
- if (newState < 0)
- {
- newState = 0;
- }
-
- if (compareAndSetState(actualState, newState))
- {
- return newState == 0;
- }
- }
- }
- }
-
- private final CountSync control;
-
- public ReusableLatch()
- {
- this(0);
- }
-
- public ReusableLatch(final int count)
- {
- control = new CountSync(count);
- }
-
- public int getCount()
- {
- return control.getCount();
- }
-
- public void setCount(final int count)
- {
- control.setCount(count);
- }
-
- public void countUp()
- {
- control.add();
- }
-
- public void countDown()
- {
- control.releaseShared(1);
- }
-
-
- public void countDown(final int count)
- {
- control.releaseShared(count);
- }
-
- public void await() throws InterruptedException
- {
- control.acquireSharedInterruptibly(1);
- }
-
- public boolean await(final long milliseconds) throws InterruptedException
- {
- return control.tryAcquireSharedNanos(1, TimeUnit.MILLISECONDS.toNanos(milliseconds));
- }
-
- public boolean await(final long timeWait, TimeUnit timeUnit) throws InterruptedException
- {
- return control.tryAcquireSharedNanos(1, timeUnit.toNanos(timeWait));
- }
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/TypedProperties.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/TypedProperties.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/TypedProperties.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,1060 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.utils;
-
-import static org.hornetq.utils.DataConstants.BOOLEAN;
-import static org.hornetq.utils.DataConstants.BYTE;
-import static org.hornetq.utils.DataConstants.BYTES;
-import static org.hornetq.utils.DataConstants.CHAR;
-import static org.hornetq.utils.DataConstants.DOUBLE;
-import static org.hornetq.utils.DataConstants.FLOAT;
-import static org.hornetq.utils.DataConstants.INT;
-import static org.hornetq.utils.DataConstants.LONG;
-import static org.hornetq.utils.DataConstants.NULL;
-import static org.hornetq.utils.DataConstants.SHORT;
-import static org.hornetq.utils.DataConstants.STRING;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import org.hornetq.api.core.HornetQBuffer;
-import org.hornetq.api.core.PropertyConversionException;
-import org.hornetq.api.core.SimpleString;
-import org.hornetq.core.logging.Logger;
-
-/**
- *
- * Property Value Conversion.
- * <p>
- * This implementation follows section 3.5.4 of the <i>Java Message Service<i>
- * specification (Version 1.1 April 12, 2002).
- * <p>
- * TODO - should have typed property getters and do conversions herein
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- * @author <a href="mailto:clebert.suconic@jboss.com">Clebert Suconic</a>
- * @see <i>Java Message Service<i> specification (Version 1.1 April 12, 2002), section 3.5.4.
- */
-public class TypedProperties
-{
- private static final Logger log = Logger.getLogger(TypedProperties.class);
-
- private static final SimpleString HQ_PROPNAME = new SimpleString("_HQ_");
-
- private Map<SimpleString, PropertyValue> properties;
-
- private volatile int size;
-
- private boolean internalProperties;
-
- public TypedProperties()
- {
- }
-
- public int getMemoryOffset()
- {
- // The estimate is basically the encode size + 2 object references for each entry in the map
- // Note we don't include the attributes or anything else since they already included in the memory estimate
- // of the ServerMessage
-
- return properties == null ? 0 : size + 2 * DataConstants.SIZE_INT * properties.size();
- }
-
- public TypedProperties(final TypedProperties other)
- {
- properties = other.properties == null ? null : new HashMap<SimpleString, PropertyValue>(other.properties);
- size = other.size;
- }
-
- public boolean hasInternalProperties()
- {
- return internalProperties;
- }
-
- public void putBooleanProperty(final SimpleString key, final boolean value)
- {
- checkCreateProperties();
- doPutValue(key, new BooleanValue(value));
- }
-
- public void putByteProperty(final SimpleString key, final byte value)
- {
- checkCreateProperties();
- doPutValue(key, new ByteValue(value));
- }
-
- public void putBytesProperty(final SimpleString key, final byte[] value)
- {
- checkCreateProperties();
- doPutValue(key, value == null ? new NullValue() : new BytesValue(value));
- }
-
- public void putShortProperty(final SimpleString key, final short value)
- {
- checkCreateProperties();
- doPutValue(key, new ShortValue(value));
- }
-
- public void putIntProperty(final SimpleString key, final int value)
- {
- checkCreateProperties();
- doPutValue(key, new IntValue(value));
- }
-
- public void putLongProperty(final SimpleString key, final long value)
- {
- checkCreateProperties();
- doPutValue(key, new LongValue(value));
- }
-
- public void putFloatProperty(final SimpleString key, final float value)
- {
- checkCreateProperties();
- doPutValue(key, new FloatValue(value));
- }
-
- public void putDoubleProperty(final SimpleString key, final double value)
- {
- checkCreateProperties();
- doPutValue(key, new DoubleValue(value));
- }
-
- public void putSimpleStringProperty(final SimpleString key, final SimpleString value)
- {
- checkCreateProperties();
- doPutValue(key, value == null ? new NullValue() : new StringValue(value));
- }
-
- public void putCharProperty(final SimpleString key, final char value)
- {
- checkCreateProperties();
- doPutValue(key, new CharValue(value));
- }
-
- public void putTypedProperties(final TypedProperties otherProps)
- {
- if (otherProps == null || otherProps.properties == null)
- {
- return;
- }
-
- checkCreateProperties();
- Set<Entry<SimpleString, PropertyValue>> otherEntries = otherProps.properties.entrySet();
- for (Entry<SimpleString, PropertyValue> otherEntry : otherEntries)
- {
- doPutValue(otherEntry.getKey(), otherEntry.getValue());
- }
- }
-
- public Object getProperty(final SimpleString key)
- {
- return doGetProperty(key);
- }
-
- public Boolean getBooleanProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- return Boolean.valueOf(null);
- }
- else if (value instanceof Boolean)
- {
- return (Boolean)value;
- }
- else if (value instanceof SimpleString)
- {
- return Boolean.valueOf(((SimpleString)value).toString()).booleanValue();
- }
- else
- {
- throw new PropertyConversionException("Invalid conversion");
- }
- }
-
- public Byte getByteProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- return Byte.valueOf(null);
- }
- else if (value instanceof Byte)
- {
- return (Byte)value;
- }
- else if (value instanceof SimpleString)
- {
- return Byte.parseByte(((SimpleString)value).toString());
- }
- else
- {
- throw new PropertyConversionException("Invalid conversion");
- }
- }
-
- public Character getCharProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- throw new NullPointerException("Invalid conversion");
- }
-
- if (value instanceof Character)
- {
- return ((Character)value).charValue();
- }
- else
- {
- throw new PropertyConversionException("Invalid conversion");
- }
- }
-
- public byte[] getBytesProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- return null;
- }
- else if (value instanceof byte[])
- {
- return (byte[])value;
- }
- else
- {
- throw new PropertyConversionException("Invalid conversion");
- }
- }
-
- public Double getDoubleProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- return Double.valueOf(null);
- }
- else if (value instanceof Float)
- {
- return ((Float)value).doubleValue();
- }
- else if (value instanceof Double)
- {
- return (Double)value;
- }
- else if (value instanceof SimpleString)
- {
- return Double.parseDouble(((SimpleString)value).toString());
- }
- else
- {
- throw new PropertyConversionException("Invalid conversion");
- }
- }
-
- public Integer getIntProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- return Integer.valueOf(null);
- }
- else if (value instanceof Integer)
- {
- return (Integer)value;
- }
- else if (value instanceof Byte)
- {
- return ((Byte)value).intValue();
- }
- else if (value instanceof Short)
- {
- return ((Short)value).intValue();
- }
- else if (value instanceof SimpleString)
- {
- return Integer.parseInt(((SimpleString)value).toString());
- }
- else
- {
- throw new PropertyConversionException("Invalid conversion");
- }
- }
-
- public Long getLongProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- return Long.valueOf(null);
- }
- else if (value instanceof Long)
- {
- return (Long)value;
- }
- else if (value instanceof Byte)
- {
- return ((Byte)value).longValue();
- }
- else if (value instanceof Short)
- {
- return ((Short)value).longValue();
- }
- else if (value instanceof Integer)
- {
- return ((Integer)value).longValue();
- }
- else if (value instanceof SimpleString)
- {
- return Long.parseLong(((SimpleString)value).toString());
- }
- else
- {
- throw new PropertyConversionException("Invalid conversion");
- }
- }
-
- public Short getShortProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- {
- return Short.valueOf(null);
- }
- else if (value instanceof Byte)
- {
- return ((Byte)value).shortValue();
- }
- else if (value instanceof Short)
- {
- return (Short)value;
- }
- else if (value instanceof SimpleString)
- {
- return Short.parseShort(((SimpleString)value).toString());
- }
- else
- {
- throw new PropertyConversionException("Invalid Conversion.");
- }
- }
-
- public Float getFloatProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
- if (value == null)
- return Float.valueOf(null);
- if (value instanceof Float)
- {
- return ((Float)value).floatValue();
- }
- if (value instanceof SimpleString)
- {
- return Float.parseFloat(((SimpleString)value).toString());
- }
- throw new PropertyConversionException("Invalid conversion: " + key);
- }
-
- public SimpleString getSimpleStringProperty(final SimpleString key) throws PropertyConversionException
- {
- Object value = doGetProperty(key);
-
- if (value == null)
- {
- return null;
- }
-
- if (value instanceof SimpleString)
- {
- return (SimpleString)value;
- }
- else if (value instanceof Boolean)
- {
- return new SimpleString(value.toString());
- }
- else if (value instanceof Character)
- {
- return new SimpleString(value.toString());
- }
- else if (value instanceof Byte)
- {
- return new SimpleString(value.toString());
- }
- else if (value instanceof Short)
- {
- return new SimpleString(value.toString());
- }
- else if (value instanceof Integer)
- {
- return new SimpleString(value.toString());
- }
- else if (value instanceof Long)
- {
- return new SimpleString(value.toString());
- }
- else if (value instanceof Float)
- {
- return new SimpleString(value.toString());
- }
- else if (value instanceof Double)
- {
- return new SimpleString(value.toString());
- }
- throw new PropertyConversionException("Invalid conversion");
- }
-
- public Object removeProperty(final SimpleString key)
- {
- return doRemoveProperty(key);
- }
-
- public boolean containsProperty(final SimpleString key)
- {
- if (size == 0)
- {
- return false;
-
- }
- else
- {
- return properties.containsKey(key);
- }
- }
-
- public Set<SimpleString> getPropertyNames()
- {
- if (size == 0)
- {
- return Collections.emptySet();
- }
- else
- {
- return properties.keySet();
- }
- }
-
- public synchronized void decode(final HornetQBuffer buffer)
- {
- byte b = buffer.readByte();
-
- if (b == DataConstants.NULL)
- {
- properties = null;
- }
- else
- {
- int numHeaders = buffer.readInt();
-
- properties = new HashMap<SimpleString, PropertyValue>(numHeaders);
- size = 0;
-
- for (int i = 0; i < numHeaders; i++)
- {
- int len = buffer.readInt();
- byte[] data = new byte[len];
- buffer.readBytes(data);
- SimpleString key = new SimpleString(data);
-
- byte type = buffer.readByte();
-
- PropertyValue val;
-
- switch (type)
- {
- case NULL:
- {
- val = new NullValue();
- doPutValue(key, val);
- break;
- }
- case CHAR:
- {
- val = new CharValue(buffer);
- doPutValue(key, val);
- break;
- }
- case BOOLEAN:
- {
- val = new BooleanValue(buffer);
- doPutValue(key, val);
- break;
- }
- case BYTE:
- {
- val = new ByteValue(buffer);
- doPutValue(key, val);
- break;
- }
- case BYTES:
- {
- val = new BytesValue(buffer);
- doPutValue(key, val);
- break;
- }
- case SHORT:
- {
- val = new ShortValue(buffer);
- doPutValue(key, val);
- break;
- }
- case INT:
- {
- val = new IntValue(buffer);
- doPutValue(key, val);
- break;
- }
- case LONG:
- {
- val = new LongValue(buffer);
- doPutValue(key, val);
- break;
- }
- case FLOAT:
- {
- val = new FloatValue(buffer);
- doPutValue(key, val);
- break;
- }
- case DOUBLE:
- {
- val = new DoubleValue(buffer);
- doPutValue(key, val);
- break;
- }
- case STRING:
- {
- val = new StringValue(buffer);
- doPutValue(key, val);
- break;
- }
- default:
- {
- throw new IllegalArgumentException("Invalid type: " + type);
- }
- }
- }
- }
- }
-
- public synchronized void encode(final HornetQBuffer buffer)
- {
- if (properties == null)
- {
- buffer.writeByte(DataConstants.NULL);
- }
- else
- {
- buffer.writeByte(DataConstants.NOT_NULL);
-
- buffer.writeInt(properties.size());
-
- for (Map.Entry<SimpleString, PropertyValue> entry : properties.entrySet())
- {
- SimpleString s = entry.getKey();
- byte[] data = s.getData();
- buffer.writeInt(data.length);
- buffer.writeBytes(data);
-
- entry.getValue().write(buffer);
- }
- }
- }
-
- public int getEncodeSize()
- {
- if (properties == null)
- {
- return DataConstants.SIZE_BYTE;
- }
- else
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + size;
- }
- }
-
- public void clear()
- {
- if (properties != null)
- {
- properties.clear();
- }
- }
-
- @Override
- public String toString()
- {
- return "TypedProperties[" + properties + "]";
- }
-
- // Private ------------------------------------------------------------------------------------
-
- private void checkCreateProperties()
- {
- if (properties == null)
- {
- properties = new HashMap<SimpleString, PropertyValue>();
- }
- }
-
- private synchronized void doPutValue(final SimpleString key, final PropertyValue value)
- {
- if (key.startsWith(HQ_PROPNAME))
- {
- internalProperties = true;
- }
-
- PropertyValue oldValue = properties.put(key, value);
- if (oldValue != null)
- {
- size += value.encodeSize() - oldValue.encodeSize();
- }
- else
- {
- size += SimpleString.sizeofString(key) + value.encodeSize();
- }
- }
-
- private synchronized Object doRemoveProperty(final SimpleString key)
- {
- if (properties == null)
- {
- return null;
- }
-
- PropertyValue val = properties.remove(key);
-
- if (val == null)
- {
- return null;
- }
- else
- {
- size -= SimpleString.sizeofString(key) + val.encodeSize();
-
- return val.getValue();
- }
- }
-
- private synchronized Object doGetProperty(final Object key)
- {
- if (size == 0)
- {
- return null;
- }
-
- PropertyValue val = properties.get(key);
-
- if (val == null)
- {
- return null;
- }
- else
- {
- return val.getValue();
- }
- }
-
- // Inner classes ------------------------------------------------------------------------------
-
- private static abstract class PropertyValue
- {
- abstract Object getValue();
-
- abstract void write(HornetQBuffer buffer);
-
- abstract int encodeSize();
-
- @Override
- public String toString()
- {
- return "" + getValue();
- }
- }
-
- private static final class NullValue extends PropertyValue
- {
- public NullValue()
- {
- }
-
- @Override
- public Object getValue()
- {
- return null;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.NULL);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE;
- }
-
- }
-
- private static final class BooleanValue extends PropertyValue
- {
- final boolean val;
-
- public BooleanValue(final boolean val)
- {
- this.val = val;
- }
-
- public BooleanValue(final HornetQBuffer buffer)
- {
- val = buffer.readBoolean();
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.BOOLEAN);
- buffer.writeBoolean(val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_BOOLEAN;
- }
-
- }
-
- private static final class ByteValue extends PropertyValue
- {
- final byte val;
-
- public ByteValue(final byte val)
- {
- this.val = val;
- }
-
- public ByteValue(final HornetQBuffer buffer)
- {
- val = buffer.readByte();
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.BYTE);
- buffer.writeByte(val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_BYTE;
- }
- }
-
- private static final class BytesValue extends PropertyValue
- {
- final byte[] val;
-
- public BytesValue(final byte[] val)
- {
- this.val = val;
- }
-
- public BytesValue(final HornetQBuffer buffer)
- {
- int len = buffer.readInt();
- val = new byte[len];
- buffer.readBytes(val);
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.BYTES);
- buffer.writeInt(val.length);
- buffer.writeBytes(val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + val.length;
- }
-
- }
-
- private static final class ShortValue extends PropertyValue
- {
- final short val;
-
- public ShortValue(final short val)
- {
- this.val = val;
- }
-
- public ShortValue(final HornetQBuffer buffer)
- {
- val = buffer.readShort();
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.SHORT);
- buffer.writeShort(val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_SHORT;
- }
- }
-
- private static final class IntValue extends PropertyValue
- {
- final int val;
-
- public IntValue(final int val)
- {
- this.val = val;
- }
-
- public IntValue(final HornetQBuffer buffer)
- {
- val = buffer.readInt();
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.INT);
- buffer.writeInt(val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_INT;
- }
- }
-
- private static final class LongValue extends PropertyValue
- {
- final long val;
-
- public LongValue(final long val)
- {
- this.val = val;
- }
-
- public LongValue(final HornetQBuffer buffer)
- {
- val = buffer.readLong();
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.LONG);
- buffer.writeLong(val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_LONG;
- }
- }
-
- private static final class FloatValue extends PropertyValue
- {
- final float val;
-
- public FloatValue(final float val)
- {
- this.val = val;
- }
-
- public FloatValue(final HornetQBuffer buffer)
- {
- val = Float.intBitsToFloat(buffer.readInt());
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.FLOAT);
- buffer.writeInt(Float.floatToIntBits(val));
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_FLOAT;
- }
-
- }
-
- private static final class DoubleValue extends PropertyValue
- {
- final double val;
-
- public DoubleValue(final double val)
- {
- this.val = val;
- }
-
- public DoubleValue(final HornetQBuffer buffer)
- {
- val = Double.longBitsToDouble(buffer.readLong());
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.DOUBLE);
- buffer.writeLong(Double.doubleToLongBits(val));
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_DOUBLE;
- }
- }
-
- private static final class CharValue extends PropertyValue
- {
- final char val;
-
- public CharValue(final char val)
- {
- this.val = val;
- }
-
- public CharValue(final HornetQBuffer buffer)
- {
- val = (char)buffer.readShort();
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.CHAR);
- buffer.writeShort((short)val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + DataConstants.SIZE_CHAR;
- }
- }
-
- private static final class StringValue extends PropertyValue
- {
- final SimpleString val;
-
- public StringValue(final SimpleString val)
- {
- this.val = val;
- }
-
- public StringValue(final HornetQBuffer buffer)
- {
- val = buffer.readSimpleString();
- }
-
- @Override
- public Object getValue()
- {
- return val;
- }
-
- @Override
- public void write(final HornetQBuffer buffer)
- {
- buffer.writeByte(DataConstants.STRING);
- buffer.writeSimpleString(val);
- }
-
- @Override
- public int encodeSize()
- {
- return DataConstants.SIZE_BYTE + SimpleString.sizeofString(val);
- }
- }
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/UUID.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/UUID.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/UUID.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,236 +0,0 @@
-/* JUG Java Uuid Generator
- *
- * Copyright (c) 2002- Tatu Saloranta, tatu.saloranta(a)iki.fi
- *
- * Licensed under the License specified in the file licenses/LICENSE.txt which is
- * included with the source code.
- * You may not use this file except in compliance with the License.
- *
- * 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.hornetq.utils;
-
-/**
- * UUID represents Universally Unique Identifiers (aka Global UID in Windows
- * world). UUIDs are usually generated via UUIDGenerator (or in case of 'Null
- * UUID', 16 zero bytes, via static method getNullUUID()), or received from
- * external systems.
- *
- * By default class caches the string presentations of UUIDs so that description
- * is only created the first time it's needed. For memory stingy applications
- * this caching can be turned off (note though that if uuid.toString() is never
- * called, desc is never calculated so only loss is the space allocated for the
- * desc pointer... which can of course be commented out to save memory).
- *
- * Similarly, hash code is calculated when it's needed for the first time, and
- * from thereon that value is just returned. This means that using UUIDs as keys
- * should be reasonably efficient.
- *
- * UUIDs can be compared for equality, serialized, cloned and even sorted.
- * Equality is a simple bit-wise comparison. Ordering (for sorting) is done by
- * first ordering based on type (in the order of numeric values of types),
- * secondarily by time stamp (only for time-based time stamps), and finally by
- * straight numeric byte-by-byte comparison (from most to least significant
- * bytes).
- */
-
-public final class UUID
-{
- private final static String kHexChars = "0123456789abcdefABCDEF";
-
- public final static byte INDEX_CLOCK_HI = 6;
-
- public final static byte INDEX_CLOCK_MID = 4;
-
- public final static byte INDEX_CLOCK_LO = 0;
-
- public final static byte INDEX_TYPE = 6;
-
- // Clock seq. & variant are multiplexed...
- public final static byte INDEX_CLOCK_SEQUENCE = 8;
-
- public final static byte INDEX_VARIATION = 8;
-
- public final static byte TYPE_NULL = 0;
-
- public final static byte TYPE_TIME_BASED = 1;
-
- public final static byte TYPE_DCE = 2; // Not used
-
- public final static byte TYPE_NAME_BASED = 3;
-
- public final static byte TYPE_RANDOM_BASED = 4;
-
- /*
- * 'Standard' namespaces defined (suggested) by UUID specs:
- */
- public final static String NAMESPACE_DNS = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
-
- public final static String NAMESPACE_URL = "6ba7b811-9dad-11d1-80b4-00c04fd430c8";
-
- public final static String NAMESPACE_OID = "6ba7b812-9dad-11d1-80b4-00c04fd430c8";
-
- public final static String NAMESPACE_X500 = "6ba7b814-9dad-11d1-80b4-00c04fd430c8";
-
- /*
- * By default let's cache desc, can be turned off. For hash code there's no
- * point in turning it off (since the int is already part of the instance
- * memory allocation); if you want to save those 4 bytes (or possibly bit
- * more if alignment is bad) just comment out hash caching.
- */
- private static boolean sDescCaching = true;
-
- private final byte[] mId;
-
- // Both string presentation and hash value may be cached...
- private transient String mDesc = null;
-
- private transient int mHashCode = 0;
-
- /**
- *
- *
- * @param type
- * UUID type
- * @param data
- * 16 byte UUID contents
- */
- public UUID(final int type, final byte[] data)
- {
- mId = data;
- // Type is multiplexed with time_hi:
- mId[UUID.INDEX_TYPE] &= (byte)0x0F;
- mId[UUID.INDEX_TYPE] |= (byte)(type << 4);
- // Variant masks first two bits of the clock_seq_hi:
- mId[UUID.INDEX_VARIATION] &= (byte)0x3F;
- mId[UUID.INDEX_VARIATION] |= (byte)0x80;
- }
-
- public final byte[] asBytes()
- {
- return mId;
- }
-
- /**
- * Could use just the default hash code, but we can probably create a better
- * identity hash (ie. same contents generate same hash) manually, without
- * sacrificing speed too much. Although multiplications with modulos would
- * generate better hashing, let's use just shifts, and do 2 bytes at a time.
- * <p>
- * Of course, assuming UUIDs are randomized enough, even simpler approach
- * might be good enough?
- * <p>
- * Is this a good hash? ... one of these days I better read more about basic
- * hashing techniques I swear!
- */
- private final static int[] kShifts = { 3, 7, 17, 21, 29, 4, 9 };
-
- @Override
- public final int hashCode()
- {
- if (mHashCode == 0)
- {
- // Let's handle first and last byte separately:
- int result = mId[0] & 0xFF;
-
- result |= result << 16;
- result |= result << 8;
-
- for (int i = 1; i < 15; i += 2)
- {
- int curr = (mId[i] & 0xFF) << 8 | mId[i + 1] & 0xFF;
- int shift = UUID.kShifts[i >> 1];
-
- if (shift > 16)
- {
- result ^= curr << shift | curr >>> 32 - shift;
- }
- else
- {
- result ^= curr << shift;
- }
- }
-
- // and then the last byte:
- int last = mId[15] & 0xFF;
- result ^= last << 3;
- result ^= last << 13;
-
- result ^= last << 27;
- // Let's not accept hash 0 as it indicates 'not hashed yet':
- if (result == 0)
- {
- mHashCode = -1;
- }
- else
- {
- mHashCode = result;
- }
- }
- return mHashCode;
- }
-
- @Override
- public final String toString()
- {
- /*
- * Could be synchronized, but there isn't much harm in just taking our
- * chances (ie. in the worst case we'll form the string more than once...
- * but result is the same)
- */
-
- if (mDesc == null)
- {
- StringBuffer b = new StringBuffer(36);
-
- for (int i = 0; i < 16; ++i)
- {
- // Need to bypass hyphens:
- switch (i)
- {
- case 4:
- case 6:
- case 8:
- case 10:
- b.append('-');
- }
- int hex = mId[i] & 0xFF;
- b.append(UUID.kHexChars.charAt(hex >> 4));
- b.append(UUID.kHexChars.charAt(hex & 0x0f));
- }
- if (!UUID.sDescCaching)
- {
- return b.toString();
- }
- mDesc = b.toString();
- }
- return mDesc;
- }
-
- /**
- * Checking equality of UUIDs is easy; just compare the 128-bit number.
- */
- @Override
- public final boolean equals(final Object o)
- {
- if (!(o instanceof UUID))
- {
- return false;
- }
- byte[] otherId = ((UUID)o).mId;
- byte[] thisId = mId;
- for (int i = 0; i < 16; ++i)
- {
- if (otherId[i] != thisId[i])
- {
- return false;
- }
- }
- return true;
- }
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDGenerator.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDGenerator.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDGenerator.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,293 +0,0 @@
-/* JUG Java Uuid Generator
- *
- * Copyright (c) 2002- Tatu Saloranta, tatu.saloranta(a)iki.fi
- *
- * Licensed under the License specified in the file licenses/LICENSE.txt which is
- * included with the source code.
- * You may not use this file except in compliance with the License.
- *
- * 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.hornetq.utils;
-
-import java.lang.reflect.Method;
-import java.net.NetworkInterface;
-import java.security.SecureRandom;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Random;
-
-import org.hornetq.api.core.SimpleString;
-import org.hornetq.core.logging.Logger;
-
-public final class UUIDGenerator
-{
- private final static UUIDGenerator sSingleton = new UUIDGenerator();
-
- private static final Logger log = Logger.getLogger(UUIDGenerator.class);
-
- // Windows has some fake adapters that will return the same HARDWARE ADDRESS on any computer. We need to ignore those
- private static final byte[][] BLACK_LIST = new byte[][] { { 2, 0, 84, 85, 78, 1 } };
-
- /**
- * Random-generator, used by various UUID-generation methods:
- */
- private Random mRnd = null;
-
- private final Object mTimerLock = new Object();
-
- private UUIDTimer mTimer = null;
-
- private byte[] address;
-
- /**
- * Constructor is private to enforce singleton access.
- */
- private UUIDGenerator()
- {
- }
-
- /**
- * Method used for accessing the singleton generator instance.
- */
- public static UUIDGenerator getInstance()
- {
- return UUIDGenerator.sSingleton;
- }
-
- /*
- * ///////////////////////////////////////////////////// // Configuration
- * /////////////////////////////////////////////////////
- */
-
- /**
- * Method for getting the shared random number generator used for generating
- * the UUIDs. This way the initialization cost is only taken once; access
- * need not be synchronized (or in cases where it has to, SecureRandom takes
- * care of it); it might even be good for getting really 'random' stuff to
- * get shared access...
- */
- public final Random getRandomNumberGenerator()
- {
- /*
- * Could be synchronized, but since side effects are trivial (ie.
- * possibility of generating more than one SecureRandom, of which all but
- * one are dumped) let's not add synchronization overhead:
- */
- if (mRnd == null)
- {
- mRnd = new SecureRandom();
- }
- return mRnd;
- }
-
- public final UUID generateTimeBasedUUID(final byte[] byteAddr)
- {
- byte[] contents = new byte[16];
- int pos = 10;
- for (int i = 0; i < 6; ++i)
- {
- contents[pos + i] = byteAddr[i];
- }
-
- synchronized (mTimerLock)
- {
- if (mTimer == null)
- {
- mTimer = new UUIDTimer(getRandomNumberGenerator());
- }
-
- mTimer.getTimestamp(contents);
- }
-
- return new UUID(UUID.TYPE_TIME_BASED, contents);
- }
-
- public final byte[] generateDummyAddress()
- {
- Random rnd = getRandomNumberGenerator();
- byte[] dummy = new byte[6];
- rnd.nextBytes(dummy);
- /* Need to set the broadcast bit to indicate it's not a real
- * address.
- */
- dummy[0] |= (byte)0x01;
-
- if (UUIDGenerator.log.isDebugEnabled())
- {
- UUIDGenerator.log.debug("using dummy address " + UUIDGenerator.asString(dummy));
- }
- return dummy;
- }
-
- /**
- * If running java 6 or above, returns {@link NetworkInterface#getHardwareAddress()}, else return <code>null</code>.
- * The first hardware address is returned when iterating all the NetworkInterfaces
- */
- public final static byte[] getHardwareAddress()
- {
- Method getHardwareAddressMethod;
- Method isUpMethod;
- Method isLoopbackMethod;
- Method isVirtualMethod;
- try
- {
- getHardwareAddressMethod = NetworkInterface.class.getMethod("getHardwareAddress");
- isUpMethod = NetworkInterface.class.getMethod("isUp");
- isLoopbackMethod = NetworkInterface.class.getMethod("isLoopback");
- isVirtualMethod = NetworkInterface.class.getMethod("isVirtual");
- }
- catch (Throwable t)
- {
- // not on Java 6 or not enough security permission
- return null;
- }
-
- try
- {
- Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
- while (networkInterfaces.hasMoreElements())
- {
- NetworkInterface networkInterface = networkInterfaces.nextElement();
- boolean up = (Boolean)isUpMethod.invoke(networkInterface);
- boolean loopback = (Boolean)isLoopbackMethod.invoke(networkInterface);
- boolean virtual = (Boolean)isVirtualMethod.invoke(networkInterface);
-
- if (loopback || virtual || !up)
- {
- continue;
- }
-
- Object res = getHardwareAddressMethod.invoke(networkInterface);
- if (res != null && res instanceof byte[])
- {
- byte[] address = (byte[])res;
- byte[] paddedAddress = UUIDGenerator.getZeroPaddedSixBytes(address);
-
- if (UUIDGenerator.isBlackList(address))
- {
- continue;
- }
-
- if (paddedAddress != null)
- {
- if (UUIDGenerator.log.isDebugEnabled())
- {
- UUIDGenerator.log.debug("using hardware address " + UUIDGenerator.asString(paddedAddress));
- }
- return paddedAddress;
- }
- }
- }
- }
- catch (Throwable t)
- {
- }
-
- return null;
- }
-
- public final SimpleString generateSimpleStringUUID()
- {
- return new SimpleString(generateStringUUID());
- }
-
- public final UUID generateUUID()
- {
- byte[] address = getAddressBytes();
-
- UUID uid = generateTimeBasedUUID(address);
-
- return uid;
- }
-
- public final String generateStringUUID()
- {
- byte[] address = getAddressBytes();
-
- if (address == null)
- {
- return java.util.UUID.randomUUID().toString();
- }
- else
- {
- return generateTimeBasedUUID(address).toString();
- }
- }
-
- public final static byte[] getZeroPaddedSixBytes(final byte[] bytes)
- {
- if (bytes == null)
- {
- return null;
- }
- if (bytes.length > 0 && bytes.length <= 6)
- {
- if (bytes.length == 6)
- {
- return bytes;
- }
- else
- {
- // pad with zeroes to have a 6-byte array
- byte[] paddedAddress = new byte[6];
- System.arraycopy(bytes, 0, paddedAddress, 0, bytes.length);
- for (int i = bytes.length; i < 6; i++)
- {
- paddedAddress[i] = 0;
- }
- return paddedAddress;
- }
- }
- return null;
- }
-
- // Private -------------------------------------------------------
-
- private static final boolean isBlackList(final byte[] address)
- {
- for (byte[] blackList : UUIDGenerator.BLACK_LIST)
- {
- if (Arrays.equals(address, blackList))
- {
- return true;
- }
- }
- return false;
- }
-
- private final byte[] getAddressBytes()
- {
- if (address == null)
- {
- address = UUIDGenerator.getHardwareAddress();
- if (address == null)
- {
- address = generateDummyAddress();
- }
- }
-
- return address;
- }
-
- private static final String asString(final byte[] bytes)
- {
- if (bytes == null)
- {
- return null;
- }
-
- String s = "";
- for (int i = 0; i < bytes.length - 1; i++)
- {
- s += Integer.toHexString(bytes[i]) + ":";
- }
- s += bytes[bytes.length - 1];
- return s;
- }
-}
\ No newline at end of file
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDTimer.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDTimer.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/UUIDTimer.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -1,326 +0,0 @@
-/* JUG Java Uuid Generator
- *
- * Copyright (c) 2002- Tatu Saloranta, tatu.saloranta(a)iki.fi
- *
- * Licensed under the License specified in the file licenses/LICENSE.txt which is
- * included with the source code.
- * You may not use this file except in compliance with the License.
- *
- * 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.hornetq.utils;
-
-import java.util.Random;
-
-/**
- * UUIDTimer produces the time stamps required for time-based UUIDs. It works as
- * outlined in the UUID specification, with following implementation:
- * <ul>
- * <li>Java classes can only product time stamps with maximum resolution of one
- * millisecond (at least before JDK 1.5). To compensate, an additional counter
- * is used, so that more than one UUID can be generated between java clock
- * updates. Counter may be used to generate up to 10000 UUIDs for each distrinct
- * java clock value.
- * <li>Due to even lower clock resolution on some platforms (older Windows
- * versions use 55 msec resolution), timestamp value can also advanced ahead of
- * physical value within limits (by default, up 100 millisecond ahead of
- * reported), iff necessary (ie. 10000 instances created before clock time
- * advances).
- * <li>As an additional precaution, counter is initialized not to 0 but to a
- * random 8-bit number, and each time clock changes, lowest 8-bits of counter
- * are preserved. The purpose it to make likelyhood of multi-JVM multi-instance
- * generators to collide, without significantly reducing max. UUID generation
- * speed. Note though that using more than one generator (from separate JVMs) is
- * strongly discouraged, so hopefully this enhancement isn't needed. This 8-bit
- * offset has to be reduced from total max. UUID count to preserve ordering
- * property of UUIDs (ie. one can see which UUID was generated first for given
- * UUID generator); the resulting 9500 UUIDs isn't much different from the
- * optimal choice.
- * <li>Finally, as of version 2.0 and onwards, optional external timestamp
- * synchronization can be done. This is done similar to the way UUID
- * specification suggests; except that since there is no way to lock the whole
- * system, file-based locking is used. This works between multiple JVMs and Jug
- * instances.
- * </ul>
- * <p>
- * Some additional assumptions about calculating the timestamp:
- * <ul>
- * <li>System.currentTimeMillis() is assumed to give time offset in UTC, or at
- * least close enough thing to get correct timestamps. The alternate route would
- * have to go through calendar object, use TimeZone offset to get to UTC, and
- * then modify. Using currentTimeMillis should be much faster to allow rapid
- * UUID creation.
- * <li>Similarly, the constant used for time offset between 1.1.1970 and start
- * of Gregorian calendar is assumed to be correct (which seems to be the case
- * when testing with Java calendars).
- * </ul>
- * <p>
- * Note about synchronization: this class is assumed to always be called from a
- * synchronized context (caller locks on either this object, or a similar timer
- * lock), and so has no method synchronization.
- */
-public class UUIDTimer
-{
- // // // Constants
-
- /**
- * Since System.longTimeMillis() returns time from january 1st 1970, and
- * UUIDs need time from the beginning of gregorian calendar (15-oct-1582),
- * need to apply the offset:
- */
- private final static long kClockOffset = 0x01b21dd213814000L;
-
- /**
- * Also, instead of getting time in units of 100nsecs, we get something with
- * max resolution of 1 msec... and need the multiplier as well
- */
- private final static long kClockMultiplier = 10000;
-
- private final static long kClockMultiplierL = 10000L;
-
- /**
- * Let's allow "virtual" system time to advance at most 100 milliseconds
- * beyond actual physical system time, before adding delays.
- */
- private final static long kMaxClockAdvance = 100L;
-
- // // // Configuration
-
- private final Random mRnd;
-
- // // // Clock state:
-
- /**
- * Additional state information used to protect against anomalous cases
- * (clock time going backwards, node id getting mixed up). Third byte is
- * actually used for seeding counter on counter overflow.
- */
- private final byte[] mClockSequence = new byte[3];
-
- /**
- * Last physical timestamp value <code>System.currentTimeMillis()</code>
- * returned: used to catch (and report) cases where system clock goes
- * backwards. Is also used to limit "drifting", that is, amount timestamps
- * used can differ from the system time value. This value is not guaranteed
- * to be monotonically increasing.
- */
- private long mLastSystemTimestamp = 0L;
-
- /**
- * Timestamp value last used for generating a UUID (along with
- * {@link #mClockCounter}. Usually the same as {@link #mLastSystemTimestamp},
- * but not always (system clock moved backwards). Note that this value is
- * guaranteed to be monotonically increasing; that is, at given absolute time
- * points t1 and t2 (where t2 is after t1), t1 <= t2 will always hold true.
- */
- private long mLastUsedTimestamp = 0L;
-
- /**
- * Counter used to compensate inadequate resolution of JDK system timer.
- */
- private int mClockCounter = 0;
-
- UUIDTimer(final Random rnd)
- {
- mRnd = rnd;
- initCounters(rnd);
- mLastSystemTimestamp = 0L;
- // This may get overwritten by the synchronizer
- mLastUsedTimestamp = 0L;
- }
-
- private void initCounters(final Random rnd)
- {
- /*
- * Let's generate the clock sequence field now; as with counter, this
- * reduces likelihood of collisions (as explained in UUID specs)
- */
- rnd.nextBytes(mClockSequence);
- /*
- * Ok, let's also initialize the counter... Counter is used to make it
- * slightly less likely that two instances of UUIDGenerator (from separate
- * JVMs as no more than one can be created in one JVM) would produce
- * colliding time-based UUIDs. The practice of using multiple generators,
- * is strongly discouraged, of course, but just in case...
- */
- mClockCounter = mClockSequence[2] & 0xFF;
- }
-
- public void getTimestamp(final byte[] uuidData)
- {
- // First the clock sequence:
- uuidData[UUID.INDEX_CLOCK_SEQUENCE] = mClockSequence[0];
- uuidData[UUID.INDEX_CLOCK_SEQUENCE + 1] = mClockSequence[1];
-
- long systime = System.currentTimeMillis();
-
- /*
- * Let's first verify that the system time is not going backwards;
- * independent of whether we can use it:
- */
- if (systime < mLastSystemTimestamp)
- {
- // Logger.logWarning("System time going backwards! (got value
- // "+systime+", last "+mLastSystemTimestamp);
- // Let's write it down, still
- mLastSystemTimestamp = systime;
- }
-
- /*
- * But even without it going backwards, it may be less than the last one
- * used (when generating UUIDs fast with coarse clock resolution; or if
- * clock has gone backwards over reboot etc).
- */
- if (systime <= mLastUsedTimestamp)
- {
- /*
- * Can we just use the last time stamp (ok if the counter hasn't hit
- * max yet)
- */
- if (mClockCounter < UUIDTimer.kClockMultiplier)
- { // yup, still have room
- systime = mLastUsedTimestamp;
- }
- else
- { // nope, have to roll over to next value and maybe wait
- long actDiff = mLastUsedTimestamp - systime;
- long origTime = systime;
- systime = mLastUsedTimestamp + 1L;
-
- // Logger.logWarning("Timestamp over-run: need to reinitialize
- // random sequence");
-
- /*
- * Clock counter is now at exactly the multiplier; no use just
- * anding its value. So, we better get some random numbers
- * instead...
- */
- initCounters(mRnd);
-
- /*
- * But do we also need to slow down? (to try to keep virtual time
- * close to physical time; ie. either catch up when system clock has
- * been moved backwards, or when coarse clock resolution has forced
- * us to advance virtual timer too far)
- */
- if (actDiff >= UUIDTimer.kMaxClockAdvance)
- {
- UUIDTimer.slowDown(origTime, actDiff);
- }
- }
- }
- else
- {
- /*
- * Clock has advanced normally; just need to make sure counter is reset
- * to a low value (need not be 0; good to leave a small residual to
- * further decrease collisions)
- */
- mClockCounter &= 0xFF;
- }
-
- mLastUsedTimestamp = systime;
-
- /*
- * Now, let's translate the timestamp to one UUID needs, 100ns unit offset
- * from the beginning of Gregorian calendar...
- */
- systime *= UUIDTimer.kClockMultiplierL;
- systime += UUIDTimer.kClockOffset;
-
- // Plus add the clock counter:
- systime += mClockCounter;
- // and then increase
- ++mClockCounter;
-
- /*
- * Time fields are nicely split across the UUID, so can't just linearly
- * dump the stamp:
- */
- int clockHi = (int)(systime >>> 32);
- int clockLo = (int)systime;
-
- uuidData[UUID.INDEX_CLOCK_HI] = (byte)(clockHi >>> 24);
- uuidData[UUID.INDEX_CLOCK_HI + 1] = (byte)(clockHi >>> 16);
- uuidData[UUID.INDEX_CLOCK_MID] = (byte)(clockHi >>> 8);
- uuidData[UUID.INDEX_CLOCK_MID + 1] = (byte)clockHi;
-
- uuidData[UUID.INDEX_CLOCK_LO] = (byte)(clockLo >>> 24);
- uuidData[UUID.INDEX_CLOCK_LO + 1] = (byte)(clockLo >>> 16);
- uuidData[UUID.INDEX_CLOCK_LO + 2] = (byte)(clockLo >>> 8);
- uuidData[UUID.INDEX_CLOCK_LO + 3] = (byte)clockLo;
- }
-
- /*
- * /////////////////////////////////////////////////////////// // Private
- * methods ///////////////////////////////////////////////////////////
- */
-
- private final static int MAX_WAIT_COUNT = 50;
-
- /**
- * Simple utility method to use to wait for couple of milliseconds, to let
- * system clock hopefully advance closer to the virtual timestamps used.
- * Delay is kept to just a millisecond or two, to prevent excessive blocking;
- * but that should be enough to eventually synchronize physical clock with
- * virtual clock values used for UUIDs.
- *
- * @param msecs
- * Number of milliseconds to wait for from current time point
- */
- private final static void slowDown(final long startTime, final long actDiff)
- {
- /*
- * First, let's determine how long we'd like to wait. This is based on how
- * far ahead are we as of now.
- */
- long ratio = actDiff / UUIDTimer.kMaxClockAdvance;
- long delay;
-
- if (ratio < 2L)
- { // 200 msecs or less
- delay = 1L;
- }
- else if (ratio < 10L)
- { // 1 second or less
- delay = 2L;
- }
- else if (ratio < 600L)
- { // 1 minute or less
- delay = 3L;
- }
- else
- {
- delay = 5L;
- }
- // Logger.logWarning("Need to wait for "+delay+" milliseconds; virtual
- // clock advanced too far in the future");
- long waitUntil = startTime + delay;
- int counter = 0;
- do
- {
- try
- {
- Thread.sleep(delay);
- }
- catch (InterruptedException ie)
- {
- }
- delay = 1L;
- /*
- * This is just a sanity check: don't want an "infinite" loop if clock
- * happened to be moved backwards by, say, an hour...
- */
- if (++counter > UUIDTimer.MAX_WAIT_COUNT)
- {
- break;
- }
- }
- while (System.currentTimeMillis() < waitUntil);
- }
-}
Added: trunk/hornetq-journal/pom.xml
===================================================================
--- trunk/hornetq-journal/pom.xml (rev 0)
+++ trunk/hornetq-journal/pom.xml 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,65 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.hornetq</groupId>
+ <artifactId>hornetq-pom</artifactId>
+ <version>2.2.3-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>hornetq-journal</artifactId>
+ <packaging>jar</packaging>
+ <name>HornetQ Journal</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.jboss.netty</groupId>
+ <artifactId>netty</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hornetq</groupId>
+ <artifactId>hornetq-commons</artifactId>
+ <version>${project.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+ <profiles>
+ <profile>
+ <id>release</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.8</version>
+ <configuration>
+ <doclet>org.jboss.apiviz.APIviz</doclet>
+ <docletArtifact>
+ <groupId>org.jboss.apiviz</groupId>
+ <artifactId>apiviz</artifactId>
+ <version>1.3.1.GA</version>
+ </docletArtifact>
+ <useStandardDocletOptions>true</useStandardDocletOptions>
+ <minmemory>128m</minmemory>
+ <maxmemory>512m</maxmemory>
+ <quiet>false</quiet>
+ <aggregate>true</aggregate>
+ <excludePackageNames>org.hornetq.core:org.hornetq.utils</excludePackageNames>
+ </configuration>
+ <executions>
+ <execution>
+ <id>javadocs</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
Modified: trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AIOSequentialFileFactory.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -14,8 +14,6 @@
package org.hornetq.core.journal.impl;
import java.nio.ByteBuffer;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -23,16 +21,14 @@
import org.hornetq.core.asyncio.BufferCallback;
import org.hornetq.core.asyncio.impl.AsynchronousFileImpl;
-import org.hornetq.core.client.impl.ClientSessionFactoryImpl;
-import org.hornetq.core.config.impl.ConfigurationImpl;
import org.hornetq.core.journal.SequentialFile;
import org.hornetq.core.logging.Logger;
import org.hornetq.utils.HornetQThreadFactory;
/**
- *
+ *
* A AIOSequentialFileFactory
- *
+ *
* @author clebert.suconic(a)jboss.com
*
*/
@@ -58,8 +54,8 @@
public AIOSequentialFileFactory(final String journalDir)
{
this(journalDir,
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO,
false);
}
@@ -147,7 +143,7 @@
pollerExecutor = Executors.newCachedThreadPool(new HornetQThreadFactory("HornetQ-AIO-poller-pool" + System.identityHashCode(this),
true,
- AIOSequentialFileFactory.getThisClassLoader()));
+ AbstractSequentialFileFactory.getThisClassLoader()));
}
@@ -296,17 +292,4 @@
}
}
}
-
- private static ClassLoader getThisClassLoader()
- {
- return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
- {
- public ClassLoader run()
- {
- return ClientSessionFactoryImpl.class.getClassLoader();
- }
- });
-
- }
-
}
Modified: trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AbstractSequentialFileFactory.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/journal/impl/AbstractSequentialFileFactory.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/AbstractSequentialFileFactory.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -25,16 +25,15 @@
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
-import org.hornetq.core.client.impl.ClientSessionFactoryImpl;
import org.hornetq.core.journal.SequentialFile;
import org.hornetq.core.journal.SequentialFileFactory;
import org.hornetq.core.logging.Logger;
import org.hornetq.utils.HornetQThreadFactory;
/**
- *
+ *
* An abstract SequentialFileFactory containing basic functionality for both AIO and NIO SequentialFactories
- *
+ *
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
* @author <a href="mailto:clebert.suconic@jboss.com">Clebert Suconic</a>
*
@@ -55,7 +54,7 @@
protected final long bufferTimeout;
- /**
+ /**
* Asynchronous writes need to be done at another executor.
* This needs to be done at NIO, or else we would have the callers thread blocking for the return.
* At AIO this is necessary as context switches on writes would fire flushes at the kernel.
@@ -156,7 +155,7 @@
{
}
- /**
+ /**
* Create the directory if it doesn't exist yet
*/
public void createDirs() throws Exception
@@ -191,13 +190,13 @@
return Arrays.asList(fileNames);
}
- private static ClassLoader getThisClassLoader()
+ protected static ClassLoader getThisClassLoader()
{
return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
{
public ClassLoader run()
{
- return ClientSessionFactoryImpl.class.getClassLoader();
+ return AbstractSequentialFileFactory.class.getClassLoader(); // XXX FIXME!
}
});
Added: trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/JournalConstants.java
===================================================================
--- trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/JournalConstants.java (rev 0)
+++ trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/JournalConstants.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -0,0 +1,11 @@
+package org.hornetq.core.journal.impl;
+
+public final class JournalConstants
+{
+
+ public static final int DEFAULT_JOURNAL_BUFFER_SIZE_AIO = 490 * 1024;
+ public static final int DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO = (int)(1000000000d / 2000);
+ public static final int DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO = (int)(1000000000d / 300);
+ public static final int DEFAULT_JOURNAL_BUFFER_SIZE_NIO = 490 * 1024;
+
+}
Modified: trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/NIOSequentialFileFactory.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/journal/impl/NIOSequentialFileFactory.java 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/hornetq-journal/src/main/java/org/hornetq/core/journal/impl/NIOSequentialFileFactory.java 2011-05-26 15:06:40 UTC (rev 10740)
@@ -15,15 +15,14 @@
import java.nio.ByteBuffer;
-import org.hornetq.core.config.impl.ConfigurationImpl;
import org.hornetq.core.journal.SequentialFile;
import org.hornetq.core.journal.SequentialFileFactory;
import org.hornetq.core.logging.Logger;
/**
- *
+ *
* A NIOSequentialFileFactory
- *
+ *
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
* @author <a href="mailto:clebert.suconic@jboss.com">Clebert Suconic</a>
*
@@ -36,8 +35,8 @@
{
this(journalDir,
false,
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
false);
}
@@ -45,8 +44,8 @@
{
this(journalDir,
buffered,
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
- ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
+ JournalConstants.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
false);
}
Modified: trunk/pom.xml
===================================================================
--- trunk/pom.xml 2011-05-26 12:50:50 UTC (rev 10739)
+++ trunk/pom.xml 2011-05-26 15:06:40 UTC (rev 10740)
@@ -120,18 +120,19 @@
</contributors>
<modules>
+ <module>hornetq-bootstrap</module>
+ <module>hornetq-commons</module>
+ <module>hornetq-core-client</module>
<module>hornetq-core</module>
- <module>hornetq-core-client</module>
+ <module>hornetq-jboss-as-integration</module>
+ <module>hornetq-jms-client</module>
<module>hornetq-jms</module>
- <module>hornetq-jms-client</module>
+ <module>hornetq-journal</module>
<module>hornetq-ra</module>
- <module>hornetq-commons</module>
- <module>hornetq-bootstrap</module>
- <module>hornetq-jboss-as-integration</module>
+ <module>hornetq-rest</module>
+ <module>hornetq-service-sar</module>
+ <module>hornetq-spring-integration</module>
<module>hornetq-twitter-integration</module>
- <module>hornetq-spring-integration</module>
- <module>hornetq-service-sar</module>
- <module>hornetq-rest</module>
</modules>
<dependencyManagement>
13 years, 7 months
JBoss hornetq SVN: r10739 - in trunk: hornetq-commons/src/main/java/org/hornetq/api and 10 other directories.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 08:50:50 -0400 (Thu, 26 May 2011)
New Revision: 10739
Added:
trunk/hornetq-commons/src/main/java/org/hornetq/api/
trunk/hornetq-commons/src/main/java/org/hornetq/api/core/
trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffer.java
trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffers.java
trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQException.java
trunk/hornetq-commons/src/main/java/org/hornetq/api/core/Pair.java
trunk/hornetq-commons/src/main/java/org/hornetq/api/core/SimpleString.java
trunk/hornetq-commons/src/main/java/org/hornetq/core/buffers/
trunk/hornetq-commons/src/main/java/org/hornetq/core/buffers/impl/
trunk/hornetq-commons/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java
trunk/hornetq-commons/src/main/java/org/hornetq/core/server/
trunk/hornetq-commons/src/main/java/org/hornetq/core/server/HornetQComponent.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/
trunk/hornetq-commons/src/main/java/org/hornetq/utils/DataConstants.java
trunk/hornetq-commons/src/main/java/org/hornetq/utils/UTF8Util.java
Removed:
trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffer.java
trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffers.java
trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQException.java
trunk/hornetq-core/src/main/java/org/hornetq/api/core/Pair.java
trunk/hornetq-core/src/main/java/org/hornetq/api/core/SimpleString.java
trunk/hornetq-core/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java
trunk/hornetq-core/src/main/java/org/hornetq/core/server/HornetQComponent.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/DataConstants.java
trunk/hornetq-core/src/main/java/org/hornetq/utils/UTF8Util.java
Log:
HORNETQ-698 Move other necessary classes for hq-journal into hq-commons
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffer.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffer.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffer.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffer.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,1086 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.api.core;
+
+import java.nio.ByteBuffer;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ *
+ * A HornetQBuffer wraps a Netty's ChannelBuffer and is used throughout HornetQ code base.
+ *
+ * Much of it derived from Netty ChannelBuffer by Trustin Lee
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ * @see HornetQBuffers
+ *
+ */
+public interface HornetQBuffer
+{
+ /**
+ * Returns the underlying Netty's ChannelBuffer
+ *
+ * @return the underlying Netty's ChannelBuffer
+ */
+ ChannelBuffer channelBuffer();
+
+ /**
+ * Returns the number of bytes this buffer can contain.
+ */
+ int capacity();
+
+ /**
+ * Returns the {@code readerIndex} of this buffer.
+ */
+ int readerIndex();
+
+ /**
+ * Sets the {@code readerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code readerIndex} is
+ * less than {@code 0} or
+ * greater than {@code this.writerIndex}
+ */
+ void readerIndex(int readerIndex);
+
+ /**
+ * Returns the {@code writerIndex} of this buffer.
+ */
+ int writerIndex();
+
+ /**
+ * Sets the {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code writerIndex} is
+ * less than {@code this.readerIndex} or
+ * greater than {@code this.capacity}
+ */
+ void writerIndex(int writerIndex);
+
+ /**
+ * Sets the {@code readerIndex} and {@code writerIndex} of this buffer
+ * in one shot. This method is useful when you have to worry about the
+ * invocation order of {@link #readerIndex(int)} and {@link #writerIndex(int)}
+ * methods. For example, the following code will fail:
+ *
+ * <pre>
+ * // Create a buffer whose readerIndex, writerIndex and capacity are
+ * // 0, 0 and 8 respectively.
+ * ChannelBuffer buf = ChannelBuffers.buffer(8);
+ *
+ * // IndexOutOfBoundsException is thrown because the specified
+ * // readerIndex (2) cannot be greater than the current writerIndex (0).
+ * buf.readerIndex(2);
+ * buf.writerIndex(4);
+ * </pre>
+ *
+ * The following code will also fail:
+ *
+ * <pre>
+ * // Create a buffer whose readerIndex, writerIndex and capacity are
+ * // 0, 8 and 8 respectively.
+ * ChannelBuffer buf = ChannelBuffers.wrappedBuffer(new byte[8]);
+ *
+ * // readerIndex becomes 8.
+ * buf.readLong();
+ *
+ * // IndexOutOfBoundsException is thrown because the specified
+ * // writerIndex (4) cannot be less than the current readerIndex (8).
+ * buf.writerIndex(4);
+ * buf.readerIndex(2);
+ * </pre>
+ *
+ * By contrast, {@link #setIndex(int, int)} guarantees that it never
+ * throws an {@link IndexOutOfBoundsException} as long as the specified
+ * indexes meet basic constraints, regardless what the current index
+ * values of the buffer are:
+ *
+ * <pre>
+ * // No matter what the current state of the buffer is, the following
+ * // call always succeeds as long as the capacity of the buffer is not
+ * // less than 4.
+ * buf.setIndex(2, 4);
+ * </pre>
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code readerIndex} is less than 0,
+ * if the specified {@code writerIndex} is less than the specified
+ * {@code readerIndex} or if the specified {@code writerIndex} is
+ * greater than {@code this.capacity}
+ */
+ void setIndex(int readerIndex, int writerIndex);
+
+ /**
+ * Returns the number of readable bytes which is equal to
+ * {@code (this.writerIndex - this.readerIndex)}.
+ */
+ int readableBytes();
+
+ /**
+ * Returns the number of writable bytes which is equal to
+ * {@code (this.capacity - this.writerIndex)}.
+ */
+ int writableBytes();
+
+ /**
+ * Returns {@code true}
+ * if and only if {@code (this.writerIndex - this.readerIndex)} is greater
+ * than {@code 0}.
+ */
+ boolean readable();
+
+ /**
+ * Returns {@code true}
+ * if and only if {@code (this.capacity - this.writerIndex)} is greater
+ * than {@code 0}.
+ */
+ boolean writable();
+
+ /**
+ * Sets the {@code readerIndex} and {@code writerIndex} of this buffer to
+ * {@code 0}.
+ * This method is identical to {@link #setIndex(int, int) setIndex(0, 0)}.
+ * <p>
+ * Please note that the behavior of this method is different
+ * from that of NIO buffer, which sets the {@code limit} to
+ * the {@code capacity} of the buffer.
+ */
+ void clear();
+
+ /**
+ * Marks the current {@code readerIndex} in this buffer. You can
+ * reposition the current {@code readerIndex} to the marked
+ * {@code readerIndex} by calling {@link #resetReaderIndex()}.
+ * The initial value of the marked {@code readerIndex} is {@code 0}.
+ */
+ void markReaderIndex();
+
+ /**
+ * Repositions the current {@code readerIndex} to the marked
+ * {@code readerIndex} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the current {@code writerIndex} is less than the marked
+ * {@code readerIndex}
+ */
+ void resetReaderIndex();
+
+ /**
+ * Marks the current {@code writerIndex} in this buffer. You can
+ * reposition the current {@code writerIndex} to the marked
+ * {@code writerIndex} by calling {@link #resetWriterIndex()}.
+ * The initial value of the marked {@code writerIndex} is {@code 0}.
+ */
+ void markWriterIndex();
+
+ /**
+ * Repositions the current {@code writerIndex} to the marked
+ * {@code writerIndex} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the current {@code readerIndex} is greater than the marked
+ * {@code writerIndex}
+ */
+ void resetWriterIndex();
+
+ /**
+ * Discards the bytes between the 0th index and {@code readerIndex}.
+ * It moves the bytes between {@code readerIndex} and {@code writerIndex}
+ * to the 0th index, and sets {@code readerIndex} and {@code writerIndex}
+ * to {@code 0} and {@code oldWriterIndex - oldReaderIndex} respectively.
+ * <p>
+ * Please refer to the class documentation for more detailed explanation.
+ */
+ void discardReadBytes();
+
+ /**
+ * Gets a byte at the specified absolute {@code index} in this buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 1} is greater than {@code this.capacity}
+ */
+ byte getByte(int index);
+
+ /**
+ * Gets an unsigned byte at the specified absolute {@code index} in this
+ * buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 1} is greater than {@code this.capacity}
+ */
+ short getUnsignedByte(int index);
+
+ /**
+ * Gets a 16-bit short integer at the specified absolute {@code index} in
+ * this buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 2} is greater than {@code this.capacity}
+ */
+ short getShort(int index);
+
+ /**
+ * Gets an unsigned 16-bit short integer at the specified absolute
+ * {@code index} in this buffer. This method does not modify
+ * {@code readerIndex} or {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 2} is greater than {@code this.capacity}
+ */
+ int getUnsignedShort(int index);
+
+ /**
+ * Gets a 32-bit integer at the specified absolute {@code index} in
+ * this buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 4} is greater than {@code this.capacity}
+ */
+ int getInt(int index);
+
+ /**
+ * Gets an unsigned 32-bit integer at the specified absolute {@code index}
+ * in this buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 4} is greater than {@code this.capacity}
+ */
+ long getUnsignedInt(int index);
+
+ /**
+ * Gets a 64-bit long integer at the specified absolute {@code index} in
+ * this buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 8} is greater than {@code this.capacity}
+ */
+ long getLong(int index);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the specified absolute {@code index} until the destination becomes
+ * non-writable. This method is basically same with
+ * {@link #getBytes(int, HornetQBuffer, int, int)}, except that this
+ * method increases the {@code writerIndex} of the destination by the
+ * number of the transferred bytes while
+ * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * the source buffer (i.e. {@code this}).
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * if {@code index + dst.writableBytes} is greater than
+ * {@code this.capacity}
+ */
+ void getBytes(int index, HornetQBuffer dst);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the specified absolute {@code index}. This method is basically same
+ * with {@link #getBytes(int, HornetQBuffer, int, int)}, except that this
+ * method increases the {@code writerIndex} of the destination by the
+ * number of the transferred bytes while
+ * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * the source buffer (i.e. {@code this}).
+ *
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0},
+ * if {@code index + length} is greater than
+ * {@code this.capacity}, or
+ * if {@code length} is greater than {@code dst.writableBytes}
+ */
+ void getBytes(int index, HornetQBuffer dst, int length);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the specified absolute {@code index}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex}
+ * of both the source (i.e. {@code this}) and the destination.
+ *
+ * @param dstIndex the first index of the destination
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0},
+ * if the specified {@code dstIndex} is less than {@code 0},
+ * if {@code index + length} is greater than
+ * {@code this.capacity}, or
+ * if {@code dstIndex + length} is greater than
+ * {@code dst.capacity}
+ */
+ void getBytes(int index, HornetQBuffer dst, int dstIndex, int length);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the specified absolute {@code index}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * if {@code index + dst.length} is greater than
+ * {@code this.capacity}
+ */
+ void getBytes(int index, byte[] dst);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the specified absolute {@code index}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex}
+ * of this buffer.
+ *
+ * @param dstIndex the first index of the destination
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0},
+ * if the specified {@code dstIndex} is less than {@code 0},
+ * if {@code index + length} is greater than
+ * {@code this.capacity}, or
+ * if {@code dstIndex + length} is greater than
+ * {@code dst.length}
+ */
+ void getBytes(int index, byte[] dst, int dstIndex, int length);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the specified absolute {@code index} until the destination's position
+ * reaches its limit.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer while the destination's {@code position} will be increased.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * if {@code index + dst.remaining()} is greater than
+ * {@code this.capacity}
+ */
+ void getBytes(int index, ByteBuffer dst);
+
+ /**
+ * Gets a char at the specified absolute {@code index} in
+ * this buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 2} is greater than {@code this.capacity}
+ */
+ char getChar(int index);
+
+ /**
+ * Gets a float at the specified absolute {@code index} in
+ * this buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 4} is greater than {@code this.capacity}
+ */
+ float getFloat(int index);
+
+ /**
+ * Gets a double at the specified absolute {@code index} in
+ * this buffer. This method does not modify {@code readerIndex} or
+ * {@code writerIndex} of this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 8} is greater than {@code this.capacity}
+ */
+ double getDouble(int index);
+
+ /**
+ * Sets the specified byte at the specified absolute {@code index} in this
+ * buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 1} is greater than {@code this.capacity}
+ */
+ void setByte(int index, byte value);
+
+ /**
+ * Sets the specified 16-bit short integer at the specified absolute
+ * {@code index} in this buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 2} is greater than {@code this.capacity}
+ */
+ void setShort(int index, short value);
+
+ /**
+ * Sets the specified 32-bit integer at the specified absolute
+ * {@code index} in this buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 4} is greater than {@code this.capacity}
+ */
+ void setInt(int index, int value);
+
+ /**
+ * Sets the specified 64-bit long integer at the specified absolute
+ * {@code index} in this buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 8} is greater than {@code this.capacity}
+ */
+ void setLong(int index, long value);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the specified absolute {@code index} until the destination becomes
+ * unreadable. This method is basically same with
+ * {@link #setBytes(int, HornetQBuffer, int, int)}, except that this
+ * method increases the {@code readerIndex} of the source buffer by
+ * the number of the transferred bytes while
+ * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * the source buffer (i.e. {@code this}).
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * if {@code index + src.readableBytes} is greater than
+ * {@code this.capacity}
+ */
+ void setBytes(int index, HornetQBuffer src);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the specified absolute {@code index}. This method is basically same
+ * with {@link #setBytes(int, HornetQBuffer, int, int)}, except that this
+ * method increases the {@code readerIndex} of the source buffer by
+ * the number of the transferred bytes while
+ * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * the source buffer (i.e. {@code this}).
+ *
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0},
+ * if {@code index + length} is greater than
+ * {@code this.capacity}, or
+ * if {@code length} is greater than {@code src.readableBytes}
+ */
+ void setBytes(int index, HornetQBuffer src, int length);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the specified absolute {@code index}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex}
+ * of both the source (i.e. {@code this}) and the destination.
+ *
+ * @param srcIndex the first index of the source
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0},
+ * if the specified {@code srcIndex} is less than {@code 0},
+ * if {@code index + length} is greater than
+ * {@code this.capacity}, or
+ * if {@code srcIndex + length} is greater than
+ * {@code src.capacity}
+ */
+ void setBytes(int index, HornetQBuffer src, int srcIndex, int length);
+
+ /**
+ * Transfers the specified source array's data to this buffer starting at
+ * the specified absolute {@code index}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * if {@code index + src.length} is greater than
+ * {@code this.capacity}
+ */
+ void setBytes(int index, byte[] src);
+
+ /**
+ * Transfers the specified source array's data to this buffer starting at
+ * the specified absolute {@code index}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0},
+ * if the specified {@code srcIndex} is less than {@code 0},
+ * if {@code index + length} is greater than
+ * {@code this.capacity}, or
+ * if {@code srcIndex + length} is greater than {@code src.length}
+ */
+ void setBytes(int index, byte[] src, int srcIndex, int length);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the specified absolute {@code index} until the source buffer's position
+ * reaches its limit.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * if {@code index + src.remaining()} is greater than
+ * {@code this.capacity}
+ */
+ void setBytes(int index, ByteBuffer src);
+
+ /**
+ * Sets the specified char at the specified absolute
+ * {@code index} in this buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 2} is greater than {@code this.capacity}
+ */
+ void setChar(int index, char value);
+
+ /**
+ * Sets the specified float at the specified absolute
+ * {@code index} in this buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 4} is greater than {@code this.capacity}
+ */
+ void setFloat(int index, float value);
+
+ /**
+ * Sets the specified double at the specified absolute
+ * {@code index} in this buffer.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code index} is less than {@code 0} or
+ * {@code index + 8} is greater than {@code this.capacity}
+ */
+ void setDouble(int index, double value);
+
+ /**
+ * Gets a byte at the current {@code readerIndex} and increases
+ * the {@code readerIndex} by {@code 1} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 1}
+ */
+ byte readByte();
+
+ /**
+ * Gets an unsigned byte at the current {@code readerIndex} and increases
+ * the {@code readerIndex} by {@code 1} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 1}
+ */
+ short readUnsignedByte();
+
+ /**
+ * Gets a 16-bit short integer at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 2} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 2}
+ */
+ short readShort();
+
+ /**
+ * Gets an unsigned 16-bit short integer at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 2} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 2}
+ */
+ int readUnsignedShort();
+
+ /**
+ * Gets a 32-bit integer at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 4} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 4}
+ */
+ int readInt();
+
+ /**
+ * Gets an unsigned 32-bit integer at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 4} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 4}
+ */
+ long readUnsignedInt();
+
+ /**
+ * Gets a 64-bit integer at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 8} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 8}
+ */
+ long readLong();
+
+ /**
+ * Gets a char at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 2} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 2}
+ */
+ char readChar();
+
+ /**
+ * Gets a float at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 4} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 4}
+ */
+ float readFloat();
+
+ /**
+ * Gets a double at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 8} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 8}
+ */
+ double readDouble();
+
+ /**
+ * Gets a boolean at the current {@code readerIndex}
+ * and increases the {@code readerIndex} by {@code 1} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.readableBytes} is less than {@code 1}
+ */
+ boolean readBoolean();
+
+ /**
+ * Gets a SimpleString (potentially {@code null}) at the current {@code readerIndex}
+ */
+ SimpleString readNullableSimpleString();
+
+ /**
+ * Gets a String (potentially {@code null}) at the current {@code readerIndex}
+ */
+ String readNullableString();
+
+ /**
+ * Gets a non-null SimpleString at the current {@code readerIndex}
+ */
+ SimpleString readSimpleString();
+
+ /**
+ * Gets a non-null String at the current {@code readerIndex}
+ */
+ String readString();
+
+ /**
+ * Gets a UTF-8 String at the current {@code readerIndex}
+ */
+ String readUTF();
+
+ /**
+ * Transfers this buffer's data to a newly created buffer starting at
+ * the current {@code readerIndex} and increases the {@code readerIndex}
+ * by the number of the transferred bytes (= {@code length}).
+ * The returned buffer's {@code readerIndex} and {@code writerIndex} are
+ * {@code 0} and {@code length} respectively.
+ *
+ * @param length the number of bytes to transfer
+ *
+ * @return the newly created buffer which contains the transferred bytes
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code length} is greater than {@code this.readableBytes}
+ */
+ HornetQBuffer readBytes(int length);
+
+ /**
+ * Returns a new slice of this buffer's sub-region starting at the current
+ * {@code readerIndex} and increases the {@code readerIndex} by the size
+ * of the new slice (= {@code length}).
+ *
+ * @param length the size of the new slice
+ *
+ * @return the newly created slice
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code length} is greater than {@code this.readableBytes}
+ */
+ HornetQBuffer readSlice(int length);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the current {@code readerIndex} until the destination becomes
+ * non-writable, and increases the {@code readerIndex} by the number of the
+ * transferred bytes. This method is basically same with
+ * {@link #readBytes(HornetQBuffer, int, int)}, except that this method
+ * increases the {@code writerIndex} of the destination by the number of
+ * the transferred bytes while {@link #readBytes(HornetQBuffer, int, int)}
+ * does not.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code dst.writableBytes} is greater than
+ * {@code this.readableBytes}
+ */
+ void readBytes(HornetQBuffer dst);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the current {@code readerIndex} and increases the {@code readerIndex}
+ * by the number of the transferred bytes (= {@code length}). This method
+ * is basically same with {@link #readBytes(HornetQBuffer, int, int)},
+ * except that this method increases the {@code writerIndex} of the
+ * destination by the number of the transferred bytes (= {@code length})
+ * while {@link #readBytes(HornetQBuffer, int, int)} does not.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code length} is greater than {@code this.readableBytes} or
+ * if {@code length} is greater than {@code dst.writableBytes}
+ */
+ void readBytes(HornetQBuffer dst, int length);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the current {@code readerIndex} and increases the {@code readerIndex}
+ * by the number of the transferred bytes (= {@code length}).
+ *
+ * @param dstIndex the first index of the destination
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code dstIndex} is less than {@code 0},
+ * if {@code length} is greater than {@code this.readableBytes}, or
+ * if {@code dstIndex + length} is greater than
+ * {@code dst.capacity}
+ */
+ void readBytes(HornetQBuffer dst, int dstIndex, int length);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the current {@code readerIndex} and increases the {@code readerIndex}
+ * by the number of the transferred bytes (= {@code dst.length}).
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code dst.length} is greater than {@code this.readableBytes}
+ */
+ void readBytes(byte[] dst);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the current {@code readerIndex} and increases the {@code readerIndex}
+ * by the number of the transferred bytes (= {@code length}).
+ *
+ * @param dstIndex the first index of the destination
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code dstIndex} is less than {@code 0},
+ * if {@code length} is greater than {@code this.readableBytes}, or
+ * if {@code dstIndex + length} is greater than {@code dst.length}
+ */
+ void readBytes(byte[] dst, int dstIndex, int length);
+
+ /**
+ * Transfers this buffer's data to the specified destination starting at
+ * the current {@code readerIndex} until the destination's position
+ * reaches its limit, and increases the {@code readerIndex} by the
+ * number of the transferred bytes.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code dst.remaining()} is greater than
+ * {@code this.readableBytes}
+ */
+ void readBytes(ByteBuffer dst);
+
+ /**
+ * Increases the current {@code readerIndex} by the specified
+ * {@code length} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code length} is greater than {@code this.readableBytes}
+ */
+ void skipBytes(int length);
+
+ /**
+ * Sets the specified byte at the current {@code writerIndex}
+ * and increases the {@code writerIndex} by {@code 1} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.writableBytes} is less than {@code 1}
+ */
+ void writeByte(byte value);
+
+ /**
+ * Sets the specified 16-bit short integer at the current
+ * {@code writerIndex} and increases the {@code writerIndex} by {@code 2}
+ * in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.writableBytes} is less than {@code 2}
+ */
+ void writeShort(short value);
+
+ /**
+ * Sets the specified 32-bit integer at the current {@code writerIndex}
+ * and increases the {@code writerIndex} by {@code 4} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.writableBytes} is less than {@code 4}
+ */
+ void writeInt(int value);
+
+ /**
+ * Sets the specified 64-bit long integer at the current
+ * {@code writerIndex} and increases the {@code writerIndex} by {@code 8}
+ * in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.writableBytes} is less than {@code 8}
+ */
+ void writeLong(long value);
+
+ /**
+ * Sets the specified char at the current {@code writerIndex}
+ * and increases the {@code writerIndex} by {@code 2} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.writableBytes} is less than {@code 2}
+ */
+ void writeChar(char chr);
+
+ /**
+ * Sets the specified float at the current {@code writerIndex}
+ * and increases the {@code writerIndex} by {@code 4} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.writableBytes} is less than {@code 4}
+ */
+ void writeFloat(float value);
+
+ /**
+ * Sets the specified double at the current {@code writerIndex}
+ * and increases the {@code writerIndex} by {@code 8} in this buffer.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code this.writableBytes} is less than {@code 8}
+ */
+ void writeDouble(double value);
+
+ /**
+ * Sets the specified boolean at the current {@code writerIndex}
+ */
+ void writeBoolean(boolean val);
+
+ /**
+ * Sets the specified SimpleString (potentially {@code null}) at the current {@code writerIndex}
+ */
+ void writeNullableSimpleString(SimpleString val);
+
+ /**
+ * Sets the specified String (potentially {@code null}) at the current {@code writerIndex}
+ */
+ void writeNullableString(String val);
+
+ /**
+ * Sets the specified non-null SimpleString at the current {@code writerIndex}
+ */
+ void writeSimpleString(SimpleString val);
+
+ /**
+ * Sets the specified non-null String at the current {@code writerIndex}
+ */
+ void writeString(String val);
+
+ /**
+ * Sets the specified UTF-8 String at the current {@code writerIndex}
+ */
+
+ void writeUTF(String utf);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the current {@code writerIndex} and increases the {@code writerIndex}
+ * by the number of the transferred bytes (= {@code length}). This method
+ * is basically same with {@link #writeBytes(HornetQBuffer, int, int)},
+ * except that this method increases the {@code readerIndex} of the source
+ * buffer by the number of the transferred bytes (= {@code length}) while
+ * {@link #writeBytes(HornetQBuffer, int, int)} does not.
+ *
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code length} is greater than {@code this.writableBytes} or
+ * if {@code length} is greater then {@code src.readableBytes}
+ */
+ void writeBytes(HornetQBuffer src, int length);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the current {@code writerIndex} and increases the {@code writerIndex}
+ * by the number of the transferred bytes (= {@code length}).
+ *
+ * @param srcIndex the first index of the source
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code srcIndex} is less than {@code 0},
+ * if {@code srcIndex + length} is greater than
+ * {@code src.capacity}, or
+ * if {@code length} is greater than {@code this.writableBytes}
+ */
+ void writeBytes(HornetQBuffer src, int srcIndex, int length);
+
+ /**
+ * Transfers the specified source array's data to this buffer starting at
+ * the current {@code writerIndex} and increases the {@code writerIndex}
+ * by the number of the transferred bytes (= {@code src.length}).
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code src.length} is greater than {@code this.writableBytes}
+ */
+ void writeBytes(byte[] src);
+
+ /**
+ * Transfers the specified source array's data to this buffer starting at
+ * the current {@code writerIndex} and increases the {@code writerIndex}
+ * by the number of the transferred bytes (= {@code length}).
+ *
+ * @param srcIndex the first index of the source
+ * @param length the number of bytes to transfer
+ *
+ * @throws IndexOutOfBoundsException
+ * if the specified {@code srcIndex} is less than {@code 0},
+ * if {@code srcIndex + length} is greater than
+ * {@code src.length}, or
+ * if {@code length} is greater than {@code this.writableBytes}
+ */
+ void writeBytes(byte[] src, int srcIndex, int length);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the current {@code writerIndex} until the source buffer's position
+ * reaches its limit, and increases the {@code writerIndex} by the
+ * number of the transferred bytes.
+ *
+ * @throws IndexOutOfBoundsException
+ * if {@code src.remaining()} is greater than
+ * {@code this.writableBytes}
+ */
+ void writeBytes(ByteBuffer src);
+
+ /**
+ * Returns a copy of this buffer's readable bytes. Modifying the content
+ * of the returned buffer or this buffer does not affect each other at all.
+ * This method is identical to {@code buf.copy(buf.readerIndex(), buf.readableBytes())}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ *
+ */
+ HornetQBuffer copy();
+
+ /**
+ * Returns a copy of this buffer's sub-region. Modifying the content of
+ * the returned buffer or this buffer does not affect each other at all.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ */
+ HornetQBuffer copy(int index, int length);
+
+ /**
+ * Returns a slice of this buffer's readable bytes. Modifying the content
+ * of the returned buffer or this buffer affects each other's content
+ * while they maintain separate indexes and marks. This method is
+ * identical to {@code buf.slice(buf.readerIndex(), buf.readableBytes())}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ */
+ HornetQBuffer slice();
+
+ /**
+ * Returns a slice of this buffer's sub-region. Modifying the content of
+ * the returned buffer or this buffer affects each other's content while
+ * they maintain separate indexes and marks.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ */
+ HornetQBuffer slice(int index, int length);
+
+ /**
+ * Returns a buffer which shares the whole region of this buffer.
+ * Modifying the content of the returned buffer or this buffer affects
+ * each other's content while they maintain separate indexes and marks.
+ * This method is identical to {@code buf.slice(0, buf.capacity())}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ */
+ HornetQBuffer duplicate();
+
+ /**
+ * Converts this buffer's readable bytes into a NIO buffer. The returned
+ * buffer might or might not share the content with this buffer, while
+ * they have separate indexes and marks. This method is identical to
+ * {@code buf.toByteBuffer(buf.readerIndex(), buf.readableBytes())}.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ */
+ ByteBuffer toByteBuffer();
+
+ /**
+ * Converts this buffer's sub-region into a NIO buffer. The returned
+ * buffer might or might not share the content with this buffer, while
+ * they have separate indexes and marks.
+ * This method does not modify {@code readerIndex} or {@code writerIndex} of
+ * this buffer.
+ */
+ ByteBuffer toByteBuffer(int index, int length);
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffers.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffers.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffers.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQBuffers.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.api.core;
+
+import java.nio.ByteBuffer;
+
+import org.hornetq.core.buffers.impl.ChannelBufferWrapper;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+
+/**
+ * Factory class to create HornetQBuffers
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ */
+public class HornetQBuffers
+{
+ /**
+ * Creates a <em>self-expanding</em> HornetQBuffer with the given initial size
+ *
+ * @param size the initial size of the created HornetQBuffer
+ * @return a self-expanding HornetQBuffer starting with the given size
+ */
+ public static HornetQBuffer dynamicBuffer(final int size)
+ {
+ return new ChannelBufferWrapper(ChannelBuffers.dynamicBuffer(size));
+ }
+
+ /**
+ * Creates a <em>self-expanding</em> HornetQBuffer filled with the given byte array
+ *
+ * @param bytes the created buffer will be initially filled with this byte array
+ * @return a self-expanding HornetQBuffer filled with the given byte array
+ */
+ public static HornetQBuffer dynamicBuffer(final byte[] bytes)
+ {
+ ChannelBuffer buff = ChannelBuffers.dynamicBuffer(bytes.length);
+
+ buff.writeBytes(bytes);
+
+ return new ChannelBufferWrapper(buff);
+ }
+
+ /**
+ * Creates a HornetQBuffer wrapping an underlying NIO ByteBuffer
+ *
+ * The position on this buffer won't affect the position on the inner buffer
+ *
+ * @param underlying the underlying NIO ByteBuffer
+ * @return a HornetQBuffer wrapping the underlying NIO ByteBuffer
+ */
+ public static HornetQBuffer wrappedBuffer(final ByteBuffer underlying)
+ {
+ HornetQBuffer buff = new ChannelBufferWrapper(ChannelBuffers.wrappedBuffer(underlying));
+
+ buff.clear();
+
+ return buff;
+ }
+
+ /**
+ * Creates a HornetQBuffer wrapping an underlying byte array
+ *
+ * @param underlying the underlying byte array
+ * @return a HornetQBuffer wrapping the underlying byte array
+ */
+ public static HornetQBuffer wrappedBuffer(final byte[] underlying)
+ {
+ return new ChannelBufferWrapper(ChannelBuffers.wrappedBuffer(underlying));
+ }
+
+ /**
+ * Creates a <em>fixed</em> HornetQBuffer of the given size
+ *
+ * @param size the size of the created HornetQBuffer
+ * @return a fixed HornetQBuffer with the given size
+ */
+ public static HornetQBuffer fixedBuffer(final int size)
+ {
+ return new ChannelBufferWrapper(ChannelBuffers.buffer(size));
+ }
+
+ private HornetQBuffers()
+ {
+ }
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQException.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQException.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQException.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/api/core/HornetQException.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.api.core;
+
+/**
+ *
+ * HornetQException is the root exception for HornetQ API.
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ */
+public class HornetQException extends Exception
+{
+ private static final long serialVersionUID = -4802014152804997417L;
+
+ // Error codes -------------------------------------------------
+
+ /**
+ * Internal error which prevented HornetQ to perform.
+ */
+ public static final int INTERNAL_ERROR = 000;
+
+ /**
+ * A packet of unsupported type was received by HornetQ PacketHandler.
+ */
+ public static final int UNSUPPORTED_PACKET = 001;
+
+ /**
+ * A client is not able to connect to HornetQ server.
+ */
+ public static final int NOT_CONNECTED = 002;
+
+ /**
+ * A client timed out will connecting to HornetQ server.
+ */
+ public static final int CONNECTION_TIMEDOUT = 003;
+
+ /**
+ * A client was disconnected from HornetQ server when the server has shut down.
+ */
+ public static final int DISCONNECTED = 004;
+
+ /**
+ * A blocking call from a client was unblocked during failover.
+ */
+ public static final int UNBLOCKED = 005;
+
+ /**
+ * Unexpected I/O error occured on the server.
+ */
+ public static final int IO_ERROR = 006;
+
+ /**
+ * An operation failed because a queue does not exist on the server.
+ */
+ public static final int QUEUE_DOES_NOT_EXIST = 100;
+
+ /**
+ * An operation failed because a queue exists on the server.
+ */
+ public static final int QUEUE_EXISTS = 101;
+
+ /**
+ * A client operation failed because the calling resource
+ * (ClientSession, ClientProducer, etc.) is closed.
+ */
+ public static final int OBJECT_CLOSED = 102;
+
+ /**
+ * An filter expression has not been validated
+ */
+ public static final int INVALID_FILTER_EXPRESSION = 103;
+
+ /**
+ * A HornetQ resource is not in a legal state (e.g. calling
+ * ClientConsumer.receive() if a MessageHandler is set)
+ */
+ public static final int ILLEGAL_STATE = 104;
+
+ /**
+ * A security problem occured (authentication issues, permission issues,...)
+ */
+ public static final int SECURITY_EXCEPTION = 105;
+
+ /**
+ * An operation failed because an address does not exist on the server.
+ */
+ public static final int ADDRESS_DOES_NOT_EXIST = 106;
+
+ /**
+ * An operation failed because an address exists on the server.
+ */
+ public static final int ADDRESS_EXISTS = 107;
+
+ /**
+ * A incompatibility between HornetQ versions on the client and the server has been detected
+ */
+ public static final int INCOMPATIBLE_CLIENT_SERVER_VERSIONS = 108;
+
+ /**
+ * An operation failed because a session exists on the server.
+ */
+ public static final int SESSION_EXISTS = 109;
+
+ /**
+ * An problem occurred while manipulating the body of a large message.
+ */
+ public static final int LARGE_MESSAGE_ERROR_BODY = 110;
+
+ /**
+ * A transaction was rolled back.
+ */
+ public static final int TRANSACTION_ROLLED_BACK = 111;
+
+ /**
+ * The creation of a session was rejected by the server (e.g. if the
+ * server is starting and has not finish to be initialized)
+ */
+ public static final int SESSION_CREATION_REJECTED = 112;
+
+ /**
+ * A DuplicateID was rejected.
+ */
+ public static final int DUPLICATE_ID_REJECTED = 113;
+
+
+ // Native Error codes ----------------------------------------------
+
+ /**
+ * A internal error occured in the AIO native code
+ */
+ public static final int NATIVE_ERROR_INTERNAL = 200;
+
+ /**
+ * A buffer is invalid in the AIO native code
+ */
+ public static final int NATIVE_ERROR_INVALID_BUFFER = 201;
+
+ /**
+ * Alignment error in the AIO native code
+ */
+ public static final int NATIVE_ERROR_NOT_ALIGNED = 202;
+
+ /**
+ * AIO has not been properly initialized
+ */
+ public static final int NATIVE_ERROR_CANT_INITIALIZE_AIO = 203;
+
+ /**
+ * AIO has not been properly released
+ */
+ public static final int NATIVE_ERROR_CANT_RELEASE_AIO = 204;
+
+ /**
+ * A closed file has not be properly reopened
+ */
+ public static final int NATIVE_ERROR_CANT_OPEN_CLOSE_FILE = 205;
+
+ /**
+ * An error occured while allocating a queue in AIO native code
+ */
+ public static final int NATIVE_ERROR_CANT_ALLOCATE_QUEUE = 206;
+
+ /**
+ * An error occured while pre-allocating a file in AIO native code
+ */
+ public static final int NATIVE_ERROR_PREALLOCATE_FILE = 208;
+
+ /**
+ * An error occurred while allocating memory in the AIO native code
+ */
+ public static final int NATIVE_ERROR_ALLOCATE_MEMORY = 209;
+
+ /**
+ * AIO is full
+ */
+ public static final int NATIVE_ERROR_AIO_FULL = 211;
+
+ private int code;
+
+ public HornetQException()
+ {
+ }
+
+ public HornetQException(final int code)
+ {
+ this.code = code;
+ }
+
+ public HornetQException(final int code, final String msg)
+ {
+ super(msg);
+
+ this.code = code;
+ }
+
+ public HornetQException(final int code, final String msg, final Throwable cause)
+ {
+ super(msg, cause);
+
+ this.code = code;
+ }
+
+ public int getCode()
+ {
+ return code;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "HornetQException[errorCode=" + code + " message=" + getMessage() + "]";
+ }
+
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/api/core/Pair.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/api/core/Pair.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/api/core/Pair.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/api/core/Pair.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.api.core;
+
+import java.io.Serializable;
+
+/**
+ *
+ * A Pair is a holder for 2 objects.
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ */
+public class Pair<A, B> implements Serializable
+{
+ private static final long serialVersionUID = -2496357457812368127L;
+
+ public Pair(final A a, final B b)
+ {
+ this.a = a;
+
+ this.b = b;
+ }
+
+ public A a;
+
+ public B b;
+
+ private int hash = -1;
+
+ @Override
+ public int hashCode()
+ {
+ if (hash == -1)
+ {
+ if (a == null && b == null)
+ {
+ return super.hashCode();
+ }
+ else
+ {
+ hash = (a == null ? 0 : a.hashCode()) + 37 * (b == null ? 0 : b.hashCode());
+ }
+ }
+
+ return hash;
+ }
+
+ @Override
+ public boolean equals(final Object other)
+ {
+ if (other == this)
+ {
+ return true;
+ }
+
+ if (other instanceof Pair == false)
+ {
+ return false;
+ }
+
+ Pair<A, B> pother = (Pair<A, B>)other;
+
+ return (pother.a == null ? a == null : pother.a.equals(a)) && (pother.b == null ? b == null : pother.b.equals(b));
+
+ }
+
+ @Override
+ public String toString()
+ {
+ return "Pair[a=" + a + ", b=" + b + "]";
+ }
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/api/core/SimpleString.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/api/core/SimpleString.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/api/core/SimpleString.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/api/core/SimpleString.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,426 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.api.core;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hornetq.core.logging.Logger;
+import org.hornetq.utils.DataConstants;
+
+/**
+ * A simple String class that can store all characters, and stores as simple byte[],
+ * this minimises expensive copying between String objects.
+ *
+ * This object is used heavily throughout HornetQ for performance reasons.
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ */
+
+public class SimpleString implements CharSequence, Serializable, Comparable<SimpleString>
+{
+ private static final long serialVersionUID = 4204223851422244307L;
+
+ private static final Logger log = Logger.getLogger(SimpleString.class);
+
+ // Attributes
+ // ------------------------------------------------------------------------
+ private final byte[] data;
+
+ private transient int hash;
+
+ // Cache the string
+ private transient String str;
+
+ // Static
+ // ----------------------------------------------------------------------
+
+ /**
+ * Returns a SimpleString constructed from the <code>string</code> parameter.
+ * If <code>string</code> is <code>null</code>, the return value will be <code>null</code> too.
+ */
+ public static SimpleString toSimpleString(final String string)
+ {
+ if (string == null)
+ {
+ return null;
+ }
+ return new SimpleString(string);
+ }
+
+ // Constructors
+ // ----------------------------------------------------------------------
+ /**
+ * creates a SimpleString from a conventional String
+ * @param string the string to transform
+ */
+ public SimpleString(final String string)
+ {
+ int len = string.length();
+
+ data = new byte[len << 1];
+
+ int j = 0;
+
+ for (int i = 0; i < len; i++)
+ {
+ char c = string.charAt(i);
+
+ byte low = (byte)(c & 0xFF); // low byte
+
+ data[j++] = low;
+
+ byte high = (byte)(c >> 8 & 0xFF); // high byte
+
+ data[j++] = high;
+ }
+
+ str = string;
+ }
+
+ /**
+ * creates a SimpleString from a byte array
+ * @param data the byte array to use
+ */
+ public SimpleString(final byte[] data)
+ {
+ this.data = data;
+ }
+
+ // CharSequence implementation
+ // ---------------------------------------------------------------------------
+
+ public int length()
+ {
+ return data.length >> 1;
+ }
+
+ public char charAt(int pos)
+ {
+ if (pos < 0 || pos >= data.length >> 1)
+ {
+ throw new IndexOutOfBoundsException();
+ }
+ pos <<= 1;
+
+ return (char)(data[pos] | data[pos + 1] << 8);
+ }
+
+ public CharSequence subSequence(final int start, final int end)
+ {
+ int len = data.length >> 1;
+
+ if (end < start || start < 0 || end > len)
+ {
+ throw new IndexOutOfBoundsException();
+ }
+ else
+ {
+ int newlen = end - start << 1;
+ byte[] bytes = new byte[newlen];
+
+ System.arraycopy(data, start << 1, bytes, 0, newlen);
+
+ return new SimpleString(bytes);
+ }
+ }
+
+ // Comparable implementation -------------------------------------
+
+ public int compareTo(final SimpleString o)
+ {
+ return toString().compareTo(o.toString());
+ }
+
+ // Public
+ // ---------------------------------------------------------------------------
+
+ /**
+ * returns the underlying byte array of this SimpleString
+ * @return the byte array
+ */
+ public byte[] getData()
+ {
+ return data;
+ }
+
+ /**
+ * returns true if the SimpleString parameter starts with the same data as this one. false if not.
+ * @param other the SimpelString to look for
+ * @return true if this SimpleString starts with the same data
+ */
+ public boolean startsWith(final SimpleString other)
+ {
+ byte[] otherdata = other.data;
+
+ if (otherdata.length > data.length)
+ {
+ return false;
+ }
+
+ for (int i = 0; i < otherdata.length; i++)
+ {
+ if (data[i] != otherdata[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ @Override
+ public String toString()
+ {
+ if (str == null)
+ {
+ int len = data.length >> 1;
+
+ char[] chars = new char[len];
+
+ int j = 0;
+
+ for (int i = 0; i < len; i++)
+ {
+ int low = data[j++] & 0xFF;
+
+ int high = data[j++] << 8 & 0xFF00;
+
+ chars[i] = (char)(low | high);
+ }
+
+ str = new String(chars);
+ }
+
+ return str;
+ }
+
+ @Override
+ public boolean equals(final Object other)
+ {
+ if (this == other)
+ {
+ return true;
+ }
+
+ if (other instanceof SimpleString)
+ {
+ SimpleString s = (SimpleString)other;
+
+ if (data.length != s.data.length)
+ {
+ return false;
+ }
+
+ for (int i = 0; i < data.length; i++)
+ {
+ if (data[i] != s.data[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ @Override
+ public int hashCode()
+ {
+ if (hash == 0)
+ {
+ int tmphash = 0;
+ for (byte element : data)
+ {
+ tmphash = (tmphash << 5) - tmphash + element; // (hash << 5) - hash is same as hash * 31
+ }
+ hash = tmphash;
+ }
+
+ return hash;
+ }
+
+ /**
+ * splits this SimpleString into an array of SimpleString using the char param as the delimeter.
+ *
+ * i.e. "a.b" would return "a" and "b" if . was the delimeter
+ * @param delim
+ */
+ public SimpleString[] split(final char delim)
+ {
+ if (!contains(delim))
+ {
+ return new SimpleString[] { this };
+ }
+ else
+ {
+ List<SimpleString> all = new ArrayList<SimpleString>();
+ int lasPos = 0;
+ for (int i = 0; i < data.length; i += 2)
+ {
+ byte low = (byte)(delim & 0xFF); // low byte
+ byte high = (byte)(delim >> 8 & 0xFF); // high byte
+ if (data[i] == low && data[i + 1] == high)
+ {
+ byte[] bytes = new byte[i - lasPos];
+ System.arraycopy(data, lasPos, bytes, 0, bytes.length);
+ lasPos = i + 2;
+ all.add(new SimpleString(bytes));
+ }
+ }
+ byte[] bytes = new byte[data.length - lasPos];
+ System.arraycopy(data, lasPos, bytes, 0, bytes.length);
+ all.add(new SimpleString(bytes));
+ SimpleString[] parts = new SimpleString[all.size()];
+ return all.toArray(parts);
+ }
+ }
+
+ /**
+ * checks to see if this SimpleString contains the char parameter passed in
+ *
+ * @param c the char to check for
+ * @return true if the char is found, false otherwise.
+ */
+ public boolean contains(final char c)
+ {
+ for (int i = 0; i < data.length; i += 2)
+ {
+ byte low = (byte)(c & 0xFF); // low byte
+ byte high = (byte)(c >> 8 & 0xFF); // high byte
+ if (data[i] == low && data[i + 1] == high)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * concatanates a SimpleString and a String
+ *
+ * @param toAdd the String to concate with.
+ * @return the concatanated SimpleString
+ */
+ public SimpleString concat(final String toAdd)
+ {
+ return concat(new SimpleString(toAdd));
+ }
+
+ /**
+ * concatanates 2 SimpleString's
+ *
+ * @param toAdd the SimpleString to concate with.
+ * @return the concatanated SimpleString
+ */
+ public SimpleString concat(final SimpleString toAdd)
+ {
+ byte[] bytes = new byte[data.length + toAdd.getData().length];
+ System.arraycopy(data, 0, bytes, 0, data.length);
+ System.arraycopy(toAdd.getData(), 0, bytes, data.length, toAdd.getData().length);
+ return new SimpleString(bytes);
+ }
+
+ /**
+ * concatanates a SimpleString and a char
+ *
+ * @param c the char to concate with.
+ * @return the concatanated SimpleString
+ */
+ public SimpleString concat(final char c)
+ {
+ byte[] bytes = new byte[data.length + 2];
+ System.arraycopy(data, 0, bytes, 0, data.length);
+ bytes[data.length] = (byte)(c & 0xFF);
+ bytes[data.length + 1] = (byte)(c >> 8 & 0xFF);
+ return new SimpleString(bytes);
+ }
+
+ /**
+ * returns the size of this SimpleString
+ * @return the size
+ */
+ public int sizeof()
+ {
+ return DataConstants.SIZE_INT + data.length;
+ }
+
+ /**
+ * returns the size of a SimpleString
+ * @param str the SimpleString to check
+ * @return the size
+ */
+ public static int sizeofString(final SimpleString str)
+ {
+ return str.sizeof();
+ }
+
+ /**
+ * returns the size of a SimpleString which could be null
+ * @param str the SimpleString to check
+ * @return the size
+ */
+ public static int sizeofNullableString(final SimpleString str)
+ {
+ if (str == null)
+ {
+ return 1;
+ }
+ else
+ {
+ return 1 + str.sizeof();
+ }
+ }
+
+ /**
+ *
+ * @param srcBegin
+ * @param srcEnd
+ * @param dst
+ * @param dstBegin
+ */
+ public void getChars(final int srcBegin, final int srcEnd, final char dst[], final int dstBegin)
+ {
+ if (srcBegin < 0)
+ {
+ throw new StringIndexOutOfBoundsException(srcBegin);
+ }
+ if (srcEnd > length())
+ {
+ throw new StringIndexOutOfBoundsException(srcEnd);
+ }
+ if (srcBegin > srcEnd)
+ {
+ throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
+ }
+
+ int j = 0;
+
+ for (int i = srcBegin; i < srcEnd - srcBegin; i++)
+ {
+ int low = data[j++] & 0xFF;
+
+ int high = data[j++] << 8 & 0xFF00;
+
+ dst[i] = (char)(low | high);
+ }
+ }
+
+}
\ No newline at end of file
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,620 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.core.buffers.impl;
+
+import java.nio.ByteBuffer;
+
+import org.hornetq.api.core.HornetQBuffer;
+import org.hornetq.api.core.SimpleString;
+import org.hornetq.core.logging.Logger;
+import org.hornetq.utils.DataConstants;
+import org.hornetq.utils.UTF8Util;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ *
+ * A ChannelBufferWrapper
+ *
+ * @author Tim Fox
+ *
+ *
+ */
+public class ChannelBufferWrapper implements HornetQBuffer
+{
+ private static final Logger log = Logger.getLogger(ChannelBufferWrapper.class);
+
+ protected ChannelBuffer buffer;
+
+ public ChannelBufferWrapper(final ChannelBuffer buffer)
+ {
+ this.buffer = buffer;
+ }
+
+ public boolean readBoolean()
+ {
+ return readByte() != 0;
+ }
+
+ public SimpleString readNullableSimpleString()
+ {
+ int b = buffer.readByte();
+ if (b == DataConstants.NULL)
+ {
+ return null;
+ }
+ else
+ {
+ return readSimpleStringInternal();
+ }
+ }
+
+ public String readNullableString()
+ {
+ int b = buffer.readByte();
+ if (b == DataConstants.NULL)
+ {
+ return null;
+ }
+ else
+ {
+ return readStringInternal();
+ }
+ }
+
+ public SimpleString readSimpleString()
+ {
+ return readSimpleStringInternal();
+ }
+
+ private SimpleString readSimpleStringInternal()
+ {
+ int len = buffer.readInt();
+ byte[] data = new byte[len];
+ buffer.readBytes(data);
+ return new SimpleString(data);
+ }
+
+ public String readString()
+ {
+ return readStringInternal();
+ }
+
+ private String readStringInternal()
+ {
+ int len = buffer.readInt();
+
+ if (len < 9)
+ {
+ char[] chars = new char[len];
+ for (int i = 0; i < len; i++)
+ {
+ chars[i] = (char)buffer.readShort();
+ }
+ return new String(chars);
+ }
+ else if (len < 0xfff)
+ {
+ return readUTF();
+ }
+ else
+ {
+ return readSimpleStringInternal().toString();
+ }
+ }
+
+ public String readUTF()
+ {
+ return UTF8Util.readUTF(this);
+ }
+
+ public void writeBoolean(final boolean val)
+ {
+ buffer.writeByte((byte)(val ? -1 : 0));
+ }
+
+ public void writeNullableSimpleString(final SimpleString val)
+ {
+ if (val == null)
+ {
+ buffer.writeByte(DataConstants.NULL);
+ }
+ else
+ {
+ buffer.writeByte(DataConstants.NOT_NULL);
+ writeSimpleStringInternal(val);
+ }
+ }
+
+ public void writeNullableString(final String val)
+ {
+ if (val == null)
+ {
+ buffer.writeByte(DataConstants.NULL);
+ }
+ else
+ {
+ buffer.writeByte(DataConstants.NOT_NULL);
+ writeStringInternal(val);
+ }
+ }
+
+ public void writeSimpleString(final SimpleString val)
+ {
+ writeSimpleStringInternal(val);
+ }
+
+ private void writeSimpleStringInternal(final SimpleString val)
+ {
+ byte[] data = val.getData();
+ buffer.writeInt(data.length);
+ buffer.writeBytes(data);
+ }
+
+ public void writeString(final String val)
+ {
+ writeStringInternal(val);
+ }
+
+ private void writeStringInternal(final String val)
+ {
+ int length = val.length();
+
+ buffer.writeInt(length);
+
+ if (length < 9)
+ {
+ // If very small it's more performant to store char by char
+ for (int i = 0; i < val.length(); i++)
+ {
+ buffer.writeShort((short)val.charAt(i));
+ }
+ }
+ else if (length < 0xfff)
+ {
+ // Store as UTF - this is quicker than char by char for most strings
+ writeUTF(val);
+ }
+ else
+ {
+ // Store as SimpleString, since can't store utf > 0xffff in length
+ writeSimpleStringInternal(new SimpleString(val));
+ }
+ }
+
+ public void writeUTF(final String utf)
+ {
+ UTF8Util.saveUTF(this, utf);
+ }
+
+ public int capacity()
+ {
+ return buffer.capacity();
+ }
+
+ public ChannelBuffer channelBuffer()
+ {
+ return buffer;
+ }
+
+ public void clear()
+ {
+ buffer.clear();
+ }
+
+ public HornetQBuffer copy()
+ {
+ return new ChannelBufferWrapper(buffer.copy());
+ }
+
+ public HornetQBuffer copy(final int index, final int length)
+ {
+ return new ChannelBufferWrapper(buffer.copy(index, length));
+ }
+
+ public void discardReadBytes()
+ {
+ buffer.discardReadBytes();
+ }
+
+ public HornetQBuffer duplicate()
+ {
+ return new ChannelBufferWrapper(buffer.duplicate());
+ }
+
+ public byte getByte(final int index)
+ {
+ return buffer.getByte(index);
+ }
+
+ public void getBytes(final int index, final byte[] dst, final int dstIndex, final int length)
+ {
+ buffer.getBytes(index, dst, dstIndex, length);
+ }
+
+ public void getBytes(final int index, final byte[] dst)
+ {
+ buffer.getBytes(index, dst);
+ }
+
+ public void getBytes(final int index, final ByteBuffer dst)
+ {
+ buffer.getBytes(index, dst);
+ }
+
+ public void getBytes(final int index, final HornetQBuffer dst, final int dstIndex, final int length)
+ {
+ buffer.getBytes(index, dst.channelBuffer(), dstIndex, length);
+ }
+
+ public void getBytes(final int index, final HornetQBuffer dst, final int length)
+ {
+ buffer.getBytes(index, dst.channelBuffer(), length);
+ }
+
+ public void getBytes(final int index, final HornetQBuffer dst)
+ {
+ buffer.getBytes(index, dst.channelBuffer());
+ }
+
+ public char getChar(final int index)
+ {
+ return (char)buffer.getShort(index);
+ }
+
+ public double getDouble(final int index)
+ {
+ return Double.longBitsToDouble(buffer.getLong(index));
+ }
+
+ public float getFloat(final int index)
+ {
+ return Float.intBitsToFloat(buffer.getInt(index));
+ }
+
+ public int getInt(final int index)
+ {
+ return buffer.getInt(index);
+ }
+
+ public long getLong(final int index)
+ {
+ return buffer.getLong(index);
+ }
+
+ public short getShort(final int index)
+ {
+ return buffer.getShort(index);
+ }
+
+ public short getUnsignedByte(final int index)
+ {
+ return buffer.getUnsignedByte(index);
+ }
+
+ public long getUnsignedInt(final int index)
+ {
+ return buffer.getUnsignedInt(index);
+ }
+
+ public int getUnsignedShort(final int index)
+ {
+ return buffer.getUnsignedShort(index);
+ }
+
+ public void markReaderIndex()
+ {
+ buffer.markReaderIndex();
+ }
+
+ public void markWriterIndex()
+ {
+ buffer.markWriterIndex();
+ }
+
+ public boolean readable()
+ {
+ return buffer.readable();
+ }
+
+ public int readableBytes()
+ {
+ return buffer.readableBytes();
+ }
+
+ public byte readByte()
+ {
+ return buffer.readByte();
+ }
+
+ public void readBytes(final byte[] dst, final int dstIndex, final int length)
+ {
+ buffer.readBytes(dst, dstIndex, length);
+ }
+
+ public void readBytes(final byte[] dst)
+ {
+ buffer.readBytes(dst);
+ }
+
+ public void readBytes(final ByteBuffer dst)
+ {
+ buffer.readBytes(dst);
+ }
+
+ public void readBytes(final HornetQBuffer dst, final int dstIndex, final int length)
+ {
+ buffer.readBytes(dst.channelBuffer(), dstIndex, length);
+ }
+
+ public void readBytes(final HornetQBuffer dst, final int length)
+ {
+ buffer.readBytes(dst.channelBuffer(), length);
+ }
+
+ public void readBytes(final HornetQBuffer dst)
+ {
+ buffer.readBytes(dst.channelBuffer());
+ }
+
+ public HornetQBuffer readBytes(final int length)
+ {
+ return new ChannelBufferWrapper(buffer.readBytes(length));
+ }
+
+ public char readChar()
+ {
+ return (char)buffer.readShort();
+ }
+
+ public double readDouble()
+ {
+ return Double.longBitsToDouble(buffer.readLong());
+ }
+
+ public int readerIndex()
+ {
+ return buffer.readerIndex();
+ }
+
+ public void readerIndex(final int readerIndex)
+ {
+ buffer.readerIndex(readerIndex);
+ }
+
+ public float readFloat()
+ {
+ return Float.intBitsToFloat(buffer.readInt());
+ }
+
+ public int readInt()
+ {
+ return buffer.readInt();
+ }
+
+ public long readLong()
+ {
+ return buffer.readLong();
+ }
+
+ public short readShort()
+ {
+ return buffer.readShort();
+ }
+
+ public HornetQBuffer readSlice(final int length)
+ {
+ return new ChannelBufferWrapper(buffer.readSlice(length));
+ }
+
+ public short readUnsignedByte()
+ {
+ return buffer.readUnsignedByte();
+ }
+
+ public long readUnsignedInt()
+ {
+ return buffer.readUnsignedInt();
+ }
+
+ public int readUnsignedShort()
+ {
+ return buffer.readUnsignedShort();
+ }
+
+ public void resetReaderIndex()
+ {
+ buffer.resetReaderIndex();
+ }
+
+ public void resetWriterIndex()
+ {
+ buffer.resetWriterIndex();
+ }
+
+ public void setByte(final int index, final byte value)
+ {
+ buffer.setByte(index, value);
+ }
+
+ public void setBytes(final int index, final byte[] src, final int srcIndex, final int length)
+ {
+ buffer.setBytes(index, src, srcIndex, length);
+ }
+
+ public void setBytes(final int index, final byte[] src)
+ {
+ buffer.setBytes(index, src);
+ }
+
+ public void setBytes(final int index, final ByteBuffer src)
+ {
+ buffer.setBytes(index, src);
+ }
+
+ public void setBytes(final int index, final HornetQBuffer src, final int srcIndex, final int length)
+ {
+ buffer.setBytes(index, src.channelBuffer(), srcIndex, length);
+ }
+
+ public void setBytes(final int index, final HornetQBuffer src, final int length)
+ {
+ buffer.setBytes(index, src.channelBuffer(), length);
+ }
+
+ public void setBytes(final int index, final HornetQBuffer src)
+ {
+ buffer.setBytes(index, src.channelBuffer());
+ }
+
+ public void setChar(final int index, final char value)
+ {
+ buffer.setShort(index, (short)value);
+ }
+
+ public void setDouble(final int index, final double value)
+ {
+ buffer.setLong(index, Double.doubleToLongBits(value));
+ }
+
+ public void setFloat(final int index, final float value)
+ {
+ buffer.setInt(index, Float.floatToIntBits(value));
+ }
+
+ public void setIndex(final int readerIndex, final int writerIndex)
+ {
+ buffer.setIndex(readerIndex, writerIndex);
+ }
+
+ public void setInt(final int index, final int value)
+ {
+ buffer.setInt(index, value);
+ }
+
+ public void setLong(final int index, final long value)
+ {
+ buffer.setLong(index, value);
+ }
+
+ public void setShort(final int index, final short value)
+ {
+ buffer.setShort(index, value);
+ }
+
+ public void skipBytes(final int length)
+ {
+ buffer.skipBytes(length);
+ }
+
+ public HornetQBuffer slice()
+ {
+ return new ChannelBufferWrapper(buffer.slice());
+ }
+
+ public HornetQBuffer slice(final int index, final int length)
+ {
+ return new ChannelBufferWrapper(buffer.slice(index, length));
+ }
+
+ public ByteBuffer toByteBuffer()
+ {
+ return buffer.toByteBuffer();
+ }
+
+ public ByteBuffer toByteBuffer(final int index, final int length)
+ {
+ return buffer.toByteBuffer(index, length);
+ }
+
+ public boolean writable()
+ {
+ return buffer.writable();
+ }
+
+ public int writableBytes()
+ {
+ return buffer.writableBytes();
+ }
+
+ public void writeByte(final byte value)
+ {
+ buffer.writeByte(value);
+ }
+
+ public void writeBytes(final byte[] src, final int srcIndex, final int length)
+ {
+ buffer.writeBytes(src, srcIndex, length);
+ }
+
+ public void writeBytes(final byte[] src)
+ {
+ buffer.writeBytes(src);
+ }
+
+ public void writeBytes(final ByteBuffer src)
+ {
+ buffer.writeBytes(src);
+ }
+
+ public void writeBytes(final HornetQBuffer src, final int srcIndex, final int length)
+ {
+ buffer.writeBytes(src.channelBuffer(), srcIndex, length);
+ }
+
+ public void writeBytes(final HornetQBuffer src, final int length)
+ {
+ buffer.writeBytes(src.channelBuffer(), length);
+ }
+
+ public void writeChar(final char chr)
+ {
+ buffer.writeShort((short)chr);
+ }
+
+ public void writeDouble(final double value)
+ {
+ buffer.writeLong(Double.doubleToLongBits(value));
+ }
+
+ public void writeFloat(final float value)
+ {
+ buffer.writeInt(Float.floatToIntBits(value));
+ }
+
+ public void writeInt(final int value)
+ {
+ buffer.writeInt(value);
+ }
+
+ public void writeLong(final long value)
+ {
+ buffer.writeLong(value);
+ }
+
+ public int writerIndex()
+ {
+ return buffer.writerIndex();
+ }
+
+ public void writerIndex(final int writerIndex)
+ {
+ buffer.writerIndex(writerIndex);
+ }
+
+ public void writeShort(final short value)
+ {
+ buffer.writeShort(value);
+ }
+
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/core/server/HornetQComponent.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/core/server/HornetQComponent.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/core/server/HornetQComponent.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/core/server/HornetQComponent.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.core.server;
+
+/**
+ * A HornetQComponent
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ * @version <tt>$Revision: 2796 $</tt>
+ *
+ * $Id: HornetQComponent.java 2796 2007-06-25 22:24:41Z timfox $
+ *
+ */
+public interface HornetQComponent
+{
+ void start() throws Exception;
+
+ void stop() throws Exception;
+
+ boolean isStarted();
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/DataConstants.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/utils/DataConstants.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/DataConstants.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/DataConstants.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.utils;
+
+/**
+ *
+ * A DataConstants
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ */
+public class DataConstants
+{
+ public static final int SIZE_INT = 4;
+
+ public static final int SIZE_BOOLEAN = 1;
+
+ public static final int SIZE_LONG = 8;
+
+ public static final int SIZE_BYTE = 1;
+
+ public static final int SIZE_SHORT = 2;
+
+ public static final int SIZE_DOUBLE = 8;
+
+ public static final int SIZE_FLOAT = 4;
+
+ public static final int SIZE_CHAR = 2;
+
+ public static final byte TRUE = 1;
+
+ public static final byte FALSE = 0;
+
+ public static final byte NULL = 0;
+
+ public static final byte NOT_NULL = 1;
+
+ public static final byte BOOLEAN = 2;
+
+ public static final byte BYTE = 3;
+
+ public static final byte BYTES = 4;
+
+ public static final byte SHORT = 5;
+
+ public static final byte INT = 6;
+
+ public static final byte LONG = 7;
+
+ public static final byte FLOAT = 8;
+
+ public static final byte DOUBLE = 9;
+
+ public static final byte STRING = 10;
+
+ public static final byte CHAR = 11;
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/utils/UTF8Util.java (from rev 10738, trunk/hornetq-core/src/main/java/org/hornetq/utils/UTF8Util.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/utils/UTF8Util.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/utils/UTF8Util.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.utils;
+
+import java.lang.ref.SoftReference;
+
+import org.hornetq.api.core.HornetQBuffer;
+import org.hornetq.core.logging.Logger;
+
+/**
+ *
+ * A UTF8Util
+ *
+ * This class will write UTFs directly to the ByteOutput (through the MessageBuffer interface)
+ *
+ * @author <a href="mailto:clebert.suconic@jboss.org">Clebert Suconic</a>
+ *
+ * Created Feb 20, 2009 1:37:18 PM
+ *
+ *
+ */
+public class UTF8Util
+{
+ static boolean optimizeStrings = true;
+
+ private static final Logger log = Logger.getLogger(UTF8Util.class);
+
+ private static final boolean isTrace = UTF8Util.log.isTraceEnabled();
+
+ private static ThreadLocal<SoftReference<StringUtilBuffer>> currenBuffer = new ThreadLocal<SoftReference<StringUtilBuffer>>();
+
+ public static void saveUTF(final HornetQBuffer out, final String str)
+ {
+ StringUtilBuffer buffer = UTF8Util.getThreadLocalBuffer();
+
+ if (str.length() > 0xffff)
+ {
+ throw new IllegalArgumentException("the specified string is too long (" + str.length() + ")");
+ }
+
+ final int len = UTF8Util.calculateUTFSize(str, buffer);
+
+ if (len > 0xffff)
+ {
+ throw new IllegalArgumentException("the encoded string is too long (" + len + ")");
+ }
+
+ out.writeShort((short)len);
+
+ if (len > buffer.byteBuffer.length)
+ {
+ buffer.resizeByteBuffer(len);
+ }
+
+ if (len == (long)str.length())
+ {
+ for (int byteLocation = 0; byteLocation < len; byteLocation++)
+ {
+ buffer.byteBuffer[byteLocation] = (byte)buffer.charBuffer[byteLocation];
+ }
+ out.writeBytes(buffer.byteBuffer, 0, len);
+ }
+ else
+ {
+ if (UTF8Util.isTrace)
+ {
+ // This message is too verbose for debug, that's why we are using trace here
+ UTF8Util.log.trace("Saving string with utfSize=" + len + " stringSize=" + str.length());
+ }
+
+ int stringLength = str.length();
+
+ int charCount = 0;
+
+ for (int i = 0; i < stringLength; i++)
+ {
+ char charAtPos = buffer.charBuffer[i];
+ if (charAtPos >= 1 && charAtPos < 0x7f)
+ {
+ buffer.byteBuffer[charCount++] = (byte)charAtPos;
+ }
+ else if (charAtPos >= 0x800)
+ {
+ buffer.byteBuffer[charCount++] = (byte)(0xE0 | charAtPos >> 12 & 0x0F);
+ buffer.byteBuffer[charCount++] = (byte)(0x80 | charAtPos >> 6 & 0x3F);
+ buffer.byteBuffer[charCount++] = (byte)(0x80 | charAtPos >> 0 & 0x3F);
+ }
+ else
+ {
+ buffer.byteBuffer[charCount++] = (byte)(0xC0 | charAtPos >> 6 & 0x1F);
+ buffer.byteBuffer[charCount++] = (byte)(0x80 | charAtPos >> 0 & 0x3F);
+
+ }
+ }
+ out.writeBytes(buffer.byteBuffer, 0, len);
+ }
+ }
+
+ public static String readUTF(final HornetQBuffer input)
+ {
+ StringUtilBuffer buffer = UTF8Util.getThreadLocalBuffer();
+
+ final int size = input.readUnsignedShort();
+
+ if (size > buffer.byteBuffer.length)
+ {
+ buffer.resizeByteBuffer(size);
+ }
+
+ if (size > buffer.charBuffer.length)
+ {
+ buffer.resizeCharBuffer(size);
+ }
+
+ if (UTF8Util.isTrace)
+ {
+ // This message is too verbose for debug, that's why we are using trace here
+ UTF8Util.log.trace("Reading string with utfSize=" + size);
+ }
+
+ int count = 0;
+ int byte1, byte2, byte3;
+ int charCount = 0;
+
+ input.readBytes(buffer.byteBuffer, 0, size);
+
+ while (count < size)
+ {
+ byte1 = buffer.byteBuffer[count++];
+
+ if (byte1 > 0 && byte1 <= 0x7F)
+ {
+ buffer.charBuffer[charCount++] = (char)byte1;
+ }
+ else
+ {
+ int c = byte1 & 0xff;
+ switch (c >> 4)
+ {
+ case 0xc:
+ case 0xd:
+ byte2 = buffer.byteBuffer[count++];
+ buffer.charBuffer[charCount++] = (char)((c & 0x1F) << 6 | byte2 & 0x3F);
+ break;
+ case 0xe:
+ byte2 = buffer.byteBuffer[count++];
+ byte3 = buffer.byteBuffer[count++];
+ buffer.charBuffer[charCount++] = (char)((c & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F) << 0);
+ break;
+ }
+ }
+ }
+
+ return new String(buffer.charBuffer, 0, charCount);
+
+ }
+
+ private static StringUtilBuffer getThreadLocalBuffer()
+ {
+ SoftReference<StringUtilBuffer> softReference = UTF8Util.currenBuffer.get();
+ StringUtilBuffer value;
+ if (softReference == null)
+ {
+ value = new StringUtilBuffer();
+ softReference = new SoftReference<StringUtilBuffer>(value);
+ UTF8Util.currenBuffer.set(softReference);
+ }
+ else
+ {
+ value = softReference.get();
+ }
+
+ if (value == null)
+ {
+ value = new StringUtilBuffer();
+ softReference = new SoftReference<StringUtilBuffer>(value);
+ UTF8Util.currenBuffer.set(softReference);
+ }
+
+ return value;
+ }
+
+ public static void clearBuffer()
+ {
+ SoftReference<StringUtilBuffer> ref = UTF8Util.currenBuffer.get();
+ if (ref.get() != null)
+ {
+ ref.clear();
+ }
+ }
+
+ public static int calculateUTFSize(final String str, final StringUtilBuffer stringBuffer)
+ {
+ int calculatedLen = 0;
+
+ int stringLength = str.length();
+
+ if (stringLength > stringBuffer.charBuffer.length)
+ {
+ stringBuffer.resizeCharBuffer(stringLength);
+ }
+
+ str.getChars(0, stringLength, stringBuffer.charBuffer, 0);
+
+ for (int i = 0; i < stringLength; i++)
+ {
+ char c = stringBuffer.charBuffer[i];
+
+ if (c >= 1 && c < 0x7f)
+ {
+ calculatedLen++;
+ }
+ else if (c >= 0x800)
+ {
+ calculatedLen += 3;
+ }
+ else
+ {
+ calculatedLen += 2;
+ }
+ }
+ return calculatedLen;
+ }
+
+ private static class StringUtilBuffer
+ {
+
+ public char charBuffer[];
+
+ public byte byteBuffer[];
+
+ public void resizeCharBuffer(final int newSize)
+ {
+ if (newSize > charBuffer.length)
+ {
+ charBuffer = new char[newSize];
+ }
+ }
+
+ public void resizeByteBuffer(final int newSize)
+ {
+ if (newSize > byteBuffer.length)
+ {
+ byteBuffer = new byte[newSize];
+ }
+ }
+
+ public StringUtilBuffer()
+ {
+ this(1024, 1024);
+ }
+
+ public StringUtilBuffer(final int sizeChar, final int sizeByte)
+ {
+ charBuffer = new char[sizeChar];
+ byteBuffer = new byte[sizeByte];
+ }
+
+ }
+
+}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffer.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffer.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffer.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,1086 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.api.core;
-
-import java.nio.ByteBuffer;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-
-/**
- *
- * A HornetQBuffer wraps a Netty's ChannelBuffer and is used throughout HornetQ code base.
- *
- * Much of it derived from Netty ChannelBuffer by Trustin Lee
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- * @see HornetQBuffers
- *
- */
-public interface HornetQBuffer
-{
- /**
- * Returns the underlying Netty's ChannelBuffer
- *
- * @return the underlying Netty's ChannelBuffer
- */
- ChannelBuffer channelBuffer();
-
- /**
- * Returns the number of bytes this buffer can contain.
- */
- int capacity();
-
- /**
- * Returns the {@code readerIndex} of this buffer.
- */
- int readerIndex();
-
- /**
- * Sets the {@code readerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code readerIndex} is
- * less than {@code 0} or
- * greater than {@code this.writerIndex}
- */
- void readerIndex(int readerIndex);
-
- /**
- * Returns the {@code writerIndex} of this buffer.
- */
- int writerIndex();
-
- /**
- * Sets the {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code writerIndex} is
- * less than {@code this.readerIndex} or
- * greater than {@code this.capacity}
- */
- void writerIndex(int writerIndex);
-
- /**
- * Sets the {@code readerIndex} and {@code writerIndex} of this buffer
- * in one shot. This method is useful when you have to worry about the
- * invocation order of {@link #readerIndex(int)} and {@link #writerIndex(int)}
- * methods. For example, the following code will fail:
- *
- * <pre>
- * // Create a buffer whose readerIndex, writerIndex and capacity are
- * // 0, 0 and 8 respectively.
- * ChannelBuffer buf = ChannelBuffers.buffer(8);
- *
- * // IndexOutOfBoundsException is thrown because the specified
- * // readerIndex (2) cannot be greater than the current writerIndex (0).
- * buf.readerIndex(2);
- * buf.writerIndex(4);
- * </pre>
- *
- * The following code will also fail:
- *
- * <pre>
- * // Create a buffer whose readerIndex, writerIndex and capacity are
- * // 0, 8 and 8 respectively.
- * ChannelBuffer buf = ChannelBuffers.wrappedBuffer(new byte[8]);
- *
- * // readerIndex becomes 8.
- * buf.readLong();
- *
- * // IndexOutOfBoundsException is thrown because the specified
- * // writerIndex (4) cannot be less than the current readerIndex (8).
- * buf.writerIndex(4);
- * buf.readerIndex(2);
- * </pre>
- *
- * By contrast, {@link #setIndex(int, int)} guarantees that it never
- * throws an {@link IndexOutOfBoundsException} as long as the specified
- * indexes meet basic constraints, regardless what the current index
- * values of the buffer are:
- *
- * <pre>
- * // No matter what the current state of the buffer is, the following
- * // call always succeeds as long as the capacity of the buffer is not
- * // less than 4.
- * buf.setIndex(2, 4);
- * </pre>
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code readerIndex} is less than 0,
- * if the specified {@code writerIndex} is less than the specified
- * {@code readerIndex} or if the specified {@code writerIndex} is
- * greater than {@code this.capacity}
- */
- void setIndex(int readerIndex, int writerIndex);
-
- /**
- * Returns the number of readable bytes which is equal to
- * {@code (this.writerIndex - this.readerIndex)}.
- */
- int readableBytes();
-
- /**
- * Returns the number of writable bytes which is equal to
- * {@code (this.capacity - this.writerIndex)}.
- */
- int writableBytes();
-
- /**
- * Returns {@code true}
- * if and only if {@code (this.writerIndex - this.readerIndex)} is greater
- * than {@code 0}.
- */
- boolean readable();
-
- /**
- * Returns {@code true}
- * if and only if {@code (this.capacity - this.writerIndex)} is greater
- * than {@code 0}.
- */
- boolean writable();
-
- /**
- * Sets the {@code readerIndex} and {@code writerIndex} of this buffer to
- * {@code 0}.
- * This method is identical to {@link #setIndex(int, int) setIndex(0, 0)}.
- * <p>
- * Please note that the behavior of this method is different
- * from that of NIO buffer, which sets the {@code limit} to
- * the {@code capacity} of the buffer.
- */
- void clear();
-
- /**
- * Marks the current {@code readerIndex} in this buffer. You can
- * reposition the current {@code readerIndex} to the marked
- * {@code readerIndex} by calling {@link #resetReaderIndex()}.
- * The initial value of the marked {@code readerIndex} is {@code 0}.
- */
- void markReaderIndex();
-
- /**
- * Repositions the current {@code readerIndex} to the marked
- * {@code readerIndex} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the current {@code writerIndex} is less than the marked
- * {@code readerIndex}
- */
- void resetReaderIndex();
-
- /**
- * Marks the current {@code writerIndex} in this buffer. You can
- * reposition the current {@code writerIndex} to the marked
- * {@code writerIndex} by calling {@link #resetWriterIndex()}.
- * The initial value of the marked {@code writerIndex} is {@code 0}.
- */
- void markWriterIndex();
-
- /**
- * Repositions the current {@code writerIndex} to the marked
- * {@code writerIndex} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the current {@code readerIndex} is greater than the marked
- * {@code writerIndex}
- */
- void resetWriterIndex();
-
- /**
- * Discards the bytes between the 0th index and {@code readerIndex}.
- * It moves the bytes between {@code readerIndex} and {@code writerIndex}
- * to the 0th index, and sets {@code readerIndex} and {@code writerIndex}
- * to {@code 0} and {@code oldWriterIndex - oldReaderIndex} respectively.
- * <p>
- * Please refer to the class documentation for more detailed explanation.
- */
- void discardReadBytes();
-
- /**
- * Gets a byte at the specified absolute {@code index} in this buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 1} is greater than {@code this.capacity}
- */
- byte getByte(int index);
-
- /**
- * Gets an unsigned byte at the specified absolute {@code index} in this
- * buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 1} is greater than {@code this.capacity}
- */
- short getUnsignedByte(int index);
-
- /**
- * Gets a 16-bit short integer at the specified absolute {@code index} in
- * this buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 2} is greater than {@code this.capacity}
- */
- short getShort(int index);
-
- /**
- * Gets an unsigned 16-bit short integer at the specified absolute
- * {@code index} in this buffer. This method does not modify
- * {@code readerIndex} or {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 2} is greater than {@code this.capacity}
- */
- int getUnsignedShort(int index);
-
- /**
- * Gets a 32-bit integer at the specified absolute {@code index} in
- * this buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 4} is greater than {@code this.capacity}
- */
- int getInt(int index);
-
- /**
- * Gets an unsigned 32-bit integer at the specified absolute {@code index}
- * in this buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 4} is greater than {@code this.capacity}
- */
- long getUnsignedInt(int index);
-
- /**
- * Gets a 64-bit long integer at the specified absolute {@code index} in
- * this buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 8} is greater than {@code this.capacity}
- */
- long getLong(int index);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the specified absolute {@code index} until the destination becomes
- * non-writable. This method is basically same with
- * {@link #getBytes(int, HornetQBuffer, int, int)}, except that this
- * method increases the {@code writerIndex} of the destination by the
- * number of the transferred bytes while
- * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * the source buffer (i.e. {@code this}).
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * if {@code index + dst.writableBytes} is greater than
- * {@code this.capacity}
- */
- void getBytes(int index, HornetQBuffer dst);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the specified absolute {@code index}. This method is basically same
- * with {@link #getBytes(int, HornetQBuffer, int, int)}, except that this
- * method increases the {@code writerIndex} of the destination by the
- * number of the transferred bytes while
- * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * the source buffer (i.e. {@code this}).
- *
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0},
- * if {@code index + length} is greater than
- * {@code this.capacity}, or
- * if {@code length} is greater than {@code dst.writableBytes}
- */
- void getBytes(int index, HornetQBuffer dst, int length);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the specified absolute {@code index}.
- * This method does not modify {@code readerIndex} or {@code writerIndex}
- * of both the source (i.e. {@code this}) and the destination.
- *
- * @param dstIndex the first index of the destination
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0},
- * if the specified {@code dstIndex} is less than {@code 0},
- * if {@code index + length} is greater than
- * {@code this.capacity}, or
- * if {@code dstIndex + length} is greater than
- * {@code dst.capacity}
- */
- void getBytes(int index, HornetQBuffer dst, int dstIndex, int length);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the specified absolute {@code index}.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * if {@code index + dst.length} is greater than
- * {@code this.capacity}
- */
- void getBytes(int index, byte[] dst);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the specified absolute {@code index}.
- * This method does not modify {@code readerIndex} or {@code writerIndex}
- * of this buffer.
- *
- * @param dstIndex the first index of the destination
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0},
- * if the specified {@code dstIndex} is less than {@code 0},
- * if {@code index + length} is greater than
- * {@code this.capacity}, or
- * if {@code dstIndex + length} is greater than
- * {@code dst.length}
- */
- void getBytes(int index, byte[] dst, int dstIndex, int length);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the specified absolute {@code index} until the destination's position
- * reaches its limit.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer while the destination's {@code position} will be increased.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * if {@code index + dst.remaining()} is greater than
- * {@code this.capacity}
- */
- void getBytes(int index, ByteBuffer dst);
-
- /**
- * Gets a char at the specified absolute {@code index} in
- * this buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 2} is greater than {@code this.capacity}
- */
- char getChar(int index);
-
- /**
- * Gets a float at the specified absolute {@code index} in
- * this buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 4} is greater than {@code this.capacity}
- */
- float getFloat(int index);
-
- /**
- * Gets a double at the specified absolute {@code index} in
- * this buffer. This method does not modify {@code readerIndex} or
- * {@code writerIndex} of this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 8} is greater than {@code this.capacity}
- */
- double getDouble(int index);
-
- /**
- * Sets the specified byte at the specified absolute {@code index} in this
- * buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 1} is greater than {@code this.capacity}
- */
- void setByte(int index, byte value);
-
- /**
- * Sets the specified 16-bit short integer at the specified absolute
- * {@code index} in this buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 2} is greater than {@code this.capacity}
- */
- void setShort(int index, short value);
-
- /**
- * Sets the specified 32-bit integer at the specified absolute
- * {@code index} in this buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 4} is greater than {@code this.capacity}
- */
- void setInt(int index, int value);
-
- /**
- * Sets the specified 64-bit long integer at the specified absolute
- * {@code index} in this buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 8} is greater than {@code this.capacity}
- */
- void setLong(int index, long value);
-
- /**
- * Transfers the specified source buffer's data to this buffer starting at
- * the specified absolute {@code index} until the destination becomes
- * unreadable. This method is basically same with
- * {@link #setBytes(int, HornetQBuffer, int, int)}, except that this
- * method increases the {@code readerIndex} of the source buffer by
- * the number of the transferred bytes while
- * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * the source buffer (i.e. {@code this}).
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * if {@code index + src.readableBytes} is greater than
- * {@code this.capacity}
- */
- void setBytes(int index, HornetQBuffer src);
-
- /**
- * Transfers the specified source buffer's data to this buffer starting at
- * the specified absolute {@code index}. This method is basically same
- * with {@link #setBytes(int, HornetQBuffer, int, int)}, except that this
- * method increases the {@code readerIndex} of the source buffer by
- * the number of the transferred bytes while
- * {@link #getBytes(int, HornetQBuffer, int, int)} does not.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * the source buffer (i.e. {@code this}).
- *
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0},
- * if {@code index + length} is greater than
- * {@code this.capacity}, or
- * if {@code length} is greater than {@code src.readableBytes}
- */
- void setBytes(int index, HornetQBuffer src, int length);
-
- /**
- * Transfers the specified source buffer's data to this buffer starting at
- * the specified absolute {@code index}.
- * This method does not modify {@code readerIndex} or {@code writerIndex}
- * of both the source (i.e. {@code this}) and the destination.
- *
- * @param srcIndex the first index of the source
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0},
- * if the specified {@code srcIndex} is less than {@code 0},
- * if {@code index + length} is greater than
- * {@code this.capacity}, or
- * if {@code srcIndex + length} is greater than
- * {@code src.capacity}
- */
- void setBytes(int index, HornetQBuffer src, int srcIndex, int length);
-
- /**
- * Transfers the specified source array's data to this buffer starting at
- * the specified absolute {@code index}.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * if {@code index + src.length} is greater than
- * {@code this.capacity}
- */
- void setBytes(int index, byte[] src);
-
- /**
- * Transfers the specified source array's data to this buffer starting at
- * the specified absolute {@code index}.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0},
- * if the specified {@code srcIndex} is less than {@code 0},
- * if {@code index + length} is greater than
- * {@code this.capacity}, or
- * if {@code srcIndex + length} is greater than {@code src.length}
- */
- void setBytes(int index, byte[] src, int srcIndex, int length);
-
- /**
- * Transfers the specified source buffer's data to this buffer starting at
- * the specified absolute {@code index} until the source buffer's position
- * reaches its limit.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * if {@code index + src.remaining()} is greater than
- * {@code this.capacity}
- */
- void setBytes(int index, ByteBuffer src);
-
- /**
- * Sets the specified char at the specified absolute
- * {@code index} in this buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 2} is greater than {@code this.capacity}
- */
- void setChar(int index, char value);
-
- /**
- * Sets the specified float at the specified absolute
- * {@code index} in this buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 4} is greater than {@code this.capacity}
- */
- void setFloat(int index, float value);
-
- /**
- * Sets the specified double at the specified absolute
- * {@code index} in this buffer.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code index} is less than {@code 0} or
- * {@code index + 8} is greater than {@code this.capacity}
- */
- void setDouble(int index, double value);
-
- /**
- * Gets a byte at the current {@code readerIndex} and increases
- * the {@code readerIndex} by {@code 1} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 1}
- */
- byte readByte();
-
- /**
- * Gets an unsigned byte at the current {@code readerIndex} and increases
- * the {@code readerIndex} by {@code 1} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 1}
- */
- short readUnsignedByte();
-
- /**
- * Gets a 16-bit short integer at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 2} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 2}
- */
- short readShort();
-
- /**
- * Gets an unsigned 16-bit short integer at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 2} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 2}
- */
- int readUnsignedShort();
-
- /**
- * Gets a 32-bit integer at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 4} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 4}
- */
- int readInt();
-
- /**
- * Gets an unsigned 32-bit integer at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 4} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 4}
- */
- long readUnsignedInt();
-
- /**
- * Gets a 64-bit integer at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 8} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 8}
- */
- long readLong();
-
- /**
- * Gets a char at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 2} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 2}
- */
- char readChar();
-
- /**
- * Gets a float at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 4} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 4}
- */
- float readFloat();
-
- /**
- * Gets a double at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 8} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 8}
- */
- double readDouble();
-
- /**
- * Gets a boolean at the current {@code readerIndex}
- * and increases the {@code readerIndex} by {@code 1} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.readableBytes} is less than {@code 1}
- */
- boolean readBoolean();
-
- /**
- * Gets a SimpleString (potentially {@code null}) at the current {@code readerIndex}
- */
- SimpleString readNullableSimpleString();
-
- /**
- * Gets a String (potentially {@code null}) at the current {@code readerIndex}
- */
- String readNullableString();
-
- /**
- * Gets a non-null SimpleString at the current {@code readerIndex}
- */
- SimpleString readSimpleString();
-
- /**
- * Gets a non-null String at the current {@code readerIndex}
- */
- String readString();
-
- /**
- * Gets a UTF-8 String at the current {@code readerIndex}
- */
- String readUTF();
-
- /**
- * Transfers this buffer's data to a newly created buffer starting at
- * the current {@code readerIndex} and increases the {@code readerIndex}
- * by the number of the transferred bytes (= {@code length}).
- * The returned buffer's {@code readerIndex} and {@code writerIndex} are
- * {@code 0} and {@code length} respectively.
- *
- * @param length the number of bytes to transfer
- *
- * @return the newly created buffer which contains the transferred bytes
- *
- * @throws IndexOutOfBoundsException
- * if {@code length} is greater than {@code this.readableBytes}
- */
- HornetQBuffer readBytes(int length);
-
- /**
- * Returns a new slice of this buffer's sub-region starting at the current
- * {@code readerIndex} and increases the {@code readerIndex} by the size
- * of the new slice (= {@code length}).
- *
- * @param length the size of the new slice
- *
- * @return the newly created slice
- *
- * @throws IndexOutOfBoundsException
- * if {@code length} is greater than {@code this.readableBytes}
- */
- HornetQBuffer readSlice(int length);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the current {@code readerIndex} until the destination becomes
- * non-writable, and increases the {@code readerIndex} by the number of the
- * transferred bytes. This method is basically same with
- * {@link #readBytes(HornetQBuffer, int, int)}, except that this method
- * increases the {@code writerIndex} of the destination by the number of
- * the transferred bytes while {@link #readBytes(HornetQBuffer, int, int)}
- * does not.
- *
- * @throws IndexOutOfBoundsException
- * if {@code dst.writableBytes} is greater than
- * {@code this.readableBytes}
- */
- void readBytes(HornetQBuffer dst);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the current {@code readerIndex} and increases the {@code readerIndex}
- * by the number of the transferred bytes (= {@code length}). This method
- * is basically same with {@link #readBytes(HornetQBuffer, int, int)},
- * except that this method increases the {@code writerIndex} of the
- * destination by the number of the transferred bytes (= {@code length})
- * while {@link #readBytes(HornetQBuffer, int, int)} does not.
- *
- * @throws IndexOutOfBoundsException
- * if {@code length} is greater than {@code this.readableBytes} or
- * if {@code length} is greater than {@code dst.writableBytes}
- */
- void readBytes(HornetQBuffer dst, int length);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the current {@code readerIndex} and increases the {@code readerIndex}
- * by the number of the transferred bytes (= {@code length}).
- *
- * @param dstIndex the first index of the destination
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code dstIndex} is less than {@code 0},
- * if {@code length} is greater than {@code this.readableBytes}, or
- * if {@code dstIndex + length} is greater than
- * {@code dst.capacity}
- */
- void readBytes(HornetQBuffer dst, int dstIndex, int length);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the current {@code readerIndex} and increases the {@code readerIndex}
- * by the number of the transferred bytes (= {@code dst.length}).
- *
- * @throws IndexOutOfBoundsException
- * if {@code dst.length} is greater than {@code this.readableBytes}
- */
- void readBytes(byte[] dst);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the current {@code readerIndex} and increases the {@code readerIndex}
- * by the number of the transferred bytes (= {@code length}).
- *
- * @param dstIndex the first index of the destination
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code dstIndex} is less than {@code 0},
- * if {@code length} is greater than {@code this.readableBytes}, or
- * if {@code dstIndex + length} is greater than {@code dst.length}
- */
- void readBytes(byte[] dst, int dstIndex, int length);
-
- /**
- * Transfers this buffer's data to the specified destination starting at
- * the current {@code readerIndex} until the destination's position
- * reaches its limit, and increases the {@code readerIndex} by the
- * number of the transferred bytes.
- *
- * @throws IndexOutOfBoundsException
- * if {@code dst.remaining()} is greater than
- * {@code this.readableBytes}
- */
- void readBytes(ByteBuffer dst);
-
- /**
- * Increases the current {@code readerIndex} by the specified
- * {@code length} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code length} is greater than {@code this.readableBytes}
- */
- void skipBytes(int length);
-
- /**
- * Sets the specified byte at the current {@code writerIndex}
- * and increases the {@code writerIndex} by {@code 1} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.writableBytes} is less than {@code 1}
- */
- void writeByte(byte value);
-
- /**
- * Sets the specified 16-bit short integer at the current
- * {@code writerIndex} and increases the {@code writerIndex} by {@code 2}
- * in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.writableBytes} is less than {@code 2}
- */
- void writeShort(short value);
-
- /**
- * Sets the specified 32-bit integer at the current {@code writerIndex}
- * and increases the {@code writerIndex} by {@code 4} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.writableBytes} is less than {@code 4}
- */
- void writeInt(int value);
-
- /**
- * Sets the specified 64-bit long integer at the current
- * {@code writerIndex} and increases the {@code writerIndex} by {@code 8}
- * in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.writableBytes} is less than {@code 8}
- */
- void writeLong(long value);
-
- /**
- * Sets the specified char at the current {@code writerIndex}
- * and increases the {@code writerIndex} by {@code 2} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.writableBytes} is less than {@code 2}
- */
- void writeChar(char chr);
-
- /**
- * Sets the specified float at the current {@code writerIndex}
- * and increases the {@code writerIndex} by {@code 4} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.writableBytes} is less than {@code 4}
- */
- void writeFloat(float value);
-
- /**
- * Sets the specified double at the current {@code writerIndex}
- * and increases the {@code writerIndex} by {@code 8} in this buffer.
- *
- * @throws IndexOutOfBoundsException
- * if {@code this.writableBytes} is less than {@code 8}
- */
- void writeDouble(double value);
-
- /**
- * Sets the specified boolean at the current {@code writerIndex}
- */
- void writeBoolean(boolean val);
-
- /**
- * Sets the specified SimpleString (potentially {@code null}) at the current {@code writerIndex}
- */
- void writeNullableSimpleString(SimpleString val);
-
- /**
- * Sets the specified String (potentially {@code null}) at the current {@code writerIndex}
- */
- void writeNullableString(String val);
-
- /**
- * Sets the specified non-null SimpleString at the current {@code writerIndex}
- */
- void writeSimpleString(SimpleString val);
-
- /**
- * Sets the specified non-null String at the current {@code writerIndex}
- */
- void writeString(String val);
-
- /**
- * Sets the specified UTF-8 String at the current {@code writerIndex}
- */
-
- void writeUTF(String utf);
-
- /**
- * Transfers the specified source buffer's data to this buffer starting at
- * the current {@code writerIndex} and increases the {@code writerIndex}
- * by the number of the transferred bytes (= {@code length}). This method
- * is basically same with {@link #writeBytes(HornetQBuffer, int, int)},
- * except that this method increases the {@code readerIndex} of the source
- * buffer by the number of the transferred bytes (= {@code length}) while
- * {@link #writeBytes(HornetQBuffer, int, int)} does not.
- *
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if {@code length} is greater than {@code this.writableBytes} or
- * if {@code length} is greater then {@code src.readableBytes}
- */
- void writeBytes(HornetQBuffer src, int length);
-
- /**
- * Transfers the specified source buffer's data to this buffer starting at
- * the current {@code writerIndex} and increases the {@code writerIndex}
- * by the number of the transferred bytes (= {@code length}).
- *
- * @param srcIndex the first index of the source
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code srcIndex} is less than {@code 0},
- * if {@code srcIndex + length} is greater than
- * {@code src.capacity}, or
- * if {@code length} is greater than {@code this.writableBytes}
- */
- void writeBytes(HornetQBuffer src, int srcIndex, int length);
-
- /**
- * Transfers the specified source array's data to this buffer starting at
- * the current {@code writerIndex} and increases the {@code writerIndex}
- * by the number of the transferred bytes (= {@code src.length}).
- *
- * @throws IndexOutOfBoundsException
- * if {@code src.length} is greater than {@code this.writableBytes}
- */
- void writeBytes(byte[] src);
-
- /**
- * Transfers the specified source array's data to this buffer starting at
- * the current {@code writerIndex} and increases the {@code writerIndex}
- * by the number of the transferred bytes (= {@code length}).
- *
- * @param srcIndex the first index of the source
- * @param length the number of bytes to transfer
- *
- * @throws IndexOutOfBoundsException
- * if the specified {@code srcIndex} is less than {@code 0},
- * if {@code srcIndex + length} is greater than
- * {@code src.length}, or
- * if {@code length} is greater than {@code this.writableBytes}
- */
- void writeBytes(byte[] src, int srcIndex, int length);
-
- /**
- * Transfers the specified source buffer's data to this buffer starting at
- * the current {@code writerIndex} until the source buffer's position
- * reaches its limit, and increases the {@code writerIndex} by the
- * number of the transferred bytes.
- *
- * @throws IndexOutOfBoundsException
- * if {@code src.remaining()} is greater than
- * {@code this.writableBytes}
- */
- void writeBytes(ByteBuffer src);
-
- /**
- * Returns a copy of this buffer's readable bytes. Modifying the content
- * of the returned buffer or this buffer does not affect each other at all.
- * This method is identical to {@code buf.copy(buf.readerIndex(), buf.readableBytes())}.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- *
- */
- HornetQBuffer copy();
-
- /**
- * Returns a copy of this buffer's sub-region. Modifying the content of
- * the returned buffer or this buffer does not affect each other at all.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- */
- HornetQBuffer copy(int index, int length);
-
- /**
- * Returns a slice of this buffer's readable bytes. Modifying the content
- * of the returned buffer or this buffer affects each other's content
- * while they maintain separate indexes and marks. This method is
- * identical to {@code buf.slice(buf.readerIndex(), buf.readableBytes())}.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- */
- HornetQBuffer slice();
-
- /**
- * Returns a slice of this buffer's sub-region. Modifying the content of
- * the returned buffer or this buffer affects each other's content while
- * they maintain separate indexes and marks.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- */
- HornetQBuffer slice(int index, int length);
-
- /**
- * Returns a buffer which shares the whole region of this buffer.
- * Modifying the content of the returned buffer or this buffer affects
- * each other's content while they maintain separate indexes and marks.
- * This method is identical to {@code buf.slice(0, buf.capacity())}.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- */
- HornetQBuffer duplicate();
-
- /**
- * Converts this buffer's readable bytes into a NIO buffer. The returned
- * buffer might or might not share the content with this buffer, while
- * they have separate indexes and marks. This method is identical to
- * {@code buf.toByteBuffer(buf.readerIndex(), buf.readableBytes())}.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- */
- ByteBuffer toByteBuffer();
-
- /**
- * Converts this buffer's sub-region into a NIO buffer. The returned
- * buffer might or might not share the content with this buffer, while
- * they have separate indexes and marks.
- * This method does not modify {@code readerIndex} or {@code writerIndex} of
- * this buffer.
- */
- ByteBuffer toByteBuffer(int index, int length);
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffers.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffers.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQBuffers.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,97 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.api.core;
-
-import java.nio.ByteBuffer;
-
-import org.hornetq.core.buffers.impl.ChannelBufferWrapper;
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
-
-/**
- * Factory class to create HornetQBuffers
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- */
-public class HornetQBuffers
-{
- /**
- * Creates a <em>self-expanding</em> HornetQBuffer with the given initial size
- *
- * @param size the initial size of the created HornetQBuffer
- * @return a self-expanding HornetQBuffer starting with the given size
- */
- public static HornetQBuffer dynamicBuffer(final int size)
- {
- return new ChannelBufferWrapper(ChannelBuffers.dynamicBuffer(size));
- }
-
- /**
- * Creates a <em>self-expanding</em> HornetQBuffer filled with the given byte array
- *
- * @param bytes the created buffer will be initially filled with this byte array
- * @return a self-expanding HornetQBuffer filled with the given byte array
- */
- public static HornetQBuffer dynamicBuffer(final byte[] bytes)
- {
- ChannelBuffer buff = ChannelBuffers.dynamicBuffer(bytes.length);
-
- buff.writeBytes(bytes);
-
- return new ChannelBufferWrapper(buff);
- }
-
- /**
- * Creates a HornetQBuffer wrapping an underlying NIO ByteBuffer
- *
- * The position on this buffer won't affect the position on the inner buffer
- *
- * @param underlying the underlying NIO ByteBuffer
- * @return a HornetQBuffer wrapping the underlying NIO ByteBuffer
- */
- public static HornetQBuffer wrappedBuffer(final ByteBuffer underlying)
- {
- HornetQBuffer buff = new ChannelBufferWrapper(ChannelBuffers.wrappedBuffer(underlying));
-
- buff.clear();
-
- return buff;
- }
-
- /**
- * Creates a HornetQBuffer wrapping an underlying byte array
- *
- * @param underlying the underlying byte array
- * @return a HornetQBuffer wrapping the underlying byte array
- */
- public static HornetQBuffer wrappedBuffer(final byte[] underlying)
- {
- return new ChannelBufferWrapper(ChannelBuffers.wrappedBuffer(underlying));
- }
-
- /**
- * Creates a <em>fixed</em> HornetQBuffer of the given size
- *
- * @param size the size of the created HornetQBuffer
- * @return a fixed HornetQBuffer with the given size
- */
- public static HornetQBuffer fixedBuffer(final int size)
- {
- return new ChannelBufferWrapper(ChannelBuffers.buffer(size));
- }
-
- private HornetQBuffers()
- {
- }
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQException.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQException.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/api/core/HornetQException.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,226 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.api.core;
-
-/**
- *
- * HornetQException is the root exception for HornetQ API.
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- */
-public class HornetQException extends Exception
-{
- private static final long serialVersionUID = -4802014152804997417L;
-
- // Error codes -------------------------------------------------
-
- /**
- * Internal error which prevented HornetQ to perform.
- */
- public static final int INTERNAL_ERROR = 000;
-
- /**
- * A packet of unsupported type was received by HornetQ PacketHandler.
- */
- public static final int UNSUPPORTED_PACKET = 001;
-
- /**
- * A client is not able to connect to HornetQ server.
- */
- public static final int NOT_CONNECTED = 002;
-
- /**
- * A client timed out will connecting to HornetQ server.
- */
- public static final int CONNECTION_TIMEDOUT = 003;
-
- /**
- * A client was disconnected from HornetQ server when the server has shut down.
- */
- public static final int DISCONNECTED = 004;
-
- /**
- * A blocking call from a client was unblocked during failover.
- */
- public static final int UNBLOCKED = 005;
-
- /**
- * Unexpected I/O error occured on the server.
- */
- public static final int IO_ERROR = 006;
-
- /**
- * An operation failed because a queue does not exist on the server.
- */
- public static final int QUEUE_DOES_NOT_EXIST = 100;
-
- /**
- * An operation failed because a queue exists on the server.
- */
- public static final int QUEUE_EXISTS = 101;
-
- /**
- * A client operation failed because the calling resource
- * (ClientSession, ClientProducer, etc.) is closed.
- */
- public static final int OBJECT_CLOSED = 102;
-
- /**
- * An filter expression has not been validated
- */
- public static final int INVALID_FILTER_EXPRESSION = 103;
-
- /**
- * A HornetQ resource is not in a legal state (e.g. calling
- * ClientConsumer.receive() if a MessageHandler is set)
- */
- public static final int ILLEGAL_STATE = 104;
-
- /**
- * A security problem occured (authentication issues, permission issues,...)
- */
- public static final int SECURITY_EXCEPTION = 105;
-
- /**
- * An operation failed because an address does not exist on the server.
- */
- public static final int ADDRESS_DOES_NOT_EXIST = 106;
-
- /**
- * An operation failed because an address exists on the server.
- */
- public static final int ADDRESS_EXISTS = 107;
-
- /**
- * A incompatibility between HornetQ versions on the client and the server has been detected
- */
- public static final int INCOMPATIBLE_CLIENT_SERVER_VERSIONS = 108;
-
- /**
- * An operation failed because a session exists on the server.
- */
- public static final int SESSION_EXISTS = 109;
-
- /**
- * An problem occurred while manipulating the body of a large message.
- */
- public static final int LARGE_MESSAGE_ERROR_BODY = 110;
-
- /**
- * A transaction was rolled back.
- */
- public static final int TRANSACTION_ROLLED_BACK = 111;
-
- /**
- * The creation of a session was rejected by the server (e.g. if the
- * server is starting and has not finish to be initialized)
- */
- public static final int SESSION_CREATION_REJECTED = 112;
-
- /**
- * A DuplicateID was rejected.
- */
- public static final int DUPLICATE_ID_REJECTED = 113;
-
-
- // Native Error codes ----------------------------------------------
-
- /**
- * A internal error occured in the AIO native code
- */
- public static final int NATIVE_ERROR_INTERNAL = 200;
-
- /**
- * A buffer is invalid in the AIO native code
- */
- public static final int NATIVE_ERROR_INVALID_BUFFER = 201;
-
- /**
- * Alignment error in the AIO native code
- */
- public static final int NATIVE_ERROR_NOT_ALIGNED = 202;
-
- /**
- * AIO has not been properly initialized
- */
- public static final int NATIVE_ERROR_CANT_INITIALIZE_AIO = 203;
-
- /**
- * AIO has not been properly released
- */
- public static final int NATIVE_ERROR_CANT_RELEASE_AIO = 204;
-
- /**
- * A closed file has not be properly reopened
- */
- public static final int NATIVE_ERROR_CANT_OPEN_CLOSE_FILE = 205;
-
- /**
- * An error occured while allocating a queue in AIO native code
- */
- public static final int NATIVE_ERROR_CANT_ALLOCATE_QUEUE = 206;
-
- /**
- * An error occured while pre-allocating a file in AIO native code
- */
- public static final int NATIVE_ERROR_PREALLOCATE_FILE = 208;
-
- /**
- * An error occurred while allocating memory in the AIO native code
- */
- public static final int NATIVE_ERROR_ALLOCATE_MEMORY = 209;
-
- /**
- * AIO is full
- */
- public static final int NATIVE_ERROR_AIO_FULL = 211;
-
- private int code;
-
- public HornetQException()
- {
- }
-
- public HornetQException(final int code)
- {
- this.code = code;
- }
-
- public HornetQException(final int code, final String msg)
- {
- super(msg);
-
- this.code = code;
- }
-
- public HornetQException(final int code, final String msg, final Throwable cause)
- {
- super(msg, cause);
-
- this.code = code;
- }
-
- public int getCode()
- {
- return code;
- }
-
- @Override
- public String toString()
- {
- return "HornetQException[errorCode=" + code + " message=" + getMessage() + "]";
- }
-
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/api/core/Pair.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/api/core/Pair.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/api/core/Pair.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,84 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.api.core;
-
-import java.io.Serializable;
-
-/**
- *
- * A Pair is a holder for 2 objects.
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- */
-public class Pair<A, B> implements Serializable
-{
- private static final long serialVersionUID = -2496357457812368127L;
-
- public Pair(final A a, final B b)
- {
- this.a = a;
-
- this.b = b;
- }
-
- public A a;
-
- public B b;
-
- private int hash = -1;
-
- @Override
- public int hashCode()
- {
- if (hash == -1)
- {
- if (a == null && b == null)
- {
- return super.hashCode();
- }
- else
- {
- hash = (a == null ? 0 : a.hashCode()) + 37 * (b == null ? 0 : b.hashCode());
- }
- }
-
- return hash;
- }
-
- @Override
- public boolean equals(final Object other)
- {
- if (other == this)
- {
- return true;
- }
-
- if (other instanceof Pair == false)
- {
- return false;
- }
-
- Pair<A, B> pother = (Pair<A, B>)other;
-
- return (pother.a == null ? a == null : pother.a.equals(a)) && (pother.b == null ? b == null : pother.b.equals(b));
-
- }
-
- @Override
- public String toString()
- {
- return "Pair[a=" + a + ", b=" + b + "]";
- }
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/api/core/SimpleString.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/api/core/SimpleString.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/api/core/SimpleString.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,426 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.api.core;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hornetq.core.logging.Logger;
-import org.hornetq.utils.DataConstants;
-
-/**
- * A simple String class that can store all characters, and stores as simple byte[],
- * this minimises expensive copying between String objects.
- *
- * This object is used heavily throughout HornetQ for performance reasons.
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- */
-
-public class SimpleString implements CharSequence, Serializable, Comparable<SimpleString>
-{
- private static final long serialVersionUID = 4204223851422244307L;
-
- private static final Logger log = Logger.getLogger(SimpleString.class);
-
- // Attributes
- // ------------------------------------------------------------------------
- private final byte[] data;
-
- private transient int hash;
-
- // Cache the string
- private transient String str;
-
- // Static
- // ----------------------------------------------------------------------
-
- /**
- * Returns a SimpleString constructed from the <code>string</code> parameter.
- * If <code>string</code> is <code>null</code>, the return value will be <code>null</code> too.
- */
- public static SimpleString toSimpleString(final String string)
- {
- if (string == null)
- {
- return null;
- }
- return new SimpleString(string);
- }
-
- // Constructors
- // ----------------------------------------------------------------------
- /**
- * creates a SimpleString from a conventional String
- * @param string the string to transform
- */
- public SimpleString(final String string)
- {
- int len = string.length();
-
- data = new byte[len << 1];
-
- int j = 0;
-
- for (int i = 0; i < len; i++)
- {
- char c = string.charAt(i);
-
- byte low = (byte)(c & 0xFF); // low byte
-
- data[j++] = low;
-
- byte high = (byte)(c >> 8 & 0xFF); // high byte
-
- data[j++] = high;
- }
-
- str = string;
- }
-
- /**
- * creates a SimpleString from a byte array
- * @param data the byte array to use
- */
- public SimpleString(final byte[] data)
- {
- this.data = data;
- }
-
- // CharSequence implementation
- // ---------------------------------------------------------------------------
-
- public int length()
- {
- return data.length >> 1;
- }
-
- public char charAt(int pos)
- {
- if (pos < 0 || pos >= data.length >> 1)
- {
- throw new IndexOutOfBoundsException();
- }
- pos <<= 1;
-
- return (char)(data[pos] | data[pos + 1] << 8);
- }
-
- public CharSequence subSequence(final int start, final int end)
- {
- int len = data.length >> 1;
-
- if (end < start || start < 0 || end > len)
- {
- throw new IndexOutOfBoundsException();
- }
- else
- {
- int newlen = end - start << 1;
- byte[] bytes = new byte[newlen];
-
- System.arraycopy(data, start << 1, bytes, 0, newlen);
-
- return new SimpleString(bytes);
- }
- }
-
- // Comparable implementation -------------------------------------
-
- public int compareTo(final SimpleString o)
- {
- return toString().compareTo(o.toString());
- }
-
- // Public
- // ---------------------------------------------------------------------------
-
- /**
- * returns the underlying byte array of this SimpleString
- * @return the byte array
- */
- public byte[] getData()
- {
- return data;
- }
-
- /**
- * returns true if the SimpleString parameter starts with the same data as this one. false if not.
- * @param other the SimpelString to look for
- * @return true if this SimpleString starts with the same data
- */
- public boolean startsWith(final SimpleString other)
- {
- byte[] otherdata = other.data;
-
- if (otherdata.length > data.length)
- {
- return false;
- }
-
- for (int i = 0; i < otherdata.length; i++)
- {
- if (data[i] != otherdata[i])
- {
- return false;
- }
- }
-
- return true;
- }
-
- @Override
- public String toString()
- {
- if (str == null)
- {
- int len = data.length >> 1;
-
- char[] chars = new char[len];
-
- int j = 0;
-
- for (int i = 0; i < len; i++)
- {
- int low = data[j++] & 0xFF;
-
- int high = data[j++] << 8 & 0xFF00;
-
- chars[i] = (char)(low | high);
- }
-
- str = new String(chars);
- }
-
- return str;
- }
-
- @Override
- public boolean equals(final Object other)
- {
- if (this == other)
- {
- return true;
- }
-
- if (other instanceof SimpleString)
- {
- SimpleString s = (SimpleString)other;
-
- if (data.length != s.data.length)
- {
- return false;
- }
-
- for (int i = 0; i < data.length; i++)
- {
- if (data[i] != s.data[i])
- {
- return false;
- }
- }
-
- return true;
- }
- else
- {
- return false;
- }
- }
-
- @Override
- public int hashCode()
- {
- if (hash == 0)
- {
- int tmphash = 0;
- for (byte element : data)
- {
- tmphash = (tmphash << 5) - tmphash + element; // (hash << 5) - hash is same as hash * 31
- }
- hash = tmphash;
- }
-
- return hash;
- }
-
- /**
- * splits this SimpleString into an array of SimpleString using the char param as the delimeter.
- *
- * i.e. "a.b" would return "a" and "b" if . was the delimeter
- * @param delim
- */
- public SimpleString[] split(final char delim)
- {
- if (!contains(delim))
- {
- return new SimpleString[] { this };
- }
- else
- {
- List<SimpleString> all = new ArrayList<SimpleString>();
- int lasPos = 0;
- for (int i = 0; i < data.length; i += 2)
- {
- byte low = (byte)(delim & 0xFF); // low byte
- byte high = (byte)(delim >> 8 & 0xFF); // high byte
- if (data[i] == low && data[i + 1] == high)
- {
- byte[] bytes = new byte[i - lasPos];
- System.arraycopy(data, lasPos, bytes, 0, bytes.length);
- lasPos = i + 2;
- all.add(new SimpleString(bytes));
- }
- }
- byte[] bytes = new byte[data.length - lasPos];
- System.arraycopy(data, lasPos, bytes, 0, bytes.length);
- all.add(new SimpleString(bytes));
- SimpleString[] parts = new SimpleString[all.size()];
- return all.toArray(parts);
- }
- }
-
- /**
- * checks to see if this SimpleString contains the char parameter passed in
- *
- * @param c the char to check for
- * @return true if the char is found, false otherwise.
- */
- public boolean contains(final char c)
- {
- for (int i = 0; i < data.length; i += 2)
- {
- byte low = (byte)(c & 0xFF); // low byte
- byte high = (byte)(c >> 8 & 0xFF); // high byte
- if (data[i] == low && data[i + 1] == high)
- {
- return true;
- }
- }
- return false;
- }
-
- /**
- * concatanates a SimpleString and a String
- *
- * @param toAdd the String to concate with.
- * @return the concatanated SimpleString
- */
- public SimpleString concat(final String toAdd)
- {
- return concat(new SimpleString(toAdd));
- }
-
- /**
- * concatanates 2 SimpleString's
- *
- * @param toAdd the SimpleString to concate with.
- * @return the concatanated SimpleString
- */
- public SimpleString concat(final SimpleString toAdd)
- {
- byte[] bytes = new byte[data.length + toAdd.getData().length];
- System.arraycopy(data, 0, bytes, 0, data.length);
- System.arraycopy(toAdd.getData(), 0, bytes, data.length, toAdd.getData().length);
- return new SimpleString(bytes);
- }
-
- /**
- * concatanates a SimpleString and a char
- *
- * @param c the char to concate with.
- * @return the concatanated SimpleString
- */
- public SimpleString concat(final char c)
- {
- byte[] bytes = new byte[data.length + 2];
- System.arraycopy(data, 0, bytes, 0, data.length);
- bytes[data.length] = (byte)(c & 0xFF);
- bytes[data.length + 1] = (byte)(c >> 8 & 0xFF);
- return new SimpleString(bytes);
- }
-
- /**
- * returns the size of this SimpleString
- * @return the size
- */
- public int sizeof()
- {
- return DataConstants.SIZE_INT + data.length;
- }
-
- /**
- * returns the size of a SimpleString
- * @param str the SimpleString to check
- * @return the size
- */
- public static int sizeofString(final SimpleString str)
- {
- return str.sizeof();
- }
-
- /**
- * returns the size of a SimpleString which could be null
- * @param str the SimpleString to check
- * @return the size
- */
- public static int sizeofNullableString(final SimpleString str)
- {
- if (str == null)
- {
- return 1;
- }
- else
- {
- return 1 + str.sizeof();
- }
- }
-
- /**
- *
- * @param srcBegin
- * @param srcEnd
- * @param dst
- * @param dstBegin
- */
- public void getChars(final int srcBegin, final int srcEnd, final char dst[], final int dstBegin)
- {
- if (srcBegin < 0)
- {
- throw new StringIndexOutOfBoundsException(srcBegin);
- }
- if (srcEnd > length())
- {
- throw new StringIndexOutOfBoundsException(srcEnd);
- }
- if (srcBegin > srcEnd)
- {
- throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
- }
-
- int j = 0;
-
- for (int i = srcBegin; i < srcEnd - srcBegin; i++)
- {
- int low = data[j++] & 0xFF;
-
- int high = data[j++] << 8 & 0xFF00;
-
- dst[i] = (char)(low | high);
- }
- }
-
-}
\ No newline at end of file
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/buffers/impl/ChannelBufferWrapper.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,620 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.core.buffers.impl;
-
-import java.nio.ByteBuffer;
-
-import org.hornetq.api.core.HornetQBuffer;
-import org.hornetq.api.core.SimpleString;
-import org.hornetq.core.logging.Logger;
-import org.hornetq.utils.DataConstants;
-import org.hornetq.utils.UTF8Util;
-import org.jboss.netty.buffer.ChannelBuffer;
-
-/**
- *
- * A ChannelBufferWrapper
- *
- * @author Tim Fox
- *
- *
- */
-public class ChannelBufferWrapper implements HornetQBuffer
-{
- private static final Logger log = Logger.getLogger(ChannelBufferWrapper.class);
-
- protected ChannelBuffer buffer;
-
- public ChannelBufferWrapper(final ChannelBuffer buffer)
- {
- this.buffer = buffer;
- }
-
- public boolean readBoolean()
- {
- return readByte() != 0;
- }
-
- public SimpleString readNullableSimpleString()
- {
- int b = buffer.readByte();
- if (b == DataConstants.NULL)
- {
- return null;
- }
- else
- {
- return readSimpleStringInternal();
- }
- }
-
- public String readNullableString()
- {
- int b = buffer.readByte();
- if (b == DataConstants.NULL)
- {
- return null;
- }
- else
- {
- return readStringInternal();
- }
- }
-
- public SimpleString readSimpleString()
- {
- return readSimpleStringInternal();
- }
-
- private SimpleString readSimpleStringInternal()
- {
- int len = buffer.readInt();
- byte[] data = new byte[len];
- buffer.readBytes(data);
- return new SimpleString(data);
- }
-
- public String readString()
- {
- return readStringInternal();
- }
-
- private String readStringInternal()
- {
- int len = buffer.readInt();
-
- if (len < 9)
- {
- char[] chars = new char[len];
- for (int i = 0; i < len; i++)
- {
- chars[i] = (char)buffer.readShort();
- }
- return new String(chars);
- }
- else if (len < 0xfff)
- {
- return readUTF();
- }
- else
- {
- return readSimpleStringInternal().toString();
- }
- }
-
- public String readUTF()
- {
- return UTF8Util.readUTF(this);
- }
-
- public void writeBoolean(final boolean val)
- {
- buffer.writeByte((byte)(val ? -1 : 0));
- }
-
- public void writeNullableSimpleString(final SimpleString val)
- {
- if (val == null)
- {
- buffer.writeByte(DataConstants.NULL);
- }
- else
- {
- buffer.writeByte(DataConstants.NOT_NULL);
- writeSimpleStringInternal(val);
- }
- }
-
- public void writeNullableString(final String val)
- {
- if (val == null)
- {
- buffer.writeByte(DataConstants.NULL);
- }
- else
- {
- buffer.writeByte(DataConstants.NOT_NULL);
- writeStringInternal(val);
- }
- }
-
- public void writeSimpleString(final SimpleString val)
- {
- writeSimpleStringInternal(val);
- }
-
- private void writeSimpleStringInternal(final SimpleString val)
- {
- byte[] data = val.getData();
- buffer.writeInt(data.length);
- buffer.writeBytes(data);
- }
-
- public void writeString(final String val)
- {
- writeStringInternal(val);
- }
-
- private void writeStringInternal(final String val)
- {
- int length = val.length();
-
- buffer.writeInt(length);
-
- if (length < 9)
- {
- // If very small it's more performant to store char by char
- for (int i = 0; i < val.length(); i++)
- {
- buffer.writeShort((short)val.charAt(i));
- }
- }
- else if (length < 0xfff)
- {
- // Store as UTF - this is quicker than char by char for most strings
- writeUTF(val);
- }
- else
- {
- // Store as SimpleString, since can't store utf > 0xffff in length
- writeSimpleStringInternal(new SimpleString(val));
- }
- }
-
- public void writeUTF(final String utf)
- {
- UTF8Util.saveUTF(this, utf);
- }
-
- public int capacity()
- {
- return buffer.capacity();
- }
-
- public ChannelBuffer channelBuffer()
- {
- return buffer;
- }
-
- public void clear()
- {
- buffer.clear();
- }
-
- public HornetQBuffer copy()
- {
- return new ChannelBufferWrapper(buffer.copy());
- }
-
- public HornetQBuffer copy(final int index, final int length)
- {
- return new ChannelBufferWrapper(buffer.copy(index, length));
- }
-
- public void discardReadBytes()
- {
- buffer.discardReadBytes();
- }
-
- public HornetQBuffer duplicate()
- {
- return new ChannelBufferWrapper(buffer.duplicate());
- }
-
- public byte getByte(final int index)
- {
- return buffer.getByte(index);
- }
-
- public void getBytes(final int index, final byte[] dst, final int dstIndex, final int length)
- {
- buffer.getBytes(index, dst, dstIndex, length);
- }
-
- public void getBytes(final int index, final byte[] dst)
- {
- buffer.getBytes(index, dst);
- }
-
- public void getBytes(final int index, final ByteBuffer dst)
- {
- buffer.getBytes(index, dst);
- }
-
- public void getBytes(final int index, final HornetQBuffer dst, final int dstIndex, final int length)
- {
- buffer.getBytes(index, dst.channelBuffer(), dstIndex, length);
- }
-
- public void getBytes(final int index, final HornetQBuffer dst, final int length)
- {
- buffer.getBytes(index, dst.channelBuffer(), length);
- }
-
- public void getBytes(final int index, final HornetQBuffer dst)
- {
- buffer.getBytes(index, dst.channelBuffer());
- }
-
- public char getChar(final int index)
- {
- return (char)buffer.getShort(index);
- }
-
- public double getDouble(final int index)
- {
- return Double.longBitsToDouble(buffer.getLong(index));
- }
-
- public float getFloat(final int index)
- {
- return Float.intBitsToFloat(buffer.getInt(index));
- }
-
- public int getInt(final int index)
- {
- return buffer.getInt(index);
- }
-
- public long getLong(final int index)
- {
- return buffer.getLong(index);
- }
-
- public short getShort(final int index)
- {
- return buffer.getShort(index);
- }
-
- public short getUnsignedByte(final int index)
- {
- return buffer.getUnsignedByte(index);
- }
-
- public long getUnsignedInt(final int index)
- {
- return buffer.getUnsignedInt(index);
- }
-
- public int getUnsignedShort(final int index)
- {
- return buffer.getUnsignedShort(index);
- }
-
- public void markReaderIndex()
- {
- buffer.markReaderIndex();
- }
-
- public void markWriterIndex()
- {
- buffer.markWriterIndex();
- }
-
- public boolean readable()
- {
- return buffer.readable();
- }
-
- public int readableBytes()
- {
- return buffer.readableBytes();
- }
-
- public byte readByte()
- {
- return buffer.readByte();
- }
-
- public void readBytes(final byte[] dst, final int dstIndex, final int length)
- {
- buffer.readBytes(dst, dstIndex, length);
- }
-
- public void readBytes(final byte[] dst)
- {
- buffer.readBytes(dst);
- }
-
- public void readBytes(final ByteBuffer dst)
- {
- buffer.readBytes(dst);
- }
-
- public void readBytes(final HornetQBuffer dst, final int dstIndex, final int length)
- {
- buffer.readBytes(dst.channelBuffer(), dstIndex, length);
- }
-
- public void readBytes(final HornetQBuffer dst, final int length)
- {
- buffer.readBytes(dst.channelBuffer(), length);
- }
-
- public void readBytes(final HornetQBuffer dst)
- {
- buffer.readBytes(dst.channelBuffer());
- }
-
- public HornetQBuffer readBytes(final int length)
- {
- return new ChannelBufferWrapper(buffer.readBytes(length));
- }
-
- public char readChar()
- {
- return (char)buffer.readShort();
- }
-
- public double readDouble()
- {
- return Double.longBitsToDouble(buffer.readLong());
- }
-
- public int readerIndex()
- {
- return buffer.readerIndex();
- }
-
- public void readerIndex(final int readerIndex)
- {
- buffer.readerIndex(readerIndex);
- }
-
- public float readFloat()
- {
- return Float.intBitsToFloat(buffer.readInt());
- }
-
- public int readInt()
- {
- return buffer.readInt();
- }
-
- public long readLong()
- {
- return buffer.readLong();
- }
-
- public short readShort()
- {
- return buffer.readShort();
- }
-
- public HornetQBuffer readSlice(final int length)
- {
- return new ChannelBufferWrapper(buffer.readSlice(length));
- }
-
- public short readUnsignedByte()
- {
- return buffer.readUnsignedByte();
- }
-
- public long readUnsignedInt()
- {
- return buffer.readUnsignedInt();
- }
-
- public int readUnsignedShort()
- {
- return buffer.readUnsignedShort();
- }
-
- public void resetReaderIndex()
- {
- buffer.resetReaderIndex();
- }
-
- public void resetWriterIndex()
- {
- buffer.resetWriterIndex();
- }
-
- public void setByte(final int index, final byte value)
- {
- buffer.setByte(index, value);
- }
-
- public void setBytes(final int index, final byte[] src, final int srcIndex, final int length)
- {
- buffer.setBytes(index, src, srcIndex, length);
- }
-
- public void setBytes(final int index, final byte[] src)
- {
- buffer.setBytes(index, src);
- }
-
- public void setBytes(final int index, final ByteBuffer src)
- {
- buffer.setBytes(index, src);
- }
-
- public void setBytes(final int index, final HornetQBuffer src, final int srcIndex, final int length)
- {
- buffer.setBytes(index, src.channelBuffer(), srcIndex, length);
- }
-
- public void setBytes(final int index, final HornetQBuffer src, final int length)
- {
- buffer.setBytes(index, src.channelBuffer(), length);
- }
-
- public void setBytes(final int index, final HornetQBuffer src)
- {
- buffer.setBytes(index, src.channelBuffer());
- }
-
- public void setChar(final int index, final char value)
- {
- buffer.setShort(index, (short)value);
- }
-
- public void setDouble(final int index, final double value)
- {
- buffer.setLong(index, Double.doubleToLongBits(value));
- }
-
- public void setFloat(final int index, final float value)
- {
- buffer.setInt(index, Float.floatToIntBits(value));
- }
-
- public void setIndex(final int readerIndex, final int writerIndex)
- {
- buffer.setIndex(readerIndex, writerIndex);
- }
-
- public void setInt(final int index, final int value)
- {
- buffer.setInt(index, value);
- }
-
- public void setLong(final int index, final long value)
- {
- buffer.setLong(index, value);
- }
-
- public void setShort(final int index, final short value)
- {
- buffer.setShort(index, value);
- }
-
- public void skipBytes(final int length)
- {
- buffer.skipBytes(length);
- }
-
- public HornetQBuffer slice()
- {
- return new ChannelBufferWrapper(buffer.slice());
- }
-
- public HornetQBuffer slice(final int index, final int length)
- {
- return new ChannelBufferWrapper(buffer.slice(index, length));
- }
-
- public ByteBuffer toByteBuffer()
- {
- return buffer.toByteBuffer();
- }
-
- public ByteBuffer toByteBuffer(final int index, final int length)
- {
- return buffer.toByteBuffer(index, length);
- }
-
- public boolean writable()
- {
- return buffer.writable();
- }
-
- public int writableBytes()
- {
- return buffer.writableBytes();
- }
-
- public void writeByte(final byte value)
- {
- buffer.writeByte(value);
- }
-
- public void writeBytes(final byte[] src, final int srcIndex, final int length)
- {
- buffer.writeBytes(src, srcIndex, length);
- }
-
- public void writeBytes(final byte[] src)
- {
- buffer.writeBytes(src);
- }
-
- public void writeBytes(final ByteBuffer src)
- {
- buffer.writeBytes(src);
- }
-
- public void writeBytes(final HornetQBuffer src, final int srcIndex, final int length)
- {
- buffer.writeBytes(src.channelBuffer(), srcIndex, length);
- }
-
- public void writeBytes(final HornetQBuffer src, final int length)
- {
- buffer.writeBytes(src.channelBuffer(), length);
- }
-
- public void writeChar(final char chr)
- {
- buffer.writeShort((short)chr);
- }
-
- public void writeDouble(final double value)
- {
- buffer.writeLong(Double.doubleToLongBits(value));
- }
-
- public void writeFloat(final float value)
- {
- buffer.writeInt(Float.floatToIntBits(value));
- }
-
- public void writeInt(final int value)
- {
- buffer.writeInt(value);
- }
-
- public void writeLong(final long value)
- {
- buffer.writeLong(value);
- }
-
- public int writerIndex()
- {
- return buffer.writerIndex();
- }
-
- public void writerIndex(final int writerIndex)
- {
- buffer.writerIndex(writerIndex);
- }
-
- public void writeShort(final short value)
- {
- buffer.writeShort(value);
- }
-
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/core/server/HornetQComponent.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/server/HornetQComponent.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/server/HornetQComponent.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,32 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.core.server;
-
-/**
- * A HornetQComponent
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- * @version <tt>$Revision: 2796 $</tt>
- *
- * $Id: HornetQComponent.java 2796 2007-06-25 22:24:41Z timfox $
- *
- */
-public interface HornetQComponent
-{
- void start() throws Exception;
-
- void stop() throws Exception;
-
- boolean isStarted();
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/DataConstants.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/DataConstants.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/DataConstants.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,68 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.utils;
-
-/**
- *
- * A DataConstants
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- */
-public class DataConstants
-{
- public static final int SIZE_INT = 4;
-
- public static final int SIZE_BOOLEAN = 1;
-
- public static final int SIZE_LONG = 8;
-
- public static final int SIZE_BYTE = 1;
-
- public static final int SIZE_SHORT = 2;
-
- public static final int SIZE_DOUBLE = 8;
-
- public static final int SIZE_FLOAT = 4;
-
- public static final int SIZE_CHAR = 2;
-
- public static final byte TRUE = 1;
-
- public static final byte FALSE = 0;
-
- public static final byte NULL = 0;
-
- public static final byte NOT_NULL = 1;
-
- public static final byte BOOLEAN = 2;
-
- public static final byte BYTE = 3;
-
- public static final byte BYTES = 4;
-
- public static final byte SHORT = 5;
-
- public static final byte INT = 6;
-
- public static final byte LONG = 7;
-
- public static final byte FLOAT = 8;
-
- public static final byte DOUBLE = 9;
-
- public static final byte STRING = 10;
-
- public static final byte CHAR = 11;
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/utils/UTF8Util.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/utils/UTF8Util.java 2011-05-26 12:31:10 UTC (rev 10738)
+++ trunk/hornetq-core/src/main/java/org/hornetq/utils/UTF8Util.java 2011-05-26 12:50:50 UTC (rev 10739)
@@ -1,272 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.utils;
-
-import java.lang.ref.SoftReference;
-
-import org.hornetq.api.core.HornetQBuffer;
-import org.hornetq.core.logging.Logger;
-
-/**
- *
- * A UTF8Util
- *
- * This class will write UTFs directly to the ByteOutput (through the MessageBuffer interface)
- *
- * @author <a href="mailto:clebert.suconic@jboss.org">Clebert Suconic</a>
- *
- * Created Feb 20, 2009 1:37:18 PM
- *
- *
- */
-public class UTF8Util
-{
- static boolean optimizeStrings = true;
-
- private static final Logger log = Logger.getLogger(UTF8Util.class);
-
- private static final boolean isTrace = UTF8Util.log.isTraceEnabled();
-
- private static ThreadLocal<SoftReference<StringUtilBuffer>> currenBuffer = new ThreadLocal<SoftReference<StringUtilBuffer>>();
-
- public static void saveUTF(final HornetQBuffer out, final String str)
- {
- StringUtilBuffer buffer = UTF8Util.getThreadLocalBuffer();
-
- if (str.length() > 0xffff)
- {
- throw new IllegalArgumentException("the specified string is too long (" + str.length() + ")");
- }
-
- final int len = UTF8Util.calculateUTFSize(str, buffer);
-
- if (len > 0xffff)
- {
- throw new IllegalArgumentException("the encoded string is too long (" + len + ")");
- }
-
- out.writeShort((short)len);
-
- if (len > buffer.byteBuffer.length)
- {
- buffer.resizeByteBuffer(len);
- }
-
- if (len == (long)str.length())
- {
- for (int byteLocation = 0; byteLocation < len; byteLocation++)
- {
- buffer.byteBuffer[byteLocation] = (byte)buffer.charBuffer[byteLocation];
- }
- out.writeBytes(buffer.byteBuffer, 0, len);
- }
- else
- {
- if (UTF8Util.isTrace)
- {
- // This message is too verbose for debug, that's why we are using trace here
- UTF8Util.log.trace("Saving string with utfSize=" + len + " stringSize=" + str.length());
- }
-
- int stringLength = str.length();
-
- int charCount = 0;
-
- for (int i = 0; i < stringLength; i++)
- {
- char charAtPos = buffer.charBuffer[i];
- if (charAtPos >= 1 && charAtPos < 0x7f)
- {
- buffer.byteBuffer[charCount++] = (byte)charAtPos;
- }
- else if (charAtPos >= 0x800)
- {
- buffer.byteBuffer[charCount++] = (byte)(0xE0 | charAtPos >> 12 & 0x0F);
- buffer.byteBuffer[charCount++] = (byte)(0x80 | charAtPos >> 6 & 0x3F);
- buffer.byteBuffer[charCount++] = (byte)(0x80 | charAtPos >> 0 & 0x3F);
- }
- else
- {
- buffer.byteBuffer[charCount++] = (byte)(0xC0 | charAtPos >> 6 & 0x1F);
- buffer.byteBuffer[charCount++] = (byte)(0x80 | charAtPos >> 0 & 0x3F);
-
- }
- }
- out.writeBytes(buffer.byteBuffer, 0, len);
- }
- }
-
- public static String readUTF(final HornetQBuffer input)
- {
- StringUtilBuffer buffer = UTF8Util.getThreadLocalBuffer();
-
- final int size = input.readUnsignedShort();
-
- if (size > buffer.byteBuffer.length)
- {
- buffer.resizeByteBuffer(size);
- }
-
- if (size > buffer.charBuffer.length)
- {
- buffer.resizeCharBuffer(size);
- }
-
- if (UTF8Util.isTrace)
- {
- // This message is too verbose for debug, that's why we are using trace here
- UTF8Util.log.trace("Reading string with utfSize=" + size);
- }
-
- int count = 0;
- int byte1, byte2, byte3;
- int charCount = 0;
-
- input.readBytes(buffer.byteBuffer, 0, size);
-
- while (count < size)
- {
- byte1 = buffer.byteBuffer[count++];
-
- if (byte1 > 0 && byte1 <= 0x7F)
- {
- buffer.charBuffer[charCount++] = (char)byte1;
- }
- else
- {
- int c = byte1 & 0xff;
- switch (c >> 4)
- {
- case 0xc:
- case 0xd:
- byte2 = buffer.byteBuffer[count++];
- buffer.charBuffer[charCount++] = (char)((c & 0x1F) << 6 | byte2 & 0x3F);
- break;
- case 0xe:
- byte2 = buffer.byteBuffer[count++];
- byte3 = buffer.byteBuffer[count++];
- buffer.charBuffer[charCount++] = (char)((c & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F) << 0);
- break;
- }
- }
- }
-
- return new String(buffer.charBuffer, 0, charCount);
-
- }
-
- private static StringUtilBuffer getThreadLocalBuffer()
- {
- SoftReference<StringUtilBuffer> softReference = UTF8Util.currenBuffer.get();
- StringUtilBuffer value;
- if (softReference == null)
- {
- value = new StringUtilBuffer();
- softReference = new SoftReference<StringUtilBuffer>(value);
- UTF8Util.currenBuffer.set(softReference);
- }
- else
- {
- value = softReference.get();
- }
-
- if (value == null)
- {
- value = new StringUtilBuffer();
- softReference = new SoftReference<StringUtilBuffer>(value);
- UTF8Util.currenBuffer.set(softReference);
- }
-
- return value;
- }
-
- public static void clearBuffer()
- {
- SoftReference<StringUtilBuffer> ref = UTF8Util.currenBuffer.get();
- if (ref.get() != null)
- {
- ref.clear();
- }
- }
-
- public static int calculateUTFSize(final String str, final StringUtilBuffer stringBuffer)
- {
- int calculatedLen = 0;
-
- int stringLength = str.length();
-
- if (stringLength > stringBuffer.charBuffer.length)
- {
- stringBuffer.resizeCharBuffer(stringLength);
- }
-
- str.getChars(0, stringLength, stringBuffer.charBuffer, 0);
-
- for (int i = 0; i < stringLength; i++)
- {
- char c = stringBuffer.charBuffer[i];
-
- if (c >= 1 && c < 0x7f)
- {
- calculatedLen++;
- }
- else if (c >= 0x800)
- {
- calculatedLen += 3;
- }
- else
- {
- calculatedLen += 2;
- }
- }
- return calculatedLen;
- }
-
- private static class StringUtilBuffer
- {
-
- public char charBuffer[];
-
- public byte byteBuffer[];
-
- public void resizeCharBuffer(final int newSize)
- {
- if (newSize > charBuffer.length)
- {
- charBuffer = new char[newSize];
- }
- }
-
- public void resizeByteBuffer(final int newSize)
- {
- if (newSize > byteBuffer.length)
- {
- byteBuffer = new byte[newSize];
- }
- }
-
- public StringUtilBuffer()
- {
- this(1024, 1024);
- }
-
- public StringUtilBuffer(final int sizeChar, final int sizeByte)
- {
- charBuffer = new char[sizeChar];
- byteBuffer = new byte[sizeByte];
- }
-
- }
-
-}
13 years, 7 months
JBoss hornetq SVN: r10738 - in trunk: hornetq-commons/src/main/java/org/hornetq and 10 other directories.
by do-not-reply@jboss.org
Author: borges
Date: 2011-05-26 08:31:10 -0400 (Thu, 26 May 2011)
New Revision: 10738
Added:
trunk/hornetq-commons/hornetq-commons.iml
trunk/hornetq-commons/src/main/java/org/hornetq/core/
trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/
trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/Logger.java
trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/
trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java
trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java
trunk/hornetq-commons/src/main/java/org/hornetq/spi/
trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/
trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/
trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java
trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java
trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/package-info.java
Removed:
trunk/hornetq-commons/hornetq-logging.iml
trunk/hornetq-core/src/main/java/org/hornetq/core/logging/Logger.java
trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java
trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java
trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java
trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java
trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/package-info.java
Modified:
trunk/hornetq-commons/pom.xml
trunk/hornetq-core/pom.xml
Log:
HORNETQ-698 Move hq-core logging classes into hq-commons
Copied: trunk/hornetq-commons/hornetq-commons.iml (from rev 10736, trunk/hornetq-commons/hornetq-logging.iml)
===================================================================
--- trunk/hornetq-commons/hornetq-commons.iml (rev 0)
+++ trunk/hornetq-commons/hornetq-commons.iml 2011-05-26 12:31:10 UTC (rev 10738)
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module" module-name="hornetq-core" />
+ <orderEntry type="library" name="Maven: org.jboss.netty:netty:3.2.3.Final" level="project" />
+ <orderEntry type="library" name="Maven: log4j:log4j:1.2.14" level="project" />
+ </component>
+</module>
+
Deleted: trunk/hornetq-commons/hornetq-logging.iml
===================================================================
--- trunk/hornetq-commons/hornetq-logging.iml 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-commons/hornetq-logging.iml 2011-05-26 12:31:10 UTC (rev 10738)
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
- <output url="file://$MODULE_DIR$/target/classes" />
- <output-test url="file://$MODULE_DIR$/target/test-classes" />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
- <excludeFolder url="file://$MODULE_DIR$/target" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module" module-name="hornetq-core" />
- <orderEntry type="library" name="Maven: org.jboss.netty:netty:3.2.3.Final" level="project" />
- <orderEntry type="library" name="Maven: log4j:log4j:1.2.14" level="project" />
- </component>
-</module>
-
Modified: trunk/hornetq-commons/pom.xml
===================================================================
--- trunk/hornetq-commons/pom.xml 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-commons/pom.xml 2011-05-26 12:31:10 UTC (rev 10738)
@@ -14,9 +14,8 @@
<dependencies>
<dependency>
- <groupId>org.hornetq</groupId>
- <artifactId>hornetq-core</artifactId>
- <version>${project.version}</version>
+ <groupId>org.jboss.netty</groupId>
+ <artifactId>netty</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/Logger.java (from rev 10732, trunk/hornetq-core/src/main/java/org/hornetq/core/logging/Logger.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/Logger.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/Logger.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -0,0 +1,212 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.core.logging;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.hornetq.core.logging.impl.JULLogDelegateFactory;
+import org.hornetq.spi.core.logging.LogDelegate;
+import org.hornetq.spi.core.logging.LogDelegateFactory;
+
+/**
+ *
+ * A Logger
+ *
+ * This class allows us to isolate all our logging dependencies in one place
+ *
+ * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
+ *
+ */
+public class Logger
+{
+ public static final String LOGGER_DELEGATE_FACTORY_CLASS_NAME = "org.hornetq.logger-delegate-factory-class-name";
+
+ private static volatile LogDelegateFactory delegateFactory;
+
+ private static final ConcurrentMap<Class<?>, Logger> loggers = new ConcurrentHashMap<Class<?>, Logger>();
+
+ static
+ {
+ Logger.initialise();
+ }
+
+ public static synchronized void setDelegateFactory(final LogDelegateFactory delegateFactory)
+ {
+ Logger.clear();
+
+ Logger.delegateFactory = delegateFactory;
+ }
+
+ private static void clear()
+ {
+ Logger.loggers.clear();
+ }
+
+ public static synchronized void reset()
+ {
+ Logger.clear();
+
+ Logger.initialise();
+ }
+
+ public static synchronized void initialise()
+ {
+ LogDelegateFactory delegateFactory;
+
+ // If a system property is specified then this overrides any delegate factory which is set
+ // programmatically - this is primarily of use so we can configure the logger delegate on the client side.
+ // call to System.getProperty is wrapped in a try block as it will fail if the client runs in a secured
+ // environment
+ String className = JULLogDelegateFactory.class.getName();
+ try
+ {
+ className = System.getProperty(Logger.LOGGER_DELEGATE_FACTORY_CLASS_NAME);
+ }
+ catch (Exception e)
+ {
+ }
+
+ if (className != null)
+ {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ try
+ {
+ Class<?> clz = loader.loadClass(className);
+ delegateFactory = (LogDelegateFactory)clz.newInstance();
+ }
+ catch (Exception e)
+ {
+ throw new IllegalArgumentException("Error instantiating transformer class \"" + className + "\"", e);
+ }
+ }
+ else
+ {
+ delegateFactory = new JULLogDelegateFactory();
+ }
+
+ Logger.delegateFactory = delegateFactory;
+
+ Logger.loggers.clear();
+ }
+
+ public static Logger getLogger(final Class<?> clazz)
+ {
+ Logger logger = Logger.loggers.get(clazz);
+
+ if (logger == null)
+ {
+ LogDelegate delegate = Logger.delegateFactory.createDelegate(clazz);
+
+ logger = new Logger(delegate);
+
+ Logger oldLogger = Logger.loggers.putIfAbsent(clazz, logger);
+
+ if (oldLogger != null)
+ {
+ logger = oldLogger;
+ }
+ }
+
+ return logger;
+ }
+
+ private final LogDelegate delegate;
+
+ Logger(final LogDelegate delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ public LogDelegate getDelegate()
+ {
+ return delegate;
+ }
+
+ public boolean isInfoEnabled()
+ {
+ return delegate.isInfoEnabled();
+ }
+
+ public boolean isDebugEnabled()
+ {
+ return delegate.isDebugEnabled();
+ }
+
+ public boolean isTraceEnabled()
+ {
+ return delegate.isTraceEnabled();
+ }
+
+ public void fatal(final Object message)
+ {
+ delegate.fatal(message);
+ }
+
+ public void fatal(final Object message, final Throwable t)
+ {
+ delegate.fatal(message, t);
+ }
+
+ public void error(final Object message)
+ {
+ delegate.error(message);
+ }
+
+ public void error(final Object message, final Throwable t)
+ {
+ delegate.error(message, t);
+ }
+
+ public void warn(final Object message)
+ {
+ delegate.warn(message);
+ }
+
+ public void warn(final Object message, final Throwable t)
+ {
+ delegate.warn(message, t);
+ }
+
+ public void info(final Object message)
+ {
+ delegate.info(message);
+ }
+
+ public void info(final Object message, final Throwable t)
+ {
+ delegate.info(message, t);
+ }
+
+ public void debug(final Object message)
+ {
+ delegate.debug(message);
+ }
+
+ public void debug(final Object message, final Throwable t)
+ {
+ delegate.debug(message, t);
+ }
+
+ public void trace(final Object message)
+ {
+ delegate.trace(message);
+ }
+
+ public void trace(final Object message, final Throwable t)
+ {
+ delegate.trace(message, t);
+ }
+
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java (from rev 10732, trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.core.logging.impl;
+
+import java.util.logging.Level;
+
+import org.hornetq.spi.core.logging.LogDelegate;
+
+/**
+ *
+ * A {@link LogDelegate} which delegates to java.util.logging
+ *
+ * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
+ *
+ */
+public class JULLogDelegate implements LogDelegate
+{
+ private final java.util.logging.Logger logger;
+
+ JULLogDelegate(final Class<?> clazz)
+ {
+ logger = java.util.logging.Logger.getLogger(clazz.getName());
+ }
+
+ public boolean isInfoEnabled()
+ {
+ return logger.isLoggable(Level.INFO);
+ }
+
+ public boolean isDebugEnabled()
+ {
+ return logger.isLoggable(Level.FINE);
+ }
+
+ public boolean isTraceEnabled()
+ {
+ return logger.isLoggable(Level.FINEST);
+ }
+
+ public void fatal(final Object message)
+ {
+ logger.log(Level.SEVERE, message == null ? "NULL" : message.toString());
+ }
+
+ public void fatal(final Object message, final Throwable t)
+ {
+ logger.log(Level.SEVERE, message == null ? "NULL" : message.toString(), t);
+ }
+
+ public void error(final Object message)
+ {
+ logger.log(Level.SEVERE, message == null ? "NULL" : message.toString());
+ }
+
+ public void error(final Object message, final Throwable t)
+ {
+ logger.log(Level.SEVERE, message == null ? "NULL" : message.toString(), t);
+ }
+
+ public void warn(final Object message)
+ {
+ logger.log(Level.WARNING, message == null ? "NULL" : message.toString());
+ }
+
+ public void warn(final Object message, final Throwable t)
+ {
+ logger.log(Level.WARNING, message == null ? "NULL" : message.toString(), t);
+ }
+
+ public void info(final Object message)
+ {
+ logger.log(Level.INFO, message == null ? "NULL" : message.toString());
+ }
+
+ public void info(final Object message, final Throwable t)
+ {
+ logger.log(Level.INFO, message == null ? "NULL" : message.toString(), t);
+ }
+
+ public void debug(final Object message)
+ {
+ logger.log(Level.FINE, message == null ? "NULL" : message.toString());
+ }
+
+ public void debug(final Object message, final Throwable t)
+ {
+ logger.log(Level.FINE, message == null ? "NULL" : message.toString(), t);
+ }
+
+ public void trace(final Object message)
+ {
+ logger.log(Level.FINEST, message == null ? "NULL" : message.toString());
+ }
+
+ public void trace(final Object message, final Throwable t)
+ {
+ logger.log(Level.FINEST, message == null ? "NULL" : message.toString(), t);
+ }
+
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java (from rev 10732, trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.core.logging.impl;
+
+import org.hornetq.spi.core.logging.LogDelegate;
+import org.hornetq.spi.core.logging.LogDelegateFactory;
+
+/**
+ * A {@link LogDelegateFactory} which creates {@link JULLogDelegate} instances.
+ *
+ * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
+ *
+ *
+ */
+public class JULLogDelegateFactory implements LogDelegateFactory
+{
+ public LogDelegate createDelegate(final Class<?> clazz)
+ {
+ return new JULLogDelegate(clazz);
+ }
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java (from rev 10732, trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.spi.core.logging;
+
+/**
+ * I represent operations that are delegated to underlying logging frameworks.
+ *
+ * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
+ *
+ *
+ */
+public interface LogDelegate
+{
+ boolean isInfoEnabled();
+
+ boolean isDebugEnabled();
+
+ boolean isTraceEnabled();
+
+ void fatal(Object message);
+
+ void fatal(Object message, Throwable t);
+
+ void error(Object message);
+
+ void error(Object message, Throwable t);
+
+ void warn(Object message);
+
+ void warn(Object message, Throwable t);
+
+ void info(Object message);
+
+ void info(Object message, Throwable t);
+
+ void debug(Object message);
+
+ void debug(Object message, Throwable t);
+
+ void trace(Object message);
+
+ void trace(Object message, Throwable t);
+}
\ No newline at end of file
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java (from rev 10732, trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.hornetq.spi.core.logging;
+
+/**
+ * I am responsible for creating {@link LogDelegate} instances.
+ *
+ * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
+ *
+ *
+ */
+public interface LogDelegateFactory
+{
+ LogDelegate createDelegate(Class<?> clazz);
+}
Copied: trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/package-info.java (from rev 10732, trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/package-info.java)
===================================================================
--- trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/package-info.java (rev 0)
+++ trunk/hornetq-commons/src/main/java/org/hornetq/spi/core/logging/package-info.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2009 Red Hat, Inc.
+ * Red Hat 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.
+ */
+
+/**
+ * Logging SPI.
+ * <br>
+ * This package defines the Service Provide Interface to
+ * support different logging implementation.
+ */
+package org.hornetq.spi.core.logging;
+
Modified: trunk/hornetq-core/pom.xml
===================================================================
--- trunk/hornetq-core/pom.xml 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-core/pom.xml 2011-05-26 12:31:10 UTC (rev 10738)
@@ -14,6 +14,11 @@
<dependencies>
<dependency>
+ <groupId>org.hornetq</groupId>
+ <artifactId>hornetq-commons</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
</dependency>
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/core/logging/Logger.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/logging/Logger.java 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/logging/Logger.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -1,212 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.core.logging;
-
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.hornetq.core.logging.impl.JULLogDelegateFactory;
-import org.hornetq.spi.core.logging.LogDelegate;
-import org.hornetq.spi.core.logging.LogDelegateFactory;
-
-/**
- *
- * A Logger
- *
- * This class allows us to isolate all our logging dependencies in one place
- *
- * @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
- *
- */
-public class Logger
-{
- public static final String LOGGER_DELEGATE_FACTORY_CLASS_NAME = "org.hornetq.logger-delegate-factory-class-name";
-
- private static volatile LogDelegateFactory delegateFactory;
-
- private static final ConcurrentMap<Class<?>, Logger> loggers = new ConcurrentHashMap<Class<?>, Logger>();
-
- static
- {
- Logger.initialise();
- }
-
- public static synchronized void setDelegateFactory(final LogDelegateFactory delegateFactory)
- {
- Logger.clear();
-
- Logger.delegateFactory = delegateFactory;
- }
-
- private static void clear()
- {
- Logger.loggers.clear();
- }
-
- public static synchronized void reset()
- {
- Logger.clear();
-
- Logger.initialise();
- }
-
- public static synchronized void initialise()
- {
- LogDelegateFactory delegateFactory;
-
- // If a system property is specified then this overrides any delegate factory which is set
- // programmatically - this is primarily of use so we can configure the logger delegate on the client side.
- // call to System.getProperty is wrapped in a try block as it will fail if the client runs in a secured
- // environment
- String className = JULLogDelegateFactory.class.getName();
- try
- {
- className = System.getProperty(Logger.LOGGER_DELEGATE_FACTORY_CLASS_NAME);
- }
- catch (Exception e)
- {
- }
-
- if (className != null)
- {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- try
- {
- Class<?> clz = loader.loadClass(className);
- delegateFactory = (LogDelegateFactory)clz.newInstance();
- }
- catch (Exception e)
- {
- throw new IllegalArgumentException("Error instantiating transformer class \"" + className + "\"", e);
- }
- }
- else
- {
- delegateFactory = new JULLogDelegateFactory();
- }
-
- Logger.delegateFactory = delegateFactory;
-
- Logger.loggers.clear();
- }
-
- public static Logger getLogger(final Class<?> clazz)
- {
- Logger logger = Logger.loggers.get(clazz);
-
- if (logger == null)
- {
- LogDelegate delegate = Logger.delegateFactory.createDelegate(clazz);
-
- logger = new Logger(delegate);
-
- Logger oldLogger = Logger.loggers.putIfAbsent(clazz, logger);
-
- if (oldLogger != null)
- {
- logger = oldLogger;
- }
- }
-
- return logger;
- }
-
- private final LogDelegate delegate;
-
- Logger(final LogDelegate delegate)
- {
- this.delegate = delegate;
- }
-
- public LogDelegate getDelegate()
- {
- return delegate;
- }
-
- public boolean isInfoEnabled()
- {
- return delegate.isInfoEnabled();
- }
-
- public boolean isDebugEnabled()
- {
- return delegate.isDebugEnabled();
- }
-
- public boolean isTraceEnabled()
- {
- return delegate.isTraceEnabled();
- }
-
- public void fatal(final Object message)
- {
- delegate.fatal(message);
- }
-
- public void fatal(final Object message, final Throwable t)
- {
- delegate.fatal(message, t);
- }
-
- public void error(final Object message)
- {
- delegate.error(message);
- }
-
- public void error(final Object message, final Throwable t)
- {
- delegate.error(message, t);
- }
-
- public void warn(final Object message)
- {
- delegate.warn(message);
- }
-
- public void warn(final Object message, final Throwable t)
- {
- delegate.warn(message, t);
- }
-
- public void info(final Object message)
- {
- delegate.info(message);
- }
-
- public void info(final Object message, final Throwable t)
- {
- delegate.info(message, t);
- }
-
- public void debug(final Object message)
- {
- delegate.debug(message);
- }
-
- public void debug(final Object message, final Throwable t)
- {
- delegate.debug(message, t);
- }
-
- public void trace(final Object message)
- {
- delegate.trace(message);
- }
-
- public void trace(final Object message, final Throwable t)
- {
- delegate.trace(message, t);
- }
-
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegate.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -1,111 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.core.logging.impl;
-
-import java.util.logging.Level;
-
-import org.hornetq.spi.core.logging.LogDelegate;
-
-/**
- *
- * A {@link LogDelegate} which delegates to java.util.logging
- *
- * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
- *
- */
-public class JULLogDelegate implements LogDelegate
-{
- private final java.util.logging.Logger logger;
-
- JULLogDelegate(final Class<?> clazz)
- {
- logger = java.util.logging.Logger.getLogger(clazz.getName());
- }
-
- public boolean isInfoEnabled()
- {
- return logger.isLoggable(Level.INFO);
- }
-
- public boolean isDebugEnabled()
- {
- return logger.isLoggable(Level.FINE);
- }
-
- public boolean isTraceEnabled()
- {
- return logger.isLoggable(Level.FINEST);
- }
-
- public void fatal(final Object message)
- {
- logger.log(Level.SEVERE, message == null ? "NULL" : message.toString());
- }
-
- public void fatal(final Object message, final Throwable t)
- {
- logger.log(Level.SEVERE, message == null ? "NULL" : message.toString(), t);
- }
-
- public void error(final Object message)
- {
- logger.log(Level.SEVERE, message == null ? "NULL" : message.toString());
- }
-
- public void error(final Object message, final Throwable t)
- {
- logger.log(Level.SEVERE, message == null ? "NULL" : message.toString(), t);
- }
-
- public void warn(final Object message)
- {
- logger.log(Level.WARNING, message == null ? "NULL" : message.toString());
- }
-
- public void warn(final Object message, final Throwable t)
- {
- logger.log(Level.WARNING, message == null ? "NULL" : message.toString(), t);
- }
-
- public void info(final Object message)
- {
- logger.log(Level.INFO, message == null ? "NULL" : message.toString());
- }
-
- public void info(final Object message, final Throwable t)
- {
- logger.log(Level.INFO, message == null ? "NULL" : message.toString(), t);
- }
-
- public void debug(final Object message)
- {
- logger.log(Level.FINE, message == null ? "NULL" : message.toString());
- }
-
- public void debug(final Object message, final Throwable t)
- {
- logger.log(Level.FINE, message == null ? "NULL" : message.toString(), t);
- }
-
- public void trace(final Object message)
- {
- logger.log(Level.FINEST, message == null ? "NULL" : message.toString());
- }
-
- public void trace(final Object message, final Throwable t)
- {
- logger.log(Level.FINEST, message == null ? "NULL" : message.toString(), t);
- }
-
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-core/src/main/java/org/hornetq/core/logging/impl/JULLogDelegateFactory.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -1,32 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.core.logging.impl;
-
-import org.hornetq.spi.core.logging.LogDelegate;
-import org.hornetq.spi.core.logging.LogDelegateFactory;
-
-/**
- * A {@link LogDelegateFactory} which creates {@link JULLogDelegate} instances.
- *
- * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
- *
- *
- */
-public class JULLogDelegateFactory implements LogDelegateFactory
-{
- public LogDelegate createDelegate(final Class<?> clazz)
- {
- return new JULLogDelegate(clazz);
- }
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegate.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -1,54 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.spi.core.logging;
-
-/**
- * I represent operations that are delegated to underlying logging frameworks.
- *
- * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
- *
- *
- */
-public interface LogDelegate
-{
- boolean isInfoEnabled();
-
- boolean isDebugEnabled();
-
- boolean isTraceEnabled();
-
- void fatal(Object message);
-
- void fatal(Object message, Throwable t);
-
- void error(Object message);
-
- void error(Object message, Throwable t);
-
- void warn(Object message);
-
- void warn(Object message, Throwable t);
-
- void info(Object message);
-
- void info(Object message, Throwable t);
-
- void debug(Object message);
-
- void debug(Object message, Throwable t);
-
- void trace(Object message);
-
- void trace(Object message, Throwable t);
-}
\ No newline at end of file
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/LogDelegateFactory.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -1,26 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.hornetq.spi.core.logging;
-
-/**
- * I am responsible for creating {@link LogDelegate} instances.
- *
- * @author <a href="kenny.macleod(a)kizoom.com">Kenny MacLeod</a>
- *
- *
- */
-public interface LogDelegateFactory
-{
- LogDelegate createDelegate(Class<?> clazz);
-}
Deleted: trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/package-info.java
===================================================================
--- trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/package-info.java 2011-05-26 12:28:45 UTC (rev 10737)
+++ trunk/hornetq-core/src/main/java/org/hornetq/spi/core/logging/package-info.java 2011-05-26 12:31:10 UTC (rev 10738)
@@ -1,21 +0,0 @@
-/*
- * Copyright 2009 Red Hat, Inc.
- * Red Hat 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.
- */
-
-/**
- * Logging SPI.
- * <br>
- * This package defines the Service Provide Interface to
- * support different logging implementation.
- */
-package org.hornetq.spi.core.logging;
-
13 years, 7 months