mirror of
https://github.com/sismics/docs.git
synced 2024-11-25 23:27:57 +01:00
Merge branch 'master' into sismics_prod
This commit is contained in:
commit
ddd976162c
@ -13,27 +13,22 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 23
|
compileSdkVersion 24
|
||||||
buildToolsVersion '24'
|
buildToolsVersion '24'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 14
|
minSdkVersion 14
|
||||||
targetSdkVersion 23
|
targetSdkVersion 24
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "1.0"
|
versionName '1.0'
|
||||||
}
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_7
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_7
|
|
||||||
}
|
}
|
||||||
|
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
release {
|
release {
|
||||||
storeFile file(System.getenv("TRACKINO_STORE_PATH"))
|
storeFile file(System.getenv('TRACKINO_STORE_PATH'))
|
||||||
storePassword System.getenv("TRACKINO_STORE_PASS")
|
storePassword System.getenv('TRACKINO_STORE_PASS')
|
||||||
keyAlias System.getenv("TRACKINO_STORE_ALIAS")
|
keyAlias System.getenv('TRACKINO_STORE_ALIAS')
|
||||||
keyPassword System.getenv("TRACKINO_STORE_KEYPASS")
|
keyPassword System.getenv('TRACKINO_STORE_KEYPASS')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,13 +45,13 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile fileTree(dir: 'libs', include: '*.jar')
|
compile fileTree(dir: 'libs', include: '*.jar')
|
||||||
compile 'com.android.support:appcompat-v7:23.4.0'
|
compile 'com.android.support:appcompat-v7:24.0.0'
|
||||||
compile 'com.android.support:recyclerview-v7:23.4.0'
|
compile 'com.android.support:recyclerview-v7:24.0.0'
|
||||||
compile 'com.android.support:design:23.4.0'
|
compile 'com.android.support:design:24.0.0'
|
||||||
compile 'it.sephiroth.android.library.imagezoom:imagezoom:1.0.5'
|
compile 'it.sephiroth.android.library.imagezoom:imagezoom:1.0.5'
|
||||||
compile 'org.greenrobot:eventbus:3.0.0'
|
compile 'org.greenrobot:eventbus:3.0.0'
|
||||||
compile 'com.squareup.picasso:picasso:2.5.2'
|
compile 'com.squareup.picasso:picasso:2.5.2'
|
||||||
compile 'com.squareup.okhttp3:okhttp:3.3.1'
|
compile 'com.squareup.okhttp3:okhttp:3.4.0'
|
||||||
compile "com.squareup.okhttp3:okhttp-urlconnection:3.3.1"
|
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.0'
|
||||||
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'
|
compile 'com.jakewharton.picasso:picasso2-okhttp3-downloader:1.0.2'
|
||||||
}
|
}
|
||||||
|
@ -76,11 +76,6 @@ public class DocumentViewActivity extends AppCompatActivity {
|
|||||||
*/
|
*/
|
||||||
public static final int REQUEST_CODE_ADD_FILE = 1;
|
public static final int REQUEST_CODE_ADD_FILE = 1;
|
||||||
|
|
||||||
/**
|
|
||||||
* Request code of editing document.
|
|
||||||
*/
|
|
||||||
public static final int REQUEST_CODE_EDIT_DOCUMENT = 2;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File view pager.
|
* File view pager.
|
||||||
*/
|
*/
|
||||||
@ -214,7 +209,7 @@ public class DocumentViewActivity extends AppCompatActivity {
|
|||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
Intent intent = new Intent(DocumentViewActivity.this, DocumentEditActivity.class);
|
Intent intent = new Intent(DocumentViewActivity.this, DocumentEditActivity.class);
|
||||||
intent.putExtra("document", DocumentViewActivity.this.document.toString());
|
intent.putExtra("document", DocumentViewActivity.this.document.toString());
|
||||||
startActivityForResult(intent, REQUEST_CODE_EDIT_DOCUMENT);
|
startActivity(intent);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,9 +1,14 @@
|
|||||||
package com.sismics.docs.util;
|
package com.sismics.docs.util;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
|
import android.app.Activity;
|
||||||
import android.app.DownloadManager;
|
import android.app.DownloadManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
import android.support.v4.app.ActivityCompat;
|
||||||
|
import android.support.v4.content.ContextCompat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class for network actions.
|
* Utility class for network actions.
|
||||||
@ -19,9 +24,14 @@ public class NetworkUtil {
|
|||||||
* @param title Notification title
|
* @param title Notification title
|
||||||
* @param description Notification description
|
* @param description Notification description
|
||||||
*/
|
*/
|
||||||
public static void downloadFile(Context context, String url, String fileName, String title, String description) {
|
public static void downloadFile(Activity activity, String url, String fileName, String title, String description) {
|
||||||
String authToken = PreferenceUtil.getAuthToken(context);
|
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||||
DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
|
ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String authToken = PreferenceUtil.getAuthToken(activity);
|
||||||
|
DownloadManager downloadManager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
|
||||||
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
|
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
|
||||||
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
|
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
|
||||||
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
|
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
|
||||||
|
@ -34,7 +34,7 @@ public class LuceneDao {
|
|||||||
/**
|
/**
|
||||||
* Destroy and rebuild index.
|
* Destroy and rebuild index.
|
||||||
*
|
*
|
||||||
* @param fileList
|
* @param fileList List of files
|
||||||
*/
|
*/
|
||||||
public void rebuildIndex(final List<Document> documentList, final List<File> fileList) {
|
public void rebuildIndex(final List<Document> documentList, final List<File> fileList) {
|
||||||
LuceneUtil.handle(new LuceneRunnable() {
|
LuceneUtil.handle(new LuceneRunnable() {
|
||||||
@ -103,21 +103,6 @@ public class LuceneDao {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Update file index.
|
|
||||||
*
|
|
||||||
* @param file Updated file
|
|
||||||
*/
|
|
||||||
public void updateFile(final File file) {
|
|
||||||
LuceneUtil.handle(new LuceneRunnable() {
|
|
||||||
@Override
|
|
||||||
public void run(IndexWriter indexWriter) throws Exception {
|
|
||||||
org.apache.lucene.document.Document luceneDocument = getDocumentFromFile(file);
|
|
||||||
indexWriter.updateDocument(new Term("id", file.getId()), luceneDocument);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete document from the index.
|
* Delete document from the index.
|
||||||
*
|
*
|
||||||
@ -166,7 +151,7 @@ public class LuceneDao {
|
|||||||
|
|
||||||
// Search
|
// Search
|
||||||
DirectoryReader directoryReader = AppContext.getInstance().getIndexingService().getDirectoryReader();
|
DirectoryReader directoryReader = AppContext.getInstance().getIndexingService().getDirectoryReader();
|
||||||
Set<String> documentIdList = new HashSet<String>();
|
Set<String> documentIdList = new HashSet<>();
|
||||||
if (directoryReader == null) {
|
if (directoryReader == null) {
|
||||||
// The directory reader is not yet initialized (probably because there is nothing indexed)
|
// The directory reader is not yet initialized (probably because there is nothing indexed)
|
||||||
return documentIdList;
|
return documentIdList;
|
||||||
@ -176,8 +161,8 @@ public class LuceneDao {
|
|||||||
ScoreDoc[] docs = topDocs.scoreDocs;
|
ScoreDoc[] docs = topDocs.scoreDocs;
|
||||||
|
|
||||||
// Extract document IDs
|
// Extract document IDs
|
||||||
for (int i = 0; i < docs.length; i++) {
|
for (ScoreDoc doc : docs) {
|
||||||
org.apache.lucene.document.Document document = searcher.doc(docs[i].doc);
|
org.apache.lucene.document.Document document = searcher.doc(doc.doc);
|
||||||
String type = document.get("doctype");
|
String type = document.get("doctype");
|
||||||
String documentId = null;
|
String documentId = null;
|
||||||
if (type.equals("document")) {
|
if (type.equals("document")) {
|
||||||
@ -194,7 +179,7 @@ public class LuceneDao {
|
|||||||
/**
|
/**
|
||||||
* Build Lucene document from database document.
|
* Build Lucene document from database document.
|
||||||
*
|
*
|
||||||
* @param documentDto Document
|
* @param document Document
|
||||||
* @return Document
|
* @return Document
|
||||||
*/
|
*/
|
||||||
private org.apache.lucene.document.Document getDocumentFromDocument(Document document) {
|
private org.apache.lucene.document.Document getDocumentFromDocument(Document document) {
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
package com.sismics.docs.core.service;
|
package com.sismics.docs.core.service;
|
||||||
|
|
||||||
import java.io.IOException;
|
import com.google.common.util.concurrent.AbstractScheduledService;
|
||||||
import java.nio.file.Path;
|
import com.sismics.docs.core.constant.Constants;
|
||||||
import java.util.concurrent.TimeUnit;
|
import com.sismics.docs.core.event.RebuildIndexAsyncEvent;
|
||||||
|
import com.sismics.docs.core.model.context.AppContext;
|
||||||
|
import com.sismics.docs.core.util.DirectoryUtil;
|
||||||
|
import com.sismics.docs.core.util.TransactionUtil;
|
||||||
import org.apache.lucene.index.CheckIndex;
|
import org.apache.lucene.index.CheckIndex;
|
||||||
import org.apache.lucene.index.CheckIndex.Status;
|
import org.apache.lucene.index.CheckIndex.Status;
|
||||||
import org.apache.lucene.index.CheckIndex.Status.SegmentInfoStatus;
|
import org.apache.lucene.index.CheckIndex.Status.SegmentInfoStatus;
|
||||||
@ -16,12 +18,9 @@ import org.apache.lucene.util.Version;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.google.common.util.concurrent.AbstractScheduledService;
|
import java.io.IOException;
|
||||||
import com.sismics.docs.core.constant.Constants;
|
import java.nio.file.Path;
|
||||||
import com.sismics.docs.core.event.RebuildIndexAsyncEvent;
|
import java.util.concurrent.TimeUnit;
|
||||||
import com.sismics.docs.core.model.context.AppContext;
|
|
||||||
import com.sismics.docs.core.util.DirectoryUtil;
|
|
||||||
import com.sismics.docs.core.util.TransactionUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indexing service.
|
* Indexing service.
|
||||||
@ -129,16 +128,6 @@ public class IndexingService extends AbstractScheduledService {
|
|||||||
return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.HOURS);
|
return Scheduler.newFixedDelaySchedule(0, 1, TimeUnit.HOURS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy and rebuild Lucene index.
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public void rebuildIndex() throws Exception {
|
|
||||||
RebuildIndexAsyncEvent rebuildIndexAsyncEvent = new RebuildIndexAsyncEvent();
|
|
||||||
AppContext.getInstance().getAsyncEventBus().post(rebuildIndexAsyncEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getter of directory.
|
* Getter of directory.
|
||||||
*
|
*
|
||||||
|
@ -22,12 +22,12 @@ public class TransactionUtil {
|
|||||||
/**
|
/**
|
||||||
* Encapsulate a process into a transactionnal context.
|
* Encapsulate a process into a transactionnal context.
|
||||||
*
|
*
|
||||||
* @param runnable
|
* @param runnable Runnable
|
||||||
*/
|
*/
|
||||||
public static void handle(Runnable runnable) {
|
public static void handle(Runnable runnable) {
|
||||||
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
EntityManager em = ThreadLocalContext.get().getEntityManager();
|
||||||
|
|
||||||
if (em != null) {
|
if (em != null && em.isOpen()) {
|
||||||
// We are already in a transactional context, nothing to do
|
// We are already in a transactional context, nothing to do
|
||||||
runnable.run();
|
runnable.run();
|
||||||
return;
|
return;
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
package com.sismics.util.context;
|
package com.sismics.util.context;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.sismics.docs.core.model.context.AppContext;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Context associated to a user request, and stored in a ThreadLocal.
|
* Context associated to a user request, and stored in a ThreadLocal.
|
||||||
@ -18,6 +22,11 @@ public class ThreadLocalContext {
|
|||||||
*/
|
*/
|
||||||
private EntityManager entityManager;
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of async events posted during this request.
|
||||||
|
*/
|
||||||
|
private List<Object> asyncEventList = Lists.newArrayList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private constructor.
|
* Private constructor.
|
||||||
*/
|
*/
|
||||||
@ -63,4 +72,22 @@ public class ThreadLocalContext {
|
|||||||
public void setEntityManager(EntityManager entityManager) {
|
public void setEntityManager(EntityManager entityManager) {
|
||||||
this.entityManager = entityManager;
|
this.entityManager = entityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an async event to the queue to be fired after the current request.
|
||||||
|
*
|
||||||
|
* @param asyncEvent Async event
|
||||||
|
*/
|
||||||
|
public void addAsyncEvent(Object asyncEvent) {
|
||||||
|
asyncEventList.add(asyncEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fire all pending async events.
|
||||||
|
*/
|
||||||
|
public void fireAllAsyncEvents() {
|
||||||
|
for (Object asyncEvent : asyncEventList) {
|
||||||
|
AppContext.getInstance().getAsyncEventBus().post(asyncEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,5 +43,4 @@ public class HeaderBasedSecurityFilter extends SecurityFilter {
|
|||||||
}
|
}
|
||||||
return new UserDao().getActiveByUsername(username);
|
return new UserDao().getActiveByUsername(username);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -141,6 +141,10 @@ public class RequestContextFilter implements Filter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fire all pending async events after request transaction commit.
|
||||||
|
// This way, all modifications done during this request are available in the listeners.
|
||||||
|
context.fireAllAsyncEvents();
|
||||||
|
|
||||||
ThreadLocalContext.cleanup();
|
ThreadLocalContext.cleanup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,6 @@ public class TokenBasedSecurityFilter extends SecurityFilter {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
authTokenDao.updateLastConnectionDate(authToken.getId());
|
|
||||||
return new UserDao().getById(authToken.getUserId());
|
return new UserDao().getById(authToken.getUserId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -281,10 +281,10 @@
|
|||||||
<arg line="install" />
|
<arg line="install" />
|
||||||
</exec>
|
</exec>
|
||||||
<!-- grunt -->
|
<!-- grunt -->
|
||||||
<exec executable="cmd" dir="${project.basedir}/src/main/webapp" osfamily="windows">
|
<exec executable="cmd" dir="${project.basedir}/src/main/webapp" osfamily="windows" failonerror="true">
|
||||||
<arg line="/c grunt --apiurl=api" />
|
<arg line="/c grunt --apiurl=api" />
|
||||||
</exec>
|
</exec>
|
||||||
<exec executable="grunt" dir="${project.basedir}/src/main/webapp" osfamily="unix">
|
<exec executable="grunt" dir="${project.basedir}/src/main/webapp" osfamily="unix" failonerror="true">
|
||||||
<arg line="--apiurl=api" />
|
<arg line="--apiurl=api" />
|
||||||
</exec>
|
</exec>
|
||||||
</target>
|
</target>
|
||||||
|
@ -23,6 +23,7 @@ import com.sismics.docs.core.dao.jpa.*;
|
|||||||
import com.sismics.docs.core.dao.jpa.criteria.TagCriteria;
|
import com.sismics.docs.core.dao.jpa.criteria.TagCriteria;
|
||||||
import com.sismics.docs.core.dao.jpa.dto.AclDto;
|
import com.sismics.docs.core.dao.jpa.dto.AclDto;
|
||||||
import com.sismics.docs.core.dao.jpa.dto.TagDto;
|
import com.sismics.docs.core.dao.jpa.dto.TagDto;
|
||||||
|
import com.sismics.docs.core.event.RebuildIndexAsyncEvent;
|
||||||
import com.sismics.docs.core.model.jpa.Acl;
|
import com.sismics.docs.core.model.jpa.Acl;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.log4j.Appender;
|
import org.apache.log4j.Appender;
|
||||||
@ -213,11 +214,8 @@ public class AppResource extends BaseResource {
|
|||||||
}
|
}
|
||||||
checkBaseFunction(BaseFunction.ADMIN);
|
checkBaseFunction(BaseFunction.ADMIN);
|
||||||
|
|
||||||
try {
|
RebuildIndexAsyncEvent rebuildIndexAsyncEvent = new RebuildIndexAsyncEvent();
|
||||||
AppContext.getInstance().getIndexingService().rebuildIndex();
|
ThreadLocalContext.get().addAsyncEvent(rebuildIndexAsyncEvent);
|
||||||
} catch (Exception e) {
|
|
||||||
throw new ServerException("IndexingError", "Error rebuilding the index", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always return OK
|
// Always return OK
|
||||||
JsonObjectBuilder response = Json.createObjectBuilder()
|
JsonObjectBuilder response = Json.createObjectBuilder()
|
||||||
|
@ -28,6 +28,7 @@ import com.sismics.rest.exception.ServerException;
|
|||||||
import com.sismics.rest.util.AclUtil;
|
import com.sismics.rest.util.AclUtil;
|
||||||
import com.sismics.rest.util.JsonUtil;
|
import com.sismics.rest.util.JsonUtil;
|
||||||
import com.sismics.rest.util.ValidationUtil;
|
import com.sismics.rest.util.ValidationUtil;
|
||||||
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
import com.sismics.util.mime.MimeType;
|
import com.sismics.util.mime.MimeType;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.format.DateTimeFormat;
|
import org.joda.time.format.DateTimeFormat;
|
||||||
@ -636,7 +637,7 @@ public class DocumentResource extends BaseResource {
|
|||||||
DocumentCreatedAsyncEvent documentCreatedAsyncEvent = new DocumentCreatedAsyncEvent();
|
DocumentCreatedAsyncEvent documentCreatedAsyncEvent = new DocumentCreatedAsyncEvent();
|
||||||
documentCreatedAsyncEvent.setUserId(principal.getId());
|
documentCreatedAsyncEvent.setUserId(principal.getId());
|
||||||
documentCreatedAsyncEvent.setDocument(document);
|
documentCreatedAsyncEvent.setDocument(document);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentCreatedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentCreatedAsyncEvent);
|
||||||
|
|
||||||
JsonObjectBuilder response = Json.createObjectBuilder()
|
JsonObjectBuilder response = Json.createObjectBuilder()
|
||||||
.add("id", documentId);
|
.add("id", documentId);
|
||||||
@ -757,7 +758,7 @@ public class DocumentResource extends BaseResource {
|
|||||||
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
||||||
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
||||||
documentUpdatedAsyncEvent.setDocumentId(id);
|
documentUpdatedAsyncEvent.setDocumentId(id);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentUpdatedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentUpdatedAsyncEvent);
|
||||||
|
|
||||||
JsonObjectBuilder response = Json.createObjectBuilder()
|
JsonObjectBuilder response = Json.createObjectBuilder()
|
||||||
.add("id", id);
|
.add("id", id);
|
||||||
@ -852,14 +853,14 @@ public class DocumentResource extends BaseResource {
|
|||||||
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
||||||
fileDeletedAsyncEvent.setUserId(principal.getId());
|
fileDeletedAsyncEvent.setUserId(principal.getId());
|
||||||
fileDeletedAsyncEvent.setFile(file);
|
fileDeletedAsyncEvent.setFile(file);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(fileDeletedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(fileDeletedAsyncEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Raise a document deleted event
|
// Raise a document deleted event
|
||||||
DocumentDeletedAsyncEvent documentDeletedAsyncEvent = new DocumentDeletedAsyncEvent();
|
DocumentDeletedAsyncEvent documentDeletedAsyncEvent = new DocumentDeletedAsyncEvent();
|
||||||
documentDeletedAsyncEvent.setUserId(principal.getId());
|
documentDeletedAsyncEvent.setUserId(principal.getId());
|
||||||
documentDeletedAsyncEvent.setDocumentId(id);
|
documentDeletedAsyncEvent.setDocumentId(id);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentDeletedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentDeletedAsyncEvent);
|
||||||
|
|
||||||
// Always return OK
|
// Always return OK
|
||||||
JsonObjectBuilder response = Json.createObjectBuilder()
|
JsonObjectBuilder response = Json.createObjectBuilder()
|
||||||
|
@ -1,30 +1,5 @@
|
|||||||
package com.sismics.docs.rest.resource;
|
package com.sismics.docs.rest.resource;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.text.MessageFormat;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.zip.ZipEntry;
|
|
||||||
import java.util.zip.ZipOutputStream;
|
|
||||||
|
|
||||||
import javax.json.Json;
|
|
||||||
import javax.json.JsonArrayBuilder;
|
|
||||||
import javax.json.JsonObjectBuilder;
|
|
||||||
import javax.ws.rs.*;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import javax.ws.rs.core.Response.Status;
|
|
||||||
import javax.ws.rs.core.StreamingOutput;
|
|
||||||
|
|
||||||
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
|
|
||||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
@ -37,7 +12,6 @@ import com.sismics.docs.core.dao.jpa.dto.DocumentDto;
|
|||||||
import com.sismics.docs.core.event.DocumentUpdatedAsyncEvent;
|
import com.sismics.docs.core.event.DocumentUpdatedAsyncEvent;
|
||||||
import com.sismics.docs.core.event.FileCreatedAsyncEvent;
|
import com.sismics.docs.core.event.FileCreatedAsyncEvent;
|
||||||
import com.sismics.docs.core.event.FileDeletedAsyncEvent;
|
import com.sismics.docs.core.event.FileDeletedAsyncEvent;
|
||||||
import com.sismics.docs.core.model.context.AppContext;
|
|
||||||
import com.sismics.docs.core.model.jpa.File;
|
import com.sismics.docs.core.model.jpa.File;
|
||||||
import com.sismics.docs.core.model.jpa.User;
|
import com.sismics.docs.core.model.jpa.User;
|
||||||
import com.sismics.docs.core.util.DirectoryUtil;
|
import com.sismics.docs.core.util.DirectoryUtil;
|
||||||
@ -49,8 +23,32 @@ import com.sismics.rest.exception.ForbiddenClientException;
|
|||||||
import com.sismics.rest.exception.ServerException;
|
import com.sismics.rest.exception.ServerException;
|
||||||
import com.sismics.rest.util.JsonUtil;
|
import com.sismics.rest.util.JsonUtil;
|
||||||
import com.sismics.rest.util.ValidationUtil;
|
import com.sismics.rest.util.ValidationUtil;
|
||||||
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
import com.sismics.util.mime.MimeType;
|
import com.sismics.util.mime.MimeType;
|
||||||
import com.sismics.util.mime.MimeTypeUtil;
|
import com.sismics.util.mime.MimeTypeUtil;
|
||||||
|
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
|
||||||
|
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||||
|
|
||||||
|
import javax.json.Json;
|
||||||
|
import javax.json.JsonArrayBuilder;
|
||||||
|
import javax.json.JsonObjectBuilder;
|
||||||
|
import javax.ws.rs.*;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import javax.ws.rs.core.Response.Status;
|
||||||
|
import javax.ws.rs.core.StreamingOutput;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File REST resources.
|
* File REST resources.
|
||||||
@ -179,12 +177,12 @@ public class FileResource extends BaseResource {
|
|||||||
fileCreatedAsyncEvent.setFile(file);
|
fileCreatedAsyncEvent.setFile(file);
|
||||||
fileCreatedAsyncEvent.setInputStream(fileInputStream);
|
fileCreatedAsyncEvent.setInputStream(fileInputStream);
|
||||||
fileCreatedAsyncEvent.setPdfInputStream(pdfIntputStream);
|
fileCreatedAsyncEvent.setPdfInputStream(pdfIntputStream);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(fileCreatedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(fileCreatedAsyncEvent);
|
||||||
|
|
||||||
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
||||||
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
||||||
documentUpdatedAsyncEvent.setDocumentId(documentId);
|
documentUpdatedAsyncEvent.setDocumentId(documentId);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentUpdatedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentUpdatedAsyncEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always return OK
|
// Always return OK
|
||||||
@ -262,12 +260,12 @@ public class FileResource extends BaseResource {
|
|||||||
fileCreatedAsyncEvent.setLanguage(documentDto.getLanguage());
|
fileCreatedAsyncEvent.setLanguage(documentDto.getLanguage());
|
||||||
fileCreatedAsyncEvent.setFile(file);
|
fileCreatedAsyncEvent.setFile(file);
|
||||||
fileCreatedAsyncEvent.setInputStream(responseInputStream);
|
fileCreatedAsyncEvent.setInputStream(responseInputStream);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(fileCreatedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(fileCreatedAsyncEvent);
|
||||||
|
|
||||||
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
||||||
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
||||||
documentUpdatedAsyncEvent.setDocumentId(documentId);
|
documentUpdatedAsyncEvent.setDocumentId(documentId);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentUpdatedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentUpdatedAsyncEvent);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ServerException("AttachError", "Error attaching file to document", e);
|
throw new ServerException("AttachError", "Error attaching file to document", e);
|
||||||
}
|
}
|
||||||
@ -455,14 +453,14 @@ public class FileResource extends BaseResource {
|
|||||||
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
||||||
fileDeletedAsyncEvent.setUserId(principal.getId());
|
fileDeletedAsyncEvent.setUserId(principal.getId());
|
||||||
fileDeletedAsyncEvent.setFile(file);
|
fileDeletedAsyncEvent.setFile(file);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(fileDeletedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(fileDeletedAsyncEvent);
|
||||||
|
|
||||||
if (file.getDocumentId() != null) {
|
if (file.getDocumentId() != null) {
|
||||||
// Raise a new document updated
|
// Raise a new document updated
|
||||||
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
DocumentUpdatedAsyncEvent documentUpdatedAsyncEvent = new DocumentUpdatedAsyncEvent();
|
||||||
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
documentUpdatedAsyncEvent.setUserId(principal.getId());
|
||||||
documentUpdatedAsyncEvent.setDocumentId(file.getDocumentId());
|
documentUpdatedAsyncEvent.setDocumentId(file.getDocumentId());
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentUpdatedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentUpdatedAsyncEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always return OK
|
// Always return OK
|
||||||
|
@ -1,52 +1,18 @@
|
|||||||
package com.sismics.docs.rest.resource;
|
package com.sismics.docs.rest.resource;
|
||||||
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.json.Json;
|
|
||||||
import javax.json.JsonArrayBuilder;
|
|
||||||
import javax.json.JsonObjectBuilder;
|
|
||||||
import javax.servlet.http.Cookie;
|
|
||||||
import javax.ws.rs.DELETE;
|
|
||||||
import javax.ws.rs.FormParam;
|
|
||||||
import javax.ws.rs.GET;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.PUT;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.PathParam;
|
|
||||||
import javax.ws.rs.Produces;
|
|
||||||
import javax.ws.rs.QueryParam;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import javax.ws.rs.core.NewCookie;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
|
|
||||||
import com.sismics.docs.core.constant.ConfigType;
|
|
||||||
import com.sismics.docs.core.util.ConfigUtil;
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
|
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
import com.sismics.docs.core.constant.ConfigType;
|
||||||
import com.sismics.docs.core.constant.Constants;
|
import com.sismics.docs.core.constant.Constants;
|
||||||
import com.sismics.docs.core.dao.jpa.AuthenticationTokenDao;
|
import com.sismics.docs.core.dao.jpa.*;
|
||||||
import com.sismics.docs.core.dao.jpa.DocumentDao;
|
|
||||||
import com.sismics.docs.core.dao.jpa.FileDao;
|
|
||||||
import com.sismics.docs.core.dao.jpa.GroupDao;
|
|
||||||
import com.sismics.docs.core.dao.jpa.RoleBaseFunctionDao;
|
|
||||||
import com.sismics.docs.core.dao.jpa.UserDao;
|
|
||||||
import com.sismics.docs.core.dao.jpa.criteria.GroupCriteria;
|
import com.sismics.docs.core.dao.jpa.criteria.GroupCriteria;
|
||||||
import com.sismics.docs.core.dao.jpa.criteria.UserCriteria;
|
import com.sismics.docs.core.dao.jpa.criteria.UserCriteria;
|
||||||
import com.sismics.docs.core.dao.jpa.dto.GroupDto;
|
import com.sismics.docs.core.dao.jpa.dto.GroupDto;
|
||||||
import com.sismics.docs.core.dao.jpa.dto.UserDto;
|
import com.sismics.docs.core.dao.jpa.dto.UserDto;
|
||||||
import com.sismics.docs.core.event.DocumentDeletedAsyncEvent;
|
import com.sismics.docs.core.event.DocumentDeletedAsyncEvent;
|
||||||
import com.sismics.docs.core.event.FileDeletedAsyncEvent;
|
import com.sismics.docs.core.event.FileDeletedAsyncEvent;
|
||||||
import com.sismics.docs.core.model.context.AppContext;
|
import com.sismics.docs.core.model.jpa.*;
|
||||||
import com.sismics.docs.core.model.jpa.AuthenticationToken;
|
import com.sismics.docs.core.util.ConfigUtil;
|
||||||
import com.sismics.docs.core.model.jpa.Document;
|
|
||||||
import com.sismics.docs.core.model.jpa.File;
|
|
||||||
import com.sismics.docs.core.model.jpa.Group;
|
|
||||||
import com.sismics.docs.core.model.jpa.User;
|
|
||||||
import com.sismics.docs.core.util.EncryptionUtil;
|
import com.sismics.docs.core.util.EncryptionUtil;
|
||||||
import com.sismics.docs.core.util.jpa.SortCriteria;
|
import com.sismics.docs.core.util.jpa.SortCriteria;
|
||||||
import com.sismics.docs.rest.constant.BaseFunction;
|
import com.sismics.docs.rest.constant.BaseFunction;
|
||||||
@ -56,9 +22,24 @@ import com.sismics.rest.exception.ServerException;
|
|||||||
import com.sismics.rest.util.JsonUtil;
|
import com.sismics.rest.util.JsonUtil;
|
||||||
import com.sismics.rest.util.ValidationUtil;
|
import com.sismics.rest.util.ValidationUtil;
|
||||||
import com.sismics.security.UserPrincipal;
|
import com.sismics.security.UserPrincipal;
|
||||||
|
import com.sismics.util.context.ThreadLocalContext;
|
||||||
import com.sismics.util.filter.TokenBasedSecurityFilter;
|
import com.sismics.util.filter.TokenBasedSecurityFilter;
|
||||||
import com.sismics.util.totp.GoogleAuthenticator;
|
import com.sismics.util.totp.GoogleAuthenticator;
|
||||||
import com.sismics.util.totp.GoogleAuthenticatorKey;
|
import com.sismics.util.totp.GoogleAuthenticatorKey;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
|
||||||
|
import javax.json.Json;
|
||||||
|
import javax.json.JsonArrayBuilder;
|
||||||
|
import javax.json.JsonObjectBuilder;
|
||||||
|
import javax.servlet.http.Cookie;
|
||||||
|
import javax.ws.rs.*;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.NewCookie;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User REST resources.
|
* User REST resources.
|
||||||
@ -472,7 +453,7 @@ public class UserResource extends BaseResource {
|
|||||||
DocumentDeletedAsyncEvent documentDeletedAsyncEvent = new DocumentDeletedAsyncEvent();
|
DocumentDeletedAsyncEvent documentDeletedAsyncEvent = new DocumentDeletedAsyncEvent();
|
||||||
documentDeletedAsyncEvent.setUserId(principal.getId());
|
documentDeletedAsyncEvent.setUserId(principal.getId());
|
||||||
documentDeletedAsyncEvent.setDocumentId(document.getId());
|
documentDeletedAsyncEvent.setDocumentId(document.getId());
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentDeletedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentDeletedAsyncEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Raise deleted events for files (don't bother sending document updated event)
|
// Raise deleted events for files (don't bother sending document updated event)
|
||||||
@ -480,7 +461,7 @@ public class UserResource extends BaseResource {
|
|||||||
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
||||||
fileDeletedAsyncEvent.setUserId(principal.getId());
|
fileDeletedAsyncEvent.setUserId(principal.getId());
|
||||||
fileDeletedAsyncEvent.setFile(file);
|
fileDeletedAsyncEvent.setFile(file);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(fileDeletedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(fileDeletedAsyncEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always return OK
|
// Always return OK
|
||||||
@ -546,7 +527,7 @@ public class UserResource extends BaseResource {
|
|||||||
DocumentDeletedAsyncEvent documentDeletedAsyncEvent = new DocumentDeletedAsyncEvent();
|
DocumentDeletedAsyncEvent documentDeletedAsyncEvent = new DocumentDeletedAsyncEvent();
|
||||||
documentDeletedAsyncEvent.setUserId(principal.getId());
|
documentDeletedAsyncEvent.setUserId(principal.getId());
|
||||||
documentDeletedAsyncEvent.setDocumentId(document.getId());
|
documentDeletedAsyncEvent.setDocumentId(document.getId());
|
||||||
AppContext.getInstance().getAsyncEventBus().post(documentDeletedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(documentDeletedAsyncEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Raise deleted events for files (don't bother sending document updated event)
|
// Raise deleted events for files (don't bother sending document updated event)
|
||||||
@ -554,7 +535,7 @@ public class UserResource extends BaseResource {
|
|||||||
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
FileDeletedAsyncEvent fileDeletedAsyncEvent = new FileDeletedAsyncEvent();
|
||||||
fileDeletedAsyncEvent.setUserId(principal.getId());
|
fileDeletedAsyncEvent.setUserId(principal.getId());
|
||||||
fileDeletedAsyncEvent.setFile(file);
|
fileDeletedAsyncEvent.setFile(file);
|
||||||
AppContext.getInstance().getAsyncEventBus().post(fileDeletedAsyncEvent);
|
ThreadLocalContext.get().addAsyncEvent(fileDeletedAsyncEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always return OK
|
// Always return OK
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
"name": "sismics-docs",
|
"name": "sismics-docs",
|
||||||
"description": "Lightweight document management system",
|
"description": "Lightweight document management system",
|
||||||
"readme": "See http://github.com/simics/docs for more informations.",
|
"readme": "See http://github.com/simics/docs for more informations.",
|
||||||
|
"license": "GPL-2.0",
|
||||||
"version": "1.5.0",
|
"version": "1.5.0",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
Loading…
Reference in New Issue
Block a user