Package de.innovationgate.webgate.api.templates

Source Code of de.innovationgate.webgate.api.templates.SimpleContentSource

/*******************************************************************************
* Copyright 2009, 2010 Innovation Gate GmbH. All Rights Reserved.
*
* This file is part of the OpenWGA server platform.
*
* OpenWGA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* In addition, a special exception is granted by the copyright holders
* of OpenWGA called "OpenWGA plugin exception". You should have received
* a copy of this exception along with OpenWGA in file COPYING.
* If not, see <http://www.openwga.com/gpl-plugin-exception>.
*
* OpenWGA 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenWGA in file COPYING.
* If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package de.innovationgate.webgate.api.templates;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

import de.innovationgate.webgate.api.WGACLCore;
import de.innovationgate.webgate.api.WGAPIException;
import de.innovationgate.webgate.api.WGArea;
import de.innovationgate.webgate.api.WGAuthorisationException;
import de.innovationgate.webgate.api.WGBackendException;
import de.innovationgate.webgate.api.WGContentKey;
import de.innovationgate.webgate.api.WGContentStoreVersionException;
import de.innovationgate.webgate.api.WGContentType;
import de.innovationgate.webgate.api.WGCreationException;
import de.innovationgate.webgate.api.WGDatabase;
import de.innovationgate.webgate.api.WGDatabaseCore;
import de.innovationgate.webgate.api.WGDocument;
import de.innovationgate.webgate.api.WGDocumentCore;
import de.innovationgate.webgate.api.WGFactory;
import de.innovationgate.webgate.api.WGWrongRevisionException;

import de.innovationgate.webgate.api.WGInvalidDatabaseException;
import de.innovationgate.webgate.api.WGLanguage;
import de.innovationgate.webgate.api.WGNotSupportedException;
import de.innovationgate.webgate.api.WGProcedureException;
import de.innovationgate.webgate.api.WGRelationData;
import de.innovationgate.webgate.api.WGResultSetCore;
import de.innovationgate.webgate.api.WGSessionContext;
import de.innovationgate.webgate.api.WGStructEntry;
import de.innovationgate.webgate.api.WGUserAccess;
import de.innovationgate.webgate.api.WGUserDetails;
import de.innovationgate.webgate.api.auth.AuthenticationModule;
import de.innovationgate.webgate.api.auth.AuthenticationSession;
import de.innovationgate.webgate.api.auth.MasterLoginAuthSession;
import de.innovationgate.webgate.api.fake.WGFakeDocument;
import de.innovationgate.webgate.api.fake.WGFakeLanguage;
import de.innovationgate.webgate.api.utils.MasterSessionTask;
import de.innovationgate.webgate.api.workflow.WGDefaultWorkflowEngine;

/**
* Template class to implement a simple content source with a subset of WGAPI features.
*
* The Simple Content Source manages either JavaBeans or java.util.Map objects as content.
* While JavaBeans are queried for their properties as Items, Maps serve their mapped values as Items.
*
* Data objects are stored in so-called "folders". The SCS defines itself what folders are available.
* The WGAPI will abstract this folders to Areas.
*
* Data objects additionally need a data key, under which they will get stored inside the folder.
* Each key needs to be unique inside the folder. The keys can be generated by the SCS implementation or
* entered from outside while creating contents.
*
* The method {@link de.innovationgate.webgate.api.templates#SimpleContentSource.init init} that needs to be implemented should return an object of type {@link de.innovationgate.webgate.api.templates#ContentSourceSpecs ContentSourceSpecs}.
* This object contains flags in which the implementation will tell the template what features to activate.
*
* Methods returning multiple contents should return them as objects of type java.util.Map.
* The returned Map keys should match the data keys of the available data objects.
* The data objects can be put as Map values if they are immediately available.
* However the Map values can also be left empty, if they are not.
* In that case the data objects will be retrieved lazily by calling method {@link de.innovationgate.webgate.api.templates#SimpleContentSource.getContent getContent}.
*
*/
public abstract class SimpleContentSource implements WGDatabaseCore {
 
