/******************************************************************************* * Copyright (c) 2011,2013 IBM Corporation. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * * Masaki Wakao * Yoshio Horiuchi * Kohji Ohsawa *******************************************************************************/ package org.eclipse.lyo.samples.excel.adapter; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.lyo.samples.excel.adapter.dao.ExcelDao; import org.eclipse.lyo.samples.excel.adapter.dao.ExcelDaoFactory; import org.eclipse.lyo.samples.excel.common.ConfigSingleton; import com.hp.hpl.jena.rdf.model.Model; public class ModelManager { private static String repositoryLocationDefault; private static String modelGroupNameDefault; private static String mapperFileNameDefault; private static String generatedExcelFileNameDefault; private static String baseUriDefault; static { ConfigSingleton singleton = ConfigSingleton.getInstance(); repositoryLocationDefault = singleton.getRepositoryLocationDefault(); modelGroupNameDefault = singleton.getModelGroupNameDefault(); mapperFileNameDefault = singleton.getMapperFileNameDefault(); baseUriDefault = singleton.getBaseUriDefault(); } private String repositoryLocation = repositoryLocationDefault; private String mapperFileName = mapperFileNameDefault; private String baseUri = baseUriDefault; private ExcelDao dao = ExcelDaoFactory.createDefaultReader(); private Map<String, ModelGroup> modelGroupMap = new HashMap<String, ModelGroup>(); public void setRepositoryLocation(String repositryLocation) { this.repositoryLocation = repositryLocation; } public void setMapperFileName(String mapperFile) { this.mapperFileName = mapperFile; } public void setBaseUri(String baseUri) { if(!baseUri.endsWith("/")){ baseUri += "/"; } this.baseUri = baseUri; } public void scanRepository() { File d = new File(repositoryLocation); if (!d.exists() || !d.isDirectory()) { return; } List<String> list = new ArrayList<String>(); File[] files = d.listFiles(); for (int i = 0; i < files.length; i++) { File f = files[i]; if (f.isDirectory()) { String name = f.getName(); String ename = name; try { ename = URLEncoder.encode(name, "UTF-8"); } catch (UnsupportedEncodingException e) { } String uri = baseUri + ename + "/"; ModelGroup modelGroup = modelGroupMap.get(uri); if (modelGroup == null) { modelGroup = new ModelGroup(); modelGroup.setPathName(f.getAbsolutePath()); modelGroup.setName(name); modelGroup.setUri(uri); modelGroupMap.put(uri, modelGroup); } loadModelGroup(f, modelGroup); list.add(uri); } } // clean up List<String> obsoleteList = new ArrayList<String>(); Set<String> set = modelGroupMap.keySet(); Iterator<String> iter = set.iterator(); while (iter.hasNext()) { String key = iter.next(); if (!list.contains(key)) { obsoleteList.add(key); } } if (!obsoleteList.isEmpty()) { for (int i = 0; i < obsoleteList.size(); i++) { String key = obsoleteList.get(i); modelGroupMap.remove(key); } } } public Collection<ModelGroup> getModelGroups() { return modelGroupMap.values(); } public ModelGroup getModelGroup(String uri) { return modelGroupMap.get(uri); } private void loadModelGroup(File dir, ModelGroup modelGroup) { File mapperFile = null; List<File> fileList = new ArrayList<File>(); File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { File f = files[i]; String fileName = f.getName(); if (fileName.equals(mapperFileName)) { mapperFile = f; } else { fileList.add(f); } } if (modelGroup.getMapperTableLastModified() <= mapperFile.lastModified()) { // reload mapper xls file modelGroup.setMapperTableLastModified(mapperFile.lastModified()); modelGroup.loadMapperTable(mapperFile.getAbsolutePath()); // clear map, and reload all modelGroup.getModelMap().clear(); } List<String> list = new ArrayList<String>(); for (int i = 0; i < fileList.size(); i++) { File f = fileList.get(i); String fileName = f.getName(); String name = null; String suffix = null; int dot = fileName.lastIndexOf('.'); if (dot != -1) { name = fileName.substring(0, dot); suffix = fileName.substring(dot + 1); } if (name != null && suffix != null && suffix.equalsIgnoreCase("xls")) { boolean reload = true; String ename = name; try { ename = URLEncoder.encode(name, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String relationshipUri = modelGroup.getUri() + ename + "/"; String pathName = f.getAbsolutePath(); ModelContainer container = modelGroup.getModelMap().get(relationshipUri); if (container == null) { container = new ModelContainer(); container.setPathName(pathName); container.setName(name); container.setRelationshipUri(relationshipUri); container.setLastModified(f.lastModified()); modelGroup.getModelMap().put(relationshipUri, container); } else if (f.lastModified() <= container.getLastModified()) { reload = false; } if (reload) { dao.setRelationshipUri(relationshipUri); dao.setMapperTable(modelGroup.getMapperTable()); Model model = dao.parseFile(pathName); if (container.getModel() != null) { container.getModel().close(); } container.setModel(model); } list.add(relationshipUri); } } List<String> obsoleteList = new ArrayList<String>(); Iterator<String> iter = modelGroup.getModelMap().keySet().iterator(); while (iter.hasNext()) { String key = iter.next(); if (!list.contains(key)) { obsoleteList.add(key); } } if (!obsoleteList.isEmpty()) { for (int i = 0; i < obsoleteList.size(); i++) { String key = obsoleteList.get(i); modelGroup.getModelMap().remove(key); } } } public String getDefaultExcelAbsolutePath(){ ModelGroup modelGroup = getModelGroup(baseUri + modelGroupNameDefault); String pathName = modelGroup.getPathName(); return pathName + "\\" + generatedExcelFileNameDefault; } }