/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.impl.xml.importing;
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.dataflow.ItemDataKeeper;
import org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
import org.exoplatform.services.security.ConversationState;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import java.util.HashMap;
import java.util.Map;
import javax.jcr.NamespaceRegistry;
import javax.jcr.RepositoryException;
/**
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
* @version $Id: ContentHandlerImporter.java 14100 2008-05-12 10:53:47Z gazarenkov $
*/
public class ContentHandlerImporter implements ContentHandler, ErrorHandler, RawDataImporter
{
private final ContentImporter importer;
private final ItemDataKeeper dataKeeper;
public ContentHandlerImporter(NodeData parent, int uuidBehavior, ItemDataKeeper dataKeeper,
ItemDataConsumer dataConsumer, NodeTypeDataManager ntManager, LocationFactory locationFactory,
ValueFactoryImpl valueFactory, NamespaceRegistry namespaceRegistry, AccessManager accessManager,
ConversationState userState, Map<String, Object> context, RepositoryImpl repository, String currentWorkspaceName)
{
this.dataKeeper = dataKeeper;
this.importer =
createContentImporter(parent, uuidBehavior, dataConsumer, ntManager, locationFactory, valueFactory,
namespaceRegistry, accessManager, userState, context, repository, currentWorkspaceName);
}
/*
* (non-Javadoc)
* @see org.xml.sax.ContentHandler#characters(char[], int, int)
*/
public void characters(char ch[], int start, int length) throws SAXException
{
try
{
importer.characters(ch, start, length);
}
catch (RepositoryException e)
{
throw new SAXException(e);
}
}
/**
* Create ContentImporter.
*
* @param parent
* @param uuidBehavior
* @param dataConsumer
* @param ntManager
* @param locationFactory
* @param valueFactory
* @param namespaceRegistry
* @param accessManager
* @param userState
* @param context
* @param repository
* @param currentWorkspaceName
* @return
*/
public ContentImporter createContentImporter(NodeData parent, int uuidBehavior, ItemDataConsumer dataConsumer,
NodeTypeDataManager ntManager, LocationFactory locationFactory, ValueFactoryImpl valueFactory,
NamespaceRegistry namespaceRegistry, AccessManager accessManager, ConversationState userState,
Map<String, Object> context, RepositoryImpl repository, String currentWorkspaceName)
{
return new NeutralImporter(parent, parent.getQPath(), uuidBehavior, dataConsumer, ntManager, locationFactory,
valueFactory, namespaceRegistry, accessManager, userState, context, repository, currentWorkspaceName);
}
/**
* {@inheritDoc}
*/
public void endDocument() throws SAXException
{
try
{
dataKeeper.save(importer.getChanges());
}
catch (RepositoryException e)
{
// e.printStackTrace();
throw new SAXException(e);
}
catch (IllegalStateException e)
{
throw new SAXException(e);
}
}
/**
* {@inheritDoc}
*/
public void endElement(String uri, String localName, String qName) throws SAXException
{
try
{
importer.endElement(uri, localName, qName);
}
catch (RepositoryException e)
{
throw new SAXException(e);
}
}
/**
* {@inheritDoc}
*/
public void endPrefixMapping(String arg0) throws SAXException
{
}
/**
* {@inheritDoc}
*/
public void error(SAXParseException exception) throws SAXException
{
}
/**
* {@inheritDoc}
*/
public void fatalError(SAXParseException exception) throws SAXException
{
}
/**
* {@inheritDoc}
*/
public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException
{
}
/**
* {@inheritDoc}
*/
public void processingInstruction(String arg0, String arg1) throws SAXException
{
}
/**
* {@inheritDoc}
*/
public void setDocumentLocator(Locator arg0)
{
}
/**
* {@inheritDoc}
*/
public void skippedEntity(String arg0) throws SAXException
{
}
/**
* {@inheritDoc}
*/
public void startDocument() throws SAXException
{
}
/**
* {@inheritDoc}
*/
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException
{
try
{
// /!!!!
Map<String, String> attribute = new HashMap<String, String>();
for (int i = 0; i < atts.getLength(); i++)
{
attribute.put(atts.getQName(i), atts.getValue(i));
}
importer.startElement(uri, localName, qName, attribute);
}
catch (RepositoryException e)
{
// e.printStackTrace();
throw new SAXException(e);
}
}
/**
* {@inheritDoc}
*/
public void startPrefixMapping(String prefix, String uri) throws SAXException
{
importer.registerNamespace(prefix, uri);
}
/**
* {@inheritDoc}
*/
public void warning(SAXParseException exception) throws SAXException
{
}
}