001: package org.acm.seguin.completer;
002:
003: /*
004: * Copyright (c) 2002, Beau Tateyama
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU General Public License
008: * as published by the Free Software Foundation; either version 2
009: * of the License, or any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
019: */
020:
021: //import anthelper.utils.SrcInfoUtils;
022: //import anthelper.utils.JEditLogger;
023: import java.io.File;
024: import java.lang.CloneNotSupportedException;
025: import java.lang.reflect.Field;
026: import java.lang.reflect.Modifier;
027: import java.util.Comparator;
028: import java.util.Hashtable;
029: import java.util.Iterator;
030: import java.util.Map;
031: import java.util.TreeMap;
032: import java.util.TreeSet;
033: import java.util.List;
034: import java.util.ArrayList;
035: import java.util.StringTokenizer;
036: import org.apache.tools.ant.Project;
037: import org.gjt.sp.jedit.*;
038: import org.acm.seguin.ide.jedit.Navigator;
039:
040: public class Context {
041: // @TODO: would be nice to have equals, clone, and test driver
042: final static Navigator.NavigatorLogger logger = Completer
043: .getLogger(ClassPathSrcMgr.class);
044:
045: private static final class Keys {
046: static final String FILE_BUILD = "FILE_BUILD";
047: static final String FILE_OUTPUT_DIR = "FILE_OUTPUT_DIR";
048: static final String FILE_SRC_DIR = "FILE_SRC_DIR";
049: static final String TASKA = "TASKA";
050: static final String TASKB = "TASKB";
051: static final String TASKC = "TASKC";
052: static final String TASKD = "TASKD";
053: static final String CLASSPATH = "CLASSPATH";
054: static final String CLASSPATH_REF_ID = "CLASSPATH_REF_ID";
055: static final String SOURCEPATH = "SOURCE_PATH";
056: static final String SOURCEPATH_REF_ID = "SOURCE_PATH_REF_ID";
057:
058: static final String JVM_OPTIONS = "JVM_OPTIONS";
059: static final String RUN_PARAMS = "RUN_PARAMS";
060: static final String B_SAVE_BEFORE_COMPILE = "B_SAVE_BEFORE_COMPILE";
061: static final String B_SAVE_BEFORE_RUN = "B_SAVE_BEFORE_RUN";
062: static final String B_SYNC_TO_SPEEDJAVA = "B_SYNC_TO_SPEEDJAVA";
063: static final String L_LAST_MOD = "L_LAST_MOD";
064: static final String CLASS_NAME_CACHE = "CLASS_NAME_CACHE";
065: static final String PROJECT = "PROJECT";
066:
067: }
068:
069: // the main data map
070: Map _mapData = new Hashtable();
071: // a cache of source dirs
072: File[] _fileSourceDirs = null;
073:
074: Context(File argFile) {
075: _put(Keys.FILE_BUILD, argFile);
076: // defaults
077: _put(Keys.B_SAVE_BEFORE_COMPILE, Boolean.TRUE);
078: _put(Keys.B_SAVE_BEFORE_RUN, Boolean.TRUE);
079: _put(Keys.B_SYNC_TO_SPEEDJAVA, Boolean.TRUE);
080: _put(Keys.TASKA, "compile");
081: _put(Keys.TASKB, "dist");
082: _put(Keys.TASKC, "clean");
083: }
084:
085: public String getAntTaskA() {
086: return _getString(Keys.TASKA);
087: }
088:
089: public String getAntTaskB() {
090: return _getString(Keys.TASKB);
091: }
092:
093: public String getAntTaskC() {
094: return _getString(Keys.TASKC);
095: }
096:
097: public String getAntTaskD() {
098: return _getString(Keys.TASKD);
099: }
100:
101: public void setAntTaskA(String argTaskName) {
102: _put(Keys.TASKA, argTaskName);
103: }
104:
105: public void setAntTaskB(String argTaskName) {
106: _put(Keys.TASKB, argTaskName);
107: }
108:
109: public void setAntTaskC(String argTaskName) {
110: _put(Keys.TASKC, argTaskName);
111: }
112:
113: public void setAntTaskD(String argTaskName) {
114: _put(Keys.TASKD, argTaskName);
115: }
116:
117: public File getBuildFile() {
118: return _getFile(Keys.FILE_BUILD);
119: }
120:
121: public File getOutputDirectory() {
122: return _getFile(Keys.FILE_OUTPUT_DIR);
123: }
124:
125: public void setOutputDirectory(File argFile) {
126: _put(Keys.FILE_OUTPUT_DIR, argFile);
127: }
128:
129: /*
130: public File getSourceDirectory(){ return _getFile(Keys.FILE_SRC_DIR); }
131: public void setSourceDirectory(File argFile){ _put(Keys.FILE_SRC_DIR, argFile); }
132: */
133:
134: public String getJVMOptions() {
135: return _getString(Keys.JVM_OPTIONS);
136: }
137:
138: public void setJVMOptions(String arg) {
139: _put(Keys.JVM_OPTIONS, arg);
140: }
141:
142: public String getRunParams() {
143: return _getString(Keys.RUN_PARAMS);
144: }
145:
146: public void setRunParams(String arg) {
147: _put(Keys.RUN_PARAMS, arg);
148: }
149:
150: public String getClassPath() {
151: return _getString(Keys.CLASSPATH);
152: }
153:
154: public void setClassPath(String argClassPath) {
155: _put(Keys.CLASSPATH, argClassPath);
156: }
157:
158: public String getClassPathRefID() {
159: return _getString(Keys.CLASSPATH_REF_ID);
160: }
161:
162: public void setClassPathRefID(String argRefID) {
163: _put(Keys.CLASSPATH_REF_ID, argRefID);
164: }
165:
166: public String getSourcePath() {
167: return _getString(Keys.SOURCEPATH);
168: }
169:
170: public void setSourcePath(String argSourcePath) {
171: _put(Keys.SOURCEPATH, argSourcePath);
172: if (argSourcePath == null) {
173: _fileSourceDirs = null;
174: } else {
175: _fileSourceDirs = pathToList(argSourcePath);
176: }
177: }
178:
179: public File[] getSourceDirectories() {
180: return _fileSourceDirs;
181: }
182:
183: public static File[] pathToList(String argCP) {
184: File[] files = null;
185: if (argCP != null) {
186: List listFiles = new ArrayList();
187: for (StringTokenizer st = new StringTokenizer(argCP,
188: File.pathSeparator); st.hasMoreTokens();) {
189: listFiles.add(new File(st.nextToken()));
190: }
191: files = (File[]) listFiles.toArray(new File[listFiles
192: .size()]);
193: }
194: return files;
195: }
196:
197: public String getSourcePathRefID() {
198: return _getString(Keys.SOURCEPATH_REF_ID);
199: }
200:
201: public void setSourcePathRefID(String argRefID) {
202: _put(Keys.SOURCEPATH_REF_ID, argRefID);
203: }
204:
205: public boolean getSaveBeforeCompile() {
206: return _getBoolean(Keys.B_SAVE_BEFORE_COMPILE);
207: }
208:
209: public boolean getSaveBeforeRun() {
210: return _getBoolean(Keys.B_SAVE_BEFORE_RUN);
211: }
212:
213: public boolean getSyncToSpeedJava() {
214: return _getBoolean(Keys.B_SYNC_TO_SPEEDJAVA);
215: }
216:
217: public void setSaveBeforeCompile(boolean arg) {
218: _put(Keys.B_SAVE_BEFORE_COMPILE, new Boolean(arg));
219: }
220:
221: public void setSaveBeforeRun(boolean arg) {
222: _put(Keys.B_SAVE_BEFORE_RUN, new Boolean(arg));
223: }
224:
225: public void setSyncToSpeedJava(boolean arg) {
226: _put(Keys.B_SYNC_TO_SPEEDJAVA, new Boolean(arg));
227: }
228:
229: public long getLastMod() {
230: Long lastMod = (Long) _mapData.get(Keys.L_LAST_MOD);
231: if (lastMod == null) {
232: lastMod = new Long(getBuildFile().lastModified());
233: _put(Keys.L_LAST_MOD, lastMod);
234: }
235: return lastMod.longValue();
236: }
237:
238: public void setLastMod(long arg) {
239: _put(Keys.L_LAST_MOD, new Long(arg));
240: }
241:
242: public synchronized ClassNameCache getClassNameCache() {
243: ClassNameCache cnc = (ClassNameCache) _mapData
244: .get(Keys.CLASS_NAME_CACHE);
245: if (cnc == null) {
246: String strCP = getClassPath();
247: if (strCP == null) {
248: // null cp, so guess something...if source dir is null, this is a new context
249: strCP = (getSourcePath() == null ? "" : getSourcePath());
250: }
251: cnc = new ClassNameCache(strCP);
252: _put(Keys.CLASS_NAME_CACHE, cnc);
253: }
254: return cnc;
255: }
256:
257: public synchronized void resetClassNameCache() {
258: _mapData.remove(Keys.CLASS_NAME_CACHE);
259: }
260:
261: public synchronized Project getProject() {
262: Project proj = (Project) _mapData.get(Keys.PROJECT);
263: if (proj == null) {
264: //FIXME: proj = AntUtils.createAndInitProject(getBuildFile());
265: }
266: return proj;
267: }
268:
269: public synchronized void setProject(Project arg) {
270: _put(Keys.PROJECT, arg);
271: }
272:
273: class ToStringComparator implements Comparator {
274: public int compare(Object o1, Object o2) {
275: return o1.toString().compareTo(o2.toString());
276: }
277: }
278:
279: public String toString() {
280:
281: TreeSet setKeys = new TreeSet();
282: Field[] fields = Keys.class.getDeclaredFields();
283: for (int i = 0, l = fields.length; i < l; i++) {
284: setKeys.add(fields[i].getName());
285: }
286:
287: String NL = "\n", TAB = "\t";
288: StringBuffer sb = new StringBuffer("[" + super .toString() + "]"
289: + NL);
290: String strKey;
291: Object objVal;
292: for (Iterator it = setKeys.iterator(); it.hasNext();) {
293: strKey = it.next().toString();
294: objVal = _mapData.get(strKey);
295: sb.append(TAB).append(strKey);
296: sb.append("=");
297: sb.append(objVal == null ? "" : objVal.toString()).append(
298: NL);
299: }
300: return sb.toString();
301: }
302:
303: private void _put(Object objKey, Object objVal) {
304: if (objKey != null && objVal != null) {
305: _mapData.put(objKey, objVal);
306: }
307: }
308:
309: private String _getString(Object objKey) {
310: return (String) (objKey == null ? null : _mapData.get(objKey));
311: }
312:
313: private File _getFile(Object objKey) {
314: return (File) (objKey == null ? null : _mapData.get(objKey));
315: }
316:
317: private boolean _getBoolean(Object objKey) {
318: boolean b = false;
319: if (objKey != null) {
320: Object objVal = _mapData.get(objKey);
321: b = objVal == null ? false : ((Boolean) _mapData
322: .get(objKey)).booleanValue();
323: }
324: return b;
325: }
326:
327: public int hashCode() {
328: // we just add a random offset
329: return _mapData.hashCode() + 10220;
330: }
331:
332: public boolean equals(Object o) {
333: if (this == o) { // Step 1: Perform an == test
334: return true;
335: }
336:
337: if (!(o instanceof Context)) {
338: return false;
339: }
340: Context context = (Context) o;
341: return context._mapData.equals(this ._mapData);
342: }
343:
344: public static Context getTestContext() {
345: return new Context(
346: new File(
347: "C:/Documents and Settings/ueab/.jedit/jars/AntHelper/build.xml"));
348: }
349:
350: public static void main(String[] args) {
351: try {
352: logger.msg(getTestContext().toString());
353: } catch (Throwable t) {
354: t.printStackTrace();
355: }
356: }
357:
358: }
|