/**
* Horoscope.java
*
* Created on December 14, 2002, 12:17 PM
* @author E. Rajasekar
*/
package app.astrosoft.core;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.logging.Logger;
import java.util.prefs.PreferenceChangeEvent;
import java.util.prefs.PreferenceChangeListener;
import org.w3c.dom.Document;
import swisseph.SweDate;
import app.astrosoft.beans.BirthData;
import app.astrosoft.beans.HousePosition;
import app.astrosoft.beans.NakshathraPada;
import app.astrosoft.beans.Place;
import app.astrosoft.beans.PlanetaryInfo;
import app.astrosoft.consts.AstrosoftTableColumn;
import app.astrosoft.consts.Ayanamsa;
import app.astrosoft.consts.DisplayStrings;
import app.astrosoft.consts.Paksha;
import app.astrosoft.consts.Planet;
import app.astrosoft.consts.Rasi;
import app.astrosoft.consts.Sex;
import app.astrosoft.consts.Thithi;
import app.astrosoft.consts.Varga;
import app.astrosoft.consts.Yoga;
import app.astrosoft.export.Exportable;
import app.astrosoft.export.Exporter;
import app.astrosoft.export.XMLHelper;
import app.astrosoft.pref.AstrosoftPref;
import app.astrosoft.ui.AstroSoft;
import app.astrosoft.ui.table.DefaultColumnMetaData;
import app.astrosoft.ui.table.DefaultTable;
import app.astrosoft.ui.table.MapTableRow;
import app.astrosoft.ui.table.MapTableRowHelper;
import app.astrosoft.ui.table.Table;
import app.astrosoft.ui.table.TableData;
import app.astrosoft.ui.table.TableDataFactory;
import app.astrosoft.util.AstroUtil;
import app.astrosoft.util.SwissHelper;
import app.astrosoft.xps.yoga.YogaFinder;
import app.astrosoft.xps.yoga.YogaResults;
public class Horoscope implements PreferenceChangeListener , Exportable {
private static final Logger log = Logger.getLogger(Horoscope.class.getName());
private BirthData birthData;
private SwissHelper swissHelper;
private double ayanamsa;
private double sunrise;
private double sunset;
private HousePosition housePosition;
private PlanetaryInfo planetaryInfo;
private Vimshottari vimDasa;
private Ashtavarga ashtaVarga;
private Thithi thithi;
private Paksha pak;
private Yoga yoga;
private ShadBala shadBala;
private TableData<MapTableRow> infoTableData;
private static DefaultColumnMetaData infoTableColumnMetaData;
private String title;
private boolean isBirthAtDay;
private YogaResults yogaCombinations;
/** Creates a new instance of Horoscope */
public Horoscope(String name, int date, int month, int year, int hr,
int min, Place place) {
this(new BirthData(name, date, month, year, hr, min, 0, place));
}
public Horoscope(String name, int date, int month, int year, int hr,
int min, double longi, double lati, double tz, String place) {
this(name, date, month, year, hr, min, new Place(place, lati, longi, tz));
}
public Horoscope(BirthData birthData){
this.birthData = birthData;
swissHelper = new SwissHelper(birthData.birthSD());
AstroSoft.getPreferences().addPreferenceChangeListener(this);
// sw.swe_set_ephe_path( "d\\:\\\\AstroSoft" );
calculate();
}
/**
* Constructs Horoscope from file. Returns null if file formatter is invalid.
*
* @param file
* @return Horoscope
*/
public static Horoscope createFromFile(String file) {
Horoscope h = null;
try{
//h = valueOfXMLNode(XMLHelper.parseXML(file).getChildNodes().item(0));
h = new Horoscope(BirthData.valueOfXMLNode(XMLHelper.parseXML(file).getChildNodes().item(0)));
}catch(NullPointerException e){
System.out.println(e);
}
if (h != null){
return h;
}
//TODO: Fall through to read old file format. remove it once all files are converted
try {
if (file == null) {
return null;
}
File f = new File(file);
FileInputStream fis = new FileInputStream(f);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String name = br.readLine();
int date = Integer.parseInt(br.readLine());
int month = Integer.parseInt(br.readLine());
int year = Integer.parseInt(br.readLine());
int hr = Integer.parseInt(br.readLine());
int min = Integer.parseInt(br.readLine());
double longi = Double.parseDouble(br.readLine());
double lati = Double.parseDouble(br.readLine());
double tz = Double.parseDouble(br.readLine());
String city = br.readLine();
Place place = new Place(city, lati, longi, tz);
fis.close();
h = new Horoscope(name, date, month, year, hr, min, place);
//Save as new format.
h.saveToFile(file);
} catch (Exception e) {
return null;
}
return h;
}
/*public static Horoscope valueOfXMLNode(Node horoscopeNode){
return new Horoscope(BirthData.valueOfXMLNode(horoscopeNode.getChildNodes().item(0)));
}*/
/*public Element toXMLElement(Document doc, String elementName){
Element horElement = doc.createElement(elementName);
horElement.appendChild(birthData.toXMLElement(doc));
return horElement;
}*/
public void saveToFile(String fileName) {
Document doc = XMLHelper.createDOM();
//doc.appendChild(toXMLElement(doc, StringConsts.Horoscope.toString()));
doc.appendChild(birthData.toXMLElement(doc));
XMLHelper.saveXML(doc, fileName);
}
public void calculate() {
calcPlanetaryInfo();
//calcDashaBhukthis();
//calcAshtaVarga();
calcDetails();
//TODO: Remove it after all testing
//calcShadBala();
//Reset lazy objects to null to get values updated
infoTableData = null;
}
public void calculateAll() {
calculate();
calcDashaBhukthis();
calcAshtaVarga();
calcShadBala();
}
public void setAyanamsa(Ayanamsa ayanamsa) {
swissHelper.setAyanamsa(ayanamsa);
calculateAll();
}
private void calcSunRiseSet() {
sunrise = AstroUtil.getSunRise(birthData.year(), birthData.month(), birthData.date(),
birthData.longitude(), birthData.latitude(), birthData.timeZone());
sunset = AstroUtil.getSunSet(birthData.year(), birthData.month(), birthData.date(),
birthData.longitude(), birthData.latitude(), birthData.timeZone());
if ((birthData.birthTime() > sunrise)
&& (birthData.birthTime() < sunset)) {
isBirthAtDay = true;
} else {
isBirthAtDay = false;
}
}
public void calcHousePositions() {
housePosition = swissHelper.calcHousePosition(birthData.longitude(), birthData.latitude());
}
public void calcPlanetaryInfo() {
calcHousePositions();
EnumMap<Planet, Double> planetaryPosition = swissHelper.getPlanetaryPosition();
planetaryInfo = new PlanetaryInfo(planetaryPosition, swissHelper.getPlanetDirection(), housePosition);
ayanamsa = swissHelper.getAyanamsa();
}
public void calcDashaBhukthis() {
vimDasa = new Vimshottari(getPlanetaryPosition(Planet.Moon), birthData.birthDay());
/*setVimDasha(v.getDashaString());
setCurrentDasha(v.getCurrentDasha());
setBirthDasaLord(v.getBirthDasaLord());
setDasaBal(v.getDasaBal());*/
}
public void calcAshtaVarga() {
ashtaVarga= new Ashtavarga(getDivChart(Varga.Rasi));
}
private void calcDetails() {
calcSunRiseSet();
thithi = Thithi.ofDeg(getPlanetaryPosition(Planet.Sun), getPlanetaryPosition(Planet.Moon));
pak = Paksha.ofDeg(getPlanetaryPosition(Planet.Sun), getPlanetaryPosition(Planet.Moon));
yoga = Yoga.ofDeg(getPlanetaryPosition(Planet.Sun), getPlanetaryPosition(Planet.Moon));
}
private void calcShadBala() {
if (birthData.year() < 1900){
log.warning("Year should be less than 1900");
}else{
shadBala = new ShadBala(planetaryInfo, housePosition, birthData, ayanamsa, sunrise, sunset, getPaksha());
}
}
public void preferenceChange(PreferenceChangeEvent evt) {
/*if(evt.getKey().equals(AstrosoftPref.Preference.Ayanamsa.name())){
setAyanamsa(Enum.valueOf(Ayanamsa.class, evt.getNewValue()));
}else */
if(evt.getKey().equals(AstrosoftPref.Preference.Language.name())){
this.languageChanged();
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
int i = 0;
sb.append("\n");
//sb.append("cp " + getCurrentDasa());
sb.append("\n");
sb.append("Bhava\n");
sb.append(housePosition);
sb.append("\n");
sb.append("Planetary Info\n");
sb.append(planetaryInfo);
sb.append("\n");
sb.append("Thithi " + thithi
+ " Paksha " + pak);
sb.append("\n");
sb.append("AshtaVarga \n");
sb.append(ashtaVarga);
sb.append("\n");
sb.append("ShadBala \n");
sb.append(shadBala);
sb.append("\n");
sb.append("Dasas\n");
int j = 0;
int k = 0;
/*for ( i = 0; i < 9; i++ ) {
for ( j = 0; j < 9; j++ ) {
for ( k = 0; k < 9; k++ )
sb.append( getVimDasha()[i][j][k] + "\t");
sb.append("\n");
}
sb.append("\n");
}*/
sb.append(vimDasa);
sb.append("\n");
return sb.toString();
}
public HousePosition getHousePosition() {
return housePosition;
}
public BirthData getBirthData() {
return birthData;
}
public SweDate getBirthSD() {
return birthData.birthSD();
}
public String getPersonName(){
return birthData.name();
}
public Rasi getAscendant(){
return housePosition.getAscendant();
}
public Rasi getRasi() {
return planetaryInfo.getPlanetRasi().get(Planet.Moon);
}
public NakshathraPada getNakshathra() {
return planetaryInfo.getPlanetNakshathra().get(Planet.Moon);
}
public PlanetaryInfo getPlanetaryInfo() {
return planetaryInfo;
}
public EnumMap<Planet, Double> getPlanetaryPosition(){
return planetaryInfo.getPlanetPosition();
}
public Double getPlanetaryPosition(Planet planet){
return planetaryInfo.getPlanetPosition(planet);
}
public EnumMap<Planet, Integer> getPlanetaryLocation(){
return planetaryInfo.getPlanetLocation();
}
public int getPlanetaryLocation(Planet p) {
return planetaryInfo.getPlanetLocation().get(p);
}
public EnumMap<Planet, Rasi> getPlanetRasis() {
return planetaryInfo.getPlanetRasi();
}
public EnumMap<Planet, Boolean> getPlanetDirection() {
return planetaryInfo.getPlanetDirection();
}
public EnumMap<Varga, EnumMap<Planet, Integer>> getDivChart() {
return planetaryInfo.getDivChart();
}
public EnumMap<Planet, Integer> getDivChart(Varga varga) {
return planetaryInfo.getDivChart(varga);
}
public Thithi getThithi() {
return thithi;
}
public Paksha getPaksha() {
return pak;
}
public Yoga getYoga() {
return yoga;
}
public double getAyanamsa() {
return ayanamsa;
}
public double getSunrise() {
return sunrise;
}
public double getSunset() {
return sunset;
}
public boolean isBirthAtDay() {
return isBirthAtDay;
}
public Sex getPersonSex(){
return birthData.sex();
}
public YogaResults getYogaCombinations() {
if (yogaCombinations == null){
yogaCombinations = YogaFinder.getInstance().findYogas(this);
}
return yogaCombinations;
}
public ShadBala getShadBala() {
if (shadBala == null){
calcShadBala();
}
return shadBala;
}
public Ashtavarga getAshtaVarga() {
if (ashtaVarga == null){
calcAshtaVarga();
}
return ashtaVarga;
}
/**
* @return Returns the dasaBal.
*/
public String getDasaBal() {
return getVimshottariDasa().getBalance();
}
/**
* @param vimDasa The vimDasa to set.
private void setVimDasha(String[][][] vimDasa) {
this.vimDasha = vimDasa;
}*/
/**
* @return Returns the vimDasa.
*/
public Vimshottari getVimshottariDasa() {
if (vimDasa == null){
calcDashaBhukthis();
}
return vimDasa;
}
/**
* @return Returns the currentDasha.
*/
public String getCurrentDasa() {
VimDasa current = (VimDasa)getVimshottariDasa().getCurrent();
if (current != null){
return current.fullDasa();
}else{
return "No";
}
}
public TableData<MapTableRow> getInfoTableData() {
if(infoTableData == null){
List<MapTableRow> rows = new ArrayList<MapTableRow>();
MapTableRowHelper helper = new MapTableRowHelper(getInfoTableColumnMetaData());
rows.add(helper.createRow(DisplayStrings.NAME_STR, birthData.name()));
rows.add(helper.createRow(DisplayStrings.DOB_STR, birthData.birthDayString()));
rows.add(helper.createRow(DisplayStrings.TOB_STR, AstroUtil.timeFormat(birthData.birthTime(),true)));
rows.add(helper.createRow(DisplayStrings.PLACE_STR, birthData.place()));
rows.add(helper.createRow(DisplayStrings.SID_TIME_STR, AstroUtil.dms(this.getHousePosition().getSiderealTime())));
rows.add(helper.createRow(DisplayStrings.SUNRISE_SET_STR, AstroUtil.timeFormat(getSunrise()) + "/" + AstroUtil.timeFormat(getSunset())));
rows.add(helper.createRow(DisplayStrings.NAK_STR, getNakshathra()));
rows.add(helper.createRow(DisplayStrings.RASI_STR, getRasi()));
rows.add(helper.createRow(DisplayStrings.LANGA_STR, getAscendant()));
rows.add(helper.createRow(DisplayStrings.YOGA_STR, getYoga()));
//rows.add(helper.createRow(DisplayStrings.RASI_STR, getRasi()));
rows.add(helper.createRow(DisplayStrings.THITHI_STR, getThithi()));
rows.add(helper.createRow(DisplayStrings.AYANAMSA_STR, AstroUtil.dms(getAyanamsa())));
rows.add(helper.createRow(DisplayStrings.CURR_PD_STR, getCurrentDasa()));
rows.add(helper.createRow(DisplayStrings.DASA_STR, getDasaBal()));
infoTableData = TableDataFactory.getTableData(rows);
}
return infoTableData;
}
public static DefaultColumnMetaData getInfoTableColumnMetaData() {
if(infoTableColumnMetaData == null){
infoTableColumnMetaData = new DefaultColumnMetaData(AstrosoftTableColumn.Key, AstrosoftTableColumn.Value);
infoTableColumnMetaData.localizeColumns();
}
return infoTableColumnMetaData;
}
public Table getHoroscopeInfo(){
return new DefaultTable(getInfoTableData(), getInfoTableColumnMetaData());
}
public String getTitle() {
if(title == null){
StringBuilder sb = new StringBuilder("Horoscope of ");
sb.append(birthData.name());
sb.append(" born on ");
sb.append(birthData.birthDayString());
sb.append(" " + AstroUtil.timeFormat(birthData.birthTime()));
sb.append(" at ");
sb.append(birthData.place());
title = sb.toString();
}
return title;
}
public static void main(String[] args) {
/*Horoscope h = new Horoscope("Raja", 11, 12, 1980, 1, 44,
77 + (44.00 / 60.00), 11 + (22.00 / 60.00), 5.5, "Erode");
System.out.println(h);
// Horoscope h = new
// Horoscope("Suba",31,3,1988,18,10,77+(44.00/60.00),11+(22.00/60.00),5.5,"Erode");
// Horoscope h = new
// Horoscope("Viji",7,8,1982,11,45,77+(44.00/60.00),11+(22.00/60.00),5.5,"Erode");
/*
* Horoscope h = new Horoscope( "BV", 16, 10, 1918, 14, 26, 77 + ( 34.00 /
* 60.00 ), 13 + ( 0.00 / 60.00 ), 5.5, "Banglore" );
*/
/*h.setAyanamsa(Ayanamsa.LAHARI);
// h.calcPlanetPositions();
// h.calcHousePositions();
int i = 0;
for (i = 0; i < 10; i++) {
System.out.println(Planet.ofIndex(i) + " --> "
+ AstroUtil.dms(h.planetPositions[i]) + " Dir -->"
+ h.planetDir[i]);
}
System.out.println("cp " + h.currentDasha);
System.out.println("Bhava");
for (i = 0; i <= 12; i++) {
System.out.println(i + " --> " + AstroUtil.dms(h.housePositions[i])
+ " sandi " + AstroUtil.dms(h.bhavaSandhis[i]));
}
/*
* for(i = 0; i < VargaCharts.noOfCharts; i++){
* System.out.println(VargaCharts.chartNames[i]+"\n");
for (int j = 0; j < 10; j++) {
System.out.println(Planet.ofIndex(j) + " --> "
+ Rasi.ofIndex(h.charts[0][j] - 1) + " - "
+ h.charts[0][j]);
}
// }*/
/*System.out.println("Thithi " + h.thithi
+ " Paksha " + h.pak);
for (i = 0; i < 7; i++)
System.out.println(i + " --> " + h.karakas[i] + "<--> "
+ Karaka.ofIndex(h.getKaraka( i )).toString() + " <--> "
+ AstroUtil.dms(h.planetPositions[h.karakas[i]] % 30));*/
runTests();
}
/*
public void preferenceChange(PreferenceChangeEvent evt) {
if(evt.getKey().equals(AstrosoftPref.Preference.Ayanamsa.name())){
setAyanamsa(Enum.valueOf(Ayanamsa.class, evt.getNewValue()));
}else if(evt.getKey().equals(AstrosoftPref.Preference.Language.name())){
log.info("Language option changed");
infoTableData = null;
calcDashaBhukthis();
}
}*/
public void languageChanged(){
log.entering("Horoscope" , "languageChanged()");
infoTableData = null;
calcDashaBhukthis();
}
public static void runTests(){
AstroSoft.getPreferences().setAyanamsa(Ayanamsa.LAHARI);
Horoscope h = new Horoscope("Raja", 11, 12, 1980, 1, 44,
77 + (44.00 / 60.00), 11 + (22.00 / 60.00), 5.5, "Erode");
System.out.println("----------------------Raja----------------------");
System.out.println(h.getPlanetaryInfo());
Horoscope b = new Horoscope("Elango", 17, 4, 1957, 7, 10,
77 + (44.00 / 60.00), 11 + (22.00 / 60.00), 5.5, "Erode");
System.out.println("----------------------Elango----------------------");
System.out.println(b.getPlanetaryInfo());
Horoscope g = new Horoscope("Mani", 10, 8, 1960, 5, 30,
77 + (44.00 / 60.00), 11 + (22.00 / 60.00), 5.5, "Erode");
System.out.println("----------------------Mani----------------------");
System.out.println(g.getPlanetaryInfo());
Horoscope s = new Horoscope("Suba",31,3,1988,18,10,77+(44.00/60.00),11+(22.00/60.00),5.5,"Erode");
System.out.println("----------------------Suba----------------------");
System.out.println(s.getPlanetaryInfo());
h = new Horoscope("Viji",7,8,1982,11,45,77+(44.00/60.00),11+(22.00/60.00),5.5,"Erode");
System.out.println("----------------------Viji----------------------");
System.out.println(h.getPlanetaryInfo());
}
public void doExport(Exporter e) {
e.export(this);
}
public String createDocumentName() {
return AstroSoft.getPreferences().getAstrosoftFilesDir() + birthData.name() + "_Horoscope.pdf";
}
}