  public static final String DUMMY_AREA = "home";
  public static final String COPTION_LANGUAGE = "Language";

  private WGDatabase _db;
  private String _path;
  private ContentSourceSpecs _specs;
  private Map _procs = new HashMap();
 
  private ThreadLocal userName = new ThreadLocal();
  private String _fakeLanguage = null;

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#open(de.innovationgate.webgate.api.WGDatabase, java.lang.String, java.lang.String, java.lang.String)
   */
  public WGUserAccess open(WGDatabase db, String path, String user, String pwd, boolean prepareOnly) throws WGAPIException {

    _db = db;
    _path = path;

    // Initialize
    _specs = init(db, path);
    if (_specs == null) {
      return new WGUserAccess(WGDatabase.ANONYMOUS_USER, WGDatabase.ACCESSLEVEL_NOTLOGGEDIN);
    }
   
    // Init fake language
    _fakeLanguage = (String) db.getCreationOptions().get(COPTION_LANGUAGE);
    if (_fakeLanguage == null) {
      _fakeLanguage = Locale.getDefault().getLanguage();
    }

    // Find procedures
    Method[] methods = getClass().getMethods();
    Method method;
    for (int i = 0; i < methods.length; i++) {
      method = methods[i];
     
      if ((method.getModifiers() & Modifier.PUBLIC) == Modifier.PUBLIC) { // Only public methods!
       
        // Either the method is defined in procedures list (when available) or it must be declared in the implementation class
        if (_specs.getProcedures() != null && _specs.getProcedures().contains(method.getName())) {
          _procs.put(method.getName(), method);
        }
        else if (method.getDeclaringClass().equals(getClass())) {
          _procs.put(method.getName(), method);
        }
      }
    }

    // Open session
    return openSession(MasterLoginAuthSession.getInstance(), pwd, true);
   
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#openSession(java.lang.String, java.lang.String)
   */
  public WGUserAccess openSession(AuthenticationSession authSession, Object pwd, boolean master) throws WGAPIException {
   
    if (master && !_specs.isUseMasterLogin()) {
      return new WGUserAccess(authSession.getDistinguishedName(), WGDatabase.ACCESSLEVEL_READER);
    }
   
        String pwdStr = (String) pwd;
       
    int accLevel;
    try {
      accLevel = login(authSession.getDistinguishedName(), pwdStr);
    }
    catch (WGAuthorisationException e) {
      return new WGUserAccess(authSession.getDistinguishedName(), WGDatabase.ACCESSLEVEL_NOTLOGGEDIN);
    }
    catch (WGAPIException e) {
      WGFactory.getLogger().error("Error opening scs session", e);
      return new WGUserAccess(authSession.getDistinguishedName(), WGDatabase.ACCESSLEVEL_NOTLOGGEDIN);
    }
    if (accLevel > WGDatabase.ACCESSLEVEL_NOACCESS) {
      userName.set(authSession.getDistinguishedName());
    }
    return new WGUserAccess(authSession.getDistinguishedName(), accLevel);
  }
 
  /**
   * Implement to specify login behaviour for users opening single sessions.
   * @param user login username
   * @param pwd login password
   * @return A constant WGDatabase.ACCESSLEVEL_... to determine what access the user has on the database, WGDatabase.ACCESSLEVEL_NOTLOGGEDIN if the login should fail
   * @throws WGAPIException
   */
  public abstract int login(String user, String pwd) throws WGAPIException;
  /**
   * Called when a user session is closed to cleanup resources of it
   * @throws WGAPIException
   */
  public abstract void logout() throws WGAPIException;

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#close()
   */
  public void close() throws WGAPIException {
   
    destroy();
   
  }
 
  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#closeSession()
   */
  public void closeSession() throws WGAPIException {
    logout();
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getTitle()
   */
  public abstract String getTitle() throws WGBackendException;


  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getTypeName()
   */
  public abstract String getTypeName();
   

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getLastChanged()
   */
  public Date getRevision() throws WGAPIException {
    return getLastModified();
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getMetaData(java.lang.String)
   */
  public Object getExtensionData(String name) throws WGAPIException {
      throw new WGContentStoreVersionException("Database metadata", WGDatabase.CSVERSION_WGA5);
  }
 
  /* (Kein Javadoc)
     * @see de.innovationgate.webgate.api.WGDatabaseCore#getMetaData(java.lang.String)
     */
    public void writeExtensionData(String name, Object value) throws WGAPIException {
        throw new WGContentStoreVersionException("Database metadata", WGDatabase.CSVERSION_WGA5);
    }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getRoles()
   */
  public List getRoles() {
    return Arrays.asList(new String[] {WGDatabase.ROLE_CONTENT});
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#hasFeature(java.lang.String)
   */
  public boolean hasFeature(String feature) {

    if (feature.equals(WGDatabase.FEATURE_COMPLEXVALUES)) {
      return true;
    }
    else if (feature.equals(WGDatabase.FEATURE_EDITABLE)) {
      return _specs.isWritable();
    }
    else if (feature.equals(WGDatabase.FEATURE_FULLCONTENTFEATURES)) {
      return false;
    }
    else if (feature.equals(WGDatabase.FEATURE_GENERATES_STRUCTKEYS)) {
      return _specs.isCalculatesKeys();
    }
    else if (feature.equals(WGDatabase.FEATURE_ACCEPTS_STRUCTKEYS)) {
      return true;
    }
    else if (feature.equals(WGDatabase.FEATURE_HIERARCHICAL)) {
      return _specs.isBrowseable();
    }
    else if (feature.equals(WGDatabase.FEATURE_LASTCHANGED)) {
      return _specs.isMaintainsLastChanged();
    }
    else if (feature.equals(WGDatabase.FEATURE_NATIVEEXPRESSIONS)) {
      return false;
    }
    else if (feature.equals(WGDatabase.FEATURE_QUERYABLE)) {
      return _specs.isQueryable();
    }
    else if (feature.equals(WGDatabase.FEATURE_STORESVARS)) {
      return false;
    }
    else if (feature.equals(WGDatabase.FEATURE_USE_OBJECTS_AS_REFERENCES)) {
      return false;
    }
    else if (feature.equals(WGDatabase.FEATURE_PERFORMS_BACKEND_LOGIN)) {
        return true;
    }
    else {
      return false;
    }


  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getChildEntries(de.innovationgate.webgate.api.WGStructEntry)
   */
  public List getChildEntries(WGStructEntry structEntry) throws WGAPIException {
    return new ArrayList();
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getRootEntries(de.innovationgate.webgate.api.WGArea)
   */
  public List getRootEntries(WGArea area) throws WGAPIException {

    BeanFolder folder = (BeanFolder) area.getCore();
    Map contentCores = browse(folder.getName());
    Iterator contentCoreKeys = contentCores.keySet().iterator();
    List contents = new ArrayList();
    Object key;
    Object bean;
    while (contentCoreKeys.hasNext()) {
      key = contentCoreKeys.next();
      bean = contentCores.get(key);
      contents.add(new WrappedKey(this, new BeanKey(folder.getName(), key), bean, true));
    }
   
    return contents;
   

  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getStructEntryByKey(java.lang.Object)
   */
  public WGDocumentCore getStructEntryByKey(Object key) throws WGAPIException {
   
    if (key == null) {
      return null;
    }
   
    return new WrappedKey(this, (BeanKey) key, null, true);
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getParentEntry(de.innovationgate.webgate.api.WGStructEntry)
   */
  public WGDocumentCore getParentEntry(WGStructEntry entry) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getAllContent(de.innovationgate.webgate.api.WGStructEntry)
   */
  public List getAllContent(WGStructEntry structEntry, boolean includeArchived) throws WGAPIException {
   
    WrappedKey key = (WrappedKey) structEntry.getCore();
    Object bean = key.getBean();
    List list = new ArrayList();
    list.add(createWrapper(key.getKey(), bean, true));
    return list;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getContentByKey(de.innovationgate.webgate.api.WGContentKey)
   */
  public WGDocumentCore getContentByKey(WGContentKey key) throws WGAPIException {
   
    return fastAccess(WGDocument.TYPE_CONTENT, key.getStructKey());
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getContentByName(java.lang.String, java.lang.String)
   */
  public WGDocumentCore getContentByName(String strName, String strLanguage) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getDummyContent(java.lang.String)
   */
  public WGDocumentCore getDummyContent(String language) throws WGAPIException {
    return new WGFakeDocument(_db, WGDocument.TYPE_CONTENT);
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#query(java.lang.String, java.lang.String, java.util.Map)
   */
  public WGResultSetCore query(String type, String query, Map parameters) throws WGAPIException {
   
    Map results = find(type, query, parameters);
    String folder = extractFolder(type, query, parameters);
    if (folder == null) {
      folder = type;
    }
   
    return new LazyBeanList(this, folder, results);   
   
  }

  /**
   * Helps to retrieve the folder for query results based on the given query parameters. Base implementation returns null = the folder is the type of the query. Should be overwritten if this is different.
   * @param type The query type used for the query
   * @param query The query itself
   * @param parameters The parameters given to the query
   * @return The folder name if it is retrievable, null otherwise.
   */
  public String extractFolder(String type, String query, Map parameters) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getDesignObjects(int)
   */
  public List getDesignObjects(int type) throws WGAPIException {
 
    if (type == WGDocument.TYPE_AREA) {
      String[] folderNames = getFolders();
      List folders = new ArrayList();
      if (folderNames != null) {
          for (int i=0; i < folderNames.length; i++) {
            folders.add(new BeanFolder(this, folderNames[i]));
          }
      }
      return folders;
    }
    else if (type == WGDocument.TYPE_LANGUAGE) {
        return Collections.singletonList(new WGFakeLanguage(_db, _fakeLanguage, _fakeLanguage));
    }
     
    return null;
   
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getDesignObject(int, java.lang.String, java.lang.String)
   */
  public WGDocumentCore getDesignObject(int type, String name, String strMediaKey) throws WGAPIException {
   
    if (type == WGDocument.TYPE_AREA) {
      return new BeanFolder(this, name);
    }
    else if (type == WGDocument.TYPE_LANGUAGE && _fakeLanguage.equals(name)) {
      return new WGFakeLanguage(_db, name, name);
    }
     
    return null;
   
   
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getUserProfile(java.lang.String)
   */
  public WGDocumentCore getUserProfile(String name) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#createUserProfile(java.lang.String, int)
   */
  public WGDocumentCore createUserProfile(String name, int type) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#fastAccess(java.lang.Object)
   */
  public WGDocumentCore fastAccess(int type, Object key) throws WGAPIException {
    BeanKey beanKey = (BeanKey) key;
    if (type == WGDocument.TYPE_CONTENT) {
       
        // The corresponding struct entry already has it's core we maybe can retrieve the bean from it
        WGStructEntry entry = _db.getStructEntryByKey(beanKey);
        if (entry != null) {
        WrappedKey entryCore = (WrappedKey) entry.getCore();
        Object bean = entryCore.getBean();
                return createWrapper(beanKey, bean, true);
           
       
      //Object bean = getContent(beanKey.getFolder(), beanKey.getKey());
            //if (bean != null) {
            //    return createWrapper(beanKey, bean, true);
            //}
            }
            else {
                WGFactory.getLogger().info("Could not re-retrieve bean '" + beanKey.getKey() + "' in folder '" + beanKey.getFolder() + "'");
                return null;
            }
    }
    else {
      return null;
    }
   
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#parseStructKey(java.lang.String)
   */
  public Object parseStructKey(String key) throws WGAPIException {
   
    key = BeanKey.decodeKey(key);
    int commaPos = key.indexOf(",");
    if (commaPos == -1) {
      return null;
    }
    String folderPart = key.substring(0, commaPos);
    String keyPart = key.substring(commaPos + 1);
    Object realKey = convertToKey(keyPart, folderPart);
       
    return new BeanKey(folderPart, realKey);
  }
 
  /**
   * Converts the string representation of a data key to it's real data type.
   * @param key The string representatino of the data key
   * @param folder The folder of the data key
   * @return The converted data key in it's original data type.
   * @throws WGAPIException
   */
  public abstract Object convertToKey(String key, String folder) throws WGAPIException;

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#cleanup()
   */
  public void cleanup() {
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#createDesignDocument(int, java.lang.String, java.lang.String)
   */
  public WGDocumentCore createDesignDocument(int type, String name, String mediaKey) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#createStructEntry(de.innovationgate.webgate.api.WGDocument, de.innovationgate.webgate.api.WGContentType)
   */
  public WGDocumentCore createStructEntry(Object key, WGDocument reference, WGContentType contentType) throws WGAPIException {
   
    if (reference instanceof WGStructEntry) {
      throw new WGCreationException("Creation of child content not possible in this implementation");
    }
   
    BeanFolder folder = (BeanFolder) reference.getCore();
    return new WrappedKey(this, new BeanKey(folder.getName(), key), null, false);
       
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#createContent(de.innovationgate.webgate.api.WGStructEntry, de.innovationgate.webgate.api.WGLanguage, java.lang.String, int)
   */
  public WGDocumentCore createContent(WGStructEntry structEntry, WGLanguage language, String title, int version) throws WGAPIException {
   
    BeanKey beanKey = ((WrappedKey) structEntry.getCore()).getKey();
   
    Object bean = createContent(beanKey.getFolder());
    return createWrapper(beanKey, bean, false);
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getDefaultWorkflowEngine()
   */
  public Class getDedicatedWorkflowEngine() {
    return WGDefaultWorkflowEngine.class;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#isMemberOfUserList(java.util.List)
   */
  public boolean isMemberOfUserList(List userList) throws WGAPIException {
    return false;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#createCopy(de.innovationgate.webgate.api.WGDocumentCore)
   */
  public WGDocumentCore createCopy(WGDocumentCore original) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#beginTransaction()
   */
  public boolean beginTransaction() {
    return false;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#rollbackTransaction()
   */
  public boolean rollbackTransaction() {
    return false;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#commitTransaction()
   */
  public boolean commitTransaction() {
    return false;
  }
 
  /**
   * Implement to retrieve a single data object by key information.
   * This gets called by lazy data fetching, when result maps contain only keys but no data objects.
   * @param folder The folder of the object
   * @param key The data key of the object
   * @return The data object if there is any under this key, null otherwise
   * @throws WGAPIException
   */
  public abstract Object getContent(String folder, Object key) throws WGAPIException;
  /**
   * Implement functionality to insert a new data object to a folder
   * @param folder The folder to insert this data object
   * @param key The key for this data object. You may ignore this if this SCS implementation generates it's own keys.
   * @param bean The data object to store
   * @return true, if insertion succeeded, false otherwise
   * @throws WGAPIException
   */
  public abstract boolean insertContent(String folder, Object key, Object bean) throws WGAPIException;
  /**
   * Implement behaviour to update the database backend with new data for a data object
   * @param folder The folder of the data object
   * @param key The data key of the data object
   * @param bean The data object itself.
   * @return true, if update succeeded, false otherwise
   * @throws WGAPIException
   */
  public abstract boolean updateContent(String folder, Object key, Object bean) throws WGAPIException;
  /**
     * Creates a new content object in the given folder
   * @param folder The folder name to create the content
   * @return The new content object
   */
  public abstract Object createContent(String folder) throws WGAPIException;
  /**
   * Used to implement querying behaviour to the SCS implementation.
   * @param type The query type (which by default should be the folder at which the query is directed)
   * @param query The query
   * @param parameters Query parameters. Map keys are Constants WGDatabase.QUERYOPTION_...
   * @return A map containing the results. Map keys should be data keys. Map values should be data objects or null to use lazy retrieval
   * @throws WGAPIException
   */
  public abstract Map find(String type, String query, Map parameters) throws WGAPIException;
  /**
   * Implement to return a last modified date. May return null if this feature is not supported by this SCS implementation.
   * @throws WGAPIException
   */
  public abstract Date getLastModified() throws WGAPIException;
  /**
   * Implement behaviour to remove a data object from a folder
   * @param folder Folder of the data object
   * @param key Key of the data object
   * @throws WGAPIException
   */
  public abstract void removeContent(String folder, Object key) throws WGAPIException;
  /**
   * Implement to initialize the SCS implementation when the database gets opened.
   * @param db The WGAPI database object, that will represent this SCS implementation
   * @param path The database path
   * @return Specs of this implementation, telling the template what features will get used
   * @throws WGAPIException
   */
  public abstract ContentSourceSpecs init(WGDatabase db, String path) throws WGAPIException;
  /**
   * Callback method, that gets called when the SCS is closed completely.
   */
  public abstract void destroy();


 
  /**
   * Implement to return the available folders
   * @return String array of folder names
   * @throws WGAPIException
   */
  public abstract String[] getFolders() throws WGAPIException;
 
  /**
   * Browses the given folder for contents.
   * @param folder The folder name
   * @return A map of data objects. Use data keys as Map keys. Use data objects as Map values or leave values null to use lazy fetching behaviour.
   * @throws WGAPIException
   */
  public abstract Map browse(String folder) throws WGAPIException;

  /**
   * @return
   */
  protected String getFakeLanguage() {
    return _fakeLanguage;
  }
 

  /**
   * Returns the specs that the init-Method returned for this SCS implementation.
   */
  public ContentSourceSpecs getSpecs() {
    return _specs;
  }
 
  protected Logger getLog() {
    return WGFactory.getLogger();
  }


  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#execProcedure(java.lang.String, java.util.List)
   */
  public Object execProcedure(String procName, List args) throws WGProcedureException, WGBackendException {

    Method proc = (Method) _procs.get(procName);
    if (proc == null) {
      throw new WGProcedureException("No procedure of name '" + procName + "'");
    }
   
    Object result = null;
    try {
      result = proc.invoke(this, args.toArray());
    }
    catch (IllegalArgumentException e) {
      throw new WGProcedureException("Argument types and/or count does not match arguments of procedure '" + procName + "'");
    }
    catch (IllegalAccessException e) {
      throw new WGProcedureException("Unable to access procedure '" + procName + "'. Method not visible.");
    }
    catch (InvocationTargetException e) {
      WGFactory.getLogger().error("Error invoking procedure '" + procName + "':" + e.getTargetException().getMessage(), e);
      throw new WGProcedureException("Error invoking procedure '" + procName + "':" + e.getTargetException().getMessage());
   
   
    return result; 
   

  }





  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#resultIsTrue(java.lang.Object, de.innovationgate.webgate.api.WGDocument)
   */
  public boolean resultIsTrue(Object result, WGDocument doc) {
    return false;
  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#resultIsFalse(java.lang.Object, de.innovationgate.webgate.api.WGDocument)
   */
  public boolean resultIsFalse(Object result, WGDocument doc) {
    return false;
  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getACL()
   */
  public WGACLCore getACL() {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getNativeObject()
   */
  public Object getNativeObject() throws WGBackendException {
    return null;
  }

  /**
   * @return
   */
  protected WGDatabase getDb() {
    return _db;
  }


 
  /**
     * Creates a wrapper for the given content object that implements WGDocumentCore for it
   * @param key The key of the content object
   * @param bean The content object
   * @param saved Boolean showing if the object already has been saved
   * @return The content wrapper, ready to be used  as WGDocumentCore
   * @throws WGAPIException
   */
  public BeanWrapper createWrapper(BeanKey key, Object bean, boolean saved) throws WGAPIException {
   
    if (bean instanceof Map) {
      return new MapWrapper(this, key, (Map) bean, saved, (key.getKey() instanceof TemporaryKey));
    }
    else {
      return new BeanWrapper(this, key, bean, saved, (key.getKey() instanceof TemporaryKey));
    }
  }

  /**
   * Method to calculate the key to a newly created data object. This is necessary to overwrite if the SCS implementation supports calculating keys.
   * @param folder the folder where the data object gets stored
   * @param _bean The data object
   * @return The calculated key for the data object
   * @throws WGAPIException
   */
  public Object calculateKey(String folder, Object _bean) throws WGAPIException {
    return null;
  }

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#refresh()
   */
  public void refresh() {}

  /* (Kein Javadoc)
   * @see de.innovationgate.webgate.api.WGDatabaseCore#getUpdatedDocumentsSince(java.util.Date)
   */
  public List getUpdatedDocumentsSince(Date cutoff) throws WGAPIException {
    return null;
  }

    /* (non-Javadoc)
     * @see de.innovationgate.webgate.api.WGDatabaseCore#moveStructEntry(de.innovationgate.webgate.api.WGStructEntry, de.innovationgate.webgate.api.WGDocument)
     */
    public boolean moveStructEntry(WGStructEntry entry, WGDocument newParent) throws WGAPIException {
        return false;
    }
    /* (non-Javadoc)
     * @see de.innovationgate.webgate.api.WGDatabaseCore#hasContents(de.innovationgate.webgate.api.WGStructEntry)
     */
    public int getContentCount(WGStructEntry entry) throws WGBackendException {
        throw new WGNotSupportedException("Not supported");
    }
    /* (non-Javadoc)
     * @see de.innovationgate.webgate.api.WGDatabaseCore#setCurrentSession(de.innovationgate.webgate.api.WGSessionContext)
     */
    public void setCurrentSession(WGSessionContext context) {
    }

    /* (non-Javadoc)
     * @see de.innovationgate.webgate.api.WGDatabaseCore#convertFileNameForAttaching(java.lang.String)
     */
    public String convertFileNameForAttaching(String name) {
        return null;
    }

    /* (non-Javadoc)
     * @see de.innovationgate.webgate.api.WGDatabaseCore#getAllowedCredentialClasses()
     */
    public Class[] getAllowedCredentialClasses() {
        return new Class[] { String.class };
    }
   
    public List queryUserProfileNames(String type, String query, Map params) throws WGAPIException {
        return null;
    }
   
    /*
     *  (non-Javadoc)
     * @see de.innovationgate.webgate.api.WGDatabaseCore#getDeletions(java.util.Set)
     */
    public Set getDeletions(Set contentKeys) throws WGAPIException {    
        return Collections.EMPTY_SET;
    }

    public List getAllContentKeys(boolean includeArchived) throws WGAPIException {
        throw new WGNotSupportedException("This method is not supported by this WGAPI implementation");
    }
   
    public void beginUpdate() {
     
    }

    public WGDocumentCore getStructEntryByName(String strName) throws WGAPIException {
        throw new WGNotSupportedException("This method is not supported by this WGAPI implementation");
    }

    public Date getRevisionDate(Comparable lastChanged) throws WGAPIException, WGWrongRevisionException {
        try {
            return (Date) lastChanged;
        }
        catch (ClassCastException e) {
            throw new WGWrongRevisionException(Date.class);
        }
    }

    public List getUpdateLogs(Comparable cutoff) throws WGAPIException {
        return null;
    }

    public double getContenStoreVersion() throws WGAPIException {
        return WGDatabase.CSVERSION_NO_CONTENTSTORE;
    }

    public void removeExtensionData(String name) throws WGAPIException {
    }
   
    public List<String> getExtensionDataNames() throws WGAPIException {
        return Collections.emptyList();
    }

    public List<WGRelationData> getIncomingRelations(Object structKey, String language, Boolean includeUnreleased) throws WGAPIException {
        return Collections.emptyList();
    }

    public boolean isContentTypeUsed(WGContentType ct) throws WGAPIException {
        return true;
    }

    public boolean isLanguageUsed(WGLanguage lang) throws WGAPIException {
        return true;
    }

}
TOP

Related Classes of de.innovationgate.webgate.api.templates.SimpleContentSource

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.