/*******************************************************************************
* Copyright (c) 2007, 2016 Alphonse Van Assche.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alphonse Van Assche - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.ui.editor;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.linuxtools.internal.rpm.ui.editor.preferences.PreferenceConstants;
import org.eclipse.linuxtools.rpm.core.utils.Utils;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import org.osgi.framework.FrameworkUtil;
/**
* This class is used to retrieve and manage the RPM package proposals.
*
*/
public class RpmPackageProposalsList {
private final Set<String> list = new HashSet<>();
private IPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE,
FrameworkUtil.getBundle(RpmPackageProposalsList.class).getSymbolicName());
public RpmPackageProposalsList() {
String rpmpkgsFile = store.getString(PreferenceConstants.P_RPM_LIST_FILEPATH);
if (Files.exists(Paths.get(rpmpkgsFile))) {
try {
Set<String> newList = RpmPackageBuildProposalsJob.getPackages();
list.clear();
list.addAll(newList);
} catch (IOException e) {
RpmPackageBuildProposalsJob.update(true);
SpecfileLog.logError(e);
} catch (InterruptedException e) {
// ignore
}
} else {
RpmPackageBuildProposalsJob.update(true);
}
}
public List<String[]> getProposals(String prefix) {
int rpmpkgsMaxProposals = store.getInt(PreferenceConstants.P_RPM_LIST_MAX_PROPOSALS);
List<String[]> proposalsList = new ArrayList<>(list.size());
for (String listValue : list) {
String item[] = new String[2];
item[0] = listValue;
String message = Messages.RpmPackageProposalsList_0 + rpmpkgsMaxProposals
+ Messages.RpmPackageProposalsList_1;
item[1] = message;
if (item[0].startsWith(prefix)) {
proposalsList.add(item);
}
}
/*
* Show RPM informations only if the proposal list is less than the
* limit set in the RPM proposals preference page.
*/
if (proposalsList.size() < rpmpkgsMaxProposals) {
List<String[]> proposalsListWithInfo = new ArrayList<>(proposalsList.size());
for (String[] proposals : proposalsList) {
proposals[1] = getRpmInfo(proposals[0]);
proposalsListWithInfo.add(proposals);
}
return proposalsListWithInfo;
} else {
return proposalsList;
}
}
public String getValue(String key) {
for (String item : list) {
if (item.equals(key.trim())) {
return getRpmInfo(item);
}
}
return null;
}
public String getRpmInfo(String pkgName) {
String ret = ""; //$NON-NLS-1$
try {
ret = Utils.runCommandToString("rpm", "-q", pkgName, "--qf", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
getformattedRpmInformations());
} catch (IOException e) {
SpecfileLog.logError(e);
return Messages.RpmPackageProposalsList_2 + Messages.RpmPackageProposalsList_3;
}
// Create encoder and decoder
CharsetDecoder decoder = Charset.forName(System.getProperty("file.encoding")).newDecoder(); //$NON-NLS-1$
/*
* TODO: Jcharset may be used to detect the inputstream encoding if it's
* required? http://jchardet.sourceforge.net
*/
CharsetEncoder encoder = Charset.forName("ISO-8859-1").newEncoder(); //$NON-NLS-1$
try {
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(ret));
CharBuffer cbuf = decoder.decode(bbuf);
ret = cbuf.toString();
} catch (CharacterCodingException e) {
// If an error occurs when re-encoding the output, the original
// output is returned.
}
return ret;
}
private String getformattedRpmInformations() {
StringBuilder formatedInfoString = new StringBuilder();
if (store.getBoolean(PreferenceConstants.P_RPMINFO_NAME)) {
formatedInfoString.append("<b>Name: </b>%{NAME}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_VERSION)) {
formatedInfoString.append("<b>Version: </b>%{VERSION}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_RELEASE)) {
formatedInfoString.append("<b>Release: </b>%{Release}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_SUMMARY)) {
formatedInfoString.append("<b>Summary: </b>%{SUMMARY}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_LICENSE)) {
formatedInfoString.append("<b>License: </b>%{LICENSE}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_GROUP)) {
formatedInfoString.append("<b>Group: </b>%{GROUP}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_URL)) {
formatedInfoString.append("<b>URL: </b>%{URL}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_INSTALLTIME)) {
formatedInfoString.append("<b>Installation Date: </b>%{INSTALLTIME:date}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_DESCRIPTION)) {
formatedInfoString.append("<b>Description: </b>%{DESCRIPTION}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_PACKAGER)) {
formatedInfoString.append("<b>Packager: </b>%{PACKAGER}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_VENDOR)) {
formatedInfoString.append("<b>Vendor: </b>%{VENDOR}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_SIZE)) {
formatedInfoString.append("<b>Size: </b>%{SIZE} bytes<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_BUILDTIME)) {
formatedInfoString.append("<b>Build Date: </b>%{BUILDTIME:date}<br>"); //$NON-NLS-1$
}
if (store.getBoolean(PreferenceConstants.P_RPMINFO_SOURCERPM)) {
formatedInfoString.append("<b>SRPM: </b>%{SOURCERPM}<br>"); //$NON-NLS-1$
}
return formatedInfoString.toString();
}
}