blob: b06b45016c98e1327354c25b90ec718be9476656 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Daniel Wiehl (BSI Business Systems Integration AG) - initial API and implementation
******************************************************************************/
/**
*
*/
package org.eclipse.scout.sdk.ws.jaxws.resource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.scout.commons.xmlparser.ScoutXmlDocument;
import org.eclipse.scout.commons.xmlparser.ScoutXmlParser;
import org.eclipse.scout.sdk.jobs.OperationJob;
import org.eclipse.scout.sdk.operation.IOperation;
import org.eclipse.scout.sdk.util.log.ScoutStatus;
import org.eclipse.scout.sdk.util.typecache.IWorkingCopyManager;
import org.eclipse.scout.sdk.workspace.IScoutBundle;
import org.eclipse.scout.sdk.ws.jaxws.JaxWsSdk;
import org.eclipse.scout.sdk.ws.jaxws.util.JaxWsSdkUtility;
public class XmlResource extends ManagedResource {
private ScoutXmlDocument m_xmlDocument;
public XmlResource(IScoutBundle bundle) {
super(bundle.getProject());
}
public ScoutXmlDocument loadXml() {
synchronized (m_fileLock) {
if (!existsFile()) {
m_xmlDocument = null;
return null;
}
if (m_xmlDocument == null || m_file.getModificationStamp() != m_modificationStamp) {
m_xmlDocument = null;
m_modificationStamp = m_file.getModificationStamp();
ScoutXmlParser parser = new ScoutXmlParser();
parser.setXmlEncoding("UTF-8");
try {
m_xmlDocument = parser.parse(m_file.getLocation().toFile());
}
catch (Exception e) {
JaxWsSdk.logWarning("Failed to parse XML file '" + m_file.getName() + "'.", e);
}
}
}
return m_xmlDocument;
}
public void storeXmlAsync(final ScoutXmlDocument xmlDocument, final int notificationEvent, final String... notificationElements) {
IOperation op = new IOperation() {
@Override
public void validate() throws IllegalArgumentException {
}
@Override
public String getOperationName() {
return "Store resource to disk";
}
@Override
public void run(IProgressMonitor monitor, IWorkingCopyManager workingCopyManager) throws CoreException, IllegalArgumentException {
storeXml(xmlDocument, notificationEvent, monitor, notificationElements);
}
};
new OperationJob(op).schedule();
}
public void storeXml(ScoutXmlDocument xmlDocument, int notificationEvent, IProgressMonitor monitor, String... notificationElements) throws CoreException {
try {
synchronized (m_fileLock) {
if (m_file == null) {
throw new CoreException(new ScoutStatus("File must not be null"));
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
xmlDocument.write(os);
m_modificationStamp = ManagedResource.API_MODIFICATION_STAMP;
try {
JaxWsSdkUtility.prepareFileAccess(m_file, true);
m_file.setContents(new ByteArrayInputStream(os.toByteArray()), true, true, monitor);
m_xmlDocument = xmlDocument;
}
finally {
m_modificationStamp = m_file.getModificationStamp();
}
}
for (String notificationElement : notificationElements) {
notifyResourceListeners(notificationElement, notificationEvent);
}
}
catch (Exception e) {
throw new CoreException(new ScoutStatus(IStatus.ERROR, "Failed to persist XML file.", e));
}
}
}