blob: 5daccfaf881b03f028db0e4512beff56818fd5c2 [file] [log] [blame]
/*
* 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.sling.ide.cli.impl;
import static org.osgi.service.component.annotations.ConfigurationPolicy.REQUIRE;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import org.apache.sling.ide.cli.impl.DirWatcher.Event;
import org.apache.sling.ide.content.sync.fs.FSResources;
import org.apache.sling.ide.filter.FilterLocator;
import org.apache.sling.ide.log.Logger;
import org.apache.sling.ide.sync.content.SyncCommandFactory;
import org.apache.sling.ide.sync.content.WorkspacePath;
import org.apache.sling.ide.sync.content.WorkspacePaths;
import org.apache.sling.ide.sync.content.WorkspaceProject;
import org.apache.sling.ide.transport.Command;
import org.apache.sling.ide.transport.Repository;
import org.apache.sling.ide.transport.RepositoryFactory;
import org.apache.sling.ide.transport.RepositoryInfo;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(immediate=true, configurationPolicy = REQUIRE)
public class ContentSync {
public @interface Config {
String projectDir();
String repositoryUrl();
String username();
String password();
}
@Reference
private Logger logger;
@Reference
private RepositoryFactory repoFactory;
@Reference
private SyncCommandFactory commandFactory;
@Reference
private FilterLocator filterLocator;
private DirWatcher watcher;
private Thread watcherThread;
protected void activate(Config cfg) throws Exception {
File projectDir = new File(cfg.projectDir());
WorkspaceProject prj = FSResources.create(projectDir, projectDir, filterLocator);
logger.trace("Working on project {0} at {1}", prj.getName(), prj.getOSPath());
Repository repo = repoFactory.connectRepository(new RepositoryInfo(cfg.username(), cfg.password(), URI.create(cfg.repositoryUrl())));
repo.newListChildrenNodeCommand("/").execute();
logger.trace("Connected to {0} ", repo.getRepositoryInfo());
Path syncDirPath = prj.getSyncDirectory().getOSPath();
watcher = new DirWatcher(syncDirPath);
logger.trace("Watching syncDir {0}", syncDirPath);
watcherThread = new Thread(new Runnable() {
@Override
public void run() {
try {
while ( ! Thread.currentThread().isInterrupted() ) {
Event event = watcher.poll();
Path path = event.getPath();
WorkspacePath resourceRelativePath = WorkspacePaths.fromOsPath(path);
logger.trace("Change detected in workspace path {0}", resourceRelativePath);
if ( event.getKind() == StandardWatchEventKinds.ENTRY_CREATE ||
event.getKind() == StandardWatchEventKinds.ENTRY_MODIFY ) {
try {
Command<?> cmd = commandFactory.
newCommandForAddedOrUpdatedResource(repo, prj.getSyncDirectory().getFile(resourceRelativePath));
if ( cmd != null )
cmd.execute();
} catch (IOException e) {
logger.warn("Sync failed for path " + resourceRelativePath , e);
}
}
if ( event.getKind() == StandardWatchEventKinds.ENTRY_DELETE ) {
try {
Command<?> cmd = commandFactory.newCommandForRemovedResource(repo, prj.getSyncDirectory().getFile(resourceRelativePath));
if ( cmd != null )
cmd.execute();
} catch (IOException e) {
logger.warn("Sync failed for path " + resourceRelativePath , e);
}
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
watcherThread.start();
}
protected void deactivate() throws Exception {
if ( watcher != null ) {
watcherThread.interrupt();
}
}
}