Giter Club home page Giter Club logo

jentrata-msh's Introduction

Jentrata - B2B Gateway

Introduction

Jentrata is an Open Standard based B2B Gateway that implements a number of messaging standards such as the AS4 Conformance Profile of the OASIS ebMS 3.0 specification.

Build Status

Jentrata CI Build Status icon

Getting Started

TODO:

Build from Source

Requires maven 3.0+ and Java 7+

Run the following

mvn clean install

This will create jentrata-<version>.tar.gz in jentrata/dist/assembly/target

Running Jentrata

Jentrata requires a minimum of Java 7+ please ensure your JAVA_HOME environment variable points to a valid JDK 1.7 distribution

Download and unpack jentrata-<version>.tar.gz then run

cd jentrata-<version>/bin
./jentrata

This will run Jentrata interactively you should now see the jentrata prompt

   ___            _             _
  |_  |          | |           | |
    | | ___ _ __ | |_ _ __ __ _| |_ __ _
    | |/ _ \ '_ \| __| '__/ _` | __/ _` |
/\__/ /  __/ | | | |_| | | (_| | || (_| |
\____/ \___|_| |_|\__|_|  \__,_|\__\__,_|

  jentrata (2.0.0-SNAPSHOT)
  http://jentrata.org

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' to shutdown jentrata.

jentrata@jentrata>

To verify Jentrata ebms AS4 bundles are running run the following command in the jentrata shell

jentrata@jentrata> list

.....
[ 184] [Active     ] [            ] [       ] [   50] camel-jetty (2.10.4)
[ 185] [Active     ] [            ] [       ] [   80] wrap_mvn_org.apache.activemq_activemq-camel_5.8.0 (0)
[ 186] [Active     ] [            ] [       ] [   80] Apache Commons IO Bundle (1.4)
[ 187] [Active     ] [Created     ] [       ] [   80] Jentrata :: ebms3 - AS4 Conformance Profile (2.0.0.SNAPSHOT)

You should see that the Jentrata ebms3 - AS4 Conformance Profile bundle is in the Created state

By default Jentrata exposes a single http endpoint http://localhost:8081/jentrata/ebms/inbound for ebMS AS4 support.

License

The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0

jentrata-msh's People

Contributors

aaronwalker avatar arranubels avatar cavycorp avatar edwinvds avatar gitter-badger avatar mhanda avatar mitchclarkebase2 avatar rinis-dev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jentrata-msh's Issues

Oracle Table : Cluster for Jentrata DB

Hi Team,

We are trying to test Jentrata with the Oracle DB and trying to create the schema using script "https://github.com/jentrata/jentrata-msh/blob/master/Dist/src/main/scripts/sql/oracle_ebms.sql" there was a table "Cluster" which is actually a reserved keyword in Oracle and we couldn't create a table with that. Can you please let us know how to proceed further using Jentrata with Oracle DB. We have a hard requirement to use Oracle alone.

Much appreciate your response here.

Thanks
Praveen Kalagarla

Dead Lock Issue

Hi Team,

We are using Jentrata for POC purpose and We are observing below exception in Jentrata logs quite oftenly.

Caused by:
hk.hku.cecid.piazza.commons.dao.DAOException:
Error in executing hk.hku.cecid.ebms.spa.dao.MessageDataSourceDAO:
:
Process@53d9eadf by hk.hku.cecid.piazza.commons.dao.DAOException:
Error in executing update:
UPDATE message SET ref_to_message_id=?, message_id=?, primal_message_id=?, sync_reply=?, partnership_id=?, timeout_time_stamp=?, sequence_status=?, to_party_role=?, service=?, status=?, time_to_live=?, message_type=?, message_box=?, from_party_role=?, to_party_id=?, hostname=?, sequence_group=?, dup_elimination=?, cpa_id=?, has_resend_as_new=?, status_description=?, from_party_id=?, sequence_no=?, ack_sign_requested=?, action=?, time_stamp=?, conv_id=?, ack_requested=? WHERE message_id=? AND message_box=? by hk.hku.cecid.piazza.commons.dao.DAOException:
Error occurred when executing update at row 0 of the specified parameter array by com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Deadlock found when trying to get lock; try restarting transaction at hk.hku.cecid.piazza.commons.dao.ds.DataSourceProcess.start(DataSourceProcess.java:
97) at hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO.executeUpdate(DataSourceDAO.java:
588) at hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO.executeUpdate(DataSourceDAO.java:
548) at hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO.executeUpdate(DataSourceDAO.java:
528) at hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO.persist(DataSourceDAO.java:
672) at hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO.persist(DataSourceDAO.java:
651) at hk.hku.cecid.ebms.spa.dao.MessageDataSourceDAO.updateMessage(MessageDataSourceDAO.java:
52) at hk.hku.cecid.ebms.spa.handler.InboundMessageProcessor.processAcknowledgement(InboundMessageProcessor.java:
949) ... 29 more Caused by:
hk.hku.cecid.piazza.commons.dao.DAOException:
Error in executing update:
UPDATE message SET ref_to_message_id=?, message_id=?, primal_message_id=?, sync_reply=?, partnership_id=?, timeout_time_stamp=?, sequence_status=?, to_party_role=?, service=?, status=?, time_to_live=?, message_type=?, message_box=?, from_party_role=?, to_party_id=?, hostname=?, sequence_group=?, dup_elimination=?, cpa_id=?, has_resend_as_new=?, status_description=?, from_party_id=?, sequence_no=?, ack_sign_requested=?, action=?, time_stamp=?, conv_id=?, ack_requested=? WHERE message_id=? AND message_box=? by hk.hku.cecid.piazza.commons.dao.DAOException:
Error occurred when executing update at row 0 of the specified parameter array by com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Deadlock found when trying to get lock; try restarting transaction at hk.hku.cecid.piazza.commons.dao.ds.DataSourceUpdate.doTransaction(DataSourceUpdate.java:
110) at hk.hku.cecid.piazza.commons.dao.ds.DataSourceProcess.start(DataSourceProcess.java:
89) ... 36 more Caused by:
hk.hku.cecid.piazza.commons.dao.DAOException:
Error occurred when executing update at row 0 of the specified parameter array by com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Deadlock found when trying to get lock; try restarting transaction at hk.hku.cecid.piazza.commons.dao.ds.DataSourceUpdate.doTransaction(DataSourceUpdate.java:
96) ... 37 more Caused by:
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Deadlock found when trying to get lock; try restarting transaction at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:
57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:
45) at java.lang.reflect.Constructor.newInstance(Constructor.java:
526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:
406) at com.mysql.jdbc.Util.getInstance(Util.java:
381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:
1045) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:
956) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:
3491) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:
3423) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:
1936) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:
2060) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:
2542) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:
1734) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:
2019) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:
1937) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:
1922) at hk.hku.cecid.piazza.commons.dao.ds.DataSourceUpdate.doTransaction(DataSourceUpdate.java:
92) ... 37 more

