Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * This program is free software; you can redistribute it and/or modify it under the
   * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
   * Foundation.
   *
   * You should have received a copy of the GNU Lesser General Public License along with this
   * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
   * or from the Free Software Foundation, Inc.,
   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
  * This program 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.
  *
  * Copyright (c) 2009 Pentaho Corporation..  All rights reserved.
  */
 package org.pentaho.metadata.repository;
 
 import java.io.File;
 import java.util.Map;
 import java.util.Set;
 
This is a file based implementation of the IMetadataDomainRepository

Author(s):
Will Gorman(wgorman@pentaho.com)
 
 
   private static final Log logger = LogFactory.getLog(FileBasedMetadataDomainRepository.class);
 
   private static final String DOMAIN_SUFFIX = ".domain.xml"//$NON-NLS-1$
 
   private static final String DEFAULT_DOMAIN_FOLDER = "domains"//$NON-NLS-1$
 
   protected Map<StringDomaindomains = Collections.synchronizedMap(new HashMap<StringDomain>());
 
   private String domainFolder = null;
 
   public void setDomainFolder(String folder) {
     this. = folder;
   }
 
   public void storeDomain(Domain domainboolean overwritethrows DomainIdNullExceptionDomainAlreadyExistsException,
       DomainStorageException {
     if (domain.getId() == null) {
       throw new DomainIdNullException(Messages.getErrorString("IMetadataDomainRepository.ERROR_0001_DOMAIN_ID_NULL")); //$NON-NLS-1$
     }
 
     File folder = getDomainsFolder();
     if (!folder.exists()) {
       folder.mkdirs();
     }
 
     synchronized () {
 
       if (!overwrite && .get(domain.getId()) != null) {
         throw new DomainAlreadyExistsException(Messages.getErrorString(
             "IMetadataDomainRepository.ERROR_0002_DOMAIN_OBJECT_EXISTS"domain.getId())); //$NON-NLS-1$
       }
 
       File domainFile = new File(foldergetDomainFilename(domain.getId()));
 
       if (!overwrite && domainFile.exists()) {
         throw new DomainAlreadyExistsException(Messages.getErrorString(
             "FileBasedMetadataDomainRepository.ERROR_0003_DOMAIN_FILE_EXISTS"domain.getId())); //$NON-NLS-1$
       }
 
       SerializationService service = new SerializationService();
       FileOutputStream output = null;
       try {
         output = new FileOutputStream(domainFile);
         service.serializeDomain(domainoutput);
       } catch (FileNotFoundException e) {
         throw new DomainStorageException(Messages
             .getErrorString("FileBasedMetadataDomainRepository.ERROR_0004_DOMAIN_STORAGE_EXCEPTION"), e); //$NON-NLS-1$
       } finally {
         try {
           if (output != null) {
             output.close();
           }
        } catch (IOException e) {
          throw new DomainStorageException(Messages
              .getErrorString("FileBasedMetadataDomainRepository.ERROR_0004_DOMAIN_STORAGE_EXCEPTION"), e); //$NON-NLS-1$
        }
      }
      // adds the domain to the domains list
      .put(domain.getId(), domain);
    }
  }
  private String getDomainFilename(String id) {
    String cleansedName = id.replaceAll("[^a-zA-Z0-9_]""_"); //$NON-NLS-1$ //$NON-NLS-2$
    return cleansedName + ;
  }
  public Domain getDomain(String id) {
    // for now, lazy load all the domains at once.  We could be smarter,
    // loading the files as requested.
    if (.size() == 0) {
      reloadDomains();
    }
    Domain domain = .get(id);
    if(domain == null) {
      //try to reference the metadata file implicitly, for backward compatibility
      domain = .get(id+"/metadata.xmi");
    }
    if (domain != null) {
      SecurityHelper helper = new SecurityHelper();
      Domain clone = helper.createSecureDomain(thisdomain);
      return clone;
    } else {
      .error(Messages.getErrorString("FileBasedMetadataDomainRepository.ERROR_0006_DOMAIN_NOT_FOUND"id)); //$NON-NLS-1$
      return null;
    }
  }
  public Set<StringgetDomainIds() {
    if (.size() == 0) {
      reloadDomains();
    }
    Set<Stringset = null;
    synchronized () {
      set = new TreeSet<String>(.keySet());
    }
    return set;
  }
  private static class DomainFileNameFilter implements FilenameFilter {
    public boolean accept(File dirString name) {
      return name.endsWith();
    }
  }
  protected File getDomainsFolder() {
    String domainsFolder = ;
    if ( != null) {
      domainsFolder = ;
    }
    File folder = new File(domainsFolder);
    return folder;
  }
  public void flushDomains() {
    .clear();
  }
  public void reloadDomains() {
    // load the domains from the file system
    // for each file in the system/metadata/domains folder that ends with .domain.xml, load
    Map<StringDomainlocalDomains = new HashMap<StringDomain>();
    SerializationService service = new SerializationService();
    File folder = getDomainsFolder();
    if (folder.exists()) {
      for (File file : folder.listFiles(new DomainFileNameFilter())) {
        // load domain
        FileInputStream fis = null;
        try {
          fis = new FileInputStream(file);
          Domain domain = service.deserializeDomain(fis);
          localDomains.put(domain.getId(), domain);
        } catch (FileNotFoundException e) {
          .error(Messages.getErrorString(
              "FileBasedMetadataDomainRepository.ERROR_0005_FAILED_TO_LOAD_DOMAIN"file.getName()), e); //$NON-NLS-1$
        } finally {
          if (fis != null) {
            try {
              if (fis != null) {
                fis.close();
              }
            } catch (IOException e) {
              .error(Messages.getErrorString(
                  "FileBasedMetadataDomainRepository.ERROR_0005_FAILED_TO_LOAD_DOMAIN"file.getName()), e); //$NON-NLS-1$
            }
          }
        }
      }
    }
    synchronized () {
      .clear();
      .putAll(localDomains);
    }
  }
  public void removeDomain(String domainId) {
    synchronized () {
      File folder = getDomainsFolder();
      File domainFile = new File(foldergetDomainFilename(domainId));
      .remove(domainId);
      domainFile.delete();
    }
  }
  public void removeModel(String domainIdString modelIdthrows DomainIdNullExceptionDomainStorageException {
    synchronized () {
      // get a raw domain vs. the cloned secure domain
      Domain domain = .get(domainId);
      if (domain == null) {
        throw new DomainIdNullException(Messages.getErrorString("IMetadataDomainRepository.ERROR_0001_DOMAIN_ID_NULL")); //$NON-NLS-1$
      }
      // remove the model
      Iterator<LogicalModeliter = domain.getLogicalModels().iterator();
      while (iter.hasNext()) {
        LogicalModel model = iter.next();
        if (modelId.equals(model.getId())) {
          iter.remove();
          break;
        }
      }
      if (domain.getLogicalModels().size() == 0) {
        // remove the domain all together
        removeDomain(domainId);
      } else {
        // store the modified domain
        try {
          storeDomain(domaintrue);
        } catch (DomainAlreadyExistsException e) {
          // this should not happen
          .error(Messages.getErrorString(
              "FileBasedMetadataDomainRepository.ERROR_0007_DOMAIN_ALREADY_EXISTS"domain.getId()), e); //$NON-NLS-1$
        }
      }
    }
  }
    return null;
  }

  
The aclHolder cannot be null unless the access type requested is ACCESS_TYPE_SCHEMA_ADMIN.
  public boolean hasAccess(int accessTypeIConcept aclHolder) {
    // Subclasses can override this for ACL and Session/Credential checking
    return true;
  }
New to GrepCode? Check out our FAQ X