package net.sf.eclipsefp.haskell.core.cabalmodel; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import net.sf.eclipsefp.haskell.core.HaskellCorePlugin; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * * @author JP Moresmau * */ public class JSONDescriptionHelper { public static final String COND_EXECUTABLES="condExecutables"; //$NON-NLS-1$ public static final String COND_LIBRARY="condLibrary"; //$NON-NLS-1$ public static final String COND_TREE_CONSTRAINTS="condTreeConstraints"; //$NON-NLS-1$ public static final String COND_TREE_COMPONENTS="condTreeComponents"; //$NON-NLS-1$ public static final String JUST="Just"; //$NON-NLS-1$ public static Set<String> getNames(final Collection<JSONArray> components) { Set<String> ret=new HashSet<>(); for (JSONArray arr:components){ try { ret.add(arr.getString( 0 )); } catch (JSONException je){ HaskellCorePlugin.log( je ); } } return ret; } public static List<JSONArray> getExecutables(final JSONObject description) { Object o=description.opt( COND_EXECUTABLES); List<JSONArray> ret=new ArrayList<>(); if (o instanceof JSONArray){ JSONArray arr=(JSONArray)o; for (int a=0;a<arr.length();a++){ Object o2=arr.opt( a ); if (o2 instanceof JSONArray){ ret.add((JSONArray)o2); } } } return ret; } public static boolean hasLibrary(final JSONObject description) { Object o=description.opt( COND_LIBRARY); return o instanceof JSONObject; } public static List<JSONArray> getDependencies(final JSONArray arr){ if (arr!=null){ return getDependencies(arr.optJSONObject( 1 )); } return Collections.emptyList(); } public static List<JSONArray> getDependencies(final JSONObject description){ List<JSONArray> ret=new ArrayList<>(); if (description!=null){ for (JSONArray arr:getExecutables(description)){ ret.addAll( getDependencies( arr ) ); } Object o=description.opt( COND_LIBRARY); if (o instanceof JSONObject){ ret.addAll(getDependencies( ((JSONObject)o).optJSONObject( JUST ) )); } JSONArray arr2=description.optJSONArray( COND_TREE_COMPONENTS); if (arr2!=null){ for (int b=0;b<arr2.length();b++){ ret.addAll(getDependencies( arr2.optJSONArray( b ) )); } } try { arr2=description.optJSONArray(COND_TREE_CONSTRAINTS ); if (arr2!=null){ for (int b=0;b<arr2.length();b++){ ret.add(arr2.getJSONArray( b )); } } } catch (JSONException je){ HaskellCorePlugin.log( je ); } } return ret; } }