Do you have any solution for this issue ?

It would be really helpful if you can help us in sorting out the issue.

Add messagid as option for Jentrata client and server

In some cases we need to be able to control the messageid as being used within the ebXML message as being sent by Jentrata. For this we made a small modification in the webservice interface of Jentrata to allow for clients to provide a messageid. We think this change can be useful for other Jentrata users.

War file distribution

Is it possible to have a war file distribution on jentrata that works for example on tomcat?

I know about existing docker images, but what I would really like, is to have a war file version that I could run on tomcat.

Jentrata ActiveTaskModule is entering into indefinite wait state

Hi Team,

We are using Jentrata for POC and experimenting various combination of settings, In one of the condition we have registered an Inbox messages fire event handler which sends message to a mock endpoint and Inbox task collector with setting wait-for-list as true,

After few messages we ended up in indefinite state due to below code
if (isWaitForList) {
monitor.waitForEmpty();
}

Also we could not see any messages reaching mock endpoint if there are any pending ActiveThreads currently being processed.

We are using org.apache.commons.httpclient.HttpClient to send messages to mock endpoint on any messagereceived event

DB connectivity issue

@aaronwalker we are facing db connectivity issue from jentrata. but if we do telnet to our db, we are able to connect.

Below are the logs: if you please look and help that will be great.

