/* * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.services.cms.queries.impl; import java.util.GregorianCalendar; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.jcr.Node; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.ValueFactory; import org.exoplatform.container.component.BaseComponentPlugin; import org.exoplatform.container.xml.InitParams; import org.exoplatform.container.xml.ObjectParameter; import org.exoplatform.container.xml.ValueParam; import org.exoplatform.services.cms.impl.DMSConfiguration; import org.exoplatform.services.cms.impl.DMSRepositoryConfiguration; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.ext.common.SessionProvider; public class QueryPlugin extends BaseComponentPlugin { private static String STATEMENT = "jcr:statement" ; private static String LANGUAGE = "jcr:language" ; private static String PERMISSIONS = "exo:accessPermissions" ; private static String CACHED_RESULT = "exo:cachedResult" ; private InitParams params_ ; private boolean autoCreateInNewRepository_ = false; private RepositoryService repositoryService_ ; private DMSConfiguration dmsConfiguration_; private Set<String> configuredQueries_; public QueryPlugin(RepositoryService repositoryService, InitParams params, DMSConfiguration dmsConfiguration) throws Exception { params_ = params ; repositoryService_ = repositoryService ; ValueParam autoInitParam = params.getValueParam("autoCreateInNewRepository") ; if(autoInitParam !=null) { autoCreateInNewRepository_ = Boolean.parseBoolean(autoInitParam.getValue()) ; } dmsConfiguration_ = dmsConfiguration; } public void init(String basedQueriesPath) throws Exception { configuredQueries_ = new HashSet<String>(); Iterator<ObjectParameter> it = params_.getObjectParamIterator() ; Session session = null ; if(autoCreateInNewRepository_) { session = getSession(); Node queryHomeNode = (Node)session.getItem(basedQueriesPath); while(it.hasNext()) { QueryData data = (QueryData)it.next().getObject() ; addQuery(queryHomeNode,data); } queryHomeNode.save(); session.save(); session.logout(); } else { session = getSession() ; Node queryHomeNode = (Node)session.getItem(basedQueriesPath); while(it.hasNext()) { QueryData data = (QueryData)it.next().getObject() ; addQuery(queryHomeNode,data) ; } queryHomeNode.save(); session.save(); session.logout(); } } private Session getSession() throws Exception { DMSRepositoryConfiguration dmsRepoConfig = dmsConfiguration_.getConfig(); SessionProvider sessionProvider = SessionProvider.createSystemProvider(); return sessionProvider.getSession(dmsRepoConfig.getSystemWorkspace(), repositoryService_.getCurrentRepository()) ; } private void addQuery(Node queryHome, QueryData data) throws Exception { configuredQueries_.add(data.getName()); if(queryHome.hasNode(data.getName())) return ; ValueFactory vt = queryHome.getSession().getValueFactory() ; Node queryNode = queryHome.addNode(data.getName(), "nt:query"); if (!queryNode.isNodeType("exo:datetime")) { queryNode.addMixin("exo:datetime"); } queryNode.setProperty("exo:dateCreated",new GregorianCalendar()) ; queryNode.addMixin("mix:sharedQuery") ; queryNode.setProperty(STATEMENT, data.getStatement()) ; queryNode.setProperty(LANGUAGE, data.getLanguage()) ; List<String> queryPermissions = data.getPermissions() ; Value[] vls = new Value[queryPermissions.size()]; int i = 0; for(String per : queryPermissions) { Value vl = vt.createValue(per) ; vls[i] = vl ; i++ ; } queryNode.setProperty(PERMISSIONS, vls) ; queryNode.setProperty(CACHED_RESULT, data.getCacheResult()) ; } public Set<String> getAllConfiguredQueries() { return configuredQueries_; } }