ldn-importer ist jetzt mehrsprachenfähig und einige Formatierungen (und Log-Ausgaben).
git-svn-id: https://svn.libreccm.org/ccm/trunk@584 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
432acb6c36
commit
9f3d3ffc65
|
|
@ -272,6 +272,7 @@ public class ContentBundle extends ContentItem {
|
|||
* @see #addInstance(ContentItem)
|
||||
*/
|
||||
public final ContentItem getPrimaryInstance() {
|
||||
System.out.printf("ContentBundle.getPrimaryInstance() for default lang %s\n", getDefaultLanguage());
|
||||
return getInstance(getDefaultLanguage());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import com.arsdigita.persistence.DataObject;
|
|||
import com.arsdigita.persistence.OID;
|
||||
import com.arsdigita.util.Assert;
|
||||
import java.math.BigDecimal;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
/**
|
||||
* This class provides a base type for building content types which represent
|
||||
|
|
@ -40,6 +41,7 @@ import java.math.BigDecimal;
|
|||
*/
|
||||
public class GenericOrganizationalUnit extends ContentPage {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(GenericOrganizationalUnit.class);
|
||||
//public final static String ORGAUNIT_NAME = "ORGAUNIT_NAME";
|
||||
public final static String ADDENDUM = "addendum";
|
||||
public final static String CONTACTS = "contacts";
|
||||
|
|
@ -88,10 +90,12 @@ public class GenericOrganizationalUnit extends ContentPage {
|
|||
public void addContact(GenericContact contact, String contactType) {
|
||||
Assert.exists(contact, GenericContact.class);
|
||||
|
||||
logger.debug(String.format("Adding contact of type \"%s\"...", contactType));
|
||||
DataObject link = add(CONTACTS, contact);
|
||||
|
||||
link.set(CONTACT_TYPE, contactType);
|
||||
link.set(CONTACT_ORDER, Integer.valueOf((int)getContacts().size()));
|
||||
link.save();
|
||||
}
|
||||
|
||||
public void removeContact(GenericContact contact) {
|
||||
|
|
@ -114,6 +118,7 @@ public class GenericOrganizationalUnit extends ContentPage {
|
|||
DataObject link = add(PERSONS, person);
|
||||
|
||||
link.set(ROLE, role);
|
||||
link.save();
|
||||
}
|
||||
|
||||
public void removePerson(GenericPerson person) {
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ public class GenericOrganizationalUnitContactAddForm extends BasicItemForm {
|
|||
add(new Label(ContenttypesGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.genericorgaunit.contact.type")));
|
||||
ParameterModel contactTypeParam = new StringParameter(
|
||||
GenericOrganizationalUnitContactCollection.CONTACT_TYPE);
|
||||
GenericOrganizationalUnit.CONTACT_TYPE);
|
||||
SingleSelect contactType = new SingleSelect(contactTypeParam);
|
||||
contactType.addValidationListener(new NotNullValidationListener());
|
||||
contactType.addOption(new Option("", new Label((String) ContenttypesGlobalizationUtil.
|
||||
|
|
@ -110,7 +110,7 @@ public class GenericOrganizationalUnitContactAddForm extends BasicItemForm {
|
|||
if (this.getSaveCancelSection().getSaveButton().isSelected(state)) {
|
||||
orgaunit.addContact((GenericContact) data.get(ITEM_SEARCH),
|
||||
(String) data.get(
|
||||
GenericOrganizationalUnitContactCollection.CONTACT_TYPE));
|
||||
GenericOrganizationalUnit.CONTACT_TYPE));
|
||||
}
|
||||
|
||||
//init(fse);
|
||||
|
|
|
|||
|
|
@ -160,9 +160,18 @@ public class GenericOrganizationalUnitContactTable extends Table implements
|
|||
|
||||
public Object getElementAt(int columnIndex) {
|
||||
s_log.debug(String.format("contacttypes.size() = %d",
|
||||
m_contacttypes.size()));
|
||||
m_contacttypes.size()));
|
||||
switch (columnIndex) {
|
||||
case 0:
|
||||
s_log.debug(String.format(
|
||||
"Getting human readable contact type for contact type \"%s\"...",
|
||||
m_contactCollection.getContactType()));
|
||||
s_log.debug(String.format(
|
||||
"Human readable contact type is: \"%s\"...",
|
||||
m_contacttypes.getRelationAttribute(
|
||||
m_contactCollection.getContactType(),
|
||||
DispatcherHelper.getNegotiatedLocale().
|
||||
getLanguage())));
|
||||
return m_contacttypes.getRelationAttribute(
|
||||
m_contactCollection.getContactType(),
|
||||
DispatcherHelper.getNegotiatedLocale().
|
||||
|
|
|
|||
|
|
@ -119,6 +119,8 @@ public class ParserDispatcher extends DefaultHandler {
|
|||
s_log.debug("Processing start element: " +
|
||||
qname + " " + uri + " " + local);
|
||||
}
|
||||
System.out.println("Processing start element: " +
|
||||
qname + " " + uri + " " + local);
|
||||
|
||||
if (m_parsers.containsKey(getKey(local, uri))) {
|
||||
TagParser current = getCurrentParser();
|
||||
|
|
@ -157,6 +159,8 @@ public class ParserDispatcher extends DefaultHandler {
|
|||
s_log.debug("Processing end element: " +
|
||||
qname + " " + uri + " " + local);
|
||||
}
|
||||
System.out.println("Processing end element: " +
|
||||
qname + " " + uri + " " + local);
|
||||
|
||||
getCurrentParser().endElement(local, uri);
|
||||
if (s_log.isDebugEnabled()) {
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@
|
|||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
package com.arsdigita.london.importer.cms;
|
||||
|
||||
import java.io.File;
|
||||
|
|
@ -38,14 +37,33 @@ import com.arsdigita.london.importer.ParserDispatcher;
|
|||
import com.arsdigita.london.util.Transaction;
|
||||
import com.arsdigita.packaging.Program;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Standalone command-line tool which invokes the importer.
|
||||
* It can be invoked by:
|
||||
* </p>
|
||||
* <pre>
|
||||
* ccm-run com.arsdigita.london.importer.cms.ItemImportTool \
|
||||
* master-import.xml /dir/with/files/to/include /dir/containing/lobs content-section-name
|
||||
* </pre>
|
||||
* <p>
|
||||
* <strong>Attention:</strong> The importer was modified to support import of
|
||||
* items with more than one language version. The modifications for this are:
|
||||
* </p>
|
||||
* <ul>
|
||||
* <li>A {@link Map} of the already created {@link ContentBundle}s is kept.</li>
|
||||
* <li>To identify language versions, the imported content items must have a
|
||||
* name of the following pattern: <code>name-language</code>, for example
|
||||
* <code>about-de</code> and <code>about-en</code>.</li>
|
||||
* <li>When the item is added, the importer now checks if there is
|
||||
* already a content bundle for the item. If not a new one is created, if there
|
||||
* is one, the item is added as an instance.</li>
|
||||
* <li>For items with only one language version the importer should work as
|
||||
* before.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @see com.arsdigita.london.importer
|
||||
*/
|
||||
|
|
@ -67,22 +85,24 @@ public class ItemImportTool extends Program {
|
|||
}
|
||||
|
||||
protected void doRun(CommandLine cmdLine) {
|
||||
final String[] args = cmdLine.getArgs();
|
||||
if (args.length != 4) {
|
||||
help(System.err);
|
||||
System.exit(1);
|
||||
}
|
||||
try {
|
||||
final String[] args = cmdLine.getArgs();
|
||||
if (args.length != 4) {
|
||||
help(System.err);
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
final String masterFile = args[0];
|
||||
final File itemDir = new File(args[1]);
|
||||
final File assetDir = new File(args[2]);
|
||||
final ContentSection section = getContentSection(args[3]);
|
||||
final String masterFile = args[0];
|
||||
final File itemDir = new File(args[1]);
|
||||
final File assetDir = new File(args[2]);
|
||||
final ContentSection section = getContentSection(args[3]);
|
||||
|
||||
final DomainObjectMapper mapper = new DomainObjectMapper();
|
||||
final DomainObjectMapper mapper = new DomainObjectMapper();
|
||||
|
||||
final List items = new ArrayList();
|
||||
final List items = new ArrayList();
|
||||
|
||||
Transaction session = new Transaction() {
|
||||
|
||||
Transaction session = new Transaction() {
|
||||
public void doRun() {
|
||||
ParserDispatcher parser = new ParserDispatcher();
|
||||
parser.addParser(new ImportParser(mapper));
|
||||
|
|
@ -91,24 +111,34 @@ public class ItemImportTool extends Program {
|
|||
parser.execute(masterFile);
|
||||
}
|
||||
};
|
||||
session.run();
|
||||
session.run();
|
||||
|
||||
Iterator lazyItems = items.iterator();
|
||||
while (lazyItems.hasNext()) {
|
||||
Object[] entry = (Object[])lazyItems.next();
|
||||
final Folder folder = (Folder)entry[0];
|
||||
final String file = (String)entry[1];
|
||||
Iterator lazyItems = items.iterator();
|
||||
/*
|
||||
* Extension to support import of items in more than one language
|
||||
* Jens Pelzetter 2010-10-21
|
||||
*/
|
||||
final Map<String, ContentBundle> bundles;
|
||||
bundles = new HashMap<String, ContentBundle>();
|
||||
/*
|
||||
* Extension end
|
||||
*/
|
||||
while (lazyItems.hasNext()) {
|
||||
Object[] entry = (Object[]) lazyItems.next();
|
||||
final Folder folder = (Folder) entry[0];
|
||||
final String file = (String) entry[1];
|
||||
|
||||
Transaction itemTransaction = new Transaction() {
|
||||
|
||||
Transaction itemTransaction = new Transaction() {
|
||||
public void doRun() {
|
||||
ItemParser itemParser =
|
||||
new ItemParser(assetDir, mapper);
|
||||
new ItemParser(assetDir, mapper);
|
||||
|
||||
File itemFile = new File(itemDir, file);
|
||||
|
||||
if (s_log.isInfoEnabled()) {
|
||||
s_log.info("Loading " + file +
|
||||
" into " + folder.getPath());
|
||||
s_log.info("Loading " + file + " into "
|
||||
+ folder.getPath());
|
||||
}
|
||||
|
||||
ParserDispatcher parser = new ParserDispatcher();
|
||||
|
|
@ -117,10 +147,25 @@ public class ItemImportTool extends Program {
|
|||
parser.execute(itemFile.getCanonicalPath());
|
||||
} catch (IOException ex) {
|
||||
throw new UncheckedWrapperException(
|
||||
"cannot process file" + file, ex);
|
||||
"cannot process file" + file, ex);
|
||||
}
|
||||
|
||||
ContentItem item = (ContentItem)itemParser.getDomainObject();
|
||||
ContentItem item =
|
||||
(ContentItem) itemParser.getDomainObject();
|
||||
/*
|
||||
* Multi lang extension begin
|
||||
*/
|
||||
String itemName = item.getName();
|
||||
String bundleName;
|
||||
if (itemName.lastIndexOf('-') == -1) {
|
||||
bundleName = itemName;
|
||||
} else {
|
||||
bundleName = itemName.substring(0, itemName.
|
||||
lastIndexOf('-'));
|
||||
}
|
||||
/*
|
||||
* Multi lang extension end
|
||||
*/
|
||||
// returning the null item indicates an item that
|
||||
// has already been imported
|
||||
if (s_log.isDebugEnabled()) {
|
||||
|
|
@ -128,20 +173,50 @@ public class ItemImportTool extends Program {
|
|||
}
|
||||
if (item != null) {
|
||||
// We have to place this item into language bundle
|
||||
ContentBundle bundle = new ContentBundle(item);
|
||||
bundle.setParent(folder);
|
||||
/*
|
||||
* Multi lang extension start
|
||||
*/
|
||||
ContentBundle bundle;
|
||||
if (itemName.lastIndexOf('-') == -1) {
|
||||
bundle = new ContentBundle(item);
|
||||
bundle.setParent(folder);
|
||||
bundle.setName(bundleName);
|
||||
bundles.put(bundleName, bundle);
|
||||
} else {
|
||||
bundle = bundles.get(bundleName);
|
||||
if (bundle == null) {
|
||||
bundle = new ContentBundle(item);
|
||||
bundle.setParent(folder);
|
||||
bundle.setName(bundleName);
|
||||
bundles.put(bundleName, bundle);
|
||||
} else {
|
||||
bundle.addInstance(item);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Extension end
|
||||
*/
|
||||
System.out.println("Set bundle " + bundle);
|
||||
if (s_log.isDebugEnabled()) {
|
||||
s_log.error("Set bundle " + bundle);
|
||||
s_log.debug("Set bundle " + bundle);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
itemTransaction.run();
|
||||
itemTransaction.run();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static final void main(String[] args) {
|
||||
new ItemImportTool().run(args);
|
||||
try {
|
||||
new ItemImportTool().run(args);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -161,11 +236,12 @@ public class ItemImportTool extends Program {
|
|||
path.append("/");
|
||||
}
|
||||
|
||||
final ContentSection section = (ContentSection)ContentSection
|
||||
.retrieveApplicationForPath(path.toString());
|
||||
final ContentSection section = (ContentSection) ContentSection.
|
||||
retrieveApplicationForPath(path.toString());
|
||||
|
||||
if (section == null) {
|
||||
throw new DataObjectNotFoundException("Content section not found with path " + path);
|
||||
throw new DataObjectNotFoundException("Content section not found with path "
|
||||
+ path);
|
||||
}
|
||||
return section;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import com.arsdigita.london.importer.DomainObjectMapper;
|
|||
|
||||
import com.arsdigita.cms.BinaryAsset;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.ContentBundle;
|
||||
import com.arsdigita.cms.ContentItem;
|
||||
import com.arsdigita.cms.ContentType;
|
||||
import com.arsdigita.domain.DomainObject;
|
||||
|
|
@ -46,71 +47,58 @@ import sun.misc.BASE64Decoder;
|
|||
* @see com.arsdigita.london.importer
|
||||
*/
|
||||
public class ItemParser extends DomainObjectParser {
|
||||
|
||||
private static Logger s_log =
|
||||
Logger.getLogger(ItemParser.class);
|
||||
|
||||
|
||||
public static final String DEFAULT_DOMAIN_CLASS = "defaultDomainClass";
|
||||
public static final String ID = "id";
|
||||
public static final String IS_DELETED = "isDeleted";
|
||||
public static final String VERSION = "version";
|
||||
public static final String ANCESTORS = "ancestors";
|
||||
public static final String NAME = "name";
|
||||
public static final String OID_ATTR = "oid";
|
||||
public static final String IMAGE_ID = "imageId";
|
||||
public static final String ARTICLE_ID = "articleId";
|
||||
public static final String DEFAULT_ANCESTORS = "defaultAncestors";
|
||||
public static final String DISPLAY_NAME = "displayName";
|
||||
public static final String FILE = "file";
|
||||
|
||||
public static final String ENCODING_ATTR = "encoding";
|
||||
public static final String ENCODING_BASE64 = "base64";
|
||||
public static final String INDEX_ITEM_ATTR = "indexItem";
|
||||
public static final String RELABEL_FOLDER_ATTR = "relabelFolder";
|
||||
Logger.getLogger(ItemParser.class);
|
||||
public static final String DEFAULT_DOMAIN_CLASS = "defaultDomainClass";
|
||||
public static final String ID = "id";
|
||||
public static final String IS_DELETED = "isDeleted";
|
||||
public static final String VERSION = "version";
|
||||
public static final String ANCESTORS = "ancestors";
|
||||
public static final String NAME = "name";
|
||||
public static final String OID_ATTR = "oid";
|
||||
public static final String IMAGE_ID = "imageId";
|
||||
public static final String ARTICLE_ID = "articleId";
|
||||
public static final String DEFAULT_ANCESTORS = "defaultAncestors";
|
||||
public static final String DISPLAY_NAME = "displayName";
|
||||
public static final String FILE = "file";
|
||||
public static final String ENCODING_ATTR = "encoding";
|
||||
public static final String ENCODING_BASE64 = "base64";
|
||||
public static final String INDEX_ITEM_ATTR = "indexItem";
|
||||
public static final String RELABEL_FOLDER_ATTR = "relabelFolder";
|
||||
// Contains email of the author. If present, a worfklow is started
|
||||
// for the imported item on behalf of that user. CCM user is created
|
||||
// if not found in database.
|
||||
public static final String AUTHOR_ATTR = "author";
|
||||
public static final String END_OF_LIFE_ATTR = "eol";
|
||||
|
||||
public static final String AUTHOR_ATTR = "author";
|
||||
public static final String END_OF_LIFE_ATTR = "eol";
|
||||
/**
|
||||
* Object types holding the "global" OIDs, i.e. those which don't
|
||||
* change from one CCM instance to another. Importer will not try
|
||||
* to create any of those.
|
||||
*/
|
||||
static final String[] GLOBAL_OID_TYPES = new String[] {
|
||||
static final String[] GLOBAL_OID_TYPES = new String[]{
|
||||
"com.arsdigita.cms.MimeType",
|
||||
"com.arsdigita.cms.contenttypes.IsoCountry"
|
||||
};
|
||||
|
||||
|
||||
|
||||
};
|
||||
// Some sequence of charactes that cannot be part of property name
|
||||
private static final String PLAIN_ATTRIBUTE = ":..just the plain attribute!..:";
|
||||
private static final String DO_NOT_SAVE = ":..please persistence don't save!..:";
|
||||
private static final String PLAIN_ATTRIBUTE =
|
||||
":..just the plain attribute!..:";
|
||||
private static final String DO_NOT_SAVE =
|
||||
":..please persistence don't save!..:";
|
||||
private static final String COUNT_SUFFIX = "////";
|
||||
|
||||
// As we're traversing the XML tree, we keep the stack of parsed objects here
|
||||
private Stack m_objectStack;
|
||||
// And we keep track of attributes here - you never know when you gonna need then
|
||||
private Stack m_attributeStack;
|
||||
|
||||
private Map m_currentDataObject;
|
||||
|
||||
private int m_recursionLevel;
|
||||
|
||||
private boolean m_write;
|
||||
|
||||
private static List s_ignoredProps;
|
||||
|
||||
// <launchDate>Wed Nov 12 00:00:00 CET 2003</launchDate>
|
||||
private static SimpleDateFormat s_formatter
|
||||
= new SimpleDateFormat ("EEE MMM dd HH:mm:ss zzz yyyy");
|
||||
|
||||
private static SimpleDateFormat s_formatter = new SimpleDateFormat(
|
||||
"EEE MMM dd HH:mm:ss zzz yyyy");
|
||||
private static byte[] s_byteArray = new byte[0];
|
||||
|
||||
private boolean m_begin;
|
||||
|
||||
private boolean m_isIndexItem;
|
||||
private boolean m_relabelFolder;
|
||||
private String m_author;
|
||||
|
|
@ -130,7 +118,8 @@ public class ItemParser extends DomainObjectParser {
|
|||
}
|
||||
|
||||
public ItemParser(File lobDir, DomainObjectMapper mapper) {
|
||||
this("item", CMS.CMS_XML_NS, ContentItem.BASE_DATA_OBJECT_TYPE, lobDir, mapper);
|
||||
this("item", CMS.CMS_XML_NS, ContentItem.BASE_DATA_OBJECT_TYPE, lobDir,
|
||||
mapper);
|
||||
}
|
||||
|
||||
public ItemParser(String tagName,
|
||||
|
|
@ -146,11 +135,13 @@ public class ItemParser extends DomainObjectParser {
|
|||
m_write = true;
|
||||
}
|
||||
|
||||
|
||||
protected ContentItem importItem() {
|
||||
debugLog("Ending content item, write: " + m_write);
|
||||
if (m_write) {
|
||||
debugLog("--------------- About to persist ContentItem -------------------");
|
||||
debugLog(
|
||||
"--------------- About to persist ContentItem -------------------");
|
||||
System.out.println(
|
||||
"--------------- About to persist ContentItem -------------------");
|
||||
return persistContentItem(m_currentDataObject);
|
||||
}
|
||||
return null;
|
||||
|
|
@ -175,14 +166,17 @@ public class ItemParser extends DomainObjectParser {
|
|||
return;
|
||||
}
|
||||
Assert.exists(m_currentDataObject, DataObject.class);
|
||||
OID currentOID = (OID)m_currentDataObject.get(OID_ATTR);
|
||||
OID currentOID = (OID) m_currentDataObject.get(OID_ATTR);
|
||||
ObjectType ot = currentOID.getObjectType();
|
||||
if (ot == null) {
|
||||
throw new UncheckedWrapperException("no object type " + currentOID);
|
||||
throw new UncheckedWrapperException("no object type "
|
||||
+ currentOID);
|
||||
}
|
||||
Property prop = ot.getProperty(name);
|
||||
if (prop == null) {
|
||||
throw new UncheckedWrapperException("no property " + name + " for " + ot.getQualifiedName());
|
||||
throw new UncheckedWrapperException("no property " + name
|
||||
+ " for " + ot.
|
||||
getQualifiedName());
|
||||
}
|
||||
if (prop.isAttribute()) {
|
||||
beginAttribute(m_currentDataObject, prop);
|
||||
|
|
@ -226,7 +220,6 @@ public class ItemParser extends DomainObjectParser {
|
|||
m_currentDataObject = getDataObject(oid);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called whenever a start of block which represents the role
|
||||
* is encountered.
|
||||
|
|
@ -244,7 +237,6 @@ public class ItemParser extends DomainObjectParser {
|
|||
m_currentDataObject = getDataObject(oid);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called whenever CMS content item block is started with
|
||||
* <cms:item> element.
|
||||
|
|
@ -265,13 +257,14 @@ public class ItemParser extends DomainObjectParser {
|
|||
m_relabelFolder = "true".equals(atts.getValue(RELABEL_FOLDER_ATTR));
|
||||
m_author = atts.getValue(AUTHOR_ATTR);
|
||||
String eol = atts.getValue(END_OF_LIFE_ATTR);
|
||||
if (eol != null && eol.trim().length() > 0) {
|
||||
if (eol != null && eol.trim().length() > 0) {
|
||||
ParsePosition pos = new ParsePosition(0);
|
||||
m_archiveDate = s_formatter.parse(eol.trim(), pos);
|
||||
}
|
||||
m_objectStack.push(m_currentDataObject);
|
||||
}
|
||||
debugLog("Start of content item " + oid + " encountered, write=" + m_write);
|
||||
debugLog("Start of content item " + oid + " encountered, write="
|
||||
+ m_write);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -285,7 +278,6 @@ public class ItemParser extends DomainObjectParser {
|
|||
m_objectStack.push(PLAIN_ATTRIBUTE);
|
||||
}
|
||||
|
||||
|
||||
protected void endTag(String name,
|
||||
String uri) {
|
||||
if (getTagName().equals(name)) {
|
||||
|
|
@ -296,12 +288,14 @@ public class ItemParser extends DomainObjectParser {
|
|||
// Ignore everything if DB writing is disabled
|
||||
if (m_write) {
|
||||
if (PLAIN_ATTRIBUTE.equals(m_objectStack.peek())) {
|
||||
Property prop = ((OID) m_currentDataObject.get(OID_ATTR)).getObjectType().getProperty(name);
|
||||
Property prop = ((OID) m_currentDataObject.get(OID_ATTR)).
|
||||
getObjectType().getProperty(name);
|
||||
endAttribute(m_currentDataObject, prop, getTagBody());
|
||||
} else {
|
||||
// The current attribute is either role or association (collection)
|
||||
Map parentObject = (Map) m_objectStack.peek();
|
||||
Property prop = ((OID) parentObject.get(OID_ATTR)).getObjectType().getProperty(name);
|
||||
Property prop = ((OID) parentObject.get(OID_ATTR)).getObjectType().
|
||||
getProperty(name);
|
||||
if (prop.isCollection()) {
|
||||
endAssociation(parentObject, m_currentDataObject, prop);
|
||||
} else if (prop.isRole()) {
|
||||
|
|
@ -316,7 +310,6 @@ public class ItemParser extends DomainObjectParser {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return true if newly imported item is index item.
|
||||
*/
|
||||
|
|
@ -328,7 +321,7 @@ public class ItemParser extends DomainObjectParser {
|
|||
* @return true if item is index item and its title should propagate to folder
|
||||
*/
|
||||
public boolean relabelFolder() {
|
||||
return m_isIndexItem && m_relabelFolder;
|
||||
return m_isIndexItem && m_relabelFolder;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -342,27 +335,27 @@ public class ItemParser extends DomainObjectParser {
|
|||
* @return the end of lifecycle date, might be null
|
||||
*/
|
||||
public Date getArchiveDate() {
|
||||
return (Date)m_archiveDate.clone();
|
||||
return (Date) m_archiveDate.clone();
|
||||
}
|
||||
|
||||
|
||||
private ContentItem persistContentItem(Map itemMap) {
|
||||
OID srcOid = (OID) itemMap.get(OID_ATTR);
|
||||
String type = srcOid.getObjectType().getQualifiedName();
|
||||
DataObject itemDataObject = SessionManager.getSession().create(type);
|
||||
ContentItem item = (ContentItem) createACSObject(itemDataObject, itemMap);
|
||||
if (item != null &&
|
||||
item.getLanguage() == null) {
|
||||
ContentItem item =
|
||||
(ContentItem) createACSObject(itemDataObject, itemMap);
|
||||
if (item != null && item.getLanguage() == null) {
|
||||
item.setLanguage("en");
|
||||
}
|
||||
|
||||
getObjectMapper().setObject(srcOid, item);
|
||||
|
||||
setAllProperties(item, itemDataObject, itemMap, 0);
|
||||
|
||||
s_log.info("Created item " + item.getOID() + " from " + srcOid);
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called whenever a plain attribute (neither association nor role) element is ended.
|
||||
*
|
||||
|
|
@ -417,25 +410,25 @@ public class ItemParser extends DomainObjectParser {
|
|||
String propName = property.getName();
|
||||
debugLog("Ending role: " + propName + ": " + childObject);
|
||||
// don't set ContentType
|
||||
if (!((OID) childObject.get(OID_ATTR)).getObjectType().getQualifiedName().equals(ContentType.BASE_DATA_OBJECT_TYPE)) {
|
||||
if (!((OID) childObject.get(OID_ATTR)).getObjectType().getQualifiedName().
|
||||
equals(ContentType.BASE_DATA_OBJECT_TYPE)) {
|
||||
parentObject.put(propName + COUNT_SUFFIX + "1", childObject);
|
||||
}
|
||||
m_currentDataObject = parentObject;
|
||||
m_objectStack.pop();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Process the item recursively until we get all attributes set.
|
||||
*/
|
||||
private void setAllProperties(ACSObject acs, DataObject dataObject, Map objectMap, int recursionLevel) {
|
||||
private void setAllProperties(ACSObject acs, DataObject dataObject,
|
||||
Map objectMap, int recursionLevel) {
|
||||
|
||||
m_recursionLevel = recursionLevel;
|
||||
debugLog("setAll on " + dataObject.getOID() + ": " + objectMap);
|
||||
|
||||
// Loop over all properties recorded in Map and set them appropriately
|
||||
for (Iterator it=objectMap.keySet().iterator(); it.hasNext(); ) {
|
||||
for (Iterator it = objectMap.keySet().iterator(); it.hasNext();) {
|
||||
|
||||
String key = (String) it.next();
|
||||
if (s_ignoredProps.contains(key)) {
|
||||
|
|
@ -449,7 +442,7 @@ public class ItemParser extends DomainObjectParser {
|
|||
// of how many objects that association holds. For this purpose, just
|
||||
// ignore the property with simple count
|
||||
int pos = key.indexOf(COUNT_SUFFIX);
|
||||
if (pos > -1 && key.length() > pos + COUNT_SUFFIX.length()) {
|
||||
if (pos > -1 && key.length() > pos + COUNT_SUFFIX.length()) {
|
||||
String propName = key.substring(0, pos);
|
||||
debugLog("Compound property: " + propName);
|
||||
// We're in role/association, get the child object
|
||||
|
|
@ -473,13 +466,15 @@ public class ItemParser extends DomainObjectParser {
|
|||
}
|
||||
Property prop = dataObject.getObjectType().getProperty(propName);
|
||||
if (prop.isCollection()) {
|
||||
DataAssociation assoc = (DataAssociation) dataObject.get(propName);
|
||||
DataAssociation assoc = (DataAssociation) dataObject.get(
|
||||
propName);
|
||||
assoc.add(childObject);
|
||||
} else {
|
||||
dataObject.set(propName, childObject);
|
||||
}
|
||||
if (recurse) {
|
||||
setAllProperties(childAcs, childObject, childObjectMap, recursionLevel+1);
|
||||
setAllProperties(childAcs, childObject, childObjectMap, recursionLevel
|
||||
+ 1);
|
||||
m_recursionLevel = recursionLevel;
|
||||
}
|
||||
} else if (pos == -1) { // We're dealing with simple property
|
||||
|
|
@ -490,7 +485,6 @@ public class ItemParser extends DomainObjectParser {
|
|||
finalizeACSObject(acs, dataObject, objectMap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This methods guesses required properties not present in the import file.
|
||||
*/
|
||||
|
|
@ -498,7 +492,7 @@ public class ItemParser extends DomainObjectParser {
|
|||
|
||||
debugLog("finalizing ACS: " + acs.getClass() + ": " + acs);
|
||||
if (acs instanceof BinaryAsset
|
||||
&& dobj.get(BinaryAsset.MIME_TYPE) == null) {
|
||||
&& dobj.get(BinaryAsset.MIME_TYPE) == null) {
|
||||
// First get default
|
||||
String mimeString = "application/octet-stream";
|
||||
String filename = (String) dobj.get(NAME);
|
||||
|
|
@ -514,19 +508,20 @@ public class ItemParser extends DomainObjectParser {
|
|||
OID mimeOid = new OID(MimeType.BASE_DATA_OBJECT_TYPE);
|
||||
mimeOid.set(MimeType.MIME_TYPE, mimeString);
|
||||
DataObject mimeObj = SessionManager.getSession().retrieve(mimeOid);
|
||||
debugLog("Guessing mimetype from filename: " + filename + ", mime=" + mimeOid);
|
||||
debugLog("Guessing mimetype from filename: " + filename + ", mime="
|
||||
+ mimeOid);
|
||||
dobj.set(BinaryAsset.MIME_TYPE, mimeObj);
|
||||
}
|
||||
if (dobj.getObjectType().getProperty(DISPLAY_NAME) != null
|
||||
&& dobj.get(DISPLAY_NAME) == null) {
|
||||
&& dobj.get(DISPLAY_NAME) == null) {
|
||||
dobj.set(DISPLAY_NAME, dobj.getObjectType().getQualifiedName()
|
||||
+ " " + dobj.getOID().get("id").toString());
|
||||
+ " " + dobj.getOID().get("id").toString());
|
||||
debugLog("finalizing DISPLAY_NAME: " + dobj.get(DISPLAY_NAME));
|
||||
}
|
||||
if (dobj.getObjectType().getProperty(NAME) != null
|
||||
&& dobj.get(NAME) == null) {
|
||||
&& dobj.get(NAME) == null) {
|
||||
dobj.set(NAME, dobj.getObjectType().getName()
|
||||
+ "-" + dobj.getOID().get("id").toString());
|
||||
+ "-" + dobj.getOID().get("id").toString());
|
||||
debugLog("finalizing NAME: " + dobj.get(NAME));
|
||||
}
|
||||
}
|
||||
|
|
@ -579,7 +574,6 @@ public class ItemParser extends DomainObjectParser {
|
|||
return newDataObject;
|
||||
}
|
||||
|
||||
|
||||
private ACSObject createACSObject(DataObject dobj, Map properties) {
|
||||
String domainClass = (String) properties.get(DEFAULT_DOMAIN_CLASS);
|
||||
if (domainClass == null) {
|
||||
|
|
@ -589,8 +583,10 @@ public class ItemParser extends DomainObjectParser {
|
|||
debugLog("Creating " + domainClass + " ...");
|
||||
try {
|
||||
Class classDef = Class.forName(domainClass);
|
||||
Constructor constructor = classDef.getConstructor(new Class[] {DataObject.class});
|
||||
ACSObject object = (ACSObject) constructor.newInstance(new Object[] {dobj});
|
||||
Constructor constructor = classDef.getConstructor(new Class[]{
|
||||
DataObject.class});
|
||||
ACSObject object = (ACSObject) constructor.newInstance(new Object[]{
|
||||
dobj});
|
||||
debugLog("Successfully created " + object.getOID());
|
||||
return object;
|
||||
} catch (InvocationTargetException e) {
|
||||
|
|
@ -601,14 +597,11 @@ public class ItemParser extends DomainObjectParser {
|
|||
throw new UncheckedWrapperException(e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new UncheckedWrapperException(e);
|
||||
} catch (Exception e ) {
|
||||
} catch (Exception e) {
|
||||
throw new UncheckedWrapperException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void setProperty(Map dobj, Property prop, String value) {
|
||||
String key = prop.getName();
|
||||
Class propertyClass = prop.getJavaClass();
|
||||
|
|
@ -633,12 +626,12 @@ public class ItemParser extends DomainObjectParser {
|
|||
// not already been imported. For others, we should never
|
||||
// be at this point anyway!
|
||||
OID srcOid = (OID) dobj.get(OID_ATTR);
|
||||
String filename = srcOid.get("id").toString() + "-" + key + ".raw";
|
||||
String filename = srcOid.get("id").toString() + "-" + key + ".raw";
|
||||
// Override filename generation pattern if filename is
|
||||
// explicitly provided as attr of <content> element.
|
||||
Map atts = (Map) m_attributeStack.peek();
|
||||
if (atts != null && atts.get(FILE) != null) {
|
||||
filename = (String)atts.get(FILE);
|
||||
if (atts != null && atts.get(FILE) != null) {
|
||||
filename = (String) atts.get(FILE);
|
||||
// We will also use this attribute to populate "name" property
|
||||
// (needed for mime-type guessing if none explicitly provided),
|
||||
// but only if such has not been set so far. If this property
|
||||
|
|
@ -648,7 +641,7 @@ public class ItemParser extends DomainObjectParser {
|
|||
dobj.put(NAME, filename);
|
||||
}
|
||||
}
|
||||
if (atts != null && atts.get(ENCODING_ATTR) != null) {
|
||||
if (atts != null && atts.get(ENCODING_ATTR) != null) {
|
||||
String encoding = (String) atts.get(ENCODING_ATTR);
|
||||
if (ENCODING_BASE64.equals(encoding)) {
|
||||
BASE64Decoder decoder = new BASE64Decoder();
|
||||
|
|
@ -656,7 +649,7 @@ public class ItemParser extends DomainObjectParser {
|
|||
byte[] content = decoder.decodeBuffer(value);
|
||||
dobj.put(key, content);
|
||||
debugLog("Successfully loaded base64 encoded BLOB"
|
||||
+ ", length: " + content.length + " bytes");
|
||||
+ ", length: " + content.length + " bytes");
|
||||
return;
|
||||
} catch (IOException ioe) {
|
||||
throw new UncheckedWrapperException(ioe);
|
||||
|
|
@ -685,7 +678,7 @@ public class ItemParser extends DomainObjectParser {
|
|||
byte[] content = os.toByteArray();
|
||||
dobj.put(key, content);
|
||||
debugLog("Successfully loaded file " + lobFile
|
||||
+ ", length: " + content.length + " bytes");
|
||||
+ ", length: " + content.length + " bytes");
|
||||
} catch (FileNotFoundException e) {
|
||||
s_log.error("Lob file: " + lobFile + " does not exist!", e);
|
||||
} finally {
|
||||
|
|
@ -696,12 +689,11 @@ public class ItemParser extends DomainObjectParser {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
s_log.warn("Don't know how to handle property " +
|
||||
key + ", type: " + propertyClass.getName());
|
||||
s_log.warn("Don't know how to handle property " + key + ", type: " + propertyClass.
|
||||
getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void debugLog(String logString) {
|
||||
s_log.debug(getPadding() + logString);
|
||||
}
|
||||
|
|
@ -724,15 +716,12 @@ public class ItemParser extends DomainObjectParser {
|
|||
return padding.toString();
|
||||
}
|
||||
|
||||
|
||||
protected Map copyAttributes(Attributes atts) {
|
||||
Map map = new HashMap();
|
||||
|
||||
for (int i = 0 ; i < atts.getLength() ; i++) {
|
||||
for (int i = 0; i < atts.getLength(); i++) {
|
||||
map.put(atts.getQName(i), atts.getValue(i));
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue