<namespaces>
<prefix>rep</prefix>
<prefix>jcr</prefix>
+ <!-- Argeo namespaces -->
+ <prefix>node</prefix>
+ <prefix>argeo</prefix>
+ <prefix>cms</prefix>
+ <prefix>slc</prefix>
+ <prefix>connect</prefix>
+ <prefix>activities</prefix>
+ <prefix>people</prefix>
+ <prefix>documents</prefix>
+ <prefix>tracker</prefix>
<!--
<uri>internal</uri>
<uri>http://www.jcp.org/jcr/1.0</uri>
import javax.jcr.Node;
import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
import javax.jcr.RepositoryFactory;
import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
import org.argeo.cms.CmsException;
import org.argeo.cms.auth.CurrentUser;
import org.argeo.jackrabbit.fs.AbstractJackrabbitFsProvider;
import org.argeo.jcr.fs.JcrFileSystem;
+import org.argeo.jcr.fs.JcrFileSystemProvider;
import org.argeo.jcr.fs.JcrFsException;
import org.argeo.node.NodeConstants;
+import org.argeo.node.NodeTypes;
import org.argeo.node.NodeUtils;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
public class CmsFsProvider extends AbstractJackrabbitFsProvider {
- private Map<String, JcrFileSystem> fileSystems = new HashMap<>();
+ private Map<String, CmsFileSystem> fileSystems = new HashMap<>();
@Override
public String getScheme() {
RepositoryFactory repositoryFactory = bc.getService(bc.getServiceReference(RepositoryFactory.class));
Repository repository = NodeUtils.getRepositoryByUri(repositoryFactory, repoUri.toString());
Session session = repository.login("main");
- JcrFileSystem fileSystem = new JcrFileSystem(this, session);
+ CmsFileSystem fileSystem = new CmsFileSystem(this, session);
fileSystems.put(username, fileSystem);
return fileSystem;
} else {
Repository repository = bc.getService(
bc.getServiceReferences(Repository.class, "(cn=" + NodeConstants.HOME + ")").iterator().next());
Session session = repository.login();
- JcrFileSystem fileSystem = new JcrFileSystem(this, session);
+ CmsFileSystem fileSystem = new CmsFileSystem(this, session);
fileSystems.put(username, fileSystem);
return fileSystem;
}
public Node getUserHome(Session session) {
return NodeUtils.getUserHome(session);
}
+
+ static class CmsFileSystem extends JcrFileSystem {
+ public CmsFileSystem(JcrFileSystemProvider provider, Session session) throws IOException {
+ super(provider, session);
+ }
+
+ public boolean skipNode(Node node) throws RepositoryException {
+ if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType(NodeTypes.NODE_USER_HOME)
+ || node.isNodeType(NodeTypes.NODE_GROUP_HOME))
+ return false;
+ return true;
+ }
+
+ }
}
private ServiceTracker<Repository, Repository> repositories;
private final ServiceTracker<HttpService, HttpService> httpServiceTracker;
- private static String httpRealm = "Argeo";
+ private String httpRealm = "Argeo";
+ private String webDavConfig = HttpUtils.WEBDAV_CONFIG;
private final boolean cleanState;
public NodeHttp(boolean cleanState) {
repositories.close();
}
- public static void registerRepositoryServlets(HttpService httpService, String alias, Repository repository) {
+ public void registerRepositoryServlets(HttpService httpService, String alias, Repository repository) {
if (httpService == null)
throw new CmsException("No HTTP service available");
try {
}
}
- static void registerWebdavServlet(HttpService httpService, String alias, Repository repository)
+ void registerWebdavServlet(HttpService httpService, String alias, Repository repository)
throws NamespaceException, ServletException {
// WebdavServlet webdavServlet = new WebdavServlet(repository, new
// OpenInViewSessionProvider(alias));
WebdavServlet webdavServlet = new WebdavServlet(repository, new CmsSessionProvider(alias));
String path = webdavPath(alias);
Properties ip = new Properties();
- ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_CONFIG, HttpUtils.WEBDAV_CONFIG);
+ ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_CONFIG, webDavConfig);
ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, path);
httpService.registerServlet(path, webdavServlet, ip, new DataHttpContext(httpRealm));
}
- static void registerFilesServlet(HttpService httpService, String alias, Repository repository)
+ void registerFilesServlet(HttpService httpService, String alias, Repository repository)
throws NamespaceException, ServletException {
WebdavServlet filesServlet = new WebdavServlet(repository, new CmsSessionProvider(alias));
String path = filesPath(alias);
Properties ip = new Properties();
- ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_CONFIG, HttpUtils.WEBDAV_CONFIG);
+ ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_CONFIG, webDavConfig);
ip.setProperty(WebdavServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, path);
httpService.registerServlet(path, filesServlet, ip, new PrivateHttpContext(httpRealm, true));
}
- static void registerRemotingServlet(HttpService httpService, String alias, Repository repository)
+ void registerRemotingServlet(HttpService httpService, String alias, Repository repository)
throws NamespaceException, ServletException {
RemotingServlet remotingServlet = new RemotingServlet(repository, new CmsSessionProvider(alias));
String path = remotingPath(alias);
return NodeConstants.PATH_FILES;
}
- // private Subject subjectFromRequest(HttpServletRequest request,
- // HttpServletResponse response) {
- // Authorization authorization = (Authorization)
- // request.getAttribute(HttpContext.AUTHORIZATION);
- // if (authorization == null)
- // throw new CmsException("Not authenticated");
- // try {
- // LoginContext lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER,
- // new HttpRequestCallbackHandler(request, response));
- // lc.login();
- // return lc.getSubject();
- // } catch (LoginException e) {
- // throw new CmsException("Cannot login", e);
- // }
- // }
-
- static class RepositoriesStc extends ServiceTracker<Repository, Repository> {
+ class RepositoriesStc extends ServiceTracker<Repository, Repository> {
private final HttpService httpService;
private final BundleContext bc;
}
private class PrepareHttpStc extends ServiceTracker<HttpService, HttpService> {
- // private DataHttp dataHttp;
- // private NodeHttp nodeHttp;
-
public PrepareHttpStc() {
super(bc, HttpService.class, null);
}
@Override
public void removedService(ServiceReference<HttpService> reference, HttpService service) {
- // if (dataHttp != null)
- // dataHttp.destroy();
- // dataHttp = null;
- // if (nodeHttp != null)
- // nodeHttp.destroy();
- // nodeHttp = null;
- // destroy();
repositories.close();
repositories = null;
}
package org.argeo.eclipse.ui.fs;
-import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
private boolean reverseOrder = false;
private String orderProperty = FsUiConstants.PROPERTY_NAME;
+ private Path initialPath = null;
+
public FsTableViewer(Composite parent, int style) {
super(parent, style | SWT.VIRTUAL);
}
final Object[] res;
if (isRoot)
res = rows;
+ else if (initialPath != null && initialPath.equals(dir))
+ res = rows;
else {
res = new Object[rows.length + 1];
res[0] = new ParentDir(dir.getParent());
this.refresh();
}
+ /**
+ * A path which is to be considered as root (and thus provide no link to a
+ * parent directory)
+ */
+ public void setInitialPath(Path initialPath) {
+ this.initialPath = initialPath;
+ }
+
private class MyLazyCP implements ILazyContentProvider {
private static final long serialVersionUID = 9096550041395433128L;
private Object[] elements;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
import org.argeo.eclipse.ui.EclipseUiUtils;
import org.eclipse.jface.viewers.ColumnLabelProvider;
/** Expect a {@link Path} as input element */
public class NioFileLabelProvider extends ColumnLabelProvider {
+ private final static FileTime EPOCH = FileTime.fromMillis(0);
private static final long serialVersionUID = 2160026425187796930L;
private final String propName;
+ private DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd hh:mm");
+ // TODO use new formatting
+ // DateTimeFormatter formatter =
+ // DateTimeFormatter.ofLocalizedDateTime( FormatStyle.SHORT )
+ // .withLocale( Locale.UK )
+ // .withZone( ZoneId.systemDefault() );
public NioFileLabelProvider(String propName) {
this.propName = propName;
}
@Override
public String getText(Object element) {
try {
+ Path path;
if (element instanceof ParentDir) {
- switch (propName) {
- case FsUiConstants.PROPERTY_SIZE:
- return "-";
- case FsUiConstants.PROPERTY_LAST_MODIFIED:
- return "-";
- // return Files.getLastModifiedTime(((ParentDir) element).getPath()).toString();
- case FsUiConstants.PROPERTY_TYPE:
- return "Folder";
- }
- }
-
- Path path = (Path) element;
+// switch (propName) {
+// case FsUiConstants.PROPERTY_SIZE:
+// return "-";
+// case FsUiConstants.PROPERTY_LAST_MODIFIED:
+// return "-";
+// // return Files.getLastModifiedTime(((ParentDir) element).getPath()).toString();
+// case FsUiConstants.PROPERTY_TYPE:
+// return "Folder";
+// }
+ path = ((ParentDir) element).getPath();
+ } else
+ path = (Path) element;
switch (propName) {
case FsUiConstants.PROPERTY_SIZE:
if (Files.isDirectory(path))
else
return FsUiUtils.humanReadableByteCount(Files.size(path), false);
case FsUiConstants.PROPERTY_LAST_MODIFIED:
- return Files.getLastModifiedTime(path).toString();
+ if (Files.isDirectory(path))
+ return "-";
+ FileTime time = Files.getLastModifiedTime(path);
+ if (time.equals(EPOCH))
+ return "-";
+ else
+ return dateFormat.format(new Date(time.toMillis()));
case FsUiConstants.PROPERTY_TYPE:
if (Files.isDirectory(path))
return "Folder";
package org.argeo.jcr.fs;
+import static javax.jcr.Property.JCR_CREATED;
+import static javax.jcr.Property.JCR_LAST_MODIFIED;
+
import java.nio.file.attribute.FileTime;
import java.time.Instant;
public class JcrBasicfileAttributes implements NodeFileAttributes {
private final Node node;
- private FileTime EPOCH = FileTime.fromMillis(0);
+ private final static FileTime EPOCH = FileTime.fromMillis(0);
public JcrBasicfileAttributes(Node node) {
if (node == null)
@Override
public FileTime lastModifiedTime() {
try {
- if (node.isNodeType(NodeType.MIX_LAST_MODIFIED)) {
- Instant instant = node.getProperty(Property.JCR_LAST_MODIFIED).getDate().toInstant();
+ if (node.hasProperty(JCR_LAST_MODIFIED)) {
+ Instant instant = node.getProperty(JCR_LAST_MODIFIED).getDate().toInstant();
+ return FileTime.from(instant);
+ } else if (node.hasProperty(JCR_CREATED)) {
+ Instant instant = node.getProperty(JCR_CREATED).getDate().toInstant();
return FileTime.from(instant);
}
+// if (node.isNodeType(NodeType.MIX_LAST_MODIFIED)) {
+// Instant instant = node.getProperty(Property.JCR_LAST_MODIFIED).getDate().toInstant();
+// return FileTime.from(instant);
+// }
return EPOCH;
} catch (RepositoryException e) {
throw new JcrFsException("Cannot get last modified time", e);
@Override
public FileTime creationTime() {
try {
- if (node.isNodeType(NodeType.MIX_CREATED)) {
- Instant instant = node.getProperty(Property.JCR_CREATED).getDate().toInstant();
+ if (node.hasProperty(JCR_CREATED)) {
+ Instant instant = node.getProperty(JCR_CREATED).getDate().toInstant();
+ return FileTime.from(instant);
+ } else if (node.hasProperty(JCR_LAST_MODIFIED)) {
+ Instant instant = node.getProperty(JCR_LAST_MODIFIED).getDate().toInstant();
return FileTime.from(instant);
}
+// if (node.isNodeType(NodeType.MIX_CREATED)) {
+// Instant instant = node.getProperty(JCR_CREATED).getDate().toInstant();
+// return FileTime.from(instant);
+// }
return EPOCH;
} catch (RepositoryException e) {
throw new JcrFsException("Cannot get creation time", e);
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
import org.argeo.jcr.JcrUtils;
}
}
+ /** Whetehr this node should be skippe din directory listings */
+ public boolean skipNode(Node node) throws RepositoryException {
+ if (node.isNodeType(NodeType.NT_HIERARCHY_NODE) || node.isNodeType("node:userHome")
+ || node.isNodeType("node:groupHome"))
+ return false;
+ return true;
+ }
+
public String getUserHomePath() {
return userHomePath;
}
@Override
public boolean isHidden(Path path) throws IOException {
- return false;
+ return path.getFileName().toString().charAt(0) == '.';
}
@Override
String nodeName = node.getName();
if (nodeName.startsWith("rep:") || nodeName.startsWith("jcr:"))
continue nodes;
+ if (fs.skipNode(node))
+ continue nodes;
next = new JcrPath(fs, node);
if (filter != null) {
if (filter.accept(next))