package jetbrains.mps.vcs.core.mergedriver; /*Generated by MPS */ import org.jetbrains.annotations.Nullable; import jetbrains.mps.baseLanguage.tuples.runtime.Tuples; import jetbrains.mps.make.java.ModelDependencies; import java.io.ByteArrayOutputStream; import jetbrains.mps.baseLanguage.tuples.runtime.MultiTuple; import java.io.IOException; import org.jdom.JDOMException; import jetbrains.mps.util.JDOMUtil; import java.io.OutputStream; import org.jdom.Document; import jetbrains.mps.make.java.RootDependencies; import jetbrains.mps.internal.collections.runtime.Sequence; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; /*package*/ class JavaDependenciesMerger extends AbstractContentMerger { /*package*/ JavaDependenciesMerger() { } @Nullable @Override public Tuples._2<Integer, byte[]> mergeContents(FileContent baseContent, FileContent localContent, FileContent latestContent) { try { ModelDependencies dependencies = loadDependencies(baseContent); copyDependencies(loadDependencies(localContent), dependencies); copyDependencies(loadDependencies(latestContent), dependencies); ByteArrayOutputStream out = new ByteArrayOutputStream(); saveDependencies(dependencies, out); return MultiTuple.<Integer,byte[]>from(MERGED, out.toByteArray()); } catch (IOException e) { e.printStackTrace(); return null; } catch (JDOMException e) { e.printStackTrace(); return null; } catch (JavaDependenciesMerger.MergeException e) { e.printStackTrace(); return null; } } private static ModelDependencies loadDependencies(FileContent content) throws IOException, JDOMException { return ModelDependencies.fromXml(JDOMUtil.loadDocument(content.openInputStream()).getRootElement()); } private static void saveDependencies(ModelDependencies deps, OutputStream out) throws IOException { JDOMUtil.writeDocument(new Document(deps.toXml()), out); } private static void copyDependencies(ModelDependencies from, ModelDependencies to) throws JavaDependenciesMerger.MergeException { for (RootDependencies fromRootDep : Sequence.fromIterable(from.getDependencies())) { RootDependencies toRootDep = to.getDependency(fromRootDep.getFileName()); if (toRootDep == null) { to.addDependencies(fromRootDep); } else { to.replaceRoot(mergeRootDependencies(fromRootDep, toRootDep)); } } } private static RootDependencies mergeRootDependencies(RootDependencies rd1, RootDependencies rd2) throws JavaDependenciesMerger.MergeException { if (neq_bqsatu_a0a0f(rd1.getClassName(), rd2.getClassName())) { throw new JavaDependenciesMerger.MergeException("Different class names: " + rd1.getClassName() + " and " + rd2.getClassName()); } Set<String> dependNodes = rd1.getDependencies(); SetSequence.fromSet(dependNodes).addSequence(SetSequence.fromSet(rd2.getDependencies())); Set<String> extendsNodes = rd1.getExtends(); SetSequence.fromSet(extendsNodes).addSequence(SetSequence.fromSet(rd2.getExtends())); return new RootDependencies(rd1.getClassName(), rd1.getFileName(), SetSequence.fromSet(dependNodes).toListSequence(), SetSequence.fromSet(extendsNodes).toListSequence()); } private static class MergeException extends Exception { private MergeException(String msg) { super(msg); } } private static boolean neq_bqsatu_a0a0f(Object a, Object b) { return !(((a != null ? a.equals(b) : a == b))); } }