blob: 145c0539c35a0d5b2040f0ef97bc008bfb512ad7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.repo;
import java.util.*;
import org.eclipse.core.runtime.Path;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.util.KnownRepositories;
import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class RepositoriesViewContentHandler extends DefaultHandler {
public static final String REPOSITORIES_VIEW_TAG = "repositories-view"; //$NON-NLS-1$
public static final String REPOSITORY_TAG = "repository"; //$NON-NLS-1$
public static final String WORKING_SET_TAG = "working-set"; //$NON-NLS-1$
public static final String CURRENT_WORKING_SET_TAG = "current-working-set"; //$NON-NLS-1$
public static final String MODULE_TAG = "module"; //$NON-NLS-1$
public static final String TAG_TAG = "tag"; //$NON-NLS-1$
public static final String AUTO_REFRESH_FILE_TAG = "auto-refresh-file"; //$NON-NLS-1$
public static final String DATE_TAGS_TAG = "date-tags"; //$NON-NLS-1$
public static final String DATE_TAG_TAG = "date-tag"; //$NON-NLS-1$
public static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
public static final String NAME_ATTRIBUTE = "name"; //$NON-NLS-1$
public static final String PATH_ATTRIBUTE = "path"; //$NON-NLS-1$
public static final String FULL_PATH_ATTRIBUTE = "full-path"; //$NON-NLS-1$
public static final String TYPE_ATTRIBUTE = "type"; //$NON-NLS-1$
public static final String READ_ID_ATTRIBUTE = "read-id"; //$NON-NLS-1$
public static final String WRITE_ID_ATTRIBUTE = "write-id"; //$NON-NLS-1$
public static final String LAST_ACCESS_TIME_ATTRIBUTE = "lastAcessTime"; //$NON-NLS-1$
public static final String[] TAG_TYPES = {"head", "branch", "version", "date"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
public static final String DEFAULT_TAG_TYPE = "version"; //$NON-NLS-1$
public static final String DEFINED_MODULE_TYPE = "defined"; //$NON-NLS-1$
private RepositoryManager manager;
private StringBuffer buffer = new StringBuffer();
private Stack tagStack = new Stack();
private RepositoryRoot currentRepositoryRoot;
private String currentRemotePath;
private List tags;
private List dateTags;
private List autoRefreshFiles;
private boolean ignoreElements;
private long lastAccessTime;
public RepositoriesViewContentHandler(RepositoryManager manager) {
this.manager = manager;
}
@Override
public void characters(char[] chars, int startIndex, int length) throws SAXException {
buffer.append(chars, startIndex, length);
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
String elementName = getElementName(namespaceURI, localName, qName);
if (!elementName.equals(tagStack.peek())) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_unmatchedTag, new String[] { elementName }));
}
if (elementName.equals(REPOSITORIES_VIEW_TAG)) {
// all done
} else if (elementName.equals(REPOSITORY_TAG)) {
if (!ignoreElements) {
manager.add(currentRepositoryRoot);
}
currentRepositoryRoot = null;
} else if (elementName.equals(WORKING_SET_TAG)) {
// This tag is no longer used
ignoreElements = false;
} else if (elementName.equals(CURRENT_WORKING_SET_TAG)) {
// This tag is no longer used
ignoreElements = false;
} else if (elementName.equals(MODULE_TAG)) {
if (! ignoreElements && currentRepositoryRoot != null) {
currentRepositoryRoot.addTags(currentRemotePath,
(CVSTag[]) tags.toArray(new CVSTag[tags.size()]));
if (lastAccessTime > 0)
currentRepositoryRoot.setLastAccessedTime(currentRemotePath, lastAccessTime);
currentRepositoryRoot.setAutoRefreshFiles(currentRemotePath,
(String[]) autoRefreshFiles.toArray(new String[autoRefreshFiles.size()]));
}
}else if(elementName.equals(DATE_TAG_TAG)){
if (! ignoreElements && currentRepositoryRoot != null) {
Iterator iter = dateTags.iterator();
while(iter.hasNext()){
CVSTag tag = (CVSTag)iter.next();
currentRepositoryRoot.addDateTag(tag);
}
}
}
tagStack.pop();
}
@Override
public void startElement(
String namespaceURI,
String localName,
String qName,
Attributes atts)
throws SAXException {
String elementName = getElementName(namespaceURI, localName, qName);
if (elementName.equals(REPOSITORIES_VIEW_TAG)) {
// just started
} else if (elementName.equals(REPOSITORY_TAG)) {
String id = atts.getValue(ID_ATTRIBUTE);
if (id == null) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_missingAttribute, new String[] { REPOSITORY_TAG, ID_ATTRIBUTE }));
}
ICVSRepositoryLocation root;
try {
root = KnownRepositories.getInstance().getRepository(id);
if (!KnownRepositories.getInstance().isKnownRepository(id)) {
KnownRepositories.getInstance().addRepository(root, false);
}
} catch (CVSException e) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_errorCreatingRoot, new String[] { id }), e);
}
currentRepositoryRoot = new RepositoryRoot(root);
String name = atts.getValue(NAME_ATTRIBUTE);
if (name != null) {
currentRepositoryRoot.setName(name);
}
} else if(elementName.equals(DATE_TAGS_TAG)){
//prepare to collect date tag
dateTags = new ArrayList();
} else if (elementName.equals(DATE_TAG_TAG)){
String name = atts.getValue(NAME_ATTRIBUTE);
if (name == null) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_missingAttribute, new String[] { DATE_TAGS_TAG, NAME_ATTRIBUTE }));
}
dateTags.add(new CVSTag(name, CVSTag.DATE));
}else if (elementName.equals(WORKING_SET_TAG)) {
String name = atts.getValue(NAME_ATTRIBUTE);
if (name == null) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_missingAttribute, new String[] { WORKING_SET_TAG, NAME_ATTRIBUTE }));
}
// Ignore any elements until the corresponding end tag is reached
ignoreElements = true;
} else if (elementName.equals(MODULE_TAG)) {
String path = atts.getValue(PATH_ATTRIBUTE);
if (path == null) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_missingAttribute, new String[] { MODULE_TAG, PATH_ATTRIBUTE }));
}
String type = atts.getValue(TYPE_ATTRIBUTE);
if (type != null && type.equals(DEFINED_MODULE_TYPE)) {
path = RepositoryRoot.asDefinedModulePath(path);
}
long cachedTime = 0;
String cachedTimeString = atts.getValue(LAST_ACCESS_TIME_ATTRIBUTE);
if (cachedTimeString != null) {
try {
Long time = Long.valueOf(cachedTimeString);
cachedTime = time.longValue();
} catch (NumberFormatException e) {
// Ignore
}
}
startModule(path, cachedTime);
} else if (elementName.equals(TAG_TAG)) {
String type = atts.getValue(TYPE_ATTRIBUTE);
if (type == null) {
type = DEFAULT_TAG_TYPE;
}
String name = atts.getValue(NAME_ATTRIBUTE);
if (name == null) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_missingAttribute, new String[] { TAG_TAG, NAME_ATTRIBUTE }));
}
tags.add(new CVSTag(name, getCVSTagType(type)));
} else if (elementName.equals(AUTO_REFRESH_FILE_TAG)) {
String path = atts.getValue(FULL_PATH_ATTRIBUTE);
if (path == null) {
// get the old path attribute format which was relative to the module
path = atts.getValue(PATH_ATTRIBUTE);
if (path == null) {
throw new SAXException(NLS.bind(CVSUIMessages.RepositoriesViewContentHandler_missingAttribute, new String[] { AUTO_REFRESH_FILE_TAG, FULL_PATH_ATTRIBUTE }));
}
if (RepositoryRoot.isDefinedModuleName(currentRemotePath)) {
path = null;
} else {
path = new Path(null, currentRemotePath).append(path).toString();
}
}
if (path != null) autoRefreshFiles.add(path);
} else if (elementName.equals(CURRENT_WORKING_SET_TAG)) {
// Ignore any elements until the corresponding end tag is reached
ignoreElements = true;
}
// empty buffer
buffer = new StringBuffer();
tagStack.push(elementName);
}
private void startModule(String path, long cachedTime) {
currentRemotePath = path;
tags = new ArrayList();
this.lastAccessTime = cachedTime;
autoRefreshFiles = new ArrayList();
}
/**
* Method getCVSTagType.
* @param type
*/
public int getCVSTagType(String type) {
for (int i = 0; i < TAG_TYPES.length; i++) {
if (TAG_TYPES[i].equals(type))
return i;
}
return CVSTag.VERSION;
}
/*
* Couldn't figure out from the SAX API exactly when localName vs. qName is used.
* However, the XML for project sets doesn't use namespaces so either of the two names
* is fine. Therefore, use whichever one is provided.
*/
private String getElementName(String namespaceURI, String localName, String qName) {
if (localName != null && localName.length() > 0) {
return localName;
} else {
return qName;
}
}
}