exo-addons / cloud-drive-extension Goto Github PK
View Code? Open in Web Editor NEWeXo Cloud Drive extension
eXo Cloud Drive extension
Environment: PLF 4.2, Cloud-drive extension 1.3.0-RC1
– Step 1: Go to Documents application --> Personal Documents
– Step 2: Choose "Connect Cloud Documents" action
– Step 3: Choose "Connect your Google Drive" --> Allow Cloud Workspaces app in Google’s “Request for Permission” window --> Connect to Google Drive successfull => Google Drive folder is displayed in Personal Documents drive
– Step 4: Go to Site Explorer --> Personal Documents drive --> Open Google Drive folder --> Select Icon view
– Step 5: Open a Google Drawing file
– Step 6: Choose Edit --> Edit content of Google Drawing file (see WhenEdit.png)
– Step 7: View file by click View button
=> Actual result: The edited content is NOT displayed (see WhenView.png)
=> Expected result: The edited content should be displayed
Note: Other contents (For example: Google Slide, Google Docs, Google Sheet): the edited content is displayed when click View right after editing
(Feedback in issue: https://jira.exoplatform.org/browse/CLDINT-2053)
Connector API sanitization:
Environment: PLF 4.2, cloud-drive-extension 1.3.0-RC1
Test steps:
– Step 1: Go to Personal Documents drive
– Step 2: Choose "Connect Cloud Documents" action
– Step 3: Choose "Connect your Google Drive" --> Allow Cloud Workspaces app in Google’s “Request for Permission” window --> Connect to Google Drive successfull => Google Drive folder is displayed in Personal Documents drive
– Step 4: Go to Google Drive application: create some files
– Step 5: Come back to PLF
– Step 6: Go to Site Explorer --> Choose Personal Documents drive --> Choose Icons View --> On Left panel: Right click on Google Drive folder at step 4 and choose "Sync with Google Drive" in context menu
=> Actual result: Some created file at step 4 is displayed in Google Drive folder without summary notification
=> Expected result: A notification with a summary of the updates will be shown (see ExpectedNotification.png) (base on http://blog.exoplatform.com/en/2013/02/28/exo-add-on-in-action-connecting-your-google-drive-to-exo-platform)
(Feedback from https://jira.exoplatform.org/browse/CLDINT-2052)
Hi,
I am facing an issue when eXo platform (4.2.0) is behind a proxy which needs authentication.
If have already defined the options for proxy settings in "setenv-customize.bat" as follows:
SET "CATALINA_OPTS=%CATALINA_OPTS% -Dhttp.proxyHost=http://<MY_PROXY_IP> -Dhttp.proxyPort=<MY_PROXY_PORT> -Dhttp.proxyUser= -Dhttp.proxyPassword="
I get the following error stack trace when I try to "Connect Cloud Documents" (with a connect timed out error):
2015-08-13 07:25:06,169 | WARN | Error authenticating user to access Google Drive [o.e.clouddrive.rest.ConnectService<http-nio-0.0.0.0-8080-exec-30>]
org.exoplatform.clouddrive.gdrive.GoogleDriveException: Error authenticating user code: connect timed out
at org.exoplatform.clouddrive.gdrive.GoogleDriveAPI.(GoogleDriveAPI.java:431) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.gdrive.GoogleDriveConnector$API.build(GoogleDriveConnector.java:96) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.gdrive.GoogleDriveConnector.authenticate(GoogleDriveConnector.java:193) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.gdrive.GoogleDriveConnector.authenticate(GoogleDriveConnector.java:47) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.CloudDriveServiceImpl.authenticate(CloudDriveServiceImpl.java:271) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.rest.ConnectService.userAuth(ConnectService.java:716) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_79]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_79]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_79]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_79]
at org.exoplatform.services.rest.impl.method.DefaultMethodInvoker$1.run(DefaultMethodInvoker.java:194) ~[exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.commons.utils.SecurityHelper.doPrivilegedExceptionAction(SecurityHelper.java:310) ~[exo.kernel.commons-2.4.13-GA.jar:2.4.13-GA]
at org.exoplatform.services.rest.impl.method.DefaultMethodInvoker.invokeMethod(DefaultMethodInvoker.java:190) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.services.rest.impl.method.DefaultMethodInvoker.invokeMethod(DefaultMethodInvoker.java:183) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.services.rest.impl.RequestDispatcher.invokeSubResourceMethod(RequestDispatcher.java:657) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.services.rest.impl.RequestDispatcher.dispatch(RequestDispatcher.java:602) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.services.rest.impl.RequestDispatcher.dispatch(RequestDispatcher.java:507) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.services.rest.impl.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:146) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.services.rest.servlet.RestServlet.onService(RestServlet.java:85) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.exoplatform.container.web.AbstractHttpServlet.service(AbstractHttpServlet.java:132) [exo.kernel.container-2.4.13-GA.jar:2.4.13-GA]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) [servlet-api.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat7-websocket.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.web.filter.ExtensibleFilter$ExtensibleFilterChain.doFilter(ExtensibleFilter.java:96) [exo.portal.component.web.api-4.2.0-PLF.jar:4.2.0-PLF]
at org.exoplatform.platform.common.account.setup.web.AccountSetupFilter.doFilter(AccountSetupFilter.java:61) [platform-component-common-4.2.0.jar:4.2.0]
at org.exoplatform.web.filter.ExtensibleFilter$ExtensibleFilterChain.doFilter(ExtensibleFilter.java:92) [exo.portal.component.web.api-4.2.0-PLF.jar:4.2.0-PLF]
at org.exoplatform.services.filters.sessionProvider.ThreadLocalACLSessionProviderInitializedFilter.doFilter(ThreadLocalACLSessionProviderInitializedFilter.java:45) [ecms-core-services-4.2.0.jar:4.2.0]
at org.exoplatform.web.filter.ExtensibleFilter$ExtensibleFilterChain.doFilter(ExtensibleFilter.java:92) [exo.portal.component.web.api-4.2.0-PLF.jar:4.2.0-PLF]
at org.exoplatform.web.filter.ExtensibleFilter.doFilter(ExtensibleFilter.java:71) [exo.portal.component.web.api-4.2.0-PLF.jar:4.2.0-PLF]
at org.exoplatform.web.filter.GenericFilter.doFilter(GenericFilter.java:70) [exo.portal.component.web.api-4.2.0-PLF.jar:4.2.0-PLF]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.services.rest.servlet.RestEncodingFilter.doFilter(RestEncodingFilter.java:58) [exo.ws.rest.core-2.3.13-GA.jar:2.3.13-GA]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.web.CacheUserProfileFilter.doFilter(CacheUserProfileFilter.java:72) [exo.portal.component.web.security-4.2.0-PLF.jar:4.2.0-PLF]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.frameworks.jcr.web.ThreadLocalSessionProviderInitializedFilter.doFilter(ThreadLocalSessionProviderInitializedFilter.java:122) [exo.jcr.framework.web-1.15.13-GA.jar:1.15.13-GA]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.web.login.ConversationStateUpdateFilter.doFilter(ConversationStateUpdateFilter.java:66) [exo.portal.component.web.security-4.2.0-PLF.jar:4.2.0-PLF]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.services.security.web.SetCurrentIdentityFilter.doFilter(SetCurrentIdentityFilter.java:88) [exo.core.component.security.core-2.5.13-GA.jar:2.5.13-GA]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.web.login.RememberMeFilter.doFilter(RememberMeFilter.java:81) [exo.portal.component.web.security-4.2.0-PLF.jar:4.2.0-PLF]
at org.exoplatform.web.login.RememberMeFilter.doFilter(RememberMeFilter.java:49) [exo.portal.component.web.security-4.2.0-PLF.jar:4.2.0-PLF]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.gatein.sso.integration.SSODelegateFilter.doFilter(SSODelegateFilter.java:60) [sso-integration-1.3.1.Final.jar:1.3.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.exoplatform.container.web.PortalContainerFilter.doFilter(PortalContainerFilter.java:78) [exo.kernel.container-2.4.13-GA.jar:2.4.13-GA]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.55]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.55]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) [catalina.jar:7.0.55]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) [catalina.jar:7.0.55]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) [catalina.jar:7.0.55]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [catalina.jar:7.0.55]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [catalina.jar:7.0.55]
at org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:358) [catalina.jar:7.0.55]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.55]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) [catalina.jar:7.0.55]
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) [tomcat-coyote.jar:7.0.55]
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) [tomcat-coyote.jar:7.0.55]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736) [tomcat-coyote.jar:7.0.55]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695) [tomcat-coyote.jar:7.0.55]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-coyote.jar:7.0.55]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method) ~[na:1.7.0_79]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) ~[na:1.7.0_79]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) ~[na:1.7.0_79]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) ~[na:1.7.0_79]
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.7.0_79]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.7.0_79]
at java.net.Socket.connect(Socket.java:579) ~[na:1.7.0_79]
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625) ~[na:1.7.0_79]
at sun.net.NetworkClient.doConnect(NetworkClient.java:175) ~[na:1.7.0_79]
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) ~[na:1.7.0_79]
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) ~[na:1.7.0_79]
at sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:275) ~[na:1.7.0_79]
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:371) ~[na:1.7.0_79]
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) ~[na:1.7.0_79]
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933) ~[na:1.7.0_79]
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177) ~[na:1.7.0_79]
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092) ~[na:1.7.0_79]
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) ~[na:1.7.0_79]
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77) ~[google-http-client-1.18.0-rc.jar:1.18.0-rc]
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965) ~[google-http-client-1.18.0-rc.jar:1.18.0-rc]
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:283) ~[google-oauth-client-1.18.0-rc.jar:1.18.0-rc]
at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest.execute(GoogleAuthorizationCodeTokenRequest.java:158) ~[google-api-client-1.18.0-rc.jar:1.18.0-rc]
at org.exoplatform.clouddrive.gdrive.GoogleDriveAPI.(GoogleDriveAPI.java:429) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
... 75 common frames omitted
One of customers (Mark Thompson) found that we can fix the file link to bypass CORS for non-Google file formats.
Digging around in the html I see that the iframe url link is:
https://drive.google.com/file/d/FILE_ID/view?usp=drivesdk
Which doesn't work. However, something like the follow will work:
https://drive.google.com/file/d/FILE_ID/preview
If such link cannot be obtained via API/SDK then we have to fix file links in Javascript when loading to iframe.
This issue is a follow up of internal CLDINT-1051. An user reported a 500 error from Google for his files. In logs we found this:
2013-06-10 20:22:16,976 | INFO | Google Drive - [email protected] connect started. [o.e.clouddrive.rest.ConnectService<http-bio-8080-exec-10>]
2013-06-10 20:24:40,563 | WARN | Error running connect command: Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}. Rolled back and running next attempt. [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.202216>]
2013-06-10 20:26:40,984 | WARN | Error running connect command: Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}. Rolled back and running next attempt. [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.202216>]
2013-06-10 20:28:45,653 | WARN | Error running connect command: Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}. Rolled back and running next attempt. [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.202216>]
2013-06-10 20:31:11,403 | ERROR | Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
} [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.202216>]
org.exoplatform.clouddrive.googledrive.GoogleDriveException: Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}
at org.exoplatform.clouddrive.googledrive.GoogleDriveAPI.file(GoogleDriveAPI.java:577) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$GoogleDriveConnect.fetchChilds(JCRLocalGoogleDrive.java:106) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$GoogleDriveConnect.fetchChilds(JCRLocalGoogleDrive.java:129) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$GoogleDriveConnect.fetchChilds(JCRLocalGoogleDrive.java:129) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$GoogleDriveConnect.fetchFiles(JCRLocalGoogleDrive.java:92) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$ConnectCommand.process(JCRLocalCloudDrive.java:861) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$AbstractCommand.exec(JCRLocalCloudDrive.java:717) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$CommandRunnable.run(JCRLocalCloudDrive.java:629) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at java.lang.Thread.run(Thread.java:662) ~[na:1.6.0_32]
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159) ~[google-api-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:203) ~[google-api-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237) ~[google-api-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207) ~[google-http-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.services.drive.Drive$Files$Get.execute(Drive.java:865) ~[google-api-services-drive-v2-rev1-1.7.2-beta.jar:na]
at org.exoplatform.clouddrive.googledrive.GoogleDriveAPI.file(GoogleDriveAPI.java:575) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
... 8 common frames omitted
2013-06-10 20:38:32,302 | WARN | Item collaboration:/Users/f___/fd___/fdr___/fdrouet/Private not a cloud file or drive not connected. [o.e.clouddrive.rest.DriveService<http-bio-8080-exec-5>]
2013-06-10 20:38:45,481 | INFO | Google Drive - [email protected] connect started. [o.e.clouddrive.rest.ConnectService<http-bio-8080-exec-22>]
2013-06-10 20:40:51,966 | WARN | Error running connect command: Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}. Rolled back and running next attempt. [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.203845>]
2013-06-10 20:42:50,656 | WARN | Error running connect command: Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}. Rolled back and running next attempt. [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.203845>]
2013-06-10 20:44:53,393 | WARN | Error running connect command: Error requesting Files service: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc",
"reason" : "notFound"
} ],
"message" : "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc"
}. Rolled back and running next attempt. [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.203845>]
2013-06-10 20:46:54,286 | ERROR | Error requesting Files service: 500 Internal Server Error
{
"code" : 500,
"errors" : [ {
"domain" : "global",
"message" : "Internal Error",
"reason" : "internalError"
} ],
"message" : "Internal Error"
} [org.exoplatform.clouddrive.CloudDrive<Google Drive - [email protected] connect 20130610.203845>]
org.exoplatform.clouddrive.googledrive.GoogleDriveException: Error requesting Files service: 500 Internal Server Error
{
"code" : 500,
"errors" : [ {
"domain" : "global",
"message" : "Internal Error",
"reason" : "internalError"
} ],
"message" : "Internal Error"
}
at org.exoplatform.clouddrive.googledrive.GoogleDriveAPI.file(GoogleDriveAPI.java:577) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$GoogleDriveConnect.fetchChilds(JCRLocalGoogleDrive.java:106) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$GoogleDriveConnect.fetchChilds(JCRLocalGoogleDrive.java:129) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$GoogleDriveConnect.fetchFiles(JCRLocalGoogleDrive.java:92) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$ConnectCommand.process(JCRLocalCloudDrive.java:861) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$AbstractCommand.exec(JCRLocalCloudDrive.java:717) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$CommandRunnable.run(JCRLocalCloudDrive.java:629) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
at java.lang.Thread.run(Thread.java:662) ~[na:1.6.0_32]
Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 500 Internal Server Error
{
"code" : 500,
"errors" : [ {
"domain" : "global",
"message" : "Internal Error",
"reason" : "internalError"
} ],
"message" : "Internal Error"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159) ~[google-api-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:203) ~[google-api-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237) ~[google-api-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207) ~[google-http-client-1.10.3-beta.jar:1.10.3-beta]
at com.google.api.services.drive.Drive$Files$Get.execute(Drive.java:865) ~[google-api-services-drive-v2-rev1-1.7.2-beta.jar:na]
at org.exoplatform.clouddrive.googledrive.GoogleDriveAPI.file(GoogleDriveAPI.java:575) ~[exo-clouddrive-services-core-1.1.0-20130609.020134-5.jar:1.1.0-SNAPSHOT]
... 7 common frames omitted
2013-06-10 20:59:16,187 | WARN | Item collaboration:/Users/f___/fd___/fdr___/fdrouet/Private not a cloud file or drive not connected.
What was observed, that such error happened in this case more that three times in row and before 500 it precedes 404 "File not found: 0At0ql2KIfyMAdDFvQkl3Y21SLWZMWXJPVmNXdkl6NXc". In following log two your attempts to connect, first time it failed due to 404, next time was 404 but finally connector faced with 500 from Google
It's possible that "File not found" happens due to not sufficient rights to a file (probably shared by another user).
Hello,
I just add the cloud drive extension in PLF 3.5
When i try to edit portal navigation (Edit->Portal->Navigation), and then right click on a node, I have js error in clouddrive.js :
Uncaught TypeError: Cannot call method 'indexOf' of undefined clouddrive.js:1328
CloudDriveUI.init.UIRightClickPopupMenu.clickRightMouse clouddrive.js:1328
onmousedown
This issue is due to :
UIRightClickPopupMenu.prototype.clickRightMouse = function(event, elemt, menuId, objId, params, opt) {
if (params.indexOf(MENU_OPEN_FILE) >= 0) {
params = cloudMenuActions(objId, elemt, params, ALLOWED_FILE_MENU_ACTIONS);
addProviderName(menuId, "a.OpenCloudFile16x16Icon");
} else if (params.indexOf(MENU_REFRESH_DRIVE) >= 0) {
params = cloudMenuActions(objId, elemt, params, ALLOWED_DRIVE_MENU_ACTIONS);
addProviderName(menuId, "a.RefreshCloudDrive16x16Icon");
}
clickRightMouse_orig(event, elemt, menuId, objId, params, opt);
};
I make a PR, to test if params is null in if before use it.
Thanks
Ensure pagination used for both connect and sync commands in Box API implementation.
eXo Social cannot show cloud files preview properly as it doesn't rely on an UI component config and loads templates directly by the target node type, which is nt:file, it also doesn't rely mixins of the node. All this leads to use of default viewer which don't know how to get the remote content and as result shows empty file and its thumbnails. About tumbnails service need implement such support respecting what cloud provider provides (e.g. Google offers thumbnail link for a file).
Another problem that sym-links preview doesn't work due to logic in Social integration project, it relies also on primary nodetype of the node and doesn't recognize exo:symlink as a link, thus cannot find a template for it at all. Need consult with ECMS/PLF teams.
When I try to import my Google Drive documents, it always fail on the document called "eXo Training Evaluation [Form]", with the following exception :
2015-06-23 18:11:31,508 | ERROR | Runtime error. Drive connect canceled [org.exoplatform.clouddrive.CloudDrive<clouddrive-thread-2>]
java.lang.NumberFormatException: For input string: "eXo Training Evaluation"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.7.0_80]
at java.lang.Integer.parseInt(Integer.java:492) ~[na:1.7.0_80]
at java.lang.Integer.parseInt(Integer.java:527) ~[na:1.7.0_80]
at org.exoplatform.services.jcr.impl.core.LocationFactory.parsePathEntry(LocationFactory.java:201) ~[exo.jcr.component.core-1.15.13-GA.jar:1.15.13-GA]
at org.exoplatform.services.jcr.impl.core.LocationFactory.parseNames(LocationFactory.java:281) ~[exo.jcr.component.core-1.15.13-GA.jar:1.15.13-GA]
at org.exoplatform.services.jcr.impl.core.LocationFactory.parseRelPath(LocationFactory.java:112) ~[exo.jcr.component.core-1.15.13-GA.jar:1.15.13-GA]
at org.exoplatform.services.jcr.impl.core.NodeImpl.hasNode(NodeImpl.java:1443) ~[exo.jcr.component.core-1.15.13-GA.jar:1.15.13-GA]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive.openNode(JCRLocalCloudDrive.java:3927) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive.openFile(JCRLocalCloudDrive.java:3960) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.gdrive.JCRLocalGoogleDrive.access$300(JCRLocalGoogleDrive.java:69) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.gdrive.JCRLocalGoogleDrive$Connect.fetchChilds(JCRLocalGoogleDrive.java:164) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.gdrive.JCRLocalGoogleDrive$Connect.fetchFiles(JCRLocalGoogleDrive.java:101) ~[exo-clouddrive-gdrive-services-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$ConnectCommand.process(JCRLocalCloudDrive.java:1113) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$AbstractCommand.exec(JCRLocalCloudDrive.java:896) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$CommandCallable.call(JCRLocalCloudDrive.java:701) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$CommandCallable.call(JCRLocalCloudDrive.java:692) ~[exo-clouddrive-services-core-1.2.1.jar:1.2.1]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) ~[na:1.7.0_80]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_80]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_80]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_80]
Also it would be a good improvement to not stop the whole import for one failing document.
In Admin view, 2 actions : "Permission" & "Show/Hide Content Structure" are hidden by javascript. JS should remove totally these 2 elements (li), but not only its content and css class.
(Feedback by issue https://jira.exoplatform.org/browse/CLDINT-2054)
Features API allows management of Cloud Drive features on access basis. Initially we offer control on possibility to connect a drive and availability of autosync option. Using this API a plugin to CloudDriveService can implement logic what will restrict the above features. This API for advanced integrations of the add-on.
Upgrade dependencies to Platform 4.0.4.
Hi,
We tried the extension. We installed it. It worked. We are waiting for the correct certificates for the final setup.
in the meantime we decided to unisntall it to avoid errors for users when trying to link their account with GDrive.
The button has indeed disappeared from the UI but our logs are spammed with these:
2014-01-23 20:22:21,523 | WARN | The extension type = org.exoplatform.ecm.dms.UIActionBar, name = ConnectGoogleDrive cannot be found [o.e.w.ext.impl.UIExtensionManagerImpl<http-nio-0.0.0.0-8080-exec-7>]
Any additionnal cleanup needed to get rid of these ?
Many thanks,
Eric
Folder untrashing may raise inconsistency in connected locally Google Drive. This caused by updates send by Google for changes of the file prior trashing of containing it folder. Need analysis the file with it's ancestor folders for a fact of trashing them in Google and ignore updates of the trashed subtrees.
Push comments from a drive API and pull them back from eXo. This way we will see all comments from the user drive and see all comments posted in eXo on files in that drive app (e.g. in Box app).
This option will be available only for such cloud drives that support comments or collaboration on their documents.
Would it be possible to add support for ownCloud?
Refactoring of JCR session management: save each file change independently. Previously it was a bunch of changes (connect or single sync) in a single JCR session. Indeed, if this approach is more proper, on cloud side all files managed one by one without notion of a transaction. Thus we will follow the same approach locally.
Upload content created locally in Platform to cloud drive provider. This feature can be implemented on top of JCR Observation or/and eXo JCR Ext Actions.
Note, something close to this feature was done for Google Docs in https://github.com/exo-addons/google-docs-extension
this is the error i get
OS name: "linux", version: "3.16-0.bpo.2-amd64", arch: "amd64", family: "unix"
bitnami@bitnami-exoplatform-eee5:/opt/bitnami/apache-tomcat$ cd ..
bitnami@bitnami-exoplatform-eee5:/opt/bitnami$ git clone [email protected]:exo-addons/cloud-drive-extension.git
fatal: could not create work tree dir 'cloud-drive-extension'.: Permission denied
bitnami@bitnami-exoplatform-eee5:/opt/bitnami$ sudo git clone [email protected]:exo-addons/cloud-drive-extension.git
Cloning into 'cloud-drive-extension'...
Permission denied (publickey).
Following exception discovered on a Google Drive of an user which has files shared with others but not added to his drive.
2014-01-16 15:21:32,713 | ERROR | Error synchronizing drive collaboration:/Users/p___/pn___/pne___/pnedonosko/Private/Google Drive - [email protected] [o.e.clouddrive.rest.DriveService<http-nio-0.0.0.0-8080-exec-3>]
org.exoplatform.clouddrive.CloudDriveException: Inconsistent changes: cannot find parent Node for 'PLF-4.0.5 Performance Issues'
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$Sync.updateFile(JCRLocalGoogleDrive.java:320) ~[exo-clouddrive-services-core-1.1.0-SNAPSHOT.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$Sync.syncNext(JCRLocalGoogleDrive.java:253) ~[exo-clouddrive-services-core-1.1.0-SNAPSHOT.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.googledrive.JCRLocalGoogleDrive$Sync.syncFiles(JCRLocalGoogleDrive.java:232) ~[exo-clouddrive-services-core-1.1.0-SNAPSHOT.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$SyncCommand.process(JCRLocalCloudDrive.java:1125) ~[exo-clouddrive-services-core-1.1.0-SNAPSHOT.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$AbstractCommand.exec(JCRLocalCloudDrive.java:859) ~[exo-clouddrive-services-core-1.1.0-SNAPSHOT.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$CommandCallable.call(JCRLocalCloudDrive.java:684) ~[exo-clouddrive-services-core-1.1.0-SNAPSHOT.jar:1.1.0-SNAPSHOT]
at org.exoplatform.clouddrive.jcr.JCRLocalCloudDrive$CommandCallable.call(JCRLocalCloudDrive.java:646) ~[exo-clouddrive-services-core-1.1.0-SNAPSHOT.jar:1.1.0-SNAPSHOT]
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) ~[na:1.6.0_65]
at java.util.concurrent.FutureTask.run(FutureTask.java:138) ~[na:1.6.0_65]
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) ~[na:1.6.0_65]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) ~[na:1.6.0_65]
at java.lang.Thread.run(Thread.java:695) ~[na:1.6.0_65]
Would be great to be able to access files from Seafile or ownCloud too :)
In some setups it may be required to disable or remove a connector. In this issue implement removal of a connector plugin via XML configuration, similarly as connector added it should be possible to remove it.
Folder copy in eXo documents cannot apply in Google Drive. It raises following exception:
2015-08-25 13:27:58,507 | WARN | Error running files synchronization command. Error copying file in Files service: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Bad Request",
"reason" : "badRequest"
} ],
"message" : "Bad Request"
}.
Some providers (Box) require special URLs for login and file view to force use of SSO offered by their service. Add SSO login configuration to the add-on.
Create a new branch and code base to support Platform 4.1 if required. Check for UI compatibility in Documents Explorer, check ECMS API changes.
When opening a document from Google Drive for editing, a file page refreshes in seconds and thus loads back to default view mode. This is something introduced in previous versions as initially Edit feature have been working well - check new auto-refresh logic and avoid refreshing when file is open (or even when anything else than folder listing open).
Issued by eXo Community member. Confirmed in 1.1.0 and 1.2.0.
Handle properly attempts to sync of already removed drive. This happens when drive was just deleted but before this, in a moment, the client's script initiated auto-sync and it will try to sync in next few seconds and face with an error on the server. This error should be properly handled in REST services and ECMS filters:
DriveService.getState(DriveService.java:471)
CloudFileFilter.accept(CloudFileFilter.java:72)
(reported in DEBUG log for the moment)While user drive local storage in Platform remains in user's Personal Documents, it should be possible "to connect" cloud documents (and add new) in any place of the Platform.
Doing this we will create symlinks to files from personal folder to those places. If user doesn't have a drive connected locally it will be connected automatically on first invocation of such command.
Add a service method to DriveService to return list of files in a cloud drive folder. This service may be useful for third-party integrations such as mobile or hosted apps.
Offer a configuration to enable SSO on login form used to authorise connect process. Login form should use proper URL of the login page with the enterprise subdomain. Other related features also may be enabled if cloud provider has such.
(Feedback from issue https://jira.exoplatform.org/browse/CLDINT-2051)
Platform 4.3 comes with older version of Google APIes (1.14 vs 1.20 used in Cloud Drive). Need use private (shaded) bytecode of the required version in the addon.
Create connector (may be a common base for) CMIS enabled DMSes, like SharePoint, Alfesco, Nuxeo etc.
Use thumbnails provided by a drive API in Icon view (and others) of eXo Documents.
Add possibility to disable a connector loaded in CloudDriveService by a configuration from exo.properties. As the properties file sets JVM properties this feature will rely on runtime properties in format clouddrive.PROVIDER_ID.disable=true
.
For example: clouddrive.cmis.disable=true
will disable the CMIS connector.
Allow custom initialization of context drive or files from Javascript client modules. Such customization can be useful when need make user- or provider specific operations using data obtained in the browser (cookies, other JS SDKs etc). Together with onLoad()
method it's also a place for last step customization of UI (e.g. file preview or editor setup).
Add to a client module initDrive(drive)
and initFile(file)
methods respectively.
Add support of Dropbox.
Extend CMIS connector with native Nuxeo ECM features and improve work with file trashing, copy and versioning of this CM platform.
Create a connector to Microsoft SharePoint using CMIS connector as a base.
Document watching produces NPE on a file change. This happens due to not set context instance in WebuiRequestContext. It is not set as a synchronization command works in dedicated thread (thread pool).
Similar situation was solved for ConversatonState and SessionProvider. But this time it should be fixed only for portal (Platform) environment.
It's already possible to link a file from cloud drive in any place of eXo Documents, but as the drive stays in Personal Documents, it may have a restrictive permissions that hide it from other users (e.g. in Social space). Thus issue may be related to #31.
Currently drive root folder has name in form DRIVENAME - [email protected]. This doesn't work properly within ECMS Documents app, it cannot navigate in its subfolders and build external links to drive files (e.g. for Watching). Encode drive root name using ICU's Transliterator class.
The addon seems to be working fine after some initial testing but I can't edit google docs in firefox, but can in chromium. Both browsers are up to date on xubuntu 12.04...
It's nothing major but I thought I'd add a comment...
Hi,
when I tried to connect to my Box, after logging in, I have an error as you can see from the screenshot that I attached
In practice, the rest service was launched on localhost of my client, and not on server of my platform (I see an url like http://localhost:80/portal/rest/clouddrive/connect/box?state=repository&code=KQ5U4DqQyOkeusK5iTvAw5o14itsvyCP).
I tried to launch rest service on exact address and the connection done
Simone
We check user name of current JCR session and already stored to access the storage. Under root account a system session used what lead to such problem as https://jira.exoplatform.org/browse/CLDINT-1314. This issue actual for root user access only and doesn't affect real users.
Extend CMIS connector with native aspects of Alfresco.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.