001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041: package org.netbeans.modules.versioning.spi;
042:
043: import org.netbeans.modules.versioning.VersioningManager;
044:
045: import java.io.File;
046: import java.beans.PropertyChangeListener;
047: import java.beans.PropertyChangeSupport;
048: import java.util.*;
049:
050: /**
051: * Base class for a versioning system that integrates into IDE.
052: *
053: * A versioning system provides these services:
054: * - annotations (coloring, actions)
055: * - file system handler
056: * - diff provider
057: *
058: * Versioning system registration is done via META-INF/services (default Lookup). Create a file named
059: * "org.netbeans.modules.versioning.spi.VersioningSystem" and place it inside your module's META-INF/services folder.
060: * The file should only contain one the name of your VS implementation class, eg "org.mymodule.MyVersioningSystem".
061: *
062: * @author Maros Sandor
063: */
064: public abstract class VersioningSystem {
065:
066: /**
067: * Short name of the versioning system, it will be used as popup menu label, label in tooltips, etc.
068: * Examples: CVS, Subversion, Mercurial, Teamware, SourceSafe, VSS, Clearcase, Local History.
069: * @see #getProperty(String)
070: * @see #putProperty(String, Object)
071: */
072: public static final String PROP_DISPLAY_NAME = "String VCS.DisplayName";
073:
074: /**
075: * Short name of the versioning system, it will be used as menu label and it should define a mnemonic key.
076: * Examples: &CVS, &Subversion, &Mercurial, &Teamware, &SourceSafe, &VSS, &Clearcase, Local &History.
077: * @see #getProperty(String)
078: * @see #putProperty(String, Object)
079: */
080: public static final String PROP_MENU_LABEL = "String VCS.MenuLabel";
081:
082: /**
083: * Marker property for a Versioning system that operates in Local History mode. Local History is a special versioning
084: * system with these properties:
085: *
086: * - there is only one local history module active at any one time, the first encoutered module wins
087: * - local history module is not exclusive with other registered 'normal' versioning systems. This means that
088: * filesystems events may be processed both by Local history module and by some other versioning system module
089: *
090: * NOTE: Local History is implemented by default, use this only if you are writing a replacement module
091: */
092: public static final String PROP_LOCALHISTORY_VCS = "Boolean VCS.LocalHistory";
093:
094: private final PropertyChangeSupport support = new PropertyChangeSupport(
095: this );
096:
097: private final Map<String, Object> properties = Collections
098: .synchronizedMap(new HashMap<String, Object>());
099:
100: /**
101: * Protected constructor, does nothing.
102: */
103: protected VersioningSystem() {
104: }
105:
106: /**
107: * Gets a general property of a Versioning system.
108: *
109: * @param key property key
110: * @return Object property value, may be null
111: * @see #PROP_DISPLAY_NAME
112: * @see #PROP_MENU_LABEL
113: */
114: public final Object getProperty(String key) {
115: return properties.get(key);
116: }
117:
118: /**
119: * Sets a general property of a Versioning system.
120: *
121: * @param key property key, must NOT be null
122: * @param value property value, may be null
123: * @see #PROP_DISPLAY_NAME
124: * @see #PROP_MENU_LABEL
125: */
126: protected final void putProperty(String key, Object value) {
127: if (key == null)
128: throw new IllegalArgumentException("Property name is null");
129: properties.put(key, value);
130: }
131:
132: /**
133: * Tests whether the file is managed by this versioning system. If it is, the method should return the topmost
134: * ancestor of the file that is still versioned.
135: * For example (for CVS) if all your CVS checkouts are in a directory /home/johndoe/projects/cvscheckouts/... then for all files
136: * that are under "cvscheckouts" directory and for the directory itselft this method should
137: * return "/home/johndoe/projects/cvscheckouts/" and for all other files return null.
138: *
139: * @param file a file
140: * @return File the file itself or one of its ancestors or null if the supplied file is NOT managed by this versioning system
141: */
142: public File getTopmostManagedAncestor(File file) {
143: return null;
144: }
145:
146: /**
147: * Retrieves a VCSAnnotator implementation if this versioning system provides one.
148: *
149: * @return a VCSAnnotator implementation or null
150: */
151: public VCSAnnotator getVCSAnnotator() {
152: return null;
153: }
154:
155: /**
156: * Retrieves a VCSInterceptor implementation if this versioning system provides one.
157: *
158: * @return a VCSInterceptor implementation or null
159: */
160: public VCSInterceptor getVCSInterceptor() {
161: return null;
162: }
163:
164: /**
165: * Get the original (unmodified) copy of a file. If the versioning system cannot provide it then this method should do nothing.
166: * For version control systems that support keyword expansion, the original file must expand all keywords so the
167: * diff sidebar support will not report any differences in keywords.
168: *
169: * @param workingCopy a File in the working copy
170: * @param originalFile placeholder File for the original (unmodified) copy of the working file
171: */
172: public void getOriginalFile(File workingCopy, File originalFile) {
173: // default implementation does nothing
174: }
175:
176: /**
177: * Adds a listener for change events.
178: *
179: * @param listener a PropertyChangeListener
180: */
181: public final void addPropertyChangeListener(
182: PropertyChangeListener listener) {
183: support.addPropertyChangeListener(listener);
184: }
185:
186: /**
187: * Removes a listener for change events.
188: *
189: * @param listener a PropertyChangeListener
190: */
191: public final void removePropertyChangeListener(
192: PropertyChangeListener listener) {
193: support.removePropertyChangeListener(listener);
194: }
195:
196: /**
197: * Helper method to signal that annotations of a set of files changed. Do NOT fire this event when changes in
198: * annotations are caused by changes of status. Status change event will refresh annotations automatically.
199: *
200: * @param files set of files whose annotations changed or null if the change affects all files
201: */
202: protected final void fireAnnotationsChanged(Set<File> files) {
203: support.firePropertyChange(
204: VersioningManager.EVENT_ANNOTATIONS_CHANGED, null,
205: files);
206: }
207:
208: /**
209: * Helper method to signal that status of a set of files changed. Status change event will refresh annotations automatically.
210: *
211: * @param files set of files whose status changed or null if all files changed status
212: */
213: protected final void fireStatusChanged(Set<File> files) {
214: support.firePropertyChange(
215: VersioningManager.EVENT_STATUS_CHANGED, null, files);
216: }
217:
218: /**
219: * Helper method to signal that the versioning system started to manage some previously unversioned files
220: * (those files were imported into repository).
221: */
222: protected final void fireVersionedFilesChanged() {
223: support.firePropertyChange(
224: VersioningManager.EVENT_VERSIONED_ROOTS, null, null);
225: }
226:
227: /**
228: * Helper method that calls fireStatusChanged(Collections.singleton(file)).
229: *
230: * @param file a file whose status changed
231: * @see #fireStatusChanged(java.util.Set)
232: */
233: protected final void fireStatusChanged(File file) {
234: fireStatusChanged(Collections.singleton(file));
235: }
236: }
|