├── .travis.yml ├── Dockerfile ├── Dockerfile-cassandra ├── Dockerfile-redis ├── FAQ.txt ├── LICENSE.txt ├── NOTICE.txt ├── README.txt ├── RELEASE.txt ├── WebContent ├── META-INF │ └── MANIFEST.MF └── WEB-INF │ ├── global.css │ └── web.xml ├── assembly.xml ├── bin ├── cmb.sh └── travisci_setup.sh ├── config ├── WEB-INF-CNS │ ├── context.xml │ └── web.xml ├── WEB-INF-CQS │ ├── context.xml │ └── web.xml ├── cmb.properties ├── log4j.properties └── test.log4j.properties ├── docker ├── cmb │ ├── bin │ │ └── start.sh │ └── cmb.properties.template ├── docker-compose.yml └── redis │ └── redis.conf ├── docs ├── xcal-CNSArchitecture-210912-1546-6.pdf ├── xcal-CNSProductRequirements-210912-1548-10.pdf ├── xcal-CQSArchitecture-210912-1545-4.pdf └── xcal-CQSProductRequirements-210912-1548-8.pdf ├── examples ├── java │ └── Example.java └── ruby │ ├── .gitignore │ ├── Gemfile │ └── example.rb ├── packaging ├── common │ └── log4j.properties ├── linux │ ├── centos │ │ ├── cmb.init │ │ └── cmb.spec │ └── debian │ │ └── cmb └── vagrant │ ├── cmbbase │ ├── Vagrantfile │ └── bootstrap.sh │ └── cmbcluster │ └── Vagrantfile ├── pom.xml ├── schema ├── cassandra_1.0.schema ├── cassandra_1.1.schema ├── cassandra_1.2.cql.schema └── cassandra_1.2.schema ├── settings.xml ├── src └── com │ └── comcast │ ├── cmb │ └── common │ │ ├── controller │ │ ├── Action.java │ │ ├── AdminServlet.java │ │ ├── AdminServletBase.java │ │ ├── CMB.java │ │ ├── CMBControllerServlet.java │ │ ├── CMBStatsServlet.java │ │ ├── CMBVisualizerServlet.java │ │ ├── EndpointServlet.java │ │ ├── HealthCheckShallow.java │ │ ├── UserLoginPageServlet.java │ │ └── UserPageServlet.java │ │ ├── model │ │ ├── CMBCondition.java │ │ ├── CMBPolicy.java │ │ ├── CMBStatement.java │ │ ├── IAuthModule.java │ │ ├── IPermission.java │ │ ├── ReceiptModule.java │ │ ├── User.java │ │ └── UserAuthModule.java │ │ ├── persistence │ │ ├── AbstractDurablePersistence.java │ │ ├── CassandraAstyanaxPersistence.java │ │ ├── CassandraHectorPersistence.java │ │ ├── DurablePersistenceFactory.java │ │ ├── IPermissionPersistence.java │ │ ├── IUserPersistence.java │ │ ├── PersistenceFactory.java │ │ └── UserCassandraPersistence.java │ │ └── util │ │ ├── AuthUtil.java │ │ ├── AuthenticationException.java │ │ ├── CMBErrorCodes.java │ │ ├── CMBException.java │ │ ├── CMBPatternLayout.java │ │ ├── CMBProperties.java │ │ ├── ExpiringCache.java │ │ ├── PersistenceException.java │ │ ├── RollingWindowCapture.java │ │ ├── Util.java │ │ ├── ValueAccumulator.java │ │ └── XmlUtil.java │ ├── cns │ ├── controller │ │ ├── CNSAction.java │ │ ├── CNSAddPermissionAction.java │ │ ├── CNSCache.java │ │ ├── CNSConfirmSubscriptionAction.java │ │ ├── CNSControllerServlet.java │ │ ├── CNSCreateTopicAction.java │ │ ├── CNSDeleteTopicAction.java │ │ ├── CNSEditSubscriptionDeliveryPolicyPage.java │ │ ├── CNSEditTopicDeliveryPolicyPage.java │ │ ├── CNSEditTopicDisplayNamePage.java │ │ ├── CNSGetAPIStatsAction.java │ │ ├── CNSGetSubscriptionAttributesAction.java │ │ ├── CNSGetTopicAttributesAction.java │ │ ├── CNSGetWorkerStatsAction.java │ │ ├── CNSListSubscriptionsAction.java │ │ ├── CNSListSubscriptionsByTopicAction.java │ │ ├── CNSListTopicsAction.java │ │ ├── CNSManageServiceAction.java │ │ ├── CNSMonitor.java │ │ ├── CNSMonitorMBean.java │ │ ├── CNSPublishAction.java │ │ ├── CNSPublishToTopicPageServlet.java │ │ ├── CNSRawMessageDeliveryPolicyPage.java │ │ ├── CNSRemovePermissionAction.java │ │ ├── CNSSetSubscriptionAttributesAction.java │ │ ├── CNSSetTopicAttributesAction.java │ │ ├── CNSSubscribeAction.java │ │ ├── CNSSubscriptionPageServlet.java │ │ ├── CNSTopicAddPermissionPage.java │ │ ├── CNSTopicPermissionPage.java │ │ ├── CNSUnsubscribeAction.java │ │ ├── CNSUserPageServlet.java │ │ └── CNSWorkerStatePageServlet.java │ ├── io │ │ ├── AbstractEndpointPublisher.java │ │ ├── CNSAttributePopulator.java │ │ ├── CNSPopulator.java │ │ ├── CNSSubscriptionPopulator.java │ │ ├── CNSTopicPopulator.java │ │ ├── CNSWorkerStatsPopulator.java │ │ ├── CQSEndpointPublisher.java │ │ ├── CommunicationUtils.java │ │ ├── EmailEndpointPublisher.java │ │ ├── EmailJsonEndpointPublisher.java │ │ ├── EndpointAsyncPublisherWrapper.java │ │ ├── EndpointPublisherFactory.java │ │ ├── HTTPEndpointAsyncPublisher.java │ │ ├── HTTPEndpointSyncPublisher.java │ │ ├── IEndpointPublisher.java │ │ ├── IPublisherCallback.java │ │ ├── RedisPubSubEndpointPublisher.java │ │ └── SQSEndpointPublisher.java │ ├── model │ │ ├── CNSEndpointPublishJob.java │ │ ├── CNSMessage.java │ │ ├── CNSModelConstructionException.java │ │ ├── CNSRetryPolicy.java │ │ ├── CNSSubscription.java │ │ ├── CNSSubscriptionAttributes.java │ │ ├── CNSSubscriptionDeliveryPolicy.java │ │ ├── CNSThrottlePolicy.java │ │ ├── CNSTopic.java │ │ ├── CNSTopicAttributes.java │ │ ├── CNSTopicDeliveryPolicy.java │ │ └── CNSWorkerStats.java │ ├── persistence │ │ ├── CNSAttributesCassandraPersistence.java │ │ ├── CNSCachedEndpointPublishJob.java │ │ ├── CNSSubscriptionCassandraPersistence.java │ │ ├── CNSTopicCassandraPersistence.java │ │ ├── ICNSAttributesPersistence.java │ │ ├── ICNSSubscriptionPersistence.java │ │ ├── ICNSTopicPersistence.java │ │ ├── SubscriberNotFoundException.java │ │ └── TopicNotFoundException.java │ ├── tools │ │ ├── CNSAsyncPublishJob.java │ │ ├── CNSEndpointPublisherJobConsumer.java │ │ ├── CNSEndpointPublisherJobProducer.java │ │ ├── CNSPublishJob.java │ │ ├── CNSPublisher.java │ │ ├── CNSPublisherJobThread.java │ │ ├── CNSPublisherPartitionRunnable.java │ │ ├── CNSWorkerMonitor.java │ │ ├── CNSWorkerMonitorMBean.java │ │ └── CQSHandler.java │ └── util │ │ ├── CNSErrorCodes.java │ │ ├── CNSWorkerStatWrapper.java │ │ ├── MailWrapper.java │ │ └── Util.java │ └── cqs │ ├── api │ └── CQSAPI.java │ ├── controller │ ├── CQSAPIStatePageServlet.java │ ├── CQSAction.java │ ├── CQSAddPermissionAction.java │ ├── CQSAddQueuePermissionPage.java │ ├── CQSCache.java │ ├── CQSChangeMessageVisibilityAction.java │ ├── CQSChangeMessageVisibilityBatchAction.java │ ├── CQSControllerServlet.java │ ├── CQSCreateQueueAction.java │ ├── CQSDeleteMessageAction.java │ ├── CQSDeleteMessageBatchAction.java │ ├── CQSDeleteQueueAction.java │ ├── CQSEditQueueAttributePage.java │ ├── CQSGetAPIStatsAction.java │ ├── CQSGetQueueAttributesAction.java │ ├── CQSGetQueueUrlAction.java │ ├── CQSHttpServletRequest.java │ ├── CQSListQueuesAction.java │ ├── CQSLongPollReceiver.java │ ├── CQSLongPollSender.java │ ├── CQSManageServiceAction.java │ ├── CQSMonitor.java │ ├── CQSMonitorMBean.java │ ├── CQSPeekMessageAction.java │ ├── CQSPurgeQueueAction.java │ ├── CQSQueueMessagesPageServlet.java │ ├── CQSQueuePermissionsPage.java │ ├── CQSReceiveMessageAction.java │ ├── CQSReceiveMessageBodyAction.java │ ├── CQSRemovePermissionAction.java │ ├── CQSSendMessageAction.java │ ├── CQSSendMessageBatchAction.java │ ├── CQSSetQueueAttributesAction.java │ └── CQSUserPageServlet.java │ ├── io │ ├── CQSAPIStatsPopulator.java │ ├── CQSMessagePopulator.java │ ├── CQSPopulator.java │ └── CQSQueuePopulator.java │ ├── model │ ├── CQSAPIStats.java │ ├── CQSBatchResultErrorEntry.java │ ├── CQSMessage.java │ ├── CQSMessageAttribute.java │ └── CQSQueue.java │ ├── persistence │ ├── CQSMessagePartitionedCassandraPersistence.java │ ├── CQSQueueCassandraPersistence.java │ ├── ICQSMessagePersistence.java │ ├── ICQSQueuePersistence.java │ ├── RedisCachedCassandraPersistence.java │ └── RedisSortedSetPersistence.java │ └── util │ ├── CQSAPIStatWrapper.java │ ├── CQSConstants.java │ ├── CQSErrorCodes.java │ ├── RandomNumberCollection.java │ └── Util.java └── tests └── com └── comcast ├── cmb └── test │ ├── common │ ├── model │ │ └── unit │ │ │ ├── CMBPolicyTest.java │ │ │ ├── ReceiptModuleTest.java │ │ │ └── UserAuthModuleTest.java │ └── util │ │ └── unit │ │ ├── AuthUtilTest.java │ │ ├── ExpiringCacheTest.java │ │ ├── RollingWindowCaptureTest.java │ │ ├── TimeAccumulatorTest.java │ │ └── ValidUnicodeTest.java │ ├── tools │ ├── CMBAWSBaseTest.java │ ├── CMBTestingConstants.java │ ├── CNSTestingUtils.java │ ├── CQSTestUtils.java │ ├── CreateTopicResponseParser.java │ ├── ErrorParser.java │ ├── ListSubscriptionParser.java │ ├── ListTopicsResponseParser.java │ ├── QueueDepthSimulator.java │ ├── SimpleHttpServletRequest.java │ ├── SimpleHttpServletResponse.java │ ├── SimpleServletOutputStream.java │ ├── SubscribeParser.java │ ├── SubscriptionAttributeParser.java │ └── TopicAttributeParser.java │ └── unit │ ├── CassandraTest.java │ └── UserPersistenceTest.java ├── cns └── test │ ├── stress │ ├── CNSStressTest.java │ ├── README.txt │ └── run.sh │ └── unit │ ├── CNSAttributesCassandraPersistenceTest.java │ ├── CNSDeleteListTopicTest.java │ ├── CNSJustCreateSubscriptionsTest.java │ ├── CNSMessageTest.java │ ├── CNSPublishJobTest.java │ ├── CNSPublishTest.java │ ├── CNSPublishToCQSWithAttributes.java │ ├── CNSRawMessageDeliveryTest.java │ ├── CNSRedisPubSubTest.java │ ├── CNSRetryPolicyTest.java │ ├── CNSScaleSubscriptionsTest.java │ ├── CNSScaleTopicsTest.java │ ├── CNSSubscriptionAttributeCMBTest.java │ ├── CNSSubscriptionTest.java │ ├── CNSThrottlePolicyTest.java │ ├── CNSTopicAttributeTest.java │ ├── SubscribeListUnsubscribeCassandraTest.java │ ├── SubscriptionDeliveryPolicyTest.java │ ├── TopicDeliveryPolicyTest.java │ └── UtilsTest.java └── cqs └── test ├── stress ├── CQSStressTestProperties.java ├── CqsStressTester.java ├── cqs.stresstest.properties ├── run.sh └── run2.sh └── unit ├── CQSDCFailoverTest.java ├── CQSDelaySecondsTest.java ├── CQSEnduranceTest.java ├── CQSIntegrationTest.java ├── CQSLongPollTest.java ├── CQSMessagePartitionedCassandraPersistenceTest.java ├── CQSMessageVisibilityTest.java ├── CQSMonitorTest.java ├── CQSQueuePersistenceTest.java ├── CQSRedisCachedCassandraPersistenceTest.java ├── CQSRedisSortedSetPersistenceTest.java ├── CQSScaleQueuesTest.java └── CQSSendDeleteReceiveMessageTest.java /.travis.yml: -------------------------------------------------------------------------------- 1 | # 2 | language: java 3 | services: 4 | - redis-server 5 | - cassandra 6 | #before_script: cassandra-cli -f schema/cassandra_1.2.schema && sleep 5 7 | install: bin/travisci_setup.sh 8 | script: MAVEN_OPTS="-Djdk.xml.entityExpansionLimit=0 -DentityExpansionLimit=0" mvn -ff test 9 | after_failure: echo "##########"; cat /tmp/cmb.log 10 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.3.3-jdk-8 2 | 3 | RUN mkdir -p /app/src/cmb 4 | ADD . /app/src/cmb 5 | 6 | WORKDIR /app/src/cmb 7 | ENV ROOTDIR=/app/src/cmb 8 | RUN mvn -Dmaven.test.skip=true assembly:assembly 9 | RUN mv target/lib $ROOTDIR/lib 10 | RUN mv target/cmb.jar $ROOTDIR/lib 11 | 12 | EXPOSE 6059 6061 13 | 14 | CMD $ROOTDIR/docker/cmb/bin/start.sh 15 | -------------------------------------------------------------------------------- /Dockerfile-cassandra: -------------------------------------------------------------------------------- 1 | FROM cassandra:2.1 2 | 3 | # Add initial data for cmb 4 | ADD ./schema/cassandra_1.2.cql.schema /tmp/cassandra_1.2.cql.schema 5 | -------------------------------------------------------------------------------- /Dockerfile-redis: -------------------------------------------------------------------------------- 1 | FROM redis:2.6 2 | 3 | COPY ./docker/redis/redis.conf /usr/local/etc/redis/redis.conf 4 | CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] 5 | -------------------------------------------------------------------------------- /NOTICE.txt: -------------------------------------------------------------------------------- 1 | Comcast Message Bus - CMB 2 | Copyright 2010-2012 Comcast Corporation or its affiliates. All Rights Reserved. 3 | 4 | This product includes software developed by Comcast Corporation (http://www.comcast.com/). 5 | 6 | -------------------------------------------------------------------------------------------- 7 | - THIRD PARTY COMPONENTS 8 | -------------------------------------------------------------------------------------------- 9 | 10 | This software includes third party software: 11 | 12 | - AWS SDK for Java, Copyright 2010-2012 Amazon.com, Inc., http://aws.amazon.com/sdkforjava/ 13 | - hector, http://prettyprint.me/2010/02/23/hector-a-java-cassandra-client/ 14 | - jedis, https://github.com/xetorthio/jedis 15 | - Apache Commons, http://commons.apache.org/ 16 | - EZMorph, http://ezmorph.sourceforge.net/ 17 | - FastInfoSet, http://fi.java.net/ 18 | - Apache HTTP Components, http://hc.apache.org/ 19 | - guava-libraries, http://code.google.com/p/guava-libraries/ 20 | - JFree, http://www.jfree.org/ 21 | - json, http://www.json.org/java/index.html 22 | - log4j, http://logging.apache.org/log4j/ 23 | - SLF4j, http://www.slf4j.org/ 24 | - eaio-uuid, https://github.com/stephenc/eaio-uuid 25 | 26 | 27 | -------------------------------------------------------------------------------- /WebContent/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 Created-By: 1.6.0 (Sun Microsystems Inc.) -------------------------------------------------------------------------------- /WebContent/WEB-INF/global.css: -------------------------------------------------------------------------------- 1 | body { 2 | background:#FFFFFF; 3 | margin:0; 4 | text-align:center; 5 | line-height: 1.5em; 6 | font: small Verdana, Arial, Sans-serif; 7 | color:#333333; 8 | } 9 | 10 | p { 11 | line-height: 1.5em; 12 | font: small Verdana, Arial, Sans-serif; 13 | color:#333333; 14 | } 15 | 16 | a:link { 17 | color: #333333; 18 | } 19 | a:visited { 20 | color: #333333; 21 | } 22 | a:hover { 23 | color: #333333; 24 | } 25 | a img { 26 | border-width:0; 27 | } 28 | 29 | h1 { 30 | margin:0; 31 | padding:5px 5px 5px; 32 | line-height:1.2em; 33 | font: normal bold 150% Verdana,Arial,Sans-serif; 34 | } 35 | h2 { 36 | margin:0; 37 | padding:5px 5px 5px; 38 | line-height:1.2em; 39 | font: normal bold 125% Verdana,Arial,Sans-serif; 40 | } 41 | h3 { 42 | margin:0; 43 | padding:5px 5px 5px; 44 | line-height:1.2em; 45 | font: normal bold 100% Verdana,Arial,Sans-serif; 46 | } 47 | hr { 48 | padding:1px 1px 1px; 49 | margin: 0px; 50 | } 51 | 52 | .content table 53 | { 54 | border-collapse:collapse; 55 | font: small Verdana, Arial, Sans-serif; 56 | padding:1px 1px 1px; 57 | margin: 5px; 58 | } 59 | .content table, .content td 60 | { 61 | border: 1px solid black; 62 | background-color:#BBBBDD; 63 | font: small bold Verdana, Arial, Sans-serif; 64 | padding: 1px 1px 1px; 65 | } 66 | .content th 67 | { 68 | border: 1px solid black; 69 | background-color:#9999BB; 70 | font: small bold Verdana, Arial, Sans-serif; 71 | padding: 1px 1px 1px; 72 | } 73 | .header table 74 | { 75 | border-collapse:collapse; 76 | font: small Verdana, Arial, Sans-serif; 77 | padding: 0px 0px 0px; 78 | margin: 0px; 79 | } 80 | .header table, .header th, .header td 81 | { 82 | border: 0px; 83 | background-color:#AAAACC; 84 | font: small Verdana, Arial, Sans-serif; 85 | padding: 0px 0px 0px; 86 | } 87 | .simple table 88 | { 89 | border-collapse:collapse; 90 | font: small Verdana, Arial, Sans-serif; 91 | padding:1px 1px 1px; 92 | margin: 5px; 93 | } 94 | .simple table, .simple td 95 | { 96 | border: 1px solid black; 97 | font: small Verdana, Arial, Sans-serif; 98 | padding:1x 1px 1px; 99 | } 100 | .simple th 101 | { 102 | border: 1px solid black; 103 | font: small bold Verdana, Arial, Sans-serif; 104 | padding:1x 1px 1px; 105 | } 106 | table 107 | { 108 | border-collapse:collapse; 109 | font: small Verdana, Arial, Sans-serif; 110 | padding:1px 1px 1px; 111 | margin: 5px; 112 | } 113 | table, td 114 | { 115 | border: 0px; 116 | font: small Verdana, Arial, Sans-serif; 117 | padding:1px 1px 1px; 118 | } 119 | th 120 | { 121 | border: 0px; 122 | font: small bold Verdana, Arial, Sans-serif; 123 | padding:1px 1px 1px; 124 | } 125 | .alternatecolortable 126 | { 127 | border-collapse:collapse; 128 | font: small Verdana, Arial, Sans-serif; 129 | padding:1px 1px 1px; 130 | margin: 5px; 131 | } 132 | .alternatecolortable td{ 133 | border: 1px solid black; 134 | /*background-color:#BBBBDD;*/ 135 | font: small bold Verdana, Arial, Sans-serif; 136 | padding: 1px 1px 1px; 137 | } 138 | provide some minimal visual accomodation for IE8 and below */ 139 | .alternatecolortable tr{ 140 | background: #BBBBDD; 141 | } 142 | /* Define the background color for all the ODD background rows */ 143 | .alternatecolortable tr:nth-child(odd){ 144 | background: #BBBBDD; 145 | } 146 | /* Define the background color for all the EVEN background rows */ 147 | .alternatecolortable tr:nth-child(even){ 148 | background: #DDDDFF; 149 | } 150 | .alternatecolortable th 151 | { 152 | border: 1px solid black; 153 | background-color:#9999BB; 154 | font: small bold Verdana, Arial, Sans-serif; 155 | padding: 1px 1px 1px; 156 | } 157 | 158 | -------------------------------------------------------------------------------- /assembly.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | distribution-${project.version} 7 | 8 | 9 | tar.gz 10 | 11 | 12 | 13 | 14 | ${basedir}/config 15 | 16 | cmb.properties 17 | log4j.properties 18 | 19 | 20 | 21 | ${basedir}/config/WEB-INF-CNS 22 | 23 | web.xml 24 | 25 | 26 | 27 | ${basedir}/config/WEB-INF-CQS 28 | 29 | web.xml 30 | 31 | 32 | 33 | ${basedir}/WebContent/WEB-INF 34 | 35 | global.css 36 | 37 | 38 | 39 | ${basedir}/bin 40 | 41 | cmb.sh 42 | 43 | 44 | 45 | ${basedir}/schema 46 | 47 | *.schema 48 | 49 | 50 | 51 | ${basedir} 52 | 53 | *.txt 54 | 55 | 56 | 57 | ${basedir} 58 | 59 | packaging/linux/centos/* 60 | packaging/common/* 61 | 62 | 63 | 64 | ${project.build.directory}/lib 65 | lib 66 | 67 | javaee-web-api* 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | lib 76 | false 77 | 78 | com.comcast.cmb:${projectname}:jar 79 | 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /bin/cmb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #----------------------------------------------------------------------- 4 | # Script to start CMB Node 5 | #----------------------------------------------------------------------- 6 | 7 | # 8 | # Edit cmb.properties in config folder to activate CQS / CNS Service 9 | # Endpoints and / or CNS Publisher. 10 | # 11 | # Edit log4j.properties in config folder to adjust log level. 12 | # 13 | 14 | #----------------------------------------------------------------------- 15 | # CMB VM Settings 16 | #----------------------------------------------------------------------- 17 | 18 | JMX_PORT=52525 19 | LOG4J_PROPS=./config/log4j.properties 20 | CMB_PROPS=./config/cmb.properties 21 | CMB_INSTANCE_NAME=cmb 22 | 23 | #----------------------------------------------------------------------- 24 | 25 | workingDir="$( cd "$( dirname "$0" )" && pwd )" 26 | cd $workingDir 27 | cd .. 28 | 29 | export CLASSPATH=".:config" 30 | for i in `ls lib/*.jar` 31 | do 32 | CLASSPATH=${CLASSPATH}:${i} 33 | done 34 | 35 | echo ${CLASSPATH} 36 | 37 | if [ -f CMB_INSTANCE_NAME ] 38 | then 39 | instance=`cat CMB_INSTANCE_NAME` 40 | fi 41 | 42 | if [ -f lib/jolokia-jvm*-agent.jar ] 43 | then 44 | AGENT_JAR=`ls lib/jolokia-jvm*-agent.jar` 45 | AGENT_OPTION=-javaagent:${AGENT_JAR}=port=7777 46 | else 47 | AGENT_OPTION="" 48 | fi 49 | 50 | java $AGENT_OPTION -Xmx2048m -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=${JMX_PORT} -Dcmb.log4j.propertyFile=${LOG4J_PROPS} -Dcmb.propertyFile=${CMB_PROPS} com.comcast.cmb.common.controller.CMB ${CMB_INSTANCE_NAME} 51 | -------------------------------------------------------------------------------- /bin/travisci_setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | mvn -Dmaven.test.skip=true assembly:assembly 3 | echo "*** Finished mvn" 4 | echo "*** Starting untar into tmp" 5 | tar -xvz -C /tmp -f target/cmb-distribution-* 6 | echo "*** Finished untar into tmp" 7 | 8 | #cp /tmp/cmb/config/test.log4j.properties /tmp/cmb/config/log4j.properties 9 | 10 | echo "installing schema" 11 | cassandra-cli -f /tmp/cmb/schema/cassandra_1.2.schema && sleep 5 12 | (cd /tmp/cmb && nohup bin/cmb.sh &) 13 | echo "*** Ran cmb.sh" 14 | sleep 5 15 | echo "*** checking for cmb process" 16 | ps aux | grep cmb 17 | -------------------------------------------------------------------------------- /config/WEB-INF-CNS/context.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /config/WEB-INF-CQS/context.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /config/log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to INFO for A1 and A2 2 | 3 | log4j.rootLogger=INFO, A1, A2 4 | 5 | # A1 is a simple consol adapter 6 | 7 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 8 | log4j.appender.A1.layout=com.comcast.cmb.common.util.CMBPatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] [%R] %-5p %c{1} - %m%n 10 | 11 | # A2 is a simple file adapter logging to /tmp/cmb.log 12 | log4j.appender.A2=org.apache.log4j.RollingFileAppender 13 | log4j.appender.A2.MaxFileSize=500MB 14 | log4j.appender.A2.MaxBackupIndex=1 15 | log4j.appender.A2.append=true 16 | log4j.appender.A2.File=/tmp/cmb.log 17 | log4j.appender.A2.layout=com.comcast.cmb.common.util.CMBPatternLayout 18 | log4j.appender.A2.layout.ConversionPattern=%d{ISO8601} [%t] [%R] %-5p %c{1} - %m%n 19 | -------------------------------------------------------------------------------- /config/test.log4j.properties: -------------------------------------------------------------------------------- 1 | # Set root logger level to DEBUG for A1 and A2 2 | 3 | log4j.rootLogger=ERROR, A1, A2 4 | 5 | # A1 is a simple consol adapter 6 | 7 | log4j.appender.A1=org.apache.log4j.ConsoleAppender 8 | log4j.appender.A1.layout=com.comcast.cmb.common.util.CMBPatternLayout 9 | log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%H] [%t] [%R] %-5p %c{1} - %m%n 10 | 11 | # A2 is a simple file adapter logging to /tmp/cmb.log 12 | 13 | log4j.appender.A2=org.apache.log4j.FileAppender 14 | log4j.appender.A2.File=/tmp/cmb.log 15 | log4j.appender.A2.layout=com.comcast.cmb.common.util.CMBPatternLayout 16 | log4j.appender.A2.layout.ConversionPattern=%d{ISO8601} [%H] [%t] [%R] %-5p %c{1} - %m%n 17 | -------------------------------------------------------------------------------- /docker/cmb/bin/start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -x 2 | 3 | # Set addresses and ports from env to template file 4 | sed -i -e "s/CASSANDRA_ADDR/$CASSANDRA_PORT_9160_TCP_ADDR/" $ROOTDIR/docker/cmb/cmb.properties.template 5 | sed -i -e "s/CASSANDRA_PORT/$CASSANDRA_PORT_9160_TCP_PORT/" $ROOTDIR/docker/cmb/cmb.properties.template 6 | sed -i -e "s/REDIS_ADDR/$REDIS_PORT_6379_TCP_ADDR/" $ROOTDIR/docker/cmb/cmb.properties.template 7 | sed -i -e "s/REDIS_PORT/$REDIS_PORT_6379_TCP_PORT/" $ROOTDIR/docker/cmb/cmb.properties.template 8 | 9 | # Overwrite configuration file by template 10 | cat $ROOTDIR/docker/cmb/cmb.properties.template> $ROOTDIR/config/cmb.properties 11 | 12 | /app/src/cmb/bin/cmb.sh 13 | -------------------------------------------------------------------------------- /docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | cmb: 2 | build: ../ 3 | ports: 4 | - "6059:6059" 5 | - "6061:6061" 6 | links: 7 | - cassandra 8 | - redis 9 | # cassandra container needs to be initialized by the schema. Run below: 10 | # docker exec -it cmb_cassandra_1 cqlsh -f /tmp/cassandra_1.2.cql.schema 11 | cassandra: 12 | build: ../ 13 | dockerfile: Dockerfile-cassandra 14 | expose: 15 | - "7000" 16 | - "7001" 17 | - "7199" 18 | - "9042" 19 | - "9160" 20 | redis: 21 | build: ../ 22 | dockerfile: Dockerfile-redis 23 | expose: 24 | - "6379" 25 | -------------------------------------------------------------------------------- /docs/xcal-CNSArchitecture-210912-1546-6.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Comcast/cmb/d93e9e24f98563ac843cd841e4b863ee1bc92ba4/docs/xcal-CNSArchitecture-210912-1546-6.pdf -------------------------------------------------------------------------------- /docs/xcal-CNSProductRequirements-210912-1548-10.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Comcast/cmb/d93e9e24f98563ac843cd841e4b863ee1bc92ba4/docs/xcal-CNSProductRequirements-210912-1548-10.pdf -------------------------------------------------------------------------------- /docs/xcal-CQSArchitecture-210912-1545-4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Comcast/cmb/d93e9e24f98563ac843cd841e4b863ee1bc92ba4/docs/xcal-CQSArchitecture-210912-1545-4.pdf -------------------------------------------------------------------------------- /docs/xcal-CQSProductRequirements-210912-1548-8.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Comcast/cmb/d93e9e24f98563ac843cd841e4b863ee1bc92ba4/docs/xcal-CQSProductRequirements-210912-1548-8.pdf -------------------------------------------------------------------------------- /examples/ruby/.gitignore: -------------------------------------------------------------------------------- 1 | Gemfile.lock 2 | -------------------------------------------------------------------------------- /examples/ruby/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'aws-sdk-core' 4 | gem 'aws-sdk-resources' 5 | gem 'awesome_print' 6 | gem 'nokogiri' 7 | gem 'pry-byebug' 8 | -------------------------------------------------------------------------------- /examples/ruby/example.rb: -------------------------------------------------------------------------------- 1 | # 2 | # Usage: 3 | # 4 | # bundle install 5 | # ACCESS_KEY="cmb user's access key" SECRET_KEY="cmb user's secret key" ruby ./example.rb 6 | # 7 | # 8 | 9 | require 'rubygems' 10 | require 'bundler/setup' 11 | 12 | Bundler.require :default 13 | 14 | access_key = ENV['ACCESS_KEY'] 15 | secret_key = ENV['SECRET_KEY'] 16 | 17 | sns_endpoint = "http://localhost:6061/" 18 | sqs_endpoint = "http://localhost:6059/" 19 | 20 | Aws.config[:credentials] = Aws::Credentials.new access_key, secret_key 21 | Aws.config[:region] = 'csv' 22 | 23 | sns = Aws::SNS::Client.new endpoint: sns_endpoint 24 | sqs = Aws::SQS::Client.new endpoint: sqs_endpoint 25 | 26 | # create unique topic and queue names via the current time 27 | 28 | topic_name = "topic-#{Time.now.to_i}" 29 | queue_name = "queue-#{Time.now.to_i}" 30 | 31 | # remove any existing topics and queues in this account 32 | 33 | sns.list_topics[:topics].map { |topic| topic[:topic_arn] }.compact.each do |arn| 34 | puts "Deleting topic: #{arn}" 35 | sns.delete_topic topic_arn: arn 36 | end 37 | 38 | sqs.list_queues[:queue_urls].each do |url| 39 | puts "Deleting queue: #{url}" 40 | sqs.delete_queue queue_url: url 41 | end 42 | 43 | # create the topic, queue and subscription 44 | 45 | puts "Creating topic: #{topic_name}" 46 | topic_arn = sns.create_topic(name: topic_name)[:topic_arn] 47 | topic = Aws::SNS::Topic.new topic_arn, client: sns 48 | 49 | puts "Creating queue: #{queue_name}" 50 | queue_url = sqs.create_queue(queue_name: queue_name)[:queue_url] 51 | queue = Aws::SQS::Queue.new queue_url, client: sqs 52 | 53 | puts "Subscribing: #{queue_name} to #{topic_name}" 54 | subscription = topic.subscribe(endpoint: queue.arn, protocol: 'cqs') 55 | subscription.set_attributes attribute_name: 'RawMessageDelivery', attribute_value: 'true' 56 | 57 | # publish a message on the topic 58 | 59 | puts "Publishing to: #{topic_name}" 60 | 61 | delivery = topic.publish message: 'test', message_attributes: { 62 | 'ruby_example.key_1' => { 63 | string_value: 'xyz', 64 | data_type: 'String' 65 | }, 66 | 67 | 'ruby_example.key_2' => { 68 | string_value: '123', 69 | data_type: 'Number' 70 | } 71 | } 72 | 73 | if delivery.nil? 74 | puts 'Published message was not delivered to any subscribers!' 75 | exit 1 76 | end 77 | 78 | sleep(1) 79 | 80 | puts "Receiving messages from: #{queue_name}" 81 | resp = queue.receive_messages(:message_attribute_names => [ "All" ]) 82 | messages = resp.to_a 83 | 84 | if messages.empty? 85 | puts "No message was received!" 86 | exit 1 87 | end 88 | 89 | message = messages.first 90 | 91 | puts "Message..." 92 | 93 | ap message_id: message.message_id, 94 | receipt_handle: message.receipt_handle, 95 | attributes: message.attributes, 96 | body: message.body, 97 | message_attributes: message.message_attributes 98 | -------------------------------------------------------------------------------- /packaging/common/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.logger.me.prettyprint=INFO 2 | log4j.rootLogger=INFO, A1 3 | log4j.logger.httpclient=INFO 4 | log4j.logger.org.apache=INFO 5 | log4j.appender.A1=org.apache.log4j.RollingFileAppender 6 | log4j.appender.A1.MaxFileSize=500MB 7 | log4j.appender.A1.MaxBackupIndex=3 8 | log4j.appender.A1.append=true 9 | log4j.appender.A1.File=/opt/cmb/logs/cmb.log 10 | log4j.appender.A1.layout=com.comcast.cmb.common.util.CMBPatternLayout 11 | log4j.appender.A1.layout.ConversionPattern=%d{ISO8601} [%t] [%R] %-5p %c{1} - %m%n 12 | -------------------------------------------------------------------------------- /packaging/linux/centos/cmb.init: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # chkconfig: 345 20 80 3 | # description: Cloud Message Bus API server 4 | # /etc/initd.d/cmb 5 | CLASS=com.comcast.cmb.common.controller.CMB 6 | USER=cmb 7 | 8 | restart() { 9 | # start does a stop 10 | start 11 | } 12 | 13 | start() { 14 | stop 15 | cd /opt/cmb 16 | su $USER -c "nohup /opt/cmb/bin/cmb.sh > logs/cmb.stdout.log 2> logs/cmb.stderr.log &" 17 | } 18 | 19 | stop() { 20 | pkill -f $CLASS 21 | sleep 1 22 | pkill -9 -f $CLASS 23 | sleep 1 24 | } 25 | 26 | status() { 27 | pgrep -f $CLASS 28 | exit $? 29 | } 30 | 31 | case $1 in 32 | start|stop|restart|status) 33 | $1 34 | ;; 35 | *) 36 | echo "USAGE: $0 " 37 | exit 1 38 | ;; 39 | esac 40 | 41 | -------------------------------------------------------------------------------- /packaging/linux/centos/cmb.spec: -------------------------------------------------------------------------------- 1 | Summary: Cloud Message Bus - a clone of SQS/SNS 2 | Name: cmb 3 | Version: 2.2.41 4 | BuildArch: noarch 5 | Release: 1 6 | Group: Applications 7 | License: Private 8 | AutoReqProv: no 9 | Source: http://cmbdownloads.s3-website-us-west-1.amazonaws.com/%{version}/cmb-distribution-%{version}.tar.gz 10 | URL: http://github.com/Comcast/cmb 11 | 12 | 13 | %description 14 | Cloud Message Bus implements a (largely) API compatible implementation of Amazon's SQS and SNS services 15 | 16 | %prep 17 | 18 | %setup -n cmb 19 | 20 | %build 21 | 22 | %install 23 | rm -rf %{buildroot} 24 | mkdir -p %{buildroot}/opt/cmb/logs 25 | mkdir -p %{buildroot}/opt/cmb/docs 26 | mkdir -p %{buildroot}/opt/cmb/schema 27 | mkdir -p %{buildroot}/etc/init.d 28 | cp %{_builddir}/cmb/packaging/linux/centos/cmb.init %{buildroot}/etc/init.d/cmb 29 | cp -r %{_builddir}/cmb/lib %{buildroot}/opt/cmb 30 | cp -r %{_builddir}/cmb/bin %{buildroot}/opt/cmb 31 | cp -r %{_builddir}/cmb/WebContent %{buildroot}/opt/cmb 32 | cp -r %{_builddir}/cmb/config %{buildroot}/opt/cmb 33 | cp -r %{_builddir}/cmb/schema %{buildroot}/opt/cmb 34 | cp %{_builddir}/cmb/[A-Z]*.txt %{buildroot}/opt/cmb/docs 35 | cp %{_builddir}/cmb/packaging/common/log4j.properties %{buildroot}/opt/cmb/config/log4j.properties 36 | 37 | %clean 38 | 39 | %files 40 | %attr(755, root, root) /etc/init.d/cmb 41 | %defattr(-,cmb,cmb) 42 | /opt/cmb/bin 43 | /opt/cmb/lib 44 | /opt/cmb/WebContent 45 | /opt/cmb/schema 46 | /opt/cmb/docs 47 | /opt/cmb/logs 48 | /opt/cmb/config/WEB-INF-CNS/web.xml 49 | /opt/cmb/config/WEB-INF-CQS/web.xml 50 | %config(noreplace) /opt/cmb/config/cmb.properties 51 | %config(noreplace) /opt/cmb/config/log4j.properties 52 | 53 | %pre 54 | groupadd cmb || true 55 | useradd -g cmb cmb || true 56 | 57 | %post 58 | /sbin/chkconfig --add cmb 59 | 60 | %preun 61 | /sbin/service cmb stop 62 | /sbin/chkconfig --del cmb 63 | 64 | -------------------------------------------------------------------------------- /packaging/vagrant/cmbbase/Vagrantfile: -------------------------------------------------------------------------------- 1 | # -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | # to create the base image and move it to the cluster configuration use: 5 | # vagrant up 6 | # vagrant package -output cmbbase 7 | # mv cmbbase ../cmbcluster 8 | # cd ../cmbcluster 9 | # vagrant up 10 | 11 | # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 12 | VAGRANTFILE_API_VERSION = "2" 13 | 14 | Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 15 | 16 | config.vm.box = "hashicorp/precise64" 17 | 18 | #config.vm.box_url = "http://domain.com/path/to/above.box" 19 | 20 | # provisioning 21 | 22 | config.vm.provision :shell, :path => "bootstrap.sh" 23 | 24 | # use private network for multi-machine environment 25 | 26 | config.vm.network "private_network", type: "dhcp" 27 | 28 | end 29 | -------------------------------------------------------------------------------- /packaging/vagrant/cmbbase/bootstrap.sh: -------------------------------------------------------------------------------- 1 | # make sure system sources are up to date. 2 | 3 | apt-get update 4 | 5 | echo "installing dependencies" 6 | 7 | apt-get -y install curl gcc make 8 | 9 | echo "installing java" 10 | 11 | wget --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz" -O jdk-7-linux-x64.tar.gz 12 | tar -xzvf jdk-7-linux-x64.tar.gz 13 | mkdir -p /usr/java 14 | mv jdk1.7.0_55 /usr/java 15 | 16 | update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_55/bin/java 1 17 | update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.7.0_55/bin/javac 1 18 | update-alternatives --install /usr/bin/javaws javaws /usr/java/jdk1.7.0_55/bin/javaws 1 19 | 20 | echo "installing cassandra" 21 | 22 | # https://gist.github.com/hengxin/8e5040d7a8b354b1c82e 23 | 24 | echo "deb http://debian.datastax.com/community stable main" | tee -a /etc/apt/sources.list.d/cassandra.sources.list 25 | 26 | curl -L http://debian.datastax.com/debian/repo_key | apt-key add - 27 | 28 | apt-get update 29 | 30 | apt-get -y install dsc20 cassandra=2.0.15 -V 31 | 32 | # TODO: edit /etc/cassandra/cassandra.yaml and restart 33 | 34 | #sudo service cassandra stop 35 | #sudo rm -rf /var/lib/cassandra/data/* 36 | 37 | #/etc/init.d/cassandra start 38 | 39 | nohup cassandra -f & 40 | 41 | # install redis 42 | 43 | # sadly this installs redis 2.2 44 | 45 | #apt-get install redis-server 46 | #sed -e '/save/ s/^#*/#/' -i /etc/redis/redis.conf 47 | #/etc/init.d/redis-server restart 48 | 49 | # download and make Redis 50 | 51 | wget http://download.redis.io/releases/redis-2.6.17.tar.gz 52 | tar xzf redis-2.6.17.tar.gz -C /usr/lib/ 53 | cd /usr/lib/redis-2.6.17 54 | make 55 | 56 | # create symlinks to the /usr/local/bin 57 | 58 | ln -s /usr/lib/redis-2.6.17/src/redis-server /usr/local/bin/redis-server 59 | ln -s /usr/lib/redis-2.6.17/src/redis-cli /usr/local/bin/redis-cli 60 | 61 | # set up init to run redis on startup 62 | 63 | cd /usr/lib/redis-2.6.17/utils 64 | ./install_server.sh 65 | 66 | # cmb settings for redis 67 | 68 | sed -e '/save/ s/^#*/#/' -i /etc/redis/6379.conf 69 | 70 | /etc/init.d/redis_6379 stop 71 | /etc/init.d/redis_6379 start 72 | 73 | # install cmb 74 | 75 | cd /home/vagrant 76 | 77 | wget "https://s3-us-west-1.amazonaws.com/cmb-releases/2.2.43/cmb-distribution-2.2.43.tar.gz" -O cmb-distribution-2.2.43.tar.gz 78 | 79 | tar -xzvf cmb-distribution-2.2.43.tar.gz 80 | 81 | sed -e '/drop/ s/^-*/--/' -i cmb/schema/cassandra_1.2.schema 82 | 83 | cassandra-cli -f cmb/schema/cassandra_1.2.schema 84 | 85 | sed -i 's,^\(cmb\.cns\.serviceEnabled=\).*,\1'false',' cmb/config/cmb.properties 86 | sed -i 's,^\(cmb\.cns\.publisherEnabled=\).*,\1'false',' cmb/config/cmb.properties 87 | 88 | cd cmb 89 | nohup bin/cmb.sh & 90 | 91 | # TODO: supervisord config for cmb 92 | # TODO: move cmb to a better place 93 | -------------------------------------------------------------------------------- /packaging/vagrant/cmbcluster/Vagrantfile: -------------------------------------------------------------------------------- 1 | # -*- mode: ruby -*- 2 | # vi: set ft=ruby : 3 | 4 | # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! 5 | VAGRANTFILE_API_VERSION = "2" 6 | 7 | Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 8 | 9 | # use private network for multi-machine environment 10 | # may want to use static IP addresses instead of dhcp 11 | # for predictable results 12 | 13 | config.vm.network "private_network", type: "dhcp" 14 | 15 | config.vm.define "cmb1" do |cmb1| 16 | cmb1.vm.box = "cmbbase" 17 | #cmb1.vm.network "private_network", ip: "172.28.128.3" 18 | end 19 | 20 | config.vm.define "cmb2" do |cmb2| 21 | cmb2.vm.box = "cmbbase" 22 | #cmb2.vm.network "private_network", ip: "172.28.128.4" 23 | end 24 | 25 | config.vm.define "cmb3" do |cmb3| 26 | cmb3.vm.box = "cmbbase" 27 | #cmb3.vm.network "private_network", ip: "172.28.128.5" 28 | end 29 | 30 | end -------------------------------------------------------------------------------- /src/com/comcast/cmb/common/controller/UserPageServlet.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2012 Comcast Corporation 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.comcast.cmb.common.controller; 17 | 18 | import java.io.IOException; 19 | import java.io.PrintWriter; 20 | 21 | import javax.servlet.ServletException; 22 | import javax.servlet.http.HttpServletRequest; 23 | import javax.servlet.http.HttpServletResponse; 24 | 25 | import org.apache.log4j.Logger; 26 | 27 | import com.comcast.cmb.common.model.User; 28 | import com.comcast.cmb.common.persistence.IUserPersistence; 29 | import com.comcast.cmb.common.persistence.PersistenceFactory; 30 | import com.comcast.cmb.common.util.PersistenceException; 31 | import com.comcast.cmb.common.util.ValueAccumulator.AccumulatorName; 32 | 33 | /** 34 | * Class used to display user information 35 | * @author bwolf, aseem, tina 36 | */ 37 | public class UserPageServlet extends AdminServletBase { 38 | 39 | private static final long serialVersionUID = 1L; 40 | private static Logger logger = Logger.getLogger(UserPageServlet.class); 41 | 42 | @Override 43 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 44 | 45 | if (redirectUnauthenticatedUser(request, response)) { 46 | return; 47 | } 48 | 49 | CMBControllerServlet.valueAccumulator.initializeAllCounters(); 50 | response.setContentType("text/html"); 51 | PrintWriter out = response.getWriter(); 52 | String userId = request.getParameter("userId"); 53 | IUserPersistence userHandler = PersistenceFactory.getUserPersistence(); 54 | User user = null; 55 | 56 | try { 57 | user = userHandler.getUserById(userId); 58 | } catch (PersistenceException ex) { 59 | logger.error("event=get_user user_id=" + userId, ex); 60 | throw new ServletException(ex); 61 | } 62 | 63 | out.println(""); 64 | 65 | header(request, out, "User "+user.getUserName()); 66 | 67 | out.println(""); 68 | 69 | out.println("User "+user.getUserName()+""); 70 | 71 | if (user != null) { 72 | out.println("User Name:"+ user.getUserName()+""); 73 | out.println("User ID:"+ user.getUserId()+""); 74 | out.println("Access Key:"+user.getAccessKey()+""); 75 | out.println("Access Secret:"+user.getAccessSecret()+""); 76 | out.println(""); 77 | } 78 | 79 | out.println("