You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2013/08/10 07:53:54 UTC
svn commit: r1512568 [37/39] - in /jackrabbit/commons/filevault/trunk: ./
parent/ vault-cli/ vault-cli/src/ vault-cli/src/main/
vault-cli/src/main/appassembler/ vault-cli/src/main/assembly/
vault-cli/src/main/java/ vault-cli/src/main/java/org/ vault-cl...
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Checkout.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Checkout.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Checkout.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Checkout.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Collections;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.vault.fs.api.DumpContext;
+import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.fs.config.DefaultMetaInf;
+import org.apache.jackrabbit.vault.util.PathUtil;
+import org.apache.jackrabbit.vault.vlt.VltContext;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+
+/**
+ * <code>Checkout</code>...
+ *
+ */
+public class Checkout extends AbstractAction {
+
+ private RepositoryAddress mountPoint;
+
+ private String remoteDir;
+
+ private File localDir;
+
+ private boolean force;
+
+ public Checkout(RepositoryAddress mountPoint, String remoteDir, File localDir) {
+ this.mountPoint = mountPoint;
+ this.remoteDir = remoteDir;
+ this.localDir = localDir;
+ }
+
+ public boolean isForce() {
+ return force;
+ }
+
+ public void setForce(boolean force) {
+ this.force = force;
+ }
+
+ public void run(VltContext ctx) throws VltException {
+ if (!localDir.exists()) {
+ if (!localDir.mkdir()) {
+ throw ctx.error(localDir.getPath(), "could not create directory");
+ }
+ }
+ // check for meta inf
+ if (ctx.getExportRoot().isValid()) {
+ String path = ctx.getExportRoot().getJcrRoot().getPath();
+ if (force) {
+ ctx.printMessage("Checkout " + mountPoint.resolve(remoteDir) + " with local files using root at " + path);
+ } else {
+ throw ctx.error(localDir.getPath(),
+ "there seems to be already a checkout at " + path + ". " +
+ "Use --force option to overwrite local files with remote.");
+ }
+ } else {
+ // turn of sync
+ if (force) {
+ ctx.printMessage("Warning: --force was specified but no prior checkout detected. disabling it.");
+ force = false;
+ }
+ try {
+ ctx.getExportRoot().create();
+ localDir = ctx.getExportRoot().getJcrRoot();
+ } catch (IOException e) {
+ throw ctx.exception(localDir.getPath(), "Error while creating meta-info", e);
+ }
+ }
+ try {
+ if (remoteDir == null) {
+ remoteDir = "/";
+ }
+ VaultFile vaultFile = ctx.getFileSystem(mountPoint).getFile(remoteDir);
+ if (vaultFile == null) {
+ throw new VltException(remoteDir, "Error during checkout. Remote directory does not exit.");
+ }
+ // store filter and config
+ if (!force) {
+ DefaultMetaInf inf = (DefaultMetaInf) ctx.getMetaInf();
+ inf.setConfig(vaultFile.getFileSystem().getConfig());
+ inf.setFilter(vaultFile.getFileSystem().getWorkspaceFilter());
+ inf.save(ctx.getExportRoot().getMetaDir());
+ }
+ if (ctx.isVerbose()) {
+ DumpContext dc = new DumpContext(new PrintWriter(ctx.getStdout()));
+ dc.println("Filter");
+ ctx.getMetaInf().getFilter().dump(dc, true);
+ dc.outdent();
+ dc.flush();
+ }
+
+ String path = PathUtil.getRelativeFilePath(ctx.getCwd().getPath(), localDir.getPath());
+ ctx.printMessage("Checking out " + vaultFile.getPath() + " to " + path);
+ VltDirectory dir = new VltDirectory(ctx, localDir);
+ if (dir.isControlled()) {
+ if (!force) {
+ throw dir.getContext().error(dir.getPath(), "already under vault control.");
+ }
+ } else {
+ dir.control(vaultFile.getPath(), vaultFile.getAggregate().getPath());
+ }
+ ctx.setMountpoint(vaultFile.getAggregate().getManager().getMountpoint());
+ // re-open parent dir to avoid problems with zip-meta-dirs
+ dir = new VltDirectory(ctx, localDir);
+ Update up = new Update(localDir, null, false);
+ up.setOnlyControlled(true);
+ up.setForce(force);
+ dir.applyWithRemote(up, Collections.<String>emptyList(), false);
+ ctx.printMessage("Checkout done.");
+ } catch (IOException e) {
+ throw new VltException(localDir.getPath(), "Error during checkout", e);
+ } catch (RepositoryException e) {
+ throw new VltException(remoteDir, "Error during checkout", e);
+ }
+ }
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Commit.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Commit.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Commit.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Commit.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFsTransaction;
+import org.apache.jackrabbit.vault.fs.impl.TransactionImpl;
+import org.apache.jackrabbit.vault.util.PathComparator;
+import org.apache.jackrabbit.vault.util.Text;
+import org.apache.jackrabbit.vault.vlt.FileAction;
+import org.apache.jackrabbit.vault.vlt.VltContext;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+
+/**
+ * <code>Resolved</code>...
+ *
+ */
+public class Commit extends AbstractAction {
+
+ private File localDir;
+
+ private List<File> localFiles;
+
+ private boolean nonRecursive;
+
+ private boolean force;
+
+ public Commit(File localDir, List<File> localFiles, boolean nonRecursive, boolean force) {
+ this.localDir = localDir;
+ this.localFiles = localFiles;
+ this.nonRecursive = nonRecursive;
+ this.force = force;
+ }
+
+ public void run(VltContext ctx) throws VltException {
+ VltTree infos = new VltTree(ctx, nonRecursive);
+ try {
+ if (localFiles.isEmpty()) {
+ infos.add(localDir);
+ } else {
+ infos.setDirsAsFiles(true);
+ infos.addAll(localFiles);
+ }
+ } catch (IOException e) {
+ throw new VltException("Unable to commit changes.", e);
+ }
+
+ // get common ancestor
+ String localRoot = infos.getRootPath();
+ VltDirectory root = new VltDirectory(ctx, new File(localRoot));
+ // mount fs at the top most directory
+ if (root.isControlled()) {
+ ctx.setFsRoot(root);
+ }
+ int rootLen = ctx.getFsRoot().length();
+
+ // create transaction with all changes
+ VaultFsTransaction tx = ctx.getFileSystem(ctx.getMountpoint()).startTransaction();
+ ctx.printMessage("Collecting commit information...");
+ for (VltTree.Info i: infos.infos()) {
+ i.dir.prepareCommit(tx, i.names, nonRecursive, force);
+ }
+
+ // do commit (assuming all files from the same repo)
+ ctx.printMessage("Transmitting file data...");
+ List<TransactionImpl.Info> txInfos;
+ try {
+ txInfos = new ArrayList<TransactionImpl.Info>(tx.commit());
+ } catch (Exception e) {
+ throw new VltException("Error while committing", e);
+ }
+ // sort them deepest first
+ Collections.sort(txInfos, new Comparator<TransactionImpl.Info>(){
+ private final PathComparator pc = new PathComparator();
+ public int compare(TransactionImpl.Info o1, TransactionImpl.Info o2) {
+ return -pc.compare(o1.getPath(), o2.getPath());
+ }
+ });
+
+ // updating entries
+ infos.clear();
+ for (TransactionImpl.Info info: txInfos) {
+ if (info.getType() == TransactionImpl.Type.ERROR) {
+ ctx.printMessage("Could not process " + info.getPath());
+ continue;
+ }
+ String fileName = Text.getName(info.getPath());
+ // get vlt directory
+ String dirPath = Text.getRelativeParent(info.getPath(), 1);
+ if (dirPath.length() > rootLen && !localRoot.endsWith(dirPath)) {
+ // calculate the fs-root relative path, in case the repo was not mounted at jcr:root
+ dirPath = dirPath.substring(rootLen + 1);
+ } else if (dirPath.length() < rootLen) {
+ // dir path outside of the mounted repo. special case
+ dirPath = "";
+ fileName = "";
+ } else {
+ dirPath = "";
+ }
+ File localDir = new File(localRoot, dirPath);
+ if (!localDir.exists()) {
+ // directory was already deleted, just print message and continue
+ File file = new File(localDir, fileName);
+ ctx.printAction(file.getPath(), FileAction.DELETED, null);
+ continue;
+ }
+
+ VltDirectory dir = new VltDirectory(ctx, localDir);
+
+ // check if local file is a directory
+ File localFile = new File(localDir, fileName);
+ if (localFile.isDirectory()) {
+ dir = new VltDirectory(ctx, localFile);
+ } else {
+ dir.updateComitted(info.getPath(), fileName);
+ }
+
+ // remember directory
+ infos.put(dir);
+ }
+
+ // to be on the save side, issue an update on all directories
+ Update upd = new Update(localDir, null, nonRecursive);
+ infos.put(root);
+ upd.setOnlyControlled(true);
+ for (VltTree.Info i: infos.infos()) {
+ i.dir.applyWithRemote(upd, Collections.<String>emptyList(), nonRecursive);
+ }
+
+ ctx.printMessage("done.");
+ }
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Debug.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Debug.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Debug.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Debug.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.apache.jackrabbit.vault.vlt.VltContext;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <code>Resolved</code>...
+ *
+ */
+public class Debug extends AbstractAction {
+
+ /**
+ * default logger
+ */
+ private static final Logger log = LoggerFactory.getLogger(Debug.class);
+
+ private final File localDir;
+
+ public Debug(File localDir) {
+ this.localDir = localDir;
+ }
+
+ public void run(VltContext ctx) throws VltException {
+ VltDirectory root = new VltDirectory(ctx, localDir);
+ // mount fs at the top most directory
+ if (root.isControlled()) {
+ ctx.setFsRoot(root);
+ }
+ Session s = ctx.getFileSystem(ctx.getMountpoint()).getAggregateManager().getSession();
+ byte[] buf = new byte[0x5000];
+ try {
+ Node tmp = s.getNode("/tmp");
+ tmp.setProperty("test_binary", new ByteArrayInputStream(buf));
+ tmp.setProperty("test_binary", new ByteArrayInputStream(buf));
+ s.save();
+ } catch (RepositoryException e) {
+ log.error("Failed", e);
+ }
+ ctx.printMessage("done.");
+ }
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Delete.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Delete.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Delete.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Delete.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.FileAction;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>Delete</code>...
+ */
+public class Delete extends BaseAction {
+
+ private boolean force;
+
+ public Delete(File localDir, List<File> localFiles, boolean nonRecursive,
+ boolean force) {
+ super(localDir, localFiles, nonRecursive);
+ setDirsAsFiles(true);
+ this.force = force;
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile) throws VltException {
+ FileAction action = file.delete(force);
+ dir.getContext().printAction(file, action);
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Diff.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Diff.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Diff.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Diff.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>Diff</code>...
+ *
+ */
+public class Diff extends BaseAction {
+
+ public Diff(File localDir, List<File> localFiles, boolean nonRecursive) {
+ super(localDir, localFiles, nonRecursive);
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ file.diff();
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Info.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Info.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Info.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Info.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.io.PrintStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+import org.apache.jackrabbit.vault.vlt.meta.VltEntry;
+import org.apache.jackrabbit.vault.vlt.meta.VltEntryInfo;
+
+/**
+ * <code>Info</code>...
+ *
+ */
+public class Info extends BaseAction {
+
+ public Info(File localDir, List<File> localFiles, boolean nonRecursive) {
+ super(localDir, localFiles, nonRecursive);
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile) throws VltException {
+ if (file == null) {
+ return;
+ }
+ PrintStream out = dir.getContext().getStdout();
+
+ VltEntry e = file.getEntry();
+ out.printf(" Path: %s%n", dir.getContext().getCwdRelativePath(file.getPath()));
+ out.printf("Status: %s%n", file.getStatus().name().toLowerCase());
+ if (e != null) {
+ RepositoryAddress root = dir.getContext().getMountpoint();
+ RepositoryAddress addr = root.resolve(e.getAggregatePath());
+ addr = addr.resolve(e.getRepoRelPath());
+ out.printf(" URL: %s%n", addr.toString());
+ print(out, " Work", e.work());
+ print(out, " Base", e.base());
+ print(out, " Mine", e.mine());
+ print(out, "Theirs", e.theirs());
+ }
+ out.println();
+ }
+
+ private static final SimpleDateFormat dateFmt = new SimpleDateFormat("dd MMM yyyy HH:mm:ss");
+
+ private static void print(PrintStream out, String name, VltEntryInfo info) {
+ if (info == null) {
+ return;
+ }
+ out.printf("%s: %s, %s, %d, %s%n",
+ name,
+ dateFmt.format(new Date(info.getDate())),
+ info.getContentType(),
+ info.getSize(),
+ info.getMd5()
+ );
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropGet.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropGet.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropGet.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropGet.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>Resolved</code>...
+ *
+ */
+public class PropGet extends BaseAction {
+
+ private String propName;
+
+ public PropGet(File localDir, List<File> localFiles, boolean nonRecursive,
+ String propName) {
+ super(localDir, localFiles, nonRecursive);
+ this.propName = propName;
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ if (file == null) {
+ // nothing to do
+ return;
+ }
+ String value = file.getProperty(propName);
+ if (value != null) {
+ dir.getContext().printMessage(file, propName + "=" + value);
+ }
+ }
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropList.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropList.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropList.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropList.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ */
+public class PropList extends BaseAction {
+
+ public PropList(File localDir, List<File> localFiles, boolean nonRecursive) {
+ super(localDir, localFiles, nonRecursive);
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ if (file == null) {
+ // nothing to do
+ return;
+ }
+ Properties props = file.getProperties();
+ if (props.isEmpty()) {
+ dir.getContext().printMessage(" (empty properties)");
+ } else {
+ for (Object name: props.keySet()) {
+ String value = (String) props.get(name);
+ dir.getContext().printMessage(" " + name + "=" + value);
+ }
+ }
+ }
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropSet.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropSet.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropSet.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/PropSet.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ */
+public class PropSet extends BaseAction {
+
+ private String propName;
+
+ private String propValue;
+
+ public PropSet(File localDir, List<File> localFiles, boolean nonRecursive,
+ String propName, String propValue) {
+ super(localDir, localFiles, nonRecursive);
+ this.propName = propName;
+ this.propValue = propValue;
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ if (file == null) {
+ // nothing to do
+ return;
+ }
+ file.setProperty(propName, propValue);
+ }
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/RemoteStatus.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/RemoteStatus.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/RemoteStatus.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/RemoteStatus.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.FileAction;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>RemoteStatus</code>...
+ *
+ */
+public class RemoteStatus extends BaseAction {
+
+ public RemoteStatus(File localDir, List<File> localFiles, boolean nonRecursive) {
+ super(localDir, localFiles, nonRecursive);
+ setWithRemote(true);
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ if (remoteFile == null && file == null) {
+ // nothing to do
+ return;
+ }
+ FileAction action;
+ if (file == null) {
+ // would be an addition
+ file = new VltFile(dir, remoteFile.getName(), null);
+ action = FileAction.ADDED;
+ } else {
+ action = file.status(remoteFile);
+ }
+ dir.getContext().printRemoteStatus(file, action);
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Resolved.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Resolved.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Resolved.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Resolved.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>Resolved</code>...
+ *
+ */
+public class Resolved extends BaseAction {
+
+ private boolean forced;
+
+ public Resolved(File localDir, List<File> localFiles, boolean nonRecursive,
+ boolean forced) {
+ super(localDir, localFiles, nonRecursive);
+ this.forced = forced;
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ if (file.resolved(forced)) {
+ dir.getContext().printMessage(file, "resolved.");
+ }
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Revert.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Revert.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Revert.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Revert.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>Revert</code>...
+ *
+ */
+public class Revert extends BaseAction {
+
+ public Revert(File localDir, List<File> localFiles, boolean recursive) {
+ super(localDir, localFiles, !recursive);
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile) throws VltException {
+ if (file.revert()) {
+ dir.getContext().printMessage(file, "reverted.");
+ }
+
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Status.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Status.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Status.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Status.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>Status</code>...
+ *
+ */
+public class Status extends BaseAction {
+
+ public Status(File localDir, List<File> localFiles, boolean nonRecursive) {
+ super(localDir, localFiles, nonRecursive);
+ }
+
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ dir.getContext().printStatus(file);
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Sync.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Sync.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Sync.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Sync.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,335 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Calendar;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Value;
+
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.vault.fs.api.RepositoryAddress;
+import org.apache.jackrabbit.vault.sync.impl.VaultSyncServiceImpl;
+import org.apache.jackrabbit.vault.util.Text;
+import org.apache.jackrabbit.vault.vlt.VltContext;
+import org.apache.jackrabbit.vault.vlt.VltException;
+
+/**
+ * <code>Checkout</code>...
+ */
+public class Sync extends AbstractAction {
+
+ public enum Command {
+ STATUS,
+ ST,
+ REGISTER,
+ UNREGISTER,
+ INIT,
+ INSTALL
+ }
+
+ private static final String[] INSTALL_ROOT = {"libs", "crx", "vault", "install"};
+ private static final String CFG_NODE_NAME = VaultSyncServiceImpl.class.getName();
+ private static final String CFG_NODE_PATH = "/libs/crx/vault/config/" + CFG_NODE_NAME;
+ private static final String CFG_ROOTS = VaultSyncServiceImpl.SYNC_SPECS;
+ private static final String CFG_ENABLED = VaultSyncServiceImpl.SYNC_ENABLED;
+ private RepositoryAddress mountPoint;
+
+ private File localDir;
+
+ private final Command cmd;
+
+ private boolean force;
+
+ public Sync(Command cmd, RepositoryAddress mountPoint, File localDir) {
+ this.cmd = cmd;
+ this.mountPoint = mountPoint;
+ this.localDir = localDir;
+ }
+
+ public void setForce(boolean force) {
+ this.force = force;
+ }
+
+ public void run(VltContext ctx) throws VltException {
+ if (mountPoint == null) {
+ mountPoint = ctx.getMountpoint();
+ }
+ if (mountPoint == null) {
+ throw ctx.error(ctx.getCwd().getAbsolutePath(), "No remote specified and not in vlt checkout.");
+ }
+
+ // currently we just read the config node, assuming it's at the correct location
+ Session s = null;
+ try {
+ s = ctx.login(mountPoint);
+ switch (cmd) {
+ case STATUS:
+ case ST:
+ status(ctx, s);
+ break;
+ case REGISTER:
+ register(ctx, s, null);
+ break;
+ case UNREGISTER:
+ unregister(ctx, s);
+ break;
+ case INSTALL:
+ install(ctx, s);
+ break;
+ case INIT:
+ init(ctx, s);
+ }
+ } catch (RepositoryException e) {
+ throw new VltException("Error while performing command", e);
+ } finally {
+ if (s != null) {
+ s.logout();
+ }
+ }
+ }
+
+ private void init(VltContext ctx, Session s) throws VltException, RepositoryException {
+ // check if in vlt checkout
+ if (ctx.getExportRoot().isValid()) {
+ ctx.getStdout().printf("Starting initialization of sync service in existing vlt checkout %s for %s%n",
+ ctx.getExportRoot().getJcrRoot().getAbsolutePath(),
+ mountPoint);
+ // check if config is present, assume installed
+ Config cfg = new Config(s);
+ if (!cfg.load(ctx)) {
+ force = true;
+ install(ctx, s);
+ }
+ register(ctx, s, true);
+ ctx.getStdout().printf(
+ "%nThe directory %1$s is now enabled for syncing.%n" +
+ "You might perform a 'sync-once' by setting the%n" +
+ "appropriate flag in the %1$s/.vlt-sync-config.properties file.%n%n",
+ localDir.getAbsolutePath());
+ } else {
+ ctx.getStdout().printf("Starting initialization of sync service in a non vlt checkout directory %s for %s%n",
+ localDir.getAbsolutePath(),
+ mountPoint);
+ // check if empty
+ if (localDir.listFiles().length > 0) {
+ throw new VltException("Aborting initialization since directory is not empty.");
+ }
+ // check if config is present, assume installed
+ Config cfg = new Config(s);
+ if (!cfg.load(ctx)) {
+ force = true;
+ install(ctx, s);
+ }
+ register(ctx, s, true);
+ ctx.getStdout().printf(
+ "%nThe directory %1$s is now enabled for syncing.%n" +
+ "You need to configure the filter %1$s/.vlt-sync-filter.xml to setup the%n" +
+ "proper paths. You might also perform a 'sync-once' by setting the%n" +
+ "appropriate flag in the %1$s/.vlt-sync-config.properties file.%n%n",
+ localDir.getAbsolutePath());
+ }
+ }
+
+ private void status(VltContext ctx, Session s) throws RepositoryException {
+ Config cfg = new Config(s);
+ if (!cfg.load(ctx)) {
+ ctx.getStdout().println("No sync-service configured at " + CFG_NODE_PATH);
+ return;
+ }
+ ctx.getStdout().println("Listing sync status for " + mountPoint);
+ ctx.getStdout().println("- Sync service is " + (cfg.enabled ? "enabled." : "disabled."));
+ if (cfg.roots.isEmpty()) {
+ ctx.getStdout().println("- No sync directories configured.");
+ } else {
+ for (String path : cfg.roots) {
+ ctx.getStdout().println("- syncing directory: " + path);
+ }
+ }
+ }
+
+ private void register(VltContext ctx, Session s, Boolean enable) throws RepositoryException {
+ Config cfg = new Config(s);
+ if (!cfg.load(ctx)) {
+ ctx.getStdout().println("No sync-service configured at " + CFG_NODE_PATH);
+ return;
+ }
+ for (String path: cfg.roots) {
+ // need to check canonical path
+ try {
+ File f = new File(path).getCanonicalFile();
+ if (f.equals(localDir)) {
+ ctx.getStdout().println("Directory is already synced: " + localDir.getAbsolutePath());
+ return;
+ }
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ cfg.roots.add(localDir.getAbsolutePath());
+ if (enable != null) {
+ cfg.enabled = enable;
+ }
+ cfg.save(ctx);
+ ctx.getStdout().println("Added new sync directory: " + localDir.getAbsolutePath());
+ }
+
+ private void unregister(VltContext ctx, Session s) throws RepositoryException {
+ Config cfg = new Config(s);
+ if (!cfg.load(ctx)) {
+ ctx.getStdout().println("No sync-service configured at " + CFG_NODE_PATH);
+ return;
+ }
+ boolean found = false;
+ for (String path: cfg.roots) {
+ // need to check canonical path
+ try {
+ File f = new File(path).getCanonicalFile();
+ if (f.equals(localDir)) {
+ found = true;
+ break;
+ }
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ if (!found) {
+ ctx.getStdout().println("Directory is not registered: " + localDir.getAbsolutePath());
+ return;
+ }
+ cfg.roots.remove(localDir.getAbsolutePath());
+ cfg.save(ctx);
+ ctx.getStdout().println("Removed sync directory: " + localDir.getAbsolutePath());
+ }
+
+ private void install(VltContext ctx, Session s) throws RepositoryException, VltException {
+ // get sync jar
+ URLClassLoader cl = (URLClassLoader) VaultSyncServiceImpl.class.getClassLoader();
+ URL resource = null;
+ for (URL url: cl.getURLs()) {
+ if (url.getPath().matches(".*/vault-sync-.*\\.jar")) {
+ resource = url;
+ break;
+ }
+ }
+ if (resource == null) {
+ throw new VltException("Unable to find vault-sync.jar library.");
+ }
+ String jarName = Text.getName(resource.getPath());
+ ctx.getStdout().println("Preparing to install " + jarName + "...");
+
+ Node root = s.getRootNode();
+ for (String name: INSTALL_ROOT) {
+ root = JcrUtils.getOrAddFolder(root, name);
+ }
+ // check if already a bundle is installed
+ for (Node child: JcrUtils.getChildNodes(root)) {
+ if (child.getName().startsWith("vault-sync-")) {
+ if (force) {
+ ctx.getStdout().println("Detected existing bundle: " + child.getName() + ". Updating");
+ break;
+ } else {
+ ctx.getStdout().println("Detected existing bundle: " + child.getName() + ". Aborting installation. Specify --force to update.");
+ return;
+ }
+ }
+ }
+ InputStream in = null;
+ try {
+ in = resource.openStream();
+ if (root.hasNode(jarName)) {
+ root.getNode(jarName).remove();
+ }
+ JcrUtils.putFile(root, jarName, "application/octet-stream", in, Calendar.getInstance());
+ } catch (IOException e) {
+ throw new VltException("Error while installing bundle", e);
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+ ctx.getStdout().println("Updated bundle: " + jarName);
+
+ // update config
+ root = JcrUtils.getOrAddFolder(root.getParent(), "config");
+ if (!root.hasNode(CFG_NODE_NAME)) {
+ root.addNode(CFG_NODE_NAME, "sling:OsgiConfig");
+ Config cfg = new Config(s);
+ cfg.enabled = true;
+ cfg.save(ctx);
+ ctx.getStdout().println("Created new config at " + CFG_NODE_PATH);
+ }
+ s.save();
+ }
+
+ private static class Config {
+
+ private final Session s;
+
+ private boolean enabled = false;
+
+ private Set<String> roots = new LinkedHashSet<String>();
+
+ private Config(Session s) {
+ this.s = s;
+ }
+
+ public boolean load(VltContext ctx) throws RepositoryException {
+ if (!s.nodeExists(CFG_NODE_PATH)) {
+ return false;
+ }
+ Node cfgNode = s.getNode(CFG_NODE_PATH);
+ if (cfgNode.hasProperty(CFG_ENABLED)) {
+ enabled = cfgNode.getProperty(CFG_ENABLED).getBoolean();
+ }
+ if (cfgNode.hasProperty(CFG_ROOTS)) {
+ Property roots = cfgNode.getProperty(CFG_ROOTS);
+ for (Value v : roots.getValues()) {
+ this.roots.add(v.getString());
+ }
+ }
+ return true;
+ }
+
+ public void save(VltContext ctx) throws RepositoryException {
+ // assume node exists
+ Node cfgNode = s.getNode(CFG_NODE_PATH);
+ cfgNode.setProperty(CFG_ENABLED, enabled);
+ Value[] vals = new Value[roots.size()];
+ int i=0;
+ for (String path: roots) {
+ vals[i++] = s.getValueFactory().createValue(path);
+ }
+ cfgNode.setProperty(CFG_ROOTS, vals);
+ s.save();
+ }
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Update.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Update.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Update.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/Update.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.jackrabbit.vault.fs.api.VaultFile;
+import org.apache.jackrabbit.vault.vlt.FileAction;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * <code>Update</code>...
+ *
+ */
+public class Update extends BaseAction {
+
+ private boolean force;
+
+ public Update(File localDir, List<File> localFiles, boolean nonRecursive) {
+ super(localDir, localFiles, nonRecursive);
+ setWithRemote(true);
+ }
+
+ public boolean isForce() {
+ return force;
+ }
+
+ public void setForce(boolean force) {
+ this.force = force;
+ }
+
+ @Override
+ public void run(VltDirectory dir, VltFile file, VaultFile remoteFile)
+ throws VltException {
+ if (file == null) {
+ if (remoteFile == null) {
+ return;
+ } else {
+ file = new VltFile(dir, remoteFile.getName(), null);
+ }
+ }
+
+ FileAction action = file.update(remoteFile, force);
+
+ // write back entries
+ dir.getEntries().update(file);
+ dir.sync();
+ dir.getContext().printAction(file, action);
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/VltTree.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/VltTree.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/VltTree.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/actions/VltTree.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.jackrabbit.vault.util.Constants;
+import org.apache.jackrabbit.vault.util.Tree;
+import org.apache.jackrabbit.vault.vlt.VltContext;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+
+/**
+ * <code>VltTree</code>...
+ */
+public class VltTree {
+
+ private final VltContext ctx;
+
+ private final boolean nonRecursive;
+
+ private boolean dirsAsFiles;
+
+ private final Tree<Info> infos = new Tree<Info>(Constants.FS_NATIVE.charAt(0));
+
+ public VltTree(VltContext ctx, boolean nonRecursive) {
+ this.ctx = ctx;
+ this.nonRecursive = nonRecursive;
+ }
+
+ public String getRootPath() {
+ return infos.getRootPath();
+ }
+
+ public void setDirsAsFiles(boolean dirsAsFiles) {
+ this.dirsAsFiles = dirsAsFiles;
+ }
+
+ public void clear() {
+ infos.clear();
+ }
+
+ public void add(File file) throws VltException, IOException {
+ File dir;
+ if (file.isDirectory() && !nonRecursive && !dirsAsFiles) {
+ // if recursive, treat directories as such
+ dir = file;
+ file = null;
+ } else {
+ // if non recursive, treat directories as files
+ dir = file.getParentFile();
+ }
+ String path = dir.getCanonicalPath();
+ Info info = infos.get(path);
+ if (info == null) {
+ info = new Info(new VltDirectory(ctx, dir));
+ infos.put(path, info);
+ }
+ if (file != null) {
+ info.names.add(file.getName());
+ }
+ }
+
+ public void addAll(Collection<File> localFiles) throws IOException, VltException {
+ for (File file: localFiles) {
+ add(file);
+ }
+ }
+
+ public void put(VltDirectory dir) {
+ Info di = infos.get(dir.getPath());
+ if (di == null) {
+ di = new Info(dir);
+ infos.put(di.path, di);
+ }
+ }
+
+ public List<Info> infos() {
+ if (!nonRecursive) {
+ // strip all redundant entries
+ for (Map.Entry<String, Info> e: infos.map().entrySet()) {
+ if (e.getValue().names.isEmpty()) {
+ infos.removeChildren(e.getKey());
+ }
+ }
+ }
+ LinkedList<Info> dirs = new LinkedList<Info>();
+ dirs.addAll(infos.map().values());
+ return dirs;
+ }
+
+ public static class Info {
+
+ final Set<String> names = new HashSet<String>();
+
+ final VltDirectory dir;
+
+ final String path;
+
+ final String ePath;
+
+ private Info(VltDirectory dir) {
+ this.dir = dir;
+ this.path = dir.getPath();
+ this.ePath = path + Constants.FS_NATIVE;
+ }
+
+ private void dump(VltContext ctx) {
+ ctx.printMessage("dir: " + path);
+ for (String n: names) {
+ ctx.printMessage(" ./" + n);
+ }
+ }
+ }
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/Ignored.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/Ignored.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/Ignored.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/Ignored.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,164 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.vault.vlt.meta;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.jackrabbit.vault.fs.api.DumpContext;
+import org.apache.jackrabbit.vault.fs.api.PathFilter;
+import org.apache.jackrabbit.vault.fs.api.PathMapping;
+import org.apache.jackrabbit.vault.fs.config.VaultSettings;
+import org.apache.jackrabbit.vault.fs.filter.DefaultPathFilter;
+import org.apache.jackrabbit.vault.util.PlatformNameFormat;
+import org.apache.jackrabbit.vault.vlt.VltContext;
+import org.apache.jackrabbit.vault.vlt.VltDirectory;
+import org.apache.jackrabbit.vault.vlt.VltException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <code>Ignored</code>...
+ */
+public class Ignored implements PathFilter {
+
+ /**
+ * default logger
+ */
+ private static final Logger log = LoggerFactory.getLogger(Ignored.class);
+
+ public static final String FILE_NAME = ".vltignore";
+
+ private final VaultSettings settings;
+
+ private final VltContext ctx;
+
+ private final int rootLength;
+
+ private final File scanRoot;
+
+ private List<PathFilter> ignored;
+
+ public Ignored(VltContext ctx, File scanRoot) {
+ this.ctx = ctx;
+ this.settings = ctx.getExportRoot().getMetaInf().getSettings();
+ this.scanRoot = scanRoot;
+ rootLength = ctx.getExportRoot().getJcrRoot().getAbsolutePath().length();
+ }
+
+ public List<PathFilter> getIgnored() {
+ if (ignored == null) {
+ long now = System.currentTimeMillis();
+ ignored = new LinkedList<PathFilter>();
+ try {
+ scan(scanRoot);
+ } catch (VltException e) {
+ log.error("Error while scanning for " + FILE_NAME, e);
+ } catch (IOException e) {
+ log.error("Error while scanning for " + FILE_NAME, e);
+ }
+ log.info("scanned for .vltignore files below {} in {}ms", scanRoot, System.currentTimeMillis() - now);
+ }
+ return ignored;
+ }
+
+
+ public boolean matches(String path) {
+ for (PathFilter p: getIgnored()) {
+ if (p.matches(path)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Ignored scan(File dir) throws VltException, IOException {
+ for (File file: dir.listFiles()) {
+ String name = file.getName();
+ if (settings != null && settings.isIgnored(name)) {
+ continue;
+ }
+ if (file.isDirectory()) {
+ scan(file);
+ } else if (name.equals(FILE_NAME)) {
+ addIgnores(dir, file);
+ }
+ }
+ return this;
+ }
+
+ private void addIgnores(File dir, File file) throws VltException, IOException {
+ VltDirectory d = new VltDirectory(ctx, dir);
+ String root = d.getAggregatePath();
+ if (root == null) {
+ root = dir.getAbsolutePath().substring(rootLength);
+ root = PlatformNameFormat.getRepositoryPath(root);
+ log.info("Unable to detect correct repository path for {}. guessed: {}", dir.getPath(), root);
+ }
+ for (Object o: FileUtils.readLines(file, "utf-8")) {
+ addIgnored(root, o.toString());
+ }
+ }
+
+ private void addIgnored(String root, String pattern) {
+ if (pattern.startsWith("#")) {
+ return;
+ }
+ root = root.replace('\\', '/');
+ StringBuffer reg = new StringBuffer("^");
+ reg.append(root).append("/");
+ for (int i=0; i<pattern.length(); i++) {
+ char c = pattern.charAt(i);
+ if (c=='*') {
+ reg.append(".*");
+ } else if (c=='?') {
+ reg.append(".");
+ } else if (c=='.') {
+ reg.append("\\.");
+ } else {
+ reg.append(c);
+ }
+ }
+ reg.append("$");
+ log.info("Adding ignored path: {}", reg.toString());
+ ignored.add(new DefaultPathFilter(reg.toString()));
+ }
+
+ public boolean isAbsolute() {
+ return true;
+ }
+
+ public void dump(DumpContext ctx, boolean isLast) {
+ ctx.printf(isLast, "%s:", getClass().getSimpleName());
+ ctx.indent(isLast);
+ Iterator<PathFilter> iter = getIgnored().iterator();
+ while (iter.hasNext()) {
+ PathFilter e = iter.next();
+ e.dump(ctx, !iter.hasNext());
+ }
+ ctx.outdent();
+ }
+
+ public PathFilter translate(PathMapping mapping) {
+ return this;
+ }
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaDirectory.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaDirectory.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaDirectory.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaDirectory.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.vault.vlt.meta;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.jackrabbit.vault.vlt.VltException;
+
+/**
+ * Provides an abstraction of a virtual directory that holds additional information about the files under vault
+ * control.
+ */
+public interface MetaDirectory {
+
+ /**
+ * Returns the underlying system file or directory.
+ * @return the system file.
+ */
+ File getFile();
+
+ /**
+ * Checks if this meta directory already exists on the filesystem.
+ * @return <code>true</code> if this meta directory exists.
+ */
+ boolean exists();
+
+ /**
+ * Creates the internal structures for this meta directory and initializes it with the given path.
+ * @param path the platform path relative to the jcr_root of this meta directory.
+ * @throws IOException if an I/O error occurs
+ */
+ void create(String path) throws IOException;
+
+ /**
+ * Deletes the internal structures of this meta directory
+ * @throws IOException if an I/O error occurs
+ */
+ void delete() throws IOException;
+
+ /**
+ * Synchronizes any internal changes to this meta directory with the underlying structures.
+ * @throws IOException if an I/O error occurs
+ */
+ void sync() throws IOException;
+
+ /**
+ * Synchronizes and closes this meta directory.
+ * @throws IOException if an I/O error occurs
+ */
+ void close() throws IOException;
+
+ /**
+ * Returns the repository url defined for this meta directory.
+ * @return the url or <code>null</code> if not defined.
+ * @throws IOException if an I/O error occurs
+ */
+ String getRepositoryUrl() throws IOException;
+
+ /**
+ * Sets the repository url define for this meta directory
+ * @param url the url
+ * @throws IOException if an I/O error occurs
+ */
+ void setRepositoryUrl(String url) throws IOException;
+
+ /**
+ * Returns the entries that are recorded in this meta directory
+ * @return the entries.
+ * @throws VltException if an error during reading of the entries occurrs.
+ */
+ VltEntries getEntries() throws VltException;
+
+ /**
+ * Returns a file of this meta directory.
+ * @param name name of the file
+ * @return the file or <code>null</code> if not found
+ * @throws IOException if an I/O error occurs
+ */
+ MetaFile getFile(String name) throws IOException;
+
+ /**
+ * Returns a file of this meta directory.
+ * @param name name of the file
+ * @param create if <code>true</code> a new file will be created if not exists.
+ * @return the file or <code>null</code> if not found and create is <code>false</code>.
+ * @throws IOException if an I/O error occurs
+ */
+ MetaFile getFile(String name, boolean create) throws IOException;
+
+ /**
+ * Returns a file from the internal temporary storage of this directory.
+ * @param name name of the file.
+ * @param create if <code>true</code> a new file will be created if not exists.
+ * @return the file or <code>null</code> if not found and create is <code>false</code>.
+ * @throws IOException if an I/O error occurs
+ */
+ MetaFile getTmpFile(String name, boolean create) throws IOException;
+
+ /**
+ * Returns a file from the internal base storage of this directory.
+ * @param name name of the file.
+ * @param create if <code>true</code> a new file will be created if not exists.
+ * @return the file or <code>null</code> if not found and create is <code>false</code>.
+ * @throws IOException if an I/O error occurs
+ */
+ MetaFile getBaseFile(String name, boolean create) throws IOException;
+
+ /**
+ * Checks if the file with the given name exists.
+ * @param name name of the file.
+ * @return <code>true</code> if the file exists.
+ * @throws IOException if an I/O error occurs
+ */
+ boolean hasFile(String name) throws IOException;
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFile.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFile.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFile.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFile.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.vault.vlt.meta;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.apache.jackrabbit.vault.util.MD5;
+
+/**
+ * Provides an abstraction for a file of a {@link MetaDirectory}.
+ */
+public interface MetaFile {
+
+ /**
+ * Returns the meta directory that created this file.
+ * @return the meta directory.
+ */
+ MetaDirectory getDirectory();
+
+ /**
+ * Returns a path of this file which is composed of the path of the meta directory and the name of this file.
+ * @return the path
+ */
+ String getPath();
+
+ /**
+ * Returns the name of this file.
+ * @return the name of this file.
+ */
+ String getName();
+
+ /**
+ * Open an input stream to this file.
+ * @return an input stream
+ * @throws IOException if an I/O error occurs
+ */
+ InputStream getInputStream() throws IOException;
+
+ /**
+ * Opens a reader using the utf-8 encoding
+ * @return a read
+ * @throws IOException if an I/O error occurs
+ */
+ Reader getReader() throws IOException;
+
+ /**
+ * Returns the length in bytes of this file
+ * @return the length.
+ */
+ long length();
+
+ /**
+ * Returns the MD5 checksum of this file. Note that this operation reads the file fully in order to calculate
+ * the checksum.
+ * @return the MD5 checksum.
+ * @throws IOException if an I/O error occurs
+ */
+ MD5 md5() throws IOException;
+
+ /**
+ * Returns the last modified date of this file.
+ * @return the last modified
+ */
+ long lastModified();
+
+ /**
+ * Deletes the file from it's meta directory
+ * @throws IOException if an I/O error occurs
+ */
+ void delete() throws IOException;
+
+ /**
+ * Opens a temporary file that is tied to this file and initializes it with the same content as this file.
+ * @return a temporary file.
+ * @throws IOException if an I/O error occurs
+ */
+ File openTempFile() throws IOException;
+
+ /**
+ * Close the previously opened temporary file. if <code>discard</code> is <code>false</code>, the contents of
+ * the temporary file are copied back to this file.
+ * @param discard <code>true</code> to discard the changes to the temp file
+ * @throws IOException if an I/O error occurs
+ */
+ void closeTempFile(boolean discard) throws IOException;
+
+ /**
+ * Moves this file to another meta file of the same directory
+ * @param dst destination file
+ * @throws IOException if an I/O error occurs
+ */
+ void moveTo(MetaFile dst) throws IOException;
+
+ /**
+ * Copies the contents of this file to the indicated platform file.
+ * @param file destination file
+ * @param preserveFileDate <code>true</code> to update the modification date of the destination file
+ * @throws IOException if an I/O error occurs
+ */
+ void copyTo(File file, boolean preserveFileDate) throws IOException;
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFileDocSource.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFileDocSource.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFileDocSource.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/MetaFileDocSource.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.vault.vlt.meta;
+
+import org.apache.jackrabbit.vault.util.diff.DocumentSource;
+
+/**
+ * <code>MetaFileDocSource</code>...
+ */
+public class MetaFileDocSource implements DocumentSource {
+
+ private final MetaFile file;
+
+ public MetaFileDocSource(MetaFile file) {
+ this.file = file;
+ }
+
+ public String getLabel() {
+ return file.getName();
+ }
+
+ public String getLocation() {
+ return file.getPath();
+ }
+
+
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntries.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntries.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntries.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntries.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.vault.vlt.meta;
+
+import java.util.Collection;
+
+import org.apache.jackrabbit.vault.vlt.VltFile;
+
+/**
+ * The vault entries provide meta information about the entries under vault control.
+ * Note that entries are managed by their respective {@link MetaDirectory} and updates to this
+ * entries are only persisted if the directory is synced or closed.
+ */
+public interface VltEntries {
+
+ /**
+ * Returns the platform path of this entries relative to the vault root.
+ * @return the platform path
+ */
+ String getPath();
+
+ /**
+ * Checks if the entry with the given name exists
+ * @param localName name of the entry
+ * @return <code>true</code> if exists
+ */
+ boolean hasEntry(String localName);
+
+ /**
+ * Returns the vault entry for the given name
+ * @param localName the name of the entry
+ * @return the entry or <code>null</code> if not exists.
+ */
+ VltEntry getEntry(String localName);
+
+ /**
+ * Updates the entry with the state contained in the vault file.
+ * @param file the vault file.
+ */
+ void update(VltFile file);
+
+ /**
+ * Updates the paths properties of the entry with <code>localName</code>. If the entry did not exist yet,
+ * a new one is created.
+ * @param localName the name of the entry
+ * @param aggregatePath the new aggregate path
+ * @param repoRelPath the new repository path
+ * @return the entry that was updated.
+ */
+ VltEntry update(String localName, String aggregatePath, String repoRelPath);
+
+ /**
+ * Returns all entries.
+ * @return the entries
+ */
+ Collection<VltEntry> entries();
+}
\ No newline at end of file
Added: jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntry.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntry.java?rev=1512568&view=auto
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntry.java (added)
+++ jackrabbit/commons/filevault/trunk/vault-vlt/src/main/java/org/apache/jackrabbit/vault/vlt/meta/VltEntry.java Sat Aug 10 05:53:42 2013
@@ -0,0 +1,129 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.vlt.meta;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Represents an entry in of the {@link VltEntries}
+ */
+public interface VltEntry {
+
+ /**
+ * Describes the state of an entry
+ */
+ public enum State {
+
+ CLEAN(" "),
+ ADDED("A"),
+ CONFLICT("C"),
+ DELETED("D");
+
+ public final String letter;
+
+ private State(String shortName) {
+ this.letter = shortName;
+ }
+
+ public String toString() {
+ return name().toLowerCase() + " (" + letter + ")";
+ }
+
+ }
+
+ /**
+ * Returns the name of an entry.
+ * @return the name.
+ */
+ String getName();
+
+ /**
+ * Returns the repository path of this entry.
+ * @return the repository path.
+ */
+ String getRepoRelPath();
+
+ /**
+ * Returns the aggregate path of this entry.
+ * @return the aggregate path.
+ */
+ String getAggregatePath();
+
+ /**
+ * Creates a new entry info for the given type.
+ * @param type info type.
+ * @return the entry info
+ */
+ VltEntryInfo create(VltEntryInfo.Type type);
+
+ /**
+ * Puts and entry info to this entry.
+ * @param info the entry info
+ */
+ void put(VltEntryInfo info);
+
+ /**
+ * Returns the entry info of type {@link VltEntryInfo.Type#WORK}
+ * @return the "work" entry info or <code>null</code> if not defined.
+ */
+ VltEntryInfo work();
+
+ /**
+ * Returns the entry info of type {@link VltEntryInfo.Type#BASE}
+ * @return the "base" entry info or <code>null</code> if not defined.
+ */
+ VltEntryInfo base();
+
+ /**
+ * Returns the entry info of type {@link VltEntryInfo.Type#MINE}
+ * @return the "mine" entry info or <code>null</code> if not defined.
+ */
+ VltEntryInfo mine();
+
+ /**
+ * Returns the entry info of type {@link VltEntryInfo.Type#THEIRS}
+ * @return the "theirs" entry info or <code>null</code> if not defined.
+ */
+ VltEntryInfo theirs();
+
+ /**
+ * Removes the entry info with the given type.
+ * @param type the info type
+ * @return the previously assigned info or <code>null</code>
+ */
+ VltEntryInfo remove(VltEntryInfo.Type type);
+
+ /**
+ * Returns the state of this entry.
+ * @return the vault state
+ */
+ State getState();
+
+ void resolved(MetaFile fileTmp, File fileWork, MetaFile fileBase) throws IOException;
+
+ boolean delete(File fileWork);
+
+ boolean revertConflict(File work) throws IOException;
+
+ void conflict(File work, MetaFile base, MetaFile tmp) throws IOException;
+
+ boolean isDirty();
+
+ boolean isDirectory();
+
+}
\ No newline at end of file