/** * ----------------------------------------------------------------------- * (c) - Alistair Rutherford - www.netthreads.co.uk - March 2013 * ----------------------------------------------------------------------- * * Licensed 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 com.netthreads.javafx.mavenize.service; import java.io.File; import java.io.IOException; import javafx.beans.property.BooleanProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.collections.ObservableList; import javafx.concurrent.Service; import javafx.concurrent.Task; import org.apache.maven.model.Model; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netthreads.javafx.mavenize.controller.ImplementsRefresh; import com.netthreads.javafx.mavenize.model.ProjectResult; import com.netthreads.mavenize.Mavenize; import com.netthreads.mavenize.MavenizeListener; import com.netthreads.mavenize.model.ProjectFiles; import com.netthreads.mavenize.pom.PomGenerator; import com.netthreads.mavenize.project.ProjectType; import com.netthreads.mavenize.project.ProjectTypeFactory; /** * Mavenize background service which clients can bind to. * */ public class MavenizeService extends Service<Void> implements MavenizeListener { private Logger logger = LoggerFactory.getLogger(MavenizeService.class); private String sourcePath; private String targetPath; private String projectTypeName; private String version; private String packaging; private Mavenize mavenize; private ResultCache resultCache; // --------------------------------------------------------------- // Active Property // --------------------------------------------------------------- private BooleanProperty activeProperty; public BooleanProperty getActiveProperty() { return activeProperty; } public boolean getActive() { return activeProperty.get(); } public void setActive(boolean activeProperty) { this.activeProperty.set(activeProperty); } private ObservableList<ProjectResult> observableList; private ImplementsRefresh refreshView; /** * Construct service. * */ public MavenizeService(ObservableList<ProjectResult> list, ImplementsRefresh refreshView) { this.observableList = list; this.refreshView = refreshView; resultCache = ResultCache.instance(); // --------------------------------------------------------------- // Service properties // --------------------------------------------------------------- activeProperty = new SimpleBooleanProperty(); // --------------------------------------------------------------- // Parameters. // --------------------------------------------------------------- sourcePath = ""; targetPath = ""; projectTypeName = ProjectType.Types.DEFAULT.toString(); version = PomGenerator.DEFAULT_VERSION; packaging = PomGenerator.PACKAGE_TYPES[0]; // --------------------------------------------------------------- // Core Worker // --------------------------------------------------------------- mavenize = new Mavenize(this); } /** * Task creation. * */ @Override protected Task<Void> createTask() { return new Task<Void>() { protected Void call() { try { setActive(true); process(); } catch (Exception e) { logger.error(e.getLocalizedMessage()); } finally { setActive(false); } return null; } }; } /** * Main process. * */ public void process() { observableList.clear(); resultCache.clear(); ProjectType projectType = ProjectTypeFactory.instance().getProjectType(projectTypeName); try { mavenize.process(sourcePath, targetPath, projectType, version, packaging); } catch (IOException e) { logger.error(e.getLocalizedMessage()); } } /** * Callback - Project found. * * This may be called more than once on the same project. The reason for this is the mechanism is set to find 'src' * and the 'resource' files in separate passes. You have to use the project 'name' to determine if we've already * created an entry for it. */ @Override public void addProjectFiles(ProjectFiles projectFiles) { ProjectResult target = resultCache.get(projectFiles.getName()); if (target == null) { target = new ProjectResult(); target.setFilePath(projectFiles.getName()); target.setFileCount(0); logger.info("Found project, " + sourcePath); String name = projectFiles.getName(); resultCache.put(name, target); // --------------------------------------------------------------- // Broadcast object. This will get picked up by bound listener. // --------------------------------------------------------------- if (!observableList.contains(target)) { observableList.add(target); } target.setWorking(ProjectResult.WORKING_BUSY); refreshView.refresh(); } } /** * Callback - File found. * */ @Override public void addProjectFile(ProjectFiles projectFiles, File file) { //logger.info("Found file, " + file.getName()); ProjectResult target = resultCache.get(projectFiles.getName()); if (target != null) { int current = target.getFileCount() + 1; target.setFileCount(current); } // --------------------------------------------------------------- // Broadcast object. This will get picked up by bound listener. // --------------------------------------------------------------- target.setStatus(ProjectResult.STATUS_FILE); refreshView.refresh(); } /** * Callback - Generate pom in target path. * */ @Override public void generatePom(ProjectType projectType, ProjectFiles projectFiles, Model model) { logger.info("Generate pom, " + projectFiles.getTargetSrc()); ProjectResult target = resultCache.get(projectFiles.getName()); if (target != null) { target.setGroupId(model.getGroupId()); target.setArtifactId(model.getArtifactId()); } target.setStatus(ProjectResult.STATUS_POM); target.setWorking(ProjectResult.WORKING_DONE); refreshView.refresh(); } /** * Callback - Create Maven directories. * */ @Override public void createDirectories(ProjectFiles projectFiles) { logger.debug("Create directories, " + projectFiles.getTargetSrc()); ProjectResult target = resultCache.get(projectFiles.getName()); if (target != null) { target.setStatus(ProjectResult.STATUS_CREATE); } refreshView.refresh(); } /** * Callback - Copy source files. * */ @Override public void copyFiles(ProjectFiles projectFiles, String subDir) { logger.debug("Copy files, " + projectFiles.getTargetSrc()); ProjectResult target = resultCache.get(projectFiles.getName()); if (target != null) { target.setStatus(ProjectResult.STATUS_COPY); } refreshView.refresh(); } /** * Setters/Getters * */ @Override public boolean isActive() { return false; } public String getSourcePath() { return sourcePath; } public void setSourcePath(String sourcePath) { this.sourcePath = sourcePath; } public String getTargetPath() { return targetPath; } public void setTargetPath(String targetPath) { this.targetPath = targetPath; } public String getProjectTypeName() { return projectTypeName; } public void setProjectTypeName(String projectTypeName) { this.projectTypeName = projectTypeName; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public String getPackaging() { return packaging; } public void setPackaging(String packaging) { this.packaging = packaging; } public Mavenize getMavenize() { return mavenize; } }