001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020 021package org.granite.builder; 022 023import static org.granite.builder.GraniteBuilder.GRANITE_BUILDER_ID; 024import static org.granite.builder.GraniteBuilder.FLEX_BUILDER_ID; 025import static org.granite.builder.GraniteBuilder.JAVA_BUILDER_ID; 026 027import java.util.Arrays; 028import java.util.Comparator; 029 030import org.eclipse.core.resources.ICommand; 031import org.eclipse.core.resources.IProject; 032import org.eclipse.core.resources.IProjectDescription; 033import org.eclipse.core.resources.IProjectNature; 034import org.eclipse.core.runtime.CoreException; 035 036/** 037 * @author Franck WOLFF 038 */ 039public class GraniteNature implements IProjectNature { 040 041 public static final String NATURE_ID = "org.granite.builder.granitenature"; 042 043 private static final Comparator<ICommand> BUILDER_COMPARATOR = new Comparator<ICommand>() { 044 045 // java -> granite [-> flex] 046 @Override 047 public int compare(ICommand c1, ICommand c2) { 048 if (GRANITE_BUILDER_ID.equals(c1.getBuilderName())) { 049 if (JAVA_BUILDER_ID.equals(c2.getBuilderName())) 050 return 1; 051 if (FLEX_BUILDER_ID.equals(c2.getBuilderName())) 052 return -1; 053 } 054 else if (JAVA_BUILDER_ID.equals(c1.getBuilderName())) { 055 if (GraniteBuilder.GRANITE_BUILDER_ID.equals(c2.getBuilderName()) || FLEX_BUILDER_ID.equals(c2.getBuilderName())) 056 return -1; 057 } 058 else if (FLEX_BUILDER_ID.equals(c1.getBuilderName())) { 059 if (GRANITE_BUILDER_ID.equals(c2.getBuilderName()) || JAVA_BUILDER_ID.equals(c2.getBuilderName())) 060 return 1; 061 } 062 return 0; 063 } 064 }; 065 066 private IProject project; 067 068 @Override 069 public void configure() throws CoreException { 070 IProjectDescription desc = project.getDescription(); 071 ICommand[] commands = desc.getBuildSpec(); 072 073 for (ICommand command : commands) { 074 if (command.getBuilderName().equals(GRANITE_BUILDER_ID)) 075 return; 076 } 077 078 ICommand[] newCommands = new ICommand[commands.length + 1]; 079 System.arraycopy(commands, 0, newCommands, 0, commands.length); 080 ICommand command = desc.newCommand(); 081 command.setBuilderName(GRANITE_BUILDER_ID); 082 newCommands[newCommands.length - 1] = command; 083 Arrays.sort(newCommands, BUILDER_COMPARATOR); 084 desc.setBuildSpec(newCommands); 085 project.setDescription(desc, null); 086 } 087 088 @Override 089 public void deconfigure() throws CoreException { 090 IProjectDescription description = project.getDescription(); 091 ICommand[] commands = description.getBuildSpec(); 092 093 for (int i = 0; i < commands.length; i++) { 094 if (commands[i].getBuilderName().equals(GRANITE_BUILDER_ID)) { 095 ICommand[] newCommands = new ICommand[commands.length - 1]; 096 System.arraycopy(commands, 0, newCommands, 0, i); 097 System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1); 098 description.setBuildSpec(newCommands); 099 return; 100 } 101 } 102 } 103 104 @Override 105 public IProject getProject() { 106 return project; 107 } 108 109 @Override 110 public void setProject(IProject project) { 111 this.project = project; 112 } 113}