blob: 80387e45361df5f5d290aa4adf67d7aab8e8c847 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2013 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
* Jevgeni Holodkov - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
/**
* @author Rob Elves
* @author Jevgeni Holodkov
*/
public class TaskRepositoriesExternalizer {
private final SaxRepositoriesWriter writer = new SaxRepositoriesWriter();
public static final String ELEMENT_TASK_REPOSITORIES = "TaskRepositories"; //$NON-NLS-1$
public static final String ELEMENT_TASK_REPOSITORY = "TaskRepository"; //$NON-NLS-1$
public static final String ATTRIBUTE_VERSION = "OutputVersion"; //$NON-NLS-1$
public static final String ELEMENT_PROPERTY = "Property"; //$NON-NLS-1$
public static final String PROPERTY_KEY = "key"; //$NON-NLS-1$
public static final String PROPERTY_VALUE = "value"; //$NON-NLS-1$
public void writeRepositoriesToXML(Collection<TaskRepository> repositories, File file) {
ZipOutputStream outputStream = null;
try {
if (!file.exists()) {
file.createNewFile();
}
outputStream = new ZipOutputStream(new FileOutputStream(file));
writeRepositories(repositories, outputStream);
outputStream.close();
} catch (IOException e) {
StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Could not write: " //$NON-NLS-1$
+ file.getAbsolutePath(), e));
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Could not close: " //$NON-NLS-1$
+ file.getAbsolutePath(), e));
}
}
}
}
/**
* @param repositories
* @param outputStream
* @throws IOException
*/
public void writeRepositories(Collection<TaskRepository> repositories, ZipOutputStream outputStream)
throws IOException {
ZipEntry zipEntry = new ZipEntry(TaskRepositoryManager.OLD_REPOSITORIES_FILE);
outputStream.putNextEntry(zipEntry);
outputStream.setMethod(ZipOutputStream.DEFLATED);
// OutputStream stream = new FileOutputStream(file);
writer.setOutputStream(outputStream);
writer.writeRepositoriesToStream(repositories);
outputStream.flush();
outputStream.closeEntry();
}
public Set<TaskRepository> readRepositoriesFromXML(File file) {
if (!file.exists()) {
return null;
}
InputStream inputStream = null;
try {
inputStream = new ZipInputStream(new FileInputStream(file));
// search for REPOSITORIES entry
ZipEntry entry = ((ZipInputStream) inputStream).getNextEntry();
while (entry != null) {
if (TaskRepositoryManager.OLD_REPOSITORIES_FILE.equals(entry.getName())) {
break;
}
entry = ((ZipInputStream) inputStream).getNextEntry();
}
if (entry == null) {
return null;
}
SaxRepositoriesContentHandler contentHandler = new SaxRepositoriesContentHandler();
XMLReader reader = XmlReaderUtil.createXmlReader();
reader.setContentHandler(contentHandler);
reader.parse(new InputSource(inputStream));
return contentHandler.getRepositories();
} catch (Throwable e) {
file.renameTo(new File(file.getAbsolutePath() + "-save")); //$NON-NLS-1$
StatusHandler.log(
new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN, "Error reading task repositories", e)); //$NON-NLS-1$
return null;
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
StatusHandler.log(new Status(IStatus.ERROR, ITasksCoreConstants.ID_PLUGIN,
"Error closing task repositories file", e)); //$NON-NLS-1$
}
}
}
}
}