Re: refactoring
On Mon, 06 Aug 2007 22:03:10 -0000, andrewmcdonagh
<andrewmcdonagh@gmail.com> wrote, quoted or indirectly quoted someone
who said :
Feel free to post your original method if you'd like me to show you
what I mean using your code.
Here is the code I am trying to tidy up. Of course my mind goes blank
on all the other code I either tidied or attempted to tidy with a
similar "multiple outputs" problem.
This is a method from the static macros. It is used to expand
something like
<!-- macro Sun "JButton" docs/api/javax/swing/JButton.html -->
to
<div class="sun">Sun's Javadoc on the <span
class="jclass">JButton</span> class : available:
<ul>
<li>
<a class="offsite"
href="http://java.sun.com/javase/6/docs/api/javax/swing/JButton.html">on
the web at java.Sun.com</a></li>
<li>
<a
href="file://localhost/J:/Program%20Files/java/jdk1.6.0_02/docs/api/javax/swing/JButton.html">in
the JDK 1.6.0_02</a> or in the older <a
href="file://localhost/J:/Program%20Files/java/jdk1.5.0_12/docs/api/javax/swing/JButton.html">JDK
1.5.0_12</a> or the even older <a
href="file://localhost/J:/j2sdk1.4.2_15/docs/api/javax/swing/JButton.html">JDK
1.4.2_15</a> on your local <a class="plain" href="jdrive.html">J:
drive</a>.</li>
</ul>
</div>
/**
* guts to Generate reference to a Sun HTML document.
*
* @param fileBeingProcessed File being processed that contains
the macro to
* be expanded.
* @param desc human descriptinon of what it is.
* @param ref reference e.g
api/java/awt/package-summary.html
* /s or \s. Generates
http://java.sun.com/j2se/1.6.0/docs/api/java/awt/package-summary.html
*
* @return expand href both to on-line and local.
*
* @noinspection WeakerAccess
*/
public static String expand( File fileBeingProcessed,
String desc,
String ref )
{
/* chop lead / if any */
char firstChar = ref.charAt( 0 );
if ( firstChar == '/' || firstChar == File.separatorChar )
{
ref = ref.substring( 1 );
}
/** reference with / instead of File.separatorChar . partial
or complete url.
* May be extended in following code.
*/
String refWithSlashes = ref.replace( File.separatorChar, '/'
);
/**
* short description with bold html applied.
*/
final String boldDesc = "<b>" + desc + "</b>";
/**
* expanded description
*/
final String longDesc;
/**
* Are the docs also locally available in the recent JDK docs?
*
* JDK 1.6 has directories api, jdk, jre, legal, platform,
technotes
* jdk 1.5 guide*, relnotes*, tooldocs*, no longer avail.
Still has api.
*/
final boolean localRecent;
/**
* Are the docs available in old locally available JDK docs?
*/
final boolean localOld;
/**
* true on Sun's site is this a reference to the
* http://java.sun.com/javase/6/ directory.
* False, implies http://java.sun.com/
*/
final boolean javase6;
// expand forms where don't supply full URL.
refWithSlashes = expandAbbreviations( refWithSlashes );
// deal with long forms
if ( refWithSlashes.startsWith( "docs" ) )
{
if ( refWithSlashes.startsWith( "docs/books" ) )
{
// Only on sun site, not local.
javase6 = false;
localOld = false;
localRecent = false;
if ( refWithSlashes.startsWith( "docs/books/codeconv"
) )
{
longDesc = "Sun's Coding Conventions on " +
boldDesc;
}
else if ( refWithSlashes.startsWith( "docs/books/jls"
) )
{
longDesc =
"Sun's JLS (<b>J</b>ava <b>L</b>anguage
<b>S</b>pecification) on "
+ boldDesc;
}
else if ( refWithSlashes.startsWith( "docs/books/jni"
) )
{
longDesc =
"Sun's JNI (<b>J</b>ave <b>N</b>anive
<b>I</b>nterface) Specification on "
+ boldDesc;
}
else if ( refWithSlashes.startsWith(
"docs/books/tutorial" ) )
{
longDesc = "Sun's tutorial on " + boldDesc;
}
else if ( refWithSlashes.startsWith(
"docs/books/vmspec" ) )
{
longDesc =
"Sun's VM (<b>V</b>irtual <b>M</b>achine)
Specification on "
+ boldDesc;
}
else
{
longDesc = "Sun's Book on " + boldDesc;
}
}// end books
else if ( refWithSlashes.startsWith( "docs/api/" ) )
{
// strip any leading the and trailing class
desc = StringTools.removeHead( desc, "the " );
desc = StringTools.removeTail( desc, " class" );
// apply styles to class/method name
final int dotPlace = desc.indexOf( '.' );
final String decoratedDesc;
if ( dotPlace < 0 )
{
decoratedDesc =
"the <span class=\"jclass\">"
+ desc
+ "</span> class";
}
else
{
final String firstPart = desc.substring( 0,
dotPlace );
final boolean firstIsClass =
firstPart.length() <= 0 ||
Character.isUpperCase(
firstPart.charAt( 0 ) );
final String secondPart = desc.substring( dotPlace
+ 1 );
final boolean secondIsClass =
secondPart.length() <= 0 ||
Character.isUpperCase(
secondPart.charAt( 0 ) );
// don't insert words class and methods, since
obvious from dot.
decoratedDesc =
"<span class=\""
+ ( firstIsClass ? "jclass" : "jmethod" )
+ "\">"
+ firstPart
+ "</span>.<span class=\""
+ ( secondIsClass ? "jclass" : "jmethod" )
+ "\">"
+ secondPart
+ "</span>";
}
javase6 = true;
localOld = true;
localRecent = true;
longDesc = "Sun's Javadoc on " + decoratedDesc;
}
else if ( refWithSlashes.startsWith( "docs/codeconv" ) )
{
javase6 = false;
localRecent = false;
localOld = false;
longDesc = "Sun's Coding Conventions on " + boldDesc;
}
else if ( refWithSlashes.startsWith( "docs/jdk" ) )
{
javase6 = true;
localRecent = true;
localOld = false;
longDesc = "Sun's JDK Guide to " + boldDesc;
}
else if ( refWithSlashes.startsWith( "docs/jre" ) )
{
javase6 = true;
localOld = true;
localRecent = false;
longDesc = "Sun's JRE Guide to " + boldDesc;
}
else if ( refWithSlashes.startsWith( "docs/legal" ) )
{
javase6 = true;
localOld = false;
localRecent = true;
longDesc = "Sun's Legal Guide to " + boldDesc;
}
else if ( refWithSlashes.startsWith( "docs/platform" ) )
{
javase6 = true;
localOld = false;
localRecent = true;
longDesc = "Sun's JDK Platform Guide to " + boldDesc;
}
else if ( refWithSlashes.startsWith( "docs/technotes/" ) )
{
if ( refWithSlashes.startsWith(
"docs/technotes/guides/" ) )
{
javase6 = true;
localOld = false;
localRecent = true;
longDesc = "Sun's JDK Guide to " + boldDesc;
}
else if ( refWithSlashes.startsWith(
"docs/technotes/tools/" ) )
{
javase6 = true;
localOld = false;
localRecent = true;
if ( desc.endsWith( ".exe" ) )
{
longDesc =
"Sun's JDK Tool Guide to <span
class=\"exe\">"
+ desc
+ "</span>";
}
else
{
longDesc = "Sun's JDK Tool Guide to " +
boldDesc;
}
}
else
{
/** css, samples */
javase6 = true;
localOld = false;
localRecent = true;
longDesc = "Sun's JDK Technotes on " + boldDesc;
}
}// end technotes
else if ( refWithSlashes.startsWith( "docs/index.html" ) )
{
javase6 = true;
localOld = true;
localRecent = true;
longDesc = boldDesc;
}
else
{
throw new IllegalArgumentException( "Sun macro bad
reference "
+ refWithSlashes
);
}
}// end docs
else if ( refWithSlashes.startsWith( "guide/" ) )
{
// not same as technotes/guides
javase6 = false;
localOld = false;
localRecent = false;
longDesc = "Sun's Guide to " + boldDesc;
}
else if ( refWithSlashes.startsWith( "products/" ) )
{
javase6 = false;
localOld = false;
localRecent = false;
longDesc = "Sun's Product Info on " + boldDesc;
}
else if ( refWithSlashes.startsWith( "webnotes/" ) )
{
javase6 = true;
localOld = false;
localRecent = false;
longDesc = "Sun's Release notes on " + boldDesc;
}
else
{
// eg. j2ee
javase6 = false;
localOld = false;
localRecent = false;
longDesc = "Sun's documentation on " + boldDesc;
}
return buildSunLinks( refWithSlashes,
localRecent,
longDesc,
javase6,
localOld,
fileBeingProcessed );
}
extracting the giant If does not really make the code all that
clearer. Somehow breaking up the giant if should be higher priority.
--
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com