// ============================================================================ // // 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.ui.wizards.view; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.ui.IEditorReference; import org.eclipse.xsd.XSDComplexTypeDefinition; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDModelGroup; import org.eclipse.xsd.XSDParticle; import org.talend.commons.exception.LoginException; import org.talend.commons.exception.PersistenceException; import org.talend.core.GlobalServiceRegister; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.repository.model.ProxyRepositoryFactory; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.mdm.repository.core.IServerObjectRepositoryType; import org.talend.mdm.repository.core.command.CommandManager; import org.talend.mdm.repository.core.command.ICommand; import org.talend.mdm.repository.core.service.RepositoryQueryService; import org.talend.mdm.repository.model.mdmproperties.MDMServerObjectItem; import org.talend.mdm.repository.model.mdmproperties.WSRoleItem; import org.talend.mdm.repository.model.mdmserverobject.MdmserverobjectFactory; import org.talend.mdm.repository.model.mdmserverobject.WSBooleanE; import org.talend.mdm.repository.model.mdmserverobject.WSRoleE; import org.talend.mdm.repository.model.mdmserverobject.WSRoleSpecificationE; import org.talend.mdm.repository.model.mdmserverobject.WSRoleSpecificationInstanceE; import org.talend.mdm.repository.model.mdmserverobject.WSViewE; import org.talend.mdm.repository.ui.actions.view.NewViewAction; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.repository.model.IProxyRepositoryFactory; import com.amalto.workbench.dialogs.AddBrowseItemsWizard; import com.amalto.workbench.editors.DataModelMainPage; import com.amalto.workbench.models.KeyValue; import com.amalto.workbench.models.Line; import com.amalto.workbench.models.TreeObject; import com.amalto.workbench.service.IValidateService; import com.amalto.workbench.utils.Util; import com.amalto.workbench.utils.XSDAnnotationsStructure; import com.amalto.workbench.webservices.WSConceptKey; import com.amalto.workbench.webservices.WSDataModelPK; import com.amalto.workbench.webservices.WSGetBusinessConceptKey; /** * DOC hbhong class global comment. Detailled comment */ public class AddBrowseItemsWizardR extends AddBrowseItemsWizard { static Logger log = Logger.getLogger(AddBrowseItemsWizardR.class); /** * DOC hbhong AddBrowseItemsWizardR constructor comment. * * @param launchPage * @param list */ public AddBrowseItemsWizardR(DataModelMainPage launchPage) { super(launchPage); } @Override public List<String> getAllRoleNames() { return RepositoryQueryService.findAllRoleNames(); } @Override protected void modifyRolesWithAttachedBrowseItem(String browseItem, List<Line> roles) { for (Line line : roles) { List<KeyValue> keyValues = line.keyValues; String roleName = keyValues.get(0).value; MDMServerObjectItem roleItem = RepositoryQueryService.findServerObjectItemByName( IServerObjectRepositoryType.TYPE_ROLE, roleName); if (roleItem != null) { CommandManager.getInstance().pushCommand(ICommand.CMD_MODIFY, roleItem.getProperty().getId(), roleItem.getMDMServerObject().getName()); } if (roleItem != null) { IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); if (factory.isEditableAndLockIfPossible(roleItem)) { WSRoleE role = ((WSRoleItem) roleItem).getWsRole(); for (WSRoleSpecificationE spec : role.getSpecification()) { if (spec.getObjectType().equals("View")) {//$NON-NLS-1$ EList<WSRoleSpecificationInstanceE> specInstance = spec.getInstance(); // WSRoleSpecificationInstanceE newInstance = MdmserverobjectFactory.eINSTANCE .createWSRoleSpecificationInstanceE(); newInstance.setInstanceName(browseItem); newInstance.setWritable(keyValues.get(1).value.equals("Read Only") ? false : true);//$NON-NLS-1$ // specInstance.add(newInstance); // break; } } RepositoryResourceUtil.saveItem(roleItem); } try { factory.unlock(roleItem); } catch (PersistenceException e) { log.error(e.getMessage(), e); } catch (LoginException e) { log.error(e.getMessage(), e); } } } } NewViewAction newViewAction = new NewViewAction() { @Override protected WSViewE newView(String viewName) { WSBooleanE wsBool = MdmserverobjectFactory.eINSTANCE.createWSBooleanE(); wsBool.set_true(false); WSViewE view = MdmserverobjectFactory.eINSTANCE.createWSViewE(); view.setName(viewName); // description StringBuffer desc = new StringBuffer(); LinkedHashMap<String, String> labels = new LinkedHashMap<String, String>(); XSDElementDeclaration decl = getXSDElementDeclaration(); if (decl.getAnnotation() != null) { labels = new XSDAnnotationsStructure(decl.getAnnotation()).getLabels(); } if (labels.size() == 0) { labels.put("EN", decl.getName());//$NON-NLS-1$ } for (String lan : labels.keySet()) { desc.append("[" + lan.toUpperCase() + ":" + labels.get(lan) + "]");//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ } view.setDescription(desc.toString()); // view.setTransformerPK(""); //$NON-NLS-1$ view.setIsTransformerActive(wsBool); // SearchableBusinessElements & ViewableBusinessElements List<String> idList = getKeyElements(page.getDataModel().getName(), decl.getName()); List<String> fields = getFieldsForViewElements(decl, idList); fields.addAll(0, idList); view.getSearchableBusinessElements().addAll(fields); view.getViewableBusinessElements().addAll(fields); return view; } }; private static List<String> getKeyElements(String datamodel, String concept) { java.util.List<String> idList = new ArrayList<String>(); WSGetBusinessConceptKey wsGetBusinessConceptKey = new WSGetBusinessConceptKey(concept, new WSDataModelPK(datamodel)); WSConceptKey wsConceptKey; try { wsConceptKey = RepositoryResourceUtil.getBusinessConceptKey(wsGetBusinessConceptKey); } catch (Exception e) { log.error(e.getMessage(), e); return idList; } List<String> ids = wsConceptKey.getFields(); for (String id : ids) { // need to care about more case if (id.startsWith("/")) {//$NON-NLS-1$ id = id.substring(1); } else if (id.startsWith("//")) {//$NON-NLS-1$ id = id.substring(2); } idList.add(concept + '/' + id); } return idList; } public static List<String> getFieldsForViewElements(XSDElementDeclaration decl, List<String> idList) { List<String> fields = new ArrayList<String>(); if (decl == null || idList.size() >= 5) { return fields; } if (decl.getTypeDefinition() instanceof XSDComplexTypeDefinition) { String labelValue = null; List childrenList = Util.getComplexTypeDefinitionChildren((XSDComplexTypeDefinition) decl.getTypeDefinition(), true); if (childrenList == null) { return fields; } for (int j = 0; j < childrenList.size(); j++) { List<XSDParticle> particles = new ArrayList<XSDParticle>(); if (childrenList.get(j) instanceof XSDModelGroup) { particles = ((XSDModelGroup) childrenList.get(j)).getParticles(); } if (particles != null) { for (int k = 0; k < particles.size(); k++) { // Only the top 5 attributes will be searchable and viewable when generating the default view XSDParticle xSDCom = particles.get(k); if ((xSDCom != null && xSDCom.getContent() != null) && xSDCom.getContent() instanceof XSDElementDeclaration) { labelValue = getFieldName(xSDCom); String field = decl.getName(); field = field.replaceFirst("#.*", "");//$NON-NLS-1$//$NON-NLS-2$ field += "/" + labelValue;//$NON-NLS-1$ if (!idList.contains(field)) { fields.add(field); } } if (idList.size() + fields.size() == 5) { break; } } } } } return fields; } private static String getFieldName(XSDParticle xSDCom) { XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration) xSDCom.getContent(); String labelValue = xsdElementDeclaration.getName(); if (xsdElementDeclaration.getTypeDefinition() == null) { if (xSDCom.getTerm() instanceof XSDElementDeclaration) { labelValue = ((XSDElementDeclaration) xSDCom.getTerm()).getName(); } } return labelValue; } @Override protected void newBrowseItemView(String browseItem) { if (toRecreateBrowserView(browseItem)) { IRepositoryViewObject viewObject = RepositoryResourceUtil.findViewObjectByName(IServerObjectRepositoryType.TYPE_VIEW, browseItem); if (viewObject != null) { IEditorReference ref = RepositoryResourceUtil.isOpenedInEditor(viewObject); if (ref != null) { RepositoryResourceUtil.closeEditor(ref, false); } try { ProxyRepositoryFactory.getInstance().deleteObjectPhysical(viewObject); } catch (PersistenceException e) { log.error(e.getMessage(), e); return; } } for (XSDElementDeclaration decl : declList) { String fullName = BROWSE_ITEMS + decl.getName(); if (browseItem.equals(fullName) || browseItem.startsWith(fullName + "#")) { //$NON-NLS-1$ try { newViewAction.setXSDElementDeclaration(decl); newViewAction.createNewView(browseItem); } catch (Exception e) { log.error("Error occurred when generating default view " + browseItem, e); //$NON-NLS-1$ } } } } } private boolean toRecreateBrowserView(String viewName) { IValidateService validateService = (IValidateService) GlobalServiceRegister.getDefault().getService( IValidateService.class); boolean result = validateService.validateAndAlertObjectExistence(TreeObject.VIEW, viewName); return result; } }