/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * OpenFlexo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.diff.merge; import java.util.logging.Logger; import org.openflexo.diff.DelimitingMethod; import org.openflexo.localization.FlexoLocalization; import org.openflexo.logging.FlexoLogger; import org.openflexo.toolbox.FileFormat; import org.openflexo.toolbox.FileFormat.TextFileFormat; import org.openflexo.toolbox.TokenMarkerStyle; public class DefaultMergedDocumentType implements MergedDocumentType { protected static final Logger logger = FlexoLogger.getLogger(DefaultMergedDocumentType.class.getPackage().getName()); private final DelimitingMethod _delimitingMethod; private final TokenMarkerStyle _style; private final AutomaticMergeResolvingModelInterface _automaticMergeResolvingModel; public DefaultMergedDocumentType(DelimitingMethod delimitingMethod, TokenMarkerStyle style, AutomaticMergeResolvingModelInterface automaticMergeResolvingModel) { _delimitingMethod = delimitingMethod; _style = style; _automaticMergeResolvingModel = automaticMergeResolvingModel; } @Override public DelimitingMethod getDelimitingMethod() { return _delimitingMethod; } @Override public TokenMarkerStyle getStyle() { return _style; } @Override public AutomaticMergeResolvingModelInterface getAutomaticMergeResolvingModel() { return _automaticMergeResolvingModel; } public static final MergedDocumentType LINES = new DefaultMergedDocumentType(DelimitingMethod.LINES, null, new DefaultAutomaticMergeResolvingModel()); public static final MergedDocumentType DEFAULT = new DefaultMergedDocumentType(DelimitingMethod.DEFAULT, null, new DefaultAutomaticMergeResolvingModel()); public static final MergedDocumentType JAVA = new DefaultMergedDocumentType(DelimitingMethod.JAVA, TokenMarkerStyle.Java, new DefaultAutomaticMergeResolvingModel()); /* public static final DefaultAutomaticMergeResolvingModel xmlAMRM = new DefaultAutomaticMergeResolvingModel(); static { xmlAMRM.addToDetailedRules(new AutomaticMergeResolvingRule() { public String getMergedResult(MergeChange change) { DiffSource leftSource = change.getMerge().getLeftSource(); DiffSource rightSource = change.getMerge().getRightSource(); try { int val1 = Integer.parseInt(leftSource.tokenAt(change.getFirst0()).token); int val2 = Integer.parseInt(rightSource.tokenAt(change.getLast2()).token); return ""+((int)(val1+val2)/2); } catch (NumberFormatException e) { return leftSource.tokenAt(change.getFirst0()).token; } } public boolean isApplicable(MergeChange change) { if ((change.getFirst0() == change.getLast0()) && (change.getFirst2() == change.getLast2())) { DiffSource leftSource = change.getMerge().getLeftSource(); DiffSource rightSource = change.getMerge().getRightSource(); if ((leftSource.tokenAt(change.getFirst0()-3).token.equals("posiX")) && (leftSource.tokenAt(change.getFirst0()-2).token.equals("=")) && (leftSource.tokenAt(change.getFirst0()-1).token.equals(""+'"')) && (rightSource.tokenAt(change.getFirst2()-3).token.equals("posiX")) && (rightSource.tokenAt(change.getFirst2()-2).token.equals("=")) && (rightSource.tokenAt(change.getFirst2()-1).token.equals(""+'"'))) return true; } return false; } }); xmlAMRM.addToDetailedRules(new AutomaticMergeResolvingRule() { public String getMergedResult(MergeChange change) { DiffSource leftSource = change.getMerge().getLeftSource(); DiffSource rightSource = change.getMerge().getRightSource(); try { int val1 = Integer.parseInt(leftSource.tokenAt(change.getFirst0()).token); int val2 = Integer.parseInt(rightSource.tokenAt(change.getLast2()).token); return ""+((int)(val1+val2)/2); } catch (NumberFormatException e) { return leftSource.tokenAt(change.getFirst0()).token; } } public boolean isApplicable(MergeChange change) { if ((change.getFirst0() == change.getLast0()) && (change.getFirst2() == change.getLast2())) { DiffSource leftSource = change.getMerge().getLeftSource(); DiffSource rightSource = change.getMerge().getRightSource(); if ((leftSource.tokenAt(change.getFirst0()-3).token.equals("posiY")) && (leftSource.tokenAt(change.getFirst0()-2).token.equals("=")) && (leftSource.tokenAt(change.getFirst0()-1).token.equals(""+'"')) && (rightSource.tokenAt(change.getFirst2()-3).token.equals("posiY")) && (rightSource.tokenAt(change.getFirst2()-2).token.equals("=")) && (rightSource.tokenAt(change.getFirst2()-1).token.equals(""+'"'))) return true; } return false; } }); } public static final MergedDocumentType XML = new DefaultMergedDocumentType( DelimitingMethod.XML, TokenMarkerStyle.XML, xmlAMRM); */ public static final MergedDocumentType XML = new DefaultMergedDocumentType(DelimitingMethod.XML, TokenMarkerStyle.XML, new DefaultAutomaticMergeResolvingModel()); public static final MergedDocumentType HTML = new DefaultMergedDocumentType(DelimitingMethod.HTML, TokenMarkerStyle.HTML, new DefaultAutomaticMergeResolvingModel()); public static final MergedDocumentType PLIST = new DefaultMergedDocumentType(DelimitingMethod.PLIST, TokenMarkerStyle.WOD, new DefaultAutomaticMergeResolvingModel()); public static final MergedDocumentType TEX = new DefaultMergedDocumentType(DelimitingMethod.TEX, TokenMarkerStyle.TeX, new DefaultAutomaticMergeResolvingModel()); public static final MergedDocumentType SQL = new DefaultMergedDocumentType(DelimitingMethod.SQL, TokenMarkerStyle.TSQL, new DefaultAutomaticMergeResolvingModel() { @Override protected String localizedForKey(String key) { return FlexoLocalization.localizedForKey(key); } }); @Override public String getName() { return getDelimitingMethod().getName(); } public static MergedDocumentType getMergedDocumentType(FileFormat format) { if (format instanceof TextFileFormat) { switch (((TextFileFormat) format).getSyntax()) { case Java: return JAVA; case XML: return XML; case HTML: return HTML; case PList: return PLIST; case Latex: return TEX; case SQL: return SQL; case CSS: return LINES; case JavaScript: return LINES; case Plain: return LINES; default: return DEFAULT; } } if (!format.isBinary()) { return DEFAULT; } logger.warning("No merged document type for binary files"); return null; } }