Giter Site home page Giter Site logo

cloud-drive-extension's People

Contributors

aheritier avatar igorkochmarskiy avatar nickengineer avatar pnedonosko avatar rdenarie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

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

cloud-drive-extension's Issues

[Gdrive] Cannot edit google-draw in Site Explorer

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

Connector API sanitization:

  • Move connectors code to outside of core
  • Each connector should use dedicated artefact
  • Support for Client customization (custom styles, Javascript, etc)

[Gdrive] Do not see summary notification after syncronizing

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)

Issue when eXo platform is behind an enterprise proxy which needs authentication

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

Bypass Google CORS for non-Google formats

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.

Ensure shared file permissions handled properly in Google connector

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).

Cloud-drive extension make js error when editing portal navigation

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

Integration with Social activity stream

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.

Cannot import a document with characters [] with Google Drive connector

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.

Features API

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.

Leftovers after uninstall ?

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 Google Drive

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/pull Comments from drive provider

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.

Save each file independently in JCR

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.

permission denied when trying to git cloud-drive-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).

Files not from user Google Drive appear in synchronization

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]

Removal of connectors by configuration

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 doesn't work for Google Drive

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"
}.

SSO for connect and embedded file UI

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.

Platform 4.1 support

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.

GoogleDrive continuous synchronizing and cancels Edit mode

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.

Don't try sync removed drive by client Javascript

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)

Connect Cloud document from any place in Platform

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.

REST service: return folder files

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.

SSO login

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.

CMIS connector

Create connector (may be a common base for) CMIS enabled DMSes, like SharePoint, Alfesco, Nuxeo etc.

Disable connector by configuration property

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.

Custom initialization of drive and files on user page

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.

Nuxeo ECM connector

Extend CMIS connector with native Nuxeo ECM features and improve work with file trashing, copy and versioning of this CM platform.

Setup Command thread depending on server environment

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.

Can't edit google docs in firefox, but can in chromium

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...

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.