2018-10-11 05:12:38 [-startStop-2] <Plugin registry (/home/ec2-user/jentrata-msh-master/Dist/target/jentrata-msh-tomcat/plugins) initialized successfully.>
2018-10-11 05:12:38 [-startStop-2]
hk.hku.cecid.piazza.commons.spa.PluginException: Error in processing activation by handler: hk.hku.cecid.ebms.spa.EbmsProcessor
by hk.hku.cecid.piazza.commons.module.ModuleException: Unable to initialize module group 'Ebms'
by hk.hku.cecid.piazza.commons.module.ModuleException: Unable to load modules
by hk.hku.cecid.piazza.commons.module.ModuleException: Unable to initialize component 'System DAO Factory'
by hk.hku.cecid.piazza.commons.dao.DAOException: Cannot initialize SimpleDSDAOFactory!
by hk.hku.cecid.piazza.commons.dao.DAOException: Invalid parameter for SimpleDSDAOFactory.
at hk.hku.cecid.piazza.commons.spa.Plugin.activate(Plugin.java:152)
at hk.hku.cecid.piazza.commons.spa.PluginRegistry.activatePlugins(PluginRegistry.java:307)
at hk.hku.cecid.piazza.commons.spa.PluginRegistry.activate(PluginRegistry.java:281)
at hk.hku.cecid.piazza.corvus.core.Kernel.(Kernel.java:105)
at hk.hku.cecid.piazza.corvus.core.Kernel.(Kernel.java:32)
at hk.hku.cecid.piazza.corvus.core.servlet.StartupServlet.init(StartupServlet.java:54)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1230)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1174)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1066)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5409)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5707)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1017)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:993)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1296)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2039)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:473)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
at java.lang.Thread.run(Thread.java:748)
Caused by: hk.hku.cecid.piazza.commons.module.ModuleException: Unable to initialize module group 'Ebms'
by hk.hku.cecid.piazza.commons.module.ModuleException: Unable to load modules
by hk.hku.cecid.piazza.commons.module.ModuleException: Unable to initialize component 'System DAO Factory'
by hk.hku.cecid.piazza.commons.dao.DAOException: Cannot initialize SimpleDSDAOFactory!
by hk.hku.cecid.piazza.commons.dao.DAOException: Invalid parameter for SimpleDSDAOFactory.
at hk.hku.cecid.piazza.commons.module.ModuleGroup.(ModuleGroup.java:92)
at hk.hku.cecid.ebms.spa.EbmsProcessor.processActivation(EbmsProcessor.java:56)
at hk.hku.cecid.piazza.commons.spa.Plugin.activate(Plugin.java:149)
... 21 more
Caused by: hk.hku.cecid.piazza.commons.module.ModuleException: Unable to load modules
by hk.hku.cecid.piazza.commons.module.ModuleException: Unable to initialize component 'System DAO Factory'
by hk.hku.cecid.piazza.commons.dao.DAOException: Cannot initialize SimpleDSDAOFactory!
by hk.hku.cecid.piazza.commons.dao.DAOException: Invalid parameter for SimpleDSDAOFactory.
at hk.hku.cecid.piazza.commons.module.ModuleGroup.loadModules(ModuleGroup.java:130)
at hk.hku.cecid.piazza.commons.module.ModuleGroup.(ModuleGroup.java:89)
... 23 more
Caused by: hk.hku.cecid.piazza.commons.module.ModuleException: Unable to initialize component 'System DAO Factory'
by hk.hku.cecid.piazza.commons.dao.DAOException: Cannot initialize SimpleDSDAOFactory!
by hk.hku.cecid.piazza.commons.dao.DAOException: Invalid parameter for SimpleDSDAOFactory.
at hk.hku.cecid.piazza.commons.module.Module.initComponents(Module.java:189)
at hk.hku.cecid.piazza.commons.module.Module.init(Module.java:134)
at hk.hku.cecid.piazza.commons.module.ModuleGroup.loadModules(ModuleGroup.java:112)
... 24 more

Failed asynch acknowledgements handled incorrectly

Hi,

I've got the a setup where 'my' Jentrata MSH is communicating with a 3rd part MSH. When an acknowledgement is sent, and fails, a subsequence retry from the original sender is not handled according to the ebMS spec.

The sequence of messages is as follows:

// 3rd party sends a ebXML order message over HTTPS, which is receive and stored by Jentrata

  1. 3P --(Order ebXML)--> Me
    // My MSH creates an Asynch Acknowledgement message and tries to send it but this fails
  2. 3P X<-(Asynch Ack ebXML)-- Me
    // After the CPA's retry period, the sender resends the order message
  3. 3P --(Order ebXML)--> Me
    // My Jentrata MSH detects this as a previously handled message and does not send an acknowledgement.

According to the ebMS spec Jentrata should send the same Ack message again but Jentrata does not comply with this spec and doesn't send anything in response to the retry by the 3P.

