package org.openflexo.script;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.openflexo.fib.FIBLibrary;
import org.openflexo.fib.model.FIBComponent;
import org.openflexo.fib.model.FIBContainer;
import org.openflexo.fib.model.FIBParameter;
import org.openflexo.toolbox.ResourceLocator;
public class VisibleForScript {
public static final boolean DRY_RUN = false;
private static final String[] FIB_EXTENSIONS = { "fib", "inspector" };
private void convert() {
Collection<File> fibs = FileUtils.listFiles(
ResourceLocator.findProjectDirectoryWithName(new File(System.getProperty("user.dir")), "openflexo"), FIB_EXTENSIONS, true);
for (File fib : fibs) {
convertFib(fib);
}
}
private void convertFib(File fib) {
if (fib.getName().endsWith("Prefs.inspector")) {
return;
}
LineIterator lineIterator;
try {
lineIterator = FileUtils.lineIterator(fib, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
return;
}
if (!lineIterator.hasNext() || !lineIterator.nextLine().startsWith("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")) {
System.err.println(fib.getAbsolutePath() + " is not a fib");
return;
}
FIBComponent fibComponent = FIBLibrary.instance().retrieveFIBComponent(fib);
if (fibComponent == null) {
System.err.println(fib.getAbsolutePath() + " could not be loaded");
return;
}
boolean changed = lookupAndFixVisibleFor(fibComponent, fibComponent);
if (changed) {
System.err.println(fib.getAbsolutePath() + " has changed");
if (DRY_RUN) {
FIBLibrary.saveComponentToStream(fibComponent, fib, new OutputStream() {
@Override
public void write(int b) throws IOException {
System.err.print((char) b);
}
});
} else {
FIBLibrary.save(fibComponent, fib);
}
}
}
private boolean lookupAndFixVisibleFor(FIBComponent root, FIBComponent fib) {
boolean changed = false;
String parameter = fib.getParameter("visibleFor");
if (parameter != null) {
FIBComponent label = root.getComponentNamed(fib.getName() + "Label");
if (label != null && label.getParameter("visibleFor") == null) {
label.addToParameters(new FIBParameter("visibleFor", parameter));
changed = true;
}
}
if (fib instanceof FIBContainer) {
for (FIBComponent child : ((FIBContainer) fib).getSubComponents()) {
changed |= lookupAndFixVisibleFor(root, child);
}
}
return changed;
}
public static void main(String[] args) {
new VisibleForScript().convert();
System.exit(0);
}
}