package org.netbeans.gradle.project.model; import java.io.File; import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.ObjectStreamException; import java.io.Serializable; import java.nio.file.Path; import java.util.logging.Level; import java.util.logging.Logger; import org.jtrim.utils.ExceptionHelper; import org.netbeans.gradle.model.GenericProjectProperties; import org.netbeans.gradle.model.GradleMultiProjectDef; import org.netbeans.gradle.model.GradleProjectTree; import org.netbeans.gradle.project.script.ScriptFileProvider; public final class NbGradleMultiProjectDef implements Serializable { private static final long serialVersionUID = 1L; private static final Logger LOGGER = Logger.getLogger(NbGradleMultiProjectDef.class.getName()); private final NbGradleProjectTree rootProject; private final NbGradleProjectTree mainProject; public NbGradleMultiProjectDef(NbGradleProjectTree rootProject, NbGradleProjectTree mainProject) { ExceptionHelper.checkNotNullArgument(rootProject, "rootProject"); ExceptionHelper.checkNotNullArgument(mainProject, "mainProject"); this.rootProject = rootProject; this.mainProject = mainProject; } public NbGradleMultiProjectDef(GradleMultiProjectDef model) { ExceptionHelper.checkNotNullArgument(model, "model"); this.rootProject = new NbGradleProjectTree(model.getRootProject()); GradleProjectTree mainProjectModel = model.getMainProject(); NbGradleProjectTree parsedMain = rootProject.findByPath( mainProjectModel.getGenericProperties().getProjectFullName()); if (cmpTrees(parsedMain, mainProjectModel)) { this.mainProject = parsedMain; } else { LOGGER.log(Level.WARNING, "Main project tree has not been found from the root project: {0}", mainProjectModel.getGenericProperties().getProjectFullName()); this.mainProject = new NbGradleProjectTree(mainProjectModel); } } public int getNumberOfProjectsInThisBuild() { return rootProject.getNumberOfSubprojects() + 1; } public NbGradleProjectTree getParentTree() { return mainProject.getParent(rootProject); } // Just a sanity check, not a complete recursive one. private static boolean cmpTrees(NbGradleProjectTree parsed, GradleProjectTree model) { if (parsed == null) { return false; } GenericProjectProperties parsedProperties = parsed.getGenericProperties(); GenericProjectProperties modelProperties = model.getGenericProperties(); if (!cmpTrees(parsedProperties, modelProperties)) { return false; } if (parsed.getTasks().size() != model.getTasks().size()) { return false; } return parsed.getChildren().size() == model.getChildren().size(); } private static boolean cmpTrees(GenericProjectProperties prop1, GenericProjectProperties prop2) { if (!prop1.getProjectDir().equals(prop2.getProjectDir())) { return false; } if (!prop1.getProjectFullName().equals(prop2.getProjectFullName())) { return false; } return prop1.getProjectName().equals(prop2.getProjectName()); } public static NbGradleMultiProjectDef createEmpty(Path projectDir, ScriptFileProvider scriptProvider) { NbGradleProjectTree emptyTree = NbGradleProjectTree.createEmpty(projectDir, scriptProvider); return new NbGradleMultiProjectDef(emptyTree, emptyTree); } public NbGradleProjectTree getRootProject() { return rootProject; } public NbGradleProjectTree getMainProject() { return mainProject; } public File getProjectDir() { return mainProject.getProjectDir(); } private Object writeReplace() { return new SerializedFormat(this); } private void readObject(ObjectInputStream stream) throws InvalidObjectException { throw new InvalidObjectException("Use proxy."); } private static final class SerializedFormat implements Serializable { private static final long serialVersionUID = 1L; private final NbGradleProjectTree rootProject; private final NbGradleProjectTree mainProject; public SerializedFormat(NbGradleMultiProjectDef source) { this.rootProject = source.rootProject; this.mainProject = source.mainProject; } private Object readResolve() throws ObjectStreamException { return new NbGradleMultiProjectDef(rootProject, mainProject); } } }