/** * */ package org.openntf.domino.schema.impl; import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import org.openntf.domino.Database; import org.openntf.domino.Document; import org.openntf.domino.Item; import org.openntf.domino.annotations.Incomplete; import org.openntf.domino.schema.IDatabaseSchema; import org.openntf.domino.schema.IDominoType; import org.openntf.domino.schema.IItemDefinition; import org.openntf.domino.utils.DominoUtils; /** * @author nfreeman * */ @Incomplete public class DatabaseSchema implements IDatabaseSchema, Externalizable { @SuppressWarnings("unused") private static final Logger log_ = Logger.getLogger(DatabaseSchema.class.getName()); private static final long serialVersionUID = 1L; public static enum Flags { SUMMARY, READERS, AUTHORS, PROTECTED, SIGNED, ENCRYPTED } private final Map<String, DocumentDefinition> documentDefinitions_ = new ConcurrentHashMap<String, DocumentDefinition>(); private final Map<String, ItemDefinition> itemDefinitions_ = new ConcurrentHashMap<String, ItemDefinition>(); private transient Map<Class<? extends IDominoType>, IDominoType> typeDefinitions_; /** * */ public DatabaseSchema() { } @Override public Map<String, DocumentDefinition> getDocumentDefinitions() { return documentDefinitions_; } // public void setDocumentDefinitions(final Map<String, DocumentDefinition> definitions) { // documentDefinitions_ = definitions; // } @Override public Map<String, ItemDefinition> getItemDefinitions() { return itemDefinitions_; } // public void setItemDefinitions(final Map<String, ItemDefinition> definitions) { // itemDefinitions_ = definitions; // } @Override public Map<Class<? extends IDominoType>, IDominoType> getTypeDefinitions() { if (typeDefinitions_ == null) { typeDefinitions_ = new HashMap<Class<? extends IDominoType>, IDominoType>(); } return typeDefinitions_; } // public void setTypeDefinitions(final Map<Class<? extends IDominoType>, IDominoType> definitions) { // typeDefinitions_ = definitions; // } @Override public IDominoType getTypeDefinition(final Class<? extends IDominoType> type) { IDominoType result = getTypeDefinitions().get(type); if (result == null) { // TODO NTF improve exception handling try { result = type.newInstance(); } catch (IllegalAccessException e) { DominoUtils.handleException(e); } catch (InstantiationException e) { DominoUtils.handleException(e); } getTypeDefinitions().put(type, result); } return result; } public void save(final Database db) { } @SuppressWarnings("unused") @Override public Document createDocument(final Database db, final String doctype) { DocumentDefinition def = getDocumentDefinitions().get(doctype); if (def == null) return null; Document result = db.createDocument(); result.replaceItemValue("$$SchemaType", doctype); result.replaceItemValue("form", def.getName()); Map<String, IItemDefinition> itemDefs = def.getItemDefinitions(); for (String key : itemDefs.keySet()) { IItemDefinition itemDef = itemDefs.get(key); Item item = itemDef.createDefaultItem(result, def); } return result; } @Override public boolean validateDocument(final Document doc) { String doctype = doc.getItemValueString("$$SchemaType"); DocumentDefinition def = getDocumentDefinitions().get(doctype); if (def == null) return true; boolean result = true; Map<String, IItemDefinition> itemDefs = def.getItemDefinitions(); for (String key : itemDefs.keySet()) { @SuppressWarnings("unused") IItemDefinition itemDef = itemDefs.get(key); // TODO NTF } return result; } /* * (non-Javadoc) * * @see java.io.Externalizable#readExternal(java.io.ObjectInput) */ @Override public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { int defCount = in.readInt(); for (int i = 0; i < defCount; i++) { String key = in.readUTF(); DocumentDefinition def = (DocumentDefinition) in.readObject(); documentDefinitions_.put(key, def); def.setParent(this); } int itemCount = in.readInt(); for (int i = 0; i < itemCount; i++) { String key = in.readUTF(); ItemDefinition def = (ItemDefinition) in.readObject(); itemDefinitions_.put(key, def); def.setParent(this); } } /* * (non-Javadoc) * * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) */ @Override public void writeExternal(final ObjectOutput out) throws IOException { out.writeInt(documentDefinitions_.size()); for (Map.Entry<String, DocumentDefinition> entry : documentDefinitions_.entrySet()) { out.writeUTF(entry.getKey()); out.writeObject(entry.getValue()); } out.writeInt(itemDefinitions_.size()); for (Map.Entry<String, ItemDefinition> entry : itemDefinitions_.entrySet()) { out.writeUTF(entry.getKey()); out.writeObject(entry.getValue()); } } @Override public IItemDefinition createItemDefinition(final String itemKey, final Class<?> type) { // TODO Implement this or remove comment return null; } }