// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.mdm.repository.core.service;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.bidimap.DualHashBidiMap;
import org.apache.log4j.Logger;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.mdm.repository.core.IServerObjectRepositoryType;
import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem;
import org.talend.mdm.repository.model.mdmserverobject.MDMServerObject;
import org.talend.mdm.repository.model.mdmserverobject.WSCustomFormE;
import org.talend.mdm.repository.model.mdmserverobject.WSDataModelE;
import org.talend.mdm.repository.model.mdmserverobject.WSRoleE;
import org.talend.mdm.repository.utils.RepositoryResourceUtil;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.utils.IConstants;
/**
* DOC hbhong class global comment. Detailled comment
*/
public class RepositoryQueryService {
private static Logger log = Logger.getLogger(RepositoryQueryService.class);
private static BidiMap typeMap = null;
public static List<String> findAllDataModelNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_DATAMODEL);
}
public static List<String> findAllDataContainerNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_DATACLUSTER);
}
public static List<String> findAllRoleNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_ROLE);
}
public static List<String> findAllProcessNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_TRANSFORMERV2);
}
public static WSDataModelE findDataModelByName(String name) {
return (WSDataModelE) findServerObjectByName(IServerObjectRepositoryType.TYPE_DATAMODEL, name);
}
public static WSRoleE findRoleByName(String name) {
return (WSRoleE) findServerObjectByName(IServerObjectRepositoryType.TYPE_ROLE, name);
}
public static List<String> findAllMenuNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_MENU);
}
public static List<String> findAllRoutingRuleNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_ROUTINGRULE);
}
public static List<String> findAllWorkflowNames() {
List<IRepositoryViewObject> viewObjects = RepositoryResourceUtil
.findAllViewObjects(IServerObjectRepositoryType.TYPE_WORKFLOW);
List<String> names = new LinkedList<String>();
if (viewObjects != null) {
for (IRepositoryViewObject viewObj : viewObjects) {
Item item = viewObj.getProperty().getItem();
if (item instanceof MDMServerObjectItem) {
MDMServerObjectItem serverItem = (MDMServerObjectItem) item;
names.add(serverItem.getMDMServerObject().getName() + "_" + item.getProperty().getVersion()); //$NON-NLS-1$
}
// names[i]=viewObj.getLabel();
}
}
return names;
}
public static List<String> findAllStoredProcedureNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_STOREPROCEDURE);
}
public static List<String> findAllViewNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_VIEW);
}
public static List<String> findAllTransformerV2Names() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_TRANSFORMERV2);
}
public static List<String> findAllCustomFormNames() {
return findAllServerObjectNames(IServerObjectRepositoryType.TYPE_CUSTOM_FORM);
}
/**
* this method is compatible with Util.getDataModel, but for Repository view
*
* @param obj
* @param datamodel
* @param conceptName
* @return
*/
public static List<String> getDataModel(String datamodel, String conceptName) {
List<String> systemDataModelValues = findAllDataModelNames();
// filter the datamodel according to conceptName
List<String> avaiList = new LinkedList<String>();
avaiList.addAll(systemDataModelValues);
if (datamodel != null) {
avaiList.clear();
avaiList.add(datamodel);
} else if (conceptName != null && !conceptName.contains("*")) {//$NON-NLS-1$
for (String data : systemDataModelValues) {
try {
WSDataModelE dm = findDataModelByName(data);
if (dm != null) {
String schema = dm.getXsdSchema();
Pattern p = Pattern.compile("<xsd:element(.*?)name=\"" + conceptName + "\"");//$NON-NLS-1$//$NON-NLS-2$
if (!p.matcher(schema).find()) {
avaiList.remove(data);
}
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
if (avaiList.size() == 0) {
avaiList.addAll(systemDataModelValues);
}
return avaiList;
}
private static List<String> findAllServerObjectNames(ERepositoryObjectType type) {
List<IRepositoryViewObject> viewObjects = RepositoryResourceUtil.findAllViewObjects(type);
List<String> names = new LinkedList<String>();
if (viewObjects != null) {
for (IRepositoryViewObject viewObj : viewObjects) {
Item item = viewObj.getProperty().getItem();
if (item instanceof MDMServerObjectItem) {
String name = ((MDMServerObjectItem) item).getMDMServerObject().getName();
if (name != null) {
names.add(name);
} else {
names.add(viewObj.getLabel());
}
}
// names[i]=viewObj.getLabel();
}
}
return names;
}
public static List<String> findAllCustomFormPks() {
List<IRepositoryViewObject> viewObjects = RepositoryResourceUtil
.findAllViewObjects(IServerObjectRepositoryType.TYPE_CUSTOM_FORM);
List<String> names = new LinkedList<String>();
if (viewObjects != null) {
for (IRepositoryViewObject viewObj : viewObjects) {
Item item = viewObj.getProperty().getItem();
if (item instanceof MDMServerObjectItem) {
MDMServerObject sObject = ((MDMServerObjectItem) item).getMDMServerObject();
if (sObject instanceof WSCustomFormE) {
WSCustomFormE sForm = (WSCustomFormE) sObject;
String name = sForm.getDatamodel() + IConstants.ITEM_PK_SPLIT + sForm.getEntity()
+ IConstants.ITEM_PK_SPLIT + sForm.getName();
if (name != null) {
names.add(name);
} else {
names.add(viewObj.getLabel());
}
}
}
// names[i]=viewObj.getLabel();
}
}
return names;
}
public static MDMServerObject findServerObjectByName(ERepositoryObjectType type, String name) {
List<IRepositoryViewObject> viewObjects = RepositoryResourceUtil.findAllViewObjects(type);
if (viewObjects != null) {
for (IRepositoryViewObject viewObj : viewObjects) {
Item item = viewObj.getProperty().getItem();
if (item instanceof MDMServerObjectItem) {
MDMServerObject serverObject = ((MDMServerObjectItem) item).getMDMServerObject();
if (serverObject.getName() != null && serverObject.getName().equals(name)) {
return serverObject;
} else if (viewObj.getLabel().equals(name)) {
return serverObject;
}
}
}
}
return null;
}
public static MDMServerObjectItem findServerObjectItemByNameWithDeleted(ERepositoryObjectType type, String name,
boolean withDeleted) {
List<IRepositoryViewObject> viewObjects = RepositoryResourceUtil.findAllViewObjects(type, true, withDeleted);
if (viewObjects != null) {
for (IRepositoryViewObject viewObj : viewObjects) {
Item item = viewObj.getProperty().getItem();
if (item instanceof MDMServerObjectItem) {
MDMServerObject serverObject = ((MDMServerObjectItem) item).getMDMServerObject();
if (name != null && name.equals(serverObject.getName())) {
return (MDMServerObjectItem) item;
}
}
}
}
return null;
}
public static MDMServerObjectItem findServerObjectItemByName(ERepositoryObjectType type, String name) {
return findServerObjectItemByNameWithDeleted(type, name, false);
}
private static void initTypeMap() {
if (typeMap == null) {
typeMap = new DualHashBidiMap();
typeMap.put(TreeObject.CUSTOM_FORM, IServerObjectRepositoryType.TYPE_CUSTOM_FORM);
typeMap.put(TreeObject.DATA_MODEL, IServerObjectRepositoryType.TYPE_DATAMODEL);
typeMap.put(TreeObject.DATA_CLUSTER, IServerObjectRepositoryType.TYPE_DATACLUSTER);
typeMap.put(TreeObject.TRANSFORMER, IServerObjectRepositoryType.TYPE_TRANSFORMERV2);
typeMap.put(TreeObject.MENU, IServerObjectRepositoryType.TYPE_MENU);
typeMap.put(TreeObject.ROLE, IServerObjectRepositoryType.TYPE_ROLE);
typeMap.put(TreeObject.ROUTING_RULE, IServerObjectRepositoryType.TYPE_ROUTINGRULE);
typeMap.put(TreeObject.STORED_PROCEDURE, IServerObjectRepositoryType.TYPE_STOREPROCEDURE);
typeMap.put(TreeObject.VIEW, IServerObjectRepositoryType.TYPE_VIEW);
typeMap.put(TreeObject.PICTURES_RESOURCE, IServerObjectRepositoryType.TYPE_RESOURCE);
typeMap.put(TreeObject.WORKFLOW_PROCESS, IServerObjectRepositoryType.TYPE_WORKFLOW);
}
}
public static ERepositoryObjectType getRepositoryObjectType(int wsType) {
initTypeMap();
return (ERepositoryObjectType) typeMap.get(wsType);
}
public static int getWSType(ERepositoryObjectType type) {
initTypeMap();
Object key = typeMap.getKey(type);
if (key != null) {
return (Integer) key;
}
return -1;
}
}