// ============================================================================ // // Copyright (C) 2006-2012 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.core.model.repository; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.ui.runtime.image.ECoreImage; import org.talend.commons.ui.runtime.image.ImageProvider; import org.talend.commons.ui.runtime.image.ImageUtils; import org.talend.commons.ui.runtime.image.ImageUtils.ICON_SIZE; import org.talend.core.GlobalServiceRegister; import org.talend.core.ICoreService; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.ConnectionFactory; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.core.model.metadata.builder.connection.MetadataColumn; import org.talend.core.model.metadata.builder.connection.MetadataTable; import org.talend.core.model.metadata.builder.connection.QueriesConnection; import org.talend.core.model.metadata.builder.connection.Query; import org.talend.core.model.properties.DatabaseConnectionItem; import org.talend.core.model.properties.DocumentationItem; import org.talend.core.model.properties.InformationLevel; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ItemState; import org.talend.core.model.properties.JobletProcessItem; import org.talend.core.model.properties.LinkDocumentationItem; import org.talend.core.model.properties.PropertiesFactory; import org.talend.core.model.properties.Property; import org.talend.core.model.properties.User; import org.talend.core.ui.images.RepositoryImageProvider; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.PackageHelper; import org.talend.repository.ProjectManager; import org.talend.repository.model.ERepositoryStatus; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IProxyRepositoryService; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.IRepositoryService; import orgomg.cwm.objectmodel.core.Package; import orgomg.cwm.resource.relational.Catalog; /** * DOC Administrator class global comment. Detailled comment */ public class RepositoryViewObject implements IRepositoryViewObject { private IRepositoryNode repositoryNode; private String id; private User author; private Date creationDate; private ERepositoryObjectType type; private String description; private Date modificationDate; private String label; private String purpose; private String statusCode; private String version; private boolean deleted; private String projectLabel; private String path; private ERepositoryStatus repositoryStatus; private ERepositoryStatus informationStatus; private Image customImage; private static ICoreService coreSerivce = (ICoreService) GlobalServiceRegister.getDefault().getService(ICoreService.class); private PersistenceException exception; public RepositoryViewObject(Property property, boolean avoidGuiInfos) { this.id = property.getId(); this.author = property.getAuthor(); this.creationDate = property.getCreationDate(); this.description = property.getDescription(); this.modificationDate = property.getModificationDate(); this.label = property.getDisplayName(); this.purpose = property.getPurpose(); this.statusCode = property.getStatusCode(); this.version = property.getVersion(); this.type = ERepositoryObjectType.getItemType(property.getItem()); this.deleted = property.getItem().getState().isDeleted(); org.talend.core.model.properties.Project emfproject = ProjectManager.getInstance().getProject(property.getItem()); this.projectLabel = emfproject.getLabel(); this.path = property.getItem().getState().getPath(); if (GlobalServiceRegister.getDefault().isServiceRegistered(IProxyRepositoryService.class)) { IProxyRepositoryService service = (IProxyRepositoryService) GlobalServiceRegister.getDefault().getService( IProxyRepositoryService.class); IProxyRepositoryFactory factory = service.getProxyRepositoryFactory(); repositoryStatus = factory.getStatus(property.getItem()); InformationLevel informationLevel = property.getMaxInformationLevel(); informationStatus = factory.getStatus(informationLevel); } if (avoidGuiInfos) { if (type == ERepositoryObjectType.JOBLET) { JobletProcessItem item = (JobletProcessItem) property.getItem(); if (item.getIcon() != null && item.getIcon().getInnerContent() != null && item.getIcon().getInnerContent().length == 0) { customImage = getJobletCustomIcon(property); customImage = ImageUtils.propertyLabelScale(property.getId(), customImage, ICON_SIZE.ICON_16); } } else if (type == ERepositoryObjectType.DOCUMENTATION) { Item item = property.getItem(); if (item instanceof DocumentationItem) { customImage = coreSerivce.getImageWithDocExt(((DocumentationItem) item).getExtension()); } else if (item instanceof LinkDocumentationItem) { customImage = coreSerivce.getImageWithSpecial( coreSerivce.getImageWithDocExt(((LinkDocumentationItem) item).getExtension())).createImage(); } } } } public RepositoryViewObject(Property property) { this(property, false); } /** * DOC bqian Comment method "getJobletCustomIcon". * * @param property * @return */ public static Image getJobletCustomIcon(Property property) { JobletProcessItem item = (JobletProcessItem) property.getItem(); Image image = null; if (item.getIcon() == null || item.getIcon().getInnerContent() == null || item.getIcon().getInnerContent().length == 0) { // File image = RepositoryLabelProvider.getDefaultJobletImage(); // try { // item.getIcon().setInnerContentFromFile(image); // } catch (Exception e) { // ExceptionHandler.process(e); // } image = getDefaultJobletImage(); } else { ImageDescriptor imageDesc = ImageUtils.createImageFromData(item.getIcon().getInnerContent()); imageDesc = ImageUtils.scale(imageDesc, ICON_SIZE.ICON_32); image = cachedImages.get(item.getIcon().getInnerContent()); if (image == null || image.isDisposed()) { image = imageDesc.createImage(); cachedImages.put(item.getIcon().getInnerContent(), image); } else { // image = imageDesc.createImage(); } } return image; } public static Image getDefaultJobletImage() { return ImageProvider.getImage(ECoreImage.JOBLET_COMPONENT_ICON); } private static Map<byte[], Image> cachedImages = new HashMap<byte[], Image>(); /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (!(obj instanceof RepositoryObject) && !(obj instanceof RepositoryViewObject)) { return false; } if (id == null) { return super.equals(obj); } if (obj instanceof RepositoryObject) { RepositoryObject another = (RepositoryObject) obj; return id.equals(another.getId()); } else { RepositoryViewObject another = (RepositoryViewObject) obj; return id.equals(another.getId()); } } public User getAuthor() { return this.author; } public Date getCreationDate() { return this.creationDate; } public String getDescription() { return this.description; } public String getId() { return this.id; } public Date getModificationDate() { return this.modificationDate; } public String getLabel() { return this.label; } public String getPurpose() { return this.purpose; } public String getStatusCode() { return this.statusCode; } public String getVersion() { return this.version; } public Property getProperty() { exception = null; try { IProxyRepositoryFactory factory = null; if (!GlobalServiceRegister.getDefault().isServiceRegistered(IProxyRepositoryService.class)) { return null; } factory = ((IProxyRepositoryService) GlobalServiceRegister.getDefault().getService(IProxyRepositoryService.class)) .getProxyRepositoryFactory(); IRepositoryViewObject object = factory.getLastVersion(id); if (object == null) { throw new PersistenceException("item with name:" + label + " / id:" + id + " not found !\n\nPlease Refresh the repository."); } this.customImage = null; Property property = object.getProperty(); this.id = property.getId(); this.author = property.getAuthor(); this.creationDate = property.getCreationDate(); this.description = property.getDescription(); this.modificationDate = property.getModificationDate(); this.label = property.getDisplayName(); this.purpose = property.getPurpose(); this.statusCode = property.getStatusCode(); this.version = property.getVersion(); this.type = ERepositoryObjectType.getItemType(property.getItem()); this.deleted = property.getItem().getState().isDeleted(); this.path = property.getItem().getState().getPath(); repositoryStatus = factory.getStatus(property.getItem()); InformationLevel informationLevel = property.getMaxInformationLevel(); informationStatus = factory.getStatus(informationLevel); if (type == ERepositoryObjectType.JOBLET) { JobletProcessItem item = (JobletProcessItem) property.getItem(); if (item.getIcon() != null && item.getIcon().getInnerContent() != null && item.getIcon().getInnerContent().length == 0) { customImage = getJobletCustomIcon(property); customImage = ImageUtils.propertyLabelScale(property.getId(), customImage, ICON_SIZE.ICON_16); } } else if (type == ERepositoryObjectType.DOCUMENTATION) { this.customImage = ImageProvider.getImage(RepositoryImageProvider.getIcon(type)); Item item = property.getItem(); if (item instanceof DocumentationItem) { customImage = coreSerivce.getImageWithDocExt(((DocumentationItem) item).getExtension()); } else if (item instanceof LinkDocumentationItem) { customImage = coreSerivce.getImageWithSpecial(customImage).createImage(); } } return property; } catch (PersistenceException e) { exception = e; ExceptionHandler.process(e); // if (!CommonsPlugin.isHeadless() && PlatformUI.isWorkbenchRunning()) { // MessageDialog.openError(Display.getCurrent().getActiveShell(), "Error", exception.getMessage()); // } } return null; } public ERepositoryObjectType getRepositoryObjectType() { return type; } public List<IRepositoryViewObject> getChildren() { List<IRepositoryViewObject> toReturn = new ArrayList<IRepositoryViewObject>(); return toReturn; } /* * (non-Javadoc) * * @see org.talend.core.model.repository.IRepositoryObject#getRepositoryNode() */ public IRepositoryNode getRepositoryNode() { return this.repositoryNode; } /* * (non-Javadoc) * * @see * org.talend.core.model.repository.IRepositoryObject#setRepositoryNode(org.talend.repository.model.RepositoryNode) */ public void setRepositoryNode(IRepositoryNode node) { this.repositoryNode = node; } public RepositoryViewObject cloneNewObject() { RepositoryViewObject object = null; try { Property connectionProperty = PropertiesFactory.eINSTANCE.createProperty(); connectionProperty.setAuthor(getAuthor()); connectionProperty.setCreationDate(getCreationDate()); connectionProperty.setDescription(getDescription()); connectionProperty.setId(getId()); connectionProperty.setLabel(getLabel()); connectionProperty.setModificationDate(getModificationDate()); connectionProperty.setPurpose(getPurpose()); connectionProperty.setStatusCode(getStatusCode()); connectionProperty.setVersion(getVersion()); final Item oldItem = getProperty().getItem(); DatabaseConnectionItem newItem = null; if (oldItem instanceof DatabaseConnectionItem) { DatabaseConnectionItem item = (DatabaseConnectionItem) oldItem; newItem = PropertiesFactory.eINSTANCE.createDatabaseConnectionItem(); newItem.setProperty(connectionProperty); ItemState state = PropertiesFactory.eINSTANCE.createItemState(); // state.setCommitDate(oldItem.getState().getCommitDate()); // state.setDeleted(oldItem.getState().isDeleted()); // state.setLockDate(oldItem.getState().getLockDate()); // state.setLocked(oldItem.getState().isLocked()); // state.setLocker(oldItem.getState().getLocker()); state.setPath(oldItem.getState().getPath()); newItem.setState(state); final DatabaseConnection connection = (DatabaseConnection) item.getConnection(); DatabaseConnection conn = null; if (GlobalServiceRegister.getDefault().isServiceRegistered(IRepositoryService.class)) { IRepositoryService service = (IRepositoryService) GlobalServiceRegister.getDefault().getService( IRepositoryService.class); conn = service.cloneOriginalValueConnection(connection); } final QueriesConnection queries = connection.getQueries(); QueriesConnection newQ = null; if (queries != null) { newQ = ConnectionFactory.eINSTANCE.createQueriesConnection(); newQ.setConnection(conn); final List<Query> query = queries.getQuery(); List<Query> queries2 = new ArrayList<Query>(); for (Query query2 : query) { Query newQuery = ConnectionFactory.eINSTANCE.createQuery(); newQuery.setProperties(query2.getProperties()); newQuery.setComment(query2.getComment()); newQuery.setDivergency(query2.isDivergency()); newQuery.setId(query2.getId()); newQuery.setLabel(query2.getLabel()); newQuery.setQueries(newQ); // newQuery.setReadOnly(query2.isReadOnly()); newQuery.setSynchronised(query2.isSynchronised()); newQuery.setValue(query2.getValue()); newQuery.setContextMode(query2.isContextMode()); queries2.add(newQuery); } newQ.getQuery().addAll(queries2); } final Set<MetadataTable> tables = ConnectionHelper.getTables(connection); List<MetadataTable> newTs = null; if (tables != null) { newTs = new ArrayList<MetadataTable>(); for (MetadataTable table : tables) { MetadataTable table2 = ConnectionFactory.eINSTANCE.createMetadataTable(); table2.setProperties(table.getProperties()); table2.setComment(table.getComment()); if (table2.getNamespace() instanceof Package) { // hywang // remove // setconn Package pkg = (Package) table2.getNamespace(); pkg.getDataManager().add(conn); } // table2.setConnection(conn); table2.setDivergency(table.isDivergency()); table2.setId(table.getId()); table2.setLabel(table.getLabel()); // table2.setReadOnly(table.isReadOnly()); table2.setSourceName(table.getSourceName()); table2.setSynchronised(table.isSynchronised()); table2.setTableType(table.getTableType()); List<MetadataColumn> list = new ArrayList<MetadataColumn>(); for (MetadataColumn column : (List<MetadataColumn>) table.getColumns()) { MetadataColumn column2 = ConnectionFactory.eINSTANCE.createMetadataColumn(); column2.setProperties(column.getProperties()); column2.setComment(column.getComment()); column2.setDefaultValue(column.getDefaultValue()); column2.setDivergency(column.isDivergency()); column2.setId(column.getId()); column2.setKey(column.isKey()); column2.setLabel(column.getLabel()); column2.setLength(column.getLength()); column2.setNullable(column.isNullable()); column2.setOriginalField(column.getOriginalField()); column2.setPattern(column.getPattern()); column2.setPrecision(column.getPrecision()); // column2.setReadOnly(column.isReadOnly()); column2.setSourceType(column.getSourceType()); column2.setSynchronised(column.isSynchronised()); column2.setTable(table2); column2.setTalendType(column.getTalendType()); list.add(column2); } table2.getColumns().addAll(list); newTs.add(table2); } } Catalog c = (Catalog) ConnectionHelper.getPackage(conn.getSID(), (Connection) conn, Catalog.class); if (c != null) { PackageHelper.addMetadataTable(newTs, c); c.getOwnedElement().addAll(newTs); } conn.setQueries(newQ); // conn.getTables().addAll(newTs); newItem.setConnection(conn); } connectionProperty.setItem(newItem); object = new RepositoryViewObject(connectionProperty); } catch (Exception e) { // e.printStackTrace(); ExceptionHandler.process(e); // do notbing. } return object; } /* * (non-Javadoc) * * @see org.talend.core.model.repository.IRepositoryViewObject#isDeleted() */ public boolean isDeleted() { return deleted; } /** * Getter for projectLabel. * * @return the projectLabel */ public String getProjectLabel() { return this.projectLabel; } /* * (non-Javadoc) * * @see org.talend.core.model.repository.IRepositoryViewObject#getPath() */ public String getPath() { return path; } /* * (non-Javadoc) * * @see org.talend.core.model.repository.IRepositoryViewObject#getInformationStatus() */ public ERepositoryStatus getInformationStatus() { return informationStatus; } /* * (non-Javadoc) * * @see org.talend.core.model.repository.IRepositoryViewObject#getRepositoryStatus() */ public ERepositoryStatus getRepositoryStatus() { return repositoryStatus; } /** * Getter for customImage. * * @return the customImage */ public Image getCustomImage() { return this.customImage; } /* * (non-Javadoc) * * @see org.talend.core.model.repository.IRepositoryViewObject#throwPersistenceExceptionIfAny() */ public void throwPersistenceExceptionIfAny() throws PersistenceException { if (exception != null) { throw exception; } } }