// **********************************************************************
//
// <copyright>
//
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source: /cvs/distapps/openmap/src/corba/com/bbn/openmap/layer/specialist/dted/DTEDCoverageSpecialist.java,v $
// $RCSfile: DTEDCoverageSpecialist.java,v $
// $Revision: 1.9 $
// $Date: 2009/02/23 22:37:32 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.layer.specialist.dted;
/* Java Core */
import java.awt.Color;
import java.io.File;
import java.util.Properties;
import java.util.StringTokenizer;
import org.omg.CORBA.StringHolder;
import com.bbn.openmap.corba.CSpecialist.CProjection;
import com.bbn.openmap.corba.CSpecialist.GraphicChange;
import com.bbn.openmap.corba.CSpecialist.LLPoint;
import com.bbn.openmap.corba.CSpecialist.UGraphic;
import com.bbn.openmap.corba.CSpecialist.XYPoint;
import com.bbn.openmap.corba.CSpecialist.CColorPackage.EColor;
import com.bbn.openmap.corba.CSpecialist.GraphicPackage.EGraphic;
import com.bbn.openmap.corba.CSpecialist.RectanglePackage.ERectangle;
import com.bbn.openmap.layer.dted.DTEDCoverageManager;
import com.bbn.openmap.layer.dted.DTEDFrameColorTable;
import com.bbn.openmap.layer.specialist.MakeProjection;
import com.bbn.openmap.layer.specialist.SGraphic;
import com.bbn.openmap.layer.specialist.Specialist;
import com.bbn.openmap.omGraphics.OMGraphic;
import com.bbn.openmap.omGraphics.OMGraphicList;
import com.bbn.openmap.omGraphics.OMRect;
import com.bbn.openmap.proj.Projection;
import com.bbn.openmap.util.Debug;
/**
* HACK: this specialist copies functionality from the DTEDCoverageLayer.
*/
public class DTEDCoverageSpecialist
extends Specialist {
/** The paths to the DTED directories, telling where the data is. */
protected String[] paths = {
"/mnt/cdrom/dted",
"/mnt/disk/dted"
};
/** Flag to tell the cache to return the coverage for level 0 dted. */
protected boolean showDTEDLevel0 = true;
/** Flag to tell the cache to return the coverage for level 1 dted. */
protected boolean showDTEDLevel1 = true;
/** Flag to tell the cache to return the coverage for level 0 dted. */
protected boolean showDTEDLevel2 = true;
/** The default line color for level 0. */
public final static Color defaultLevel0Color = new Color(0xCE4F3F); // redish
/** The default line color for level 1. */
public final static Color defaultLevel1Color = new Color(0x339159); // greenish
/** The default line color for level 2. */
public final static Color defaultLevel2Color = new Color(0x0C75D3); // bluish
/** The color to outline the shapes for level 0. */
protected Color level0Color = defaultLevel0Color;
/** The color to outline the shapes for level 1. */
protected Color level1Color = defaultLevel1Color;
/** The color to outline the shapes for level 2. */
protected Color level2Color = defaultLevel2Color;
/**
* A setting for how transparent to make the images. The default is 255,
* which is totally opaque.
*/
protected int opaqueness = DTEDFrameColorTable.DEFAULT_OPAQUENESS;
/** Flag to fill the coverage rectangles. */
protected boolean fillRects = false;
/**
* Location of coverage summary file. If it doesn't exists, one will be
* created here for later use.
*/
protected String coverageFile = "/mnt/disk/coverage.dted";
/**
* Location of coverage summary file, if supplied as a URL. If it doesn't
* exists, a coverage file will be used instead.
*/
protected String coverageURL = null;
protected DTEDCoverageManager coverageManager = null;
/** The array of coverage for level 0 data. */
protected boolean[][] level0Frames = new boolean[180][360];
/** The array of coverage for level 1 data. */
protected boolean[][] level1Frames = new boolean[180][360];
/** The array of coverage for level 2 data. */
protected boolean[][] level2Frames = new boolean[180][360];
// private final static transient String showLevel0Command =
// "showLevel0";
// private final static transient String showLevel1Command =
// "showLevel1";
// private final static transient String showLevel2Command =
// "showLevel2";
private final static transient XYPoint nullP1 = new XYPoint((short) 0, (short) 0);
/** The property describing the locations of level 0 and 1 data. */
public static final String DTEDPathsProperty = ".paths";
/** Property setting to show level 0 data on startup. */
public static final String ShowLevel0Property = ".level0.showcov";
/**
* Property to use to change the color for coverage of level 0 data.
*/
public static final String Level0ColorProperty = ".level0.color";
/** Property setting to show level 1 data on startup. */
public static final String ShowLevel1Property = ".level1.showcov";
/**
* Property to use to change the color for coverage of level 1 data.
*/
public static final String Level1ColorProperty = ".level1.color";
/** Property setting to show level 2 data on startup. */
public static final String ShowLevel2Property = ".level2.showcov";
/**
* Property to use to change the color for coverage of level 2 data.
*/
public static final String Level2ColorProperty = ".level2.color";
/** Property to use for filled rectangles (when java supports it). */
public static final String OpaquenessProperty = ".opaque";
/** Property to use to fill rectangles. */
public static final String FillProperty = ".fill";
/**
* The file to read/write coverage summary. If it doesn't exist here, it will
* be created and placed here.
*/
public static final String CoverageFileProperty = ".coverageFile";
/**
* A URL to read coverage summary. If it doesn't exist, the coverage file
* will be tried.
*/
public static final String CoverageURLProperty = ".coverageURL";
/**
* The default constructor for the Layer. All of the attributes are set to
* their default values.
*/
public DTEDCoverageSpecialist() {
super("DTEDCoverageSpecialist", (short) 2, false);
}
protected void init() {
System.out.println("DTEDCoverageSpecialist: Figuring out which DTED frames exist! (This is a one-time operation!)");
System.out.println("Scanning for frames - This could take over (2) minutes!");
coverageManager = new DTEDCoverageManager(paths);
}
/**
* Set all the DTED properties from a properties object.
*
* @param prefix string prefix used in the properties file for this layer.
* @param properties the properties set in the properties file.
*/
public void setProperties(String prefix, java.util.Properties properties) {
paths = initPathsFromProperties(properties.getProperty(prefix + DTEDPathsProperty));
coverageFile = properties.getProperty(prefix + CoverageFileProperty);
coverageURL = properties.getProperty(prefix + CoverageURLProperty);
String fillString = properties.getProperty(prefix + FillProperty);
if (fillString != null)
fillRects = Boolean.valueOf(fillString).booleanValue();
String opaqueString = properties.getProperty(prefix + OpaquenessProperty);
try {
opaqueness = Integer.valueOf(opaqueString).intValue();
} catch (NumberFormatException e) {
System.err.println("Unable to parse " + OpaquenessProperty + " = " + opaqueString);
opaqueness = DTEDFrameColorTable.DEFAULT_OPAQUENESS;
}
level0Color = parseColor(properties, prefix + Level0ColorProperty, defaultLevel0Color);
level1Color = parseColor(properties, prefix + Level1ColorProperty, defaultLevel1Color);
level2Color = parseColor(properties, prefix + Level2ColorProperty, defaultLevel2Color);
String showLevel0String = properties.getProperty(prefix + ShowLevel0Property);
if (showLevel0String != null)
showDTEDLevel0 = Boolean.valueOf(showLevel0String).booleanValue();
String showLevel1String = properties.getProperty(prefix + ShowLevel1Property);
if (showLevel1String != null)
showDTEDLevel1 = Boolean.valueOf(showLevel1String).booleanValue();
String showLevel2String = properties.getProperty(prefix + ShowLevel2Property);
if (showLevel2String != null)
showDTEDLevel2 = Boolean.valueOf(showLevel2String).booleanValue();
}
/**
* Takes a String of File.separator separated paths, and returns an array of
* strings instead.
*
* @param rawPaths the string of paths separated by a File.separator.
* @return Array of strings representing paths to dted directories.
*/
protected String[] initPathsFromProperties(String rawPaths) {
String[] retPaths = null;
if (rawPaths != null) {
try {
StringTokenizer token = new StringTokenizer(rawPaths, File.pathSeparator);
int numPaths = token.countTokens();
retPaths = new String[numPaths];
for (int i = 0; i < numPaths; i++) {
retPaths[i] = token.nextToken();
}
return retPaths;
} catch (java.util.NoSuchElementException e) {
e.printStackTrace();
}
}
return retPaths;
}
/**
* Take a string, representing the hex values for a color, and convert it to
* a java Color.
*
* @param p properties.
* @param propName the name of the property.
* @param dfault the default color to use if the property value doesn't work.
* @return the java Color.
*/
protected Color parseColor(Properties p, String propName, Color dfault) {
String colorString = p.getProperty(propName);
if (colorString == null) {
return dfault;
} else {
try {
return parseColor(colorString);
} catch (NumberFormatException e) {
System.err.println("Unparseable number \"" + colorString + "\" in property \"" + propName + "\"");
return dfault;
}
}
}
/**
* Take a string, representing the hex values for a color, and convert it to
* a java Color.
*
* @param colorString the hex string value (RGB)
* @return the java Color.
*/
protected Color parseColor(String colorString)
throws NumberFormatException {
// parse color as hexidecimal RGB value
int colorSpec = Integer.parseInt(colorString, 16);
if (colorSpec < 0) {
return OMGraphic.clear;
} else {
return new Color(colorSpec);
}
}
public UGraphic[] fillRectangle(CProjection p, LLPoint ll1, LLPoint ll2, String staticArgs, StringHolder dynamicArgs,
GraphicChange notifyOnChange, String uniqueID) {
System.out.println("DTEDCoverageSpecialist.fillRectangle()");
Projection proj = MakeProjection.getProjection(p);
OMGraphicList omGraphicLists = coverageManager.getCoverageRects(proj);
// ///////////////////
// safe quit
if (omGraphicLists != null) {
UGraphic[] level0UGraphics = new UGraphic[] {};
UGraphic[] level1UGraphics = new UGraphic[] {};
UGraphic[] level2UGraphics = new UGraphic[] {};
if (showDTEDLevel0) {
level0UGraphics = createUGraphics((OMGraphicList) omGraphicLists.get(0));
}
if (showDTEDLevel1) {
level1UGraphics = createUGraphics((OMGraphicList) omGraphicLists.get(1));
}
if (showDTEDLevel2) {
level2UGraphics = createUGraphics((OMGraphicList) omGraphicLists.get(2));
}
UGraphic[] ugraphics = new UGraphic[level0UGraphics.length + level1UGraphics.length + level2UGraphics.length];
int off = 0;
System.arraycopy(level0UGraphics, 0, ugraphics, off, level0UGraphics.length);
off += level0UGraphics.length;
System.arraycopy(level1UGraphics, 0, ugraphics, off, level1UGraphics.length);
off += level1UGraphics.length;
System.arraycopy(level2UGraphics, 0, ugraphics, off, level2UGraphics.length);
System.out.println("DTEDCoverageSpecialist.fillRectangle(): returning " + ugraphics.length + " graphics");
return ugraphics;
} else {
System.out.println("DTEDCoverageSpecialist.fillRectangle(): finished with null graphics list");
return new UGraphic[0];
}
}
public void signOff(String uniqueID) {
System.out.println("DTEDCoverageSpecialist.signOff()");
}
protected UGraphic[] createUGraphics(OMGraphicList omgraphics) {
int len = omgraphics.size();
UGraphic[] ugraphics = new UGraphic[len];
ERectangle er;
OMGraphic gr;
OMRect omr;
int lineColor, fillColor;
EGraphic eg;
UGraphic ug;
for (int i = 0; i < len; i++) {
gr = omgraphics.getOMGraphicAt(i);
if (gr instanceof OMRect) {
omr = (OMRect) gr;
eg = SGraphic.createEGraphic();
lineColor = omr.getLineColor().getRGB();
eg.color =
new EColor(null, (short) ((lineColor & 0xff0000) >> 8), (short) (lineColor & 0x00ff00),
(short) ((lineColor & 0x0000ff) << 8));
if (fillRects) {
fillColor = omr.getFillColor().getRGB();
eg.fillColor =
new EColor(null, (short) ((fillColor & 0xff0000) >> 8), (short) (fillColor & 0x00ff00),
(short) ((fillColor & 0x0000ff) << 8));
}
er =
new ERectangle(eg, nullP1, nullP1, new LLPoint((float) omr.getNorthLat(), (float) omr.getWestLon()),
new LLPoint((float) omr.getSouthLat(), (float) omr.getEastLon()));
ug = new UGraphic();
ug.erect(er);
ugraphics[i] = ug;
} else {
// Deal with embeded OMGraphicList. HACK this is
// inefficient if there are a bunch of embedded
// OMGrahicLists...
UGraphic[] x_ugraphics = createUGraphics((OMGraphicList) gr);
len = x_ugraphics.length + ugraphics.length - 1;
UGraphic[] new_ugraphics = new UGraphic[len];
System.arraycopy(ugraphics, 0, new_ugraphics, 0, i);
System.arraycopy(x_ugraphics, 0, new_ugraphics, i, x_ugraphics.length);
i += x_ugraphics.length;
ugraphics = new_ugraphics;
}
}
return ugraphics;
}
public void printHelp() {
System.err.println("usage: java [java/vbj args] <specialist class> [specialist args]");
System.err.println("");
System.err.println(" Java Args:");
System.err.println(" -mx<NUM>m Set max Java heap in Megs");
System.err.println(" ...");
System.err.println("");
System.err.println(" VBJ Args:");
System.err.println(" -DORBmbufSize=4194304 Define the VBJ buffer size");
System.err.println(" -DORBdebug Enable VBJ debugging");
System.err.println(" ...");
System.err.println("");
System.err.println(" Specialist Args:");
System.err.println(" -ior <iorfile> IOR file (MUST SPECIFY)");
System.err.println(" -covfile <covfile> Coverage file (R/W)");
System.err.println(" -dtedpaths \"<path1> ...\" Path to search for DTED data");
System.err.println(" -dted2paths \"<path1> ...\" Path to search for DTED level2 data");
System.exit(1);
}
private String[] getPaths(String str) {
StringTokenizer tok = new StringTokenizer(str);
int len = tok.countTokens();
String[] paths = new String[len];
for (int j = 0; j < len; j++) {
paths[j] = tok.nextToken();
}
return paths;
}
public void parseArgs(String[] args) {
for (int i = 0; i < args.length; i++) {
if (args[i].equalsIgnoreCase("-dtedpaths")) {
paths = getPaths(args[++i]);
} else if (args[i].equalsIgnoreCase("-covfile")) {
coverageFile = args[++i];
}
}
super.parseArgs(args);
}
public static void main(String[] args) {
Debug.init(System.getProperties());
// Create the specialist server
DTEDCoverageSpecialist srv = new DTEDCoverageSpecialist();
srv.parseArgs(args);
srv.init();
srv.start(null);
}
}