Utilisez ces fichiers simplifiés comme exemple simplifié des points
d'extension fournis.
Exemple FileSystemBatchDataSource
package com.ibm.ram.batch.example;
import java.io.*;
import java.util.*;
import java.util.zip.*;
import com.ibm.ram.client.LocalFileArtifact;
import com.ibm.ram.client.LocalFolderArtifact;
import com.ibm.ram.client.batch.BatchDataSource;
import com.ibm.ram.client.status.RAMStatusMonitor;
import com.ibm.ram.common.data.*;
/**
* Source de données pour un exemple d'extension client par lots qui crée des actifs à partir de dossiers et de fichiers .zip
* dans un dossier principal donné. Ces dossiers et ces fichiers .zip doivent
contenir un fichier nommé .asset_info, dont
* le contenu doit être au format d'un fichier .properties (en général, une
pair clé=valeur par ligne...
* voir {@link java.util.Properties}) et inclure des propriétés pour l'actif :
* <ul>
* <li>name (Facultatif. En cas d'omission, le nom de
fichier/dossier est utilisé.)
* <li>version (Facultatif. En cas d'omission, 1.0 est utilisé.)
* <li>community (Obligatoire)
* <li>asset_type (Obligatoire)
* <li>short_description (Facultatif. En cas d'omission, le nom de fichier/dossier est utilisé.)
* <li>description (Facultatif)
* </ul>
*
* @author ebordeau
*/
public class FileSystemBatchDataSource extends BatchDataSource {
private static final String NAME = "name";
private static final String VERSION = "version";
private static final String COMMUNITY = "community";
private static final String ASSET_TYPE = "asset_type";
private static final String SHORT_DESCRIPTION = "short_description";
private static final String DESCRIPTION = "description";
private static final String ASSET_INFO = ".asset_info";
private File root;
private String rootPath;
public FileSystemBatchDataSource() {}
public FileSystemBatchDataSource(String path) {
rootPath = path;
}
/**
* Créer et renvoyer les actifs en fonction de la racine.
*
* @see com.ibm.ram.client.batch.BatchDataSource#fetchAssets(com.ibm.ram.client.status.RAMStatusMonitor)
*/
@Override
public Asset[] fetchAssets(RAMStatusMonitor monitor) {
if (root == null) {
if (rootPath == null) // si la racine n'est pas spécifiée, renvoyer
uniquement un tableau vide
return new Asset[0];
root = new File(rootPath);
}
List<Asset> assets = new ArrayList<Asset>();
// obtenir tous les fichiers dans le répertoire principal
File[] files = root.listFiles();
for (File file : files) {
// il faut identifier quel dossier utiliser pour l'actif
File folder = null;
if (file.isDirectory()) {
// s'il s'agit d'un répertoire, l'utiliser en l'état
folder = file;
} else if (file.getName().toLowerCase().endsWith(".zip")) {
// s'il s'agit d'un fichier zip, extraire dans un répertoire temporaire.
try {
ZipFile zip = new ZipFile(file);
folder = extractZip(zip);
} catch (ZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
// s'il ne s'agit pas d'un fichier zip ou d'un répertoire, l'ignorer.
continue;
}
// analyser le fichier .asset_info.
File assetInfoFile = new File(folder, ASSET_INFO);
Asset asset = new Asset();
parseAssetInfo(assetInfoFile, asset);
// si le nom, la version ou la brève description n'ont pas été définis, les
définir aux valeurs par défaut.
if (asset.getName() == null)
asset.setName(folder.getName());
if (asset.getIdentification().getVersion() == null)
asset.getIdentification().setVersion("1.0");
if (asset.getShortDescription() == null)
asset.setShortDescription(folder.getName());
// ajouter tous les fichiers dans le dossier (sauf le fichier .asset_info) comme artefacts.
File[] artifactFiles = folder.listFiles();
List<Artifact> artifacts = new ArrayList<Artifact>();
for (File artifactFile : artifactFiles) {
if (artifactFile.getName().toLowerCase().equals(ASSET_INFO))
continue;
if (artifactFile.isDirectory())
artifacts.add(new LocalFolderArtifact(artifactFile));
else
artifacts.add(new LocalFileArtifact(artifactFile));
}
if (!artifacts.isEmpty()) {
FolderArtifact artifactsRoot = asset.getArtifactsRoot();
if (artifactsRoot == null) {
artifactsRoot = new FolderArtifact();
asset.setArtifactsRoot(artifactsRoot);
}
artifactsRoot.setChildren(artifacts.toArray(new Artifact[artifacts.size()]));
}
assets.add(asset);
}
// renvoyer les actifs qui ont été créés.
return assets.toArray(new Asset[assets.size()]);
}
/**
* Analyser le fichier .asset_info et définir les valeurs dans l'actif.
*/
private void parseAssetInfo(File assetInfoFile, Asset asset) {
Properties props = new Properties();
try {
props.load(new FileInputStream(assetInfoFile));
asset.setName(props.getProperty(NAME));
asset.getIdentification().setVersion(props.getProperty(VERSION));
CommunityInformation community = new CommunityInformation();
community.setName(props.getProperty(COMMUNITY));
asset.setCommunity(community);
AssetType assetType = new AssetType();
assetType.setName(props.getProperty(ASSET_TYPE));
asset.setAssetType(assetType);
asset.setShortDescription(props.getProperty(SHORT_DESCRIPTION));
asset.setDescription(props.getProperty(DESCRIPTION));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Extraire le fichier .zip dans un répertoire temporaire et renvoyer ce répertoire temporaire.
*/
private File extractZip(ZipFile zip) {
String name = zip.getName();
int i = name.lastIndexOf(File.separator);
name = name.substring(i + 1, name.length() - 4);
File destination = new File(System.getProperty("java.io.tmpdir"), name);
Enumeration entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
File tmp = new File(destination, entry.getName());
tmp.getParentFile().mkdirs();
InputStream in = null;
FileOutputStream out = null;
try {
in = zip.getInputStream(entry);
out = new FileOutputStream(tmp);
byte[] data = new byte[8192];
int read;
while ((read = in.read(data)) > -1) {
out.write(data, 0, read);
}
} catch (IOException e) {
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {}
}
}
}
return destination;
}
/**
* Renvoyer la racine pour cette source de données.
*/
public String getRootPath() {
return rootPath;
}
/**
* Il s'agit de l'ID de l'extension de votre source de données dans le fichier plugin.xml.
*
* @see com.ibm.ram.client.batch.BatchDataSource#getTypeId()
*/
@Override
public String getTypeId() {
return "com.ibm.ram.batch.example.filesystem";
}
/**
* Les métadonnées correspondent juste à la racine.
*
* @see com.ibm.ram.client.batch.BatchDataSource#initialize(java.lang.String)
*/
@Override
public void initialize(String metadata) {
rootPath = metadata;
}
/**
* Il faut uniquement sauvegarder la racine. Dans un exemple plus complexe, ceci
* serait probablement plus utile, comme un XML.
*
* @see com.ibm.ram.client.batch.BatchDataSource#save()
*/
@Override
public String save() {
return rootPath;
}
}
Exemple FileSystemBatchUIContributor
package com.ibm.ram.batch.example;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Shell;
import com.ibm.ram.batch.ui.AbstractBatchUIContributor;
import com.ibm.ram.client.batch.BatchDataSource;
import com.ibm.ram.internal.rich.ui.util.ImageUtil;
/**
* Collaborateur d'interface utilisateur par lots utilisant une boîte de dialogue
de sélection de répertoire pour permettre à l'utilisateur
* de sélectionner le répertoire principal à partir duquel créer des actifs. Voir {@link FileSystemBatchDataSource}
* pour la structure attendue du répertoire principal. Fournit aussi des fournisseurs
* d'étiquette et de contenu de base.
*
* @author ebordeau
*/
public class FileSystemBatchUIContributor extends AbstractBatchUIContributor {
/**
* Crée une source de données en ouvrant une boîte de dialogue de sélection de répertoire
* duquel l'utilisateur peut sélectionner le répertoire principal.
*
* @see com.ibm.ram.batch.ui.AbstractBatchUIContributor#createNewDataSource(org.eclipse.swt.widgets.Shell)
*/
@Override
public BatchDataSource createNewDataSource(Shell shell) {
DirectoryDialog dialog = new DirectoryDialog(shell, SWT.NONE);
dialog.setMessage("Select root directory");
String dir = dialog.open();
if (dir != null)
return new FileSystemBatchDataSource(dir);
return null;
}
/**
* Renvoie un fournisseur de contenu qui ne fait rien car la source de données
* n'aura pas d'enfants.
*
* @see com.ibm.ram.batch.ui.AbstractBatchUIContributor#getContentProvider()
*/
@Override
public ITreeContentProvider getContentProvider() {
return new ITreeContentProvider() {
public Object[] getChildren(Object parentElement) {
return new Object[0];
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return false;
}
public Object[] getElements(Object inputElement) {
return new Object[0];
}
public void dispose() {}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
};
}
/**
* Renvoie un fournisseur d'étiquette qui fournit une icône et une étiquette pour le
* répertoire principal.
*
* @see com.ibm.ram.batch.ui.AbstractBatchUIContributor#getLabelProvider()
*/
@Override
public ILabelProvider getLabelProvider() {
return new LabelProvider() {
public Image getImage(Object element) {
if (element instanceof FileSystemBatchDataSource)
return ImageUtil.FOLDER_IMAGE;
return super.getImage(element);
}
public String getText(Object element) {
if (element instanceof FileSystemBatchDataSource)
return ((FileSystemBatchDataSource)element).getRootPath();
return super.getText(element);
}
};
}
}