diff --git a/.gitignore b/.gitignore index a579e6ff5..309b4e17d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,8 @@ /architect.log /.DS_Store /custom_jre/ +/nbproject/private/ +/target +/pom.xml +/lib/power-lib +/install-mvn-deps.sh diff --git a/genPom.sh b/genPom.sh new file mode 100755 index 000000000..b8f0c4e50 --- /dev/null +++ b/genPom.sh @@ -0,0 +1,124 @@ +#!/bin/sh +# +#Generate the pom.xml and install-mvn-deps.sh files. +#The install-mvn-deps.sh installs dependencies in the local +#maven repository. + +SCRIPT=`readlink -f "$0"` +SCRIPTD=${SCRIPT%/*} + +POM="pom.xml" +DEP_SCRIPT="install-mvn-deps.sh" + +if [ `pwd` != "${SCRIPTD}" ]; then + echo "Script execution must be from the project directory $SCRIPTD" + return +fi + +if [ ! -d ./lib/power-lib ]; then + echo "sqlpower-library libs do not not exist." + echo "copy/link sqlpower-library/lib/main to power-architect/lib/power-lib" + echo "copy/link sqlpower-library/dist/sqlpower_library.jar to power-architect/lib/power-lib" +fi + +rm -f "$DEP_SCRIPT" +rm -f "$POM" + +touch $DEP_SCRIPT +touch $POM +chmod +x $DEP_SCRIPT + +cat <> $POM + + + + + 4.0.0 + com.intellires + power-architect + 1.0 + PowerArchitect + jar + + + 11 + 11 + + + +OUT + +for file in `ls ./lib/*.jar ./lib/power-lib/*.jar` +do + FILENAME=${file##*/} + NAME=${FILENAME%.*} + + ALREADY_DONE=`cat "$DEP_SCRIPT" |grep -c $NAME` + + if [ $ALREADY_DONE -eq 0 ]; then + echo " " >> $POM + echo " pwr-arch-local-jar" >> $POM + echo " "${NAME}"" >> $POM + echo " 1" >> $POM + echo " " >> $POM + + echo "mvn install:install-file -Dfile="$file" -DgroupId=pwr-arch-local-jar -DartifactId="${NAME}" -Dversion=1 -Dpackaging=jar" >> ./install-mvn-deps.sh >> $DEP_SCRIPT + fi +done; + +ALREADY_DONE=`cat "$DEP_SCRIPT" |grep -c sqlpower_library.jar` +if [ $ALREADY_DONE -eq 0 ]; then + echo "copy/link sqlpower-library/dist/sqlpower_library.jar to power-architect/lib/power-lib" +fi + +cat <> $POM + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.0.0 + + + jar-with-dependencies + + + + ca.sqlpower.architect.swingui.ArchitectFrame + + + + + + package + + single + + + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.1 + + java + + /tmp + + -classpath + + ca.sqlpower.architect.swingui.ArchitectFrame + + + + + + + +OUT + diff --git a/src/main/java/ca/sqlpower/architect/ArchitectVersion.java b/src/main/java/ca/sqlpower/architect/ArchitectVersion.java index ddb054693..e34294d60 100644 --- a/src/main/java/ca/sqlpower/architect/ArchitectVersion.java +++ b/src/main/java/ca/sqlpower/architect/ArchitectVersion.java @@ -46,14 +46,14 @@ public class ArchitectVersion extends Version { * Minor version number. This changes when new features appear that might * break forward compatibility. */ - public static final String APP_VERSION_MINOR = "0"; + public static final String APP_VERSION_MINOR = "1"; /** * Tiny version number. This number changes with each release, but resets * back to 0 when the minor version changes. All versions under the same * minor version number are fully compatible with each other. */ - public static final String APP_VERSION_TINY = "11"; + public static final String APP_VERSION_TINY = "1"; /** * Suffixes indicate pre-release builds. They normally progress from "alpha" diff --git a/src/main/java/ca/sqlpower/architect/ProjectSettings.java b/src/main/java/ca/sqlpower/architect/ProjectSettings.java index 8e01e5166..b891e2db4 100644 --- a/src/main/java/ca/sqlpower/architect/ProjectSettings.java +++ b/src/main/java/ca/sqlpower/architect/ProjectSettings.java @@ -60,6 +60,8 @@ public class ProjectSettings extends AbstractSPObject { private boolean showAkTag = true; private ColumnVisibility columnVisibility = ColumnVisibility.ALL; + + private boolean quoteIdentifiers = false; public static enum ColumnVisibility { ALL, @@ -171,6 +173,18 @@ public void setColumnVisibility(ColumnVisibility columnVisibility) { firePropertyChange("columnVisibility", oldValue, columnVisibility); } + @Accessor(isInteresting=true) + public boolean isQuoteIdentifiers() { + return quoteIdentifiers; + } + + @Mutator + public void setQuoteIdentifiers(boolean quoteIdentifiers) { + boolean oldValue = this.quoteIdentifiers; + this.quoteIdentifiers= quoteIdentifiers; + firePropertyChange("quoteIdentifiers", oldValue, quoteIdentifiers); + } + @Override protected boolean removeChildImpl(SPObject child) { return false; diff --git a/src/main/java/ca/sqlpower/architect/ddl/ConflictResolver.java b/src/main/java/ca/sqlpower/architect/ddl/ConflictResolver.java index 314dfed1e..f46fcfb65 100644 --- a/src/main/java/ca/sqlpower/architect/ddl/ConflictResolver.java +++ b/src/main/java/ca/sqlpower/architect/ddl/ConflictResolver.java @@ -86,7 +86,7 @@ public Conflict(String type, String catalog, String schema, String name) { } public String getQualifiedName() { - return DDLUtils.toQualifiedName(catalog, schema, name); + return DDLUtils.toQualifiedName(catalog, schema, name, "", ""); } /** diff --git a/src/main/java/ca/sqlpower/architect/ddl/DDLStatement.java b/src/main/java/ca/sqlpower/architect/ddl/DDLStatement.java index eaafb9313..79005b39e 100644 --- a/src/main/java/ca/sqlpower/architect/ddl/DDLStatement.java +++ b/src/main/java/ca/sqlpower/architect/ddl/DDLStatement.java @@ -208,7 +208,7 @@ public void setTargetSchema(String targetSchema) { } public String toString() { - return getType()+" "+DDLUtils.toQualifiedName(getTargetCatalog(), getTargetSchema(), object.getName()); + return getType()+" "+DDLUtils.toQualifiedName(getTargetCatalog(), getTargetSchema(), object.getName(), "", ""); } @Override diff --git a/src/main/java/ca/sqlpower/architect/ddl/DDLUtils.java b/src/main/java/ca/sqlpower/architect/ddl/DDLUtils.java index 1c3770362..65ebc2011 100644 --- a/src/main/java/ca/sqlpower/architect/ddl/DDLUtils.java +++ b/src/main/java/ca/sqlpower/architect/ddl/DDLUtils.java @@ -60,11 +60,13 @@ private DDLUtils() { * * @throws NullPointerException if table is null */ - public static String toQualifiedName(SQLTable table) { + public static String toQualifiedName(SQLTable table, String identifierQuoteChar) { return toQualifiedName( table.getCatalogName(), table.getSchemaName(), - table.getName()); + table.getName(), + identifierQuoteChar, + identifierQuoteChar); } /** diff --git a/src/main/java/ca/sqlpower/architect/ddl/GenericDDLGenerator.java b/src/main/java/ca/sqlpower/architect/ddl/GenericDDLGenerator.java index 3bea84c5e..e8162378a 100644 --- a/src/main/java/ca/sqlpower/architect/ddl/GenericDDLGenerator.java +++ b/src/main/java/ca/sqlpower/architect/ddl/GenericDDLGenerator.java @@ -164,6 +164,21 @@ public boolean isReservedWord(String word){ private ArchitectSwingSession session; private JDBCDataSourceType dsType = null; + + protected String identifierQuoteChar = ""; + protected String identifierQuoteCharRight = ""; + + public boolean isIdentifierQuoted() { + return !identifierQuoteChar.isBlank(); + } + + public String getQuoteLeft() { + return identifierQuoteChar; + } + + public String getQuoteRight() { + return identifierQuoteCharRight; + } public GenericDDLGenerator(boolean allowConnection) throws SQLException { this.allowConnection = allowConnection; @@ -183,6 +198,18 @@ public GenericDDLGenerator() throws SQLException { public String generateDDLScript(ArchitectSwingSession architectSwingSession, Collection tables) throws SQLException, SQLObjectException { session = architectSwingSession; + if (session.getProjectSettings().isQuoteIdentifiers()) { + if (this instanceof SQLServerDDLGenerator) { + identifierQuoteChar="["; + identifierQuoteCharRight="]"; + } else { + identifierQuoteChar = "\""; + identifierQuoteCharRight = "\""; + } + } else { + identifierQuoteChar = ""; + identifierQuoteCharRight = ""; + } List statements = generateDDLStatements(tables); ddl = new StringBuffer(4000); @@ -1140,7 +1167,12 @@ public String toIdentifier(String name) { * schema are omitted if null). */ public String toQualifiedName(SQLTable t) { - return toQualifiedName(t.getPhysicalName()); + return DDLUtils.toQualifiedName( + t.getCatalogName(), + t.getSchemaName(), + t.getPhysicalName(), + identifierQuoteChar, + identifierQuoteCharRight); } /** @@ -1163,8 +1195,7 @@ public String toQualifiedName(SQLIndex i) { public String toQualifiedName(String tname) { String catalog = getTargetCatalog(); String schema = getTargetSchema(); - tname = getQuotedPhysicalName(tname); - return DDLUtils.toQualifiedName(catalog, schema, tname); + return DDLUtils.toQualifiedName(catalog, schema, tname, identifierQuoteChar, identifierQuoteCharRight); } // ---------------------- accessors and mutators ---------------------- @@ -1466,6 +1497,9 @@ public boolean supportsEnumeration() { */ public String getQuotedPhysicalName(String name) { logger.debug(" getQuotedphysical name: "+name); + if (name != null && !name.isBlank()) { + return identifierQuoteChar+name+identifierQuoteCharRight; + } return name; } diff --git a/src/main/java/ca/sqlpower/architect/ddl/MySqlDDLGenerator.java b/src/main/java/ca/sqlpower/architect/ddl/MySqlDDLGenerator.java index 53e87f5d9..4d64cefe2 100644 --- a/src/main/java/ca/sqlpower/architect/ddl/MySqlDDLGenerator.java +++ b/src/main/java/ca/sqlpower/architect/ddl/MySqlDDLGenerator.java @@ -570,7 +570,7 @@ public void addIndex(SQLIndex index) throws SQLObjectException { print("UNIQUE "); } print("INDEX "); - print(toIdentifier(index.getName())); + print(getQuotedPhysicalName(toIdentifier(index.getName()))); if(index.getType() != null) { print(" USING " + index.getType()); } diff --git a/src/main/java/ca/sqlpower/architect/ddl/PostgresDDLGenerator.java b/src/main/java/ca/sqlpower/architect/ddl/PostgresDDLGenerator.java index 285d1f242..516150198 100644 --- a/src/main/java/ca/sqlpower/architect/ddl/PostgresDDLGenerator.java +++ b/src/main/java/ca/sqlpower/architect/ddl/PostgresDDLGenerator.java @@ -476,7 +476,7 @@ public boolean supportsEnumeration() { @Override public String getQuotedPhysicalName(String name) { if (name == null) return null; - if (getDsType()!=null && (getDsType().getSupportsQuotingName() || isComparingDMForPostgres()) + if (getDsType()!=null && (getDsType().getSupportsQuotingName() || isComparingDMForPostgres() ||isIdentifierQuoted()) && !name.isEmpty() && !(name.startsWith("\"") && name.endsWith("\""))) { name = "\""+name+"\""; } diff --git a/src/main/java/ca/sqlpower/architect/ddl/SQLServerDDLGenerator.java b/src/main/java/ca/sqlpower/architect/ddl/SQLServerDDLGenerator.java index 300464e22..e7dbd5d9e 100644 --- a/src/main/java/ca/sqlpower/architect/ddl/SQLServerDDLGenerator.java +++ b/src/main/java/ca/sqlpower/architect/ddl/SQLServerDDLGenerator.java @@ -405,7 +405,11 @@ public void addComment(SQLTable t, boolean includeColumns) { // So we only write a SQL comment with the table's comment here if (t.getRemarks() != null && t.getRemarks().trim().length() > 0) { - print("\n-- Comment for table [" + getPhysicalName(t) + "]: "); + if (isIdentifierQuoted()) { + print("\n-- Comment for table " + getPhysicalName(t) + ": "); + } else { + print("\n-- Comment for table [" + getPhysicalName(t) + "]: "); + } print(t.getRemarks().replaceAll(REGEX_CRLF, "\n-- ")); endStatement(StatementType.COMMENT, t); @@ -515,7 +519,7 @@ public void addIndex(SQLIndex index) throws SQLObjectException { print(" NONCLUSTERED "); } print("INDEX "); - print(DDLUtils.toQualifiedName(null,null,index.getName())); + print(DDLUtils.toQualifiedName(null,null,index.getName(),this.identifierQuoteChar, this.identifierQuoteChar)); print("\n ON "); print(toQualifiedName(index.getParent())); print("\n ( "); @@ -770,7 +774,7 @@ protected String columnCheckConstraint(SQLColumn c, List che @Override public String getQuotedPhysicalName(String name) { if (name == null) return null; - if (getDsType()!=null && getDsType().getSupportsQuotingName() + if ((getDsType()!=null && getDsType().getSupportsQuotingName() || isIdentifierQuoted()) && !name.isEmpty() && !(name.startsWith("[") && name.endsWith("]"))) { name = "["+name+"]"; } diff --git a/src/main/java/ca/sqlpower/architect/etl/kettle/KettleJob.java b/src/main/java/ca/sqlpower/architect/etl/kettle/KettleJob.java index 4ba4953e0..5d54e0359 100644 --- a/src/main/java/ca/sqlpower/architect/etl/kettle/KettleJob.java +++ b/src/main/java/ca/sqlpower/architect/etl/kettle/KettleJob.java @@ -306,7 +306,7 @@ public void doExport(List tableList, SQLDatabase targetDB, List tableList, SQLDatabase targetDB, List"); //$NON-NLS-1$ ioo.println(out, tagText.toString()); diff --git a/src/main/java/ca/sqlpower/architect/swingui/enterprise/SecurityPanel.java b/src/main/java/ca/sqlpower/architect/swingui/enterprise/SecurityPanel.java index db627629e..001655af0 100644 --- a/src/main/java/ca/sqlpower/architect/swingui/enterprise/SecurityPanel.java +++ b/src/main/java/ca/sqlpower/architect/swingui/enterprise/SecurityPanel.java @@ -71,6 +71,7 @@ import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.FormLayout; +import javax.swing.tree.TreeNode; /** * Shows the users and groups in the system workspace and allows them to be @@ -188,9 +189,9 @@ public void actionPerformed(ActionEvent e) { } refreshTree(); - Enumeration userNodes = usersNode.children(); + Enumeration userNodes = usersNode.children(); while (userNodes.hasMoreElements()) { - DefaultMutableTreeNode dmtn = userNodes.nextElement(); + DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) userNodes.nextElement(); if (((User) dmtn.getUserObject()).getUUID().equals(user.getUUID())) { tree.setSelectionPath(new TreePath(dmtn.getPath())); } @@ -207,9 +208,9 @@ public void actionPerformed(ActionEvent e) { if (group != null) { securityWorkspace.addChild(group, securityWorkspace.getChildren(Group.class).size()); refreshTree(); - Enumeration userNodes = groupsNode.children(); + Enumeration userNodes = groupsNode.children(); while (userNodes.hasMoreElements()) { - DefaultMutableTreeNode dmtn = userNodes.nextElement(); + DefaultMutableTreeNode dmtn = (DefaultMutableTreeNode) userNodes.nextElement(); if (((Group) dmtn.getUserObject()).getUUID().equals(group.getUUID())) { tree.setSelectionPath(new TreePath(dmtn.getPath())); } diff --git a/src/main/resources/ca/sqlpower/architect/swingui/messages.properties b/src/main/resources/ca/sqlpower/architect/swingui/messages.properties index ae2f104d1..c2428e859 100644 --- a/src/main/resources/ca/sqlpower/architect/swingui/messages.properties +++ b/src/main/resources/ca/sqlpower/architect/swingui/messages.properties @@ -328,6 +328,7 @@ ProjectSettingsPanel.showPK=Show PK Columns only ProjectSettingsPanel.showPKFKUnique=Show PK + FK + Unique Columns ProjectSettingsPanel.snapshotSourceDbOption=Snapshot Entire Source Database in Project File? ProjectSettingsPanel.visibilityOfRelationshipLabel=Display or Hide Relationship Labels: +ProjectSettingsPanel.quoteIdentifiers=Quote DDL identifiers? Relationship.setFocusMenu=Set Focus to... Relationship.relationshipLineColor=Relationship Line Color RelationshipEditPanel.fkLabel= FK Table Label diff --git a/src/main/resources/ca/sqlpower/architect/swingui/messages_de.properties b/src/main/resources/ca/sqlpower/architect/swingui/messages_de.properties index 9d78e4439..04c7e4961 100644 --- a/src/main/resources/ca/sqlpower/architect/swingui/messages_de.properties +++ b/src/main/resources/ca/sqlpower/architect/swingui/messages_de.properties @@ -300,6 +300,7 @@ ProjectSettingsPanel.showPK=Zeige nur Spalten des Prim\u00e4rschl\u00fcssel ProjectSettingsPanel.showPKFKUnique=Zeige PK + FK + Unique Spalten ProjectSettingsPanel.snapshotSourceDbOption=Gesamten Datenbankinhalt in der Projektdatei speichern? ProjectSettingsPanel.visibilityOfRelationshipLabel=Zeige/verstecke Beschriftung der Verbindungslinien: +ProjectSettingsPanel.quoteIdentifiers=Quote DDL identifiers? Relationship.setFocusMenu=Fokus auf... Relationship.relationshipLineColor=Farbe der Verbindungslinie RelationshipEditPanel.fkLabel=Beschriftung f\u00fcr FK Tabelle diff --git a/src/main/resources/ca/sqlpower/architect/swingui/messages_ko.properties b/src/main/resources/ca/sqlpower/architect/swingui/messages_ko.properties index 4c7e69f5e..84a9c08ef 100644 --- a/src/main/resources/ca/sqlpower/architect/swingui/messages_ko.properties +++ b/src/main/resources/ca/sqlpower/architect/swingui/messages_ko.properties @@ -277,6 +277,8 @@ ProjectSettingsPanel.showPrimaryKeyColumns=\uae30\ubcf8\ud0a4 \uceec\ub7fc \ubcf ProjectSettingsPanel.showRemainingColumns=\ub0a8\uc740 \uceec\ub7fc \ubcf4\uc774\uae30 ProjectSettingsPanel.showUniqueColumns=\uc720\ub2c8\ud06c \uceec\ub7fc \ubcf4\uc774\uae30 ProjectSettingsPanel.snapshotSourceDbOption=\ud504\ub85c\uc81d\ud2b8 \ud30c\uc77c\uc5d0\uc11c \uc804\uccb4 \uc6d0\ubcf8 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc2a4\ub0c5\uc0f7\uc744 \uc0dd\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? +ProjectSettingsPanel.visibilityOfRelationshipLabel=Display or Hide Relationship Labels: +ProjectSettingsPanel.quoteIdentifiers=Quote DDL identifiers? Relationship.setFocusMenu=\ud3ec\ucee4\uc2a4 \uc124\uc815... SQLScriptDialog.closeOption=\ub2eb\uae30 SQLScriptDialog.continuePrompt=\uacc4\uc18d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? diff --git a/src/main/resources/ca/sqlpower/architect/swingui/messages_pt.properties b/src/main/resources/ca/sqlpower/architect/swingui/messages_pt.properties index af87739c8..d478ecb51 100644 --- a/src/main/resources/ca/sqlpower/architect/swingui/messages_pt.properties +++ b/src/main/resources/ca/sqlpower/architect/swingui/messages_pt.properties @@ -300,6 +300,7 @@ ProjectSettingsPanel.showPK=Mostrar apenas Colunas de PK ProjectSettingsPanel.showPKFKUnique=Mostrar Colunas PK + FK + Chave \u00danica ProjectSettingsPanel.snapshotSourceDbOption=Capturar a fonte de dados na \u00edntegra para o arquivo de projeto? ProjectSettingsPanel.visibilityOfRelationshipLabel=Mostrar ou Ocultar r\u00f3tulos de Relacionamentos: +ProjectSettingsPanel.quoteIdentifiers=Quote DDL identifiers? Relationship.setFocusMenu=Definir o Foco para ... Relationship.relationshipLineColor=Cor de linha do Relacionamento RelationshipEditPanel.fkLabel= R\u00f3tulo da Tabela da FK diff --git a/src/main/resources/ca/sqlpower/architect/swingui/messages_ru.properties b/src/main/resources/ca/sqlpower/architect/swingui/messages_ru.properties index f7232bb6c..b5a689f60 100644 --- a/src/main/resources/ca/sqlpower/architect/swingui/messages_ru.properties +++ b/src/main/resources/ca/sqlpower/architect/swingui/messages_ru.properties @@ -267,6 +267,8 @@ ProjectSettingsPanel.showPrimaryKeyColumns= \u041f\u043e\u043a\u0430\u0437\u0430 ProjectSettingsPanel.showRemainingColumns= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b ProjectSettingsPanel.showUniqueColumns= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b ProjectSettingsPanel.snapshotSourceDbOption=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043f\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0430\u0439\u043b\u0435 \u041f\u0440\u043e\u0435\u043a\u0442\u0430? +ProjectSettingsPanel.visibilityOfRelationshipLabel=Display or Hide Relationship Labels: +ProjectSettingsPanel.quoteIdentifiers=Quote DDL identifiers? Relationship.setFocusMenu=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0444\u043e\u043a\u0443\u0441 \u043d\u0430... SearchReplace.anythingSearchOption=\u041b\u044e\u0431\u043e\u0435 SearchReplace.columnOfTable=\u0421\u0442\u043e\u043b\u0431\u0435\u0446 \u0438\u0437 {0}