from Para 6.5.4 Resending Lost Application Messages [ https://www.oasis-open.org/committees/download.php/272/ebMS_v2_0.pdf]

The rules applying to the non-receipt of an anticipated Acknowledgment due to the loss of either the
application message or the Acknowledgment Message are as follows:
• The Sending MSH MUST resend the original message if an Acknowledgment Message has been requestedbut has not been received and the following are true:
• At least the time specified in the RetryInterval parameter has passed since the message was last sent,
• The message has been resent less than the number of times specified in the Retries parameter.
• If the Sending MSH does not receive an Acknowledgment Message after the maximum number of retries, the Sending MSH SHALL notify the application and/or system administrator function of the failure to receive an Acknowledgment Message (see also section 4.2.3.2.4 concerning treatment of errors).
• If the Sending MSH detects a communications protocol error, the Sending MSH MUST resend the messageusing the same algorithm as if it has not received an Acknowledgment Message. "

Jentra ebxml to xml conversion?

Hi There,

I am using jentrata in my project. But downstream and upstream systems do not understand ebxml. Therefore, I need to convert xml to ebxml and ebxml to xml. If anyone can help on this. It would be great.

Thanks
Kind Regards
Sumanpreet Singh

Ebms, AS2 plugin issues | Jentrata setup

Hi All,

We have just started exploring jentrata and done with the setup/installation of jentrata-msh by following the instructions published on github. We have successfully installed jentrata and able to hit the URL and also login is successful.

But after login, we could see that AS2 & EBMS plugins are having error in the home page (but no errors in the logs when we click them). Can someone help us getting them up & running.

Attaching the screen shots & loggers for your reference. As we are new to jentrata, any pointers will be of great help.

Ebms and As2 plugin errors.docx

Regards,
Mahendar

Soap Error while hitting ebms/sender

@aaronwalker I managed to resolve my other issues. Thanks for your help. But, Now I am on my last step to send the response back from downsteam. But while I am hitting ebms/sender, I am getting below error.

hk.hku.cecid.piazza.commons.soap.SOAPFaultException: Invalid SOAP message: Unable to internalize message
by com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to internalize message
by com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.lang.Exception: Missing Start Boundary, or boundary does not start on a new line
by java.lang.Exception: Missing Start Boundary, or boundary does not start on a new line
at hk.hku.cecid.piazza.commons.soap.SOAPHttpAdaptor.processRequest(SOAPHttpAdaptor.java:123)
at hk.hku.cecid.piazza.commons.servlet.http.HttpDispatcher.processRequest(HttpDispatcher.java:126)
at hk.hku.cecid.piazza.commons.servlet.http.HttpDispatcher.doPost(HttpDispatcher.java:277)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1136)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:622)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Unable to internalize message
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.init(MessageImpl.java:521)
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.(MessageImpl.java:301)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.Message1_1Impl.(Message1_1Impl.java:65)
at com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl.createMessage(SOAPMessageFactory1_1Impl.java:59)
at hk.hku.cecid.piazza.commons.soap.SOAPHttpAdaptor.processRequest(SOAPHttpAdaptor.java:118)
... 24 more
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.lang.Exception: Missing Start Boundary, or boundary does not start on a new line
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.init(MessageImpl.java:484)
... 28 more
Caused by: java.lang.Exception: Missing Start Boundary, or boundary does not start on a new line
at com.sun.xml.internal.messaging.saaj.packaging.mime.internet.BMMimeMultipart.getNextPart(BMMimeMultipart.java:240)
at com.sun.xml.internal.messaging.saaj.soap.MessageImpl.init(MessageImpl.java:473)
... 28 more
2018-10-15 03:32:32 [-8080-exec-1] <Request#2080596274:/ebms/[email protected] had been processed successfully for 4 ms>

Remove DuplicateElimination from Acknowledgement

In the ebMS 2.0 standard it is not allowed to have a DuplicateElimination indicator in the Acknowledgement message. This change will update the method generateAcknowledgment by removing the lines that will add the DuplicateElimination indicator.

'Hello World' !!

Hi All,

We are new to Jentrata and just started exploring the installation & setup.

As there is hardly any information online, can anyone help us with the details around a 'Hello World' approach using Jentrata so that we can get a feel of what _Jentrata _is all about.

Thanks.

Error: Signing algorithm not matched with key algorithm

We are creating our keys for message signing with

keytool -genkeypair -keyalg RSA -sigalg SHA256withRSA

The CPA contains

<tp:SignatureAlgorithm>SHA256withRSA</tp:SignatureAlgorithm>

This leads to an error:

Message: Signing algorithm not matched with key algorithm, actual key algorithum:RSA expect algorithum: SHA256withRSA

Due to the PKISignatureImpl.java which is called by OutboxTask.java

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.