the PHP_NEW field must be before the field PHPPARSER
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / resourcesview / PHPProject.java
1 package net.sourceforge.phpeclipse.resourcesview;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.InputStream;
5 import java.util.ArrayList;
6 import java.util.Iterator;
7 import java.util.List;
8
9 import javax.xml.parsers.SAXParserFactory;
10
11 import net.sourceforge.phpeclipse.LoadPathEntry;
12 import net.sourceforge.phpeclipse.PHPeclipsePlugin;
13
14 import org.eclipse.core.resources.ICommand;
15 import org.eclipse.core.resources.IFile;
16 import org.eclipse.core.resources.IProject;
17 import org.eclipse.core.resources.IProjectDescription;
18 import org.eclipse.core.resources.IProjectNature;
19 import org.eclipse.core.resources.IResource;
20 import org.eclipse.core.runtime.CoreException;
21 import org.eclipse.core.runtime.IPath;
22 import org.eclipse.core.runtime.Path;
23 import org.xml.sax.Attributes;
24 import org.xml.sax.ContentHandler;
25 import org.xml.sax.InputSource;
26 import org.xml.sax.Locator;
27 import org.xml.sax.SAXException;
28 import org.xml.sax.XMLReader;
29
30 public class PHPProject implements IProjectNature, PHPElement {
31   protected IProject fProject;
32  // protected IndexFileReader fIndexManager;
33   protected List fLoadPathEntries;
34   protected boolean fScratched;
35
36   public PHPProject() {
37   }
38
39   public void addLoadPathEntry(IProject anotherPHPProject) {
40     fScratched = true;
41
42     LoadPathEntry newEntry = new LoadPathEntry(anotherPHPProject);
43     getLoadPathEntries().add(newEntry);
44   }
45
46   public void configure() throws CoreException {
47     //  get project description and then the associated build commands 
48     IProjectDescription desc = fProject.getDescription();
49     ICommand[] commands = desc.getBuildSpec();
50
51     // determine if builder already associated
52     boolean found = false;
53     for (int i = 0; i < commands.length; ++i) {
54       if (commands[i].getBuilderName().equals(PHPeclipsePlugin.BUILDER_PARSER_ID)) {
55         found = true;
56         break;
57       }
58     }
59
60     // add builder if not already in project
61     if (!found) {
62       ICommand command = desc.newCommand();
63       command.setBuilderName(PHPeclipsePlugin.BUILDER_PARSER_ID);
64       ICommand[] newCommands = new ICommand[commands.length + 1];
65
66       // Add it before other builders. 
67       System.arraycopy(commands, 0, newCommands, 1, commands.length);
68       newCommands[0] = command;
69       desc.setBuildSpec(newCommands);
70       fProject.setDescription(desc, null);
71     }
72   }
73
74   public void deconfigure() throws CoreException {
75   }
76
77   public List getLoadPathEntries() {
78     if (fLoadPathEntries == null) {
79       loadLoadPathEntries();
80     }
81
82     return fLoadPathEntries;
83   }
84
85   protected ContentHandler getLoadPathEntriesContentHandler() {
86     return new ContentHandler() {
87       public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
88       }
89
90       public void endDocument() throws SAXException {
91       }
92
93       public void endElement(String arg0, String arg1, String arg2) throws SAXException {
94       }
95
96       public void endPrefixMapping(String arg0) throws SAXException {
97       }
98
99       public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException {
100       }
101
102       public void processingInstruction(String arg0, String arg1) throws SAXException {
103       }
104
105       public void setDocumentLocator(Locator arg0) {
106       }
107
108       public void skippedEntity(String arg0) throws SAXException {
109       }
110
111       public void startDocument() throws SAXException {
112       }
113
114       public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
115         if ("pathentry".equals(qName))
116           if ("project".equals(atts.getValue("type"))) {
117             IPath referencedProjectPath = new Path(atts.getValue("path"));
118             IProject referencedProject = getProject(referencedProjectPath.lastSegment());
119             fLoadPathEntries.add(new LoadPathEntry(referencedProject));
120           }
121       }
122
123       public void startPrefixMapping(String arg0, String arg1) throws SAXException {
124       }
125     };
126   }
127
128   protected IFile getLoadPathEntriesFile() {
129     return fProject.getFile(".loadpath");
130   }
131
132   protected String getLoadPathXML() {
133     StringBuffer buffer = new StringBuffer();
134     buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><loadpath>");
135
136     Iterator pathEntriesIterator = fLoadPathEntries.iterator();
137
138     while (pathEntriesIterator.hasNext()) {
139       LoadPathEntry entry = (LoadPathEntry) pathEntriesIterator.next();
140       buffer.append(entry.toXML());
141     }
142
143     buffer.append("</loadpath>");
144     return buffer.toString();
145   }
146
147   public IProject getProject() {
148     return fProject;
149   }
150
151   protected IProject getProject(String name) {
152     return PHPeclipsePlugin.getWorkspace().getRoot().getProject(name);
153   }
154
155   public List getReferencedProjects() {
156     List referencedProjects = new ArrayList();
157
158     Iterator iterator = getLoadPathEntries().iterator();
159     while (iterator.hasNext()) {
160       LoadPathEntry pathEntry = (LoadPathEntry) iterator.next();
161       if (pathEntry.getType() == LoadPathEntry.TYPE_PROJECT)
162         referencedProjects.add(pathEntry.getProject());
163     }
164
165     return referencedProjects;
166   }
167
168   public IResource getUnderlyingResource() {
169     return fProject;
170   }
171
172   protected void loadLoadPathEntries() {
173     fLoadPathEntries = new ArrayList();
174
175     IFile loadPathsFile = getLoadPathEntriesFile();
176
177     XMLReader reader = null;
178     try {
179       reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
180       reader.setContentHandler(getLoadPathEntriesContentHandler());
181       reader.parse(new InputSource(loadPathsFile.getContents()));
182     } catch (Exception e) {
183       //the file is nonextant or unreadable
184     }
185   }
186
187   public void removeLoadPathEntry(IProject anotherPHPProject) {
188     Iterator entries = getLoadPathEntries().iterator();
189     while (entries.hasNext()) {
190       LoadPathEntry entry = (LoadPathEntry) entries.next();
191       if (entry.getType() == LoadPathEntry.TYPE_PROJECT && entry.getProject().getName().equals(anotherPHPProject.getName())) {
192         getLoadPathEntries().remove(entry);
193         fScratched = true;
194         break;
195       }
196     }
197   }
198
199   public void save() throws CoreException {
200     if (fScratched) {
201       InputStream xmlPath = new ByteArrayInputStream(getLoadPathXML().getBytes());
202       IFile loadPathsFile = getLoadPathEntriesFile();
203       if (!loadPathsFile.exists())
204         loadPathsFile.create(xmlPath, true, null);
205       else
206         loadPathsFile.setContents(xmlPath, true, false, null);
207
208       fScratched = false;
209     }
210   }
211
212   public void setProject(IProject aProject) {
213     fProject = aProject;
214   }
215
216 }