/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.core.internal.dom;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xmind.core.Core;
import org.xmind.core.CoreException;
import org.xmind.core.IDeserializer;
import org.xmind.core.IEncryptionData;
import org.xmind.core.IEncryptionHandler;
import org.xmind.core.IEntryStreamNormalizer;
import org.xmind.core.IFileEntry;
import org.xmind.core.IMeta;
import org.xmind.core.ISerializer;
import org.xmind.core.IWorkbook;
import org.xmind.core.internal.AbstractWorkbookBuilder;
import org.xmind.core.internal.security.Crypto;
import org.xmind.core.io.ByteArrayStorage;
import org.xmind.core.io.ChecksumTrackingOutputStream;
import org.xmind.core.io.ChecksumVerifiedInputStream;
import org.xmind.core.io.IInputSource;
import org.xmind.core.io.IOutputTarget;
import org.xmind.core.io.IStorage;
import org.xmind.core.util.DOMUtils;
import org.xmind.core.util.FileUtils;
@SuppressWarnings("deprecation")
public class WorkbookBuilderImpl extends AbstractWorkbookBuilder {
protected synchronized Document createDocument() {
DocumentBuilder docBuilder;
try {
docBuilder = DOMUtils.getDefaultDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new IllegalStateException(e);
}
return docBuilder.newDocument();
}
protected synchronized DocumentBuilder getDocumentLoader()
throws CoreException {
try {
DocumentBuilder loader = DOMUtils.getDefaultDocumentBuilder();
return loader;
} catch (ParserConfigurationException e) {
throw new CoreException(Core.ERROR_FAIL_ACCESS_XML_PARSER, e);
}
}
@Override
protected IWorkbook doCreateWorkbook(IStorage storage) {
if (storage == null)
storage = new ByteArrayStorage();
storage.clear();
Document contentDoc = createDocument();
WorkbookImpl workbook = new WorkbookImpl(contentDoc, storage);
/*
* ------------------------------------------------------
*
* NEED REFACTOR:
*/
IMeta meta = workbook.getMeta();
String name = System.getProperty(DOMConstants.AUTHOR_NAME);
if (name == null)
name = System.getProperty("user.name"); //$NON-NLS-1$
if (name != null)
meta.setValue(IMeta.AUTHOR_NAME, name);
String email = System.getProperty(DOMConstants.AUTHOR_EMAIL);
if (email != null)
meta.setValue(IMeta.AUTHOR_EMAIL, email);
String org = System.getProperty(DOMConstants.AUTHOR_ORG);
if (org != null)
meta.setValue(IMeta.AUTHOR_ORG, org);
if (meta.getValue(IMeta.CREATED_TIME) == null)
meta.setValue(IMeta.CREATED_TIME,
NumberUtils.formatDate(System.currentTimeMillis()));
meta.setValue(IMeta.CREATOR_NAME, getCreatorName());
meta.setValue(IMeta.CREATOR_VERSION, getCreatorVersion());
return workbook;
}
/*
* (non-Javadoc)
*
* @see org.xmind.core.IWorkbookBuilder#newDeserializer()
*/
public IDeserializer newDeserializer() {
DeserializerImpl deserializer = new DeserializerImpl();
deserializer.setCreatorName(getCreatorName());
deserializer.setCreatorVersion(getCreatorVersion());
return deserializer;
}
/*
* (non-Javadoc)
*
* @see org.xmind.core.IWorkbookBuilder#newSerializer()
*/
public ISerializer newSerializer() {
SerializerImpl serializer = new SerializerImpl();
serializer.setCreatorName(getCreatorName());
serializer.setCreatorVersion(getCreatorVersion());
return serializer;
}
private static class LegacyEncryptionNormalizerAdapter
implements IEntryStreamNormalizer {
private final IEncryptionHandler encryptionHandler;
/**
*
*/
public LegacyEncryptionNormalizerAdapter(
IEncryptionHandler encryptionHandler) {
super();
this.encryptionHandler = encryptionHandler;
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.core.IEntryStreamNormalizer#normalizeOutputStream(java.io.
* OutputStream, org.xmind.core.IFileEntry)
*/
public OutputStream normalizeOutputStream(OutputStream stream,
IFileEntry fileEntry) throws IOException, CoreException {
fileEntry.deleteEncryptionData();
IEncryptionData encData = fileEntry.createEncryptionData();
Crypto.initEncryptionData(encData);
OutputStream out = Crypto.creatOutputStream(stream, true, encData,
encryptionHandler.retrievePassword());
if (encData.getChecksumType() != null) {
return new ChecksumTrackingOutputStream(encData, out);
}
return out;
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.core.IEntryStreamNormalizer#normalizeInputStream(java.io.
* InputStream, org.xmind.core.IFileEntry)
*/
public InputStream normalizeInputStream(InputStream stream,
IFileEntry fileEntry) throws IOException, CoreException {
IEncryptionData encData = fileEntry.getEncryptionData();
if (encData == null)
return stream;
InputStream in = Crypto.createInputStream(stream, false, encData,
encryptionHandler.retrievePassword());
if (encData.getChecksumType() != null) {
return new ChecksumVerifiedInputStream(in,
encData.getChecksum());
}
return in;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null
|| !(obj instanceof LegacyEncryptionNormalizerAdapter))
return false;
LegacyEncryptionNormalizerAdapter that = (LegacyEncryptionNormalizerAdapter) obj;
return this.encryptionHandler.equals(that.encryptionHandler);
}
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.core.internal.AbstractWorkbookBuilder#doLoadFromInputSource(org
* .xmind.core.io.IInputSource, org.xmind.core.io.IStorage,
* org.xmind.core.IEncryptionHandler)
*/
@Override
protected IWorkbook doLoadFromInputSource(IInputSource source,
IStorage storage, IEncryptionHandler encryptionHandler)
throws IOException, CoreException {
IDeserializer deserializer = Core.getWorkbookBuilder()
.newDeserializer();
deserializer.setCreatorName(getCreatorName());
deserializer.setCreatorVersion(getCreatorVersion());
deserializer.setWorkbookStorage(storage);
deserializer.setEntryStreamNormalizer(
new LegacyEncryptionNormalizerAdapter(encryptionHandler));
deserializer.setInputSource(source);
deserializer.deserialize(null);
return deserializer.getWorkbook();
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.core.internal.AbstractWorkbookBuilder#doLoadFromStream(java.io.
* InputStream, org.xmind.core.io.IStorage,
* org.xmind.core.IEncryptionHandler)
*/
@Override
protected IWorkbook doLoadFromStream(InputStream in, IStorage storage,
IEncryptionHandler encryptionHandler)
throws IOException, CoreException {
IDeserializer deserializer = Core.getWorkbookBuilder()
.newDeserializer();
deserializer.setCreatorName(getCreatorName());
deserializer.setCreatorVersion(getCreatorVersion());
deserializer.setWorkbookStorage(storage);
deserializer.setEntryStreamNormalizer(
new LegacyEncryptionNormalizerAdapter(encryptionHandler));
deserializer.setInputStream(in);
deserializer.deserialize(null);
return deserializer.getWorkbook();
}
@Override
protected IWorkbook doLoadFromStorage(IStorage storage,
IEncryptionHandler encryptionHandler)
throws IOException, CoreException {
IDeserializer deserializer = Core.getWorkbookBuilder()
.newDeserializer();
deserializer.setCreatorName(getCreatorName());
deserializer.setCreatorVersion(getCreatorVersion());
deserializer.setWorkbookStorage(storage);
deserializer.setEntryStreamNormalizer(
new LegacyEncryptionNormalizerAdapter(encryptionHandler));
deserializer.setWorkbookStorageAsInputSource();
deserializer.deserialize(null);
return deserializer.getWorkbook();
}
/**
* @deprecated This method should NOT be called any more.
*/
@Override
@Deprecated
protected void extractFromStream(InputStream input, IOutputTarget target)
throws IOException, CoreException {
ZipInputStream zip = new ZipInputStream(input);
try {
FileUtils.extractZipFile(zip, target);
} finally {
zip.close();
}
}
}